*********************************************************************************************
2026/07/31       Changes in 8.3.8 from 8.3.7
*********************************************************************************************
Kevin Diggins  : BCX 8.3.8 cannot be built using BCX 8.3.7.  If you want to build 8.3.8, you 
                 must use the executable or the bootstrap file provided in the BCX 8.3.8 zip.
                 
Kevin Diggins  : BCX has long utilized the $GENFREE / CALL FreeGlobals() to release about a 
                 dozen dynamically allocated variables used during translation.  Several large
                 code additions to this version of BCX are having a mysterious effect on the
                 Pelles C Run-time shutdown environment.
                 
                 Pelles C correctly compiles this version of BCX but the last instruction before
                 BCX actually terminates is: CALL FREEGLOBALS(). That instruction now triggers 
                 an "unhandled exception" message when BCX ends but only when compiled with 
                 Pelles C.  None of the other compilers exhibit this behavior.  I could not 
                 find a hint explaining how any of the new code might be responsible for this.   
                 
                 For short execution time tools like BCX, it is common practice to allow Windows 
                 to reclaim all memory, close handles, and stop processes when the app finishes, 
                 as there is no technical need for the app to do so itself.
                 
                 With that brief explanation, starting with BCX version 8.3.8, the translator
                 will no longer utilize the $GENFREE / CALL FreeGlobals(), choosing instead to
                 let the Operating System handle that finishing task.  This hides the scary 
                 looking "unhandled exception" message when BCX is compiled using Pelles C.
                 
                 ** $GENFREE | CALL FreeGlobals remain available for use in YOUR programs **

Kevin Diggins  : Updated BCX_RICHEDIT() to the RTF 4.1+ "RichEdit50W" control class.  I also 
                 updated the content limit to 2GB, so the control buffer can dynamically grow 
                 when needed. Creating this control does not automatically allocate 2GB of 
                 memory. Rather, the control is given permission to automatically increase
                 memory allocation in stages when it is needed.  BCX_RICHEDIT() dynamically 
                 loads "Msftedit.dll", replacing "Riched20.dll", as required by 4.1+

Kevin Diggins  : Improved DIM+ASSIGN capabilities.  
                 
                 For example:  DIM AS STRING szTmp = SPC$ + Src$ + SPC$
                 BCX pre-processses this to:  DIM RAW szTmp$ : szTmp$ = SPC$ + Src$ + SPC$
                 and then forwards it onto the scanner / parser for final translation.
                 The improvements are not limited only to strings.
                 
                 For example:  DIM iParentheses% = INCHR(Stak[iThisToken].Arg$,")")
                 BCX 8.3.8 uses this new capability throughout its own source code.  
                 This -might- some break code but I haven't encountered any yet.  If it does
                 break someone's code, I believe it will be very simple to workround.
                                         
Kevin Diggins  : Strengthened the preprocessing loop in internal SUB TransformOperator()
                 which defeats a recently discovered edge case.
                                                                    
Kevin Diggins  : Updated internal function GetUDT_MemberType() to deliver better detection,
                 notably when programmers use DYNAMIC arrays inside their UDT's.  This is 
                 especially crucial when using sigil-less variables in PRINT statements.
                 
                 TYPE produce
                     DYNAMIC kind[0]  AS STRING     ' We will resize these array later
                     DYNAMIC unit[0]  AS STRING     ' per pound, per bunch, per bag, whatever ...
                     DYNAMIC price[0] AS SINGLE     ' price per unit
                 END TYPE

                 DIM Fruit AS produce               ' Create an instance of our "produce" data type

                 REDIM Fruit.price[10]              ' Enlarge the number of cells in our arrays
                 REDIM Fruit.kind[10]               '                  ditto
                 REDIM Fruit.unit[10]

                 Fruit.kind[5] = "Bananas"          ' Arbitrarily store a fruit in one of the cells
                 Fruit.unit[5] = "pound"            ' and its associated unit
                 Fruit.price[5] = 0.65              ' and its associated price

                 ' Now show us that the data was stored in our "Fruit" variable
                 PRINT Fruit.kind [5], " are ", USING$("$#.##", Fruit.price[5]), " per ", Fruit.unit [5]
                 PAUSE 
                
Kevin Diggins  : Improved the way DECIMAL numbers display when used in PRINT statements
                 Some now working examples:
                 
                    PRINT VAL("4.321768E3")     ' 4321.768
                    PRINT VAL("4.321768E-3")    ' 0.004321768
                    PRINT VAL("1.23E5")         ' 123000
                    PRINT VAL("1.23E-5")        ' 0.0000123

Kevin Diggins  : Updated ENVIRON$(), ISFOLDER(), ISFILE(), ISHIDDEN(), 
                         ISREADONLY(), ISSYSTEM(), EXIST() runtime functions.

Kevin Diggins  : Improved the performance of the REPEAT$() runtime function.
 
Kevin Diggins  : Clipboard_SetText and Clipboard_GetText$ now consistently work with UTF-8

Kevin Diggins  : Improved sigil-unknown STRING detections (commonly, Win32 API identifiers)

Kevin Diggins  : Reduced code redundancies inside several internal detection functions.

Kevin Diggins  : Refactored internal SUB Make_Stricmp_Map() for better performance.

Kevin Diggins  : Standardized most UDT, CONST, AND MACRO identifiers used in the translator.

Kevin Diggins  : Updated how output LinesWritten is determined and eliminated the decades
                 old fprintf macro redefinition of the standard CRT fprintf function.
                 The result: a safe and accurate line count of the resulting translation.            

Kevin Diggins  : Added simple support for numeric labels to be used for GOTO and GOSUB.
                 Here's an example:
                 
                     GOSUB 500
                     PRINT  "... and now we're back!"
                     PAUSE

                     END  ' Don't accidently fall into the subroutine else ** CRASH ** 
                     500:
                     PRINT "hello from Line Label 500"
                     RETURN

Robert Wishlaw : Added BASIC source level built-in support for the following c/c++ operators:
                 %=    ^=     <<=     >>=     &=     |=             (Implemented by MrBcx)

Robert Wishlaw : Added GetAddr$() and SetAddr() to the BCX lexicon. See Example in BCX Help.

Kevin Diggins  : Eliminated more recently discovered dead code                                      

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2026/05/20       Changes in 8.3.7 from 8.3.6
*********************************************************************************************
Luigi          : Reported bug with IIF() and IIF$() processing          -- fixed by MrBcx

Luigi          : Reported bug with processing of the "WITH" statement   -- fixed by MrBcx

Luigi          : Recommended conditional directives for MINGW compiler  -- added by MrBcx

Robert Wishlaw : Reported bug with USING$() function                    -- fixed by MrBcx

Robert Wishlaw : Reported bug UDT member type detections                -- fixed by MrBcx

Kevin Diggins  : Tested with latest LLVM-Clang (22.1.5) and MinGW64 C++ (16.1.0) compilers 

Kevin Diggins  : Replaced internal IsHexNumber() with new IsRadixLiteral() which extends
                 support for "&H", "&O", and "&B" literals ( Radix bases 16, 8, and 2 ) 

Kevin Diggins  : The VAL() function now supports the following enhancements:
                 -----------------------------------------------------------------------------
                     Feature            	Implementation	               Result
                 -----------------------------------------------------------------------------
                 BASIC Hex/Oct/Bin	strtoll(s, &endptr, base)	Native support for &H, &O, &B
                 C-Style Hex	    Explicit 0x check	        BCX backward-compatibility
                 Whitespace     	Handles "1 2 3 . 4 5"       123.45
                 BASIC Stop Rule    Break on unknown char	    VAL("12ABC") returns: 12
                 Sci Notation	    Standardize d/e/D/E to E	double-precision support
                
                 Examples:
                 PRINT VAL("&H11111111")  ' 286331153   Hexadecimal literal string argument
                 PRINT VAL("&O11111111")  ' 2396745     Octal literal string argument
                 PRINT VAL("&B11111111")  ' 255         Binary literal string argument

Kevin Diggins  : Added VB.net "END WHILE" transform.  BCX preprocesses it to "WEND"
                 DIM a
                 WHILE a < 10
                     a++
                     PRINT a
                 END WHILE

Kevin Diggins  : Combined the ^, MOD, and IMOD parsers and improved expression handling.  

Kevin Diggins  : Updated the (8.3.6) CONST / MACRO multiple definition parsing.

Kevin Diggins  : Added a safety guard to most GUI controls following CreateWindowEx()

Kevin Diggins  : Updated FOR_EACH() macro, supporting more complex array references
 
Kevin Diggins  : Updated internal SUB BuildDelimStr ()

Kevin Diggins  : Updated internal FUNCTION IsValidName() 

Kevin Diggins  : Updated BCX runtime function: FindFirstInstance()

Kevin Diggins  : Reverted several STATIC variables to RAW inside internal SUB GetParameter().
                 That change enables the following example to correctly compile and run:
                 
                    DIM DYNAMIC MyArray$ [10]
                    CALL Test (MyArray$)
                    PRINT MyArray[1], " from main program"

                    SUB Test(A AS STRARRAY)
                        DIM s
                        s = UBOUND(A)
                        PRINT "UBOUND of passed argument =", s
                        A[1] = "Hello World"
                        PRINT A[1], " from inside the SUB"
                    END SUB

                    ' OUTPUT:
                    ' UBOUND of passed argument = 9
                    ' Hello World from inside the SUB
                    ' Hello World from main program
                 
Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2026/03/23       Changes in 8.3.6 from 8.3.5
*********************************************************************************************
Kevin Diggins  : BCX_PIE (and several others) had GDI resource leaks.  Fixed

Kevin Diggins  : CONST & MACRO now allow multiple definitions.  For example:
                 MACRO A = 10, B = 20, C = 30, MULT(X, Y) = (X)*(Y)
                 PRINT A, B, C, MULT(3, 5)  '   Result:  10  20  30  15
                 PAUSE

*********************************************************************************************
2026/03/05       Changes in 8.3.5 from 8.3.4
*********************************************************************************************
Kevin Diggins  : Robert Wishlaw reported a bootstrap issue with 8.3.4  ---  FIXED

*********************************************************************************************
2026/03/04       Changes in 8.3.4 from 8.3.3
*********************************************************************************************
Kevin Diggins  : Reverted internal SUB FastLexer() to its previous state, following the 
                 discovery of a bug encountered while processing the SET command.

*********************************************************************************************
2026/02/28       Changes in 8.3.3 from 8.3.2
*********************************************************************************************
Kevin Diggins  : NEW! BCX_SPLITBUTTON() GUI control and support.  Requires a Windows Vista /
                 Windows 10/11 Common Controls 6.0+ manifest ( which BED supplies ).                 

Kevin Diggins  : Significant stability improvements to DynacallA() and DynacallB() runtimes,
                 especially in high-traffic event loops ... (WndProcs).

Kevin Diggins  : Refactored internal SUB FastLexer(), eliminating the previous GOTO statements.

Kevin Diggins  : CHANGED:  The default BCX_FORM styles to: WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS
                 Removed WS_CLIPCHILDREN, as it was responsible for Groupbox painting issues.

Kevin Diggins  : CHANGED:  Instances of (HINSTANCE)NULL have been replaced with NULL to overcome
                 crashing when compiling Windows hook code using C++ compilers.  Casting it to 
                 (HINSTANCE) explicitly specifies the type of the null pointer, which is unnecessary 
                 because C/C++ compilers can implicitly convert the generic null value to any 
                 pointer type, including HINSTANCE.
                 
*********************************************************************************************
2026/01/23       Changes in 8.3.2 from 8.3.1
*********************************************************************************************
Kevin Diggins  : NEW! Added "ANY" versions of the REMAIN$() function.        How it works:

                 1. Searches for a match on any character from MatchStr inside MainStr
                 2. Finds the FIRST occurrence among all the characters being searched
                 3. Returns everything AFTER that first matched character inside MainStr
                 4. Returns the first argument, if no match is found
                 
                 Example:
                 DIM AS STRING MainStr, MatchStr
                 MainStr  = "apple-banana:cherry" : MatchStr = ":-"
                 PRINT REMAIN$    (MainStr, ANY MatchStr) ' --->>>  "banana:cherry"
                 PRINT REMAINANY$ (MainStr, MatchStr)     ' --->>>  "banana:cherry"
                 
Kevin Diggins  : Several dialects of BASIC allow calling the SLEEP command with  
                 -NO- argument to wait for a keypress.  BCX now provides that same option. 
                 SLEEP with no argument is substituted with KEYPRESS during translation.
                 
Kevin Diggins  : UDT string member identification strengthened in IF-THEN statements.
                 
Kevin Diggins  : PRINT/WRITE formatting of vt_BOOL types, ADDED per request from Robert.                             

Kevin Diggins  : PRINT/WRITE formatting of vt_INTEGER type, FIXED per request from Vortex

Kevin Diggins  : When assigning a string expression containing the unquoted pattern "]+",
                 the translator could get confused and emit flawed code.  This was fixed
                 in 8.2.9 BUT it is -REALLY- fixed now.  

Kevin Diggins  : Renamed internal SUB Emit_Old() to SUB Emit_Assignments()

Kevin Diggins  : Removed internal SUB PreParse(). Function Doprj() uses FastLexer() instead.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code
                 
*********************************************************************************************
2025/11/26       Changes in 8.3.1 from 8.3.0
*********************************************************************************************
Robert Wishlaw : MrBcx discovered AnsiToWide() has had a bug in it since 2003.   
                 Robert Wishlaw corrected and enhanced AnsiToWide(), adding an optional argument 
                 that directs the function to null-terminate its result.  This new optional 
                 argument defaults to TRUE - the result will be null-terminated.  This is
                 the desired behavior when using AnsiToWide() with relevant WinApi functions.

Robert Wishlaw : Modified the console-mode SCREEN function to support foreign codepages.

James Fuller   : BUG FIX: += operator misconverted in XFOR statements.  Fixed by MrBcx 

Kevin Diggins  : BUG FIX: An edge case involving user-defined string functions containing 
                 optional arguments was not emitting "char *BCX_RetStr={0};"

*********************************************************************************************
2025/10/23       Changes in 8.3.0 from 8.2.9
*********************************************************************************************
Kevin Diggins  : NEW!  IMOD can now be used as both an OPERATOR and a FUNCTION.  This is
                 identical to what is also allowed using the floating point version of MOD.

                 As a FUNCTION:   Remainder% = IMOD (Dividend%, Divisor%)
                 As an OPERATOR:  Remainder% = Dividend% IMOD Divisor%

Kevin Diggins  : IMPROVED:  Memory that is allocated by LOCAL DYNAMIC ARRAYS is now properly
                 released back to the heap, regardless if used in plain C or C++ mode.
                 Some C++ specific features will not be compatible.  Your C++ compiler will
                 certainly let you when those incompatibilities have been detected.
                         
                         $CPP
                         
                         PRINT TestFunc$("Everything is possible")
                         PRINT TestFunc2 (PI)
                         PAUSE

                         FUNCTION TestFunc$ (MyArg$)
                            DIM DYNAMIC DynArray1$ [10, 10]     
                            DIM DYNAMIC DynArray2$ [10, 10]     
                            DIM DYNAMIC DynArray3$ [10, 10]      
                            DynArray1$[5, 5] = MyArg$          
                            FUNCTION = DynArray1$[5, 5]
                         END FUNCTION


                         FUNCTION TestFunc2 (TheOne AS DOUBLE) AS DOUBLE
                            DIM DYNAMIC DynArray[10, 10] AS DOUBLE
                            DynArray[5, 5] = TheOne
                            FUNCTION = DynArray[5, 5] + 1 + 2 + 3
                         END FUNCTION
                         
Jeff 
Shollenberger  : IMPROVED BCX's GUI-supporting DefaultFont macro with a function that uses 
                 a modern technique expected to help support DPI awareness in our apps.
                       
JB Klassen     : BUG FIX: Reported bug involving BASIC filenames with "-v" inside them.  
                       
Kevin Diggins  : BUG FIX: Found an edge case (compiler error) involving string expressions                          

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2025/09/24       Changes in 8.2.9 from 8.2.8
*********************************************************************************************
Kevin Diggins  : BCX 8.2.9 cannot be built using BCX 8.2.8.  If you want to build 8.2.9, you 
                 must use the executable or the bootstrap file provided in the BCX 8.2.9 zip.
                 ****************************************************************************         
                 
Kevin Diggins  : NEW! Added FORMAT$ function to provide compatibility with VB6 / PowerBasic.
                 BCX's implementation concerns itself with numbers but not with dates, times,
                 or currency formatting.  With a purpose similar to USING$, FORMAT$ will make 
                 using some VB6/PB10 code a little bit easier/quicker when you encounter it.  
                 The BCX Help file will include a section for the FORMAT$ function, along  
                 with many use case examples.

Kevin Diggins  : IMPROVED: CHR$() now accepts unlimited arguments, well actually about 8,000
                 but who in their right mind would ever do that?  8,000 is a lot more than 
                 the previous limit of 26 and that's really the point here.           
                  
                 The new CHR$() function uses the VCHR$ runtime function but unlike using 
                 VCHR$ directly, BCX automatically determines the argument count that the 
                 VCHR$ function requires, so that we don't have to.  
                 
                 The VCHR$() function is NOT being deprecated, has NOT been modified in 
                 anyway, and requires NO edits to your existing code.  You can continue using 
                 VCHR$() or you can update your code to use the improved CHR$.  If you decide
                 to update your code from VCHR$() to CHR$(), be sure to remove the first 
                 argument from your VCHR$() statements (the argument count), otherwise that
                 argument value will be treated as the first character in your CHR$() return 
                 string which you almost certainly will not want.
                 
                 Finally, the previous CHR$() runtime function has been completely removed 
                 from the BCX translator and BCX itself now uses the new CHR$ process.           
                 
Kevin Diggins  : IMPROVED: The LIKE_INSTR() function's pattern matching is more robust.                                  
                  
Robert Wishlaw : BUG FIX: POPCOLORS() properly restores the values to COLOR_BG and COLOR_FG

Kevin Diggins  : BUG FIX: When assigning a string expression containing the unquoted pattern
                 "]+", the translator could get confused and emit flawed code.  

Kevin Diggins  : BUG FIX: Found an edge case where the internal BCX_Retstr was not being
                 emitted inside user defined string functions containing one or more static 
                 array arguments in their signature.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2025/08/27       Changes in 8.2.8 from 8.2.7
*********************************************************************************************
Kevin Diggins  : BCX 8.2.8 cannot be built using BCX 8.2.7.  If you want to build 8.2.8, you 
                 must use the executable or the bootstrap file provided in the BCX 8.2.8 zip.
                 ****************************************************************************

Kevin Diggins  : Built with the latest LLVM/Clang compiler 21.1.0 (released yesterday)

Kevin Diggins  : NEW! Added the freeing of LOCAL DYNAMIC STRING ARRAYS in SUBS and FUNCTIONS:
                 When translated, the following example will now include the necessary 
                 c/c++ code that releases the dynamic (heap) memory back to the pool.
                 
                     PRINT TestFunc$("Everything is possible")
                     PAUSE

                     FUNCTION TestFunc$ (MyArg$)                     
                        DIM DYNAMIC DynArray1$ [10, 10]     ' 10 x 10 x 2048 =  204,800 bytes
                        DIM DYNAMIC DynArray2$ [10, 10]     ' 10 x 10 x 2048 =  204,800 bytes
                        DIM DYNAMIC DynArray3$ [10, 10]     ' 10 x 10 x 2048 =  204,800 bytes
                        DynArray1$[5, 5] = MyArg$           ' ================= ^^^^^^^^^^^^^
                        FUNCTION = DynArray1$[5, 5]
                     END FUNCTION
                  
                     
Kevin Diggins  : NEW! Added the freeing of LOCAL DYNAMIC NON-STRING ARRAYS in SUBS and FUNCTIONS:
                 When translated, the following example will now include the necessary C/C++
                 code that releases the dynamic (heap) memory back to the pool.
                 NOTE:  This improvement only works with plain C code.  It won't work with C++ 
                 code that -REQUIRES- a C++ compiler.  In that case, "FUNCTION =" should -NOT- 
                 include references to dynamic arrays because those will be destroyed before the 
                 FUNCTION can fetch the data.  C++ templates, references, and other features not
                 allowed in plain C limited my ability to include those in my new algorithm. 
                 
                      PRINT TestFunc (PI)
                      PAUSE

                      FUNCTION TestFunc (TheOne AS DOUBLE) AS DOUBLE
                          DIM DYNAMIC DynArray[10, 10] AS DOUBLE
                          DynArray[5, 5] = TheOne
                          FUNCTION = DynArray[5, 5] + 1 + 2 + 3
                      END FUNCTION  
                  
                                
Kevin Diggins  : NEW! Added GetSaveAsFileName$() to the BCX lexicon. GetSaveAsFileName$ uses
                 the "modern" Windows dialog control to give us a Filename fetcher somewhat 
                 modeled after the GETFILENAME$() function.  It is Windows theme aware, and
                 provides the user interface for where you want to create a file.  It returns
                 the path & filename$ chosen by the user, as well as the index number of the 
                 file encoding that the user has selected.  What you do with that information
                 is entirely up to you.  This function does not create files, it tells you 
                 what kind of file that your user wants to create.  
                 *** I will share my ENCODING file that I wrote for BED. I thinks it's important
                 to keep that file in a text format for any future enhancements / corrections.
                                  
                 NOTE WELL:  Lcc-Win32 cannot compile the runtime code for this function.    
                 ******************************************************************************
                 GetSaveAsFileName$ (Title$,                                      
                                     FileTypes$ 
                                     [, Un-Used%]          ( value is ignored internally )
                                     [, Owner_hWnd]        ( Can be NULL or any valid HWND )
                                     [, OFN Flags]         ( See Microsoft OPENFILENAME flags )
                                     [, InitDir$]          ( CURDIR$ is a good choice )
                                     [, InitFname$]        ( Starting Filename, like "*.txt" )
                                     [, BYREF EncodeNdx%]  ( Read more below ...  
                                   )                   
                 EncodeNdx% receives the Encoding Type from the Combobox ( Type = 0 to 4 )
                 0 = UTF8     1 = UTF8 w/BOM      2 = UTF16-LE      3 = UTF16 BE    4 = ANSI
            
                 Here is a console mode EXAMPLE:
                 ****************************************************************************** 
                 DIM fmask$, FileName$, MyEncodingIndex
                 
                 fmask$ =          "BCX Source Files (*.bas *.inc)|*.bas;*.inc|"
                 fmask$ = fmask$ + "C/C++ Source Files (*.c *.c++)|*.c;*.cpp|"
                 fmask$ = fmask$ + "Resource Files (*.rc)|*.rc|"
                 fmask$ = fmask$ + "Text Files (*.txt)|*.txt|"
                 fmask$ = fmask$ + "All Files (*.*)|*.*"

                 FileName$ = GETSAVEASFILENAME$("My Caption", fmask$, 0, 0, 0, CURDIR$, "*.*", &MyEncodingIndex)
                 PRINT : PRINT "You Selected: ", FileName$, " with ";
                 
                 SELECT CASE MyEncodingIndex
                    CASE 0 : PRINT "UTF-8";
                    CASE 1 : PRINT "UTF-8 with BOM";
                    CASE 2 : PRINT "UTF-16 LE";
                    CASE 3 : PRINT "UTF-16 BE";
                 END SELECT
                 PRINT " encoding."
                 PAUSE
                 ******************************************************************************
                   
Kevin Diggins  : NEW! Added "ANY" versions of the EXTRACT$() function.     Examples:
                 PRINT EXTRACT$    ("LongFileName.ext", ANY "_.,]") ' Output: LongFileName
                 PRINT EXTRACTANY$ ("LongFileName.ext",     "_.,]") ' Output: LongFileName

Kevin Diggins  : NEW! BCX allows FreeBasic's FOR-NEXT iterator syntax: FOR i AS LONG = 1 to 10 

Kevin Diggins  : NEW! Added PowerBasic compatible string functions: Utf8ToChr$() and ChrToUtf8$()
                 for converting between UTF-8 strings and ANSI strings.  
                 EXCEPTION:  Does -NOT- work with the MINGW compiler.  
                 
                 Example:                 
                 ***************************************************** 
                    DIM AS STRING utf8, ansi
                    SetConsoleOutputCP(65001)       ' Important - set the UTF-8 code page !
                    
                    utf8 = CHR$(&HC3) + CHR$(&HA9)  ' UTF-8 for the "é" character
                    ansi = UTF8TOCHR$(utf8)
                    PRINT "ANSI string: ", ansi
                    
                    ansi = "Résumé"
                    utf8 = CHRTOUTF8$(ansi)         ' Easily convert a string 
                    PRINT "UTF-8 string: ", utf8
                    
                       '  ************* 
                       '     OUTPUT
                       '  ************* 
                       ' ANSI string: é
                       ' UTF-8 string: Résumé
   
                             
Kevin Diggins  : IMPROVED: The built-in RUN command was never able to process file redirection.
                 If we needed file redirection, we were forced to use the SHELL command which
                 had the unpleasant side effect of displaying a COMMAND PROMPT window.   
                 The new RUN command now properly handles file redirection, like this simple example:
                 
                 ************************************************* 
                      IF EXIST("Output.txt") THEN KILL "Output.txt"
                      
                      RUN "dir *.* > Output.txt", SW_HIDE, TRUE
                      
                      IF EXIST("Output.txt") THEN
                          MSGBOX "Success!"
                      ELSE
                          MSGBOX "Failed"
                      END IF
                 *************************************************    
                      
Kevin Diggins  : IMPROVED: SLEEP runtime function.  SLEEP now has 1 millisecond accuracy.                                   

Kevin Diggins  : IMPROVED: the ROUND() runtime function.  Works consistently with all compilers.

Kevin Diggins  : IMPROVED: the thread-safety and performance of internal BCX_TempStr() function   
 
Kevin Diggins  : IMPROVED: the LookAhead$() and EoF() runtime functions.
 
Kevin Diggins:   CHANGED: the UprCase and LowCase initialization.  Both point to statically 
                 allocated arrays, so there was never a need for using calloc().  
                                                 
Kevin Diggins  : CHANGED:  I needed to change the emitted name of the SHOW() macro to SHOWHWND.
                 I also changed HIDE() to HIDEHWND() for consistency.  
                 My changes require NO CHANGES TO YOUR CODES.  BCX handles everything internally.
                 One of the new BCX features uses a Microsoft object method named "->Show()", 
                 which stubbornly conflicted with the SHOW (hWnd) macro.
                                                
Kevin Diggins  : CHANGED:  When the percent symbol "%" is used within a USING$ format string,
                 the return string will be the (2nd argument x 100) expressed as a percentage.
                 For example: PRINT USING$("###.##%", 0.45678) ' Output -->>>  45.68%

Kevin Diggins  : CHANGED:  When the Sci Notation symbol "^" is used within a USING$ format 
                 string, it must be the left-most character in that string, in order to return
                 the correct number of decimal places in the function return.
                 For example: PRINT USING$("^##.####", 123456.789) ' Output -->>>  1.2346E+05                                                 
                                              
Kevin Diggins  : CHANGED:  Simplified the default BCX_FORM styles to: 
                           WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
                 Previous styles were redundant and conflicted.  NO CHANGES TO YOUR CODE ARE NEEDED.
    
Kevin Diggins  : BUG FIX: FREEFILE had a memory leak. BCX's new implementation of the FREEFILE 
                 function simply returns a null FILE PTR.  When we OPEN files for reading/writing, 
                 BCX gives Windows a FILE PTR variable. When Windows receives that variable, it
                 automatically fills a special data structure with metadata about that file.
                 That metadata is used for all subsequent operations on that file while that 
                 file remains open.  NO CHANGES TO YOUR CODE ARE NEEDED.    
                        
Kevin Diggins  : BUG FIX:  Rare edge case in the parser handling the "+=" strcat operator                              
                                                   
Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2025/05/22       Changes in 8.2.7 from 8.2.6
*********************************************************************************************
Kevin Diggins  : New! It is now possible to use REDIM on LOCAL and GLOBAL arrays that 
                 were not previously dimensioned.  
                 
                 Here is a valid example of the expanded REDIM capability:

                 TYPE foo
                     q1 AS INT
                 END TYPE

                 REDIM a[10, 10] AS foo             ' This array has GLOBAL scope
                 a[5, 5].q1 = 1234
                 PRINT a[5, 5].q1
                 
                 CALL TestMe

                 REDIM PRESERVE b[100] AS STRING    ' This array has GLOBAL scope
                 b[5] = "Hello All You BCX Coders!" ' (PRESERVE is ignored in this context)
                 PRINT b[5]
                 PAUSE

                 SUB TestMe
                     REDIM c[100] AS foo            ' This array has LOCAL scope
                     c[5].q1 = 5678
                     PRINT c[5].q1
                 END SUB

Kevin Diggins  : New! Previous versions of BCX did not correctly enable dynamic arrays of UDT
                 to be passed by reference and REDIM'd inside a SUB or FUNCTION.  Now it can.
                 Tested working with Lcc-Win32, Pelles C, Mingw, Clang, and MSVC++               
                 
                 $BCXVERSION "8.2.7"
                 TYPE Person
                     FirstName AS STRING
                     LastName AS STRING
                 END TYPE

                 DIM People[0] AS Person
                 Create_People(ADDRESSOF People)

                 DIM Cells : Cells = UBOUND_D(People)
                 PRINT "Array Cells = 0 to", Cells
                 PRINT

                 FOR INT i = 0 TO Cells
                     PRINT People[i].FirstName$, SPC$, People[i].LastName$
                 NEXT
                 PAUSE

                 SUB Create_People(BYREF Group AS Person PTR)
                     REDIM Group[5] AS Person
                     Group[0].FirstName$ = "Adam"    :  Group[0].LastName$ = "Smith"
                     Group[1].FirstName$ = "Jerry"   :  Group[1].LastName$ = "Hawkins"
                     Group[2].FirstName$ = "Shirley" :  Group[2].LastName$ = "Jones"
                     Group[3].FirstName$ = "Tanya"   :  Group[3].LastName$ = "Glasskin"
                     Group[4].FirstName$ = "Rufus"   :  Group[4].LastName$ = "Doofus"
                END SUB

Kevin Diggins  : Improved detection & handling of corner case caused by sigil-less UDT 
                 string member detection & handling that could wrongly emit "strcpy" 
                 statements when direct pointer access had been specified.

Kevin Diggins  : WSTRING is now translated to PWSTR instead of BSTR.  BSTR is retained          
                 throughout the built-in BCX VBScript runtime support library.
                 
﻿*********************************************************************************************
2025/03/21       Changes in 8.2.6 from 8.2.5
*********************************************************************************************
Kevin Diggins  : Enhanced BCX_DYNACALL and LIB to compile with 64-bit and 32-bit executables.
                 All inline assembly has been replaced with pure C code and directives for
                 maximum compatibility with all popular Windows c/c++ compilers.
                 Both commands are limited to functions with no more than 16 arguments which
                 should be more than enough for any rationally designed function.  These 
                 enhancements are mostly backward-compatible with existing BCX code.

Kevin Diggins  : The LIB statement can now be used in 64-bit and 32-bit executables.
                 FOR example, this one line of code will popup a Windows MessageBox:
                 MessageBox(LIB "user32", NULL, "Your Msg", "Your Title", MB_OK)
                 -----------^^^

Kevin Diggins  : BCX_DYNACALL() can now be used in 64-bit and 32-bit executables. 
                 BCXHelp has the following example which only compiles with 32-bit:

                 DIM AnyType[4] AS INT
                 AnyType[0] = (INT) NULL
                 AnyType[1] = (INT) "Your Title"
                 AnyType[2] = (INT) "Your Msg"
                 AnyType[3] = (INT) MB_OK
                 BCX_DYNACALL("user32", "MessageBox", 4, AnyType)

                 When we replace INT with INT_PTR, it compiles in 32-bit and 64-bit.

                 DIM AnyType[4] AS INT_PTR    ' INT_PTR works for 32-bit and 64-bit executables
                 AnyType[0] = (INT_PTR) NULL
                 AnyType[1] = (INT_PTR) "Your Title"
                 AnyType[2] = (INT_PTR) "Your Msg"
                 AnyType[3] = (INT_PTR) MB_OK
                 BCX_DYNACALL("user32", "MessageBox", 4, AnyType)

Kevin Diggins  : Fixed "Me" keyword bug introduced during 8.2.5 WITH/ENDWITH refinements.

Kevin Diggins  : Refined the translation of WITH/ENDWITH statements (This might nail it!)

Kevin Diggins  : The 8.2.5 limitation involving the statement separator (:) and the string 
                 concatenation operator (+=) has been removed. This means that BCX can now 
                 correctly translate lines containing multiple statements.  For Example: 
                         DIM A$ : A$ += "Yippie!" : PRINT A$ : PAUSE

Kevin Diggins  : Small enhancement to the USING$() function.  Zeros can now be used inside
                 the format string to LEFT pad the resulting string with zeros. Commonly
                 useful for formatting time and date strings but not limited to those.
                 SOME EXAMPLES:
                 
                 PRINT USING$("###.##", PI)        ' Normal, no LEFT padding occurs
                 PRINT USING$("  #.####", PI)      ' Explicit LEFT padding (spaces)  
                 PRINT USING$("000.000000", PI)    ' Pad 2 zeros on LEFT side of PI
                 PRINT USING$("0000.########", PI) ' Pad 3 zeros on LEFT side of PI

                 OUTPUT:

                 3.14
                   3.1416
                 003.141593
                 0003.14159265         

Kevin Diggins  : Replaced > internal < BCX function IsNumber() with IsNumberEx(), renaming
                 IsNumberEx() to IsDecimalNumber() and included more detections that 
                 strengthen the reliabilty of IsDecimalNumber() and IsHexNumber() functions.

Kevin Diggins  : Added Intel C++ compiler detection

Kevin Diggins  : WS_TABSTOP added to 5 BCX GUI controls that lacked it, per Quin's request.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

﻿*********************************************************************************************
2025/02/22       Changes in 8.2.5 from 8.2.4
*********************************************************************************************              
Kevin Diggins  : BCX 8.2.5 cannot be built using version 8.2.4.  You must use the included 
                 8.2.5 executable -or- use the Bc.cpp included in the \BootStrap\ folder.
                 
Kevin Diggins  : New! += string concat operator added to BCX. Syntax: StringVar += Arglist
                 BCX will automatically transform a string statement, such as: 
               
                 AutoProcess[ProcessIdx].Status += "Activated"  
         
                 to this finger bruising equivalent:
               
                 AutoProcess[ProcessIdx].Status = AutoProcess[ProcessIdx].Status + "activated"  
              
                 This new feature was tested using simple, arrayed, and TYPE-member strings 
                 but it's possible that edge cases might be encountered that confuse BCX.  
                 
                 This feature is now being used throughout the BCX translator (8.2.5) 
                 and has replaced all $FILL blocks and CONCAT keywords used in earlier 
                 versions, in addition to passing the hundreds of standard regression tests. 
                 Those facts give me high confidence with my implementation of the operator.  
                 
                 By way of example, here are a few lines used internally in BCX (8.2.5):
                 
                     FirstVar$ += "Line" + STR$(LineNum[FileNdx]) + " in Module: "
                     FirstVar$ += TRIM$(FileNames$[FileNdx]) + " : " + GlobalName$
                     FirstVar$ += GlobalDim$ + " as " + GetVarTypeName$(GlobalType)
                     FirstVar$ += SPC$ + TypeDefs[GlobalDef].VarName$

                *************************************************************************
                                           KNOWN LIMITATIONS
                *************************************************************************
                
                (1) Statements that use the += concat operator are -currently- incompatible
                 with the colon [:] statement separator.  For example, 
                 
                 A$ += "Uh Oh!" : PRINT A$   ' BCX politely ABORTS with an Error Message
                 
                 A$ += "Oh Boy, it worked!"  ' BCX WILL translate this correctly
                 PRINT A$
                
                (2) BCX cannot infer the type of any compiler's internal MACRO's. One example
                of this is MINGW64's __VERSION__ macro which is a STRING.  Therefore, it is 
                necessary to append the string sigil "$", i.e. __VERSION__$, in order to 
                inform BCX that __VERSION__ needs to be treated as a string.
                
                (3) BCX will politely ABORT when it encounters "=+" instead of "+="
                    
Kevin Diggins  : Improved the performance of the SOUND() statement.  Previously, the Windows
                 midi engine was started and stopped each time a SOUND() statement executed,
                 resulting in numerous sonic issues (latency, stutters, unplayed notes, etc). 
                 I've changed all that.  Now the midi engine is started once and remains 
                 active for the duration of our application. When our application properly
                 terminates, it will automatically shut down our use of the midi engine. 
      
Kevin Diggins  : Improved (fixed?) the translation of WITH / END WITH statements
                 
Kevin Diggins  : Improved the parsing/encoding of DATA statements that are comprised of 
                 unquoted negative numbers.

Kevin Diggins  : Fixed BCX's processing of overloaded SUBS/FUNCTIONS.  
                 
Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2025/02/01       Changes in 8.2.4 from 8.2.3
********************************************************************************************* 
Robert Wishlaw : Corrected MrBcx's recent QBCOLOR hex encodings from RGB to their BGR format.

﻿*********************************************************************************************
2025/02/01       Changes in 8.2.3 from 8.2.2
********************************************************************************************* 
Kevin Diggins  : BCX_GRADIENT can now can create horizontal and vertical gradients.
                 **************************************************************************** 
                 -NOTE- This update will break existing 8.2.2 BCX_GRADIENT statements!
                 ****************************************************************************
                 Usage: BCX_GRADIENT (HWND, TopLeft_Color, BottomRight_Color, Direction[,hDestDC]) 
                 You must pass the argument "Direction" zero for drawing a Top-to-Bottom gradient 
                 or non-zero for drawing a Left-to-Right gradient.  Here's a colorful demo:
                 
                 $BCXVERSION "8.2.3"
                 GUI "BCX_GRADIENT Demo"

                 SUB FORMLOAD
                    LOCAL AS HWND Form
                    Form = BCX_FORM("BCX_GRADIENT Demo", 0, 0, 360, 250)
                    MODSTYLE(Form, 0, WS_SIZEBOX | WS_MAXIMIZEBOX)
                    CENTER(Form)
                    SHOW(Form)
                    SetTimer(Form, 1, 500, NULL)  ' Start a 1/2 second timer
                 END SUB

                 BEGIN EVENTS
                    STATIC i
                    SELECT CASE CBMSG
                       CASE WM_PAINT
                          DIM AS PAINTSTRUCT ps
                          DIM AS HDC hdc

                          hdc = BeginPaint(CBHWND, &ps)
                          IF i > 4 OR i = 0 THEN i = 1
                          SELECT CASE i
                             CASE 1
                                BCX_GRADIENT(CBHWND, RGB(0, 0, 120), RGB(255, 255, 255), 0)
                             CASE 2
                                BCX_GRADIENT(CBHWND, RGB(120, 0, 0), RGB(255, 255, 255), 1)
                             CASE 3
                                BCX_GRADIENT(CBHWND, RGB(255, 255, 255), RGB(0, 120, 0), 0)
                             CASE 4
                                BCX_GRADIENT(CBHWND, RGB(255, 255, 255), RGB(120, 120, 0), 1)
                          END SELECT
                          EndPaint(CBHWND, &ps)

                       CASE WM_TIMER    ' Force a re-paint of our window
                          INCR i
                          InvalidateRect(CBHWND, NULL, 1)
                          UpdateWindow(CBHWND)  ' Ensure WM_PAINT is processed immediately
                    END SELECT
                 END EVENTS
                 
﻿*********************************************************************************************
2025/01/31       Changes in 8.2.2 from 8.2.1
********************************************************************************************* 
Robert Wishlaw : Reported visual flaws with BCX_GRADIENT.                     Fixed by MrBcx

Robert Wishlaw : Reported flaws with RND2() not returning/displaying double.  Fixed by MrBcx

﻿*********************************************************************************************
2025/01/29       Changes in 8.2.1 from 8.2.0
*********************************************************************************************  
Kevin Diggins  : New!     Added BCX GRADIENT to the list of BCX graphics commands
                 Syntax:  BCX_GRADIENT (HWND, Top_RGB_Color, Bottom_RGB_Color[,hDestDC])    
                 Example:
                          GUI "BCX_Gradient"
                          GLOBAL AS HWND Form, Canvas
                          
                          SUB FORMLOAD
                              Form = BCX_FORM("BCX_GRADIENT Demo", 0, 0, 360, 250)
                              MODSTYLE(Form, 0, WS_SIZEBOX|WS_MAXIMIZEBOX)
                              Canvas = BCX_BITMAP(0, Form, 1, 10, 5, 340, 230)
                              CENTER(Form)
                              SHOW(Form)
                              CALL Drawit
                          END SUB

                          BEGIN EVENTS
                          END EVENTS

                          SUB Drawit
                             DIM RAW hDestDC AS HDC
                             hDestDC = STARTDRAW(Canvas)
                             '*************************************************************
                             BCX_GRADIENT (0,  RGB(255, 255, 255), RGB(0, 32, 0), hDestDC)
                             '*************************************************************
                             BCX_RECTANGLE(0, 40, 40, 100, 100, QBCOLOR(1), TRUE, hDestDC)
                             BCX_ELLIPSE(0, 350, 100, 60, 200, QBCOLOR(3), TRUE, hDestDC)
                             ENDDRAW(Canvas, hDestDC)
                         END SUB


Kevin Diggins  : Promoted RND2() to DOUBLE and its arguments to DOUBLES.  Lesser precision 
                 arguments ( SINGLES, INTS, LONGS ) are still allowed.

Kevin Diggins  : Changed LCLICK and RCLICK to use bitwise comparisons for key state

Kevin Diggins  : The "OPTION BASE" directive would corrupt initialized arrays. For example:
                 DIM RAW A[] = {1,2,3} will now be translated correctly when OPTION BASE 1 
                 is specified.

Kevin Diggins  : Updated the internal IsHexNumber function                                    

Kevin Diggins  : Updated the GETBMP() function as follows:
                 If the 3rd or 4th argument exceeds the size of the client area of the parent,
                 or if the 3rd or 4th argument equals zero, then the client area size is used.
                 This will improve the quality of the resulting bitmap and it provides an  
                 easy way to capture the entire client area of the parent HWND.   Example:
                  
                     DIM AS HDC hdc
                     hdc = GETBMP (0, 0, 0, 0, Form1)  ' Fetch the entire client area of Form1
                     SAVEBMP(hdc, "c:\temp\test.bmp")    
                 
Kevin Diggins  : Updated MSGBOX statement behavior.
                 MSGBOX statements that do not explicitly include the 3rd argument(types)
                 will be given the MB_TOPMOST and MB_SYSTEMMODAL properties by BCX.  Example:
                 MSGBOX "Hello World", "Messagebox Titlebar"   ' MB_TOPMOST and MB_SYSTEMMODAL

                 If you want the same behavior when using MSGBOX as a FUNCTION, you still have
                 to include those properties yourself.  Example:
                 
                   DIM i
                   i = MSGBOX ("Hello World", "The Titlebar", MB_OK|MB_TOPMOST|MB_SYSTEMMODAL)
                   PRINT i
                   PAUSE   
                
﻿*********************************************************************************************
2024/12/27       Changes in 8.2.0 from 8.1.9
*********************************************************************************************
Robert Wishlaw : Added HPEN and HBRUSH casts to the BCX_TRIANGLE runtime

Kevin Diggins  : Replaced FP_WRITE with FP_OUTPUT inside internal SUBS/FUNCTIONS that used
                 FP_WRITE as an argument name, thus eliminating shadowing warnings issued
                 against the original FP_WRITE (a global variable) used internally by BCX.
                 
Kevin Diggins  : Upgraded internal DJB2 hash function to unsigned 64-bit which should 
                 produce even fewer collisions.  Seems to be working fine compiling BCX
                 and all the BCX regression testing apps.
                
Kevin Diggins  : Corrected DRAW runtime bug caused by insufficient memory buffer.  
                 
﻿*********************************************************************************************
2024/11/16       Changes in 8.1.9 from 8.1.8
*********************************************************************************************
Armando Rivera : Added WM_CONTEXTMENU to SplitterWndProc handler

Kevin Diggins  : Enabled ability to REDIM arrays passed as arguments.  
                 For example:

                 DIM DYNAMIC a [0] AS STRING
                 DIM DYNAMIC b [0] AS DOUBLE
                 DIM Cells
     
                 CALL Resize_String(ADDRESSOF a)
                 Cells = UBOUND_D(a)

                 FOR INT i = 0 TO Cells
                     IF LEN(a[i]) THEN PRINT a[i]
                 NEXT

                 PRINT

                 Resize_Double(ADDRESSOF b)
                 Cells = UBOUND_D(a)

                 FOR INT i = 0 TO Cells
                     IF b[i] THEN PRINT b[i]
                 NEXT
                 PAUSE

                 SUB Resize_String(BYREF R AS CHAR PTR PTR)
                     REDIM R$[10]       

                     FOR INT i = 0 TO 9
                         R$[i] = ""
                     NEXT

                     R$[0] = "this"
                     R$[1] = "is"
                     R$[2] = "a"
                     R$[3] = "very"
                     R$[4] = "good"
                     R$[5] = "test"
                 END SUB

                 SUB Resize_Double(BYREF R AS DOUBLE PTR)
                     REDIM R[10]     
    
                     FOR INT i = 0 TO 9
                         R[i] = 0
                     NEXT
    
                     R[0] = PI * 1
                     R[1] = PI * 2
                     R[2] = PI * 3
                     R[3] = PI * 4
                 END SUB

Kevin Diggins  : BCX now supports this traditional keyboard INPUT feature.
                 GW-BASIC, Qbasic, TurboBasic, and other traditional BASICS share several  
                 design features, as it pertains to the keyboard INPUT command behavior.  
                 INPUT age           ' No prompt, no space, no question mark
                 INPUT "Age" , age   ' "Prompt"    comma    variable produces ->>  Age68
                 INPUT "Age" ; age   ' "Prompt"  semicolon  variable produces ->>  Age? 68
                 
Kevin Diggins  : Added the following BCX translator DIRECTIVES that prevents the emission of
                 specific compiler headers, libraries, and pre-processor directives.  
                 These are best placed near the top of your source code before any of your 
                 code gets translated.  They are case-insensitive and take no arguments.
                 ..................................................................................
                 $NO_VKKEYS, $NO_LIBS, $NO_PELLES, $NO_BORLAND, $NO_GCC_CLANG, $NO_MSVC, $NO_LCCWIN
                 ..................................................................................
                 If you don't use any of these new directives, the BCX generated C/C++ 
                 output file will contain all the headers, libraries, and pre-processor 
                 directives for Pelles, LccWin32, MSVC, GCC, Clang, Embarcadero (Borland)
                 and the recently added Virtual Key (VK) values.  The $NO_LIBS directive 
                 is useful when specifying static libraries inside our batch or make files.
                 
Kevin Diggins  : Below are commands that can optionally be used without enclosing the argument 
                 list in parentheses.  
                 Statements like MyHndl = BCX_ARC Form,10,10,20,20,90,90,90,90,QBCOLOR(9)
                 are technically EXPRESSIONS because BCX_ARC can return a value.  Even so, 
                 BCX will process this correctly, just as long as the BCX_ARC function is 
                 not part of a larger EXPRESSION involving other unrelated terms.

                 Notice that MOST of BCX's built-in FUNCTIONS are not included in this list.  
                 Except as mentioned above and in the list below, FUNCTIONS MUST enclose their 
                 arguments in parentheses.  Any corner cases should easily be remedied by simply 
                 including the missing parentheses.

                 The bottom line:  

                 The last argument in each of these statements/functions must be the last argument
                 on the line of code that is being parsed by BCX.  If it's not, the programmer 
                 MUST use parentheses to enclose the argument list.  

                 bcx_arc             bcx_bitmap         bcx_blackrect       bcx_blit           bcx_blit_sprite  
                 bcx_blit_stretch    bcx_bmpbutton      bcx_buffer_start    bcx_buffer_stop    bcx_button  
                 bcx_checkbox        bcx_circle         bcx_combobox        bcx_control        bcx_datepick  
                 bcx_dialog          bcx_edit           bcx_ellipse         bcx_floodfill      bcx_form  
                 bcx_framewnd        bcx_grayrect       bcx_group           bcx_icon           bcx_initgui  
                 bcx_input           bcx_label          bcx_line            bcx_lineto         bcx_listbox  
                 bcx_listview        bcx_mdi_msgpump    bcx_mdialog         bcx_msgpump        bcx_olepicture  
                 bcx_pie             bcx_polar_line     bcx_polar_pset      bcx_polybezier     bcx_polygon  
                 bcx_polyline        bcx_preset         bcx_printex         bcx_progressbar    bcx_pset  
                 bcx_put             bcx_radio          bcx_rectangle       bcx_regwnd         bcx_resize  
                 bcx_richedit        bcx_roundrect      bcx_set_font        bcx_set_form_color bcx_set_text  
                 bcx_setbkgrdbrush   bcx_setclassstyle  bcx_setclientsize   bcx_setconsolesize bcx_setcursor  
                 bcx_seticon         bcx_seticonsm      bcx_setmetric       bcx_setsplitpos    bcx_slider  
                 bcx_splitter        bcx_status         bcx_tab             bcx_tile           bcx_toolbar  
                 bcx_tooltip         bcx_treeview       bcx_triangle        bcx_updown         bcx_whiterect  
                 bcx_wnd             center             clipboard_setbitmap clipboard_settext  concat  
                 createregint        createregstring    draw                drawtransbmp       editloadfile  
                 enddraw             dsplit             hide                infobox            listboxloadfile 
                 mkpath              modstyle           playwav             putc               sendmessage  
                 sndmsg              set_bcx_bitmap     set_bcx_bitmap2     set_bcx_bmpbutton  set_bcx_icon  
                 setattr             setwindowrtftext   show                showmodal          sleep  
                 sound               split              startdraw           textmode           uncom  

Robert Wishlaw : Added PUTC (byte_expression, FilePtr) to the BCX lexicon as a complement to GETC(FP#) 
                 PUTC will accept QBASIC style file pointers.  Here is a compilable example: 
                
                         OPEN "test.txt" FOR OUTPUT AS #1
                         FOR CHAR i = 65 TO 70
                             PUTC #1, i
                         NEXT
                         PUTC #1, 13  ' 13 = Carriage Return  
                         PUTC #1, 10  ' 10 = Line Feed
                         FLUSH #1     ' optional but always a good idea to FLUSH when you're done :-)
                         CLOSE #1  

Kevin Diggins  : Added BCX_Triangle to the set of BCX graphics commands.
                 Syntax: BCX_TRIANGLE(hWnd, x1, y1, x2, y2, x3, y3, RgbColor, FillFlag [, hdc as HDC] )
                 GUI "Triangle", PIXELS

                 SUB FORMLOAD
                     GLOBAL AS HWND Form1
                     GLOBAL AS HWND Canvas
                     Form1 = BCX_FORM ("Triangle", 0, 0, 800, 800)
                     Canvas = BCX_BITMAP(0, Form1, 1000, 0, 0, 800, 800)
                     CENTER Form1
                     SHOW   Form1
                     CALL Drawit
                 END SUB

                 BEGIN EVENTS
                     SELECT CASE CBMSG
                       CASE WM_QUIT, WM_CLOSE, WM_DESTROY
                           END
                     END SELECT
                 END EVENTS


                 SUB Drawit
                     DIM RAW hDestDC AS HDC
                     hDestDC = STARTDRAW(Canvas)
                     BCX_TRIANGLE(0, 200, 500, 600, 500, 400, 400, QBCOLOR(1), 1, hDestDC)
                     ENDDRAW(Canvas, hDestDC)
                 END SUB


Kevin Diggins  : Included 3 more PowerBasic inspired macros dealing with callback messages.
                 CBNMCODE returns the notification message describing the event.  
                 CBNMHWND returns the handle of the control that sent the message.  
                 CBNMID   returns the control's ID number assigned at its creation.             
                
                 CBNMHWND equates to ((LPNMHDR)lParam)->hwndFrom
                 CBNMCODE equates to ((LPNMHDR)lParam)->code
                 CBNMID   equates to ((LPNMHDR)lParam)->idFrom
                
                 These new macros replace statements like these:

                 IF CB((LPNMHDR)lParam)->hwndFrom = ToolBar1 AND ((LPNMHDR)lParam)->code = NM_CLICK THEN ...
                                       --- with ---
                 IF CBNMHWND = ToolBar1 AND CBNMCODE = NM_CLICK THEN
                                       --- and ---
                 IF ((LPNMHDR)lParam)->idFrom = IDC_CUSTOMLISTBOX1 THEN ...
                                       --- with ---
                 IF CBNMID = IDC_CUSTOMLISTBOX1 THEN ...

Kevin Diggins  : Removed internal Inset() and replaced calls to it with INSTR ANY statements.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

﻿*********************************************************************************************
2024/10/10       Changes in 8.1.8 from 8.1.7
*********************************************************************************************
Kevin Diggins  : Found a very old bug that could occur when using OPTION BASE #    (Fixed!)
                 Read:  https://bcxbasiccoders.com/smf/index.php?topic=1201.msg6356#new

Kevin Diggins  : Found and fixed MOD case-sensitivity issue

Kevin Diggins  : BCX will output #defines for VK_0 through VK_Z which MSVC and MINGW do not 
                 declare in their header files.  LccWin32 and Pelles headers have these.
                 
﻿*********************************************************************************************
2024/10/06       Changes in 8.1.7 from 8.1.6
*********************************************************************************************
Armando Rivera : New! Requested 12-hour format to be added to the TIME$ function. (Added by MrBcx)
                 Example:  PRINT TIME$(12) ... produces:  06:15:01 AM    or    06:15:01 PM 
                 
Armando Rivera : New! Requested [optional] ORIGIN argument for the SEEK command.  (Added by MrBcx)
                 Example:  SEEK FP1, 8192 [, SEEK_CUR ]    
                 Valid optional arguments are: SEEK_CUR, SEEK_END, and SEEK_SET

Kevin Diggins  : New! Added GetHttpFileSize(Url$) and DownloadToStr(Url$) to BCX vocabulary.
                 Compile this example as a console app to see both of these in action.

                 MACRO WarAndPeace = "https://www.gutenberg.org/cache/epub/2600/pg2600.txt"
                 DIM RemoteFileSize AS ULONG
                 RemoteFileSize = GETHTTPFILESIZE (WarAndPeace)  ' Obtain the file size

                 IF RemoteFileSize THEN
                     DIM TheBook$ * RemoteFileSize               ' Create a large string
                     PRINT "Size of 'War and Peace' on server = ", USING$("#", RemoteFileSize), " bytes" ' ~3.3MB File
                     PRINT "Downloading into string variable now ... please wait ..."
                     TheBook$ = DOWNLOADTOSTR (WarAndPeace)      ' Download into our string variable
                     BCX_MDIALOG (Example, "'War And Peace'", NULL, 0, 0, 300, 300, 0, 0, "Arial", 12)  ' Read it!
                     END
                 ELSE
                     PRINT "WarAndPeace URL was not found."   ' Hopefully this won't happen
                     PAUSE
                     END
                 END IF

                 BEGIN MODAL DIALOG AS Example
                    SELECT CASE CBMSG
                       '******************
                       CASE WM_INITDIALOG
                       '******************
                           STATIC hRichEdit AS HWND
                           hRichEdit = BCX_RICHEDIT (0, CBHWND, 12345, 10, 10, 280, 280)
                           SETWINDOWRTFTEXT(hRichEdit, TheBook$)
                           CENTER (CBHWND)
                           FUNCTION = TRUE
                       '******************
                       CASE WM_QUIT, WM_CLOSE, WM_DESTROY
                           CLOSEDIALOG
                           END
                    END SELECT
                END DIALOG

Kevin Diggins  : New! LCLICK (left mouse button click) and RCLICK (right mouse  button click). 
                 Both functions return TRUE, if its Mouse Button was clicked, FALSE if not.  
                 Both LCLICK and RCLICK are SWAPBUTTON aware.                
                 
                 Here is a simple console example (tune your guitar!)
                 
                 WHILE NOT LCLICK     ' loop unti a left mouse button click is detected
                     Beep( 82.41, 1500) ' E (6th string):  82.41 Hz (E2)
                     Beep(110.00, 1500) ' A (5th string): 110.00 Hz (A2)
                     Beep(146.83, 1500) ' D (4th string): 146.83 Hz (D3)
                     Beep(196.00, 1500) ' G (3rd string): 196.00 Hz (G3)
                     Beep(246.94, 1500) ' B (2nd string): 246.94 Hz (B3)
                     Beep(329.63, 1500) ' E (1st string): 329.63 Hz (E4)
                 WEND  

Kevin Diggins  : New!  MOUSE_CX, MOUSE_CY, MOUSE_SX, MOUSE_SY functions added to BCX language.
                 Like all BCX functions, these are all case-insensitive reserved keywords.
                 MOUSE_CX returns the current MOUSE X position, relative to the client window 
                 MOUSE_CY returns the current MOUSE Y position, relative to the client window 
                 MOUSE_SX returns the current MOUSE X position, relative to the active screen  
                 MOUSE_SY returns the current MOUSE Y position, relative to the active screen 
                 Here is a simple console example:
                                  
                 DO
                     SLEEP(20)
                     LOCATE 1, 1, 0
                     PRINT SPACE$(80)  ' Clear previous display
                     LOCATE 1, 1, 0
                     PRINT "Client Mouse: "; MOUSE_CX; ", "; MOUSE_CY  ' Display client coordinates
                     LOCATE 2, 1, 0
                     PRINT SPACE$(80)  ' Clear previous display
                     LOCATE 2, 1, 0
                     PRINT "Screen Mouse: "; MOUSE_SX; ", "; MOUSE_SY  ' Display screen coordinates
                 LOOP
                 
Kevin Diggins  : New! Added BCX_PENSTYLE variable for easily changing the various BCX drawing
                 commands line styles dynamically, using one of the following defined styles.
                 NOTE: When BCX_PENSIZE > 1, all drawing commands use PS_SOLID (a GDI behavior)
                          
                 BCX_PENSTYLE = 0 (PS_SOLID)       Pen is solid.   (This is the DEFAULT style)
                 BCX_PENSTYLE = 1 (PS_DASH)        Pen is dashed. 
                 BCX_PENSTYLE = 2 (PS_DOT)         Pen is dotted. 
                 BCX_PENSTYLE = 3 (PS_DASHDOT)     Pen alternates dashes and dots. 
                 BCX_PENSTYLE = 4 (PS_DASHDOTDOT)  Pen alternates dashes and double dots. 

Kevin Diggins  : New!  Added EXIT_EACH keyword to BCX vocabulary.  EXIT_EACH allows us to 
                 prematurely exit from a FOR_EACH loop without relying on GOTO.  EXIT_EACH 
                 will only exit from the FOR_EACH loop that it is located within. FOR_EACH 
                 loops can be nested but EXIT_EACH only exits from inside the currently 
                 running loop.  Here is a code snippet that the BCX translator uses:
            
                    FOR_EACH(i, ConstTypes$)
                         IF Stk$[2] ?? ConstTypes$[i] THEN ' case insensitive comparison
                             Src$ = "DIM AS " + Src$
                             EXIT_EACH
                         END IF
                    NEXT_EACH

Kevin Diggins  : New! BCX_CLSID$(progid$) added to BCX. You can use BCX_CLSID() to check 
                 whether a particular COM object is properly registered on the system.  
                 BCX_CLSID$() is also useful for resolving different versions of COM servers, 
                 such as "Word.Application" vs. "Word.Application.8". BCX_CLSID$ () returns
                 a CLSID, (in the form of a 38-character GUID), based on BCX_CLSID$ argument.  
                 Here's a very simple example, assuming Microsoft Office is installed:  

                 PRINT BCX_CLSID$("word.application")  ' "{000209FF-0000-0000-C000-000000000046}"
                 PRINT BCX_CLSID$("fu.bar.2")          '      Intentionally force an error
                 PRINT BCX_CLSID$("excel.application") ' "{00024500-0000-0000-C000-000000000046}"    
                 
Kevin Diggins  : New! BCX_TOOLTIPs can now make multi-line tooltips and accept embedded CRLF$.
                 The BCX_Tooltip font now uses the same font as the user's desktop icon title
                 font, giving us easy, good looking tooltips. Microsoft changed its support 
                 for displaying the Balloon style. The Balloon style will only work on single
                 line tooltips. You don't need to change any of your BCX code but be aware 
                 why the Balloon style might no longer work in your apps.

Kevin Diggins  : New! MOD can now be used as an OPERATOR and as a FUNCTION.

Kevin Diggins  : New! BCX will preprocess this:           CONST SINGLE MyVar = -3.14159
                                     into this:    DIM AS CONST SINGLE MyVar = -3.14159
                 
                 These can be useful alternatives over the typeless CONST/MACRO that you 
                 are probably familiar with.           
                 
                 BCX allows the following table of types to be used for this purpose.
                                   
                 CONST CHAR[]    MyVar = "Hello, World"
                 CONST CHAR      MyVar = 0 -TO- 255
                 CONST BYTE      MyVar = 0 -TO- 255
                 CONST LDOUBLE   MyVar = teeny weenie -TO- SUPER GIGANTIC
                 CONST DOUBLE    MyVar = 4.94065645841246544 × 10^-324 -TO- ±1.79769313486231570 × 10^308
                 CONST SINGLE    MyVar = 1.17549435 × 10^-38 -TO- ±3.40282347 × 10^38  
                 CONST FLOAT     MyVar = 1.17549435 × 10^-38 -TO- ±3.40282347 × 10^38      
                 CONST DWORD     MyVar = 0 -TO- 4,294,967,295
                 CONST INT       MyVar = −32,768 -TO- 32,767
                 CONST INTEGER   MyVar = −32,768 -TO- 32,767
                 CONST LLONG     MyVar = −9,223,372,036,854,775,808 -TO- 9,223,372,036,854,775,807 
                 CONST LONG      MyVar = −2,147,483,648 -TO- 2,147,483,647
                 CONST LONGLONG  MyVar = −9,223,372,036,854,775,808 -TO- 9,223,372,036,854,775,807 
                 CONST SBYTE     MyVar = -128 -TO- 127
                 CONST SHORT     MyVar = -32,768 -TO- 32,767
                 CONST UBYTE     MyVar = 0 -TO- 255
                 CONST UCHAR     MyVar = 0 -TO- 255
                 CONST UINT      MyVar = 123456789
                 CONST UINT64    MyVar = 0 -TO- 18,446,744,073,709,551,615
                 CONST ULONG     MyVar = 0 -TO- 4,294,967,295
                 CONST ULONGLONG MyVar = 0 -TO- 18,446,744,073,709,551,615
                 CONST USHORT    MyVar = 0 -TO- 65,535

Kevin Diggins  : GETC, LOC, LOOKAHEAD$, REC, RECCOUNT now accept QBASIC style file pointers.  
                 Example 1: a = GETC(#1)                 Example 2: PRINT LOOKAHEAD$(#1, 2)

Kevin Diggins  : FOR-NEXT loops can now declare these loop-local iterator types: SINGLE, 
                 DOUBLE, FLOAT, INTEGER, INT, LONG, LLONG, LONGLONG, UINT, UINT64, ULONG, 
                 ULONGLONG, CHAR, UCHAR, BYTE, UBYTE, SBYTE, SHORT, USHORT, SIZE_T, SSIZE_T
                 INT8_T, INT16_T, INT32_T, INT64_T, UINT8_T, UINT16_T, UINT32_T, UINT64_T              
         
Kevin Diggins  : HEX$() function has been IMPROVED. It now has an optional argument that
                 instructs the function to prepend zeros to the resulting hexadecimal 
                 string until the LENGTH of the string equals the value in the optional 
                 argument.  If the optional argument is greater than >>> 16 <<< then the 
                 result will stop at 16 characters. Example: PRINT HEX$(1024, 8) '00000400
                 But wait, there's more! 
                 HEX$ can now handle the limit of a 64-bit unsigned integer.  For example:

                      DIM HexTest AS UINT64
                      HexTest = 18446744073709551615ULL     ' Must append the ULL
                      PRINT HEX$(HexTest)                   ' Result: FFFFFFFFFFFFFFFF
                      PRINT HEX$((UINT64)2^64-1)            ' Result: FFFFFFFFFFFFFFFF
                 
Kevin Diggins  : BCX_FORM now includes the WS_CLIPCHILDREN style by default to help              
                 minimize flickering and increase Windows drawing efficiency.
                                               
Kevin Diggins  : IMPROVED the internal function: PrintWriteFormat$() because I discovered
                 that numeric UDT members, passed by reference to SUBS and FUNCTIONS, were 
                 always being cast as (int), ignoring their internal precision. I decided 
                 it was better to flip that behavior on its head.  Now, vt_DOUBLE, vt_NUMBER, 
                 vt_INTEGER, and vt_DECFUNC all get cast as (double) in PRINT and WRITE 
                 statements, thus displaying their internal precisions as intended.
                          
Kevin Diggins  : The internal SUB TokenSubstitutions() contained a statement that would 
                 result in aborted BCX translation when "c++ keywords" were detected being
                 used in a non-c++ file.  The conditions that triggered that abort sequence 
                 were both weak and flawed, so I have disabled it. That immediately restored
                 the use of "PRIVATE CONST" in non-cpp contexts and likely other benefits 
                 that I haven't discovered yet.

Kevin Diggins  : Killed a bug that I introduced when I modified $IFDEF in 8.1.2 (Aug 2024)

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

﻿*********************************************************************************************
2024/09/03       Changes in 8.1.6 from 8.1.5
*********************************************************************************************
Kevin Diggins  : It was confirmed that Pelles treatment of the _ftelli64 and _fseeki64 can
                 cause file i/o errors. The BCX commands and functions that depend on those 
                 functions are: SEEK, FTELL, LOOKAHEAD$, RECORD, and LONGESTLINE. I learned 
                 that changing statements like: OPEN "filename" for INPUT AS #1  to use the 
                 fopen "rb" mode instead of "r" mode would prevent the file i/o errors.
                 BCX now emits the "rb" mode for all compilers when translating statements 
                 like: OPEN "filename" for INPUT AS #1   (fully tested, works like a charm)
                 
﻿*********************************************************************************************
2024/08/26       Changes in 8.1.5 from 8.1.4
*********************************************************************************************
Kevin Diggins  : Corrected and enhanced: INSTR(), IINSTR(), INSTR ANY(), and IINSTR ANY()

                 Regarding  INSTR ANY() and IINSTR ANY(), BCX emits code that copies argument 
                 2, removes duplicates from that copy, qsorts that copy in ascending order and
                 only then performs the expected comparisons for INSTR ANY() and IINSTR ANY().
                 These functions should produces the same results as PowerBasic and FreeBasic.

                 Important Note:  INSTR (Haystack$, Needle$, 0)    will -ALWAYS- return zero.
                 Important Note:  INSTR (Haystack$, Needle$, 0, 1) will -ALWAYS- return zero.
                 
                 Common: Case-Sensitive:   INSTR(Haystack$, Needle$)        Implicit posn. 1  
                 Common: Case-Sensitive:   INSTR(Haystack$, Needle$, 1)     Explicit posn. 1 
                 Common: Case-Insensitive: INSTR(Haystack$, Needle$, 1, 1)  Explicit posn. 1
                 
﻿*********************************************************************************************
2024/08/24       Changes in 8.1.4 from 8.1.3
*********************************************************************************************
Kevin Diggins  : Strengthened testing and resolved the bug inside SUB FindIncludeFiles. 
                 Using the $INCLUDE <filename> directive, note the angle brackets not quotes,  
                 requires an existing environment variable named "BCXLIB" that has been set 
                 to a valid path and filename.

Kevin Diggins  : Some runtime support for the new DRAW command was not being emitted.  Fixed!

Kevin Diggins  : Added IINSTR function to complement the IINSTRANY function.  Example:

                 PRINT IINSTR  ("abcdefghij",     "DEF", 2)      ' Result = 4
                 PRINT IINSTR  ("abcdefghij", ANY "12F", 2)      ' Result = 6
                
﻿*********************************************************************************************
2024/08/23       Changes in 8.1.3 from 8.1.2
*********************************************************************************************
James Fuller   : Reported bug using $INCLUDE <filename>                     -- Fixed by MrBcx

Kevin Diggins  : Updated a rule concerning FOR_EACH / NEXT_EACH. It is no longer necessary to
                 pass the loop iterator to the NEXT_EACH command. If you have existing code 
                 that passes the iterator to NEXT_EACH, BCX will ignore it during translation, 
                 so there is no need to update your app, unless you want to.  Here's a snippet:
                 
                 DIM List[10,10] AS STRING
 
                   FOR_EACH (MyIterator, List)
                      Dict [MyIterator, 1] = "Key"   + STR$ (MyIterator)
                      Dict [MyIterator, 2] = "Value" + STR$ (MyIterator)
                 ' NEXT_EACH (MyIterator) ' Old Rule: (MyIterator) WAS required. 
                   NEXT_EACH              ' New Rule: (MyIterator) NOT required.
               
                             
Kevin Diggins  : INFOBOX automatically limits incoming clipboard text to 32,500 bytes. The 
                 standard Win32 editbox that INFOBOX uses is limited to less than 32kb.
                 Clipping to 32,500 bytes easily prevents accidental text buffer overflows.
                 
                 
Kevin Diggins  : NEW!  LIKE_INSTR (MyString$, MyPattern$) function 
                 This case-insensitive function is a loose marriage between the LIKE() function 
                 and the INSTR() function. The LIKE() function uses wildcards but only returns
                 TRUE and FALSE.  The INSTR() function returns a match position within a string 
                 but we cannot use wildcards.  LIKE_INSTR() returns a match position within your
                 string based on the results of a wildcard pattern match. 

                 Here are some examples:

                 DIM AS STRING str, pattern
                 DIM AS INT i 
                 
                 str = "Wayne M. Halsdorf"

                 pattern = "way"         : i = LIKE_INSTR (str, pattern) : PRINT MID$(str, i) ' i = 1     
                 pattern = "m*hal"       : i = LIKE_INSTR (str, pattern) : PRINT MID$(str, i) ' i = 7     
                 pattern = "Halsdo?f"    : i = LIKE_INSTR (str, pattern) : PRINT MID$(str, i) ' i = 10   
                  
                 str = "Joe Blow Ph. 555-2122 ext 5"
                 
                 pattern = "ph*###-##22" : i = LIKE_INSTR (str, pattern) : PRINT MID$(str, i) ' i = 10    
                                  
                 Results:                   
                 
                 Wayne M. Halsdorf
                 M. Halsdorf
                 Halsdorf
                 Ph. 555-2122 ext 5
                 
                 
Kevin Diggins  : NEW! - Implemented or modified the following to use the -> ANY <- keyword.
                 REPLACEANY$, IREPLACEANY$, REMOVEANY$, IREMOVEANY$, INSTRANY, IINSTRANY
                 
                                       !!! IMPORTANT NOTICE !!!
                 The original (8.1.1) versions of REPLACEANY$() and REMOVEANY$() included
                 an optional argument for activating case-insensitivty. Those optional flags
                 have been removed and replaced with standalone functions that accomplish the 
                 same thing, namely:   IREPLACEANY$() and IREMOVEANY$(). 
                                
Kevin Diggins  : New! INSTRANY and IINSTRANY. INSTRANY is Case-Sensitive, IINSTRANY is not.
                 Arguments: (MainString$, CharSet$ [ , StartPosition)
                 Both return the match position if -ANY- individual character in CharSet$ 
                 is found in MID$(MainString$,StartPosition) or returns FALSE if no match.
                 
                 PRINT INSTRANY("ABCDeF", "1234C5")     ' Result: 3
                 PRINT INSTRANY("ABCDeF", "1234C5", 2)  ' Result: 3
                 PRINT INSTRANY("ABCDeF", "1234C5", 3)  ' Result: 3
                 PRINT INSTRANY("ABCDeF", "1234C5", 4)  ' Result: 0

                 PRINT IINSTRANY("abcDeF", "1234C5")    ' Result: 3
                 PRINT IINSTRANY("abcDeF", "1234C5", 2) ' Result: 3
                 PRINT IINSTRANY("abcDeF", "1234C5", 3) ' Result: 3
                 PRINT IINSTRANY("abcDeF", "1234C5", 4) ' Result: 0
                 
                                                 
Kevin Diggins  : This example shows the functions that support the new BCX -> ANY <- keyword.
                 '***************************************************************************
                 ' -ANY- is syntactic sugar introduced by PowerBasic and adopted by FreeBasic
                 '   BCX will translate the example below to call these runtime functions:
                 '   REPLACEANY$, IREPLACEANY$, REMOVEANY$, IREMOVEANY$, INSTRANY, IINSTRANY
                 '     None of these new/updated functions take any [optional] arguments.
                 '***************************************************************************
                 DIM A$
                 A$ = "9ndz0in035707ndz0357016v70y6u039k70is07qu910360357016v70y6u0m9k7."
                 PRINT A$
                 PRINT REPLACE$ (A$, "069274513z",  ANY " oaceghlt,")  ' Case-Sensitive
                 PRINT IREPLACE$(A$, "069274513z",  ANY " OACEGHLT,")  ' case-insensitive
                 PRINT : PRINT   "123AbC456DeF789"
                 PRINT REMOVE$  ("123AbC456DeF789", ANY "abcdef")      ' Case-Sensitive
                 PRINT IREMOVE$ ("123AbC456DeF789", ANY "abcdef")      ' case-insensitive
                 PRINT INSTR    ("123AbC456DeF789", ANY "abcdef")      ' Case-Sensitive
                 PRINT IINSTR   ("123AbC456DeF789", ANY "abcdef")      ' case-insensitive
                 PRINT "============================================"
                 PRINT "Same Results without using the 'ANY' keyword"
                 PRINT "============================================"
                 PRINT A$
                 PRINT REPLACEANY$  (A$, "069274513z", " oaceghlt,")   ' Case-Sensitive
                 PRINT IREPLACEANY$ (A$, "069274513z", " OACEGHLT,")   ' case-insensitive
                 PRINT
                 PRINT              "123AbC456DeF789"
                 PRINT REMOVEANY$  ("123AbC456DeF789", "abcdef")       ' Case-Sensitive
                 PRINT IREMOVEANY$ ("123AbC456DeF789", "abcdef")       ' case-insensitive
                 PRINT INSTRANY    ("123AbC456DeF789", "abcdef")       ' Case-Sensitive
                 PRINT IINSTRANY   ("123AbC456DeF789", "abcdef")       ' case-insensitive
                 PAUSE     
                 
Kevin Diggins  : New!  Added the traditional DRAW <string expression> command to BCX.                
                 Example: DRAW "B150,500 S9 C4 R3 H4 G4 R5")  ' Draw a red triangle
                 The DRAW command will only work with BCX GUI apps, not console.
                                
Kevin Diggins  : Enhanced the SWAP command, allowing the swap of individual chars in strings.
                 Syntax:  SWAP Var1, Var2 [, Number] '<<< Notice the new optional argument.
                 The optional arg controls the parsing and translation. The value of the 3rd 
                 represents the number of bytes that will be exchanged.  During parsing, if 
                 BCX detects a 3rd argument, BCX will suppress the emission of the (byte*)
                 casts for the 2 arguments that a translated SWAP statement normally gets.
                 
                 Example: SWAP (PBYTE) &a$[3], (PBYTE) &a$[5], 1  ' Optional Arg is used.
                 This example would swap the 3rd character in a$ with the 5th character.
                 The (PBYTE) is needed to cast STRING pointers to BYTE pointers needed by 
                 the standard BCX SWAP runtime function.
                  
                 The following statements are functionally equivalent. The first is verbose, 
                 the second is not but it might look more cryptic to some users.
                 
                 SWAP CAST(PBYTE, ADDRESSOF Mut$[i]), CAST(PBYTE, ADDRESSOF Mut$[CAST(LONG, Range(i+1, L-1))]), 1
                
                 SWAP (PBYTE) &Mut$[i], (PBYTE)&Mut$[(LONG) Range(i + 1,L - 1)], 1 

Kevin Diggins  : Added <errno.h> to the standard list of headers that BCX emits.

﻿*********************************************************************************************
2024/08/08       Changes in 8.1.2 from 8.1.1
*********************************************************************************************
Kevin Diggins  : BCX 8.1.2 cannot be built with 8.1.1.  You must use the provided c/c++ file
                 to bootstrap your new initial executable then complete two more cycles, as 
                 described in the BCX Help file.

Kevin Diggins  : Added LOOKAHEAD$(FilePtr, LineToRead=1). LOOKAHEAD$(FP) allows us to 
                 read the -next- line of text from an open file stream without permanently 
                 changing the current line pointer. The second optional argument allows us 
                 to use, for example, LOOKAHEAD$(FP, 5) to skip ahead 5 lines and return 
                 that text, restoring our file pointer to its previous position.

Kevin Diggins  : Enabled ability to pass dynamic arrays of UDT's between SUBS/FUNCTIONS 
                 including the ability to "REDIM PRESERVE" those arrays, even when they
                 are passed with different names as arguments to those SUBS and FUNCTIONS. 

Kevin Diggins  : Enabled datatype/sigil detection with projects involving multiple $INCLUDE
                 files, including $INCLUDE files that $INCLUDE other $INCLUDE files. This 
                 should ensure hassle-free scanning of classes, subs, and functions. If any 
                 forward references are $INCLUDED -anywhere- in your program, they will be
                 scanned before BCX starts the translation phase.  

Kevin Diggins  : Replaced BCX's internal string hash function with the DJB2 algorithm. 
                 This well known hash function delivers enhanced hash value distribution 
                 and fewer collisions without compromising on performance. 

Kevin Diggins  : MSVC, CLANG, and MINGW now embed their version numbers used in building BCX.
                 Version 8.1.2 (07/16/2024) Compiled using MinGW64 C++ (14.1.0) for 64-bit Windows              
                 Version 8.1.2 (07/16/2024) Compiled using LLVM-Clang (18.1.8) for 64-bit Windows
                 Version 8.1.2 (07/16/2024) Compiled using MS Visual C++ (194033811) for 64-bit Window
                 Review internal BCX FUNCTION Compiler_Used$() for all the gory details.
                 
Kevin Diggins  : Rewrote the JOIN$() runtime function.  A bit safer and easier to understand.                  
                 
Kevin Diggins  : CLS was enhanced by allowing it to clear the scrollback buffer.                
                   
Kevin Diggins  : CHR$() optional arguments increased from 10 to 26. Use VCHR$() if you need 
                 more in one function call or use multiple CHR$() statements - your choice.                   
                                  
Kevin Diggins  : Restored the functioning of the keyword "INLINE" in cases like below.  This 
                 patch might result in corner cases but, so far, it passes my regression tests.

                 GUI "MAINFORM", icon, 123

                 SUB FormLoad()
                    SHOW(BCX_Wnd( "MAINFORM", WndProc, "Form Created Using BCX_Wnd"))
                 END SUB

                 BEGIN EVENTS WndProc
                    HANDLE_MSG WM_CLOSE INLINE "SendMessage(hWnd,WM_DESTROY,0,0):EXIT FUNCTION
                 END EVENTS MAIN
                                  
Kevin Diggins  : Added Windows Server 2019 and 2022 to the OSVERSION function detections.
                 Server 19 returns OSVERSION 22 and Server 2022 returns OSVERSION 23.

Kevin Diggins  : Enabled rudimentary ability to conditionally compile BCX code using $IFDEF.
                '****************************************************************************
                ' NOTE WELL:  -ONLY- $IFDEF / $ENDIF will work for this purpose.
                ' $IF,$IFNDEF,$ELSE,$ELSEIF are -NOT- supported for this purpose at this time.
                '****************************************************************************
                ' These are allowed inside SUBS and FUNCTIONS within $IFDEF/$ENDIF blocks
                '****************************************************************************
                '   $INCLUDE "a.bas"
                '   DIM APPLES AS INT
                '   LOCAL oranges AS LONG
                '   DIM RAW bananas AS INT
                '   DIM STATIC spooky AS STRING
                '   CONST FOO = 1
                '   MACRO BAR = 2
                '   We cannot create a GLOBAL variable but we CAN reference a GLOBAL variable
                '****************************************************************************
                 
                 Here is a working example:
                 
                      CONST USE_NewFoo1
                      CONST USE_NewFoo2

                      CALL TestingX1 ("TestingX1")
                      CALL TestingX5 ("TestingX5")
                      PAUSE


                      $IFDEF  USE_NewFoo1
                          SUB TestingX1(x$)
                              PRINT x$
                          END SUB

                          FUNCTION TestingX2(x$)
                              PRINT x$
                          FUNCTION = 1
                          END FUNCTION

                          SUB TestingX3(x$)
                          PRINT x$
                          END SUB

                          FUNCTION TestingX4(x$)
                              PRINT x$
                              FUNCTION = 1
                          END FUNCTION
                      $ENDIF


                      $IFDEF  USE_NewFoo2             
                          SUB TestingX5(x$)
                              PRINT x$
                          END SUB

                          FUNCTION TestingX6(x$)
                              PRINT x$
                              FUNCTION = 1
                          END FUNCTION

                          SUB TestingX7(x$)
                              PRINT x$
                          END SUB

                          FUNCTION TestingX8(x$)
                              PRINT x$
                              FUNCTION = 1
                          END FUNCTION
                      $ENDIF

Robert Wishlaw : Ongoing formatting improvements to the source, output and runtime code

﻿*********************************************************************************************
2024/07/03       Changes in 8.1.1 from 8.1.0
*********************************************************************************************
Ad Rienks      : Reported "<>" and "!=" corruption within some expressions.   Fixed by MrBcx

Kevin Diggins  : When used in any kind of PRINT statement, CVS(), CVL(), and CVLD() will 
                 now automatically be displayed with their intended decimal precisions.

Kevin Diggins  : Fixed a bug involving user defined functions containing optional arguments
                 with floating point decimal values contained in their function prototype.
                 For example: Function FooBar(A$, b as DOUBLE = 1.23)  '<<-- This was fixed
                 
Kevin Diggins  : Updated UBOUND() now works on STATIC and DYNAMIC one-dimensional arrays.
                 Example:
                                 
                 TYPE foo
                   member_1 AS INTEGER
                   member_2 AS SINGLE
                   member_3 AS DOUBLE
                 END TYPE

                 DIM DYNAMIC  AAA [10] AS foo         ' This is a dynamic array - the number of cell CAN be REDIM.
                 DIM DYNAMIC  BBB [20] AS INTEGER     '                     --- Ditto --- 
                 DIM DYNAMIC  CCC [30] AS SINGLE      '                     --- Ditto --- 
                 DIM DYNAMIC  DDD [40] AS DOUBLE      '                     --- Ditto --- 
                 '=====================================================================================================
                 DIM          EEE [50] AS ULONGLONG   ' This is a static array - the number of cells CANNOT be REDIM.
                 DIM          FFF [60] AS STRING      '                     --- Ditto --- 

                 PRINT "AAA [10] Cells run from 0 to", UBOUND (AAA)  '  9 
                 PRINT "BBB [20] Cells run from 0 to", UBOUND (BBB)  ' 19
                 PRINT "CCC [30] Cells run from 0 to", UBOUND (CCC)  ' 29
                 PRINT "DDD [40] Cells run from 0 to", UBOUND (DDD)  ' 39
                 PRINT "EEE [50] Cells run from 0 to", UBOUND (EEE)  ' 49
                 PRINT "FFF [60] Cells run from 0 to", UBOUND (FFF)  ' 59
                 PAUSE        
                   
Kevin Diggins  : Added UBOUND_S() and UBOUND_D() to the BCX lexicon.  The enhanced version of UBOUND() introduced
                 in BCX v 1.1.1 relies on the c/c++ preprocessor's ability to distinguish when UBOUND()'s argument
                 is a static or dynamic variable.  One case where this becomes impossible is when UBOUND() is used
                 in a MACRO, for example:  MACRO pSTYLE_(style) = style, UBOUND(style).  In other words, we are 
                 trying to use a set of dependent macros inside another macro.
                 
                 In that situation, as neither the C/C++ preprocessor nor the BCX Translator is capable of determining 
                 whether UBOUND (style) refers to a static or a dynamic variable, it falls to us to resolve the 
                 ambiguity.  That's what UBOUND_S() and UBOUND_D() were created for.  Using the earlier example, 
                 and knowing that "style" is a static array, we can now simply change 
                 
                        this ---->>>  MACRO pSTYLE_(style) = style, UBOUND   (style)
                     to this ---->>>  MACRO pSTYLE_(style) = style, UBOUND_S (style)
                   
                 The same idea can be applied to dynamic arrays used in a MACRO.  The need to use either 
                 UBOUND_S() or UBOUND_D() is QUITE RARE but we have a way to easily handle those situations.
                                                      
                 I discovered the need for these during regression testing of the new UBOUND() function.  
                 The BCX Mini Form Designer (BMFD) contained: CONST pSTYLE_(style) = style, UBOUND (style)
                 After changing to: CONST pSTYLE_(style) = style, UBOUND_S (style), it successfully compiled.                        
                 
                 We can use UBOUND_S() or UBOUND_D(), instead of UBOUND(), whenever we want to clarify our code.
                                                      
                                                      
Kevin Diggins  : *NEW*   built-in REPLACEANY$() function.  See short demo below.
                 A$ = REPLACEANY$(MyStr$, MatchChars$, ReplaceChars, SensitivityFlag = FALSE)
                 The 2nd and 3rd arguments must be the same length, otherwise the 1st argument is returned.  
                 There is a one-to-one relationship between the match and replacement characters.  
                 =================================================================================
                 DIM A$
                 A$ = "9ndz0in035707ndz0357016v70y6u039k70is07qu910360357016v70y6u0m9k7."
                 PRINT A$                                                , " <<-- Original string"
                 PRINT REPLACEANY$(A$, "069274513z", " OACEGHLT,")       , " <<-- Case-insensitive replacement"
                 PRINT REPLACEANY$(A$, "069274513z", " oaceghlt,", TRUE) , " <<-- Case-SENSITIVE   replacement"
                 PAUSE
                 
                 OUTPUT:
                 9ndz0in035707ndz0357016v70y6u039k70is07qu910360357016v70y6u0m9k7. <<-- Original string
                 And, in THE End, THE LOvE yOu TAkE is EquAL TO THE LOvE yOu mAkE. <<-- Case-insensitive replacement
                 and, in the end, the love you take is equal to the love you make. <<-- Case-SENSITIVE   replacement

                 Press any key to continue . . .
   
          
Kevin Diggins  : *NEW*  built-in REMOVEANY$() function.  Here's a short example:         
                 =================================================================================   
                 PRINT             "123AbC456DeF789"
                 PRINT REMOVEANY$ ("123AbC456DeF789", "abcdef")        ' case sensitive (default)
                 PRINT REMOVEANY$ ("123AbC456DeF789", "abcdef", TRUE)  ' case insensitive
                 PAUSE

                 OUTPUT
                 123AbC456DeF789
                 123AC456DF789
                 123456789

                 Press any key to continue . . .
                    
                    
Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

﻿*********************************************************************************************
2024/06/06       Changes in 8.1.0 from 8.0.9
*********************************************************************************************
Robert Wishlaw : Reported bug with ISFILE() function.  MrBcx corrected/improved/re-tested 
                 the ISFILE(), ISFOLDER(), ISREADONLY(), ISHIDDEN() functions.

Kevin Diggins  : Renamed runtime function BCX_TmpStr() to BCX_TempStr().  BCX_TempStr() is now  
                 thread-safe after adding a critical section into it.  By doing so, all BCX
                 string functions that utilize BCX_TempStr() inherit some level of thread
                 safety too, depending upon each function's individual implementation. 

Kevin Diggins  : Improved the internal FUNCTION iReplace_NQ$() when detecting corner cases.

Kevin Diggins  : Improved internal parsing of REMOVE, IREMOVE, REPLACE, and IREPLACE functions

Kevin Diggins  : Started adding OpenAI generated comments explaining the general purpose of
                 selected SUBs and FUNCTIONs.  This is another (tedious) work-in-progress.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

﻿*********************************************************************************************
2024/05/28       Changes in 8.0.9 from 8.0.8
*********************************************************************************************
Robert Wishlaw : Reported bug with INLINE.                                    Fixed by MrBcx

Robert Wishlaw : Updated the BCX internal SUB ProcessMsgHandler

Kevin Diggins  : Changed the built-in CAST macro.  

Kevin Diggins  : Refactored the internal FUNCTION RemoveExtension()

Kevin Diggins  : Refactored the internal FUNCTION RestrictedWords()

Kevin Diggins  : Refactored the internal FUNCTION IsQuoted()

Kevin Diggins  : Refactored the internal FUNCTION iReplace_NQ$() to detect corner cases.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

﻿*********************************************************************************************
2023/12/27       Changes in 8.0.8 from 8.0.7
*********************************************************************************************
Kevin Diggins  : Removed unneeded memcmp casts that were added earlier to quiet Mingw/Clang.

Kevin Diggins  : Refactored the SAVEBMP() runtime function.

Kevin Diggins  : Converted 6 unbalanced IF-ENDIF Abort sequences to warnings.

Robert Wishlaw : Refactored the MODSTYLE() runtime function, silencing compile-time warnings.

Robert Wishlaw : Corrected two internal SCHAR tests used during translation.

Robert Wishlaw : Reported global variable datatype forward-propagation bug.  Fixed by MrBcx

Robert Wishlaw : Removed InitCommonControls() oxbow code

﻿*********************************************************************************************
2023/12/09       Changes in 8.0.7 from 8.0.6
*********************************************************************************************
Robert Wishlaw : Requested SSHORT.  16-bit signed short int (-32768 to 32767)  Added by MrBcx

Robert Wishlaw : Requested SCHAR.    8-bit signed char (-128 to 127)           Added by MrBcx
  
Robert Wishlaw : Reported bug with BCX_DIALOG and BCX_MDIALOG emitting redundant casts. Fixed!
                 
Kevin Diggins  : Luis Candelas brought the following deficiency to my attention. Now improved,
                 the DECLARE FUNCTION and C_DECLARE FUNCTION return datatypes are now detected 
                 by BCX at the beginning of its translation.  This enables sigil-less use of 
                 those user-defined functions that return one of the simple datatypes $,#,%,!
                              
Kevin Diggins  : Mingw/Clang issued warnings for two self-initialized loop variables. Although 
                 legal, I substituted local variables to eliminate the cause of the warnings.
                 
﻿*********************************************************************************************
2023/09/28       Changes in 8.0.6 from 8.0.5
*********************************************************************************************
Kevin Diggins  : Added the functions TIX_START and TIX_NOW to the lexicon. These were inspired
                 by the PowerBasic TIX implementation.  The BCX function, TIX_NOW, returns 
                 a double precision COUNT OF MILLISECONDS since TIX_START was called. Actual
                 resolution (precision) can vary by hardware and operating environment. Timing 
                 values in microseconds and even nanoseconds have been reported when running
                 under Windows 10/11 on some business class computers and workstations.               
                 
                 TIX_START and TIX_NOW rely on the Win32 API function QueryPerformanceCounter 
                 to produce TIX_NOW's high resolution result.
                                  
                 BCX makes performing precise timing very easy using these new functions.
                                                                             
                    TIX_START      ' Re-initializes two internal variables.
                    DELAY 1        ' This could be any amount of code that you want to measure.
                    PRINT TIX_NOW  ' BCX knows that TIX_NOW is a double precision function.
                    PAUSE

Kevin Diggins  : Added new function, NEWBMP, to the lexicon.  It takes no arguments and it returns
                 a HBITMAP to a FULLY CREATED, blank bitmap. The initial size of the bitmap is 
                 determined by the screen resolution that the app is running on. The size can 
                 grow or shrink, depending upon subsequent manipulations. NEWBMP is a timesaver
                 when you're working/experimenting/developing graphic ideas.
                  
                 Example 1: DIM AS HBITMAP My_Bitmap = NEWBMP 
                 Example 2: LOCAL My_Bitmap AS HBITMAP :  My_Bitmap = NEWBMP
 
Kevin Diggins  : Added new function, MAKEBMP(hdc AS HDC) to the lexicon. This function requires
                 a valid HDC variable pointing to existing and active 32-bit bitmap data.
                 The function determines the size of the HDC bitmap and returns a HBITMAP to
                 a copy of the original image data found in the HDC function argument.

                 Example Usage:

                 DIM Smile AS HBITMAP         ' Create a HBITMAP variable
                 Smile = MAKEBMP (BCX_BUFFER) ' BCX_BUFFER is an HDC. Copy its bmp to Smile

Kevin Diggins  : Added new function, MAKEHDC (hBmp AS HBITMAP) to the lexicon. This function
                 requires a valid HBITMAP variable pointing to existing and active 32-bit
                 bitmap data.  It returns the Device Context Handle (HDC) of its argument.  
                 Having a bitmap's HDC enables you to programmatically draw on a bitmap.
                 
                 Here is a snippet showing how it is used:

                 DIM hdcTemp AS HDC
                 hdcTemp = MAKEHDC (hBmp)     ' Return an HDC pointing to hBmp's image data.

                 IF hdcTemp <> NULL THEN      ' If valid then PRINT on top of a bitmap
                     BCX_PRINTEX(0, 40, 90, "It's Magic!", &HFCFC54, &H000000, "Verdana", 26, hdcTemp)
                 END IF
                 
Kevin Diggins  : Added new aliases LOR and LAND which are equivalent, in intended function 
                 and purpose, as the logical operators: ANDALSO and ORELSE
                     
                     
Kevin Diggins  : Added FTELL(FileNumber AS FILE) to the lexicon.  FTELL is a case-insensitive alias  
                 for the C runtime "ftelli64" function. FTELL is used to return the (long long) current 
                 file position of a file that has been opened for reading or writing.  The combination
                 of FTELL and SEEK is often used to purposely move around a file in non-sequential ways.
                  
                 Example:
                 DIM Txt$
                 OPEN "SomeFile.txt" FOR INPUT AS #1
                 LINE INPUT #1, Txt$
                 PRINT FTELL(#1)  ' Report the current file position
                 CLOSE #1                  
                                   
Kevin Diggins  : Directional bug-fix for BCX_POLAR_LINE and BCX_POLAR_PSET

Kevin Diggins  : BCX_FLOODFILL's argument list was inconsistent with the other BCX graphics
                 commands, in that the optional HDC was not the last argument.  I swapped 
                 the last two arguments to bring it into conformance.  This change might 
                 require BCX programmers to update their source code.  This will become 
                 obvious when a c\c++ compiler detects conflicts with BCX_FLOOD's arguments.
                 
Vortex         : Reported bug with variables whose identifier starts with an underscore. FIXED!

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2023/09/06       Changes in 8.0.5 from 8.0.4
*********************************************************************************************
Kevin Diggins  : Added BCX_BLIT to the lexicon. BCX_BLIT is a case-insensitive command that 
                 provides a powerful yet easy to use way to blit an existing HBITMAP to an 
                 existing HDC. Its prototype is: 
                 
                 BCX_BLIT(hBmp as HBITMAP, hDC as HDC).
                  
                 Here is a snippet from an upcoming larger sample project:
                    
                     DIM AS HBITMAP hBmpBackGrnd = BCX_LOADIMAGE ("aquarium.jpg")
                     BCX_BUFFER_START (MAXX, MAXY)
                     BCX_BLIT (hBmpBackGrnd, BCX_BUFFER) ' fast enough to use for animations.
                     
Kevin Diggins  : Added BCX_BLIT_STRETCH to the lexicon. BCX_BLIT_STRETCH is a case-insensitive
                 command that provides a powerful yet easy to use way to blit an existing HBITMAP
                 to an existing HDC. Its prototype is: 
                 
                 BCX_BLIT_STRETCH(hBmp as HBITMAP, hDC as HDC).
                  
                 The difference between BCX_BLIT and BCX_BLIT_STRETCH is that BCX_BLIT copies
                 the bitmap to HDC, even if its dimensions are smaller than the HDC's.
                 BCX_BLIT_STRETCH will stretch a bitmap that is smaller than the HDC to 
                 the maximimum dimensions of the HDC.  Hence, the name and difference.
                 Useful for switching from window to fullscreen and resizing screens.
                                      

Kevin Diggins  : Added BCX_BLIT_SPRITE to the lexicon. BCX_BLIT_SPRITE is a case-insensitive
                 command that provides a powerful yet easy to use way to blit an existing 
                 HBITMAP, with a transparency RGB mask, to an existing HDC. Its prototype is: 
                 
                 BCX_BLIT_SPRITE (hBmp as HBITMAP, Left as INT, Top as INT, rgbMask as DWORD, hDC as HDC).
                  
                 Here is a earlier snippet from an upcoming sample project:
                      
                    FOR INTEGER j = 1 TO l[i]
                        IF dx[i] < 0 THEN
                            BCX_BLIT_SPRITE (Fish_1, x[i], y[i], RGB(255, 0, 255), BCX_BUFFER)
                        ELSE
                            BCX_BLIT_SPRITE (Fish_2, x[i], y[i], RGB(255, 0, 255), BCX_BUFFER)
                        END IF
                    NEXT

                 Unlike BCX_BLIT which is intended to overwrite an entire HDC display buffer,
                 BCX_BLIT_SPRITE is intended for smaller images that will be overlayed onto 
                 what is already in the HDC display buffer -- like placing actors at the front
                 of a stage.  You must specify an RGB mask but you are not obligated to use it.
                 Just be sure to pick an RGB value that is not part of the sprite that you want
                 displayed on the screen.  I like using RGB(255,0,255), but you can choose any
                 RGB value that you prefer.

Kevin Diggins  : Improved BCX_BUFFER_START() by releasing previous resources, if any.  This
                 prevents leaking GDI resources and enables us to easily use BCX_BUFFER_START
                 in multiple locations of our code, F.E., changing from window to full screen.


Kevin Diggins  : BCX_PENSIZE was not detected in some uses.  FIXED.

Kevin Diggins  : Applied a small optimization to many of the BCX line and pixel runtimes

Kevin Diggins  : Refactored the DrawTransBmp() runtime function.

Kevin Diggins  : Refactored the QBCOLOR() runtime function.

﻿*********************************************************************************************
2023/08/31       Changes in 8.0.4 from 8.0.3
*********************************************************************************************
Kevin Diggins  : Added case-insensitive PI to the lexicon. BCX emits PI as a double precision
                 numeric literal: 3.141592653589793. Programs where you have defined PI 
                 ( case doesn't matter ), will need to be updated. That means removing your 
                 definition of PI, regardless whether it is a CONST, a SINGLE, a DOUBLE or 
                 anything else. If you insist on having your definition, you will need to 
                 change its name to something like, myPI.

Kevin Diggins  : Added two new BCX drawing commands: BCX_POLAR_PSET and BCX_POLAR_LINE 
                 Both commands have an identical argument list:
 
                 hWnd AS HWND
                 RadiusX AS LONG
                 RadiusY AS LONG
                 Radius AS SINGLE
                 Azimuth_In_Decimal_Degrees AS SINGLE
                 PenColor AS DWORD
                 AltHdc AS HDC (optional, used instead of supplying hWnd in the first argument)
 
                 Their purpose is to easily and intuitively place a pixel or a line that 
                 originates at the coordinates of a radius point and extends out from that 
                 location for some user-specified distance along a user-specified direction.
                 The direction chosen for these two command is specified in decimal degrees,
                 not radians, and use a common 360 degree circle. Zero degrees is at the
                 top, 90 degrees is to the right, 180 degrees is at the bottom, and 270 degrees
                 is to the left. Another way to think about those directions is: 12 o'clock,
                 3 o'clock, 6 o'clock, and 9 o'clock. Here is a small example:
 
                 $BCXVERSION "8.0.4"
                 GUI "PGE", PIXELS

                 CONST MAXX = 800
                 CONST MAXY = 800

                 SUB FORMLOAD
                    GLOBAL Form1 AS HWND
                    Form1 = BCX_FORM ("Polar Graphics Example", 0, 0, MAXX, MAXY)
                    BCX_SET_FORM_COLOR(Form1, QBCOLOR(0))
                    MODSTYLE(Form1, 0, WS_MAXIMIZEBOX|WS_MINIMIZEBOX, FALSE)
                    CENTER Form1
                    SHOW Form1
                    CALL Drawit
                END SUB

                BEGIN EVENTS
                    SELECT CASE CBMSG
                        CASE WM_QUIT, WM_CLOSE, WM_DESTROY
                        END
                END SELECT
                END EVENTS 
 
                SUB Drawit
                    FOR INT i = 0 TO 360 STEP 45 ' draw 8 spokes
                        BCX_POLAR_LINE (Form1, 400, 400, 100, i, QBCOLOR(9))
                    NEXT
                    BCX_PENSIZE = 4              ' fat pixels please
                    FOR INT i = 0 TO 360 STEP 10 ' draw a ring of colored pixels
                        BCX_POLAR_PSET (Form1, 400, 400, 120, i, QBCOLOR(RND2(9, 14)))
                    NEXT
                END SUB
 
Kevin Diggins : Rewrote the BCX_PSET command, so it -actually- uses the BCX_PENSIZE variable.
                The GDI function (SetPixelV) was supplemented with the GDI (LineTo). If 
                BCX_PENSIZE < 4 then BCX_PSET will use the faster SetPixelV api function. 
                If BCX_PENSIZE > 3 then it instead uses the LineTo api and the starting 
                and ending coordinates are set equal which effectively creates a fat pixel.
                Remember: BCX_PENSIZE does not change the size of a pixel until BCX_PENSIZE 
                is set to a value of 4 or greater. Neither SetPixel or SetPixelV allow for 
                variable pen sizing, so this is my solution to that shortcoming.

Kevin Diggins : Added function: BCX_GET_WINDOW_WIDTH (HWND) to get a Window's client width.

Kevin Diggins : Added function: BCX_GET_WINDOW_HEIGHT(HWND) to get a Window's client height.

Kevin Diggins : Added DegToRad (Degrees) a fast, case-insensitive macro to the lexicon.
                Instead of dividing PI by 180, it uses a precalculated coefficient.
                #define DegToRad(Degrees)((Degrees)*0.017453292519943)

Kevin Diggins : Added RadToDeg (Radians) a fast, case-insensitive macro to the lexicon.
                Instead of dividing 180 by PI, it uses a precalculated coefficient.
                #define RadToDeg(Radians)((Radians)*57.29577951308232)

Kevin Diggins : Replaced the RND2() function with a better/faster version. 

Kevin Diggins : Added a (very) tiny bit of support for TCC - TINY C COMPILER

﻿*********************************************************************************************
2023/08/19       Changes in 8.0.3 from 8.0.2
*********************************************************************************************
Kevin Diggins  : Added the missing Richard Meyer's BCX_PIE implementation.  Tested & Working!
               
Kevin Diggins  : Minor cleanup of recently added commands. 

﻿*********************************************************************************************
2023/08/18       Changes in 8.0.2 from 8.0.1
*********************************************************************************************
Kevin Diggins  : Added the following case-insensitive reserved words to the BCX lexicon.
                             BCX_BUFFER, BCX_BUFFER_START, BCX_BUFFER_STOP
                 They are used to easily create double-buffered graphics using the BCX
                 point and line drawing commands. BCX_BUFFER is a global HDC variable that 
                 points to the buffered HDC.  BCX_BUFFER_START and BCX_BUFFER_STOP are the
                 boundary lines for the line drawing commands that you want buffered.
                 
                 Usage:
                 
                 BCX_BUFFER_START (X, Y)  'desired size (in pixels) of your buffer. 
                             --- Your BCX drawing statements go here ---
                 BCX_BUFFER_STOP (hForm)  ' Transfers the buffered image to hForm.

                 Line drawing to buffer takes the format:
                  
                 BCX_CIRCLE (0, x, y, radius, RGB(32, 64, 128), 0, BCX_BUFFER) 
                  
                 Observe that the 1st argument is zero and the last is BCX_BUFFER
                  
                 Double buffering is a great way to reduce or eliminate flickering
                 and for speeding up the presentation of your line drawing statements.
                 Watch for the demo "Flower_Wheel.bas" announcement on the BCX forum.

Kevin Diggins  : Added BCX_PENSIZE to the lexicon.  It is initialized to a value of one (1).  
                 BCX_PENSIZE is a case-insensitive GLOBAL VARIABLE that users can change to 
                 set the pen size (in pixels) of the following BCX graphics functions:
                 
                 BCX_ARC	BCX_CIRCLE	BCX_ELLIPSE	BCX_FLOODFILL	BCX_LINE
                 BCX_LINETO	BCX_POLYBEZIER  BCX_POLYGON	BCX_POLYLINE	BCX_PSET
                 BCX_RECTANGLE  BCX_ROUNDRECT

                 For example, the following draws a 5 pixel thick circle:
                 BCX_PENSIZE = 5
                 BCX_CIRCLE (Form1, x, y, radius, RGB(32, 64, 128), 0, 0)
                  
Kevin Diggins  : Updated and simplified several casts to eliminate several MSVC warnings.

Kevin Diggins  : Removed the need for the FINT macro. INT(Number) directly converts to floor()

Richard Meyer  : Found and fixed a reporting issue caused inside the BCX warning system.

﻿*********************************************************************************************
2023/08/06       Changes in 8.0.1 from 8.0.0
*********************************************************************************************
Kevin Diggins  : Contributed BCX_PRINTEX function to the BCX vocabulary.
                 ***************************************************************************** 
                 BCX_PRINTEX (hWnd AS HWND, x AS LONG, y AS LONG, MyText$, FG_Color AS LONG, _
                 BG_Color AS LONG, FontFace$, FontSize AS LONG, hDC = NULL AS HDC)
                 *****************************************************************************
                 Like other BCX graphics functions, users must supply either a HWND or an HDC.
                 All other arguments are required for proper functioning.  BCX_PRINTEX is an
                 extended version of BCX_PRINT and makes it easy to print formatted text to 
                 your graphics applications.
                  
Richard Meyer  : Contributed BCX_PIE function to the BCX vocabulary.  Thank you!

Robert Wishlaw : Contributed corrected BCX_TOOLBAR runtime code

Robert Wishlaw : Reported dead code related to "name". 
                 Removed by MrBcx, as "name" is not a BCX reserved word.

Robert Wishlaw : Refactored the BFFCallBack runtime code.

Robert Wishlaw : Updated CINT function to be Microsoft compatible

Robert Wishlaw : Reported inconsistency with global vars given RAW attribute. Fixed by MrBcx

﻿*********************************************************************************************
2023/06/14       Changes in 8.0.0 from 7.9.8
*********************************************************************************************
Kevin Diggins  : The inline C operator "!" was mis-processed in some contexts.   Fixed

Kevin Diggins  : Robert Wishlaw reported $CPROTO has been broken since 7.4.1.    Fixed

﻿*********************************************************************************************
2023/04/23       Changes in 7.9.9 from 7.9.8
*********************************************************************************************
Robert Wishlaw : Contributed changes that allow the use of UTF-8 variable names.
                 For Example:

                    DIM τασκ$
                    τασκ$ = " doo, be, shoo, bop, ooh, dee, doo, sha-bam"
                    DIM σκατανοήτων$
                    σκατανοήτων$ = " understandable"
                    PRINT τασκ$, σκατανοήτων$

Robert Wishlaw : Silenced new Pelles C v12 precision loss warning in runtime scan function.

Robert Wishlaw : Updated LPAD$ & RPAD$ runtime functions to help prevent memory overruns.

Kevin Diggins  : Added case-insensitivity to the CRT functions ceil() and floor()

Kevin Diggins  : Added cast inside Process_ASC_Function() to silence Pelles C v12 warning.

Kevin Diggins  : Added new Pelles C v12 suppression of warning #2073

*********************************************************************************************
2023/02/04       Changes in 7.9.8 from 7.9.7
*********************************************************************************************
Robert Wishlaw : Reported $NAMESPACE, $TRY, $CLASS, $THROW, $CATCH were replaced by Wayne
                 Halsdorf in 2011 but their oxbow code remained in place. Removed by MrBcx

Kevin Diggins  : Added -optional- ROTATION to BCX_SET_FONT()

                 BCX_SET_FONT(hWnd, _
                              FontFace$, _
                              FontSize%  _
                           [, Weight%] _
                           [, Italic%] _
                           [, Underline%] _
                           [, StrikeThru%] _
                           [, CharacterSet%] _
                           [, Rotation%])   

                 Here's a compilable example:

                 GUI "BCX_Font_Rotation"

                 SUB FORMLOAD
                     DIM Form1   AS CONTROL
                     DIM Label_1 AS CONTROL
                     Form1 = BCX_FORM("BCX Font Rotation", 0, 0, 200, 200)
                     Label_1 = BCX_LABEL("Hey Look, I'm Twisted!", Form1, 80, 55, 5, 215, 250, WS_CHILD | WS_VISIBLE | SS_CENTERIMAGE)
                     BCX_SET_FONT(Label_1, "Tahoma", 14, FW_BOLD, 1, 0, 0, 0, 450) ' the 450 = 450 TENTHS of a degree = 45 degrees
                     CENTER Form1
                     SHOW Form1
                 END SUB

                 BEGIN EVENTS
                 END EVENTS

Kevin Diggins  : USING$ can now place a percent symbol (%) at the end of the string.
                 For example: PRINT USING$ ("###.##%", 33.5)    ' Output: 33.50%

Kevin Diggins  : BCX now allows hexadecimal numbers in "c/c++" format and traditional BASIC
                 format.  For example, BCX accepts both of these hex representations:
                                APPLES = 0x0001   and   APPLES = &H0001
                 This enhancement has the potential to break some existing code. Specifically,
                 some pointers might be interpreted by BCX as a hex number.  For example, 
                                     Call SomeFunction( &hDC ) 
                 the &hDC might be intended as a pointer to a HDC variable but BCX recognizes
                 and translates it to 0xDC which will certainly cause a C/C++ compiler error.
                 So, in instances like that, hDC would need to be renamed, for example, MyhDC.

                 RULE:  If BCX determines an identifier is a hexadecimal number, it will be 
                 emitted as a c/c++ hexadecimal number. You should not create identifiers  
                 (variable names, SUB/FUNCTION names, CONSTs/MACROs names, etc) which can  
                 be misinterpreted as hexadecimal numbers when prefixed with an ampersand.

Kevin Diggins  : Repaired HEX2DEC function. It accepts arguments with &H, 0x, or no prefix.

Kevin Diggins  : "RETURN" now -also- serves as an alias to "FUNCTION =" user functions.

Kevin Diggins  : Added case-insensitivity to the WinApi function: GetDlgItem.

*********************************************************************************************
2022/11/28       Changes in 7.9.7 from 7.9.6
*********************************************************************************************
Robert Wishlaw : Reported $INTERFACE/$ENDINTERFACE parsing errors.  Fixed by MrBcx 

Kevin Diggins  : Added more auto-detection and allowance for BCX's C++ directives

*********************************************************************************************
2022/11/27       Changes in 7.9.6 from 7.9.5
*********************************************************************************************
Robert Wishlaw : Reported bitwise "AND NOT" error stemming from 765 bug fix.  Fixed by MrBcx 

Robert Wishlaw : Reported $NAMESPACE / $ENDNAMESPACE parsing errors.  Fixed by MrBcx 

Kevin Diggins  : Silenced warnings involving the initialization of MONITORINFO structures.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

﻿*********************************************************************************************
2022/09/10       Changes in 7.9.5 from 7.9.4
*********************************************************************************************
Kevin Diggins  : Restored LPSTR test in internal function Im_UDT_String() and added a new 
                 transform that better distinguishes between pointer and string expressions.
                 Im_UDT_String() is important for identifying string variables without "$"

*********************************************************************************************
2022/09/07       Changes in 7.9.4 from 7.9.3
*********************************************************************************************
Kevin Diggins  : Bug Fix: Removed test for LPSTR from internal function Im_UDT_String() 

Kevin Diggins  : Disintegrated internal function Emit_GuiProcs into its constituent parts.

Kevin Diggins  : Disintegrated internal function Emit_CPP into its constituent parts.
                 
Kevin Diggins  : Disintegrated internal function Emit_OtherProcs

*********************************************************************************************
2022/09/05       Changes in 7.9.3 from 7.9.2
*********************************************************************************************
Robert Wishlaw : Reported minor issue with extra casts being emitted.  Fixed.

Ad Rienks      : Reported three superfluous semicolons in BCX runtime code.  Fixed

Kevin Diggins  : Disintegrated internal function Emit_FileIOProcs into constituent parts:
                 Finput, Fprint, Fwrite, LineInput, Seek, SetEof, Get, and Put.  This results
                 in easier maintenance, a slight performance benefit, and one less thing on 
                 Wayne's To-Do list :-)
  
Kevin Diggins  : Disintegrated internal function Emit_Dynamic into constituent parts:
                 Dynamic and Free.  This results in easier maintenance, and one less thing on 
                 Wayne's To-Do list :-)

Kevin Diggins  : Disintegrated internal Function Emit_ArrayProcs into constituent parts:
                 Qsort and QsortIdx.  This results in easier maintenance, and one less thing on 
                 Wayne's To-Do list :-) 


Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2022/07/24       Changes in 7.9.2 from 7.9.1
*********************************************************************************************
Ad Rienks      : Reported bug involving the text "SET" being inappropriately translated. Fixed.

Kevin Diggins  : Updated FOR-NEXT and REPEAT-END REPEAT loop-local variable translations.  
                 For example:
                 
                 FOR INT i = 1 TO 10
                    PRINT i
                 NEXT

                 .................................
                 OLD TRANSLATION (unconventional) 
                 .................................

                       {int i;
                       for(i=1; i<=10; i+=1)
                         {
                            printf("% d\n",(int)i);
                         }
                         }
                 ................................
                 NEW TRANSLATION (conventional) 
                 ................................

                       for(int i=1; i<=10; i++)
                           {
                             printf("% d\n",(int)i);
                           }

              
Kevin Diggins  : Improved type detection when printing additional STRING types.
                 For example, the following failS in BCX 7.9.1 but succeeds in 7.9.2.  

                          CALL SayMyDogsNames

                          SUB SayMyDogsNames
                             DIM AS PSTR MyDogs[] = {"Fido", "Spot", "Lassie"}
                             FOR_EACH(i, MyDogs)
                                PRINT MyDogs[i]
                             NEXT_EACH(i)
                          END SUB


Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2022/07/11       Changes in 7.9.1 from 7.9.0
*********************************************************************************************
Kevin Diggins  : 7.9.1 cannot be translated with 7.9.0.  Either use one of my provided 7.9.1
                 executables or compile 7.9.1 yourself using the included BC.C or BC.CPP.

Kevin Diggins  : Many of the auto-detection enhancements that went into 7.9.1 have collectively 
                 led to a performance hit, meaning BCX may take a little longer to do its work. 
                 Complexity comes at a cost.  But, unless you're running an old PC, you probably 
                 won't notice the change. On my PC, translating BCX went from around 0.6 seconds 
                 to 0.9 seconds. YMMV

Kevin Diggins  : This release will break some code.  Specifically, if you have a STRING
                 ARRAY that references an element's secondary location by pointer, you 
                 will need to make a minor modification using my new BYTE_AT() macro.
                 For example:

                           DIM A$[5]   : A$[3] = "FUN!"
                           IF  A$[3][0] = ASC("F")  THEN PRINT "TRUE"

                                   MUST BE CHANGED to:
                
                   IF BYTE_AT (A$[3][0]) = ASC("F") THEN PRINT "TRUE"

Kevin Diggins  : Implemented auto-detection of user FUNCTION datatypes, so those FUNCTIONS 
                 can be used in PRINT statements without requiring their related SIGILS.
                 Equally important, many hours went into sorting out how to make the 
                 following example translate correctly.  You can place the CLASS above or 
                 below SUB MAIN.  Likewise, you can change the location and order of 
                 FUNCTIONS F3 and F4.  That was no small feat.  But I like it when we 
                 can get our computers to make our coding a little bit easier. For example, 
                 BCX 7.9.1 will automatically translate this to a .cpp file :


                 SUB MAIN
                   DIM RAW a AS TYPETEST  
                   PRINT a.F1()           ' Notice there are no sigils (!#$) in any
                   PRINT a.F2()           ' of these PRINT statements.  BCX now works 
                   PRINT a.F3()           ' that out for you.  Of course, 7.9.1 is 
                   PRINT F4()             ' 100% backwardly compatible, so if you
                   PRINT F5$()            ' like using sigils (!#$), go for it.
                 END SUB                 


                 CLASS TYPETEST
                 PUBLIC:

                   FUNCTION F1 () AS SINGLE
                      FUNCTION = 1.123456
                   END FUNCTION

                   FUNCTION F2 () AS DOUBLE
                      FUNCTION = 1.23456789012345
                   END FUNCTION

                   FUNCTION F3 () AS STRING
                      FUNCTION = "STRING"
                   END FUNCTION
                 END CLASS

                 FUNCTION F4 AS STRING
                    FUNCTION = "Hello From F4"
                 END FUNCTION

                 FUNCTION F5$             ' <<< NOTICE the use of the "$" sigil
                   FUNCTION = "Hello From F5"
                 END FUNCTION


Kevin Diggins  : Added a simple FOR_EACH() / NEXT_EACH() mechanism to the BCX lexicon.
                 This only works on multi-dimensional, STATICALLY DIMENSIONED arrays.  
                 This was tested using string, single, double, and integer arrays.
                 FOR_EACH / NEXT_EACH loops can be nested.

                 The basic usage / format looks like this:

                 FOR_EACH (LoopLocalVariable, NameOfOneDimensionalArray)
                    PRINT " Value = ", NameOfOneDimensionalArray [LoopLocalVariable]
                    more statements .....
                 NEXT_EACH (LoopLocalVariable) ' < Must match the name in the FOR_EACH ()

                 >>> Do not "DIM" your LoopLocalVariable's ... they are DIM'ed automatically.
                 You must provide the same >NAME< of your >LoopLocalVariable< to each pair
                 of FOR_EACH() and NEXT_EACH() macros.

                 Here is an example showing a nested FOR_EACH loop:

                 DIM Numbers[3] AS SINGLE

                 Numbers[0] = 0.000
                 Numbers[1] = 1.111
                 Numbers[2] = 2.222

                 DIM Strings [3] AS STRING

                 Strings$[0] = "ZERO"
                 Strings$[1] = "ONE"
                 Strings$[2] = "TWO"

                 CLS
                 PRINT "Displaying the NUMERIC array ..."
                 PRINT

                 FOR_EACH (ZZ, Numbers)
                      PRINT "Cell No.", ZZ, " Value = ", Numbers[ZZ]
                      FOR_EACH (YY, Strings)
                           PRINT "Now Showing a NESTED FOR_EACH LOOP: ", Strings[YY]
                      NEXT_EACH (YY)
                 NEXT_EACH (ZZ)

                 PRINT
                 PRINT "Displaying the STRING array one more time ..."
                 PRINT

                 FOR_EACH (HH, Strings$)
                       PRINT "Cell No.", HH,  " Value = ", Strings$[HH]
                 NEXT_EACH (HH)


                 Here is an example using a two (2) dimensional string array to 
                 simulate a poor mans dictionary:

                 DIM Dict[10,10] AS STRING
                 CLS

                 FOR_EACH (iter, Dict)
                    Dict [iter, 1] = "Key"   + STR$(iter)
                    Dict [iter, 2] = "Value" + STR$(iter)
                 NEXT_EACH (iter)

                 FOR_EACH (iter, Dict)
                    IF Dict [iter, 1] = "Key 5" THEN PRINT "Found: ", Dict [iter, 2] : PRINT
                 NEXT_EACH (iter)

                 PRINT "Here are the complete contents" : PRINT

                 FOR_EACH (iter, Dict)
                    PRINT Dict [iter, 1] , "  ",  Dict [iter, 2]
                 NEXT_EACH (iter)

                 PAUSE


Kevin Diggins  : BCX now broadly accepts the "#" SIGIL when used as a file handle.
                 When BCX encounters, for example,  #MyFPvar, BCX simply removes the "#".
                 But when #1, #2, #3 (or any valid file number) is supplied, BCX will
                 convert those to: FP1, FP2, FP3, and so on.  BCX now watches all
                 file I/O functions and automatically transforms them when necessary.
                 For example, for the first time ever, the following is now valid in BCX:

                      OPEN "test.txt" FOR OUTPUT AS #1
                      PRINT #1, "this is a test"
                      FLUSH  #1
                      CLOSE #1
                      DIM a$

                      OPEN "test.txt" FOR INPUT AS #1
                      LINE INPUT #1, a$
                      PRINT a$
                      a$ = ""
                      SEEK #1, 0
                      LINE INPUT #1, a$
                      PRINT a$
                      SETEOF #1, 10
                      CLOSE #1

                      OPEN "test.txt" FOR APPEND AS #1
                      PRINT #1, "Here", " is", " new", " data"
                      CLOSE #1

                      OPEN "test.txt" FOR INPUT AS #1
                      WHILE NOT EOF(#1)
                         LINE INPUT #1, a$
                         PRINT a$
                      WEND
                      CLOSE #1

                      OPEN "test.txt" FOR BINARY AS #1
                      CLEAR a$
                      GET #1, a$, 8
                      CLOSE #1
                      PRINT a$, "GREAT!"

Kevin Diggins  : BCX now allows you to use QBASIC style file I/O.  FPRINT and FINPUT are
                 permanent BCX commands that you can continue to use as you always have.
                 The BCX Translator itself was tested using these new capabilities.

                 Below is a modified version of the BCX Help FINPUT example.  Notice how
                 BCX now allows PRINT #1, CLOSE #1, INPUT #1, and so on.  Notice also
                 that you don't need to include sigils on the INPUT or PRINT statements.

                      DIM P, N!, E#, L!, D$, j, random!
                      OPEN "TEST.TXT" FOR OUTPUT AS #1
                      FOR j = 1 TO 10
                         random! = j * 100.0 * RND
                         PRINT #1, j , ",", random!, ",", 12356789.012345#, ",", j + 10, ",", "This string has spaces"
                      NEXT
                      CLOSE #1
                      OPEN "TEST.TXT" FOR INPUT AS #1
                      WHILE NOT EOF(#1)
                         INPUT #1, P, N, E, L, D
                         PRINT P, " ", N, " ", E, " ", L, " ", D
                      WEND
                      CLOSE #1

Kevin Diggins  : Enhanced the CLOSE statement by allowing multiple file handles on one line.
                 For example:   CLOSE #1, #2, FP3, MyDocHandle

Kevin Diggins  : Improved the translation of the OPTION BASE statement.

Kevin Diggins  : Added $PRAGMA to the built-in directives.  For example, used within BCX 791:

                      $IFDEF (__GNUC__)
                          $PRAGMA GCC diagnostic ignored "-Wcast-function-type"
                           PPProc = (CPP_FARPROC) GetProcAddress (PPDLL_HANDLE,"ProcessLine");
                          $PRAGMA GCC diagnostic pop
                      $ELSE
                          PPProc = (CPP_FARPROC) GetProcAddress (PPDLL_HANDLE,"ProcessLine");
                      $ENDIF

Kevin Diggins  : Added "COMSET" reserved word as an alias to "SET", to overcome formatting
                 issues when using the "SET" OBJECT keyword in certain code editors.

Kevin Diggins  : Added VBA's "FILECOPY" reserved word as alias to BCX's "COPYFILE" statement.

Kevin Diggins  : Added VBA's "GET" AND "PUT" as aliases to BCX's "GET$" AND "PUT$" statementa.

Kevin Diggins  : Improved C++ detection.  When certain C++ keywords are detected, BCX outputs
                 a *.cpp file automatically.  The 35 C++ samples found in the BCX Help file 
                 were used to test BCX's auto-detection.  Neither $CPP nor the -cpp switch 
                 were needed or used for the correct translation.

Kevin Diggins  : String functions within PPTYPES did not emit storage for BCX_RetStr.  Fixed

Kevin Diggins  : Re-worked the following directives to be less confusing:

                 $WARNINGS         ' ENABLE  C/C++ compiler warnings. ( Deprecated )
                 $WARNINGS_ON      ' ENABLE  C/C++ compiler warnings.
                 $WARNINGS_OFF     ' DISABLE C/C++ compiler warnings  ( Default ) 
 
Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2022/06/18       Changes in 7.9.0 from 7.8.9
*********************************************************************************************
Robert Wishlaw : Updated RTL support-function lpwAlign() to silence MINGW warnings.

Kevin Diggins  : Silenced FARPROC/CPP_FARPROC cast warning when compiling with MINGW.

Kevin Diggins  : Corrected typo in Freefile RTL function.

Kevin Diggins  : Implemented UDT type-detection in nested UDT's, UDT arrays, and combinations.

Kevin Diggins  : Added GetSpecialFolderEx$ function to the lexicon and runtime.  The API
                 SHGetSpecialFolderPath, which GetSpecialFolder$ is based upon, is no longer 
                 supported by Microsoft.  That's why GetSpecialFolderEx$ was created.  Note:
                 this new function will not work with anything older than MS Vista.

Kevin Diggins  : Discovered and removed more unused/dead code

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2022/06/10       Changes in 7.8.9 from 7.8.8
*********************************************************************************************
Robert Wishlaw : Reported bug assigning to underscore-leading string variable names.  (Fixed)

Robert Wishlaw : Provided RTL updates to quiet MINGW indentation warnings. (Yes, that's a thing)

Kevin Diggins  : When BCX translates a UDT, it has always generated a UDT pointer variable
                 using the upper-case of the UDT name and prepended with *LP. You may not
                 always need it but it is automatically created and ready to be used if you
                 do. For example:  given TYPE Foo, BCX will generate: *LPFOO.  Now, BCX 789
                 adds a second UDT pointer, for example, *FOO_PTR, for the same purpose but
                 using a different spelling that some users might prefer instead of *LPFOO.
                 For example:

                 TYPE Foo
                     a AS DOUBLE
                     b AS INTEGER
                     c AS STRING
                 END TYPE

                is translated to:

                typedef struct _FOO
                {
                   double   a;
                   int      b;
                   char     c[BCXSTRSIZE];
                }FOO, *LPFOO, *FOO_PTR;

Kevin Diggins  : Improved user's scalar variable type detection and translation when not using
                 the type-identifying sigils. The changes primarily affect the INPUT, FINPUT,
                 and PRINT commands and expression parsing during translation.  For Example:

                TYPE FOO
                   a AS DOUBLE
                   b AS INT
                   c AS STRING
                END TYPE

                DIM F AS FOO

                F.a = 1.123456789
                F.b = 2
                F.c = "Hello World"

                PRINT "These are our initial values:"
                PRINT F.a
                PRINT F.b
                PRINT F.c
                PRINT

                CALL TestUDT (ADDRESSOF(F))

                PRINT
                PRINT "These were passed back from the SUB:"
                PRINT F.a
                PRINT F.b
                PRINT F.c
                PRINT

                SUB TestUDT (z AS FOO_PTR)
                   DIM K AS FOO
                   COPY_UDT(z, ADDRESSOF(K), SIZEOF(FOO)) ' Copy z contents to K
                   PRINT "These were passed to this SUB"
                   PRINT K.a
                   PRINT K.b
                   PRINT K.c
                   PRINT
                   INPUT "Enter a DOUBLE:  ", K.a
                   INPUT "Enter a INTEGER: ", K.b
                   INPUT "Enter a STRING:  ", K.c
                   COPY_UDT(ADDRESSOF(K), z, SIZEOF(FOO)) ' Copy K contents to z
                END SUB

                SUB COPY_UDT (Source AS PVOID, Destination AS PVOID, Count AS INT)
                   POKE(Destination, PEEK$(Source, Count), Count)
                END SUB

Kevin Diggins  : Created internal functions that makes it easier to identify when a member of
                 a UDT is a SINGLE, DOUBLE, or STRING variable.  These enabled me to improve
                 BCX so that the following correctly translates, compiles and runs:

                 TYPE FOO
                     MYNAME AS STRING
                     a AS SINGLE
                     b AS DOUBLE
                 END TYPE

                 DIM A AS FOO

                 A.MYNAME = "MrBcx"
                 A.a = 1.234567
                 A.b = 1.2345678912345

                 PRINT A.MYNAME               ' OUTPUT: MrBcx
                 PRINT A.a                    ' OUTPUT:  1.234567
                 PRINT A.b                    ' OUTPUT:  1.2345678912345

                 INPUT "Name? "  , A.MYNAME   ' INPUT:  MrBcx
                 INPUT "SINGLE? ", A.a        ' INPUT:  1.234567
                 INPUT "DOUBLE? ", A.b        ' INPUT:  1.2345678912345

                 PRINT A.MYNAME               ' OUTPUT: MrBcx
                 PRINT A.a                    ' OUTPUT:  1.234567
                 PRINT A.b                    ' OUTPUT:  1.2345678912345

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2022/05/13       Changes in 7.8.8 from 7.8.7
*********************************************************************************************
Robert Wishlaw : Reported BCXPATH$ oxbow code.                                      (Removed)

Doyle Whisenant: Reported method translation bug.                                     (Fixed)

*********************************************************************************************
2022/05/11       Changes in 7.8.7 from 7.8.6
*********************************************************************************************

Doyle Whisenant: Reported property translation bug.                                   (Fixed)

*********************************************************************************************
2022/05/08       Changes in 7.8.6 from 7.8.5
*********************************************************************************************
Ian Casey      : Reported a PRINT bug. MrBcx found (int)strlen was the root cause.    (Fixed)

Robert Wishlaw : Reported "off-by-one" error in LINE INPUT truncation detection code. (Fixed)

James Fuller   : Requested more Lcc-Win32 suppression when emitting C++ files.        (Fixed)

James Fuller   : Posted bug report for "METHOD" & "PROPERTY" translations.            (Fixed)

Robert Wishlaw : Enhanced the LINE INPUT truncation warning by displaying its datafile name.

Kevin Diggins  : BCX now allows using built-in BCX functions when used inside of C++ CLASSES.
                 CLASSES can also use USER-DEFINED SUBS and FUNCTIONS, as long as those are
                 contained within the CLASS (scope restrictions in effect). These improvements
                 were achieved, in part, by rearranging certain sections of the resulting C++
                 file, making them legally in scope with user-defined C++ classes.

Kevin Diggins  : Added PROPSET AND PROPGET. BCX translates PROPGET to "FUNCTION" when used in
                 a C++ class. Similarly, BCX translates PROPERTY and PROPSET to "SUB" when
                 used in a C++ class.

Kevin Diggins  : This version of BCX translates, compiles, and was tested using the current
                 MSVC++(2022), Clang v12 (beta), Mingw v12(Beta), Embarcadero C++ (7.5),
                 Pelles C v11 and the final release of Lcc-Win32 (2016).

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2022/04/12       Changes in 7.8.5 from 7.8.4
*********************************************************************************************
Kevin Diggins  : Made parsing improvements for restoring SELECT CASE BAND capabilities.
                 The 7.8.4 changes broke the MoveAnchorInc library that is used in several
                 BCX projects.  7.8.5 works with the MoveAnchorInc library.
                 
*********************************************************************************************
2022/04/11       Changes in 7.8.4 from 7.8.3
*********************************************************************************************
Mike Henning   : Reported problem with SELECT CASE BAND.  Fixed by MrBcx

Kevin Diggins  : Discovered duplicate sections being output to translated file. Fixed by MrBcx

Kevin Diggins  : Replaced numerous occurances of INSTR with INCHR where appropriate.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2022/04/09       Changes in 7.8.3 from 7.8.2
*********************************************************************************************
Mike Henning   : Reported CLANG-related issues involving GLOBAL dynamic arrays. Fixed by MrBcx

Kevin Diggins  : Fixed forward propagation parsing bug when creating multi-dimensional vars.
                 Discovered and reported by Robert Wishlaw.

Kevin Diggins  : Replaced LIKE() function runtime with shorter recursive version.  I also
                 added the ability to distinguish digits (0-9) using the "#" symbol. Here is
                 a simple example: PRINT LIKE ("hello world 123ok456", "*ll*ld*###??###").
                 Also, changed LIKE() to ALWAYS CASE-INSENSITIVE, which seems to be a common
                 behavior in other implementations.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2022/03/21       Changes in 7.8.2 from 7.8.1
*********************************************************************************************
Robert Wishlaw : Added Windows 11 detection to OSVERSION$ function.

Doyle Whisenant: Added messages WM_MEASUREITEM and WM_DRAWITEM to the SplitterWndProc runtime

Kevin Diggins  : Reverted and revised a small part of internal SUB EmitOld to earlier (7.5.9)
                 after discovering a very rare bug in an old SEMI-OOP demo. Fully tested.

Kevin Diggins  : Fixed USING$ format of negative currency values, reported by Robert Wishlaw

Kevin Diggins  : Renamed $WARNINGS to $WARNINGS_OFF.  $WARNINGS is now deprecated and could
                 be removed in a future version of BCX.

Kevin Diggins  : Added keyword "MACRO" as an alias to "CONST".  Both are translated to #define,
                 so their use is simply a matter of personal taste.

Kevin Diggins  : Improved treatment of the $DEFINE directive
                 EXAMPLE:  $DEFINE  DEFINT(X,Y) = CONST INT X=Y
                 OUTPUT :  #define DEFINT (X,Y) const int X = Y

Kevin Diggins  : Changed BCX runtime function BCX_TmpStr to accept an unsigned long int.
                 Previous versions would truncate if the passed argument exceeded ~4GB.

Kevin Diggins  : Added Lcc-Win32 support for Ian Casey's multi-monitor aware enhancements.
                 This also required fixing Lcc-Win32's version of multimon.h

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2022/02/07       Changes in 7.8.1 from 7.8.0
*********************************************************************************************
Robert Wishlaw : Updated the organization of certain compiler directives.

Kevin Diggins  : Added READ(x) function.  Whereas READ$(x) exists to read strings from
                 DATA statements, READ(x) exists to read literal numbers, including integers,
                 single and double precision, and Scientific Notation.  Some compilers will
                 also accept HEX numbers in the form 0x and 0X.  MSVC, CLANG, and Pelles do,
                 while MinGW, Embarcadero, and LccWin32 do not, at this time.

                 EXAMPLE:
                           DIM Accumulator AS DOUBLE
                           DIM Ndx = 1
                           WHILE READ (Ndx) <> -1
                             INCR Accumulator, READ(Ndx++)
                           WEND
                           PRINT Accumulator   ' Result = 45.9
                           DATA 1.1, 2.1, 3.1, 4.1, 5.1, 6.1, 7.1, 8.1, 9.1, -1

Kevin Diggins  : Improved USING$ function.  If the format string contains a "^" character,
                 USING$ will return a scientific notation version of its numeric argument and
                 any other characters contained in the format string will be ignored.  USING$
                 accepts a (long double) that is compiler dependent.  That parameter is always
                 cast (internally) to a (double) before being returned as a sci-notation string.

                 EXAMPLE:
                 PRINT USING$("^", ATN(1)*4)                ' Result: 3.141592653589793E+0
                 PRINT USING$("^", 12345678.12345678)       ' Result: 1.234567812345678E+07

Kevin Diggins  : BCX apps using the GUI keywords will now include the CS_DBLCLKS Windows class
                 style enabling the WM_LBUTTONDBLCLK and WM_RBUTTONDBLCLK messages to receive
                 those signals from Windows and thus be available to BCX programmers.

Kevin Diggins  : Improved detection between Embarcadero 32-bit and 64-bit compiler directives.

*********************************************************************************************
2022/02/02       Changes in 7.8.0 from 7.7.9
*********************************************************************************************
Robert Wishlaw : Reported $PRJ and $PRJUSE bug  -- Corrected.

Ian Casey      : GetFileName low allocation bug -- Corrected.

Kevin Diggins  : Added LINE INPUT -optional- argument for specifying the memory limit of
                 the receiving variable, including the required null terminator.
                 For example: LINE INPUT FP1, A$, 5000
                 will read up to but no more than 4999 characters and add a null terminator.
                 If a default or optional limit is less than the length of any line being
                 read, LINE INPUT will abort the application with a truncation message
                 identifying the program line that detected the truncation, as well as the
                 actual (truncated) line of text that caused the error condition.

Kevin Diggins  : The BCX_RESIZE runtime label was misspelled.  Corrected.

Kevin Diggins  : Renamed internal $BCX_COLORS to BCX_COLORS because $BCX_COLORS is not a
                 formal BCX directive, it is an internal BCX translator constant.

Kevin Diggins  : Added FUNCNAME$ keyword.  This is a case-insensitive keyword that
                 equates to __func__ which is a C99/C++11 macro that returns the name of
                 the FUNCTION or SUB that it is used within.  FUNCNAME$ is intended as one
                 more debugging tool -- useful while you develop your applications.
                 Below is a simple example:

                 CALL Test_Funcname

                 SUB Test_Funcname
                      PRINT "Entering ", FUNCNAME$
                      PRINT "Leaving  ", FUNCNAME$
                 END SUB

Kevin Diggins  : Added compiler-specific header to support the "rdtsc" intrinsic.
                 Tested working with MSVC, Clang, Embarcadero(64-bit only), Mingw, Pelles and Lcc-Win32.
                 Example Below:

                 $BCXVERSION "7.8.0"   ' Requires BCX 7.8.0 or newer
                 PRINT GetCPUSpeed$()

                 FUNCTION GetCPUSpeed$()
                 DIM  STATIC  Start      AS __int64
                 DIM  STATIC  Stop       AS __int64
                 DIM  STATIC  Startticks AS __int64
                 DIM  STATIC  Stopticks  AS __int64
                 DIM  STATIC  StartOld   AS  DWORD
                 DIM  STATIC  StopOld    AS  DWORD
                 DIM  STATIC  Old        AS  BOOL
                 DIM  Buffer$

                 Old = NOT (QueryPerformanceFrequency((LARGE_INTEGER*)&Stop))

                 IF Old THEN
                     StartOld = GetTickCount()
                     WHILE GetTickCount() = StartOld
                        StopOld = StartOld + 1000
                     WEND
                 ELSE
                     QueryPerformanceCounter((LARGE_INTEGER*)&Start)
                     Stop = Stop + Start
                 END IF

                 Startticks = _rdtsc()

                 IF Old THEN
                    WHILE StopOld > StartOld
                       StartOld = GetTickCount()
                    WEND
                 ELSE
                    WHILE Stop > Start
                       QueryPerformanceCounter ((LARGE_INTEGER*)&Start)
                    WEND
                    Stopticks =  _rdtsc()
                    Stopticks =  Stopticks - Startticks
                END IF
                Buffer$ = USING$("#.#",Stopticks/1.0E9) + " Ghz"
                Function = Buffer$
                END FUNCTION

Kevin Diggins  : Added PowerBASIC aliases ACODE$ and UCODE$ to the existing BCX keywords
                 WideToAnsi$ and AnsiToWide$.  W2A$ and A2W$ are secondary aliases to
                 the WideToAnsi$ and AnsiToWide$, if you prefer.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2021/11/25       Changes in 7.7.9 from 7.7.8
*********************************************************************************************
Robert Wishlaw : FIXED formatting bug with $DEFINE statements.

Robert Wishlaw : Added the following automatic promotions to 32/64-bit compatible equivalents:
                        dwl_dlgproc            DWLP_DLGPROC
                        dwl_msgresult          DWLP_MSGRESULT
                        dwl_user               DWLP_USER
                        gcl_hbrbackground      GCLP_HBRBACKGROUND
                        gcl_hcursor            GCLP_HCURSOR
                        gcl_hicon              GCLP_HICON
                        gcl_hiconsm            GCLP_HICONSM
                        gcl_hmodule            GCLP_HMODULE
                        gcl_menuname           GCLP_MENUNAME
                        gcl_wndproc            GCLP_WNDPROC

Ian Casey      : Enhanced the BCX dialogs: GetFileName, BCX_ColorDlg, and BCX_FontDlg by
                 making their screen positioning multi-monitor aware.  This was accomplished
                 by Ian's updating of internal Use_Hook and Use_Center runtime functions.

*********************************************************************************************
2021/11/06       Changes in 7.7.8 from 7.7.7
*********************************************************************************************
Kevin Diggins  : Changed internal IsNumberEx() to detect "L" and "l" (long int and long double)

Kevin Diggins  : Robert Wishlaw pointed out that the LOF() function, which returns a LONGLONG,
                 could overflow BCX's internal circular string buffer. I changed the return
                 type of the LOF() function to return an UNSIGNED long long int. LOF was
                 changed to return ZERO, when a file length cannot be determined.

Kevin Diggins  : Changed the internal BCX function BCX_TmpStr() to accept an UNSIGNED long long
                 int as its argument.

James Fuller   : Moved internal PostProcess() -after- internal Final_Tweaks() to overcome
                 occasional 0xf bug in C++ lines containing "::"

James Fuller   : Submitted fix for C_DECLARE statements with minus signs in their names.

*********************************************************************************************
2021/09/28       Changes in 7.7.7 from 7.7.6
*********************************************************************************************
Kevin Diggins  : NOTE: BCX v777 is needed to recompile BCX v777. Alternatively, Bc.c and Bc.cpp
                 are included in the Bcx777.zip, if you prefer to bootstrap v777 yourself.

Kevin Diggins  : Changed the DATE$ function to use the hyphen separator.
                 -NOTICE-  Apps that use DATE$ -might- need to be updated.
                 This change enables BCX to match the DATE$ format used in GW-Basic,
                 QuickBasic, Turbo/PowerBasic, VBDOS->VB6, FreeBasic and others.

Kevin Diggins  : $FILL has been changed.
                 -NOTICE-  Apps that use $FILL -might- need to be updated.
                 Starting with BCX 777, the variable being $FILLed is first cleared.  The
                 original behavior required clearing the variable explicitly, such as:

                 MyVar$ = ""
                 $FILL MyVar$
                 ...
                 ...
                 $FILL

Kevin Diggins  : Fixed issue with Dllmain switch statement

Kevin Diggins  : USING$ accepts and formats long doubles. This is compiler dependent.

Kevin Diggins  : Removed more unused initialized variables.

Kevin Diggins  : Silenced several signed-unsigned comparison warnings.

Kevin Diggins  : Changed many RAW variables to STATIC, gaining a slight speed boost.

Kevin Diggins  : Added SETEOF statement to the lexicon.  Example:
                     DIM A$
                     OPEN "Temp.dat" FOR BINARY NEW AS FP1
                     A$ = SPACE$(80)
                     PUT$ FP1, A$, LEN(A$)    ' File is now 80 bytes
                     SEEK FP1, 40             ' Move to the 40th byte
                     SETEOF FP1               ' File is now 40 bytes
                     CLOSE  FP1

Kevin Diggins  : Added ISNULL() and NOTNULL() macro functions.  (BCX v777 depends on these)
                 IF ISNULL(A$)  THEN .. is an alternative to: IF A$ =  "" THEN ...
                 IF NOTNULL(A$) THEN .. is an alternative to: IF A$ <> "" THEN ...

Kevin Diggins  : Added CONWIN to the lexicon. CONWIN is a case-insensitive keyword.
                 BCX automatically transforms CONWIN to GetConsoleWindow()which is a
                 WinAPI function that returns a window handle to the active console window.
                 Now you can: CENTER(CONWIN), HIDE(CONWIN), SHOW(CONWIN), and more.

Kevin Diggins  : Added "METHOD" and "PROPERTY" to the lexicon.  These words are simply
                 transformed to "FUNCTION" and "SUB" prior to main BCX translation.  METHOD
                 and PROPERTY can only be used in a CLASS which can only be compiled
                 with a C++ compiler in C++ mode.
                 Example:

      SUB MAIN
        DIM RAW AS bcx_vector a
        a.set_x (3)
        a.set_y (4)
        PRINT "The surface of a: ", a.surface#()
      END SUB


      CLASS bcx_vector
        PROTECTED:
        DIM RAW AS DOUBLE x
        DIM RAW AS DOUBLE y
        PUBLIC:

        PROPERTY set_x (n AS DOUBLE)
           x = n
        END PROPERTY

        PROPERTY set_y (n AS DOUBLE)
           y = n
        END PROPERTY

        METHOD surface () AS DOUBLE
          DIM RAW AS DOUBLE s
          s = x * y
          IF s < 0 THEN s = -s
          METHOD = s
        END METHOD
      END CLASS

James Fuller   : Added The following keywords to support C++11 range-based FOR-NEXT loops
                 RBFOR, RBEXIT, and RBNEXT.  These require a C++11 or newer compiler.

Kevin Diggins  : Added supplemental parenthesis to several macro functions to guard against
                 problems that can sometimes result during C/C++ preprocessor macro expansion.

Kevin Diggins  : Ongoing formatting improvements to the source, output and runtime code

*********************************************************************************************
2021/08/30       Changes in 7.7.6 from 7.7.5.1
*********************************************************************************************
Robert Wishlaw : Silenced a "dangling else" warning and several "precision loss" warnings

Kevin Diggins  : Refactored IIF() and IIF$() to silence MSVC conversion warnings

Kevin Diggins  : Fixed problem reported by BCX user (Cran0g) involving SELECT CASE
                 string statements where the string argument was defined "AS STRING",
                 not defined using the $ sigil. The capability supporting this syntax
                 seems to have never been supported prior to this version of BCX.

Kevin Diggins  : 7.7.6 now allows broad use of the QUOTED QUOTE which equates to DQ$
                 The listing below demonstrates some working use cases. Please report
                 any cases where """ does not work, so that I can see if it can be
                 made to work, or to document cases where DQ$ must be used instead.
                 Internally, BCX changes """ to DQ$ before the primary translation.

                 CONST DBLQT$ = """ :  PRINT DBLQT$

                 DIM A$ :  A$ = """ :  PRINT A$

                 IF "test" = """ then
                   PRINT "EQUAL"
                 ELSE
                   PRINT "NOTEQUAL"
                 END IF

                 PRINT """, """, """

                 IF LEFT$(A$,1) = """ THEN
                   PRINT MID$(A$,1,1)
                 END IF

                 CALL PRINT_FOO(""")

                 SUB PRINT_FOO(A$)
                   PRINT A$
                 END SUB

                 PRINT FOO$()

                 FUNCTION FOO$(A$ = """, B$ = "Foo", C$ = """)
                    FUNCTION = A$ + B$ + C$
                 END FUNCTION

Kevin Diggins  : Ongoing formatting improvements to the source and runtime code

*********************************************************************************************
2021/08/25       Changes in 7.7.6 from 7.7.5
*********************************************************************************************
Kevin Diggins  : Corrected two minor MSVC warnings.

Kevin Diggins  : Re-factored the preprocessor directives - some directives were
                 being omitted when $WARNINGS was enabled.

Kevin Diggins  : Ongoing formatting improvements to the source and runtime code

*********************************************************************************************
2021/08/22       Changes in 7.7.5 from 7.7.4
*********************************************************************************************
Kevin Diggins  : Numerous bug fixes. Extensively tested.

Kevin Diggins  : # and ! sigils, broken in SUB/FUNCTIONS arguments since version 6.50, have
                 been restored. An excellent example of this is Starmap (2003) by Garvan O'Keefe
                 which now (once again) translates and compiles using Lcc-Win32 and Pelles C.

Kevin Diggins  : Added flexible line continuation options.  When using the long line
                 continuation operator (UNDERSCORE), you normally must preceed the
                 underscore with at least one space character.  This has been improved
                 by allowing lines to use the following 2-character pairs -without-
                 needing to preceed them with a space:
                           ,_     ;_     :_     )_     ]_     >_     $_

                 Example:  The following appears in an internal BCX routine:

                       SELECT CASE sWord$
                          CASE _
                          "function",_
                          "sub",_
                          "publicfunction",_
                          "publicsub",_
                          "privatefunction",_
                          "privatesub"

Kevin Diggins  : $NOMAIN is deprecated.  All variations of SUB MAIN and FUNCTION MAIN are
                 automatically detected, making $NOMAIN unnecessary but still allowed.

Kevin Diggins  : Ongoing formatting improvements to the source and runtime code

*********************************************************************************************
2021/08/17       Changes in 7.7.4 from 7.7.3
*********************************************************************************************
Robert Wishlaw : Optimized the internal SUB User_Global_Initialized_Arrays

James Fuller   : Reported an isolated formatting bug that MrBcx traced back to the internal
                 parsing of the $FILL directive.  Problem resolved by MrBcx.

James Fuller   : Reported bug with using extended strings inside a $FILL block - Fixed by MrBcx

James Fuller   : Reported a formatting bug. Fixed by MrBcx (reverted to earlier SUB BuildDelimStr)

Kevin Diggins  : Moved the following to the top of the translation, for quicker terminations.
                 #ifndef __cplusplus
                          #error A C++ compiler is required
                 #endif

Kevin Diggins  : Removed dead code from the StrToken runtime.

Kevin Diggins  : Added the (five) 32-bit GWL_* constants to the internal BCX lookup table
                 for automatic promotion to the 32/64-bit compatible equivalents.  To wit:
                      gwl_hinstance  becomes GWLP_HINSTANCE
                      gwl_hwndparent becomes GWLP_HWNDPARENT
                      gwl_id         becomes GWLP_ID
                      gwl_userdata   becomes GWLP_USERDATA
                      gwl_wndproc    becomes GWLP_WNDPROC

Kevin Diggins  : GetWindowLong and SetWindowLong are now automatically promoted to the
                 32/64-bit compatible equivalents: GetWindowLongPtr and SetWindowLongPtr,
                 making it a little easier to compile old 32-bit code to 64-bit.

Kevin Diggins  : Added BCX_CONSOLE to the lexicon.  BCX translates "BCX_CONSOLE" to
                 "hConsole" which is a global handle, used for decades by most of the
                 BCX console runtime code. BCX not only does the text translation, it
                 also emits the relevant C\C++ code that declares and initializes
                 hConsole, so you don't have to.

                 For example:
                 '*****************************************************************
                 '       Set a command prompt to full screen and back again
                 '*****************************************************************
                 SetConsoleDisplayMode (BCX_CONSOLE, CONSOLE_FULLSCREEN_MODE, NULL)
                 DELAY(3)  ' wait three seconds
                 SetConsoleDisplayMode (BCX_CONSOLE, CONSOLE_WINDOWED_MODE, NULL)
                 PAUSE

Kevin Diggins  : When using the LEN function, BCX will now emit an (int)strlen cast.
                 The BCX runtime codes were previosuly updated with the (int)strlen cast.

Kevin Diggins  : I noticed that the COM parser was enabled by default. It is now DISABLED
                 by default, resulting in slightly faster translations.  New detection
                 code enables COM parsing when needed.

Kevin Diggins  : Ongoing formatting improvements to the source and runtime code

*********************************************************************************************
2021/07/28       Changes in 7.7.3 from 7.7.2
*********************************************************************************************
                 >>>>>>>                                                      <<<<<<<
Kevin Diggins  : >>>>>>>      773 can only be re-compiled using BCX 773       <<<<<<<
                 >>>>>>>                                                      <<<<<<<
                 Changes to BCX source code include features introduced in 772 and 773.

James Fuller   : Reported not-working extended string translation.  MrBcx reverted internal
                 StripCode to earlier working version and modified it. Problem resolved.

Kevin Diggins  : Killed bug in LINE INPUT runtime where a receiving array index variable
                 would be twice incremented or (less likely) twice decremented. This bug
                 was born on 11/23/2003 in Version 4.26 and has existed ever since.
                 Statements like: LINE INPUT FP1, Buffer$[idx++], are now emitted correctly.

Kevin Diggins  : Starting with 7.7.3, BCX will colorize its screen output.  This only
                 affects BCX, not the programs that you develop with it.  To disable
                 colorization and use the traditional default system colors, simply change
                 the constant $BCX_COLORS to 0 and recompile.
                 $BCX_COLORS is currently defined on line number 9 of BC.BAS:
                 CONST $BCX_COLORS = 1     ' Colorize (or not) the BCX Translator

Kevin Diggins  : The C/C++ unsigned integer type (size_t) can now be used in localized
                 FOR-NEXT loops.  Additionally, BCX will allow automatically convert
                 any mixed-case spelling of size_t to lower case.  Below is an example:

                                   FOR SIZE_T i = 1 to 10
                                       PRINT i
                                   NEXT

Kevin Diggins  : ISFILE(sA$), ISFOLDER(sA$), ISHIDDEN(sA$), ISSYSTEM(sA$), and ISREADONLY(sA$)
                 have been added to the BCX lexicon.  These are  related to and complements
                 of the GETATTR and SETATTR funcions.  These integer functions return TRUE
                 or FALSE, depending on the result of the Windows file-system related query.

                 All 5 functions are self-contained and should not interfere with, nor be
                 interferred by, unrelated invocations of FINDFIRST$ or FINDNEXT$.  Each
                 function uses the FindFirstFile API function, so one could include wildcards
                 but doing so will likely result in unwanted results. DON'T USE WILDCARDS.
                 Pass only unique file or folder name strings to these functions.

Kevin Diggins  : Added new directive: $DEFINE
                 You can $DEFINE symbols, equates, and simple macros.  Valid Examples:

                 $DEFINE SquareMe(a) = (a)*(a)
                 $DEFINE foo = 0
                 $DEFINE bar = foo
                 $DEFINE foobar

                 $DEFINE statements can appear multiple times, anywhere you want them.
                 $DEFINE is similar to CONST with one very important difference -
                 BCX emits these statements BEFORE the header files in the output file.

Kevin Diggins  : Added new directive: $WARNINGS
                 BCX typically emits a number of #pragma statements disabling warnings
                 for several compilers.  $WARNINGS prevents the emission of those #pragma
                 directives, thus freeing your compiler(s) to issue their warnings, according
                 to the compiler warning level that you set for your compiler(s).  The
                 existing BCX switch -w will also activate the $WARNINGS flag, in addition
                 to activating BCX BASIC translation warnings.

Kevin Diggins  : Added BCX_SETCLIENTSIZE(HWND, iWidth, iHeight, ScaleWidth!=1, ScaleHeight!=1)
                 Primarily intended for parent forms and dialogs, BCX_SETCLIENTSIZE sets
                 the bounding rectangle based on the desired size of the client area. One
                 way to understand what this means is to think about a painting.  The canvas
                 size determines the frame size and not the other way around.

                 iWidth and iHeight are always treated as PIXELS. BCX can scale PIXELS
                 to dialog units, if you specify BCX_SCALEX and BCX_SCALEY for the optional
                 ScaleWidth! and ScaleHeight arguments. However, that will only work if you
                 use the BCX GUI framework without specifying PIXELS.  For Example:

                 GUI "MKApp"   ' Notice that PIXELS is not specified here
                 SUB FORMLOAD
                 Form1 = BCX_FORM  ( "My Killer App" )
                 BCX_SETCLIENTSIZE ( Form1, 150, 100, BCX_ScaleX, BCX_ScaleY )

Kevin Diggins  : Added BCX_RESIZE statement - Usage: BCX_RESIZE (hWnd, iNewWidth, iNewHeight)
                 Mainly intended to easily resize child control windows but can be
                 used to resize parent windows and dialogs also.  Only three arguments:
                 the HWND of the control, the new width and new height, specified in PIXELS.

Kevin Diggins  : Added PUSHCOLORS and POPCOLORS for console mode FG and BG colors.
                 These functions DO NOT operate on a stack - there is only storage for
                 one color value PAIR, i.e, one foreground and one background color.
                 Example 1:  PUSHCOLORS       Example 2: POPCOLORS

Kevin Diggins  : Added BCX_PUSHCONSOLESIZE, BCX_SETCONSOLESIZE(X,Y),and BCX_POPCONSOLESIZE.
                 These functions DO NOT operate on a stack - there is only storage for
                 one coordinate value PAIR, i.e, one X (columns) and one Y (Rows).
                 Usage: BCX_PUSHCONSOLESIZE      ' Saves the current console X,Y size
                 Usage: BCX_POPCONSOLESIZE       ' Restores the last saved console X,Y size
                 Usage: BCX_SETCONSOLESIZE (X,Y) ' Change console X,Y for the current window.
                 NOTE: Programmers tend to spend more time in a command prompt than most.
                 Microsoft Windows allows you to set custom command prompt (CONSOLE) window
                 sizes.  I routinely have my default set to 120 columns by 43 rows.  However,
                 I have console APPS that expect 80 columns by 25 rows.  That's where these
                 new functions come in handy.  Calling BCX_PUSHCONSOLESIZE at the beginning
                 of a console app and BCX_POPCONSOLESIZE when that app exits can restore
                 the console window to its original dimensions.  BCX_SETCONSOLESIZE is used
                 to change a console window to a desired size.
                 Below is a simple demonstration.
                 IMPORTANT:  One must start this demo from an already-opened command
                             prompt window, to get the full benefit of the demo.

                 SUB MAIN
                   BCX_PUSHCONSOLESIZE         ' Save a copy of the command prompt window size
                   BCX_SETCONSOLESIZE (40,10)  ' Set a custom size
                   PAUSE                       ' Observe the new (smaller) size
                   BCX_POPCONSOLESIZE          ' Restore the original size
                 END SUB

Kevin Diggins  : COLOR statement enhancement.  Specifying a background color of -1
                 will now instruct the COLOR statement to use the most recent, previously
                 set background color.

Kevin Diggins  : Added MEMSIZE as an alias to the CRT function _msize. MEMSIZE is a case
                 insensitive keyword that takes a DYNAMICALLY DIMENSIONED variable
                 (that is, memory allocated using malloc, calloc, or realloc) and returns
                 its current memory allocation.  See NEXTLINELEN below for an example
                 that uses MEMSIZE.

Kevin Diggins  : Added LONGESTLINE(szFileName$).  Returns the length of the longest line
                 in any text file, where each line of text is terminated with a CRLF.  If
                 the file does not exist or cannot be opened for reading, the function will
                 return zero.  The sample below will display the line(s) that equal the
                 the length of the longest line in the file.

                 DIM LL, A$
                 LL = LONGESTLINE("bc.bas")
                 OPEN "Bc.bas" FOR INPUT AS 1
                 WHILE NOT EOF(1)
                    LINE INPUT 1, A$
                    IF LEN(A$) = LL THEN PRINT A$
                 WEND
                 CLOSE

Kevin Diggins  : Added NEXTLINELEN(FILE PTR).  Returns the length of the next line
                 to be read from a CURRENTLY OPEN TEXT FILE, where each line of text
                 is terminated with a CRLF.  This provides an opportunity to REDIM
                 a receiving string variable BEFORE executing a LINE INPUT command,
                 helping to prevent buffer overruns. Below is an example of its
                 usefulness:

                 FUNCTION Fetchline ( FP AS FILE, BYREF MyBuf$ ) AS UINT
                    DIM LineLen AS UINT
                    '========================== Query the next line length.
                    LineLen = NEXTLINELEN (FP)  '<- Our new file function
                    '========================== REDIM MyBuf$ only when needed.
                    IF MEMSIZE (MyBuf$) < LineLen THEN REDIM MyBuf$ * LineLen
                    LINE INPUT FP, MyBuf$
                    FUNCTION = LineLen
                 END FUNCTION

Kevin Diggins  : Updated the user interface of the -s (translation status) command line
                 switch.  This was designed to be a debugging tool 20 years ago before BCX
                 acquired a more robust error condition reporting system. I've slowed down
                 the speed of the display and added the emission of the current line of code
                 to the interface.  I've also added a "Press any key to cancel" feature to it,
                 along with a splash of color.

Kevin Diggins  : Ongoing formatting improvements to the source and runtime code

*********************************************************************************************
2021/06/23       Changes in 7.7.2 from 7.7.1
*********************************************************************************************
Robert Wishlaw : Improved VALL for LDOUBLES on Mingw compilers.

Robert Wishlaw : Improved the STRL$ function, standardizing it with the STR$ function.

Robert Wishlaw : Reported Dllmain definition substitution bug.  Fixed by MrBcx.

Kevin Diggins  : We can now include quoted string literal initializations that are DIM'd
                 inside of SUBs and FUNCTIONs.  This will not work for GLOBAL strings.
                 It will not work for dynamic strings that are created using any
                 of the  memory allocation functions: malloc/calloc/realloc. String
                 functions and concatentations are NOT allowed -- only plain quoted
                 string LITERALS will work, like in the examples below:

                 Example 1:  DIM A$     = "This is handy!"
                 Example 2:  DIM RAW A$ = "This is too!"
                 Example 3:  LOCAL A$   = "This also works!"

                 BCX translates:  DIM A$ = "This is handy"
                 to:              char A[BCXSTRSIZE]; strcpy(A,"This is handy");

Kevin Diggins  : Added $CASE_ON and $CASE_OFF directives. This is a BCX innovation.

                 $CASE_ON restores case-sensitivity when performing string comparisons.
                 This is the DEFAULT BEHAVIOR of all BASIC language dialects.

                 $CASE_OFF changes the default behavior to CASE-INSENSITIVE until BCX
                 encounters a $CASE_ON statement which restores the default behavior.

                 Example:

                 IF "dog" = "DoG" THEN PRINT "Dogs Are equal" ELSE PRINT "Dogs Are Not equal"

                 $CASE_OFF  ' Turn off case-sensitivity when comparing strings
                 IF "dog" = "DoG" THEN PRINT "Dogs Are equal" ELSE PRINT "Dogs Are Not equal"

                 $CASE_ON   ' Turn on case-sensitivity when comparing strings
                 IF "dog" = "DoG" THEN PRINT "Dogs Are equal" ELSE PRINT "Dogs Are Not equal"

                 OUTPUT:
                 Dogs Are Not equal
                 Dogs Are equal
                 Dogs Are Not equal

Kevin Diggins  : FUNCTIONS and SUBS declaring OPTIONAL ARGUMENTS are no longer required
                 to use the BCX keyword "OPTIONAL" in the declaration.  BCX 772 detects
                 FUNCTIONS and SUBS with optional arguments automatically. The keyword
                 "OPTIONAL" is still valid and can still be used, if you so desire.

                 Syntax 1: FUNCTION MyFunc OPTIONAL (a = 1, b = 2, c = 3)
                 Syntax 2: FUNCTION MyFunc          (a = 1, b = 2, c = 3)

Kevin Diggins  : COLOR statement's 2nd argument now has a default value of 0 (BLACK)
                 Syntax 1: COLOR 4      ' RED text on BLACK background
                 Syntax 2: COLOR 2,7    ' GREEN text on RED background

Kevin Diggins  : Modified ISTRUE, ISFALSE, ISZERO, NOTZERO macros.
                 These updated macros now allow non-parenthesized usage.
                 Example 1:  IF ISZERO (MyFlag) THEN PRINT "MyFlag equals zero."
                 Example 2:  IF ISZERO  MyFlag  THEN PRINT "MyFlag equals zero."

Kevin Diggins  : The output C/C++ file will now retain the same filename spelling
                 case as the source file.  For example, given GetLongestLineInFile.Bas
                 BCX will produce GetLongestLineInFile.c ( or .cpp )

Kevin Diggins  : Added these function calls to the BCX_GUI startup and shutdown processes:
                 OleInitialize()  OleUninitialize() CoInitialize()  CoUninitialize()

Kevin Diggins  : Added automatic casting of 1st argument to BCX_DIALOG/BCX_MDIALOG statements.

Kevin Diggins  : Added <exdisp.h> and <iehelper.h> to LccWin32's conditional #includes

Kevin Diggins  : Added _ltoa equate to LccWin32's conditionals

Kevin Diggins  : Removed unneeded Open Watcom V2 equates (they now exist in complex.h)

Kevin Diggins  : BCX code maintenance. Improved the "User Defined Constants" naming
                 and ordering seen in Bc.c and Bc.cpp.  More cosmetic changes to COM
                 output and -numerous- other source and output refactorings.

*********************************************************************************************
2021/05/26       Changes in 7.7.1 from 7.7.0
*********************************************************************************************
Kevin Diggins  : Added a CPAD$ function to complement RPAD$() and LPAD$().
                 Syntax: MyStr$ = CPAD$(MainStr$, MaxLength% [,OptionalFillChar%])
                 Returns a copy of string expression CENTERED in a string padded with spaces
                 or any other OptionalFillChar the programmer may specify.
                 The length of the returned string won't exceed the specified integer parameter.
                 Example:
                 DIM A$,B$
                 FOR INT i = 65 TO 95 ' ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
                    A$ = A$ + CHR$(i)
                    B$ = CPAD$(A$,26) ' Truncate everything after the letter 'Z'
                    PRINT B$
                 NEXT

Kevin Diggins  : Repaired CLIPBOARD_GETTEXT runtime.

Kevin Diggins  : Added missing CLIPBOARD functions to $PROJECT support

Kevin Diggins  : Added additional test in CLIPBOARD_GETTEXTSIZE runtime code

Kevin Diggins  : Suppress Pelles C warning #2804: 'Consider changing type to size_t'

Robert Wishlaw : Corrected definition of ATANL to long double.

*********************************************************************************************
2021/05/07       Changes in 7.7.0 from 7.6.9
*********************************************************************************************
James Fuller   : Reported outdated copyright dates -- Fixed by MrBcx

Don Baldwin    : Reported bug with INPUT statement -- Fixed by MrBcx ("replace" rt was missing)

*********************************************************************************************
2021/05/07       Changes in 7.6.9 from 7.6.8
*********************************************************************************************
Kevin Diggins  : Fixed bug involving $CPP + $PP + Lcc/Pelles directive suppression.

James Fuller   : Reported bug with Lcc/Pelles directive suppression when using $CPP

Robert Wishlaw : Added missing dependency resulting from recent SPLIT/DSPLIT enhancement.

*********************************************************************************************
2021/05/06       Changes in 7.6.8 from 7.6.7
*********************************************************************************************
Robert Wishlaw : Enhanced the SPLIT and DSPLIT functions. The enhancements and updated sample
                 will be explained in the forthcoming updated BCX Help file by Robert Wishlaw.

*********************************************************************************************
2021/05/06       Changes in 7.6.7 from 7.6.6
*********************************************************************************************
Robert Wishlaw : Corrected INS prototype typo

Kevin Diggins  : Updated itoa to _itoa, getch to _getch, stricmp to _stricmp

Kevin Diggins  : Reverted 14 strings variables from "const char" to "static char"

Kevin Diggins  : Added Clipboard_SetBitmap (HBITMAP) and Clipboard_GetBitmap().
                 EXAMPLE:
                 DIM MyBmp AS HBITMAP
                 MyBmp = BCX_LOADIMAGE("test1.bmp" )
                 Clipboard_SetBitmap ( MyBmp )
                 SAVEBMP (Clipboard_GetBitmap,"test2.bmp")

James Fuller   : Suppress Pelles and LccWin32 directives when CPP is invoked

*********************************************************************************************
2021/04/17       Changes in 7.6.6 from 7.6.5
*********************************************************************************************
Robert Wishlaw : Requested the -c cmdline switch changed to -cpp.  Completed by MrBcx
                 NOTE: -c will remain backwardly compatible but can be considered deprecated.

Robert Wishlaw : Reported bug with BCX error line reporting  - Fixed by MrBcx

Ian Casey      : Added casts to BCOPY emission (memmove) in support of unicode (wmemmove).

James Fuller   : Reported bug parsing QSORT SENSITIVE option - Fixed by MrBcx

Kevin Diggins  : Added #define _stricmp  stricmp to overcome Lcc-Win32 warning.

Kevin Diggins  : Added new keywords:
                 CLIPBOARD_RESET, CLIPBOARD_GETTEXTSIZE,
                 CLIPBOARD_GETTEXT$ & CLIPBOARD_SETTEXT(Text$)

Kevin Diggins  : Added CAST macro and keyword to BCX. (See HELP for explanation and sample)

*********************************************************************************************
2021/02/27       Changes in 7.6.5 from 7.6.4
*********************************************************************************************
Robert Wishlaw : Added GWLP_ID for 32/64 compatibility.

Robert Wishlaw : Reported bug with arguments containing "<>" and "!=" -- Fixed by MrBcx

Robert Wishlaw : Reported bug with BASIC statements containing &&     -- Fixed by MrBcx

*********************************************************************************************
2021/02/09       Changes in 7.6.4 from 7.6.3
*********************************************************************************************
Kevin Diggins  : Bug fix impacting normal string conditionals ( see: SUB EmitIfCond )

Kevin Diggins  : Reverted RND() function to 7.3.1 ( thus preserving user-specified seed )

Robert Wishlaw : BCX runtime VerifyInstr updated for MSVC and CLANG

Robert Wishlaw : Updated (UINT) casts to (UINT_PTR) throughout BCX for 32/64 compatibility

James Fuller   : Updated STR$ function to be compatible with UNICODE usage.

*********************************************************************************************
2021/01/18       Changes in 7.63 from 7.6.2
*********************************************************************************************
Robert Wishlaw : Added CASE SENSITIVITY to BCX's built-in QSORT string sorts

Kevin Diggins  : Updated HEX2DEC function to return 64-bit unsigned long long
                 PRINT USING$("###,###,###,###,###,###,###",HEX2DEC("FFFFFFFFFFFFFFFF"))
                 RESULT:        18,446,744,073,709,551,616

Kevin Diggins  : Minor change to tolerate unneeded, parenthesised "CLOSE" command arguments

Kevin Diggins  : Added missing #define _strnicmp  strnicmp for Lcc-Win32

James Fuller   : Reported superfluous "return 0;" in tmain.  Fixed by Kevin Diggins

Robert Wishlaw : Extended ISPTR() to 64-bit cast, thus eliminating VC64 warnings.

*********************************************************************************************
2020/11/23       Changes in 7.62 from 7.6.1
*********************************************************************************************
Kevin Diggins  : Force DllMain to always emit __declspec(dllexport) BOOL WINAPI DllMain

Kevin Diggins  : Upper and Lower Case Table setup improvements in DllMain

James Fuller   : BCX_DIALOG and BCX_MDIALOG procs now return INT_PTR, per MS docs


*********************************************************************************************
2020/11/02       Changes in 7.6.1 from 7.6.0
*********************************************************************************************
Kevin Diggins  : Removed unneeded "Olepro32.lib" emission - was causing 64-bit compile errors.

Kevin Diggins  : Removed outdated BCXPP.EXE handler

Kevin Diggins  : Corrected XFOR formatting issue

Kevin Diggins  : Changed: $REMS directive only outputs comments contained in SUBS & FUNCTIONS

Kevin Diggins  : Removed internal SUB DeleteTokens() and replaced calls with LShftStk()

James Fuller   : Changed: AnsiToWide ( LPCTSTR ... to:  AnsiToWide ( LPCSTR ...

James Fuller   : Two cast changes to BCX_TOOLTIP, in support of 64-bit compilations.

James Fuller   : Changed BCX_OLEPICTURE vars from INT to DWORD for Mingw and Clang

*********************************************************************************************
2020/10/16       Changes in 7.6.0 from 7.5.9
*********************************************************************************************
Kevin Diggins  : Corrected and refactored the ASC() function, following bug report by JCFuller

Robert Wishlaw : Corrected bug involving the $NOLIBRARY directive

Joe Caverly    : Added the following pragmas to the GCC/Clang section:
                   #pragma GCC diagnostic ignored "-Wunused-parameter"
                   #pragma GCC diagnostic ignored "-Wunknown-pragmas"

Kevin Diggins  : Ongoing formatting improvements to BCX source and its output

*********************************************************************************************
2020/10/11      Changes in 7.5.9 from 7.5.8
*********************************************************************************************
Kevin Diggins : Re-uploaded 759 after James Fuller reported issue with RTF data using $FILL

Kevin Diggins : Added $FILL directive tp provide MyStr$ += [string expresssion] functionality
                $FILL appends the list of string expressions to the supplied string variable.
                If you want $FILL to start with an empty string, you must first clear it.
                Programmers need to adequately dimension the receiving variable.
                $FILL tolerates blank lines and lines that start with REM and the comment symbol (')
                You may use $FILL in any context where MyStr$ = MyStr + [string expression] would
                be valid, in both LOCAL and GLOBAL contexts of your programs.  $FILL simply performs
                a "search and replace" at translation time when it encounters its usage.  $FILL has
                been test with simple strings ( MyStr$ ), multi-dimensional arrays ( MyStr$[x,x,x] )
                and with string members of TYPE structures ( Addressbook.FirstName$ )
                $FILL SomeValidStringVariableName
                  [string expresssion]
                  [string expresssion]
                  [string expresssion]
                $FILL

Kevin Diggins : Enhancement: simple string variables without "$" can now be used in "IF" statements.
                This enhancement was only tested for strings declared AS CHAR or AS STRING.
                String arrays ( IF Books$[5] = "1984" THEN ... ) still need a $ sign on them.

James Fuller  : Added section:  #if defined (__GNUC__) || defined (__clang__) ...

Kevin Diggins : Reverted test in SUB AddMacros to 757, so DefaultFont #define would emit.

*********************************************************************************************
2020/10/06      Changes in 7.5.8 from 7.5.7
*********************************************************************************************
Kevin Diggins : Added $BCXSTRSIZE directive, enabling programmers to change the default 2048
                byte string allocation to something larger or smaller.  Too large, and your
                program will waste memory, too small and your program may suddenly crash.
                By way of example, BCX can successfully compile itself using a directive of
                $BCXSTRSIZE 768 but will fail with a directive of $BCXSTRSIZE 512.
                ( I am keeping BCX at the 2048 default because I see no need to change it. )

Kevin Diggins : Improved the internal code that inserts the enclosing parenthesis for
                SHOW(), HIDE(), CENTER(), SLEEP() and RANDOMIZE()

Kevin Diggins : Improved efficiency of SUB Make_Stricmp_Map

Kevin Diggins : Converted numerous string comparisons to pointer comparisons to speed things
                up a bit. Each one eliminates a function call and a string comparison.

James Fuller  : Added inttypes.h to standard includes, to overcome issues with GCC compiler.

*********************************************************************************************
2020/10/03      Changes in 7.5.7 from 7.5.6
*********************************************************************************************
Kevin Diggins : New : Created the ?? STRING operator for use in IF-THEN and DO/WHILE/UNTIL/LOOP's
                ?? is used to perform correct, locale-aware, case-insensitive STRING comparisons.
                When you see ??, say to yourself, "EQUALS BUT IGNORING UPPER AND LOWER CASE"

                The ?? operator instructs BCX to emit the unique bcx_stricmp instead of strcmp.
                Like using the "=" sign, you may also include the operators <, >, <>, and "NOT"

                NOTE:  You may liberally use whitespace between the symbols: ? < > !

                Here are simple examples showing usage:

                IF "BCX"    ??  "bcx" THEN PRINT "Success" ELSE PRINT "Fail"     ' Success
                IF "BCX"   >??  "bc"  THEN PRINT "Success" ELSE PRINT "Fail"     ' Success
                IF "BCX"   ??>  "bc"  THEN PRINT "Success" ELSE PRINT "Fail"     ' Success
                IF "BCX"   <??  "bc"  THEN PRINT "Success" ELSE PRINT "Fail"     ' Fail
                IF "BCX"   ??<  "bc"  THEN PRINT "Success" ELSE PRINT "Fail"     ' Fail
                IF "BCX"  <??>  "bc"  THEN PRINT "Success" ELSE PRINT "Fail"     ' Success
                IF "BCX"   !??  "bc"  THEN PRINT "Success" ELSE PRINT "Fail"     ' Success
                IF "BCX"   ??!  "bc"  THEN PRINT "Success" ELSE PRINT "Fail"     ' Success
                IF "BCX" NOT ?? "bc"  THEN PRINT "Success" ELSE PRINT "Fail"     ' Success


                Here is another working example:

                DIM A$, i                 ' A
                i = 65                    ' AB
                WHILE A$ !?? "AbCdEf"     ' ABC
                   A$ = A$ + CHR$(i++)    ' ABCD
                   ? A$                   ' ABCDE
                WEND                      ' ABCDEF

                And one more example:

                DIM i, A$, B$
                B$ = "AAAAA"
                DO UNTIL A$ > ?? B$   ' until A$ is greater than or equal to B$
                     A$ = A$ + "A"
                LOOP
                PRINT A$              ' AAAAAA


Kevin Diggins : New:  Added bcx_stricmp to support various BCX runtime functions.
                Correctly performs locale-aware, case-insensitive string comparisons.

Robert Wishlaw: New: Added BCX_STRICMP () function to the BCX keywords

Kevin Diggins : New: Added ICOMPARE() function to the BCX keywords.  ICOMPARE() is
                identical in function as BCX_STRICMP() but with a friendly name.

Kevin Diggins : Simplified "OR" and "AND" duality (Boolean/bitwise) to two (1999) BCX rules:
                1) OR/AND inside any IF or $IF statement is ALWAYS treated as Boolean
                2) OR/AND outside any IF or $IF are ALWAYS treated as bitwise.

                You can use ORELSE / ANDALSO when you absolutely need a Boolean comparison.
                ORELSE / ANDALSO are -ALWAYS- treated as Boolean operations.

                These changes -might- break some existing code but I believe mostly it won't.
                My goal is that these changes / rules will deliver a consistent treatment of
                "OR"/"AND" without needing multiple code blocks for handling special situations
                which previously was unreliable.

Kevin Diggins : Removed ORELSE, ANDALSO, BOR, and BAND macros.  The appropriate c/c++ operators
                are emitted inline, eliminating the need for the macros and producing less
                cluttered code.  The keywords below are permanently and completely useful:
                ORELSE, ANDALSO, BOR, and BAND

Robert Wishlaw: Recommended that BCX's 14 named string constants be made true constants.  FIXED.

Kevin Diggins : Changed CPP_FARPROC from LONG to UINT_PTR (MS advice for 32 & 64 bit DLL's)

Kevin Diggins : SHOW(), HIDE(), CENTER(), SLEEP() and RANDOMIZE() no longer REQUIRE enclosing
                parenthesis for their arguments.  BCX will insert them, if missing.

Kevin Diggins : Improved KILL command -- String expressions need not be wrapped in parenthesis.
                Ex:  KILL "foo" + UCASE$("bar") + ".ext"                        ... results in:
                     DeleteFile (join(3,"foo",ucase("bar"),".ext"));

Kevin Diggins : New: Added internal SUB LShiftStk() SUB RShiftStk() and SUB InsertOptionalParens()
                These enable me to more easily make enclosing parenthesis optional on more
                statements.  Optional parenthesis already exist for many but not all BCX statements.
                This convenience only works for built-in STATEMENTS, not for built-in FUNCTIONS.

Kevin Diggins : Ongoing internal maintenance

*********************************************************************************************
2020/09/24      Changes in 7.5.6 from 7.5.5
*********************************************************************************************
James Fuller  : New: BCX Version (-v) command line switch added.

Robert Wishlaw: Conditional OR was emitting bitwise OR instead of binary OR - FIXED!

Kevin Diggins : Ongoing changes for improving C/C++ code output.

*********************************************************************************************
2020/09/19      Changes in 7.5.5 from 7.5.4
*********************************************************************************************
Kevin Diggins : Removed $TURBO: multi-core computers make using $TURBO unnecessary.

Kevin Diggins : New: Added WRAP$ and UNWRAP$ functions  (typical BCX string rules apply)
                Syntax:  s$ =   WRAP$ (StringExpression [,LeftSide$] [,RightSide$])
                Syntax:  s$ = UNWRAP$ (StringExpression [,LeftSide$] [,RightSide$])
                By omitting both LeftSide$ and RightSide$,  WRAP$ and UNWRAP$ will wrap
                and unwrap StringExpression using the double quote character.

                PRINT WRAP$   ( "hello", "<", "\>" )    ... Output: <hello/>
                PRINT WRAP$   ( "hello")                ... Output: "hello"  (similar to ENC$)
                PRINT UNWRAP$ ( "<hello\>", "<", "\>" ) ... Output:  hello
                PRINT UNWRAP$ (WRAP$("hello"))          ... Output:  hello

Kevin Diggins : Bug Fix: RECORD statement was omitting SEEK_SET during code generation.

Kevin Diggins : Bug Fix: COM and UNCOM are now case-insensitive

Kevin Diggins : NOTICE:  Much reworking of the COM output code to shorten the verbose labels
                and their effect on code output. All existing built-in COM keywords remain
                unchanged and therefore -should not- break anyone's COM code.  But if you
                find a bug, please report it. The goal of these changes is to emit compact
                COM code that is easier to read, understand, and maintain ( ... for as long
                as Microsoft keeps scripting included a part of Windows.)

Kevin Diggins : Added #define for LccWin32's missing _fseeki64

Kevin Diggins : Misc ongoing changes to improve code output.

*********************************************************************************************
2020/09/04      Changes in 7.5.4 from 7.5.3
*********************************************************************************************
Kevin Diggins : Refactored SEEK to use _fseeki64 for all 32 & 64 bit (LFS) SEEK operations.
                MS-Windows SetFilePointerEx was not working correctly, hence the revision.

Kevin Diggins : Refactored LOF runtime function -- functions correctly with open files.

Robert & Kevin: Refactored LINE INPUT (keyboard) to allow using static and dynamic strings
                The new process protects against overrunning your variable's memory.

Kevin Diggins : Refactored the INPUT keyboard routine to use my new KBinput runtime function,
                resulting in less code. Backwardly compatible (no user-code changes needed)

Robert Wishlaw: Found bug inpacting "unsigned long long" formatting within the internal
                PrintWriteFormat$ function.  --FIXED--

Kevin Diggins : Updated DISKFREE, DISKUSED, and DISKSIZE function return types to ULONGLONG

Kevin Diggins : Miscellaneous small improvements (renamings, formattings, etc)

*********************************************************************************************
2020/08/18      Changes in 7.5.3 from 7.5.2
*********************************************************************************************
Kevin Diggins : If you want to make changes to BCX 7.5.3, you will need to use the 7.5.3
                executable the first time that you re-compile BCX because 7.5.3 uses the
                new ISTRUE, ISFALSE, ISZERO, and NOTZERO macros mentioned below.

Kevin Diggins : Removed all BCXRT.LIB related support. This makes maintaining BCX easier,
                it removes over 1,600 lines of code from BCX, and it gives BCX a slight
                speed improvement.

Kevin Diggins : New: Added DATACOUNT function.  DATACOUNT returns the number of LOCAL DATA
                items that can be read using the related DATA READ$ function. And like the
                READ$ function, DATACOUNT is one-based.  DATACOUNT can only return the number
                of DATA items in SUBS and FUNCTIONS, including functions MAIN and WINMAIN.
                EXAMPLE:

                CALL Data_Foo

                SUB Data_Foo
                   PRINT "There are", DATACOUNT, " data items in this SUB"
                   FOR INT i = 1 TO DATACOUNT
                      PRINT READ$(i)
                   NEXT
                   DATA one, two, three, four, five
                END SUB

Kevin Diggins : These 3 functions return the same values reported by MS Explorer|Properties
Kevin Diggins : New: Added DISKFREE function ("c:") - Returns an unsigned 64-bit integer
Kevin Diggins : New: Added DISKUSED function ("c:") - Returns an unsigned 64-bit integer
Kevin Diggins : New: Added DISKSIZE function ("c:") - Returns an unsigned 64-bit integer

Kevin Diggins : New: Added ISTRUE(),ISFALSE(), ISZERO() and NOTZERO() macros
                These can help improve the meaning of expressions.  Example:
                IF *pMyString THEN DoSomething()            ' There is perfectly legitimate.
                IF NOTZERO (*pMyString) THEN DoSomething()  ' But this is more explicit.
                '-----------------------------------------------
                '                  TRUE TABLE
                '-----------------------------------------------
                '  TEST    Expression   Result     Synonym
                '-----------------------------------------------
                ' ISTRUE      =  0        0        NOTZERO
                ' ISTRUE      <> 0        1        NOTZERO
                ' ISFALSE     =  0        1        ISZERO
                ' ISFALSE     <> 0        0        ISZERO

Kevin Diggins : Re-ordered Bc.bas internal code for easier maintenance - (no effect on users)

*********************************************************************************************
2020/08/05    : Changes in 7.5.2 from 7.5.1
*********************************************************************************************
Kevin Diggins : New: Added MKPATH command.  It can create a multi-level disk path all at once.
                If any part of the path already exists, MKPATH will add the remaining parts.
                Example 1: MKPATH ("C:\Apples\Oranges\Bananas\Grapes") ' Build path in the root
                Example 2: MKPATH ("\Apples\Oranges\Bananas\Grapes")   ' build path in the cwd

Kevin Diggins : New: The LOF function was rewritten to support large files when used in your
                32-bit and 64-bit executables.  LOF() now returns a 64-bit unsigned integer
                with a range of 0 to 18,446,744,073,709,551,615 bytes (2^63 - 1) which should
                be enough to handle most file size requirements.

Kevin Diggins : New: A new SEEK function was added to support large files.  Previous versions
                of BCX used the "C" library function fseek.  The new SEEK function uses the
                same data types and syntax as before, so no changes to your code are needed.
                (Note:  The RECCOUNT command still uses fseek and has not been upgraded.)

Kevin Diggins : New: "RECORD" command now emits code that supports large files: uses new SEEK()

Kevin Diggins : New: ISOBJECT (oVar) COM function and keyword.  Like BCX_GET_COM_STATUS, except
                where BCX_GET_COM_STATUS takes a POINTER to an object, ISOBJECT takes an object
                as its argument. ISOBJECT is a commonly used PowerBasic keyword.

                ISOBJECT returns TRUE OR FALSE, depending on whether a valid object exists.

                Example:
                GLOBAL WordApp AS Object
                SET WordApp = CreateObject("Word.Application")
                PRINT ISOBJECT (WordApp)   ' PRINTS "1" (if you have MS Word installed)

                SET WordApp = NOTHING
                SET WordApp = CreateObject("Werd.Application")
                PRINT ISOBJECT (WordApp)    'PRINTS "0" because "Word." is misspelled.
                SET WordApp = NOTHING

Kevin Diggins : New: COM and UNCOM keywords.  Example:
               '********************************************************************
                DIM oVoice AS OBJECT
                oVoice = COM ("SAPI.SpVoice")
                IF ISOBJECT(oVoice) THEN oVoice.Speak "Hello from BCX"
                UNCOM (oVoice)
               '********************************************************************
               ' The 4 lines above, using the new COM and UNCOM functions, produce
               ' the same results as the 4 lines of code shown below.  The difference
               ' being that the new COM and UNCOM seem more intuitive, are quicker to
               ' type, and easier to remember.  The code (below) is still 100% valid.
               '********************************************************************
                DIM oVoice AS OBJECT
                SET oVoice = CreateObject ("SAPI.SpVoice")
                IF BCX_GET_COM_STATUS (&oVoice) THEN oVoice.Speak "Hello from BCX"
                SET oVoice = NOTHING
               '*************************************************************

Kevin Diggins : New: READ$() keyword for reading individual strings in DATA statements
                READ$() is 1-based .. meaning READ$(2) will return "oranges" from a
                DATA statement like: DATA  "apples", "oranges", "pears"

Kevin Diggins : New: RND2(lower,upper) - Returns a signed integer ranging from lower to upper
                Example: PRINT RND2 (-10, 10)

Kevin Diggins : New: ? operator, when used in a GUI app, is converted to a MSGBOX statement.
                Everything to the right of ? MUST evaluate to a single string expression.
                ?, with nothing else, is allowed and emits a MSGBOX with only an OKAY button.
                Example: ? "Today is " + DATE$ + " and the time is " + TIME$

Kevin Diggins : Ongoing improvements to the c\c++ output file formatting

*********************************************************************************************
2020/07/24    : Changes in 7.5.1 from 7.5.0
*********************************************************************************************
Kevin Diggins : Converted 300+ lines of code from using "char *" in function & sub arguments
                to "LPCTSTR".  This inherently leads to safer code and should make it a
                bit easier to work with Unicode and C++ constructions.  These changes have
                been tested against the console, gui, and dll demos, and several large programs.
                If you encounter errors where "char *" is used instead of "LPCTSTR", please
                submit a bug report on the forum, so that it can be fixed.
Kevin Diggins : Killed the "EE" bug reported in forum msg "EEeeK! I discovered a bug!"
                This involved rewriting the internal FUNCTION IsNumberEx(Arg$)
Kevin Diggins : Renamed a number of local variables and function argument names within BCX's
                runtime library to silence common shadowing warnings.
                
*********************************************************************************************
2020/07/11    : Changes in 7.5.0 from 7.4.9
*********************************************************************************************
Kevin Diggins : MAJOR CHANGE: $PP changed to use STDCALL making it easier to create BCXPP.DLL
                with the various compilers & linkers. Contrary to some information found on
                Microsoft.com, exported STDCALL FUNCTIONS and SUBS do NOT get created with a
                leading underscore character, and therefore your existing BCXPP.DLL needs to
                be re-compiled using the template below.  Nowhere is the importance of the
                leading underscore character more obvious than in this current BCX statement:
                ..... GetProcAddress (PPDLL_HANDLE,"ProcessLine")        BCX 750 and future
                Earlier versions of BCX specified "_ProcessLine"         BCX 749 and earlier

                $DLL STDCALL
                FUNCTION ProcessLine (Src$) AS LONG EXPORT
                  IF Src$ = "DISPLAY MESSAGE" THEN Src$ = "PRINT " + ENC$("MAGIC HAPPENS!")
                  FUNCTION = 1
                END FUNCTION

Kevin Diggins : Refactored LIKE function to silence warnings in Pelles and CLANG

Kevin Diggins : Changed BCX_TmpStr(size_t) to BCX_TmpStr(unsigned int) allowing me to remove
                casts to strlen calls previously used to suppress warnings.  The casts are
                no longer needed and the warnings have been silenced.
Kevin Diggins : Changed (HMENU) to (HMENU)(UINT_PTR) casts in GUI runtimes to silence CLANG

Kevin Diggins : Ongoing improvements to the c\c++ output file formatting

*********************************************************************************************
2020/07/10    : Changes in 7.4.9 from 7.4.8
*********************************************************************************************
Kevin Diggins : Changed CHR$ arguments to unsigned char to overcome conversion warnings

*********************************************************************************************

2020/07/09    : Changes in 7.4.8 from 7.4.7
*********************************************************************************************
Kevin Diggins : Removed (all?) shadowed variables by renaming MANY local and global variables.
Kevin Diggins : Corrected the most serious warnings reported by various compilers.
Kevin Diggins : Removed unused/undocumented BCX_MAX_VAR_SIZE conditional code
Kevin Diggins : Removed unused/undocumented EmptyTmpStr() and simplified BCX_TmpStr()
Kevin Diggins : Reduced arbitrary padding from 256 bytes down to 1 in BCX_TmpStr()
Kevin Diggins : Removed arbitrary 256 byte padding in all calloc function calls
Kevin Diggins : Removed str_cmp() and replaced with standard library strcmp()
Kevin Diggins : Removed _strstr_() and replaced with standard library strstr()
Kevin Diggins : Moved BCXTmpStrSize to the CONST's section of the C/C++ output
Kevin Diggins : Removed deprecated "GetversionEx()" from built-in OSVERSION function
Kevin Diggins : Removed deprecated "Getversion()" from FindFirstInstance() and modified
                FindFirstInstance() to only work on NT-class (32/64) operating systems.
Kevin Diggins : BCX now automatically appends its ISO build date to BCX Version$.
Kevin Diggins : More changes improving the formatting of the C/C++ output file.
Kevin Diggins : Added memicmp to _memicmp in transformations
Kevin Diggins : Added the following warning block for MSVC (I'm using warning level -W3)
                #if (_MSC_VER >= 1900) // earlier versions untested
                  #pragma warning(disable: 4244) // conversion from type1 to type2 warnings
                  #pragma warning(disable: 4267) // conversion from type1 to type2 warnings
                  #pragma warning(disable: 4800) // forcing value to bool warnings
                #endif
Kevin Diggins : Added the following warning block for Pelles(I'm using warning level -W2)
                #if defined (__POCC__)"
                  #pragma warn(disable: 2248) // optional args not portable warnings
                  #pragma warn(disable: 2215) // conversion from type1 to type2 warnings
                  #pragma warn(disable: 2805) // possible anti-aliasing violation warnings
                  #pragma warn(disable: 2118) // unreferenced argument warnings
                  #pragma warn(disable: 2810) // potential realloc warnings
                  
                #endif

*********************************************************************************************
2020/06/29: Changes in 7.4.7 from 7.4.6
*********************************************************************************************
Robert Wishlaw : Removed oxbow code.

James Fuller   : Submitted tweak to allow assigning binary values

Kevin Diggins  : Added LLVM/Clang compiler macro

Kevin Diggins  : Display compiler that created the RUNNING instance of BCX.  For example:
                 BCX BASIC to C/C++ Translator (c) 1999 by Kevin Diggins
                 Version 7.4.7 (2020/05/24)  Compiled for X64 using LLVM-CLANG
Kevin Diggins  : Improved some of BCX's C/C++ formatting, spelling, and grammar quirks

Kevin Diggins  : Removed dead code, added some castings, added underscore to several functions
                 to support of LLVM-Clang
                 
*********************************************************************************************
2020/03/25: Changes in 7.4.6 from 7.4.5
*********************************************************************************************
2020/02/23: James Fuller suggested reducing FileIO from 1MB to 2K to help prevent mem overrun
            MrBcx applied changes to Finput, Line Input, ListBoxLoadFile, ComboBoxLoadFile
            
*********************************************************************************************
2020/02/16: Changes in 7.4.5 from 7.4.4
*********************************************************************************************
2020/02/10: Robert Wishlaw requested BCX_TOOLTIP return type changed to LRESULT.

2020/02/10: James Fuller requested <tchar.h> be added to the list of standard #includes.

2020/02/10: Kevin Diggins added UDS_NOTHOUSANDS to the style that creates the BCX_UPDOWN control
            Without that style, reading the buddy value acccurately was sometimes impossible.
            Conflicting info on Microsoft.com specifies this is a 16-bit control but it is
            possible to enable the full range of signed 32-bit integers (-2gb to +2gb) using
            SendMessage(hWnd, UDM_SETRANGE32, -2147483648, 2147483647), so we're still good!

2020/02/16: 7.4.5 re-released -- newly added "REF" C++ keyword has been permanently removed.

*********************************************************************************************
2020/02/09: Changes in 7.4.4 from 7.4.3
*********************************************************************************************
2020/02/09: James Fuller report bug with PAUSE statement.
            Replaced getchar() with _getch(), restoring traditional behavior.
            
*********************************************************************************************
2020/02/09: Changes in 7.4.3 from 7.4.2
*********************************************************************************************
2020/02/09: Robert Wishlaw pointed out the importance of maintaining consistency across the
            family of BCX_ UI controls and statements.  According, MrBcx changed BCX_TOOLTIP
            argument order from ( HWND, STRING[,FLAG}) to ( STRING, HWND[,FLAG] )
            
*********************************************************************************************
2020/02/08: Changes in 7.4.2 from 7.4.1
*********************************************************************************************
2020/02/01 Robert Wishlaw provided several improvements when using Embarcadero Cpp.

2020/02/01 James Fuller requested minor tweak to Cpp output to better support ULEX.exe

2020/02/03 Robert Wishlaw suggested removing INPW, INPD, OUTW, OUTD.  MS Reference:
           https://docs.microsoft.com/en-us/cpp/c-runtime-library/inp-inpw-inpd?view=vs-2019

2020/02/04 James Fuller replaced keypress() with getchar() in the PAUSE statement (less code)

2020/02/04 Kevin Diggins added optional no-pad to STR$ function, (per Robert Wishlaw request)

2020/02/04 Kevin Diggins added LEFTSTR() and RIGHTSTR() functions to BCX.

2020/02/07 Kevin Diggins added BCX_ToolTip (hWindow,"Tip Text"[,1=boring rectangle style])

*********************************************************************************************
2019/12/29: Changes in 7.3.9 from 7.3.8
*********************************************************************************************
Kevin Diggins:
1) Killed the bug that was resulting in extra "return DefWindowProc" statements in
   CALLBACK functions and overwriting the programmer's FUNCTION = definitions. This
   fix has been extensively tested and I'm confident the issue has been resolved.

2) Silenced a number of warnings - this is a work in progress.

3) Removed remaining "register" references from RTL that I missed in 7.3.8

4) Removed blocked-out code, including years old "testing and debugging" blocks.
   If anyone wants/needs those codes, they can get them from the archive.

5) Corrected many spelling and grammer errors in strings and comments.

6) Shortened several excessively long variable names for easier reading.

7) Reformatted the Keypress()and Inkeyd() runtimes

*********************************************************************************************
2019/12/27: Changes in 7.3.8 from 7.3.7
*********************************************************************************************
Robert Wishlaw:
1) Modifications that no longer -unnecessarily- deletes existing .c project files sharing the
same filename that is being translated.  This modification allows .c and .cpp to be created
inside the same folder which is useful when using C and CPP compilers.

2) Modifications that will eliminate some warnings in Visual Studio and other compilers

Kevin Diggins:
1) Removed deprecated (blocked out) code

2) Removed "register" from RTL ... does not affect code that employs the BCX REGISTER keyword

*********************************************************************************************
2019/12/10: Changes in 7.3.7 from 7.3.6
*********************************************************************************************
Robert Wishlaw :      Updated OSVERSION

Kevin Diggins notes:  LccWin32 cannot compile the new OSVERSION

Kevin Diggins:        Enforce "ME" only translates "." to "->" when inside a SUB or FUNCTION

*********************************************************************************************
2019/11/26: Kevin Diggins:  Started over with >> 7.3.2 << and made the following changes
*********************************************************************************************
1) Changed BCX LICENSE from GPLV2 to MIT License and removed LICENSE EXCEPTION

2) Eliminated copyright notice from being emitted within users translated programs.

3) Broke out the Developer Rules, Revisions, and To-Do-Lists into separate text files

4) Added Windows 10 to the OSVERSION detection.  Returns 17 for any family of Windows 10 OS

5) Wording & cosmetic changes to several areas of displayed text (file and screen)

6) Modified DOWNLOAD statement to use DeleteUrlCacheEntryA instead of DeleteUrlCacheEntry

7) Added FUNCTION WordPairExist() which checks for and REPORTS these missing or mispelled pairs
   EXIT SUB, EXIT FUNCTION, EXIT FOR, EXIT XFOR, EXIT DO, EXIT WHILE, EXIT SELECT, EXIT NEST,
   AND EXIT LOOP  from inside FUNCTION Emit_ControlFlow.

8) (NOTE) "AUTO" and "REGISTER" are as they were in 7.3.2.  You should remove "AUTO" and
   "REGISTER" from any programs that you've written, as they have been deprecated by their
   respective governing bodies.  These may be removed from BCX or altered in the future.
   
*********************************************************************************************
2019/11/25: Kevin Diggins: Changes to 7.3.5 from 7.3.4
*********************************************************************************************
I reverted my 7.3.4 change to some "goto" logic back to 7.3.3.  Robert Wishlaw discovered a
typo in my ScreenShotGrabber program where a typo error "EXIT FUNCTON" was generating an error
condition. This remains a situation where BCX should be able to do a better job of catching an
error like this. But for now we must be mindful that misspelled keywords may go undetected or
have unexpected consequences.

*********************************************************************************************
2019/11/24: Kevin Diggins: Changes to 7.3.4 from 7.3.3
*********************************************************************************************
1) Changed BCX LICENSE from GPLV2 to MIT License and removed LICENSE EXCEPTION

2) Eliminated copyright notice from being emitted within users translated programs.

3) Broke out the Developer Rules, Revisions, and To-Do-Lists into separate text files

4) Applied Robert Wishlaw's fix for "WITH/END WITH" bug in SUB TokenSubstitutions

5) Added Windows 10 to the OSVERSION detection.  Returns 17 for any family of Windows 10 OS

6) Eliminated emission of "auto" and "register" keywords due to deprecation. (Robert Wishlaw)

7) Updated OSVERSION webpage within BCX Online Help

8) Removed large blocks of old code that had been $COMMENT blocked-out for years.

9) 6.9.9 broke "GOTO SomeLabel" and all versions since.  Reverted that change to 6.9.8

10) Wording & cosmetic changes to several areas of displayed text (file and screen)

*********************************************************************************************
2019/11/12: Kevin Diggins: Changes to 7.3.3 from 7.3.2
*********************************************************************************************
1) Modified DOWNLOAD statement to use DeleteUrlCacheEntryA instead of DeleteUrlCacheEntry

2) Change tested correctly with Pelles, Mingw32, and LccWin32

*********************************************************************************************




*********************************************************************************************
***                                                                                       ***
***                                                                                       ***
***                                   October 27, 2019                                    ***
***                                                                                       ***
***    Jeff Schollenberger and Kevin Diggins resurrect BCX with new website and forum     ***
***                                                                                       ***
***                                www.BcxBasicCoders.com                                 ***
***                                                                                       ***
***                                                                                       ***
*********************************************************************************************




*********************************************************************************************
2018/03/31: Robert Wishlaw: Changes to 7.3.2 from 7.3.1
*********************************************************************************************

Applied Kevin Diggins fix in BCX 7.3.1 around line 29133 from

IF numargs = 3 THEN
   FPRINT Outfile, Scoot$;"fseek("; GetArg$(1, &ffp); _
   ", ("; GetArg$(2, &ffp); " - 1) * ";Stk$[2];"len;";GetArg$(3, &ffp);", SEEK_SET);"

to

IF numargs = 3 THEN
   FPRINT Outfile, Scoot$;"fseek("; GetArg$(1, &ffp); _
   ", ("; GetArg$(2, &ffp); " - 1) * ";Stk$[2];"len + ";GetArg$(3, &ffp);", SEEK_SET);"
   
*********************************************************************************************
2017/12/15: Robert Wishlaw: Changes to 7.3.0 from 7.3.1
*********************************************************************************************

Reimplemented the changes from 7.0.0 to 7.0.1 which were lost in 7.0.2.

Robert Wishlaw:
In ModStyle changed line 19020 from

FPRINT FP_WRITE," DWORD dwStyle = (DWORD)PtrToUlong(GetWindowLongPtr(hWnd,(bEx ? GWL_EXSTYLE:GWL_STYLE)));"

to

FPRINT FP_WRITE," DWORD dwStyle = (ULONG_PTR)GetWindowLongPtr(hWnd,(bEx ? GWL_EXSTYLE:GWL_STYLE));"
Robert Wishlaw:
In Set_Color changed line 20344 from
FPRINT FP_WRITE," BkColr=(int)(UINT)PtrToUlong(GetClassLongPtr(GetParent(lParam),GCLP_HBRBACKGROUND));"

to

FPRINT FP_WRITE," BkColr=(UINT_PTR)GetClassLongPtr(GetParent(lParam),GCLP_HBRBACKGROUND);"

*********************************************************************************************
2017/04/07: Robert Wishlaw: Changes to 7.3.0 from 7.2.9
 
added MANIFEST and VERSIONINFO as a resource to the bc.exe.

*********************************************************************************************
2017/03/22 : James C. Fuller: Changes to 7.2.9 from 7.2.8
*********************************************************************************************

* added DPI qualifying statement to the GUI statement. This is an addition to PIXELS
  and the default, no qualifier, which outputs windows at a fixed 2 times PIXELS size.

* James C. Fuller

* In CheckForMain changed
    IF (bMain = FALSE) AND (Use_Console = TRUE) THEN
      FPRINT FP_W, Scoot$;"hConsole = GetStdHandle (STD_OUTPUT_HANDLE);"
    END IF
  To
    IF Use_Console THEN
      FPRINT FP_W, Scoot$;"hConsole = GetStdHandle (STD_OUTPUT_HANDLE);"
    END IF

* removed from Emit_ConsoleOnlyProcs procedure superfluous instances of
  FPRINT Outfile,"  hConsole = GetStdHandle (STD_OUTPUT_HANDLE);"

* Robert Wishlaw

*   replaced internal instances of "AUTO" with "LOCAL".

*   removed unused variables "i_" and "rspNdx" from "Library_Support" procedure.

*********************************************************************************************
2016/03/20: Robert Wishlaw: changes to 7.2.8 from 7.2.7
*********************************************************************************************

Reverted "Clean up dynamic strings" change made in BCX725.

2016/02/23
changes to 7.2.7 from 7.2.6
* Vladmaze
    added BCX command line flag -m for inline C code as is provided by the $SOURCE directive.

2016/02/22
changes to 7.2.6 from 7.2.5
* James C. Fuller
    added Pelle's C Forum Moderator Frankie's changes to replace the Variadic Macros in the CreateArr function.
    These changes were made to allow for DYNAMIC arrays in a 64 bit compiled program and for
    dependent functions such as REDIM and DSPLIT to function as expected in a 64 bit compiled
    program.

2016/02/11
Changes to 7.2.5 from 7.2.4

* Robert Wishlaw

* removed the Use_CPP conditional code from KEYPRESS and PAUSE
  to revert to behaviour, for C and C++ compiles, as described in the Help file.

* In BCX724 at line 32158 replaced

        LocalDynaCnt = 0
        LocalDynArrCnt = 0

with

        ' Clean up dynamic strings
        IF LocalDynaCnt <> 0 THEN

          FOR INT j = 1 TO LocalDynaCnt
            FPRINT Outfile, Scoot$;DynaStr$[j]
          NEXT

          LocalDynaCnt = 0
        END IF
        ' Clean up dynamic strings arrays
        IF LocalDynArrCnt <> 0 THEN

          FOR INT i = 1 TO LocalDynArrCnt
            FPRINT Outfile, Scoot$;LocalDynArrName$[i]
          NEXT

          LocalDynArrCnt = 0
        END IF

2015/08/20
Changes to 7.2.4 from 7.2.3

* Robert Wishlaw

* Applied James Fuller's correction in the AssembleParts procedure near line 6494 procedure by moving

  CALL SYSTEM_VARIABLES(FP_W)

  immediately before

  CALL User_Defined_Types_And_Unions(FP_W)

  Prior to this fix, system variables were placed after class definitions
  in the C++ code so classes could not use them.

* Changed the code near line 33027 from

  IF iMatchLft(Stk$[2], InClassModuleName$) AND InClassModule THEN

  to

  IF iMatchWrd(Stk$[2], InClassModuleName$) AND InClassModule THEN

  to prevent the C++ translation return type from being stripped (in the case of a SUB the return type void())
  in circumstances where the beginning of a SUB name contains the same name as a containing Class.

* Applied James Fuller's fix to DimSubFunc where the C++ declaration to a completely abstract method
  was incorrectly translated. The code modification added

    IF szVirtual$ = szInit$ THEN
      szInit$ = ""
    END IF

    near line 12351, immediately before

    FPRINT FP_UDT, Scoot$;szV$;szStatic$;szWrk$;szVirtual$;szInit$;szIsConst$;";"


2015/08/05
Changes to 7.2.3 from 7.2.2
* Robert Wishlaw
* applied James Fuller's modification to the C_DECLARE and DECLARE translating so that a
  file name containing a hyphen is modified by changing the hyphen to an underscore in
  the variaables which are generated from the file name. Hyphens are not allowed
  to be used in the name of a C language variable. The fix also prevents truncation
  of the filename if it contains a period symbol.

  For example, the line

  C_DECLARE Function print_the_message LIB "modules-plugin-2.0.dll" ALIAS "print_the_message"(data As gpointer) As gboolean

  is now translated to

  HMODULE  H_MODULES_PLUGIN_2_0 = LoadLibrary("modules-plugin-2.0.dll");
  print_the_message=(BCXFPROT1)GetProcAddress(H_MODULES_PLUGIN_2_0, "print_the_message");

  instead of

  HMODULE  H_MODULES-PLUGIN-2 = LoadLibrary("modules-plugin-2.0.dll");
  print_the_message=(BCXFPROT1)GetProcAddress(H_MODULES-PLUGIN-2, "print_the_message");


2015/05/19
Changes to 7.2.2 from 7.2.1
* Robert Wishlaw
* applied James Fuller's BC9 modification to the SUB TokenSubstitutions so that a leading zero
  is not removed from code containing a floating point fractional value such as 0.07.

2015/03/23
Changes to 7.2.1 from 7.2.0
* Robert Wishlaw
* rewrote BCX_Thread and its variants eliminating the use of BCX_DynaCall.
* Tested with the last threading example on the BCX_THREAD function page of the BCX Help file
* using Pelle's C 32 and 64 bit, Microsoft compiler 32 and 64 bit and TDM-GCC compiler 32 and 64 bit.
* In all cases the threading example compiled without warnings or errors and functioned as expected.

2015/03/23
Changes to 7.2.0 from 7.1.9 beta
* Robert Wishlaw
* adapted from jcfuller's BC9
* Any library routine that uses BCX_DynaCall, BCX_DynaCallA/B fails under 64 bit because
  they use assembler.
* Added new Download function that works with both 32 and 64.
*  Note: BCX_Thread and its variants not supported in 64bit

2015/02/23
Changes to 7.1.9 beta from 7.1.8
* Robert Wishlaw
* Added AmpCnt varaiable and moved Use_Join in SUB FixUps

2015/02/25
Changes to 7.1.8 from 7.1.7
* Mike Henning
* Changed DefaultFont Macro so controls will default to the
  parent form/dialog font. The precedence of font used in a control is
  BcxFont, Parent font, GUI StockObject. This shouldn't break anything but
  it hasn't been extensively tested.
* Fixed what I believed to be a typo in DimVar: Changed conditional from ImRegister to IsRegister.
* Removed CONST modifier from TYPE tagTokenSubFunctions.

2014/02/23
Changes to 7.1.7 from 7.1.6
* Robert Wishlaw
* Added CoInitialize/CoUninitialize to BFF$ function.

Changes to 7.1.6 from 7.1.5
* Robert Wishlaw
* Changed instances of $nodll to $nodllmain.

Changes to 7.1.5 from 7.1.4
* Robert Wishlaw
* Changed an overlooked instance of Use_UCaseTbl to Use_LCaseTbl
  which prevented a compile with code containing the Hex2Dec function.

2014/01/30 00:00:00 GMT-8
* Changes to 7.1.4 from 7.1.3
* Robert Wishlaw
* BE WARNED THAT THESE CHANGES MAY BREAK YOUR CODE!
* Reverted changes to the lookup table for case insensitivity.
  I, without due care and attention, overlooked the fact that,
  as well as being used for case insensitivity, the MakeLCaseTbl table
  was used for the Hex2Dec function which depends on the lookup
  table being constructed for conversion to lower case.
* Replaced _strlower function with CharLowerA in the LCASE$ function so that
  it can be used for alphabetic characters above ASCII 127
  so that, for example, with code page 1252 Western European (Windows),
  lowercasing the character Latin Capital Letter O With Stroke, Ø, (216)
  with LCASE$ will return Latin Small Letter O With Stroke ø (248).
* Created a MakeUCaseTbl lookup table for upper case functions which will be applied
  to the case insensitivity functions.
* Replaced strupr function with CharLowerA in the UCASE$ function so that
  it can be used for alphabetic characters above ASCII 127,
  as for example, with code page 1252 Western European (Windows),
  uppercasing the character Latin Small Letter O With Stroke, ø (248)
  with UCASE$ will return Latin Capital Letter O With Stroke, Ø, (216).

2014/01/19 15:20:00 GMT-8
* Changes to 7.1.3 from 7.1.2
* Robert Wishlaw
* Regressed the initialization of RAW to the expected behavior, that is no initialization.
  As MrBCX once upon a time wrote,
  "Consider this ... why take the time to zero an integer if you unconditionally assign it a value."

2014/01/19 15:20:00 GMT-8
* Changes to 7.1.2 from 7.1.1
* Robert Wishlaw
* Added some of James Fuller's BC9 DimVar procedure code
  to maintain the previous parsing behavior of C++ code when
  the $CPPHDR directive is used.

2014/01/18 23:00:00 GMT-8
* Changes to 7.1.1 from 7.0.9
* Robert Wishlaw
* BE WARNED THAT THESE CHANGES MAY BREAK YOUR CODE!
* The "static" storage class specifier has been removed from the translation
  of locally scoped variables.
* Further reduced usage of memset to initialize variables to 0 by using
  the universal zero initializer ={0}. It's supposed to work on everything.
* Uninitialized RAW variables are now initialized with ={0}.
* Changed the lookup table for case insensitivity from using CharLowerA
  to CharUpperA. The affected variable LowCase has been renamed UpRcase.
  This change was made so that when sorted with case insensitivity
  the ASCII chars 91-96 would maintain their correct position
  after the alphanumeric characters. CharLowerA would
  cause a case insensitive sort to place them in position before the
  alphanumerics. It is interesting to note that the BCX lookup table works
  correctly for alphabetic characters above ASCII 127 so that, for example,
  with code page 1252, Western European (Windows) the characters
  Latin Capital Letter O With Stroke, Ø, (216) and
  Latin Small Letter O With Stroke ø (248)
  are contiguous in a case insensitive sort.

2013/09/14 17:00:00 GMT-5
* Changes to 7.0.9 from 7.0.8
* Wayne Halsdorf
* Fixed bug in SpecialCaseHandler uncovered when bug in FixAnyArrays was fixed.

2013/09/09 17:00:00 GMT-5
* Changes to 7.0.7 from 7.0.8
* Wayne Halsdorf
* Fixed bug in FixAnyArrays()
* Fixed bug class functions prototypes where being emited
* Added option to hide the input of an INPUTBOX$(char*, char*,char*, int=0)
*   default 0 normal input, nonzero displays astrics

2013/08/11 17:00:00 GMT-5
* Changes to 7.0.6 from 7.0.7
* Wayne Halsdorf
* Encapcilated WideToAnsi and AnsiToWide with unicode markers around headers.
* Templates now work with functions and classes
*   Template<>
*   function/class
*   END TEMPLATE

2013/08/06 17:00:00 GMT-5
* Changes to 7.0.5 from 7.0.6
* Wayne Halsdorf
* Fixed bug in SpecialCaseHandler from recent changes for c++ variables by moving the routine to
    to a call to FixAnyArrays() in Translate()
* Encapcilated WideToAnsi and AnsiToWide with unicode markers.

2013/08/05 17:00:00 GMT-5
* Changes to 7.0.4 from 7.0.5
* Wayne Halsdorf
* Fixed punctuation detection bug in SUB BuildDelimStr
* Removed FPRINT FP_WRITE, "  #include <strstream>"
* Made Throw accept more than 1 additonal token
* Fixed bug in SUB DimVar() when handling c++ vector
* Fixed bug in FUNCTION Emit_FuncSub(sWord$, FuncRetnFlag AS PINT) no header emited for
          Function median(vec As std::vector<double> ) As double
          changed
            IF INSTR(VarCode.Proto$,"::") = 0 AND IAmNot(InNameSpace) AND IAmNot(InClassModule) AND IAmNot(InPPTypeModule) THEN
          to
            IF IAmNot(InNameSpace) AND IAmNot(InClassModule) AND IAmNot(InPPTypeModule) THEN

* Fixed bug in FUNCTION JoinStrTest - added additional string types to test list = vt_LPSTR, vt_LPSTRPTR and vt_PCHAR
* Fixed bug when declaring c++ vector variable
* Fixed bug in com DispatchObject

2013/07/15 19:34:00 GMT-8
* Changes to 7.0.3 from 7.0.4
* Robert Wishlaw, Wayne Halsdorf
* Revised $CCODE to revert the default behaviour to insert the translated code
  at the point where it was written in the BCX source.
* Added several $CCODE flags to place the inline C code to a specified location.
  For details see the $CCODE section of BCX Documentation 7.0.4.
* Revised the inline C code operator (!) to revert the default behaviour to insert the translated code
  at the point where it was written in the BCX source.
* Fixed BCX_RESOURCE bug.
* Fixed bug which caused certain FPRINT statements to crash the BCX translator.
* Changed

        CASE "false"
        IF UseCpp THEN
          Stk$[Tmp] = "false"
        ELSE
          Stk$[Tmp] = "FALSE"
        END IF

* to

        CASE "false"
          Stk$[Tmp] = "FALSE"

* Changed

        CASE "true"
        IF UseCpp THEN
          Stk$[Tmp] = "true"
        ELSE
          Stk$[Tmp] = "TRUE"
        END IF

* to

        CASE "true"
          Stk$[Tmp] = "TRUE"

* Fixed internal FUNCTION JoinStrTest to correctly parse more data types.
* Changed

    IF Use_BCX_Fontdlg THEN
      IF UseCpp THEN
        FPRINT FP_WRITE, "int     BCX_FontDlg (bool=0,HWND=0);"
      ELSE
        FPRINT FP_WRITE, "int     BCX_FontDlg (BOOL=0,HWND=0);"
      END IF
    END IF

* to

    IF Use_BCX_Fontdlg THEN
        FPRINT FP_WRITE, "int     BCX_FontDlg (BOOL=0,HWND=0);"

* Added revisions to correctly parse more C++ code snippets.

2013/06/26 17:00:00 GMT-5
* Changes to 7.0.2 from 7.0.3
* Wayne Halsdorf
* Reformatted some code for easier reading.
* Fixed bug when output involves a number such as 1.345e-15 (Handled in XParse)
* Reduced usage of memset to set variables to 0 by using initializers.
* The translation of ? to print will now only work if it's the first token or if preceeded with a colon
* Fixed Bug in OPEN Statement - for operations was not tested to see if it was missing.

2013/06/06 09:00:00 GMT-8
* Changes to 7.0.1 from 7.0.2
* Wayne Halsdorf
*
Revised SUB FuncSubDecs1 adding

iEmpty = TRUE

and

iEnd += 5

and moving

  IF iEmpty THEN
    CALL RemEmptyTokens
  END IF

to the end of the FuncSubDecs1 subroutine.

2013/05/20 00:00:00 GMT-8
* Changes to 7.0.0 from 7.0.1
* Robert Wishlaw
*
In ModStyle, changed line 18309 from

    FPRINT FP_WRITE,"  DWORD dwStyle = (DWORD)PtrToUlong(GetWindowLongPtr(hWnd,(bEx ? GWL_EXSTYLE:GWL_STYLE)));"

to

    FPRINT FP_WRITE,"  DWORD dwStyle = (ULONG_PTR)GetWindowLongPtr(hWnd,(bEx ? GWL_EXSTYLE:GWL_STYLE));"


In Set_Color, changed line 19633 from

    FPRINT FP_WRITE,"     BkColr=(int)(UINT)PtrToUlong(GetClassLongPtr(GetParent(lParam),GCLP_HBRBACKGROUND));"

to

    FPRINT FP_WRITE,"     BkColr=(UINT_PTR)GetClassLongPtr(GetParent(lParam),GCLP_HBRBACKGROUND);"


2013/01/28 00:00:00 GMT-8
* Changes to 6.9.9 from 7.0.0
* Robert Wishlaw
* To repair the $RESOURCE directive changed instance of "$resourse" to "$resource"
* and, as well, for consistency changed instances of "Doresourse" to "Doresource".

2012/10/05 17:00:00 GMT-5
* Changes to 6.9.8 from 6.9.9
* Wayne Halsdorf
* Fixed bug in prototype/header generation involved changed to several functions
*    to allow for recursion
* Changed CONST InternalDebugOff to GLOBAL InternalDebugOff to elimate warnings
* Fixed label generator for select/end select to prevent unneed labels being generated.
* Changed strlwr to _strlwr
* Fixed bug temporary files not being deleted.
* Fixed bug STRARRAY not correctly translated when generating C++ code.

2012/08/27 10:22 GMT-8
* Changes to 6.9.7 from 6.9.8
* James C. Fuller
* Added
*    FPRINT FP_WRITE, "  #include <strstream>"
* to the C++ style include files added with $CPPHDR

2012/08/27 00:46 GMT-8
* Changes to 6.9.6 from 6.9.7
* Robert Wishlaw
* To eliminate several data type errors when compiling bc.bas with Borland compilers
* Changed
* TYPE tagTokenSuFunctions
*   DIM iTRAN_FLAG AS INT                 ' Where translations are legal
*   DIM pszFunctionName AS CONST PCHAR    ' BCX word
*   DIM pszFunctionXName AS CONST PCHAR   ' if eWI_ReplaceWord set directly replace with this
*   DIM iWordInfo AS Integer              ' See ENUM above
*   DIM iCOM AS Integer                   ' if can be used in directly with COM
* END TYPE

* To

* TYPE tagTokenSuFunctions
*   DIM iTRAN_FLAG AS INT                 ' Where translations are legal
*   DIM pszFunctionName AS CHAR PTR       ' BCX word
*   DIM pszFunctionXName AS CHAR PTR      ' if eWI_ReplaceWord set directly replace with this
*   DIM iWordInfo AS Integer              ' See ENUM above
*   DIM iCOM AS Integer                   ' if can be used in directly with COM
* END TYPE

2012/08/26 14:20 GMT-8
* Changes to 6.9.5 from 6.9.6
* Robert Wishlaw
* added $CPPHDR directive.
* reverted $NOIO directive to James Fuller's BCX 6.7.0 behavior.

* C users please note that the $NOIO directive now is NOT required to omit the C++ style header calls. They are omitted as the default in translation.

* C++ users please note well that now to add the C++ style headers the new $CPPHDR directive must be used. To omit the iostream header use the $NOIO directive with the $CPPHDR directive.

* This BCX code, with only the $CPPHDR directive,

* $CPPHDR
* PRINT "C Rules"

* will translate, using BCX 6.9.6, adding this to the C output

* // Additional lines may be needed
* #if defined( __cplusplus )
*   #include <iostream>
*   #include <fstream>
*   #include <sstream>
*   #include <iomanip>
*   typedef std::string stdstr;
*   using namespace std;
* #endif

* while this BCX code, with both the $CPPHDR and $NOIO directives,

* $CPPHDR
* $NOIO
* PRINT "C Rules"

* will translate, using BCX 6.9.6, adding this to the C output

* // Additional lines may be needed
* #if defined( __cplusplus )
*   #include <fstream>
*   #include <sstream>
*   #include <iomanip>
*   typedef std::string stdstr;
*   using namespace std;
* #endif

* and this BCX code with neither the $CPPHDR or $NOIO directive

* PRINT "C Rules"

* will translate, using BCX 6.9.6, with no added C++ style header calls.

2012/08/22 19:10 GMT-8
* Changes to 6.9.4 from 6.9.5
* Robert Wishlaw
* Added the $NOIO directive to the bc.bas source
* so that the superfluous C++ includes are not added
* to the bc.exe executable.
* Changed
*  IF UseCpp Then
*    FPRINT FP_WRITE, "// Additional lines may be needed"
*    FPRINT FP_WRITE, "#if defined( __cplusplus )"
*    If UseIO Then
*      FPRINT FP_WRITE, "  #include <iostream>"
*    End If
*    FPRINT FP_WRITE, "  #include <fstream>"
*    FPRINT FP_WRITE, "  #include <sstream>"
*    FPRINT FP_WRITE, "  #include <iomanip>"
*    FPRINT FP_WRITE, "  typedef std::string stdstr;"
*    FPRINT FP_WRITE, "  using namespace std;"
*    FPRINT FP_WRITE, "#endif"
*  END IF
* To
* IF UseCpp AND UseIO THEN
*   FPRINT FP_WRITE, "// Additional lines may be needed"
*   FPRINT FP_WRITE, "#if defined( __cplusplus )"
*   FPRINT FP_WRITE, "  #include <iostream>"
*   FPRINT FP_WRITE, "  #include <fstream>"
*   FPRINT FP_WRITE, "  #include <sstream>"
*   FPRINT FP_WRITE, "  #include <iomanip>"
*   FPRINT FP_WRITE, "  #include <strstream>"
*   FPRINT FP_WRITE, "  typedef std::string stdstr;"
*   FPRINT FP_WRITE, "  using namespace std;"
*   FPRINT FP_WRITE, "#endif"
* END IF
* =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
2012/08/14
* Changes to 6.9.3 from 6.9.4
* James C. Fuller
* commented these 2 IF / END IF lines that were added to 6.8.5 which broke constructors
* '      IF ptVar->Methd <> mt_ConsDesNoParam THEN
*        CALL GetTypeInfo(ptVar->AsToken$, &(ptVar->IsPtrFlag), &iNd, &(ptVar->VarNo))
* '      END IF
* '------------------------------------------------------------------------------
* added #include <strstream> to c++ header so c++ example 32 would compile.
* =*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
2012/08/11 19:10 GMT-8
* Changes to 6.9.2 from 6.9.3
* Robert Wishlaw
* Changed
* vt_LDOUBLE             '  Long Double~
* to
* vt_LDOUBLE             '  Long Double`
* Changed
* CONST VarTypes$ = "%$#!@~"
* to
* CONST VarTypes$ = "%$#!@`"
* Changed
*     IF j <> ASC("~") THEN
*       CONCAT (Stk$[TokenNum], "~")
* to
*     IF j <> ASC("`") THEN
*       CONCAT (Stk$[TokenNum], "`")
* Changed
*   IF INCHR(ZA$,"~") THEN
* to
*   IF INCHR(ZA$,"`") THEN
* Changed
*    {1,"~~~~"                   ,"~~~~"                          ,0,comvt_BAD}
* to
*    {1,"zzzz"                   ,"zzzz"                          ,0,comvt_BAD}
* Changed
*    'IF sWord$ = "constructor" THEN
*      VarCode.Token$ = Funcname$
*    'ELSE
*    '  VarCode.Token$ = "~"+Funcname$
*    'END IF
* to
*    IF (sWord$ = "constructor") OR (INSTR(Funcname$, "~") <> 0) THEN
*      VarCode.Token$ = Funcname$
*    ELSE
*      VarCode.Token$ = "~" & Funcname$
*    END IF

2012/07/26 00:12 GMT-8
* Changes to 6.9.1 from 6.9.2
*  Robert Wishlaw
* Changed
*    {1,"¦¦¦¦"                   ,"¦¦¦¦"                          ,0,comvt_BAD}
* to
*    {1,"~~~~"                   ,"~~~~"                          ,0,comvt_BAD}

2012/07/30 10:30 GMT-8
* Changes to 6.9.0 from 6.9.1
* James Fuller
* Changed
*  IF UseCpp Then
*    FPRINT FP_WRITE, "// Additional lines may be needed"
*    FPRINT FP_WRITE, "#if defined( __cplusplus )"
*    FPRINT FP_WRITE, "  using namespace std;"
*    If UseIO Then
*      FPRINT FP_WRITE, "  #include <iostream>"
*    End If
*    FPRINT FP_WRITE, "  #include <fstream>"
*    FPRINT FP_WRITE, "  #include <sstream>"
*    FPRINT FP_WRITE, "  #include <iomanip>"
*    FPRINT FP_WRITE, "  typedef std::string stdstr;"
*    FPRINT FP_WRITE, "#endif"
*  END IF
*
* to
*
*  IF UseCpp Then
*    FPRINT FP_WRITE, "// Additional lines may be needed"
*    FPRINT FP_WRITE, "#if defined( __cplusplus )"
*    If UseIO Then
*      FPRINT FP_WRITE, "  #include <iostream>"
*    End If
*    FPRINT FP_WRITE, "  #include <fstream>"
*    FPRINT FP_WRITE, "  #include <sstream>"
*    FPRINT FP_WRITE, "  #include <iomanip>"
*    FPRINT FP_WRITE, "  typedef std::string stdstr;"
*    FPRINT FP_WRITE, "  using namespace std;"
*    FPRINT FP_WRITE, "#endif"
*  END IF

2012/07/29 11:57 GMT-8
* Changes to 6.8.9 from 6.9.0
* douyuan
* Changed
* vt_LDOUBLE             '  Long Double¦
* to
* vt_LDOUBLE             '  Long Double~
* Changed
* CONST VarTypes$ = "%$#!@¦"
* to
* CONST VarTypes$ = "%$#!@~"
* Changed
*     IF j <> ASC("¦") THEN
*       CONCAT (Stk$[TokenNum], "¦")
* to
*     IF j <> ASC("~") THEN
*       CONCAT (Stk$[TokenNum], "~")
* Changed
*   IF INCHR(ZA$,"¦") THEN
* to
*   IF INCHR(ZA$,"~") THEN
* Changed
*   RemoveAll(Tmp$,"%$#!@¦",1)   '1 = ignore anything in quotes
* to
*   RemoveAll(Tmp$,VarTypes$,1)  '1 = ignore anything in quotes
* Changed
*           IF INCHR ("!$#¦%", Var1$) THEN
* to
*           IF INCHR (VarTypes$, Var1$) THEN
* Ian Casey
* Changed
*   FPRINT FP_WRITE, "      BcxPtr_LineCtr+=1;"
*   FPRINT FP_WRITE, "      if(BcxPtr_LineCtr>LPP)"
*   FPRINT FP_WRITE, "        {"
*   FPRINT FP_WRITE, "          EndPage(BcxPtr_hDC);"
*   FPRINT FP_WRITE, "          BcxPtr_LineCtr=0;"
*   FPRINT FP_WRITE, "          StartPage(BcxPtr_hDC);"
*   FPRINT FP_WRITE, "        }"
*   FPRINT FP_WRITE, "      TextOut(BcxPtr_hDC,20,BcxPtr_FontMetrix*BcxPtr_LineCtr,BcxPtr_Text,strlen(BcxPtr_Text));"
* to
*   FPRINT FP_WRITE, "      if(BcxPtr_LineCtr>LPP)"
*   FPRINT FP_WRITE, "        {"
*   FPRINT FP_WRITE, "          EndPage(BcxPtr_hDC);"
*   FPRINT FP_WRITE, "          BcxPtr_LineCtr=0;"
*   FPRINT FP_WRITE, "          StartPage(BcxPtr_hDC);"
*   FPRINT FP_WRITE, "        }"
*   FPRINT FP_WRITE, "      BcxPtr_LineCtr+=1;"
*   FPRINT FP_WRITE, "      TextOut(BcxPtr_hDC,20,BcxPtr_FontMetrix*BcxPtr_LineCtr,BcxPtr_Text,strlen(BcxPtr_Text));"

2012/07/27 21:25 GMT-8   Ian Casey
* Changes to 6.8.8 from 6.8.9
* Changed
* FPRINT FP_WRITE, "void PrinterWrite (char*);"
* to
* FPRINT FP_WRITE, "void PrinterWrite (char*, int=80, int= 60);"
* Changed
* FPRINT FP_WRITE, "void PrinterWrite (char *TextIn)"
* to
* FPRINT FP_WRITE, "void PrinterWrite (char *TextIn,int CPL,int LPP)"
* Removed
* FPRINT FP_WRITE, " int LPP=60;"
* FPRINT FP_WRITE, " int CPL=80;"

2012/07/26 00:12 GMT-8   Robert Wishlaw
* * Changes to 6.8.7 from 6.8.8
*   CASE vt_BOOL       :    IF UseCpp THEN A$ = "bool" ELSE    A$ = "BOOL"
* to
*   CASE vt_BOOL       :    A$ = "BOOL"
* Changed
*       IF UseCpp THEN Stk$[Tmp] = "bool" ELSE Stk$[Tmp] = "BOOL"
* to
*       Stk$[Tmp] = "BOOL"

2012/07/12 20:21 GMT-8   Robert Wishlaw
* Changed
*       CALL BuildStr(2, Ndx, szPrinterParameters$)
*       FPRINT Outfile, Scoot$,"PrinterOpen";szPrinterParameters$;";"
* To
*       CALL BuildStr(2, Ndx, szPrinterParameters$)
*       FPRINT Outfile, Scoot$,"PrinterOpen(";szPrinterParameters$;");"

2012/03/25 12:58 GMT-8   Robert Wishlaw
* Changed
*  IF InFunc > eNotInOne OR InClassModule OR InNameSpace THEN
* to
*  IF InFunc > eNotInOne OR InClassModule OR InNameSpace OR InTypeDef THEN
* Changed
*  CASE vt_ULLONG     :    A$ = "ULLONG"
* to
*  CASE vt_ULLONG     :    A$ = "ULONGLONG"

2012/02/04 17:00 GMT-8   Robert Wishlaw
* Changes to 6.8.6 from 6.8.7
* 02/05 - Modified - (Casey) - cMaxConstMacros value changed from 128 to 512.

2012/02/04 17:00 GMT-8   Robert Wishlaw
* Changes to 6.8.5 from 6.8.6
* 02/04 - Fixed Bug - (Halsdorf) - modified Emit_PPType function to accomodate C++ "using"
* 02/04 - Fixed Bug - (Diggins) - corrected Download function call to DeleteUrlCacheEntry function.

2011/12/19 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.8.4 from 6.8.5
* 12/07 - Fixed Bug - (Fuller) - Not all inline C code emitted correctly in namespace/class
* 12/08 - Fixed Bug - (Casey) - "=<" not correctly translated to "<="
* 12/09 - Fixed Bug - (Fuller) - $CCODE not emiting proper code when in a Class or NameSpace
* 12/12 - Added - (Fuller) - Added C++ operator ()
* 12/14 - Added - (Fuller) - Various improvements to C++ code generation.
* 12/18 - Fixed Bug - (Fuller) - Fixed misplacement of * in parameter's of a constructor

2011/12/04 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.8.3 from 6.8.4
* 10/24 - Added the ability to use CONST expressions to TYPE/END TYPE
* 11/14 - Fixed Bug - (Fuller) - Inline C code in class module not handled correctly.
* 12/04 - Fixed Bug - (Fuller) - Inline C code in namespace module not handled correctly.
* 12/06 - Added RegExist - A positive number is an error/missing on the key a negative number is an error/missing on the subkey.

2011/10/24 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.8.2 from 6.8.3
* 10/17 - Fixed Bug - (Ad Rienks) - placement of single line c code.
* 10/24 - Fixed Bug - (mr_unreliable57) - Bug in Join string

2011/10/14 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.8.1 from 6.8.2
* 10/12 - Removed missed debugging info
* 10/13 - Fixed Bug - (mr_unreliable57) - string joining bug
* 10/13 - Fixed Bug - (Richard Meyer) - scientific notation output bug
* 10/14 - Implimented Ian suggested that ABS should behave like VB ABS and use IABS for integer absolute value
* 10/14 - Fixed Bug - (Casey) - the placement order of $ccode

2011/10/07 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.8.0 from 6.8.1
*  9/08 - Fixed Bug - (Robert) Datatype in SUB ProcessSetCommand not checked correctly.
*  9/10 - Fixed Bug - (Kevin) - Prototype bug involving variables of the form szK$[] most noticable in C++
*  9/17 - Fixed Bug - (Richard Meyer) - main(...) not removed from DLL generated code.
*  9/25 - Fixed Bug - (Casey) - $CCODE incorrectly saved to wrong internal file.
* 10/02 - Fixed Bug - (Casey) - string assignment of a structure member when structure is passed as a reference.
* 10/02 - Fixed Bug - (Fuller) - .def file not closed.
* 10/07 - Victor McClung - Added function, Get_RTL_Version$, to Runtime Library to ID the version it was made with.

2011/09/06 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.7.3 from 6.8.0
* 6/05 - Added - Kevin - EXIT NEST - will exit out of the current loop types until a different type encountered.
* 6/10 - Fixed bug - (Vic) - date.c file was not created.
* 7/16 - Fixed ABS bug - (Ian/Robert) - After some reading on how absolute values are handled and how they
*        are used internally in BCX it would be best to add all of the various types of absolute values
*        considering how little is needed to add each type (1 line each). Crude BCX discriptions
*        vt_INTEGER abs(vt_INTEGER)
*        vt_LONG labs(vt_LONG)
*        vt_LLONG llabs(vt_LLONG)
*        vt_DOUBLE fabs(vt_DOUBLE)
*        vt_FLOAT  fabsf(vt_FLOAT)
*        vt_LDOUBLE fabsl(vt_LDOUBLE)
*        A note in the help file stating that while you can use the absolute function within calculations
*        it is better to use temporary holders for the value of absolute function that use floating point
*        values since on very rare occasions it needs to be normalized on return. The storing of an
*        unnormalized floating point variable forces normalization.
* 7/23 - Fixed bug - (Robert) - Spacing bug. Appeared first in SIZEOF()
* 7/30 - Fixed bug - (Robert) - ULONG was being emitted when ULONGLONG was suppose to be
* 7/31 - Fixed bug - (Robert) - Internal const was being emited instrad of actual value.
* 8/08 - Fixed bug - (Ad Rienks) - bug in RECLEN code generation
* 8/17 - Fixed bug - (Ad Rienks) - Renamed parameters of MsgBox function to avoid possible error messages
* 8/22 - Added AlphaNumeric option to QSORT - Kevin
* 9/05 - Finished Rewrite of sections involving the assembling of the various parts into the final c/cpp file.

2011/06/04 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.7.2 from 6.7.3
* 6/2  - Fixed bug - (Vic) Truncation of lines in header file.
* 6/4  - Fixed bug - (Vic) Global defines were missing in BCXRT.H

2011/05/25 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.7.1 from 6.7.2
* 5/22 - Added NotEqualTo and EqualTo to lexicon R = (A NotEqualTo B) OrElse (A EqualTo C)
* 5/22 - Change method of making directory string locations for RTL
* 5/25 - Fixed bug - Out of order enty in tTypes
* 5/25 - Added additional table checking in InitReservedWordsLookup
* 6/1  - Added longlong as a printable type

2011/05/20 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.7.0 from 6.7.1
* 5/12 - Added routine to handle c++ vector - (Fuller)
* 5/15 - Fixed bug - (Doyle) - error in COM support - COM types not placed before prototypes.
* 5/15 - Fixed bug - (Fuller) - translation of call type in class
* 5/20 - Fixed bug - (Fuller) - translation of function initializer in class
* 5/20 - Fixed bug - Introduced when header portion of program was reordered.

2011/05/11 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.6.1 from 6.7.0
* 5/5 - Fixed bug - WINBOOL (Fuller) not handled when used in a class
* 5/6 - Changed UseCpp and UseIO interaction - (Fuller) - Message #41776
* 5/7 - Fixed bug - (Fuller) - Bug in rebuild of string found when RAW AS __int32
* 5/10 - Fixed bug - (Fuller) - iif was not changed to reflect CPP changes.
* 5/11 - Began splitting functions to reduce complexity/length

2011/05/05 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.6.0 from 6.6.1
* 4/26 - Fixed elipse bug (Fuller) elispse not emitted when in c++
* 4/27 - Fixed DialogBox bug (Fuller) wrong case emitted.
* 4/29 Removed IncludeCount (no longer used)
* 4/29 - Fixed bug in difference between -c and $CPP - (Fuller)
* 5/5 - Fixed  bug in PPTYPE (Wishlaw) - extra bumpdown called
* 5/5 - Added WINBOOL as type will emit BOOL as type for use in C++

2011/04/25 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.5.0 from 6.6.0
* 4/17 Project_Support - Started code reduction/complexity (65%/50% of orignal)
* 4/20 Made BCX_GET_COM_STATUS a seperate function in the RTL
* 4/21 - Fixed destructor bug (Fuller)
* 4/21 - Fixed SET bug (Fuller) was not being placed in UDT when in class or namespace
* 4/21 - Added $NOIO directive (Fuller)
* 4/23 - Renamed string to stringx (Fuller)
* 4/25 - Fixed BOOL/bool bug (Fuller) not correctly outputted when in class or local variable
* 4/25 - Fixed case changing of word next (Fuller) - The words case was changed when it was not acting as a reserved word

2011/04/20 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.5.0BetaRC2 from 6.5.0
* 3/25 - Fixed bug (Robert) Window headers were removed if $CPP or -c was used.
* 3/27 - Changed (Armando) GetWordInfo use of strcmp to str_cmp
* 3/27 - Changed FindWord use of strcmp to str_cmp
* 3/28 - Added bcx internal str_Cmp to lexicon
* 4/03 - Added $LIBERROR directive to lexicon
*   Syntax $LIBERROR "string literal" where a log of libaries and functions that failed.
* 4/04 - Changed (Robert) enhanced enum to include typedef when emitted
* 4/04 - Clean up code
* 4/05 - Fixed bug (Ian) in SpecialCaseHandler
* 4/06 - Fixed potential bug (Ian) StrToken
* 4/06 - Added printer changes (Ian)
*          PrinterOpen (char * fontname,int PointSize,int charset)
*          PrinterOpen (char * ="Courier New",int=12,int=DEFAULT_CHARSET)
*          more changes possible in future.
* 4/14 - Fixed bug in BCXRT routine - extra BCX_Hinstance was tring to being added.
* 4/20 - Fixed bugs in BCX Runtime Library

2011/03/25 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.5.0BetaRC1 from 6.5.0BetaRC2
* 3/23 - Fixed bug (Ian) when emitting CONST
* 3/23 - Fixed bug (Ian) reguarding BCX_hInstance (was not always emitted)
* 3/23 - Fixed bug (Ian) reguarding DefaultFont (was not always emitted)
* 3/23 - Fixed bug (Don) in case statement emitted =< when <= should have been
* 3/25 - Fixed bug (Robert) in PREPEND sizeof PrependVar$ not declared correctly
* 3/25 - Fixed bug (Jeff) FOR EACH intendion bug
* 3/25 - Revert CREATEOBJECT to 6.2.2 method of creation

2011/03/21 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.5.0AlphaRC5 from 6.5.0BetaRC1
* Enhanced ENUM
*   Syntax: TypeOfEnum AS ENUM or ENUM AS TypeOfEnum
*   Emits   enum TypeOfEnum
* This will allow TypeOfEnum to act as a type taking only named values that are
*   in the enum/end enum list.
* More code cleanup, adding/changing comments
* Changed PREPEND/END PREPEND syntax , removed tic marks as encapsulator
*   PREPEND `fprint fpout,` is now PREPEND fprint fpout,
* Fixed switch bug -c

2011/03/04 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.5.0AlphaRC4 from 6.5.0AlphaRC5
* Added PREPEND/END PREPEND to lexicon (JCFuller). See prepend.txt
* Began changing variable names in functions/subs to make it easier to read
*   resulting in finding non-executable code and obscure bugs.
* Bug fixes involving function prototypes
* Fixed bug when using a multiword cast inside of an IF/THEN statement

2011/02/19 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.5.0AlphaRC3 from 6.5.0AlphaRC4
* Continued replacement of fixed values(Magic Number) in code  with constants to make them more usable.
* Continued adding checks to prevent going past array end
* Bug fixes involving function prototypes
* Bug fix SWAP - missing )
* Bug fix DATA$ isn't case-sensitive
* Bug fix IsCallBack flag not being reset
* Replacement for PRIVATE CONST    ENUM ONE = 1
* Exiting loop warnings will only show if -w switch is used

2011/02/17 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.5.0AlphaRC2 from 6.5.0AlphaRC3
* Began replacement of fixed values(Magic Number) in code  with constants to make them more usable.
* Began adding checks to prevent going past array end
* various bug fixes in new code for C++
* various bug fixes in new code
* Minor changes in code for clarity

2011/01/13 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.5.0AlphaRC1 from 6.5.0AlphaRC2
* various bug fixes in new code

2011/01/07 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.2.4 from 6.5.0AlphaRC1
* Fixed bugs intorduced in 6.2.4
* A rewrite of the emitter routines.
* Merged directives into keywords list
* A number of changes in the translator routines to reduce the occurance of recursion
* Began adding more suport for C++
*   $CPP now required for C++ (no longer checks to see if intended by code examination)
*   bool is now emitted instead of BOOL for C++
*   CLASS to Replace $CLASS
*   NAMESPACE to replace $NAMESPACE
*   TRY to replace $try
*   THROW to replace $THROW
*   CATCH to replace $CATCH
*
* Added more error checking some in the form of warnings.
* EXIT without a control named results in a warning message with
*   the inner most loop named. The code generated results in the
*   exiting of the inner most control loop.
*   See notes.txt
*
* Added Me to lexicon to replace This so that This can be used for C++
* Added declaration of variables with forword propagation of variable type
*   DIM AS DOUBLE A, B, C[2]                  ' all variables are doubles
*   RAW AS INT A[] = {4,5}, B, C[2] = {0,1}   ' all variables are integers
*   DIM AS CHAR PTR PTR A, B[3]               ' all variables are POINTERS to POINTERS of char
* Added Boolean operators ANDALSO and ORELSE to lexicon
*   DIM AS BOOL bReault1, bReault2, bX1, bX2
*   DIM szBuf$
*   bX1 = TRUE
*   bX2 = FALSE
*   bReault1 = bX1 ANDALSO bX2
*   bReault2 = bX1 ORELSE bX2
*   PRINT "bX1 bX2 bX1 ANDALSO bX2 bX1 ORELSE bX2"
*   sprintf(szBuf,"%3i %3i     %2i               %2i",bX1,bX2,bReault1, bReault2)
*   PRINT szBuf
*   PAUSE

2010/11/06 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.2.3 from 6.2.4
* Fixed bugs introduced in last relase
*   BFF function - Return value wasn't misnamed
*   EVENTS - InFunc wasn't reset to false at end
* Added more code in preperation for C++ additions
* Fixed #include directive
* Removed Ella's Use_GoSub routine that was accidently merged (not compatible with all compilers)

2010/10/31 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.2.2 from 6.2.3
* Merged some changes from Ella Kogan's modified version of BCX
* Fixed Set bug
* Removed some old commented code
* Renamed some of the internal names in preporation of adding more C++ support to avoid possible conflicts


2010/10/10 00:00 GMT-7   Kevin Diggins
* Changes to 6.2.1 from 6.2.2
* Replaced C99 deprecated 'gets' code with 'fgets'
* Fixed problem in DOWNLOAD function
* Reformatted InkeyD and Keypress runtime codes
* Compiled with MSVC++ V.14.00.50727.762

2010/10/10 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.2.0 from 6.2.1
* Added translation code for $NAMESPACE/$ENDNAMESPACE code generation
* Fixed bug in cpp METHOD sub/function code generation

2010/09/14 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.1.9 from 6.2.0
* Fix bug in $INTERFACE/$ENDINTERFACE and $CLASS/$ENDCLASS
* Changed detection and parsing of directives to allow for leading spaces

2010/09/13 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.1.8 from 6.1.9
* Added -b command line option. See Message #40891
* Added warning to free command that local dynamic variables are automatically freed.
* Added $INTERFACE/$ENDINTERFACE to be used the same way as $CLASS/$ENDCLASS
* Added XFOR/XNEXT to lexicon
* Now$ and Date$ can now take an option parameter, if non zero it returns UTC time
*   defaults for Now$ and Date$ return local time
* Incresed size of INFOBOXs used for warnings and abort messages
* Fixed bug in DO/LOOP checking (removed hard coding and moved/added resetting/testing of flags)

2010/08/18 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.1.7 from 6.1.8
* Fixed bug introduced in previous version involving fix for SELECT/END SELECT

2010/08/17 00:00 GMT-5   Wayne Halsdorf
* Changes to 6.1.6 from 6.1.7
* Put back adding of comment lines into C source code using the directive $REMS
*   which work as a toggle (default start value off). A comment line may have leading white spaces.
* Added check for unfinished BumpDowns (Indent > 0  at end of END SUB/END FUNCTION This should be 0)
*   most likly cause is missing END IF since the other errors involving WHILE/DO/SELECT will have shown up
* Fixed bug involving multiple occurences nested SELECT/END SELECT within SELECT/END SELECT
* Added test to check for DO CONTIDION/LOOP CONTIDION
* Added second optional parameter to TIME$(x,u) to return UTC values
*   default value for u is 0 for local, non 0 for UTC
* Added some scope limit detection of variable types.
*   This will reduces the warnings about two variables being named
*   with two different data types.

2010/08/02 00:00 GMT-5   Wayne Halsdorf
* Updated OSVERSION for Vista and Windows 7
* Fixed bug in the FOR EACH/NEXT loop checker, the FOR EACH was not checked
* Fixed bug in CreateArr_internal as result of 32/64 bit conversion
* Fixed bug in BCX_MDialog as result of 32/64 bit conversion
* Fixed strong type checking of BCX_SETCOLOR parameters introduce in 6.14  as result of 32/64 bit conversion

2010/07/29 00:00 GMT-5   Wayne Halsdorf
* Fixed bug introduced in previous version reguarding balance of
*   DO/LOOP, no dection of DO WHILE being converted to WHILE

2010/07/27 00:00 GMT-5   Wayne Halsdorf
* Added association checks for FOR/NEXT, WHILE/WEND, DO/LOOP and SELECT/END SELECT
* Added Kevin's long type to FOR/NEXT
* Added simple check to see if FOR/NEXT is balanced.
* Added code to WITH statement so that the object of the WITH staement
*   can now be a pointer
* WITH pO
*   ->szName$ = "test"
*   ->iCnt    = 1
* ENDWITH
* Updated Download function so that cached files are not used
* Fixed - $ONENTRY to correctly echo the cmd to be exectuted
* Fixed - $COMPILER to correctly echo and emit the cmd to be exectuted
* Fixed - $LINKER to correctly echo and emit the cmd to be exectuted
* Changed all occurances of GetWindowLong and SetWindowLong to GetWindowLongPtr and SetWindowLongPtr
*   and GWL_yadayda to GWLP_yadayda where required
* Changed all occurance of GetClassLong and SetClassLong to GetClassLongPtr and SetClassLongPtr
*   and GCL_yadayada to GCLP_yadayada where required
* Added LONG_PTR casts where needed including places where while not
*   now needed but may change in future.
* Added PtrToUlong to BCX_OLE_WIDTH/BCX_OLE_HEIGHT macros and to calls made in ModStyle and Set_Color

2010/07/01 00:00 GMT-5   Wayne Halsdorf
* Changed all occurances of GWL_HINSTANCE to GWLP_HINSTANCE
* Added test to limit number of nested BEGINBLOCK/ENDBLOCK to 16
*   anything that complex is in need of a rewrite
* Rewrite of variable declaration routine.
*   Note: it is posible to have a variable that is both volitile and const
* Fixed bug: DestroySafeArray not properly recognized

2010/06/27 00:00 GMT-5   Wayne Halsdorf
* Added const as modifier to variable types
*   Example:
*     dim cspA AS CONST CHAR PTR
*   translates to
*     static const char    *cspA;

2010/06/21 00:00 GMT-5   Wayne Halsdorf
* Return type changes
*   InitSafeArray changed to a HRESULT
*   DestroySafeArray changed to a HRESULT
* Moved inline c test (!lineofcode) to right after
*   line input block.
*   This results in no testing being performed on inline c

2010/06/15 00:00 GMT-5   Wayne Halsdorf
* Added code for SafeArrays
*   InitSafeArray(safearrayptr, variabletype, dims, lowerbound1, numberofelements1, lowerbound2, numberofelements2, ...)
*   ArrayPutElement(safearrayptr,Variant, dims, dim1, ...)
*   ArrayGetElement(safearrayptr,Variant, dims, dim1, ...)
*   DestroySafeArray(safearrayptr)
* Added BEGINBLOCK/ENDBLOCK to BCX Lexicon to allow allocated varibles limited scope
* Fixed LPWORD lpwAlign (LPWORD lpIn) so that it is no longer compiler dependent when compiling
*   for either 32/64 bit targets
*
* Armando Rivera's Fix for
*   Correction to "insertmenu"
* Kevin's Modification MINGW64
*        $ELSEIF __MINGW64__
*          PRINT "MinGW64 C"

2010/05/30 16:00 GMT-5   Wayne Halsdorf
* Added LCASE, MCASE and UCASE as to appear in the SET command as function pointers
*  see MSG #40585
* Added BCX_GET_COM_STATUS(&oOBJECT) returns TRUE if active else FALSE (comes in handy when debugging)

2010/05/27 16:00 GMT-5   Wayne Halsdorf
* Added translation of ASC("?") back into set command, along with several others OR/BOR AND/BAND BNOT

2010/05/10 16:00 GMT-5   Wayne Halsdorf
* Fixed - $NOWIN misses one include file: #include <commdlg.h>
*   as per JCFuller.
* Increased limit of maximum number of prototypes and added code
*   to check if limit is exceeded
* Added BCX_VERSION$ to BCX so you can put the version
*   used to translate into your program

2010/03/17 16:00 GMT-5   Wayne Halsdorf
* Changed the length of the allocated string in STR$ from 16 to 24
*   when scientific notation is emitted it exceeds 16 characters
* Fixed $class/$endclass to emit correct code
* Added code to allow METHOD sub/function code generation
*   function CLASSNAME::METHOD()
*     'code here
*   end function
* Fixed bug in DATA statement

2010/02/25 18:00 GMT-8   Robert Wishlaw
* Published BCX 6.0.3

2010/02/24  00:00 GMT-8 - Robert Wishlaw
 *** Rewrote the MakeLCaseTbl procedure to remove compiler dependent casts.
 *** Changed the MakeLCaseTbl procedure to run once, when the application using it
     is started, instead of it being called repeatedly from the loops of dependent procedures.
 *** Removed the redundant MakeLCaseTbl calls from the _stristr_ and Hex2Dec functions.

2009/12/10 00:00 GMT-8 - Robert Wishlaw
* Added an optional FillType parameter to the BCX_FLOODFILL function to allow the flooding
  of an area which is contained by a multicoloured boundary. This is an extension to the
  existing BCX_FLOODFILL wrapper of theWindows GDI ExtFloodFill function. For more detail
  see the documentation for the FLOODFILLSURFACE value of the fuFillType parameter
  of the Microsoft Windows GDI ExtFloodFill function.

2009/12/03 14:00 GMT-5   Wayne Halsdorf
* Added code to allow global declarations of OBJECTs in sub/function
* Moved enum output to before const output to allow use of enum values in other output
  types such as const
* Made changes to the SET command to allow the following
  SET psX[] as PCHAR
    "this \"is a test\"",
    "hurray"
  END SET

2009/11/03 03:00 GMT-8   Robert Wishlaw
* Published BCX 6.0.1

2009/10/25 00:00 GMT-8   Robert Wishlaw
* Added HKEY_CURRENT_USER registry section entries for BCXPATH$.

2009/08/20 00:00 GMT-8   Robert Wishlaw
* Revised SUB EmitCmdLineConst and moved the call in order
  to emit the command line defines before any other code
  to provide for use of those defines within any subsequent headers
  or code. This change allows, for example, -D:_WIN32_WINNT=0x0500
  to be defined on the BCX command line and, in the translated C source code,
  to have the defines positioned before the included header files.
  Such placement is required, for example, for compilation of the
  translated BCX Gui demo Rebar.bas with the Pelle's C compiler.
* Removed unreachable "return 0" from KEYPRESS procedure.

2009/08/02 02:08 GMT-8   Robert Wishlaw
* Moved the call to CheckParQuotes to immediately after the ReProcess: label.
* Changed line 27380 from
  CASE vt_STRVAR
  to
  CASE vt_STRVAR, vt_CHAR

2009/06/02 05:00 GMT-5   Mike Henning
* Changed version to 6.00 as requested by Robert Wishlaw.
* Fixed a naming conflict with the new BCX_Dynacall when used as a return value.

2009/04/27 05:00 GMT-5   Mike Henning
* Merged my changes with Waynes
* New changes include handling of FREE and FREE DYNAMIC.
* DYNAMIC is ignored now relying on free to choose the appropriate method.
* The behavior should be the same now with or without parenthesis.
* Fixed some bugs in the SET statement handling - Variables were not being
* added or recognized properly.
* Fixed the output when using $TRACE
* Some bad code in BCX_PREPARE_COM_TRACE_LINE
* Added a variation of BCX_DynaCall for easier runtime execution of functions
  not known at compile time.
  BCX_DynaCall("Dll_Name", "Function_Name", NumberOFArgs, ArgArray)

2009/03/12 05:00 GMT-5   Wayne Halsdorf
* Reformatted some of the code
* Added some addition tests for invalid type combinations in COM
* Added additional return types to COM
* Applied Robert Wishlaw's reformating of code

2009/02/12 05:00 GMT-5   Wayne Halsdorf
* Finished correcting all the bugs that I'm aware off in the COM section.
* To DO: 1. Reformat code (anyone up for this)
*        2. Add code to handle all variant types. (much easier to do now)
*        3. Put together a collection of COM examples to serve as a test base.
*        4. Inform Robert as to changes in COM that differ from currently in help file.

2009/01/27 05:00 GMT-5   Wayne Halsdorf
* Start of modification of COM routines to be able to handle arrays of OBJECTs.
* Note: Not every posible combination has been tried.
*       I use a modified version of BCX where I test out various ideas to improve
*       the performance and the expandablity of BCX. This version contains
*       some of those modifications to make it easier to modify changes in
*       the COM routines. Some can be easily added to the current version of BCX.
* Added internal FUNCTIONS FindWord & GetWordInfo to lookup various words
*       and return information on type.
*       The function FindWord uses a binary searcg method, with GetWordInfo
*       using a modified version, resulting in a maximum
*       lookup attempts (for x number words) equal to LOG(x)/LOG(2)
*
2009/01/27 00:00 GMT-5    Mike Henning
* Fixed a bug in the BCX_SETCOLOR function that would cause many color
  combinations to not show transparent correctly.


2009/01/24 11:00 GMT-7    Kevin Diggins
* Found and removed more unused global variables
* Minor text editing

2009/01/23 05:00 GMT-7    Kevin Diggins
* Found and removed more unused global variables
* Found and removed commented, deprecated code fragments
* Minor text editing and formatting

2009/01/21 05:00 GMT-5    Wayne Halsdorf
* Fixed bug in OPTIONAL (introduced in last fix of OPTIONAL) was adding phantom varible
* Fixed BCX_SETCOLOR when 3 parameters supplied

2009/01/19 05:00 GMT-7    Kevin Diggins
* Reformatting & general text editing of this document for easier reading
* Removed StkTmp$[] & related dead code
* Removed Xport$ related dead code
* Removed CObjectTest related dead code
* Removed LinesWritten dead function
* Removed CompStructVars dead function
* Removed Obsolete switches
* Replace FUNCTION BraceCount with new version by Mike Henning


2009/01/16 00:00 GMT-5    Wayne Halsdorf
* Fixed joining of strings detection routine
* 1. handle arrays of structures with string elements - structure[i].string$ , structure[i]->string$
* 2. handle dereference of pointer to structure with string element (*structure).string$
* Fixed bug in OPTIONAL. Example:  a=1 as int  would output wrong code for prototype
* Added code to SET/END SET so that the translator knows what type it is.

01/10/2009 00:00 GMT-5    Mike Henning
* Fixed the Descending dynamic string in qsort
* Added Kevins fixes for the COM functions
* Fixed the handling of the image index for BCX_TOOLBAR
* Removed a couple of function returns that were not needed giving
* "code can not be reached" compiler warnings.
* Added "return" to be sensed when removing dead callback code.
* Increased the buffers in USING$ from 100 to 512

2008/10/08 00:00 GMT-5    Wayne Halsdorf
* Fixed bug introduced in FREE when it was exteneded
* Fixed bug in type detection in CheckGlobal and CheckLocal

2008/10/07 00:00 GMT-5    Wayne Halsorf
* Fixed bug in SWAP when dealing with undefined typed
* Fixed internal bug for getting information from GetTypeInfo when
*   _CLASS is appended to structure type
* Extened usage of DYNAMIC and FREE to include use in structures

2008/08/22 00:00 GMT-5 -  Wayne Halsdorf
* fixed bug in getprocaddress
* fixed on ... goto,gosub,call so that the argument can be of the form (x BAND 7)
* Fixed obscure bug in SplitLines FUNCTION involving parentheses
* SWAP - Changed char to byte for safer swapping based on size
*      - Can now handle dynamic strings
* Rolled chdir, _chdir, rmdir, _rmdir, mkdir, _mkdir into one operation

2008/07/08 00:00 GMT-8 -  Robert Wishlaw
* Replaced instances of while(1) with for(;;)

2008/07/08 00:00 GMT-8 -  Wayne Halsdorf
* Modified TALLY Function to accept an optional case insensitivity argument.

2008/05/28 19:00 GMT-8 -  Wayne Halsdorf
* Modified CONTAINEDIN Function to work with Borland compiler.

2008/05/26 20:00 GMT-8 -  Wayne Halsdorf
* Revised IncludeCount value to 29 to accomodate process.h header file.

2008/05/25 19:00 GMT-8 -  Wayne Halsdorf
* Repaired WITH ... END WITH bug

2007/02/23 15:45PM GMT-8 - Mike Henning
* Fixed the SAVEBMP function.

03/03/2006 [5.09] Robert Wishlaw added an optional argument to BCX_LISTVIEW
                  allowing the number of columns to be specified.
                  Robert Wishlaw changed several instances of BOOL types to
                  INTEGER to avoid conflict with C99 compliance.

                  Kevin Diggins added the macros BCX_OLE_WIDTH(HWND) and
                  BCX_OLE_HEIGHT(HWND) to be used with the BCX_OLEPICTURE control.
                  The values returned are the original bitmap dimensions.

                  Vic McClung added a missing gpPicture->Release to BCX_OLEPICTURE
                  fixing a memory leak.

                  Changed CINT from a macro to a function.
                  Modified SET_BCX_BITMAP to allow an optional size to be specified.
                  Syntax: SET_BCX_BITMAP( HWND, Filename$, Res%, W%, H%)
                  Changed the pitch argument in Bcx_Set_font to type float to
                  allow fractional pitches.
                  Changed the way DECLARE and C_DECLARE are handled. They both
                  emit the same exact code now except DECLARE will use STDCALL
                  calling convention and C_DECLARE will use CDECL calling convention.

                  Vic McClung Added the -h command line switch to create the header
                  file for use with $Project. When the -h switch is used the file
                  is created with the extension of .bh for bcx header.
                  Modified FPRINT to allow use of stderr as the file handle as in:
                  FPRINT stderr, "An error has occured", in order to be able to
                  send formatted output to the stderr.

                  Kevin Diggins added Set_Bcx_Bitmap2 to the runtime.
                  Syntax: Ret = Set_Bcx_Bitmap2 (HWND , HBitmap, delete%=TRUE)
                          Ret = previous bitmap handle if delete = FALSE

                  Increased the number of allowed Declarations from 256 to 800.

                  Vic McClung modified the BCX GUI Implementation to add
                  GUI NOMAIN and MDIGUI NOMAIN keywords. These prevent BCX
                  from emitting the winmain function just as $NOMAIN does
                  with non-gui code.

                  Vic McClung Added:
                  HANDLE_MSG Macro, it has two possible uses:
                  Handle_Msg( Message, procedure, LReturn ) where Message is
                  the windows message and procedure is the procedure to call
                  if Msg = Message. LReturn is the option value you can pass
                  to make the procedure return it as you desire to control the
                  return value.  If you do not specify a return value then the
                  value returned by the procedure will be ignored.  If you want
                  to use the returned value but want it to be determined by the
                  procedure then specify any return value and then have the
                  procedure return any value you want.
                  Here is an example of the macro and procedure:
                  Handle_Msg( WM_CREATE, form1_OnCreate[,0]) translates to:
                  IF Msg = WM_CREATE THEN
                     form1_OnCreate( hWnd, wParam, lParam, 0 )
                  END IF
                  To handle the above you can use the MsgHandler Macro:
                  MSGHANDLER form1_OnCreate()
                     ' your code goes here
                     LRETURN = SendMessage(hWnd, WM_CLOSE, 0,0)
                  END HANDLER
                  Translates to:
                  Function form1_OnCreate( hWnd, wParam, lParam, LReturn ) AS LONG
                     ' your code goes here
                     LRETURN = SendMessage(hWnd, WM_CLOSE, 0, 0)
                     FUNCTION=LReturn
                     END FUNCTION
                  The second use is:
                  Handle_msg Message INLINE "SendMessage(hWnd, WM_CLOSE,0,0)
                  : EXIT FUNCTION" translates to:
                  IF Msg = Message THEN
                    SendMessage(hWnd,WM_CLOSE,0,0)
                    EXIT FUNCTION
                  END IF
                  The second form of the macro is much simpler to use if you
                  only have a single line of code. If you have more code then
                  use the first form. Notice the "INLINE" keyword.
                  -------------------------------------------------------------
                  Added HANDLE_CMD Macro, it is similiar to the Handle_Msg macro
                  and has two forms also:
                  Handle_Cmd( ID, procedure, LReturn ) where ID is the ID of the
                  item, control, or accelerator identifier.
                  Here is an example of this:
                  Handle_Cmd( IDM_NEW, OnNewClick[,0] ) translates to:
                  IF Msg=WM_COMMAND AND CBCTL = IDM_NEW THEN
                    OnNewClick(hWnd, wParam, lParam, 0 )
                  END IF
                  As above use the MSGHANDLER:
                  MSGHANDLER OnNewClick()
                    'your code
                  END HANDLER
                  Added MSGHANDLER/CMDHANDLER AND END HANDLER macros to simplify
                  GUI Event programming:
                  MSGHANDLER procedure is translated to:
                  FUNCTION procedure( hWnd, wParam, lParam, LReturn )
                  END HANDLER is translated to:
                  FUNCTION = LReturn
                  END FUNCTION
                  Note that MSGHANDLER And CMDHANDLER are interchangeable and
                  both result in the same code being emitted. All of the above
                  macros are case insensitive.
                  -------------------------------------------------------------
                  Added ShowModal( form ) and EndModal( form ).  These macros
                  must be used together and can only be used with BCX_Wnd windows
                  which have another window as its parent. These macros are used
                  in place of Show(form) and cause the parent window to be
                  disabled when the owned form is opened and endabled when the
                  child form is closed.  This results in a modal window.
                  -------------------------------------------------------------
                  Added NOMAIN keyword to GUI and MDIGUI Keywords:
                  GUI NOMAIN PIXELS, ICON, 123 or
                  GUIMDI NOMAIN PIXELS, ICON, 123
                  Adding the NOMAIN keyword causes BCX to not emit the winmain
                  function and registration of the window class normally named
                  after the GUI/GUIMDI keywords.  Using the new BCX_Wnd and
                  BCX_FrameWnd windows will automatically create a new class
                  and register it and use the windows procedure named in the
                  functions.
                  -------------------------------------------------------------
                  Added BCX_Wnd function:
                  hWnd =
                  BCX_Wnd OPTIONAL( classname$, wndproc AS WNDPROC, caption$, _
                  hParent AS HWND = 0, left AS INTEGER = CW_USEDEFAULT, _
                  top% = CW_USEDEFAUTL, width% = CW_USEDEFAULT, _
                  height% = CW_USEDEFAULT, style% = 0, exstyle% = 0, id% = 0 ) AS HWND
                  -------------------------------------------------------------
                  Added BCX_FrameWnd Function:
                  hWnd =
                  BCX_FrameWnd OPTIONAL ( classname$, wndproc AS WNDPROC, caption$, _
                  hMenu AS HMENU=NULL, menuPos% = 0, left% = CW_USEDEFAULT, _
                  top% = CW_USEDEFAUTLT, width% = CW_USEDEFAULT, height% = CW_USEDEFAULT, _
                  style% = 0, exstyle% = 0 ) AS HWND
                  -------------------------------------------------------------
                  Two new Global variables have been added:
                  BCX_WndClass and BCX_GUI_Init.
                  BCX_WndClass is a global WNDCLASSEX structure that is used by
                  the new GUI procedures to create new windows classes and
                  registering them with BCX_RegWnd procedure. A procedure called
                  BCX_InitGUI() sets up a default BCX_WndClass for registering
                  new window classes and some other procedures allow this class
                  to be modified before or after it is registered.  It also sets
                  BCX_GUI_Init to TRUE, indicating that the procedure has been
                  run and it will exit without doing anything next time it is
                  called. BCX_RegWnd checks to see if a window class of the name
                  being registered has already been used and if so does not
                  register it again.
                  -------------------------------------------------------------
                  Added the following functions:

                  BCX_SetMetric (metric$) sets either pixels or dlgunits can be
                  either "pixels" or "dlgUnits" (not case sensitive)
                  BCX_SetBkGrdBrush (hWnd AS HWND, hBrush AS HBRUSH)
                   Sets the background brush.
                  BCX_SetClassStyle (hWnd AS HWND, nStyle AS long)
                   Sets the class style.
                  BCX_SetIcon (hWnd AS HWND, Icon AS int) sets the Icon
                  BCX_SetIconSm (hWnd AS HWND, SmIcon AS int) sets the small Icon
                  BCX_SetCursor (hWnd AS HWND, char *) sets the cursor
                  BCX_MsgPump OPTIONAL (HACCEL=0) is the message pump to use with
                  non-MDI gui programs.
                  BCX_MDI_MsgPump OPTIONAL ( HACCEL=0) is the MDI message pump.
                  BCX_InitGUI() see description above.
                  BCX_RegWnd OPTIONAL ( classname$, WndProc AS WNDPROC = NULL )
                  Registers a window class. If WndProc is NULL then it
                  Unregisters classname$.
                  -------------------------------------------------------------
                  Changed BCX_MDICHILD to have left,top,widht,height parameters
                  defaulting to CW_USEDEFAULT in order to be able to set window
                  location, size.
                  Also added style parameter defaulting to 0 in order to be able
                  to create MDI Child windows with one of the specified styles.
                  These should not interfere with old code.  Makes possible some
                  serious MDI coding.

-------------------------------------------------------------------------------
10/01/2005 [5.08] Added support to CBOOL to allow string expressions.
                  example: A = CBOOL("A" = "B")
                  Rewrote STRIM as one simple function.
                  Rewrote the Remove$ and Retain$ runtime to be simpler and faster.
                  Rewrote the MID statement as one function and fixed a potential
                  bug that would write past the existing string length.
                  Syntax 1: Mid$(A$,5)   = B$
                  ' Copy the contents of B$ to A$ starting at the 5th character.
                  Syntax 2: Mid$(A$,5,4) = B$
                  ' Copy only the first 4 characters of B$ to A$ starting at the
                    5th character in A$.
                  Added the internal runtime StrStr to replace the 'C' version
                  that is currently used by several of the BCX runtime functions.
                  With the exception of PellesC, the new StrStr function gives
                  a tremendous speed boost when working with large strings.
                  As an example of the performance increase:
                  DIM T#
                  DIM A$ * LOF("bc.bas")
                  DIM B$ * LOF("bc.bas")
                  A$ = LOADFILE$("bc.bas")
                  T# = TIMER()
                  REPEAT 10
                  B$ = A$
                  REPLACE "FPRINT" WITH "FOO" IN B$
                  ' or
                  ' REMOVE "FPRINT" FROM B$
                  ' will give similar results
                  END REPEAT
                  PRINT "Time to replace = ", TIMER() - T#
                  PAUSE
                  Before: 59 - 82 seconds
                  After : 300 - 400 milliseconds!

                  Changed the BCX_Splitter implementation to allow changing the
                  FG & BG color of the splitter bar by way of the global variables
                  SplitBarFG and SplitBarBG. The new splitter bar drawing
                  routine is based on code from James Brown.

                  Bug Fix - reported by Robert Wishlaw.
                  When defining a CONST without an equal sign the #define was
                  not being emitted.

-------------------------------------------------------------------------------
09/18/2005 [5.07] Mike Henning added the new runtime functions:
                  SysStr, BCOPY, BCX_RemTab, BCX_AddTab, BCX_TabSelect

                  SysStr(cstring [,wide,free]) -
                  cstring - Any BCX/C string i.e SysStr(a$), SysStr("Hello World")
                  wide    - TRUE will return a wide string
                  free    - TRUE will free any remaining strings still allocated
                  SysStr("", 0, TRUE) should be called at the end of your program
                  to free up any strings still allocated.

                  BCOPY - BCOPY variable1 TO variable2

                  Mike Henning changed the runtime functions:
                    BCX_COLORDLG - BCX_COLORDLG (DefaultColor, HWND)
                    BCX_FONTDLG  - BCX_FONTDLG  (UseBcxFont  , HWND)
                    GETFILENAME  - added optional argument to allow a default
                                   filename to be specified.
                    BCX_STATUS   - added two optional arguments to allow
                                   multiparts to be specified.
                                   BCX_STATUS(text$, HWND, ID, Num Parts, PartsArray)
                    PLAYWAV      - added an optional argument to allow the sound
                                   attributes to be specified.

                  When declaring a STDCALL function, the ALIAS will default to
                  the uppercase name of the function if no alias is given.

                  Fixed a bug reported by Ryan with BCX_MDICLIENT not getting
                  initialized correctly causing the first window in the menu
                  to never show a checked state.

                  Fixed a bug in SET_BCX_ICON, SET_BCX_BITMAP and SET_BCX_BMPBUTTON
                  that was causing the wrong object to be destroyed in most cases.

                  Applied Ian Caseys bug fix to the "RUN" function that was causing
                  the function to never return if the called program was a GUI and
                  waitstate was specified.

                  Kevin Diggins added the new directive:
                  $FILETEST ON/OFF to suppress automatic failure checking when
                  using OPEN and CLOSE statements.
                  Kevin Diggins rewrote the FILELOCKED function to be more reliable.

                  Robert Wishlaw rewrote the BCX_ICON module to allow animated
                  cursors to be loaded from a resource file. The modifications
                  also allow the size of the icon to be adjusted to the size
                  given in the Width and Height arguments.
                  I extended these changes to SET_BCX_ICON and added two optional
                  arguments (W & H) to allow the icon size to be specified here also.

..............................................................................
04/04/2005 [5.06] More big changes!

                  Vic McClung made the following changes:
                  Added code to call OleUninitialize() when COM program exits.
                  Added code to allow bcx.ini to be used from curdir$ if found.
                  Haven't had time to test completely.
                  Added code to allow static sub/function to be coded as:
                  private function myfunction() as integer
                  private sub mysub()
                  instead of using the $fsstatic directives, more basic like?
                  Here is list of all temporary directives for C++ class work:
                  $class/$endclass
                  $namespace/$endnamespace
                  $usenamespace
                  $try
                  $throw
                  $catch
                  $endtry
                  I won't go into much detail on them as they will probably be
                  changing and disappearing.
                  Added code inside $if/$endif to run the bcxpp.exe external preprocessor.
                  I will leave this un-defined so no one will have problems building
                  BC.EXE until I have something to show.

                  Ljubisa Knezevic made the following changes:
                  Added (with - end with) to COM support.
                  Added new function GetObject to the COM parser
                  Another feature added to GetObject functions. See samples of use:
                  1. set serv = GetObject("c:\test.doc")
                     Can create an object based on document extension.
                  2. set serv = GetObject("winmgmts://./root/cimv2")
                     Can resolve displaynames and create correct object.

                  Added directives $MULTITHREADED or $MT
                  Currently only used to initialize the COM library in multithreaded
                  mode but will later be used for multithread support in general.

                  Added new switch to BCX (-u) which emits _UNICODE AND UNICODE macros
                  before any Windows header. This is required for full support of
                  BCX COM functions when UNICODE is defined.

                  Added  <For Each ...> constructions to COM support.
                  Sample:
                  rs.Open "Select * from comment", conn
                  For each x in rs.Fields ' <-- enumerates fields in table.
                    temp_line2$ = x.name
                  Next

                  Kevin Diggins replaced RND and RANDOMIZE functions with the
                  C standard srand/rand.
                  Kevin Diggins changed the default font for INFOBOX to Courier.

                  Mike Henning made the following changes:
                  Single line comments are no longer output to the C file.
                  "$comment" blocks still emit to the C file to provide a way
                  to force comments if desired.
                  Module/Line number reporting is now the default.

                  Added new runtime function FindInType
                  Syntax: RetVal = FindInType(match$,type.element, from, to, _
                                             [returntype], [index])

                  Reworked CLNG to give the same results as VisualBasic.

                  Added support for Modal and Non Modal Dialogs
                  BCX_DIALOG  - Non Modal
                  BCX_MDIALOG - Modal
                  (EventName, title$, Parent HWND, X, Y, W, H, _
                   Style, ExtStyle, Fontname$, point size)

                  New event shortcuts added:
                  BEGIN DIALOG AS xxx
                  BEGIN MODAL DIALOG AS xxx
                  ...
                  END DIALOG
                  Added the keyword: CloseDialog
                  This should only be used in a BEGIN [MODAL] DIALOG event.

                  Added the runtime function SetDialogScale.
                  This will automatically be emitted after a WM_INITDIALOG
                  in a BEGIN DIALOG Event. This will keep the Dialogs in sync
                  with the controls when 'Pixels' is used.
                  When BCX_MDialog is detected within the WinMain function the following
                  globals will be defined: BCX_hInstance, BCX_ScaleX and BCX_ScaleY
                  In addition to this 'BCX_hInstance = hinst' will be emitted immediately
                  before the first occurrence of BCX_MDialog.
                  This will allow Dialog based apps to be setup as:
                  FUNCTION WinMain
                    FUNCTION = BCX_MDialog(...)
                  END FUNCTION

                  Added the Global variable BCXFONT to allow the default font to be changed.
                  Any BCX controls created will use the font currently assigned to BCXFONT.

                  Added the new runtime function GetTextSize.

                  Syntax:  psize = GetTextSize(Text$,[HWND, HFONT])

                  psize - SIZE PTR accessed as size->cx & size->cy
                  Text$ - The text to obtain the size of.
                  HWND  - An optional window handle to obtain a font handle from
                          for calculating the text size.
                  HFONT - An optional font handle to use for calculating the text size.
                  GetTextSize is called automatically by the functions:
                  BCX_BUTTON, BCX_RADIO, BCX_CHECKBOX, BCX_LABEL, and BCX_SLIDER

                  Changed BCX_ScaleX & BCX_ScaleY from type integer to float.

                  Added support to emit a .def file when translating a STDCALL DLL for C++.

                  Changed PlayWav to use direct calls instead of Dynacall.
                  Also added is an optional resource argument. PlayWav("",res_id)
                  The resource file (.rc) should be setup as: res_id RCDATA "filename.wav"
                  RCDATA is used because out of the 7 compilers LCC is the only one that
                  does not support the native WAVE format.

                  Changes made to BCX_TOOLBAR:
                  An Imagelist can now be used for button images.
                  This is detected automatically. This makes using highcolor images
                  easier to use and allows using an imagelist with any number of images.
                  Using a bimap- # of images should equal # of buttons
                  Using a imagelist- # of images in list can be greater than # of buttons
                  Loading a list is easy as:
                  CONST GetImageListFile(A,B) = ImageList_LoadImage(NULL,A,B,0, _
                  RGB(255,0,255),IMAGE_BITMAP,LR_CREATEDIBSECTION|LR_LOADFROMFILE)

                  The RGB value is what ever color you want to be transparent.
                  DIM RAW Imlist AS HIMAGELIST
                  Imlist = GetImageListFile("FileName.bmp",32) '32 = width of each image

                  To make it easier to place separators in a toolbar that only
                  contain bitmaps you can insert a minus sign as te first character
                  to suppress the text labels but still insert separators.
                  example: a$ = "-open|save||new||exit"
                  Exposed Set_Color to the user as BCX_SETCOLOR(fg,bg[,HDC,HWND])
                  wParam & lParam will automatically be added if only the fg & bg
                  color is given.
                  SELECT CASE Msg
                  CASE WM_CTLCOLORLISTBOX
                  FUNCTION = BCX_SETCOLOR(0,RGB(214,225,255))
                  Emits as:
                  return Set_Color(0,RGB(214,225,255),wParam,lParam);

                  Added 2 optional Boolean arguments to LISTBOXLOADFILE
                  LISTBOXLOADFILE(HWND,FileName$[,Append, HScrollAdj])
                  Append     = TRUE will append the file to the existing list.
                  HScrollAdj = TRUE will auto adjust the Horizontal scroll to the contents.
                  Oddly enough this isn't handled for you by Windows as it is
                  for most other controls.
                  Also note that ModStyle does not work to change styles for ListBox controls?
                  Fixed the EOF bug in both LISTBOXLOADFILE and COMBOBOXLOADFILE that
                  would cause the last line to be duplicated if the last line in the
                  file was a cr/lf.

..............................................................................
11/17/2004 [5.05] Major changes!
                  Vic McClung reworked the whole system to provide better
                  compatibility with multiple C/C++ compilers. #ifdef's are
                  produced now for various compilers instead of directly
                  coding different compiler specific constructions.
                  Added new command line option -p- Will allow you turn off
                  use_pelles when using -c for CPP, which turns on use_pelles.
                  Added the ability to specify multiple defines in the command line.
                  i.e.  bc test -D:__POCC__ -D:__BCPLUSPLUS -d:OLESUPPORT
                  Added two new functions:  BCX_StartupCode_()
                                            BCX_ExitCode_()
                  Vic's COM support code has been replaced by Ljubisa's code
                  Ljubisa Knezevic added new VB style COM support to BCX.
                  COM functions added: BCX_COM_ERROR , BCX_GET_COM_SUCCESS
                                       BCX_GET_COM_ERROR_DESC
                                       BCX_GET_COM_ERROR_CODE
                                       BCX_SHOW_COM_ERRORS
                                       SET  i.e. SET app = Nothing
                                       CreateObject(string$)
                                       Bcx_Ole_Uninitialize()
                                       Array(string$)
                                       BCX_DispatchObject(Object,BOOL)
                 Mike H. added two new controls: BCX_TAB and BCX_SLIDER
                 Usage and example of these new functions can be found in the
                 Yahoo group file section. BcxTabDemo.bas
                 Added a new $Turbo directive allowing the number of temporary
                 string buffers that BCX uses to be changed. Default is 512
                 This can provide a significant performance increase.
                 NOTE WELL! Safe programming practices need to be given special
                 attention here. Consider this:
                    $TURBO 256 or specified on the command line as -t:256
                    CALL CheckMatch(STR$(i))
                    SUB CheckMatch(Mystr$)
                    FOR c = 1 to 500
                    'After 256 iterations Mystr$ will no longer be valid
                     because the LEFT$ function would overwrite it.
                     IF Mystr$ = Left$(Matchstr$[c],5) THEN Do something
                    NEXT
                    END SUB
                    The proper way would be written as:
                    Dim Tempstr$ : Tempstr$ = STR$(i)
                    Call CheckMatch(Tempstr$)
                    Written this way you only need 1 versus 501 temp buffers
                 Added support for the Not operator in CASE statements
                 i.e - CASE <> A
                 Added SELECT CASE BAND. Suppresses breaks between CASE
                 statements and performs a binary AND on all CASE statements.
                 Fixed a SET statement bug causing a non-string SET that was
                 followed by a SET using a string to be translated as an array
                 of 2048.
..............................................................................
11/08/2004 [5.04] Added the GPL License agreement to the source code.
                  Mike H. Modified the Set_Color function used by
                  BCX_SET_LABEL_COLOR. The background color of the parent
                  form will be used if a -1 value is entered.
                  example: BCX_SET_LABEL_COLOR(hWnd,RGB(255,0,0),-1)
                  Mike H. modified the CASE parsing. This is a start to removing
                  some of the argument type limitations. You should now be able
                  to use arrays, functions and variations of variables that
                  contain the dereferencing operator (->).
                  example: Case A[1] TO A[9]
                           Case foo->f,foo->g
                           case Funcfoo(A[foo->f],"nada"), foo->g
                           Case > foo->f AND < Funfoo(A[1])

..............................................................................
11/03/2004 [5.03] BUG FIX: Mike H. changed previous fix to CompStructVars Sub
                  to account for arrays with unknown index variable types that
                  are also part of a UDT. i.e.   foo[xx].xxx foo[xx]->xxx
                  Added REFRESH(hWnd) Macro, this should work in places that
                  previously required a Hide/Show combination.
                  BUG FIX: Mike H. fixed parsing bug when an unknown data type
                  is used as an argument to a For/Next loop.

..............................................................................
10/31/2004 [5.02] Vic McClung added support for comments embedded in ENUM
                  blocks, added new directive $LEANANDMEAN and added more
                  improvements to COM support.
                  Ljubisa Knezevic added Parentheses() to HEX2DEC function
                  Mike H. added new Splitter control functions:
                  BCX_Splitter and BCX_SetSplitPos (see BcxSplitterDemo.bas)
                  Removed Global variable BCXPROTO (no longer used for DLL)
                  Removed dead code from ListView

..............................................................................
10/15/2004 [5.01] Robert Wishlaw made several fixes to the VBS code to work
                  with PellesC.
                  Emil Halim removed the optimize pragmas from assembler output
                  when translating for C++.
                  BUG FIX: Mike H. fixed bug with the COM support causing
                  the API "Release" to be substituted with BCX's "OleRelease"
                  BUG FIX: Mike H. fixed a bug in the $pack directive, an
                  extra CRLF was being added that would prevent PellesC
                  from being able to parse the file properly.
                  Mike H. moved Dll declarations to the prototypes section

..............................................................................
10/12/2004 [5.00] First official user managed release.
10/11/2004 [5.00] LJUBISA KNEZEVIC and Andreas Guenther added support
                  for C++ declarations

10/10/2004 [5.00] BUG FIX:  Mike H. fixed problem in CompStructVars Sub
                  Causing a bad translation when an array and it's index
                  are both unknown datatypes.
                  Removed dead code from SaveBmp
                  Removed dead code from the Scan runtime
                  Removed obsolete code "kludge for pellesC Dlls"
                  Added LONGLONG to be case insensitive

10/05/2004 [5.00] Andreas Guenther added 35 type casts to GUI functions
                  to better support C++ Compilers.
                  The affected BCX functions are:
                  BCX_PSET, BCX_FLOODFILL, BCX_LINE, BCX_LINETO,
                  BCX_POLYGON, BCX_POLYBEZIER, BCX_POLYLINE,
                  BCX_CIRCLE, BCX_ELLIPSE, BCX_RECTANGLE,
                  BCX_ROUNDRECT, BCX_GET, DRAWTRANSBMP, PRINTER OPEN
                  For the Function BCX_GET the variable <RetBMP> is changed
                  from HGDIOBJ to HBITMAP.

..............................................................................
..............................................................................
07/25/2004 [4.76] BUG FIX:  Garvan pointed out problem with CREATEREGSTRING
..............................................................................
07/25/2004 [4.75] Reverted EOF function back to 4.60 version (Thanks Garvan!)
07/23/2004 [4.75] This is Vic McClung's 2.75 Beta 2 w/ Mike's STRIM$ fix
07/23/2004 [4.75] Mike Henning fixed problem with STRIM$ runtime
..............................................................................
07/12/2004 [4.74] BUG FIX: Wayne Halsdorf fixed problem with REDIM command
07/11/2004 [4.74] Removed dead code in LoadImage runtime
..............................................................................
07/11/2004 [4.73] Wayne Halsdorf enhanced REDIM -- arrays can be used to resize
07/11/2004 [4.73] Vic McClung added additional OLE/COM support to BCX
07/11/2004 [4.73] Kevin Diggins added BNOT (Boolean not) operator to lexicon
...............................................................................
07/09/2004 [4.72] BUG FIX: Vic McClung fixed problem with $LIBRARY directive
07/06/2004 [4.72] BUG FIX: Added LDOUBLE macro for user's (long doubles)
...............................................................................
07/06/2004 [4.71] BUG FIX: Dynacalls would not allow string vars holding DLL
07/06/2004 [4.71] BUG FIX: Reverted LONG DOUBLE bug fix to 4.68 because it broke
                  CON_DEMO\S155.bas
07/04/2004 [4.71] Based on Vic's 4.71 beta
...............................................................................
06/30/2004 [4.70] MrBcx re-wrote FILELOCKED runtime
...............................................................................
06/29/2004 [4.69] Mike Henning fixed LONG DOUBLE bug
06/29/2004 [4.69] Vic corrected "ltricmp" typo
...............................................................................
06/28/2004 [4.68] Replaced calls to stricmp (crt) with lstrcmpi (kernel32)
...............................................................................
06/27/2004 [4.67] Added conditional _stricmp generation for Pelles C
06/27/2004 [4.67] More tweaks to $PROJECT directive by Vic McClung
...............................................................................
06/27/2004 [4.66] Vic McClung enhanced support for $PROJECT directive handling
                  Now BCX actually creates the makefile and runs the respective
                  make program (pomake.exe or make.exe) to create the library.
                  BCX creates bcxlib.h for the library and bcxRT.h for bcx file
                  include which is automatically included when $Project is used.
                  Both header files are created in pelles or lcc's include
                  directory.  The make file and all .obj files are created in
                  /obj-lcc or /obj-pelles subdirectories.  This is working for
                  both LCC and Pelles.
                  .............................................................
06/21/2004 [4.66] Mike Henning added code allowing 2 modifiers for function
                  names and function modifiers
06/21/2004 [4.66] Ljubisa Knezevic added VBS_ERROR$ function the the lexicon
...............................................................................
06/19/2004 [4.65] Wayne Halsdorf applied small bug fix
06/19/2004 [4.65] Vic added -l, -ll, -lp, -lc command line parameters to BCX.
                  All are used without a source file name: e.g., BC -l
                  -l and -ll both cause BCX to create the file "bcxRT.h" header
                  file and all of the necessary .c file to build the "bcxRT.lib"
                  BCX Run Time Library File. All for use with Lcc-Win32.
                  Likewise, -lp, creates files for use with Pelles C and -lc
                  creates files for use with .cpp or C++ files.

                  Each of these methods creates an 'include' subdirectory in the
                  current directory and stores the 'bcxRT.h' file there.  Also
                  created is a subdirectory for the .c sourc files.  It is named
                  /src-lcc for Lcc-Win32 and /src-Pelles for Pelles and C++.

                  To actually create the run time libraries you must open
                  the respective IDE and follow the instructions for creating
                  a 'static library' using the .h and .c files.
...............................................................................
06/18/2004 [4.64] Merged Vic's 4.63nr with Mike Hennings IDXQSORT modifications
                  along with BYREF Bug Fix by Wayne (Yahoo msg 24974).  Also
                  merged Robert's HMIDISTRM to HMIDIOUT bug fix for PellesC
...............................................................................
06/13/2004 [4.63] BUG FIX: Wayne fixed problem with SHARED string declarations
06/08/2004 [4.63] BUG FIX: Mike Henning fixed problem with WIDETOANSI function
06/08/2004 [4.63] BUG FIX: REGINT not casting correctly for Pelles -- Fix
05/28/2004 [4.63] Mike Johnson made the INSTAT runtime Pelles compatible
05/21/2004 [4.63] Mike Johnson replaced Eof with feof in two runtimes
05/12/2004 [4.63] Mike Henning made VBS_SCRIPT commands Pelles compatible
05/12/2004 [4.63] Wayne Halsdorf enhanced FILLARRAY function
...............................................................................
05/04/2004 [4.62] Robert Wishlaw changed runtime //* comments to  // *
05/04/2004 [4.62] Vernon Blaine added code supporting $PELLES __declspec
05/02/2004 [4.62] Wayne added code allowing function pointers w/OPTIONAL args
...............................................................................
04/09/2004 [4.61] Introduced $PELLES$ and PELLESPATH$ to BCX.  These work
                  similiarly to their counterparts, $LCC$ and LCCPATH$ with
                  the one exception being that BCX must be invoked with the
                  -p switch or the $PELLES directive, in order for $PELLES$
                  to function correctly.
                  .............................................................
04/09/2004 [4.61] Removed EOF runtime. BCX now emits the ANSI feof function
04/09/2004 [4.61] Minor speed tweaks to several runtime functions
...............................................................................
04/07/2004 [4.60] BUG FIX: Robert Wishlaw reported INPUT bug returning zero
04/07/2004 [4.60] BUG FIX: Garvan found bug with FP5 data statement handle
04/07/2004 [4.60] Mike Henning tweaked logic controlling DLL declaration fixups
04/07/2004 [4.60] Added additional test to PellesC DLL declaration fixup
04/06/2004 [4.60] Joe Simpson optimized a portion of the USING$ runtime code
04/03/2004 [4.60] Added NOSORT to the BCX lexicon:  When using BCX_LISTBOX,
                  specifying a style of NOSORT causes the resulting ListBox
                  control to NOT sort its contents. During translation, BCX
                  replaces "NOSORT" with "WS_CHILD|WS_VISIBLE|WS_VSCROLL"
04/03/2004 [4.60] Re-coded the \GUI_DEMO\DragWin\  sample
04/03/2004 [4.60] Re-coded the \GUI_DEMO\Gradient\ sample
03/31/2004 [4.60] $NOLIBMAIN changed to $NODLLMAIN because BCX now emits
                  DllMain instead of LibMain in DLL generation
03/31/2004 [4.60] Removed some unused local variables
...............................................................................
03/30/2004 [4.59] Removed (buggy) undocumented EVENTS detection code
...............................................................................
03/28/2004 [4.58] Created and added new BCX_GET_UPDOWN function to the lexicon.
                  Usage: MyInt = BCX_GET_UPDOWN (hUpDown)
03/28/2004 [4.58] Modified BCX_UPDOWN control to now return the control handle
                  instead of the buddy handle.  To retrieve the value of the
                  BCX_UPDOWN control, use the new BCX_GET_UPDOWN function
................................................................................
03/27/2004 [4.57] Created and added new BCX_UPDOWN control to the lexicon.
                  Usage: hUpDn = BCX_UPDOWN (hWnd, X, Y, W, H, Lo, Hi, [Start])
...............................................................................
03/27/2004 [4.56] Added BCX_BMPWIDTH and BCX_BMPHEIGHT functions to the lexicon
                  Usage: bmw = BCX_BMPWIDTH  (hBmp)  'hBmp is type HBITMAP
                  Usage: bmh = BCX_BMPHEIGHT (hBmp)  'hBmp is type HBITMAP
                  .............................................................
03/26/2004 [4.56] BUG FIX:  Lewis Miller reported a bug occuring when mixing
                  $INCLUDE & $PELLES which emitted too many #pragmas
03/26/2004 [4.56] LOF function now returns a DWORD (up to 4,294,967,295 bytes)
03/26/2004 [4.56] Robert Wishlaw made LOF ming32 compatible
03/24/2004 [4.56] Robert Wishlaw tweaked the RTRIM$ runtime function
03/24/2004 [4.56] Mike Henning and Robert Wishlaw tweaked $LIBRARY for Pelles C
03/23/2004 [4.56] Added (unsigned char) casts to runtime isspace arguments
...............................................................................
03/21/2004 [4.55] Mike Henning make several improvements to the following
                  BCX_LOADIMAGE, BCX_SET_BMPBUTTON, and BCX_BMPBUTTON
...............................................................................
03/20/2004 [4.54] Wayne tweaked Scott Frick's code for VC++ compatibility
03/17/2004 [4.54] Reverted RND to BORN36 runtime for faster execution
03/17/2004 [4.54] Mike Henning added WS_CLIPCHILDREN to the BCX_BITMAP style
03/14/2004 [4.54] Corrected the formatting on several runtimes
...............................................................................
03/14/2004 [4.53] Added some support for STDCALL DLL generation for Pelles C
-------->>>>>>>>  I've kludged the most common function types @ BCX line 1157
-------->>>>>>>>  WARNING! Pelles C decorates all STDCALL exported symbols
03/13/2004 [4.53] BCX now emits DllMain instead of LibMain in DLL generation
03/13/2004 [4.53] Incorporated Scott Frick's VC++ support improvements
03/13/2004 [4.53] Reworked the logic of $CPP and $PELLES directives
................................................................................
03/12/2004 [4.52] Mike Henning & Scott Frick made more tweaks for VC++ compiler
................................................................................
03/11/2004 [4.51] BUG FIX:  Mike Henning corrected the BCX_LOADIMAGE function
03/09/2004 [4.51] The following LIBS are emitted as #pragma's when generating
                  C code for the Pelles Compiler:   delayimp  dxguid  winmm
                  kernel32  user32  gdi32  comctl32 advapi32  winspool
                  shell32   ole32   uuid   odbc32   oleaut32  odbccp32
...............................................................................
03/07/2004 [4.50] Added most of Richard Meyer's LONG DOUBLE support to BCX
                  Added \Con_Demo\S155.Bas to show off new LD features
03/07/2004 [4.50] BCX_PRINT now allows an optional HDC argument
03/07/2004 [4.50] Added Mike Henning's BCX_LOADIMAGE to BCX lexicon
...............................................................................
02/22/2004 [4.49] BUG FIX: Mike Henning fixed problem with internal enum member
02/22/2004 [4.49] BUG FIX: Robert Wishlaw found missing TANL handler in BCX
...............................................................................
02/21/2004 [4.48] Added new datatype to BCX lexicon named LDOUBLE and modified
                  the PRINT statement to support LDOUBLE variables
02/21/2004 [4.48] BCX recogonizes SINL, COSL, TANL, SQRTL, POWL as long doubles
02/16/2004 [4.48] Tom Spiers enhanced BCX_GET, BCX_PUT, and DRAWBMPTRANS modules
...............................................................................
02/04/2004 [4.47] BCX_FONTDLG & BCX_COLORDLG now use internal centering hook
...............................................................................
02/04/2004 [4.46] Collective tweaking of the GETFILENAME$ centering hook
...............................................................................
02/03/2004 [4.45] GETFILENAME$ dialog is now hooked to center on the screen.
...............................................................................
01/31/2004 [4.44] Robert Wishlaw improved TRIM$ function
01/19/2004 [4.44] Wayne fixed error involving complex structures
01/19/2004 [4.44] Luigi Iemma corrected bug with DECLARE parser
...............................................................................
01/16/2004 [4.43] BUG FIX: Re-worked emission of #define _FORCENAMELESSUNION
...............................................................................
01/14/2004 [4.42] #define _FORCENAMELESSUNION automatically emitted for Pelles
01/13/2004 [4.42] Mike Henning tweaked BFF to return "" when action is canceled
01/13/2004 [4.42] Robert corrected several Pelles C optimize directives
01/13/2004 [4.42] Mike H changed GetModuleHandle(0) to GetActiveWindow in BFF.
01/11/2004 [4.42] Minor tweaks and dead code removed from CENTER run-time
01/11/2004 [4.42] Mike Henning and R Wishlaw removed offending line from FINPUT
01/11/2004 [4.42] Cast added to BFF$ runtime for Pelles compatibility
...............................................................................
01/10/2004 [4.41] Extended the CENTER command.  Now takes up to 2 OPTIONAL Args
                  Usage: CENTER (hWnd)                'Center hWnd on screen
                  Usage: CENTER (hWnd, XYhWnd)        'Center hWnd on XYhWnd
                  Usage: CENTER (hWnd, X_hWnd, Y_hWnd)'Center hWnd on 2 hWnds
                  .............................................................
01/08/2004 [4.41] Minor tweak to INPUTBOX$ buttons by R. Wishlaw
01/04/2004 [4.41] BFF$ function now uses the parent instead of the desktop
12/31/2003 [4.41] Wayne tweaked the FINPUT routine
...............................................................................
12/27/2003 [4.40] User Defined Functions can now return UNIONS
...............................................................................
12/25/2003 [4.39] Jacob found memory leak in StrToken runtime. fixed
12/25/2003 [4.39] Added PCHAR to BCX recognized data types
...............................................................................
12/16/2003 [4.38] Pelle-fied NOW$, BIN$, DATE$
12/15/2003 [4.38] Improved LINE INPUT statement handling
12/13/2003 [4.38] Patched BCX to better handle GLOBAL definitions
...............................................................................
12/11/2003 [4.37] Wayne Pelle-fied the REC and LOC functions
12/11/2003 [4.37] Modified $LIBRARY handler to accomodate Pelles format
...............................................................................
12/10/2003 [4.36] BCX now reports whether Lcc or Pelles code was generated
12/10/2003 [4.36] Added itoa runtime function for Pelles compiler users
12/10/2003 [4.36] More tweaks to BFF runtimes to be compatible with Pelles
...............................................................................
12/09/2003 [4.35] Modified internal DialogBox helper to cast(DLGPROC) for Pelles
12/09/2003 [4.35] _chdir, _rmdir, and _mkdir selectively emitted for Pelles C
12/09/2003 [4.35] Tweaked BFF runtimes to be compatible with Pelles
...............................................................................
12/09/2003 [4.34] BUG FIX: Ryan Pusztai reported problem with Pelles $LIBRARY
12/08/2003 [4.34] More tweaks to make BCX compatible with Pelles C
...............................................................................
12/08/2003 [4.33] Added -p cmdline switch -- generate PELLES C compat. code
12/08/2003 [4.33] BUG FIX: Added Pelles C compatible RECCOUNT function
12/08/2003 [4.33] winuser.h added to the list of Win32 header files
...............................................................................
12/07/2003 [4.32] Robert Wishlaw added Pelles aware $LCCPATH handler
12/07/2003 [4.32] memcpy replace with memmove in LTRIM runtime
12/07/2003 [4.32] Added Ole32.Lib to BFF code emission (for CoTaskMemFree)
12/07/2003 [4.32] BUG FIX: Pelles C $LIBRARY code was wrongly emitted
12/07/2003 [4.32] Minor tweaks to the BCXPP FreeLibrary code
...............................................................................
12/07/2003 [4.31] This is the first official release of BCX that attempts to
                  generate code that is compatible with a non-Lcc-Win32
                  compiler system -- namely, Pelles C.  Like Lcc-Win32,
                  Pelles C is a Win32 derivative of the original LCC Compiler
                  by Hanson and Fraser. Unlike Lcc-Win32, Pelles C is totally
                  *FREE* for personal and professional developments.
                  .............................................................
12/07/2003 [4.31] Added $PELLES Directive which controls the emission of many
                  Pelles C compiler specific code.  This directive should be
                  the first command in your source code file and must appear
                  before any BASIC code is translated.  Code translated with
                  this directive selected is not guaranteed to compile or run
                  when used with any other C compiler, including Pelles!
                  .............................................................
12/06/2003 [4.31] Dethbom added CoTaskMemFree(lpIDList) to BFF runtime
12/06/2003 [4.31] *** Removed Winsock2.H from headers that BCX emits and
                  modified \CON_DEMO\S92.bas and \CON_DEMO\S128.bas
12/06/2003 [4.31] USING$ now uses memmove, not memcpy (thanks Robert & Pelle!)
12/05/2003 [4.31] USING$ no longer relies on LCC [extended] sprintf function
...............................................................................
12/03/2003 [4.30] Minor bug fixes to OO system
12/03/2003 [4.30] USING$ no longer relies on LCC xsprintf extension function
...............................................................................
12/02/2003 [4.29] FOR-NEXT loop local variables no longer rely on LCC extensions
12/02/2003 [4.29] REPEAT - END REPEAT no longer rely on LCC extensions
12/01/2003 [4.29] Removed LCC specific For-Next loop extension from BCX.
                  NOTE:  REPEAT-END REPEAT still rely on this extension but
                  is not used internally by the BCX translator.
                  .............................................................
12/01/2003 [4.29] "WITH" handler modified to react appropriately to "THIS"
12/01/2003 [4.29] More (final?) tweaking of BCX's new BYREF implementation
11/30/2003 [4.29] Removed dependence on LCC extensions for BYREF implementation
11/30/2003 [4.29] SUB's can now be included in UDT's, just like functions
                  .......................[ Example ] ..........................
                  TYPE FOO
                     MyVar
                     SUB Process   (This as FOO_CLASS)
                     FUNCTION Calc (This as FOO_CLASS, Arg AS DOUBLE) AS DOUBLE
                  END TYPE
                  .............................................................
11/30/2003 [4.29] BUG FIX:  PAUSE was getting messed up when preceeded by :
11/30/2003 [4.29] Added COLOR_BG and COLOR_FG to BCX lexicon.  These two integer
                  variables contain the current console mode BACKGROUND and
                  FOREGROUND text colors respectively.  These are handy when
                  you want to restore the current colors after modifying them.
                  .............................................................
11/30/2003 [4.29] Renamed a number of internal BCX locals that were shadowing
                  like-named global variables.  Found w/ LCC switch (-shadows)
                  .............................................................
11/30/2003 [4.29] "THIS" is a BCX reserved word.  BCX now automatically
                  changes non-quoted spellings of "THIS" to "This" but, more
                  importantly, BCX automatically changes THIS.Something to
                  This->Something, allowing users to reference UDT members
                  in a BASIC-like way. These changes should work with any
                  ANSI-C compiler - they are not dependent on any LCC extension.
                  This feature helps give BCX some Object-Oriented benefits.
                  ** SEE ** \CON_DEMO\S154.BAS for a working OO example.
                  .............................................................
11/29/2003 [4.29] TYPE enhanced.  BCX now generates a class definition using
                  the UDT's name and places it in #defines section of the
                  resulting C file.  This allows embedded functions to self
                  reference their UDT.  In the example below, BCX will emit
                  #define FOO_CLASS struct _FOO* under User Defined Constants.
                  .............................................................
                  TYPE FOO
                     Marker AS INTEGER
                     FUNCTION TimesX  (This AS FOO_CLASS, X AS LONG) AS LONG
                  END TYPE
                  .............................................................
11/29/2003 [4.29] OK to use FUNCTION = "" now.  BCX replaces "" with NUL$
11/29/2003 [4.29] Added ICC_USEREX_CLASSES allowing ComboBoxEx to be used.
...............................................................................
11/28/2003 [4.28] Applied Wayne's BUG fixes to EmitCode & FileEmitCode
                  .............................................................
11/28/2003 [4.28] REWIND added to BCX lexicon. Usage: REWIND (FP1)
                  Moves a file's read/write pointer to the beginning of the
                  file without the need to close and then re-opening the file
                  Example:       Print the 1st line of "test.txt" 3 times
                           DIM a$
                           OPEN "test.txt" FOR INPUT AS 1
                           FOR INTEGER j = 1 TO 3
                               LINE INPUT 1,a$
                               PRINT a$
                               REWIND(FP1)       '<<< Reset File Pointer
                           NEXT
                           CLOSE
...............................................................................
11/23/2003 [4.27] BUG FIX: Overloaded Functions can now return VARIANT datatype
11/23/2003 [4.27] Fixed several problems with LINE INPUT
...............................................................................
11/22/2003 [4.26] FUNCTION POINTERS can be declared within UDT's thusly:
                  TYPE FOO
                    FUNCTION Squared (A AS SINGLE) AS SINGLE
                  END TYPE
11/22/2003 [4.26] BCX_SET_LABEL_COLOR & BCX_SET_LABEL_COLOR now accept arrays
11/22/2003 [4.26] BUG FIX: Wayne fixed array access that used type specifiers
11/19/2003 [4.26] HaJo Gurt added improved error reporting to EditLoadFile
11/18/2003 [4.26] BUG FIX: John Jacques reported that BCX would not allow
                  LINE INPUT statements with statements separated by :
11/16/2003 [4.26] BUG FIX: Declaring Function Pointers in UDT's not working
                  Wayne corrected an internal BCX bug that was causing it
11/16/2003 [4.26] John Jacques added $BCX$ macro to $INCLUDE handler
11/15/2003 [4.26] Jeff Shollenberger enhanced BFF$ to accept an optional path$
11/13/2003 [4.26] BCX recognizes wildcard ?* in filename.  Only works on first
                  match found and only then if that files ends in .BAS
...............................................................................
11/09/2003 [4.25] Robert Wishlaw corrected bug with NOW$ function
11/09/2003 [4.25] OTF concatenation allowed me to eliminate numerous statements
11/09/2003 [4.25] Updated project ($PRJ) code to handle STRTOKEN$
11/09/2003 [4.25] Wayne correct problem with WHILE handler
...............................................................................
11/09/2003 [4.24] Added STRTOKEN$ function to the BCX lexicon
11/09/2003 [4.24] Garvan spotted a bug in MDIGUI runtime.  Corrected
11/08/2003 [4.24] "Fatboy" added BCX_FloodFill to the BCX lexicon.
                  BCX_FLOODFILL (Hwnd,X,Y,Bordercolor,Fillcolor,[DrawHdc])
11/06/2003 [4.24] Ryan Pusztai improved BCX_SET_FORM_COLOR
11/06/2003 [4.24] BCX_CLASSNAME$ is now case insensitive
                  Note:  When using BCX_FORM without GUI "Classname", one MUST
                  use BCX_ClassName$ = "SomeClassName" prior to Initialization
                  I discovered Garvan's BCXWORLD sample would GPF on startup
                  and tracked down the reason why : BCX_ClassName$ = ""
                  The full distribution has an updated \GUI_DEMO\BCXWORLD\
11/05/2003 [4.24] Wayne corrected Dynamic Arrays bug.
................................................................................
11/05/2003 [4.23] Corrected bug with temporary resource file not being deleted
11/05/2003 [4.23] Garvan added MDIGUI prototypes
................................................................................
10/29/2003 [4.22] Wayne corrected PRINT bug.
10/27/2003 [4.22] Added block ENUM - END ENUM to BCX
10/27/2003 [4.22] Removed all internal uses of JOIN$ in favor of the OTF system
10/26/2003 [4.22] Wayne tweaked OTF string concatenation
10/26/2003 [4.22] Minor tweaks to the $VSCROLL & $HSCROLL handlers
...............................................................................
10/25/2003 [4.21] Added keyboard version of LINE INPUT phrase.
                  Usage: LINE INPUT Prompt, StringVariable
                  Note 1: Prompt is NOT optional and MUST be a quoted literal
                  Note 2: StringVariable can be any valid string variable
...............................................................................
10/25/2003 [4.20] BUG FIX: Garvan submitted new insights into the LFN problem
10/25/2003 [4.20] BUG FIX: Garvan's recent MDI additions added the following
                  words to the BCX lexicon but were not being treated for
                  language Case-Insensitivity.  This has been corrected.
                  BCX_MDICLIENT, BCX_MDICLASS, BCX_MDICHILD
10/24/2003 [4.20] Vern Blaine enhanced the $VSCROLL and $HSCROLL handlers
10/24/2003 [4.20] Various bug fixes by Wayne Halsdorf and Robert Wishlaw
...............................................................................
10/23/2003 [4.19] Incorporated Garvans BCXMDI support.
10/21/2003 [4.19] Ad Rienks changing LPRINT font to "Courier New"
10/21/2003 [4.19] Wayne's 4.18A
...............................................................................
10/19/2003 [4.18] Ad Rienks found a problem with LFN -- reworked (again)
...............................................................................
10/19/2003 [4.17] John Jacques reported problem with long files names -- fixed
...............................................................................
10/19/2003 [4.16] Wayne created new internal function: "VarType" which detects
                  and reports global, local, and UDT variable types. (vt_###)
10/19/2003 [4.16] Renamed internal "Vartype" function to "DataType"
10/19/2003 [4.16] Wayne improved method for handling "AS CHAR" variables within
                  PRINT, FPRINT, LPRINT, SPRINT statements
...............................................................................
10/18/2003 [4.15] PRINT, FPRINT, LPRINT, SPRINT now handle "AS CHAR" variables
10/17/2003 [4.15] John Jacques reported problem with long files names -- fixed
...............................................................................
10/16/2003 [4.14] Wayne further enhanced conditional directives handling
10/15/2003 [4.14] Added new Cmdline switch -D:UserDefinedConstant[=Val]
10/15/2003 [4.14] Wayne enhanced conditional directives handling
...............................................................................
10/13/2003 [4.13] Added support for "AS STRING *" statements.  BCX preprocesses
                  these into statements like: FirstName [20] AS CHAR
                  .............................................................
                  TYPE MYTYPE
                    FirstName As STRING * 20
                    LastName  As STRING * 20
                    Address1  As STRING * 30
                    Address2  As STRING * 30
                    City      As STRING * 20
                    St        As STRING * 10
                    ZipCode   As STRING * 12
                  END TYPE
                  .............................................................
                  GLOBAL MyString AS STRING * 100
                  .............................................................
                  SUB FOO
                    DIM RAW a as STRING * 100
                    LOCAL   b as STRING * 100
                    DIM     c as STRING * 100
                  END SUB
                  .............................................................

10/13/2003 [4.13] Added PAUSE statement to the lexicon. PAUSE emulates the MSDOS
                  command and is intended for use in CONSOLE mode programming.
                  Usage: PAUSE
                  Output: Press any key to continue . . .

10/13/2003 [4.13] Replaced Hex2Dec runtime with Dindo Linboons version.

10/13/2003 [4.13] Extends from Wayne's 412a / 412b
...............................................................................
10/06/2003 [4.12] Added Hex2Dec function to the BCX lexicon.
                  Usage: PRINT Hex2Dec ("&HA000")

                  Hex2Dec takes a string argument representing a hexidecimal
                  number and returns a 32 bit decimal integer.  It is the
                  programmer's responsibility to trap and remove all non-hex
                  characters from the input string, otherwise the function
                  will certainly yield incorrect results. The case-insensitive
                  argument may take the following forms:

                  PRINT HEX2DEC ("&Hffff") ' BASIC designation   "&H" or "&h"
                  PRINT HEX2DEC ("0xffff") ' C designation       "0x" or "0X"
                  PRINT HEX2DEC ("ffff")   ' pure designation

10/05/2003 [4.12] Wayne extended WITH-END-WITH handler with 8 level nesting
10/03/2003 [4.12] Bug fix: Garvan modified INPUTBOX$ to allow extended char's
...............................................................................
10/01/2003 [4.11] Added VB-like "WITH" "END WITH" block handling to the lexicon
09/29/2003 [4.11] BCX_Status now allows user defined wID.  Default = 200
...............................................................................
09/28/2003 [4.10] Added COMBOBOXLOADFILE command to the BCX lexicon.
                  Quickly and easily load a text file into a COMBOBOX control.
                  Usage: COMBOBOXLOADFILE (HWND, FileName$)
                  .............................................................
09/28/2003 [4.10] Added LISTBOXLOADFILE command to the BCX lexicon.
                  Quickly and easily load a text file into a LISTBOX control.
                  Usage: LISTBOXLOADFILE (HWND, FileName$)
                  .............................................................
09/28/2003 [4.10] Re-wrote and simplified the RETAIN$ function
                  Usage:  PRINT RETAIN$ (Source$,ValidChars$)
                  Sample: PRINT RETAIN$ ("aaa111bbb222ccc333","123")
                  Displays 111222333
09/25/2003 [4.10] Garvan changed (internal) AppName to BCX_ClassName
...............................................................................
09/25/2003 [4.09] Optimized GUI message pumps            (Thanks Garvan)
09/23/2003 [4.09] Wayne added CONTAINEDIN to lexicon
...............................................................................
09/22/2003 [4.08] Modified the message pump to better handle accelerators
09/22/2003 [4.08] Added DDQ$ (Double Double-Quote) string constant to lexicon.
                  PRINT DDQ$  REM 2 double quote chars: ""
09/22/2003 [4.08] Misc code cleanup's
...............................................................................
09/21/2003 [4.07] Added  $ACCELERATOR directive to BCX.
                  Usage: $ACCELERATOR hAccelTable
                  Only valid in BCX programs that use the BCX GUI commands.
                  This directive emits a special Message Pump (below):
                  .............................................................
                  while(GetMessage(&Msg,NULL,0,0))
                    {
                     if(!IsWindow(GetActiveWindow())          ||
                     !IsDialogMessage(GetActiveWindow(),&Msg) ||
                     !TranslateAccelerator(GetActiveWindow(),hAccelTable,&Msg))
                      {
                        TranslateMessage(&Msg);
                        DispatchMessage(&Msg);
                      }
                    }
...............................................................................
09/21/2003 [4.06] Added OSVERSION function to the lexicon. Based on PBWin code
                  by Wayne Diamond:  Returns a value (below) that represents
                  the running Windows OS version: Usage: Print OSVERSION
                  ************************************************************
                  -1: Error  0: Win3x   1: Win95   2: Win98   3: ME   4: NT3
                   5: NT4    6: 2K      7: XP      8: .NET (or newer)
                  ************************************************************
09/21/2003 [4.06] Various formatting changes
09/21/2003 [4.06] Wayne's corrections to 4.05
...............................................................................
09/19/2003 [4.05] \CON_DEMO\ S83.bas and S90.bas modified to be compatible with
                  recent changes involving string concatenation using the + char
09/19/2003 [4.05] Bug involving Function & Sub pointers fixed
09/19/2003 [4.05] Reworked internal IsQuoted function
09/19/2003 [4.05] Wayne replaced internal hash function
...............................................................................
09/16/2003 [4.04] More improvements to using "+" for string concatenation
09/16/2003 [4.04] More improvements with dealing with leading zeros, i.e. 00123
...............................................................................
09/13/2003 [4.03] BCX now tolerates numbers with leading zeros, i.e. 00123
09/13/2003 [4.03] Improved handling of "+" when used for string concatenation
...............................................................................
09/06/2003 [4.02] Enhanced FOR statement.  Variables used in the STEP clause
                  no longer need to be specified with the minus symbol to
                  indicate the loop cycles downwards.
09/06/2003 [4.02] String concatenation may now use the + symbol as long as the
                  symbol following the + symbol is either a string literal or
                  contains the $ symbol.
                  For example:  MyString$ = "HELLO" + UCASE$(There$)
09/06/2003 [4.02] Based on Wayne Halsdorf's 401B version
...............................................................................
08/17/2003 [4.01] Doyle discovered problem with GetFileName$ function -- Fixed!
...............................................................................
08/17/2003 [4.00] Formatted more of the runtime routines
           [4.00] Fixed bug w/ EditLoadFile involving recently changes to Exist
           [4.00] Added vt_HANDLE
           [4.00] BCX_THREADKILL and BCX_THREADWAIT now invoke CloseHandle (x)
                  per recommendation by Scott Frick (and Microsoft MSDN)
           [4.00] Wayne fixed additional parsing bugs
...............................................................................
08/16/2003 [3.99] Added thread support to BCX via the following keywords:
                  BCX_THREAD, BCX_THREADWAIT, BCX_THREADSUSPEND
                  BCX_THREADRESUME, BCX_THREADEND
                  .............................................................
08/16/2003 [3.99] Wayne Halsdorf fixed problem with INPUT xx[N],yy[N] statement
08/13/2003 [3.99] Robert Wishlaw corrected memory leaks on the following:
                  SET_BCX_BITMAP, SET_BCX_BMPBUTTON AND SET_BCX_ICON
...............................................................................
08/12/2003 [3.98] Bug Fix: NOW$ was not returning correct results
...............................................................................
08/11/2003 [3.97] Parsing bug fix:: (&  was being emitted as (,
08/10/2003 [3.97] Added END WHILE (ala .Net) same as WEND statement
08/10/2003 [3.97] Removed On-The-Fly String Concat within INPUT, reverting back
                  to BCX 3.95 and earlier internal: CASE "input" handler, except
                  now relies exclusively on SUB EmitInputCode logic, yielding
                  traditionally accurate INPUT command behavior.
...............................................................................
08/07/2003 [3.96] Robert Fixed Win2K WinXP specific bugs involving INKEY
08/06/2003 [3.96] Wayne corrected On-The-Fly String Concat within INPUT commands
...............................................................................
08/06/2003 [3.95] WS_CLIPCHILDREN style removed from BCX_FORM by Robert Wishlaw
08/06/2003 [3.95] EXIST function expanded based on new code by Larry Keys.
                  Syntax remains the same but UNC paths can now be searched
                  using the form:  PRINT EXIST("\\server\share\file.txt"
                  [NOTE WELL] UNC PATHS may not contain wildcards chars * or ?
...............................................................................
08/05/2003 [3.94] Robert Wishlaw tweaked INFOBOX
08/05/2003 [3.94] Robert Wishlaw re-work BCX_Graphics
08/05/2003 [3.94] Scott Frick finalized the new SOUND command
...............................................................................
08/04/2003 [3.93] FreeGlobals is now a case insensitive keyword in BCX lexicon
...............................................................................
08/03/2003 [3.92] Re-worked how BCX runtime #pragmas are emitted
08/03/2003 [3.92] Dead code elimination
...............................................................................
08/02/2003 [3.91] MrBcx modified SOUND command to use default MIDI device
08/01/2003 [3.91] Wayne added null pointer sentry
08/01/2003 [3.91] Scott updated SOUND runtime to be multithreaded
...............................................................................
08/01/2003 [3.90] Robert modified SOUND runtime
...............................................................................
07/31/2003 [3.89] Added SOUND command to BCX lexicon.  This is Robert Wishlaw's
                  Boink4 with minor runtime changes by MrBcx

07/31/2003 [3.89] Added FILELOCKED to BCX lexicon.  Contributed by Gary Sayers
                  Usage: PRINT FILELOCKED("MyFile.Exe")
                  Returns TRUE is file cannot be opened, FALSE if it can

07/26/2003 [3.89] Added another optional arg to GETFILENAME$.  New order of
                  FileName$ = GETFILENAME$(FileTitle$,FileExtension$
                  [,OpenSave] [,hWnd] [,Flags%] [,InitialDir$])

07/25/2003 [3.89] PRINT APPEXEPATH$ now returns the expected results
07/25/2003 [3.89] PRINT APPEXENAME$ now returns the expected results
...............................................................................
07/24/2003 [3.88] Added $BCX_RESOURCE toggle -- reduces BCX_RESOURCE statements
07/22/2003 [3.88] Wayne added Printer EjectPage to lexicon
07/21/2003 [3.88] Line number oriented program support removed from BCX
...............................................................................
07/20/2003 [3.87] Robert recast VBS_RUN_SCRIPT & VBS_ADDCODE to HRESULT
07/20/2003 [3.87] Vic McClung enhanced LET command to support COM related types
07/20/2003 [3.87] Robert Wishlaw enhanced ANSITOWIDE and WIDETOANSI$ FUNCTIONS
...............................................................................

07/19/2003 [3.86] Added VBSCRIPT wrappers to lexicon
                  FUNCTION VBS_RUN_SCRIPT ("") AS BOOL
                  FUNCTION VBS_EVAL_NUM   ("") AS DOUBLE
                  FUNCTION VBS_EVAL_STR   ("") AS STRING
                  FUNCTION VBS_ADDCODE    ("") AS BOOL
                  FUNCTION VBS_START      ()   AS BOOL
                  SUB      VBS_STOP       ()
                  SUB      VBS_RESET      ()
                  Much of the original code, and my understanding, result
                  from an original BCX contribution by Ljubisa Knezevic.
                  .............................................................
07/19/2003 [3.86] Added functions ANSITOWIDE and WIDETOANSI$ to lexicon
                  MyBSTR = ANSITOWIDE  ("AnsiString")
                  MyAnsi = WIDETOANSI$ (MyBSTR)
                  These functions were originally written by Vic McClung and
                  modified slightly for inclusion into BCX.
...............................................................................
07/19/2003 [3.85] Added $HSCROLL to complement $VSCROLL (finally!)
                  Updated \GUI_DEMO\SCROLLWN\ to use both $HSCROLL & $VSCROLL
..............................................................................
07/19/2003 [3.84] Robert Wishlaw removed duplicate BCX_POLYLINE runtime code
07/19/2003 [3.84] Scott Frick improved BCX_OLEPICTURE and BCX_BITMAP routines
...............................................................................
07/18/2003 [3.83] New error trap added to BCX_OLEPICTURE
                  .............................................................
07/17/2003 [3.83] "Assignment within conditional expression" warning messages
                  are emitted by Lcc-win32 C compiler version July 14, 2003
                  when recompiling BCX.  I read of a solution to suppress
                  these messages by Dave Hansen on comp.compilers.lcc
                  Beginning with 3.83, BCX compiles with with no warnings
                  .............................................................

07/16/2003 [3.83] This is Wayne's 3.82a which adds $BCXVERSION to lexicon by
                  Vic McClung, along with Wayne's minor bug fixes
...............................................................................
07/16/2003 [3.82] Scott Frick implemented BCX_OLEPICTURE prototype.  MrBcx
                  integrated it into the BCX lexicon
...............................................................................
07/15/2003 [3.81] Joe Caverly enhanced LOCATE by adding a 4th optional arg
                  for controlling the shape of the text cursor:  Sample:

                     LOCATE 5,10,1,99 : SLEEP (3000)   99 = Full
                     LOCATE 5,10,1,49 : SLEEP (3000)   49 = Full
                     LOCATE 5,10,1,12 : SLEEP (3000)   12 = normal (default)

07/15/2003 [3.81] Fixed bug involving BCX.ini and the line continuation operator

07/15/2003 [3.81] Reverted ICC_ flags to 3.79
...............................................................................
07/13/2003 [3.80] Added CreateRegInt and RegInt to the BCX lexicon
                  CreateRegInt is used to create and update subkeys
                  Sample:

                  CONST HKLM = HKEY_LOCAL_MACHINE
                  CreateRegINT  (HKLM, "Software\Chevy","Engine",350)
                  PRINT RegINT  (HKLM, "Software\Chevy","Engine")
...............................................................................
07/13/2003 [3.79] BCX works harder at making sure it's path regkey is set.
07/13/2003 [3.79] BCX_Polygon restored from 3.78 by Wayne
...............................................................................
07/12/2003 [3.78] Added new switch for setting or updating the BCX path key
                  in the Windows Registry using the folder from which BC.EXE
                  was launched.  Uses the APPEXEPATH$ to determine folder so
                  it is very reliable. BCXPATH$ relies on the registry entry
                  for its return value.
                  USAGE: BC -r [NOTHING ELSE IS ALLOWED ON THE COMMAND LINE]


07/12/2003 [3.78] Added CreateRegString and DeleteRegKey to the BCX lexicon
                  CreateRegString is used to create and update subkeys

==================================  Sample  =================================

CONST HKLM = HKEY_LOCAL_MACHINE

DeleteRegKey     (HKLM, "Software\Bcx-32\Bcx\Settings")

CreateRegString  (HKLM, "Software\Bcx-32\Bcx\Settings", "Path", "C:\bc")
PRINT RegString$ (HKLM, "Software\Bcx-32\Bcx\Settings", "Path")

CreateRegString  (HKLM, "Software\Bcx-32\Bcx\Settings", "Path", "C:\tools")
PRINT RegString$ (HKLM, "Software\Bcx-32\Bcx\Settings", "Path")

CreateRegString  (HKLM, "Software\Bcx-32\Bcx\Settings", "Vers", "3.78")
PRINT RegString$ (HKLM, "Software\Bcx-32\Bcx\Settings", "Vers")

...............................................................................
07/12/2003 [3.77] #include <wchar.h> and #include <objbase.h> added to the
                  list of standard Win32 headers in support of COM development
07/10/2003 [3.77] Removed dead code being emitted by PRINTER commands
07/10/2003 [3.77] Added Wayne's and Robert's BCX_XXX drawing tweaks
07/08/2003 [3.77] Minor parser tweak by Wayne
...............................................................................
07/08/2003 [3.76] ADDED IREMOVE statement and IREMOVE$ function to the lexicon
                  These are identical to REMOVE and REMOVE$ with the exception
                  that the internal string searchs are CASE INSENSITIVE
07/08/2003 [3.76] Lines in between $HEADER may now include comments
...............................................................................
07/07/2003 [3.75] Garvan fixed bug with APPACTIVATE
           [3.75] "round" renamed to "Round" due to new LCC-Win "round" conflict
           [3.75] Incorporated Doyle's $RESOURCE related changes
...............................................................................
07/06/2003 [3.74] More tweaking to the new LPRINT system.  Seems stable
           [3.74] LPRINT and SPRINT handler now strips off \n (crlf) pairs
           [3.74] LPRINT statements now trigger emission of LPRINT runtime code
           [3.74] Applied Vic McClungs $FILE$ related tweaks
...............................................................................
07/05/2003 [3.73] LPRINT Overhaul.  Now uses Win32 API
           [3.73] Added PRINTER OPEN  phrase to lexicon
           [3.73] Added PRINTER CLOSE phrase to lexicon
           [3.73] Added SPRINT (String Print) works like PRINT, FPRINT, LPRINT
                  except saves results into a string
                  SPRINT A$, Ucase$("Hello"), ">>>", atn(1)*4, "<<<"
           [3.73] ADDED IREPLACE statement and IREPLACE$ function to the lexicon
                  These are identical to REPLACE and REPLACE$ with the exception
                  that the internal string searchs are CASE INSENSITIVE
           [3.73] Incorporated Garvan's bug fixes
           [3.73] Incorporated Doyle's minor revisions to his $RESOURCE code
...............................................................................
07/05/2003 [3.72] Added LPRINT to the lexicon --  Usage: LPRINT {print list}
                  LPRINT prints directly and only to LPT1.  Anything that you
                  can PRINT and FPRINT, now you can also LPRINT
07/05/2003 [3.72] Adjusted CLOSE (with no arguments) to use _closeall()
...............................................................................
07/05/2003 [3.71] CLOSE statement, with no arg, closes all GLOBAL file handles
07/05/2003 [3.71] Wayne fixed bug involving SHELL with OTF string concatenation
...............................................................................
07/04/2003 [3.70] $LCC$ AND $BCX$ act like $FILE$ as replacable macros and are
                  used in $COMPILER, $LINKER, $RESOURCE, $ONENTRY, and $ONEXIT
                  $LCC$ produces the root LCC Path, e.g. C:\LCC\
                  $BCX$ produces the root BCX Path, e.g. C:\BCX\
                  .............................................................
07/04/2003 [3.70] Added BCXPATH$, LCCPATH$, and REGSTRING$ functions to lexicon
                  PRINT BCXPATH$     'C:\BC\
                  PRINT LCCPATH$     'C:\LCC\
                  PRINT REGSTRING$ (HKEY,RegPath$,SubKey$)
07/04/2003 [3.70] Doyle added $RESOURCE and BCX_RESOURCE to the BCX lexicon
...............................................................................
07/03/2003 [3.69] CONST's defined in $IF/$IFNDEF/$END IF now emitted in place
07/03/2003 [3.69] Added $IFNDEF to lexicon
07/03/2003 [3.69] I applied the version 3.68 bug fixes by Robert and Garvan
07/03/2003 [3.69] BCX 3.69 based on Wayne's 3.67Y
                  A big thank you to Wayne for his efforts at implementing
                  on-the-fly string concatenation in BCX!  Very handy!
...............................................................................
07/03/2003 [3.68] Robert Wishlaw enhanced BCX_GET_TEXT function
07/03/2003 [3.68] Garvan O'Keefe enhanced the REMOVE$ and REPLACE$
...............................................................................
06/29/2003 [3.67] Bug Fix for "\" to chr$(92) modification made earlier today
...............................................................................
06/29/2003 [3.66] Added BCX.INI file capability.  BCX.INI is a user defined
                  BASIC source code file that must reside in the same folder
                  as the BCX translator (BC.EXE), if it is to be used.

                  >>>>   BCX does not require BCX.INI to function  <<<<

                  By default, BCX will automatically include the contents
                  of this BCX.INI each BCX is invoked.  You can disable this
                  behavior by placing a new BCX directive >>> $NOINI <<< at
                  the beginning of your source code file, before any code or
                  variable declarations.
...............................................................................
06/29/2003 [3.65] BCX now transforms the 3 char pattern "\" to chr$(92)
06/29/2003 [3.65] Bug Fix: HDC optional arg in BCX_GETPIXEL restored
...............................................................................
06/28/2003 [3.64] Based on Wayne's 3.63b version
06/28/2003 [3.64] Gerome added $PACK directive to the lexicon
06/28/2003 [3.64] Scott implemented multi-dim array iterators in FOR-NEXT loops
...............................................................................
06/22/2003 [3.63] EXPORTED SUBs and FUNCTIONS now emit appropriate prototypes
                  (cdecl and stdcall) that allow them to be called internally
                  within the DLL module and externally by the calling process,
                  which is usually an .EXE but can also be another DLL
...............................................................................
06/21/2003 [3.62] Added BOOL$ to the lexicon:  Returns "True" or "False"
                  Usage: Print BOOL$(Integer_Expression)

06/21/2003 [3.62] Robert Wishlaw corrected problems with Binary Input/Output
...............................................................................
06/20/2003 [3.61] Wayne added $FSSTATIC , works in toggle mode
                      Places static before function and subroutines
                      SUB GoForward(iBrowser AS IWebBrowser2 PTR)
                      static void GoForward (IWebBrowser2 *iBrowser)
06/20/2003 [3.61] Wayne enhanced & corrected FUNCTION PTR capabilities
06/20/2003 [3.61] Wayne added AUTO, REGISTER, and EXTRN as storage classes
06/11/2003 [3.61] Wayne added $GENFREE directive -- emits a FreeGlobal SUB
06/08/2003 [3.61] Wayne fixed LINE INPUT so that indexed arrays can be
                  pre/post incr/decr, as in:
                              xray[++index]
                              xray[--index]
                              xray[index++]
                              xray[index--]
                  .............................................................
06/07/2003 [3.60] Added LOADFILE$ function to BCX lexicon.  Easily loads any
                  file into a string variable that is adequately dimensioned.
                  .............................................................

                  DIM a$ * LOF ("MyData.Txt")
                  a$  =  LOADFILE$ ("MyData.Txt")
                  PRINT a$
                  .............................................................
06/07/2003 [3.60] Wayne's Mod:  Made changes to IF and WHILE so that tests
                  on CHAR PTR can be done.  Requires that the pointers
                  be enclosed in parentheses.
                  .............................................................
06/07/2003 [3.60] Bug Fix by Vic McClung:  Added fix for LINE INPUT bug
                  LINE INPUT INFILE, xray[++index]
                  would bump the index 3 times instead of the intended once.
                  Also fixes -- operator when using array elements as buffer.
                  .............................................................
06/06/2003 [3.60] Changes by Wayne Halsdorf include :
                  Changed SourceFlag to SrcFlag
                  Made === strip out dead callback code === ignore comments
                  Fixed $TRACE
...............................................................................
06/03/2003 [3.59] Vic McClung added -m command line switch to turn on/off
                  module name and module line number affecting meta-statements
                  $TRACE, $SOURCE, $TEST and BCX's internal error reporting
                  procedure: Abort Sub
06/01/2003 [3.59] Prototypes for chdir, mkdir, rmdir changed to int
...............................................................................
06/01/2003 [3.58] Added RETAIN$ function to lexicon -- PB compatible
                  Syntax: Result$ = RETAIN$(Source$, Mask$)
                  Returns a string containing Source$ characters that
                  match characters found in Mask$

                  SAMPLE:

                  DIM a$,b$,c$

                  a$ ="<p>1234567890<ak;lk;l>1234567890</p>"
                  b$ = RETAIN$(a$, "<;/p>")
                  c$ = RETAIN$(a$, "0123456789")

                  PRINT b$  ' result should contain:  <p><;;></p>
                  PRINT c$  ' result should contain:  12345678901234567890
...............................................................................
06/01/2003 [3.57] Added VERIFY function to lexicon -- *not* PB compatible
                  Syntax:  i= Verify ( StrToTest$ , ValidCharacters$)

                  Returns True or False depending on whether every char
                  contained in StrToTest$ is contained in ValidCharacters$

                  Sample: i = Verify ( "-135.79" , "eE+-.0123456789" )
                  Result: i = TRUE because chars -135.79 are in eE+-.0123456789

05/28/2003 [3.57] Internal EOF function modified to avoid conflict with io.h
...............................................................................
05/27/2003 [3.56] Wayne removed "ELSE IF" dead code
05/27/2003 [3.56] Added -k switch, as requested by Edwin Knoppert
...............................................................................
05/26/2003 [3.55] Added the following new STRING CONSTANTS to BCX
                     NUL$    ' Null
                     BEL$    ' Bell
                     BS$     ' Back Space
                     TAB$    ' Horizontal Tab
                     LF$     ' Line Feed
                     VT$     ' Vertical Tab
                     FF$     ' Form Feed
                     CR$     ' Carriage Return
                     EOF$    ' End-of-File
                     ESC$    ' Escape
                     SPC$    ' Space
                     DQ$     ' Double-Quote
                     CRLF$   ' Carriage Return & Line Feed
...............................................................................
05/19/2003 [BCX 3.54] Bug Fix: Robert Wishlaw reported problem with CONST
05/18/2003 [BCX 3.54] Wayne Halsdorf extended REDIM DYNAMIC to local scopes
05/18/2003 [BCX 3.54] Bug Fix: Garvan reported bug w/ If .. THEN .. FUNCTION =
...............................................................................
05/11/2003 [BCX 3.53] Bug Fix: R Wishlaw reported scaling problem w/ BCX_Bitmap
05/08/2003 [BCX 3.53] Corrected the parsing of the "LET" command
05/08/2003 [BCX 3.53] Wayne Halsdorf corrected BYREF bug with arrays
05/04/2003 [BCX 3.53] GetProcAddress now automatically cast to FARPROC
05/01/2003 [BCX 3.53] Wayne Halsdorf corrected bug with QSORT handling
...............................................................................
04/28/2003 [BCX 3.52] Robert Wishlaw made changes to QSORT runtimes
04/28/2003 [BCX 3.52] Bigane corrected SELECT CASE formatting bug
...............................................................................
04/27/2003 [BCX 3.51] Minor maintenance release.  Some internal BCX code now
                      uses new BYREF mechanism.  OPTIONAL arg clean-ups by
                      Robert Wishlaw.  Quieted down some RAW variables.
...............................................................................
04/26/2003 [BCX 3.50] Wayne implemented passing variables by reference,
                      using LCC's extension (C++ references).
04/26/2003 [BCX 3.50] Robert Wishlaw suggested type changes involving
                      HWND and HANDLE.  BCX no longer forces HANDLE to HWND.
04/25/2003 [BCX 3.50] Garvan report need for LinesRead++ in SET handler
04/24/2003 [BCX 3.50] Vic McClung - modified preprocessor interface.  No
                      longer passes Stk$ array and Ndx. Preprocessor dll
                      template has its own parser/tokenizer.  Creates its
                      own stack$ array of tokens and parallel array of
                      TOK_KIND which describes each type or 'kind' of
                      token, also index which is the count of tokens.
                      See bcxpp.bas in Yahoo Files\BCX_Files directory.
...............................................................................
04/24/2003 [BCX 3.49] Wayne Halsdorf re-wrote BracketHandler
04/23/2003 [BCX 3.49] More tweaking of the BracketHandler by Vic McClung
...............................................................................
04/22/2003 [BCX 3.48] BugFix:  Robert Wishlaw reported bug with Bracket Handler
04/22/2003 [BCX 3.48] Vic McClung enhanced the $PP mechanism
04/19/2003 [BCX 3.48] BugFix:  Wayne Halsford reported bug with $OPTIMIZE
04/19/2003 [BCX 3.48] BugFix:  Robert Wishlaw reported bug with $IPRINT
...............................................................................
04/19/2003 [BCX 3.47] Starting with Vic McClungs modified version of 3.46a
                      Extracted Vic's "BASIC-Style Array Handler" from his
                      Preprocessor project, renamed to BracketHandler, modified
                      and integrated into BCX so "BASIC-Style Array Handling"
                      is now native.
04/19/2003 [BCX 3.47] SPLIT and DSPLIT now share same logic ( I think )
...............................................................................
04/12/2003 [BCX 3.46] "Official release" Wayne's 3.45xb with minor changes
04/05/2003 [BCX 3.46] Wayne added REDIM PRESERVE to SINGLE, DOUBLE, and INTEGER
04/03/2003 [BCX 3.46] Wayne added REDIM PRESERVE to simple & string arrays
...............................................................................
04/01/2003 [BCX 3.45] Increased number of user SUBS/FUNCTIONS to 1024 from 256
03/19/2003 [BCX 3.45] Added Gerome's improved FREEFILE function
03/19/2003 [BCX 3.45] Wayne's 3.44c adds Robert Wishlaws BCX_Polyline
...............................................................................
02/21/2003 [BCX 3.44] GetProcAddress is now automatically cast to (void*)
02/21/2003 [BCX 3.44] Robert Wishlaw contributed fix to LCC attribute warning
02/21/2003 [BCX 3.44] Killed a GDI leak in INFOBOX and INPUTBOX
02/20/2003 [BCX 3.44] Applied Wayne mod's for PRINT#, OPEN#, CLOSE#, Etc
...............................................................................
02/18/2003 [BCX 3.43] BUG FIX:  OPTION BASE was correctly handling GLOBALS
02/14/2003 [BCX 3.43] Incorporates Wayne's And Roberts changes
...............................................................................
02/10/2003 [BCX 3.42] Fixed bug caused by introduction of function/sub pointers
02/08/2003 [BCX 3.42] Applied the Watcher's check for function/sub pointers
02/07/2003 [BCX 3.42] Incorporated Wayne's changes
02/05/2003 [BCX 3.42] BUG FIX: user functions can now return pointers
02/05/2003 [BCX 3.42] PLAYWAV now uses Dynacall
...............................................................................
01/31/2003 [BCX 3.41] CONST reverted to use token substitution system
01/26/2003 [BCX 3.41] Wayne fixed 2 tweaks -- one concerning WHILE testing,
                      one concerns OPTIONAL functions
01/26/2003 [BCX 3.41] Updated the $PRJ / $PRJUSE blocks (thanks to the Watcher)
...............................................................................
01/26/2003 [BCX 3.40] BUG FIX: Found bug in my new MID$ runtime function
...............................................................................
01/26/2003 [BCX 3.39] Added LOAD_DLL and LOADLIBRARY to lexicon.  These are
                      aliases to the LoadLibrary API function.
                      Usage: LOAD_DLL("MyLib.DLL") or LOADLIBRARY("MyLib.DLL")
01/26/2003 [BCX 3.39] Added BCX_TILE to the lexicon. Tiles a bitmap to a form
                      Usage: BCX_TILE (Form, hBmp)  Easily used in conjunction
                      with the BCX_LOADBMP function
01/25/2003 [BCX 3.39] Applied Wayne's bug fix to OPTIONAL args handler
01/20/2003 [BCX 3.39] Added improved version of CENTER which takes the area
                      of the system TaskBar into account.
01/18/2003 [BCX 3.39] BCX now allows ANY file extension at the command line.
                      If no extension is given, BCX assumes the file ends in
                      .BAS.  In other words, BCX will only translate files
                      that have an extension on them.
01/18/2003 [BCX 3.39] Re-worked the MID$, LEFT$, and internal TmpStr functions
                      in response to discoveries and bug report made by
                      Garvan O'Keeffe.  All 256 byte string "safety nets" have
                      been reduced to 128 bytes, which compensates for the
                      performance degradation incurred in the aforementioned
                      functions due to the extra testing.
01/17/2003 [BCX 3.39] Updated FINDFIRSTINSTANCE with Alessio Ribeca's version
                      which will flash an iconized program's icon until it
                      is re-activated.  If the app is not iconized then that
                      app is given the focus.
01/17/2003 [BCX 3.39] Added APPACTIVATE to lexicon.  Thanks to Tom Spires
                      for the original implementation.  My implementation uses
                      the length of it's string argument and performs a case
                      insensitive search starting at each owner window.  If
                      a match is found, focus is placed on that application.
                      For example, i = APPACTIVATE("file") would activate the
                      first window that it finds whose title BEGINS with the
                      letters "file" (case insensitive).
...............................................................................
01/10/2003 [BCX 3.38] BCX now takes a more "hands off" approach to CONST's
01/10/2003 [BCX 3.38] BUG FIX: Automatic GUI InitCommonControlsEx was || not |
01/10/2003 [BCX 3.38] GETFILENAME$ now re-initializes locals each invocation
01/10/2003 [BCX 3.38] Fixed ExStyles =-1 problem
01/10/2003 [BCX 3.38] Wayne improved the FINDFIRST$ runtime
01/09/2003 [BCX 3.38] Incorporated Wayne's revisions into 3.36
...............................................................................
01/08/2003 [BCX 3.37] Added BCX_PROGRESSBAR to the BCX lexicon
01/08/2003 [BCX 3.37] GUI "XX" programs get InitCommonControlsEx automatically
01/07/2003 [BCX 3.37] LINE INPUT can now input into arrays
01/07/2003 [BCX 3.37] Added Robert Wishlaw's XP compatible TIMER function
01/06/2003 [BCX 3.37] BCX_BITMAP now recognizes Width & Height arguments.  If
                      either the Width or Height <> 0 THEN stretching occurs
01/06/2003 [BCX 3.37] BCX_XXXX commands with ExStyles optional parameters were
                      changed to -1 so that ExStyles can be set to NULL.
...............................................................................
01/04/2003 [BCX 3.36] BCX now accepts the modulus (%) operator in BASIC exprns
                      When using the Modulus operator, you must always include
                      a space to the left and right of it.
                      Example 1:  while a % b  'CORRECT
                      Example 2:  while  a%b   'INCORRECT: WILL NOT TRANSLATE
                      .........................................................
01/03/2003 [BCX 3.36] REPLACE and REMOVE can now follow THEN
01/03/2003 [BCX 3.36] Re-wrote the "CASE"  handler
01/03/2003 [BCX 3.36] Re-wrote the "CONST" handler
01/03/2003 [BCX 3.36] BUG FIX: Applied Wayne's revisions and corrections
12/31/2002 [BCX 3.36] BUG FIX: Added DefFrameProc watch to dead callback code
12/31/2002 [BCX 3.36] BUG FIX: IF WITHOUT THEN error
12/30/2002 [BCX 3.36] INFOBOX changed so that the OKAY button has first focus
...............................................................................
12/30/2002 [BCX 3.35] Errors and Warnings default to STDOUT instead of INFOBOX
12/30/2002 [BCX 3.35] Added new switch to direct errors and warnings to INFOBOX
...............................................................................
12/29/2002 [BCX 3.34] BUG FIX: DefMDIChildProc no longers emits dead code
12/29/2002 [BCX 3.34] BUG FIX: $LIBRARY not converting / to //  (John Jacques)
12/29/2002 [BCX 3.34] BUG FIX: John Jacques identified some dead code.
12/29/2002 [BCX 3.34] Minor Changes by Wayne Halsdorf
12/28/2002 [BCX 3.34] BUG FIX: CASE was not handling string functions correctly
12/28/2002 [BCX 3.34] BCX supports PB syntax:  DIM Foo [10] AS STATIC INTEGER
...............................................................................
12/27/2002 [BCX 3.33] Added BFF$ to BCX lexicon.
                      Usage: PRINT BFF$("My Title",[BIF_Flags])
                      Default behavior allows picking a FOLDER or a FILE
                      .........................................................
                                       Available BIF_ Flags
                      .........................................................
                           BIF_RETURNONLYFSDIRS      BIF_BROWSEINCLUDEURLS
                           BIF_DONTGOBELOWDOMAIN     BIF_UAHINT
                           BIF_STATUSTEXT            BIF_NONEWFOLDERBUTTON
                           BIF_RETURNFSANCESTORS     BIF_NOTRANSLATETARGETS
                           BIF_EDITBOX               BIF_BROWSEFORCOMPUTER
                           BIF_VALIDATE              BIF_BROWSEFORPRINTER
                           BIF_NEWDIALOGSTYLE        BIF_BROWSEINCLUDEFILES
                           BIF_USENEWUI              BIF_SHAREABLE
                      .........................................................
12/24/2002 [BCX 3.33] Applied WHILE and STRING mods by Wayne Halsdorf
...............................................................................
12/23/2002 [BCX 3.32] "Restricted Word" warnings are invoked with the -w switch
12/22/2002 [BCX 3.32] Modified BCX so that Warnings & Aborts use INFOBOX
12/22/2002 [BCX 3.32] Added INFOBOX command -- CONSOLE or GUI
                      Usage: INFOBOX ("Caption", Buffer$)
                      Limits: Buffer$ must be < 32KB
                      ......................[ S A M P L E ]...................
                      DIM Buffer$
                      FOR INTEGER i = 1 to 100
                        Buffer$ = Buffer$ & "Line No. " & STR$(i) & CRLF$
                      NEXT
                      INFOBOX ("Messages Posted...", Buffer$)
........................................................
12/22/2002 [BCX 3.32] BCX_HINSTANCE (using GUI keyword) is now case-insensitive
12/21/2002 [BCX 3.32] John Jacques enhanced CLS to clear the whole cons buffer
12/21/2002 [BCX 3.32] Added $HEADER meta-statement. Works like $CCODE except
                      everything sandwiched between two $HEADER statements is
                      placed at the #include level of the emitted "C" source.
                      Particular useful for pragma statements
.........................................................
12/21/2002 [BCX 3.32] Larry Keys enhanced the GETFILENAME$ function by
                      supporting multi-file selecting using the newer commondlg
.........................................................
12/21/2002 [BCX 3.32] BUG FIX:  MID$ statement wasn't being parsed correctly in
                      some contexts -- thanks to John Jacques for reporting it
.........................................................
12/18/2002 [BCX 3.32] Garvan O'Keeffe added sanity check to MID$ runtime
12/15/2002 [BCX 3.32] Francesco modified str_cmp routine
12/15/2002 [BCX 3.32] New CONST handler by Wayne with mods by me to handle $'s
...............................................................................
12/14/2002 [BCX 3.31] BCX now compiles (with warnings) using Borland C++ 5.5.1.
.........................................................
                      [Note 1]: BCX can compile itself but most demos will not
                      translate correctly using the EXE that is created using
                      the Borland compiler -- incompatibility issues exist.
.........................................................
                      [Note 2]: If you use a compiler other than Lcc-Win32, be
                      aware that you cannot use the USING$ function, as it
                      uses a Lcc-Win32 library call to xsprintf which other
                      compilers may not support.
.........................................................
12/14/2002 [BCX 3.31] Removed call to USING$ in Sub Warning.  USING$ uses a
                      proprietary call to xsprintf which Borland & VC seem
                      not to include in their standard libraries.
12/14/2002 [BCX 3.31] Replaced stristr with _stristr_ in the run time library
12/14/2002 [BCX 3.31] Replaced strtrim with _strtrim_ in the run time library
.........................................................
12/14/2002 [BCX 3.31] New CmdLine switch [-w] enables translator Warnings
12/14/2002 [BCX 3.31] New CmdLine switch [-x] eXcludes Win32 headers
12/14/2002 [BCX 3.31] John Jacques corrected limit SendMessage in BCX_Richedit
...............................................................................
12/13/2002 [BCX 3.30] Fixed latest CONST bug by reverting to previous code
...............................................................................
12/12/2002 [BCX 3.29] Lots of minor speed tweaks
12/12/2002 [BCX 3.29] Fixed bug in ELSEIF that did not handle \\ correctly
12/10/2002 [BCX 3.29] Wayne fixed a problem with OPTIONAL parameters
...............................................................................
12/09/2002 [BCX 3.28] Fixed problem with user specified callback functions
...............................................................................
12/08/2002 [BCX 3.27] Modified SUB Warning not to sqawk at unknown Var types
12/08/2002 [BCX 3.27] Modifications to compensate for loss of ReservedWord func
12/08/2002 [BCX 3.27] Stripped out internal ReservedWord function & support
12/08/2002 [BCX 3.27] Stripped out most WINDOWS HANDLE's used for type checking
12/08/2002 [BCX 3.27] Incorporated Wayne's changes (3.26c)
12/07/2002 [BCX 3.27] Enhanced GETFILENAME$ to allow calling the OPEN or SAVE
                      common dialog functions.  The new calling sequence is
                      GETFILENAME$(Title$,Filter$,OPENSAVE=0|1,hWnd=0,Flags=0)
12/07/2002 [BCX 3.27] Minor change to Dynacall by Mike Lobonovsky
12/06/2002 [BCX 3.27] Wayne's latest changes
...............................................................................
12/05/2002 [BCX 3.26] Bug Fix -- Wayne corrected the REVERSE$ function
12/05/2002 [BCX 3.26] Bug Fix -- Jeff Nope pointed out problem with CHR$
...............................................................................
12/05/2002 [BCX 3.25] Incorporated Wayne's latest changes
12/04/2002 [BCX 3.25] Patched the MID$ statement to work after "THEN" statements
...............................................................................
12/02/2002 [BCX 3.24] Mike Lobonovsky contributed the following IMPLEMENTATIONS
to the run time library: BCX_LoadDll, BCX_UnloadDll, Inset
BCX_DynaCall,CountNumArgs, CheckQuotes, MKI, MKL, MKS, MKD
12/02/2002 [BCX 3.24] Fixed the callback dead code problem
11/30/2002 [BCX 3.24] Increased ENVIRON$ to 32767 bytes
...............................................................................
11/29/2002 [BCX 3.23] Bug Fix: Vic McClung fixed OPTIONAL/EXPORT pairings
11/29/2002 [BCX 3.23] Removed dead code reported by John Jacques
11/29/2002 [BCX 3.23] Added vt_CURRENCY
11/29/2002 [BCX 3.23] Added DYNACALL mechanism for invoking DLL's
...............................................................................
11/23/2002 [BCX 3.22] Enhanced CALLBACK FUNCTION to ** AUTOMATICALLY ** emit
                      "return DefWindowProc(hWnd,Msg,wParam,lParam);" when BCX
                      detects the end of the CALLBACK FUNCTION, saving the
                      programmer from having to remember to do so [correctly]
                      All standard BCX demos updated accordingly.
.........................................................
11/23/2002 [BCX 3.22] Enhanced INPUTBOX$ function.  INPUTBOX$ now reliably
                      returns strings up to 2k in length.  Added tabbing,
                      shortened and cleaned up the code.  More stable overall.
...............................................................................
11/23/2002 [BCX 3.21] BUG FIX - John Jacques fixed long standing INPUTBOX$ bug!
...............................................................................
11/23/2002 [BCX 3.20] BCX_SCALEX and Y now calculated using MapDialogRect
11/23/2002 [BCX 3.20] Reverted GetDiaUnit,cxBaseUnit,cyBaseUnit back to int
11/23/2002 [BCX 3.20] BUG FIX -- Garvan observed Timer cast to int, not float
11/23/2002 [BCX 3.20] Incorporated Wayne's latest changes
...............................................................................
11/22/2002 [BCX 3.19] Changed BCX to emit "APIENTRY" instead of "CALLBACK"
11/22/2002 [BCX 3.19] Applied Wayne's patch to put CASE ... AND ... back in
11/21/2002 [BCX 3.19] BCX_GetDiaUnit, BCX_cxBaseUnit, BCX_cyBaseUnit now SINGLE
...............................................................................
11/20/2002 [BCX 3.18] Incorporated Wayne's latest changes
11/20/2002 [BCX 3.18] Small modification to BCX_DrawTransBmp by Robert Wishlaw
11/19/2002 [BCX 3.18] Added BCX_PRINT gui command by Robert Wishlaw
11/19/2002 [BCX 3.18] Added CBOOL macro as suggested by Gerome Guillemin
...............................................................................
11/18/2002 [BCX 3.17] BUG FIXES .. BCX_SET_TEXT, BCX_FONTDLG, BCX_COLORDLG
...............................................................................
11/17/2002 [BCX 3.16] Improved and corrected BCX_SET_FONT function.  The new
version adds the following optional arguments:
BCX_Set_Font(Font$,Size,Bold=0,Italic=0,Underline=0,StrikeThru=0)
An updated sample is available at \Gui_Demo\Fonts\
....................................................................
11/17/2002 [BCX 3.16] Added BCX_FONTDLG for invoking the ChooseFont ComDlg
Usage: RetCode = BCX_FONTDLG      ' Fill the BCX_FONT structure
PRINT "BCX_Font.Name$     = ", BCX_Font.Name$     ' Font Name
PRINT "BCX_Font.Size      =" , BCX_Font.Size      ' Font Point Size
PRINT "BCX_Font.Italic    =" , BCX_Font.Italic    ' Boolean (0 or 1)
PRINT "BCX_Font.Bold      =" , BCX_Font.Bold      ' Boolean (0 or 1)
PRINT "BCX_Font.Underline =" , BCX_Font.Underline ' Boolean (0 or 1)
PRINT "BCX_Font.Strikeout =" , BCX_Font.Strikeout ' Boolean (0 or 1)
PRINT "BCX_Font.Rgb       =" , BCX_Font.Rgb       ' RGB font color
...............................................................................
11/15/2002 [BCX 3.15] Added BCX_COLORDLG command to the lexicon (thx Doyle)
11/15/2002 [BCX 3.15] Improved DOEVENTS handler ( changed IF to WHILE )
11/15/2002 [BCX 3.15] Small bug fix VOID to void reported by Robert Wishlaw
...............................................................................
11/14/2002 [BCX 3.14] This is ver. 3.13d & a minor fix to errorlevel handler
...............................................................................
11/09/2002 [BCX 3.13] Wayne added ton's of new vt_ types
...............................................................................
11/09/2002 [BCX 3.12] BYTE variables now recognized
...............................................................................
11/09/2002 [BCX 3.11] Enhanced GETFILENAME$ (based on code by R. Berrospe)
                      A$ = GETFILENAME$ Title$, Filter$, [HWND=0], [Flags=0]
                      A$ = GETFILENAME$ _
                      ("Open File","Bas Files (*.bas)|*.bas|C Files (*.c)|*.c")
11/09/2002 [BCX 3.11] Added vt_BYTE to internal BCX datatypes
...............................................................................
11/09/2002 [BCX 3.10] Modified BCX_SET_FONT to allow arrays of handles
11/09/2002 [BCX 3.10] BCX_REPEAT Bug Fix
11/08/2002 [BCX 3.10] Incorporation of Wayne Halsdorf's latest internal mods
...............................................................................
11/04/2002 [BCX 3.09] Incorporation of Wayne Halsdorf's latest internal mods
11/04/2002 [BCX 3.09] Incorporation of Robert Wishlaw's GUI library bug fixes
...............................................................................
11/03/2002 [BCX 3.08] Incorporation of Wayne Halsdorf's latest internal mods
11/03/2002 [BCX 3.08] John Costelloe modified GUI statement to allow app ICON
...............................................................................
10/29/2002 [BCX 3.07] Modified SPLIT and DSPLIT with Wayne's enhancement which
                      gives the user the following 4 options regarding the
                      parsing behavior of the SPLIT and DSPLIT functions:
                      0 = Eliminate all delimiters (default behavior)
                      1 = Retain all delimiters and all null fields
                      2 = Eliminate all delimiters and null fields
                      3 = Retain all delimiters excluding null fields
...............................................................................
10/27/2002 [BCX 3.05] Added Robert's and Vic's STYLE & EXSTYLE OPTIONAL Args
...............................................................................
10/27/2002 [BCX 3.04] Latest bug fixes by Wayne Halsdorf
...............................................................................
10/26/2002 [BCX 3.03] Added Robert Wishlaw's CVD,CVI,CVL,CVS,MKD$,MKI$,MKL$,MKS$
...............................................................................
10/23/2002 [BCX 3.02] Applied Gerome's SPLIT fix to SPLIT and DSPLIT
10/23/2002 [BCX 3.02] Applied Waynes fix to StructCompVar ( Bracket fix? )
10/22/2002 [BCX 3.02] Incorporated Robert Wishlaw's InkeyD and Keypress changes
...............................................................................
10/19/2002 [BCX 3.01] Incorporated Waynes changes/fixes/patches including
                      support for ERRORLEVEL via END = ReturnCode
10/08/2002 [BCX 3.01] Added Rb Wishlaw's BCX_INPUT and BX_CONTROL enhancements
10/07/2002 [BCX 3.01] Bug Fix -- CURSORX was being ignored by the translator
10/07/2002 [BCX 3.01] Changed BCX_ScaleX and BCX_ScaleX to floats (req. by RW)
...............................................................................
9/29/2002  [BCX 3.00] BCX_BMPBUTTON will autosize to the size of the bitmap
                      if the Width and Height parameters are both zero
9/28/2002  [BCX 3.00] Rewrote LOF function
9/27/2002  [BCX 3.00] BCX_ICON can use file or resource loading like BCX_BITMAP
9/23/2002  [BCX 3.00] BUG FIX with APPEXENAME & APPEXEPATH$
9/11/2002  [BCX 3.00] Added DrawTransBmp(Window,Bitmap,Mask,X,Y)
                      Draws a simulated transparent bitmap onto a users
                      specified windows at the specified X,Y coordinates
9/10/2002  [BCX 3.00] Added BCX_LOADBMP(F$[,i]) function to the lexicon
                      MyhBmp = BCX_LOADBMP("my.bmp") ' load from a file
                      MyhBmp = BCX_LOADBMP("", 1234) ' load from EXE resources
9/10/2002  [BCX 3.00] Added BCX_GET and BCX_PUT to the lexicon -- I made
                      the Style argument optional in both, defaults to SRCCOPY
9/09/2002  [BCX 3.00] Added BINARY INPUT as a valid file mode in BCX
9/08/2002  [BCX 3.00] BUG Fix -- IIF and IIF$ not handling equality tests
9/07/2002  [BCX 3.00] Added user-access to BCX_ScaleX and BCX_ScaleY w/GUI pgms
9/06/2002  [BCX 3.00] Added Gerome's SEARCHPATH$ function to the lexicon
9/05/2002  [BCX 3.00] Added Class cleanup to WM_DESTROY handler in GUI appz
9/04/2002  [BCX 3.00] BCX_BITMAP now accepts optional RESOURCE based bitmaps
9/04/2002  [BCX 3.00] BCX_BMPBUTTON now accepts optional RESOURCE based bitmaps
9/04/2002  [BCX 3.00] ADDED Error Check to FillArray runtime by Wayne Halsdorf
9/02/2002  [BCX 3.00] ADDED EDITLOADFILE command
                      Quickly and easily load a text file into a EDIT control.
                      Usage: EDITLOADFILE ( HWND, FileName$ )
.........................................................
9/01/2002  [BCX 3.00] BUG FIX: The ampersand in statements like: A$=Foo$(&x)
                      was being converted to commas and causing problems
9/01/2002  [BCX 3.00] Killed rare bug affecting FUNCTION= (I modified Striptabs)
9/01/2002  [BCX 3.00] IIF and IIF$ correctly handle: Var = IIF(a=b,A,B)
9/01/2002  [BCX 3.00] "Functionreturn" handler improved by Michael Lobovsky
9/01/2002  [BCX 3.00] Expanded usage of INCR/DECR by Michael Lobovsky
9/01/2002  [BCX 3.00] BCX now handles:  CASE 1 to 10, CASE 15 to 20
9/01/2002  [BCX 3.00] Added SET_BCX_ICON to the lexicon
8/30/2002  [BCX 3.00] Added SET_BCX_BMPBUTTON to the lexicon
8/30/2002  [BCX 3.00] Added SET_BCX_BITMAP to the lexicon
8/30/2002  [BCX 3.00] Added new GUI_DEMO\SETBMP\ showing off SET_BCX_BITMAP
8/30/2002  [BCX 3.00] All BCX graphics commands now allow optional HDC
8/30/2002  [BCX 3.00] Changed TIMER to use GetTickCount() API function
8/27/2002  [BCX 3.00] Added Wayne's FILLARRAY function to lexicon
8/27/2002  [BCX 3.00] Added new \CON_DEMO\S148.BAS by Wayne Halsdorf
8/26/2002  [BCX 3.00] BCX_BMPBUTTON added to the GUI controls
8/26/2002  [BCX 3.00] Added MODSTYLE to lexicon -- Modified EZ-GUI Demo
                      ModStyle modifies the basic styles of a window
                      rc = ModStyle(hWnd,dwAdd,dwRemove,bExtended)
                      hWnd - handle to window
                      dwAdd - window styles to add
                      dwRemove - window styles to remove
                      bEx - TRUE for Extended styles,FALSE otherwise
                      Returns: TRUE if successful, FALSE otherwise
.........................................................
8/25/2002  [BCX 3.00] SET now supports LOCAL and GLOBAL contexts.  If SET
                      is used inside a SUB/FUNCTION then the variable and
                      its data are implicitly local in scope.
.........................................................
8/25/2002  [BCX 3.00] Bug Fix: SET now allows comments
8/25/2002  [BCX 3.00] Bug Fix: Re-wrote CINT into a 100% compatible macro
8/25/2002  [BCX 3.00] Bug Fix: SET was LCASE'ing quoted text
8/25/2002  [BCX 3.00] Bug Fix: GetBmp was incorrectly referencing Rich1
8/25/2002  [BCX 3.00] Bug Fix: BOR and BAND were getting lost in PreParse
8/25/2002  [BCX 3.00] Incorporated Wayne's modifications.
...............................................................................
8/19/2002  [BCX 3.00] THEN IF now translated to AND, allowing statements like:
                      IF A=1 THEN IF B=2 THEN IF C$ ="3" THEN PRINT "TRUE"
.........................................................
8/18/2002  [BCX 3.00] ADDED BCX_CIRCLE  (Handle, RPX, RPY, R, Pen, Fill)
8/17/2002  [BCX 3.00] RECTANGLE, ROUNDRECT, ELLIPSE, now retain backgrounds
                      when FILL argument is not used.  Used to be last brush.
8/17/2002  [BCX 3.00] Corrected bug with BCX_GETPIXEL
8/17/2002  [BCX 3.00] Corrected arg order on RECTANGLE, ROUNDRECT, ELIIPSE, ARC
...............................................................................
8/15/2002  [BCX 2.99] Added the following GUI commands (Thanks to R. Wishlaw)
BCX_PRESET    (Form1,X,Y)
BCX_PSET      (Form1,X,Y [,COLORREF])
BCX_LINE      (Form1,X1,Y1,X2,Y2 [,COLORREF])
BCX_LINETO    (Form1,X,Y [,COLORREF])
BCX_ARC       (Form1,Y1,X1,Y2,X2,BX,BY,EX,EY [,COLORREF])
BCX_RECTANGLE (Form1,X1,Y1,X2,Y2 [,COLORREF] [,FILL])
BCX_ROUNDRECT (Form1,X1,Y1,X2,Y2,R1,R2[,COLORREF] [,FILL])
BCX_ELLIPSE   (Form1,X1,Y1,X2,Y2 [,COLORREF] [,FILL])
BCX_GETPIXEL  (Form1,X,Y)  (Function returning COLORREF)
........................................................
8/13/2002  [BCX 2.99] BUG FIX:  Wayne found a bug in the exponent handler
8/12/2002  [BCX 2.99] Dynamic String Arrays can now be REDIM'd
8/11/2002  [BCX 2.99] Added INPUTBOX$ function -- BIG THANKS to Doyle Whisenant
8/11/2002  [BCX 2.99] BCX now allows comments to follow $LIBRARY statements
8/11/2002  [BCX 2.99] ADDED keyword STRARRAY for declaring dynamic arrays
                      as function and sub arguments -- See Con_Demo S147.bas
8/11/2002  [BCX 2.99] Added ISPTR function for returning string pointer status
8/11/2002  [BCX 2.99] Dynamic Arrays now automatically initialized to ""
8/11/2002  [BCX 2.99] Added DSPLIT -- same as SPLIT but for dynamic arrays
8/09/2002  [BCX 2.99] Added BAND & BOR ( Bitwise AND and OR ) to the lexicon
                      Usage: a = 123 BAND 72 BOR 33
8/09/2002  [BCX 2.99] BUG FIX:  ELSEIF had problems
8/08/2002  [BCX 2.99] BCX now outputs <winsock2.h> -- was <winsock.h>
8/05/2002  [BCX 2.99] Internal Parse Stk$ reduced to 2048 elements
8/04/2002  [BCX 2.99] Reworked "SET" command to be multi-line command which
                      is terminated with the phrase "end set"
                      \Con_Demo\S125.Bas has been updated
8/04/2002  [BCX 2.99] Applied Wayne's patch allowing OBC to compile again
8/03/2002  [BCX 2.99] Added CONCAT statement for the BCX lexicon.
                      Usage: CONCAT (A$,B$)
                      Result: B$ is concatenated onto A$
                      CONCAT produces roughly a 3:1 speed improvement over
                      traditional statements like this >>   A$ = A$ & B$
8/02/2002  [BCX 2.99] Added INCHR to the BCX lexicon.
                      Usage: a=INCHR(A$,B$) -- LEN(B$) must = 1.  INCHR is
                      approximately 4x faster than INSTR in similiar uses.
8/01/2002  [BCX 2.99] Changed emission of for(;;) to while(1)
7/31/2002  [BCX 2.99] BUG FIX: Treeview prototype was missing
7/30/2002  [BCX 2.99] Inkey$ runtime was missing -- replaced
7/30/2002  [BCX 2.99] Modified BCX_GUI commands eliminating NULL HWND's
7/30/2002  [BCX 2.99] BUG FIX: predecr was translated correctly in IF-THEN
...............................................................................
7/29/2002  [BCX 2.98] Incorporated Gerome's fast str_cmp internal routine
7/28/2002  [BCX 2.98] Added QSORT DYNAMIC phrase for sorting Dynamic Strings
...............................................................................
7/28/2002  [BCX 2.97] Improved reporting of internal Abort procedure
7/28/2002  [BCX 2.97] DYNAMIC STRING ARRAYS IMPROVED.  The default string
                      length of each element is 2048 bytes, consistent with
                      the rest of BCX.  However, todays modification allows
                      us to override that with our own, similiar to when we
                      declare static string arrays:
                      Example1: DIM DYNAMIC A$[1000]     ' 2048 bytes per cell
                      Example2: DIM DYNAMIC A$[1000][80] ' 80 bytes per cell
.........................................................
7/27/2002  [BCX 2.97] Increased internal InputBuffer to 1mb, improving FINPUT
7/27/2002  [BCX 2.97] Fixed nasty bug with FINPUT -- reported by John Jacques
7/27/2002  [BCX 2.97] Added Wayne's modified (internal) Scan function
7/26/2002  [BCX 2.97] Added GETC to the lexicon -- see CON_DEMO S146.bas
7/26/2002  [BCX 2.97] Simple Dynamic String Arrays implemented
7/26/2002  [BCX 2.97] Added OPTION BASE  phrase to lexicon
7/26/2002  [BCX 2.97] Added FREE DYNAMIC phrase to lexicon
7/24/2002  [BCX 2.97] Added EXIT SUB/EXIT FUNCTION dynamic string handlers
...............................................................................
7/23/2002  [BCX 2.96] DYNAMIC STRING handling is BACK!  Better than ever ...
...............................................................................
7/23/2002  [BCX 2.95] Removed 2.94 changes affecting DYNAMIC STRING handling
7/21/2002  [BCX 2.95] Changed Outw to Outpw for consistency w/ Inp,Inpw,Outp
...............................................................................
7/21/2002  [BCX 2.94] Discovered problem with LTRIM$ -- reverted to 2.80 w/mod
7/21/2002  [BCX 2.94] Improved SPLIT function by Kevin Diggins.
                      * Small, clean, and fast design
                      * Versatile handling of quoted fields
                      * VB6 compatible handling of null fields
                      * Multiple Delimiters
                      * Optional Argument lets you store the delimiters
                        in your parse array
                        upcoming \CON_DEMO\S144.BAS is a demonstration of SPLIT
7/21/2002  [BCX 2.94] CURSORX and CURSORY were reversed.  Fixed
7/20/2002  [BCX 2.94] Added $TRACE meta-statement ( use in code sections only )
7/20/2002  [BCX 2.94] Added Wayne Halsdorf's tweak to SUB Directives
7/18/2002  [BCX 2.94] New and Improved INKEY & INKEY$ by Robert Wishlaw
7/18/2002  [BCX 2.94] Improved Dynamic String allocation in SUBS & FUNCTIONS
                      making them safer, more reliable, and more versatile.
                      LIMITATION: Must be dimensioned at the start of the
                      SUB or FUNCTION, not inside SELECT CASE, IF-THEN, or
                      other deeper levels of a SUB or FUNCTION.  This is
                      because BCX places a FREE statement at the end of
                      your SUBS and FUNCTIONS where you are using dynamically
                      dimensioned strings.
7/15/2002  [BCX 2.94] Bug fix: Wayne found bug with his "reclen" handler
............................................................................
7/12/2002  [BCX 2.93] Added enhanced version of RUN by Gerome Guillemin
7/12/2002  [BCX 2.93] INKEY & INKEY$ now QBASIC compatible by Robert Wishlaw
7/12/2002  [BCX 2.93] REMOVE command now allows full expressions & arrays
                      example: REMOVE UCASE$("AAA") FROM LTRIM$(RTRIM$(A$))
7/12/2002  [BCX 2.93] REPLACE command now allows full expressions & arrays
                      Example1: REPLACE UCASE$(A$) WITH LCASE$(B$) IN STRIM$(C$)
                      Example2: REPLACE A$ WITH UCASE$(B$[2]) IN TRIM$(C$[a+2])
7/12/2002  [BCX 2.93] Added STRIM$ to BCX lexicon ( suggested by Gerome )
                      Usage : PRINT STRIM$ ("1   2        3          4")
                      Output: 1 2 3 4
7/12/2002  [BCX 2.93] Extended LTRIM$ & RTRIM$ allowing optional strip char
                      Usage 1: PRINT LTRIM$ ("   123")      produces 123
                      Usage 2: PRINT LTRIM$ ("AAA123",65)   produces 123
                      Usage 1: PRINT RTRIM$ ("123   ")      produces 123
                      Usage 2: PRINT RTRIM$ ("123AAA",65)   produces 123
7/12/2002  [BCX 2.93] Bug fix: POS() and CSRLIN linkge was transposed
............................................................................
7/11/2002  [BCX 2.92] Added ENC$ function ...  ENCLOSE a string
                      Usage 1: PRINT ENC$ ("Hello")       ' produces "Hello"
                      Usage 2: PRINT ENC$ ("A",68)        ' produces   DAD
                      Usage 3: PRINT ENC$ ("HTML",60,62)  ' produces  <HTML>
.......................................................
7/10/2002  [BCX 2.92] Added Roberto Berrospe's INKEY and INKEY$ implementation
7/10/2002  [BCX 2.92] Added INP, INPW, OUTP, OUTW to BCX lexicon, based
                      on a submission by Roberto Berrospe.  I implemented
                      these as macros for increased performance.
                      INP(byte), INPW(byte), OUTP(port,byte), OUTW (port,word)
........................................................
7/10/2002  [BCX 2.92] Enhanced SPLIT function now accepts multiple delimiters
                      Example: i = SPLIT( Array$, Text$, ",;-~" )
                      Parsed strings are stored starting at element zero
.......................................................
7/10/2002  [BCX 2.92] Bug Fix -- POS and CSRLIN definitions were reversed
7/10/2002  [BCX 2.92] Bug Fix -- UNION bug in TYPE definitions
7/10/2002  [BCX 2.92] Bug Fix -- INPUT and FINPUT statement
............................................................................
7/06/2002  [BCX 2.91] Added RPAD$ function : RPAD$(A$, MaxLen, fillchar=32)
7/06/2002  [BCX 2.91] Added LPAD$ function : LPAD$(A$, MaxLen, fillchar=32)
7/06/2002  [BCX 2.91] Minor mod to $SOURCE output includes BASIC line numbers
7/06/2002  [BCX 2.91] Added Wayne's additions to 2.90 including improved
                      INPUT statement that now allows for this syntax:
                      INPUT "Prompt? ", a,b,c$,d,e$
                      Sample: Prompt?  1,2,Hello There,4, That's all folks!
............................................................................
7/05/2002  [BCX 2.90]  Added SPLIT function to the BCX lexicon
7/05/2002  [BCX 2.90]  Added FindFirstInstance as a built-in BCX function
7/05/2002  [BCX 2.90]  Minor bug fix to INPUT command by Wayne Halsdorf
7/05/2002  [BCX 2.90]  Added BCX_Cursor command for changing the GUI cursor
                       Following are the currently available cursor types:
.......................................................
                       BCX_Cursor (IDC_IBEAM)
                       BCX_Cursor (IDC_WAIT)
                       BCX_Cursor (IDC_CROSS)
                       BCX_Cursor (IDC_UPARROW)
                       BCX_Cursor (IDC_SIZENWSE)
                       BCX_Cursor (IDC_SIZENESW)
                       BCX_Cursor (IDC_SIZEWE)
                       BCX_Cursor (IDC_SIZENS)
                       BCX_Cursor (IDC_SIZEALL)
                       BCX_Cursor (IDC_NO)
                       BCX_Cursor (IDC_APPSTARTING)
                       BCX_Cursor (IDC_HELP)
                       BCX_Cursor (IDC_ARROW)
......................................................................
7/04/2002  [BCX 2.89]  Incorporated Wayne Halsdorf's numerous improvements
7/02/2002  [BCX 2.89]  Added IIF$ function to BCX lexicon
7/02/2002  [BCX 2.89]  Allow unquoted text in DATA statements
7/02/2002  [BCX 2.89]  Allow loop local variables in FOR NEXT loops
7/02/2002  [BCX 2.89]  Added UBOUND function.  This only works with single
                       dimensioned, static arrays.  Returns DIM'd size-1
                       See Con_Demo\S143.bas for and example of use.
7/01/2002  [BCX 2.89]  SUB/FUNCTION array parameters no longer use BYREF
6/29/2002  [BCX 2.89]  Added CLEAR command to BCX lexicon -CLEAR (static var)
6/29/2002  [BCX 2.89]  Added $LIBRARY meta-statement to BCX lexicon
6/29/2002  [BCX 2.89]  Improvements to Translation Error Messages
............................................................................
6/28/2002  [BCX 2.88]  Incorporated Wayne Halsdorf's REM and ' re-workings
6/28/2002  [BCX 2.88]  Incorporated Wayne Halsdorf's RANDOM file additions
6/28/2002  [BCX 2.88]  DECLARE statement now allowed inside $DLL projects
6/26/2002  [BCX 2.88]  Bug fix with comments in TYPE's by Wayne Halsdorf
6/23/2002  [BCX 2.88]  Added Unmatched Quotes error handler
6/22/2002  [BCX 2.88]  Added BIN$ function inspired by Roberto Berrospe
6/22/2002  [BCX 2.88]  Added Wayne Halsdorf tweak that now allows the keyword
                       PTR to be used in SUB & FUNCTION argument lists, i.e.
                       SUB Foo ( Bloof as MyType PTR )
6/22/2002  [BCX 2.88]  Rewrote internal CLEAN$ function, now allows statements
                       like PRINT USING$("###,###.##", 12345.678) to work
                       where before the "###,###.##" was being stripped out
6/22/2002  [BCX 2.88]  Corrected a bug with the INPUT command
............................................................................
6/21/2002  [BCX 2.87]  Enhanced TIME$ function -- see s142.bas in \CON_DEMO\
6/21/2002  [BCX 2.87]  Wayne Halsdorf's 2.86m w/ $PRJ, $PRJUSE
                       and enhanced STRUCT and UNION support
............................................................................
6/11/2002  [BCX 2.86]  Added EXP to FUNCTION Vartype to auto cast it as double
6/11/2002  [BCX 2.86]  Added FLUSH to the BCX lexicon
6/08/2002  [BCX 2.86]  Added DO LOOP WHILE to BCX lexicon
6/07/2002  [BCX 2.86]  Fixed bug with statements like: --Failed
6/07/2002  [BCX 2.86]  COPYFILE now allows optional FAILifEXISTS parameter
6/05/2002  [BCX 2.86]  $ONENTRY & $ONEXIT parameter is now case sensitive
6/03/2002  [BCX 2.86]  Flexible User Defined CALLBACK FUNCTIONS added to BCX
6/02/2002  [BCX 2.86]  Updated DLL_Demos to reflect new simplified DECLARES
6/02/2002  [BCX 2.86]  Improvements to DECLARE LIB ALIAS DLL declarations
6/02/2002  [BCX 2.86]  Improvements made to the parsing of TYPES & UNIONS
6/01/2002  [BCX 2.86]  Added FINPUT to the BCX lexicon
6/01/2002  [BCX 2.86]  Rewrote INPUT command & updated these con_demos:
                       S00,S04,S13,S25,S28,S35,S38,S64,S102,S110,S127,S134,S135
5/30/2002  [BCX 2.86]  Updated INPUT to allow multiple variables & arrays
5/28/2002  [BCX 2.86]  Updated INPUT to allow multi-dimensional arrays
5/28/2002  [BCX 2.86]  Updated EZ_GUI demo and SaveBmp demo
5/28/2002  [BCX 2.86]  Added Robert Wishlaw's GETBMP & SAVEBMP functions
5/27/2002  [BCX 2.86]  Re-Wrote S136.bas demo to show new USING$ formats
5/27/2002  [BCX 2.86]  Re-Wrote USING$ using xsprintf -- supports $ #,
5/27/2002  [BCX 2.86]  Removed unused library functions from USING$ handler
5/27/2002  [BCX 2.86]  Added SINH,COSH,TANH,ASINH,ACOSH,ATANH
5/27/2002  [BCX 2.86]  Added new revisions to ^ handler
5/23/2002  [BCX 2.86]  More dead code elimination ( thanks Jeff Nope )
5/22/2002  [BCX 2.86]  Added STDCALL calling convention to user functions
5/22/2002  [BCX 2.86]  Added INS$ & DEL$ by Chris Clementson & Robert Wishlaw
5/21/2002  [BCX 2.86]  Added midstrsub enhancements by Robert Wishlaw
5/21/2002  [BCX 2.86]  Added open file notification handler by Wm Halsdorf
5/13/2002  [BCX 2.86]  ^ (exponentiation op) bug fix
5/08/2002  [BCX 2.86]  Dead code elimination
5/06/2002  [BCX 2.86]  REM re-introduced into BCX
5/07/2002  [BCX 2.86]  Added Gerome Guillemin's improved REVERSE$ function
............................................................................
5/02/2002  [BCX 2.85]  IF-THEN-ELSE handler improvements By Wmhalsdorf
5/01/2002  [BCX 2.85]  REPEAT$ & JOIN$ improvements By Wmhalsdorf
4/30/2002  [BCX 2.85]  USING$ function improvements By Wmhalsdorf
4/30/2002  [BCX 2.85]  TALLY function improvements By Wmhalsdorf
4/29/2002  [BCX 2.85]  Added VCHR$ And Expanded MID$ Statement By Wmhalsdorf
4/28/2002  [BCX 2.85]  Source line limit increased to 1MB and 4095 tokens
4/28/2002  [BCX 2.85]  Corrected 2.84 omission of "nonsense" handler
............................................................................
4/26/2002  [BCX 2.84]  Added Wm Halsdorf "IF" handler fix
4/26/2002  [BCX 2.84]  Added Wm Halsdorf fix #2 to ^ operator handling
4/25/2002  [BCX 2.84]  Added Wm Halsdorf fix to ^ operator handling
4/25/2002  [BCX 2.84]  Added IMOD (Integer Modulo) to BCX lexicon
4/24/2002  [BCX 2.84]  Added QBCOLOR function
4/23/2002  [BCX 2.84]  Fixed $SOURCE ( Thanks to Sebastian Franz )
............................................................................
4/21/2002  [BCX 2.83]  Added BCX_TREEVIEW to the BCX GUI Suite of commands
4/21/2002  [BCX 2.83]  Added prototype for stdlib GETDRIVE function
4/19/2002  [BCX 2.83]  Added OPTIONAL hWnd (3rd Argument) to GETFILENAME$
.......................................................
4/14/2002  [BCX 2.83]  Uploaded 3 chart demos and a CustCtrl DLL that I've
                       been working on.  Demos help me to identify possible
                       abstractions/extensions to BCX.
.......................................................
4/10/2002 [BCX 2.83]  Totally rewrote the UNION command
4/10/2002 [BCX 2.83]  Fixed $SOURCE meta-statement
............................................................................
4/06/2002 [BCX 2.82]  Replaced \GUI_DEMO\CustCtrl\ with a real Custom Ctrl
4/06/2002 [BCX 2.82]  Re-Wrote BCX_CONTROL, adding a control ID field that
                      was missing, ading a field for extended window styles,
                      and making the window style and extended style optional
4/05/2002 [BCX 2.82]  BCX now treats DIM X% AS DOUBLE as DIM X AS DOUBLE
4/04/2002 [BCX 2.82]  Changed LINE INPUT to read up to 1 MB per line.
4/03/2002 [BCX 2.82]  Added more samples to \GUI_DEMO\
4/02/2002 [BCX 2.82]  Added Robert Wishlaw's improved LEFT$ function
4/02/2002 [BCX 2.82]  Added Robert Wishlaw's improved EXTRACT$ function
3/31/2002 [BCX 2.82]  Added Robert Wishlaw's improved TALLY function
3/31/2002 [BCX 2.82]  Added Robert Wishlaw's improved MID$ function
3/31/2002 [BCX 2.82]  Added Robert Wishlaw's improved REMOVE$ command
3/31/2002 [BCX 2.82]  Added Robert Wishlaw's improved JOIN$ command
3/31/2002 [BCX 2.82]  Added $SOURCE meta-statement - BASIC source as comments
3/30/2002 [BCX 2.82]  Added the following syntax for STDCALL declarations
                      DECLARE SUB/FUNCTION Foo$ LIB "Foo.Dll" ALIAS "Foo" (A$)
3/30/2002 [BCX 2.82]  Modified DLL_DEMO\STRDLL\  & \BCX-PB2\ to new syntax
3/30/2002 [BCX 2.82]  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
3/27/2002 [BCX 2.82]  Added error trap to $COMMENT meta-statement
3/25/2002 [BCX 2.82]  Promoted ROUND,ABS, & SGN functions to DOUBLE
3/24/2002 [BCX 2.82]  Added BCX_INPUT to the GUI commands
3/23/2002 [BCX 2.82]  Added PIXELS modifier to GUI cmd, ie> GUI "NAME",PIXELS
3/21/2002 [BCX 2.82]  Added Robert Wishlaw's tweaked KEYPRESS routine ver 6
3/16/2002 [BCX 2.82]  Format improvement to User Prototypes "C" output
3/12/2002 [BCX 2.82]  Modified INSTR to allow case insensitivity
3/10/2002 [BCX 2.82]  Modified GETFILENAME$ to work with XP and W2K
3/10/2002 [BCX 2.82]  Added POS,CSRLIN,CURSORX,CURSORY to BCX lexicon
    ............................................................................
3/09/2002 [BCX 2.81]  Added UNION/END UNION to the BCX lexicon
3/08/2002 [BCX 2.81]  Added Robert Wishlaw's tweaked KEYPRESS routine ver 5
3/06/2002 [BCX 2.81]  Added Robert Wishlaw's tweaked KEYPRESS routine ver 4
3/05/2002 [BCX 2.81]  BCX_SET_XXX do not require enclosing parenthesis
3/05/2002 [BCX 2.81]  Renamed SET_LABEL_COLOR to BCX_SET_LABEL_COLOR
3/05/2002 [BCX 2.81]  Renamed SET_EDIT_COLOR  to BCX_SET_EDIT_COLOR
3/05/2002 [BCX 2.81]  Renamed SET_FORM_COLOR  to BCX_SET_FORM_COLOR
3/05/2002 [BCX 2.81]  Renamed SET_FONT        to BCX_SET_FONT
3/05/2002 [BCX 2.81]  Renamed BCX_SETTEXT     to BCX_SET_TEXT
3/05/2002 [BCX 2.81]  Renamed BCX_GETTEXT     to BCX_GET_TEXT
3/05/2002 [BCX 2.81]  Added Robert Wishlaw's improved KEYPRESS routine ver 3
3/02/2002 [BCX 2.81]  Added Robert Wishlaw's improved RIGHT$ & REMAIN$ functions
3/01/2002 [BCX 2.81]  Added Robert Wishlaw's improved TRIM$  & LTRIM$  functions
............................................................................
2/27/2002 [BCX 2.80]  Changed SETFORMCOLOR to SET_FORM_COLOR ( demos updated )
2/27/2002 [BCX 2.80]  Added SET_LABEL_COLOR to BCX lexicon
2/27/2002 [BCX 2.80]  Added SET_EDIT_COLOR  to BCX lexicon
2/27/2002 [BCX 2.80]  Added SET_FONT to BCX lexicon
2/27/2002 [BCX 2.80]  Added $OPTIMIZER ON | OFF metastatement by Jeethu Rao
2/27/2002 [BCX 2.80]  Added CBHWND to BCX lexicon, supplementing PowerBasic
                      CALLBACK FUNCTION macros: CBMSG,CBWPARAM,CBLPARAM
2/25/2002 [BCX 2.80]  Added PEEK$ and POKE to the language
                      A$=PEEK$(Address,Count) - POKE(Destination,Source,Num)
2/24/2002 [BCX 2.80]  $ASM was not checking for case sensitivity -- fixed
............................................................................
2/24/2002 [BCX 2.79]  Added REPEAT/END REPEAT to the BCX Language
............................................................................
2/12/2002 [BCX 2.78]  Added Jeff Nopes hi-res compile-time timer code
2/10/2002 [BCX 2.78]  Added HTML sample to GUI_DEMO
2/10/2002 [BCX 2.78]  Added Mandlebrot sample to GUI_DEMO
2/05/2002 [BCX 2.78]  Added $ASM meta-statement (Thanks Jeethu Rao)
1/30/2002 [BCX 2.78]  InitCommonControls() added to ListView Handler
1/22/2002 [BCX 2.78]  $NOWIN corrected -- <richedit.h> was not being excluded
1/21/2002 [BCX 2.78]  REMAIN$ returns it's 1st arg when a match is not found
1/21/2002 [BCX 2.78]  Fixed bug with REMAIN$ ( reported by Felix Chan)
1/19/2002 [BCX 2.78]  2.78 compiles w/ BCC551 but still doesn't run correctly
1/19/2002 [BCX 2.78]  calloc cast to (char*) in BCX_TmpStr  for BCC551 compat.
1/19/2002 [BCX 2.78]  Changed fh in LOF from HWND to HANDLE for BCC551 compat.
1/19/2002 [BCX 2.78]  Changed hConsole  from HWND to HANDLE for BCC551 compat.
1/19/2002 [BCX 2.78]  Renamed translated environ to Environ for BCC551 compat.
1/17/2002 [BCX 2.78]  Minor Output format improvements
1/15/2002 [BCX 2.78]  Added Theo Hollenbergs code which allows an environment
                      variable named BCXLIB to be used in $INCLUDE statements
1/13/2002 [BCX 2.78]  Change: Remarks now written out with a trailing space
1/12/2002 [BCX 2.78]  Changed order of arguments to GET$ to match PUT$
1/12/2002 [BCX 2.78]  Updated S113.bas to match new syntax for GET$
1/12/2002 [BCX 2.78]  Added new & Improved COMMAND$ by Pat Kelly
1/12/2002 [BCX 2.78]  Added S141.bas CON_DEMO sample showing new COMMAND$
1/09/2002 [BCX 2.78]  Corrected bug with comments on $include lines
1/07/2002 [BCX 2.78]  Corrected bug with user string functions returning ""
1/05/2002 [BCX 2.78]  Corrected define for Use_Csng -- Thanks DL Programmer
1/04/2002 [BCX 2.78]  EXPORT keyword allowed in EXE's (SUBS/FUNCTIONS)
............................................................................
1/03/2002 [BCX 2.77]  Uploaded 2.77 using New Inno Installer
1/03/2002 [BCX 2.77]  Fixed bug with JOIN$
1/02/2002 [BCX 2.77]  Added FindClose to FindFirst function - thx to P Kelly
1/01/2002 [BCX 2.77]  Improved output C formatting
12/31/2001 [BCX 2.77]  Added CHDRIVE to BCX ( simply uses chdir in Win32 )
12/31/2001 [BCX 2.77]  Use_Screen was not being triggered -- fixed
12/31/2001 [BCX 2.77]  restored chdir, mkdir, and rmdir prototypes
............................................................................
12/30/2001 [BCX 2.76]  Uploaded 2.76 to the Website
12/30/2001 [BCX 2.76]  Created QB compatible SCREEN FUNCTION
12/29/2001 [BCX 2.76]  Pat Kelly added a very important enhancement to BCX
                       today -- he modified BCX so that arrays can be passed
                       to SUB's and FUNCTION's by reference.  This means
                       that the SUB or FUNCTION can access and modify the
                       elements of the arrays that are passed as arguments.
............................................................................
12/29/2001 [BCX 2.76]  Added CON_DEMO S138.bas & s139.bas showing Pat's mod
12/29/2001 [BCX 2.76]  Enhanced DLL_DEMO\StrArray demo to use Pat's mod
12/28/2001 [BCX 2.76]  Updated GUI_DEMO\MBWizard using Transparent Bmp routine
12/28/2001 [BCX 2.76]  Bug fix WRITE command (thanks to Pat Kelly)
12/27/2001 [BCX 2.76]  Added MIN(a,b) and MAX(a,b) double precision functions
12/24/2001 [BCX 2.76]  Added New demo in \GUI_DEMO\ScrollWn\
12/24/2001 [BCX 2.76]  Added New Metastatement $VSCROLL [lines]
12/24/2001 [BCX 2.76]  Fixed scaling problem with several GUI commands
12/24/2001 [BCX 2.76]  Added DOWNLOAD Command -- a = DOWNLOAD(Url$,FileName$)
12/23/2001 [BCX 2.76]  Added new QHTML sample -- Store & Load a HTML resource
12/23/2001 [BCX 2.76]  Added Vic McClungs $NOLIBMAIN MetaStatement
............................................................................
12/22/2001 [BCX 2.75]  BCX 2.75 Full Distribution Released
12/18/2001 [BCX 2.75]  Minor fix to $CCODE by Jeff Nope
12/16/2001 [BCX 2.75]  Added USING$ function & \con_demo\S136.bas
12/16/2001 [BCX 2.75]  Cosmetic changes to the output source code
12/16/2001 [BCX 2.75]  UDT's automatic pointer names changed to LPXXXXXXX
12/16/2001 [BCX 2.75]  Some unneeded runtime code was being emitted - fixed
12/16/2001 [BCX 2.75]  Memory leak fixed with the REPLACE function
12/15/2001 [BCX 2.75]  User Defined String Functions use a new mem allocation
12/15/2001 [BCX 2.75]  Runtime string funcs use Peter Nilsson's new allocation
12/13/2001 [BCX 2.75]  Now legal to use: PRINT A$ & B$ and WRITE A$ & B$
12/13/2001 [BCX 2.75]  Replaced MCASE$ with Pat Kelly's improved version
12/09/2001 [BCX 2.75]  JOIN$ reverted to earlier form: Join$(int,A$, ... )
12/09/2001 [BCX 2.75]  New PLAYWAV command -- dynamic linking of winmm.dll
12/09/2001 [BCX 2.75]  A few of my DLL samples changed to use the new DECLARE
12/09/2001 [BCX 2.75]  Revised DECLARE statement for use with stdcall DLL's
12/09/2001 [BCX 2.75]  Added Peter Nilssons fast REPLACE function
12/09/2001 [BCX 2.75]  Reworked SetFormColor again -- fixed resource leak
12/08/2001 [BCX 2.75]  Reworked SetFormColor again -- works on NT & Win2k
12/08/2001 [BCX 2.75]  Added BCX_GETTEXT$ and BCX_SETTEXT keywords
12/05/2001 [BCX 2.75]  Added Peter Nilssons fast INSTRREV function
12/05/2001 [BCX 2.75]  Minor code reduction/optimization of "dim" and "end"
............................................................................
12/04/2001 [BCX 2.74]  Created SetFormColor BCX command -- cool!
............................................................................
11/30/2001 [BCX 2.73]  BCX_ICON works on static and animated icons
11/30/2001 [BCX 2.73]  Added Robert Wishlaw's blazingly FAST MID$ routine
11/28/2001 [BCX 2.73]  Pat Kelly enhanced the PrintFormat function -- it now
                       correctly handles nested parenthesis in expressions
11/26/2001 [BCX 2.73]  The following Controls are enhanced to include automatic
                       text field sizing when their length parameter = 0
                       Also, these five controls now take optional parameters
                       =======================================================
                       BCX_FORM  BCX_BUTTON  BCX_LABEL  BCX_RADIO  BCX_CHECKBOX
11/24/2001 [BCX 2.73]  Reworked the DLL_Demos
11/24/2001 [BCX 2.73]  Bug fix EXIST function.
11/18/2001 [BCX 2.73]  DECLARE now adds _stdcall to the resulting prototype
11/09/2001 [BCX 2.73]  BCX_FORM enhanced to allow an optional STYLE
11/08/2001 [BCX 2.73]  Added BCX_CONTROL to the list of GUI COMMANDS
............................................................................
11/04/2001 [BCX 2.72]  =======================================================
                       ============== [ RENAMED GUI COMMANDS ] ===============
                       =======================================================
                       BCX_FORM      BCX_BUTTON    BCX_EDIT      BCX_LABEL
                       BCX_GROUP     BCX_CHECKBOX  BCX_BLACKRECT BCX_COMBOBOX
                       BCX_LISTBOX   BCX_WHITERECT BCX_RADIO     BCX_GRAYRECT
                       BCX_DATEPICK  BCX_RICHEDIT  BCX_BITMAP    BCX_ICON
                       BCX_LISTVIEW
............................................................................
10/31/2001 [BCX 2.71]  Uploaded to Yahoo site
10/27/2001 [BCX 2.71]  Bug fix -- DO UNTIL works again.
10/22/2001 [BCX 2.71]  Bug fixed a couple of the GUI commands
10/20/2001 [BCX 2.71]  Do While now supports mixed case tests: by Bob Wishlaw
10/19/2001 [BCX 2.71]  FORM command now has OPTION ARG: Example a=FORM("TEST")
10/19/2001 [BCX 2.71]  Modified default style of RICHEDIT control
10/19/2001 [BCX 2.71]  Bug fix with several GUI commands
10/16/2001 [BCX 2.70]  The New GUI Keywords are:
                        =======================================================
                        GUI, CONTROL, SUB FORMLOAD, BEGIN EVENTS, END EVENTS,
                        CENTERWINDOW, SHOW, HIDE, FORM, BUTTON, EDIT, LABEL,
                        GROUP, CHECKBOX, RADIO, COMBOBOX, LISTBOX, WHITERECT,
                        BLACKRECT, GRAYRECT, DATEPICK, RICHEDIT, BITMAP, ICON
                        LISTVIEW, SHOW, HIDE, SETWINDOWRTFTEXT
............................................................................
10/16/2001 [BCX 2.70]  Bug fix -- elseif was messing up AND & OR |
10/16/2001 [BCX 2.70]  Bug fix -- usage of:  DIM RAW A$,B$,C$
............................................................................
10/15/2001 [BCX 2.69]  Uploaded to Yahoo
10/15/2001 [BCX 2.69]  Improved MSGBOX function and statements
10/13/2001 [BCX 2.69]  Added simple GUI Interface functions
10/07/2001 [BCX 2.69]  Added C_DECLARE keyword for use with LoadLibrary calls
9/30/2001 [BCX 2.69]   New "RUN" code eliminates the need to link Shell32.lib
9/29/2001 [BCX 2.69]   Minor bug fix with the WRITE command
9/29/2001 [BCX 2.69]   OPTIONAL SUBS/FUNCTIONS accept specified default values
9/28/2001 [BCX 2.69]   Functions/Subs now allow the syntax ( byref A, byref B )
9/26/2001 [BCX 2.69]   File Handling modifications by Jeethu Rao
9/26/2001 [BCX 2.69]   Added AppExeName$, AppPath$, TempFileName$ functions
9/26/2001 [BCX 2.69]   The BCX core itself uses TempFileName$ now
............................................................................
9/26/2001 [BCX 2.68]   Uploaded Exe/Src/Revision to Yahoo
9/26/2001 [BCX 2.68]   Added Pat Kelly's error file generation
9/25/2001 [BCX 2.68]   Added Pat Kelly's fix to mixed case "IF" tests
9/25/2001 [BCX 2.68]   Added Pat Kelly's fix to PrintFormat & WriteFormat
9/25/2001 [BCX 2.68]   Replaced BORN36 with BORN49 RND() function
............................................................................
9/23/2001 [BCX 2.67]   Uploaded Source & EXE to Yahoo
9/22/2001 [BCX 2.66]   Killed Elseif bug ( reported by Vic McClung )
9/16/2001 [BCX 2.66]   More dead code elimination and code cleanup
9/15/2001 [BCX 2.65]   BCX correctly handles LongFileNames with "." in them
............................................................................
9/13/2001 [BCX 2.63]  Stable version of 2.62b uploaded to Yahoo
9/09/2001 [BCX 2.62b] Added BASIC exponentiation operator ^
9/09/2001 [BCX 2.62b] Added GetFileName$ function:: GetFileName$(Title$,Ext$)
9/09/2001 [BCX 2.62b] Added EXP function to the BCX lexicon
............................................................................
9/09/2001 [BCX 2.61] Bug fix: ! inline "C" operator out of sync in some cases
............................................................................
9/08/2001 [BCX 2.60] Uploaded to Yahoo
9/07/2001 [BCX 2.60] Major speed improvements -- BCX self translates in 22 sec!
9/07/2001 [BCX 2.60] Updated LIKE function w/ Peter Nilsson's exhanced version
9/07/2001 [BCX 2.60] re-worked JOIN$ function -- max size = 2048 bytes
9/07/2001 [BCX 2.60] Replaced memmove with memcpy in a couple of RTL functions
9/05/2001 [BCX 2.60] Restored substring capable version of TALLY
............................................................................
9/04/2001 [BCX 2.51] Uploaded to Yahoo BCX Group
9/04/2001 [BCX 2.51] More string handling enhancements
9/04/2001 [BCX 2.51] BCX translates much faster
9/04/2001 [BCX 2.51] Optimized some internal BCX parsing routines
9/04/2001 [BCX 2.51] REM has been removed from the lexicon
............................................................................
9/23/2001 [BCX 2.50] Somewhat faster compiles
9/20/2001 [BCX 2.50] S130.bas modified to support new string enhancements
9/17/2001 [BCX 2.50] Fixed bug with $COMMENT
............................................................................
9/16/2001 [BCX 2.42]  Uploaded to Yahoo
............................................................................
9/14/2001 [BCX 2.41e] Modified LINE INPUT to test for & replace CR w/null
9/14/2001 [BCX 2.41e] BCX_STR increase to 1Mb
9/14/2001 [BCX 2.41e] Fixed bug with comments on $include lines
9/14/2001 [BCX 2.41e] Enhanced parsing of string expressions
............................................................................
9/14/2001 [BCX 2.41d] Uploaded to Yahoo -- seems to be stable
9/13/2001 [BCX 2.41]  Fixed bug with STEP command in FOR-NEXT statements
9/13/2001 [BCX 2.41]  Added sizeof(char) to calloc statements
9/13/2001 [BCX 2.41]  Added DIM RAW to the lexicon
9/12/2001 [BCX 2.40]  Uploaded 32-bit BCX to Yahoo!
............................................................................
          MY BCX DEVELOPMENT FOCUS SHIFTS TO THE 32-BIT VERSION
............................................................................
7/30/2001 [BCX 2.40]  Added $CCODE meta-statement
7/29/2001 [BCX 2.40]  Added GRAPH to \GUI_DEMOS\
7/25/2001 [BCX 2.40]  Added TextMode function and statement (25, 43, 50 lines)
7/25/2001 [BCX 2.40]  BCX standardizes sub main()&function main() declarations
7/24/2001 [BCX 2.40]  CLS function clears 4000 chars ( used to be 2000 )
............................................................................
6/17/2001 [BCX 2.39]  Recompiled & packed w/UPX to cure WinME crash( Posted )
6/12/2001 [BCX 2.39]  Fixed problems with SendMessage translations ( Posted )
............................................................................
5/27/2001 [BCX 2.38]  New ( and improved ) RND and RANDOMIZE functions
5/22/2001 [BCX 2.37]  InstrRev bug fix release
5/14/2001 [BCX 2.36]  added ON {expression} CALL | GOTO | GOSUB
5/13/2001 [BCX 2.35]  fixed bug with handling unquoted underscores in comments
5/12/2001 [BCX 2.34]  New bug handling underscores in comments -- arghh!
5/09/2001 [BCX 2.33]  fixed bug with how BCX was handling unquoted underscores
5/06/2001 [BCX 2.32]  fixed bug with FWRITE command
5/04/2001 [BCX 2.31]  Added DO UNTIL and LOOP UNTIL to the grammer
5/04/2001 [BCX 2.31]  Added FreeFile function
5/04/2001 [BCX 2.31]  Added InstrRev function
............................................................................
5/01/2001 [BCX 2.30]  Metastatements: $Compiler, $Linker, $OnEntry, $OnExit
                      $OnEntry executes prior to C compiler, $OnExit is last
                      $file$ is a replaceable quoted macro within $OnExit
............................................................................
4/29/2001 [BCX 2.30]  Added more BCX error checking
4/29/2001 [BCX 2.30]  fixed bug with detecting ^ character
4/29/2001 [BCX 2.30]  strings in TYPE's now default to [2048] bytes
4/29/2001 [BCX 2.29]  Allows comments on the right side of line continuators
4/29/2001 [BCX 2.28]  Added mixed string assignments: A$ = 1.2 & "Hello"
4/28/2001 [BCX 2.27]  Modified Binary File Access by adding new qualifiers:
                      BINARY, BINARY NEW, and BINARY APPEND
4/28/2001 [BCX 2.27]  Increased BCX string stack to 64, giving more flexibility
4/25/2001 [BCX 2.27]  mods MID$, INSTR, LOCATE, ASC, CHR$ to be C++ compatible
............................................................................
4/24/2001 [BCX 2.26]  Added $CPP metastatement which attempts C++ compliance and
                      also names the output file .CPP
............................................................................
4/23/2001 Fixed the "elseif" bug
4/22/2001 Minor modification -- BCX emits now CONST's before UDT's
4/19/2001 Bug Fix -- I re-wrote the ASC function again.
4/15/2001 BCX now emits labels with ":;" to keep LCC-Win32 quiet & happy
............................................................................
    IMPORTANT UPDATE!
............................................................................
    I replaced the JOIN$ function with a new version that no longer needs
    the number of arguments passed to it.  It uses the Variable Argument header
    and therefore that header has been added to the BCX standard header listing.
    Demos using JOIN$() function have been updated
............................................................................
4/08/01 UPDATED BCX Help File
4/08/01 ADDED BIN2DEC function as a BCX keyword
4/08/01 ADDED CRLF$ as a BCX keyword -- BCX demos have been updated
4/08/01 Added DELAY command to the language : Usage DELAY seconds
............................................................................
4/06/01 ADDED OPTIONAL ARGS to MID$, LOCATE, COLOR, INSTR
    MID$(A$,Pos,[length])    default = 1,000,000
    LOCATE y,x, [0 or 1]     default = 0
    INSTR (A$,B$,[StartPos]) default = 0
    ASC(A$,[index]           default = 0
    CHR$(v1,[v2,v3,v4,v5,v6,v7,v8,v9,v10])  accepts up to 10 arguments
............................................................................
4/06/01 FINALLY! LCC-Win32 OPTIONAL ARGS bugs killed!   Let the fun resume!
............................................................................
3/31/01 need to watch for LCC updates that fix problems with
    calling OPTION ARG SUBS/FUNCTIONS from other SUBS/FUNCTIONS
    Also need to watch for stable implementation of overloaded args
............................................................................
3/31/01 Corrected bug with DIM local string arrays in SUBS/FUNCTIONS
3/31/01 Added OVERLOADED SUB/FUNCTION capability
3/27/01 Added OPTIONAL ARGUMENTS to User Defined SUBS and FUNCTIONS
3/26/01 Statement like DIM STATIC A$,B$,C$ wasn't working -- Fixed!
3/23/01 Enhanced TYPE to automatically add a type pointer of type >> *Name_PTR
3/22/01 Fixed bug with EXIT SUB emitting "exit" instead of "return"
3/22/01 Replaced "feof" with my previous EOF code -- feof crashed w2000
3/20/01 Fixed problem with "WRITE" command not parsing correctly
3/14/01 A new DLL demo -- create a PowerBasic static DLL lib & call it w/BCX!
3/12/01 Changed SET command when specifying STRINGS for compatibility w/QSORT
3/11/01 Added native QSORT support w/ ASCENDING-DESCENDING option
............................................................................
3/08/01 Fixed INT() -again-
3/04/01 Spent all day optimizing for speed.  BCX translates 45% faster now.
3/03/01 Added $IPRINT_ON & $IPRINT_OFF metastatements for controlling \ to \\
3/02/01 Added WINDIR$ function.  Returns the Windows Directory.
3/02/01 BCX now recognizes PTR as keyword.  Example Dim MyVar as DWORD PTR
............................................................................
3/01/01 Corrected problem with exported SUB/FUNCTION gobbling up ascii 240 char
............................................................................
2/25/01 Ported GetHttp to BCX -- uploaded to Yahoo Group
2/25/01 ARGC, ARGV and ARGV$ are all reserved words
2/21/01 Added fflush(stdout) just before ExitProcess(0) in order to make
    sure screen output that is redirected is completely written.
2/21/01 Changed RND function to generate numbers between zero and one
2/20/01 Minor enhancement to MID$ command
2/18/01 BCX 2.07 replaced Tally Function with DL's version
............................................................................
2/17/01 BCX 2.06 fixes problem with UDT that use arrays of UDT's
2/14/01 Bcx Allows Old Fashioned LINE NUMBERS
2/14/01 Rewrote EXIST function to support multiuser environments
2/14/01 BCX supports DIM LOCAL, DIM SHARED, DIM STATIC
2/13/01 Real LOCALS, Real STATICS
............................................................................
2/11/01 Added PRIVATE CONST.  Only in SUBS/FUNCTIONS and MUST eval to INTEGER
2/10/01 Modified: OPEN, CLOSE, WRITE, FPRINT, LINE INPUT, SEEK, GET$, PUT$
        to allow literal numbers for file handles.  BCX will prepend FP
............................................................................
2/05/01 SQR & SQRT both supported
1/28/01 Uploaded MouseOver Demo to the Yahoo Egroup
1/28/01 Added NOW$ function -- akin to the VB NOW function
1/22/01 Minor tweak to DC11A
1/20/01 Created new and improved BMPBUTTON sample
............................................................................
1/20/01 Added these PowerBasic Compatible Callback Keywords
       CBCTL     - Equates to "LOWORD(wParam)"
       CBCTLMSG  - Equates to "HIWORD(wParam)"
       CBHNDL    - Equates to "hWnd"
       CBWPARAM  - Equates to "wParam"
       CBLPARAM  - Equates to "lParam"
       CBMSG     - Equates to "Msg"
1/20/01 Added WRITE & FWRITE for creating CSV outputs.  Same syntax as PRINT
1/19/01 Added CALLBACK FUNCTION short form
1/19/01 Added TALLY function ( thanks to DL for this )
1/19/01 Minor tweaks to KEYPRESS & DOEVENTS
1/19/01 Modified DC to use these changes
............................................................................
1/10/01 Version 2.00 released -- BCX egroup renamed -- website updated
1/07/01 Reworked DB to output subclass modules for each control
1/06/01 Fixed Conditional Compilation operators today -- did anyone notice?
1/06/01 Created $NOMAIN translator directive -- excludes main() function
1/06/01 Updated Dlg2Bas ( DB.EXE ) and uploaded to EGROUPS
............................................................................
12/31/00 BCX treats PUBLIC FUNCTION and PUBLIC SUB simply as FUNCTION & SUB
12/25/00 Created BUILT-IN function JOIN$ to help with string concatenation
12/25/00 Created 2 new GUI demos: EDITCTRL AND FONTS
         Demonstrates setting text colors and fonts in static and edit ctrls
............................................................................
12/24/00 TYPES no longer need "DIM" preceding the member definitions
12/24/00 Enhanced Select Case -- See \con_demo\s127.bas
12/24/00 Fixed bug with dimensioning string menbers in UDT's
12/24/00 Added shlobj.h to list of standard #includes
12/24/00 Added BrowseFolder ( S126.bas) to \con_demo\  -- very useful!
............................................................................
12/20/00 Changed FINT to use floor to give the INT function BASIC compatibility
............................................................................
12/19/00 Added SET command to the BCX language
12/19/00 Wrote Standard Deviation demo which uses the SET command
12/19/00 BYREF not -required- for arrays in function/sub declarations
............................................................................
12/17/00 BugFix: TRIM$ ( again )
12/17/00 BugFix: LTRIM$, RTRIM$, TRIM$, REVERSE$
............................................................................
12/16/00 Created BCX BOUNCE demo in \gui_demo\
............................................................................
12/15/00 BugFix: fixed problem with malloc not alloc'g enough string space
............................................................................
12/10/00 BugFix: BCX not recognizing FilePointer Variables@ in Subs/Functions
12/10/00 Re-coded GET$ & PUT$ into macros to read & write asciiz strings
         Note:  Both commands NOW REQUIRE that you specify the number of
         bytes being read from or written to.

         Example1:  GET$ FP1,33,A$   ' STANDARD BASIC CONVENTION
         Example2:  PUT$ FP1,A$,33   ' NON-STANDARD but necessary because
         ' C uses zero terminated strings
............................................................................
12/08/00 Enhanced Dlg2Bas utility
12/08/00 Created optional short declarations for WinMain() & WndProc()
    Usage:  Function WinMain ()
    Uses Parameter Names:  hInst, hPrev, CmdLine, CmdShow
............................................................................
    Usage:  Function WndProc ()
    Uses Parameter Names:  hWnd, Msg, wParam, lParam
............................................................................
12/06/00 Created BCX Text Scroller Demo
12/06/00 Created Initial Visual Designer Demo
............................................................................
12/04/00 Added IIF function ( Immediate If )
............................................................................
12/03/00 Added PowerBasic-like MCASE$ function
12/03/00 Reworked String Function initialization routines to use memset
12/03/00 Implemented VB-like DoEvents command
............................................................................
12/02/00 Created new graphic demo LORENZ in \gui_demo\lorenz\
12/02/00 Finished BCX MessageBox Builder 1.1 -- uploaded to EGROUPS
............................................................................
11/29/00 Allow Multiple DIM,SHARED,GLOBAL, & CONST declarations on one
    line separated by comma's
11/29/00 BCX Allows DIM SHARED
11/29/00 Added CINT, CLNG, CSNG, CDBL macros
...........................................................................
11/28/00 #include's automatically converted to lowercase
11/26/00 Enhanced Dlg2Bas utility
...........................................................................
11/26/00 Improved MACRO capability with CONST's -- See \con_demo\S124.bas
11/26/00 Added STRPTR function -- implemented as a C macro
11/26/00 Replaced other small runtime functions with C macros
11/26/00 Created DRAGICON demo in \GUI_DEMO\
...........................................................................
11/25/00 Created Horizontal & Vertical SPLITTER BAR demo's in \GUI_DEMO\
11/25/00 Cleaned up code generation in DB and BCX
11/25/00 Allow "CALLBACK" in SUB and FUNCTION declarations
11/25/00 Allow "as string" with FUNCTION declarations
11/25/00 Rewrote keyboard INPUT handler
...........................................................................
11/24/00 Rewrote VAL function
...........................................................................
11/23/00 Added END PROGRAM mechanism to force end of main()
11/23/00 Added REVERSE$ function
11/23/00 Added REMAIN$ function, complement to EXTRACT$
...........................................................................
11/20/00 re-worked String Dimensioning parser
...........................................................................
11/16/00 added code that automatically initializes dynamic strings
...........................................................................
11/14/00 Discovered & killed nasty bug associated with dynamic strings
...........................................................................
11/12/00 Updated DLG2BAS to correctly scale to users screen using DialogUnits
............................................................................
11/11/00 Updated HLP file, FINALIZED Version 1.85, updated to website
............................................................................
11/01/00 Tweaked the "C" output formatting
11/01/00 Added keyword XOR
11/01/00 Added keyword ITERATE -- iterates the currently executing loop
11/01/00 BCX replaces \ with \\ inside quoted strings
............................................................................
10/31/00 Introduced conditional compilation using $IF/ELSEIF/$ELSE/$ENDIF
............................................................................
10/29/00 Fixed bug relating to INT and INTEGER that confused the translator
10/29/00 Fixed bug relating to use of EXPORT
10/29/00 Added ability to DIM multiple variables on same line.
    Example 1 : DIM     a,  b! , c$, d$ * 1000, q [100] as dword
    Example 2 : GLOBAL  a,  b! , c$, d$ * 1000, q [100] as dword
    Example 3 : LOCAL   a,  b! , c$, d$ * 1000, q [100] as dword
    Example 4 : SHARED  a,  b! , c$, d$ * 1000, q [100] as dword
............................................................................
10/27/00 Added BYREF keyword to facilitate passing arrays to FUNCTIONS & SUBS
............................................................................
10/26/00 Differentiated the STRING$ and REPEAT$ functions
10/26/00 Updated HLP file and added a working index to it.
10/26/00 Enhanced INCR and DECR commands to be PowerBasic compatible
............................................................................
10/25/00 Added REDIM to Dynamic, one-dimensional strings.  An example ...

    DIM    A$ *   10
    REDIM  A$ * 1000

    The generated "C" code frees the previous block then allocates the new memory
............................................................................
10/14/00 Changed default string length from 257 to 2048 bytes
10/14/00 Added BINARY, SEEK, GET$, and PUT$ file functions & a console demo
10/14/00 Added WM_CLOSE event code to DB code generator
10/14/00 Created new STATICALLY LINKED DLL demo, in the DLL_Demo folder
10/14/00 Added DECLARE keyword for DECLARING SUB's/FUNCTIONS in DLL's
............................................................................
10/06/00 Created new GUI demo showing how to embed & play a WAVE file
         This requires a new tool BIN2TXT which I will include in next release
...........................................................................
10/03/00 Created new GUI demo showing how to set your own APPLICATION ICON
...........................................................................
10/01/00 Major updates today.  Major re-writes of most internal string
         functions modifying them to use dynamic strings eliminating
         most of the previous string length limitations.  Also, some
         of the routines now use some optimized routines modified from
         the popular "C" snippets collection.  I tested every sample
         program against this major update and they all work correctly!
10/01/00 Added $COMMENT translator directive ( like BASM )
............................................................................
9/24/00 Updated BCX Help file
9/24/00 Added LIKE function -- ( cool! )
9/24/00 Added PB-like syntax>>  REMOVE  "this"  FROM  MyString$
...........................................................................
9/23/00 Created a simple console demo file that shows how to sort strings
9/23/00 Fixed SWAP so that it correctly handles array variables
9/23/00 Added PB-like syntax>>  REPLACE "this" WITH "that" IN MyString$
9/23/00 Re-coded REPLACE function -- still not perfect but much better!
............................................................................
9/11/00 Updated HELP file
9/11/00 Added GOSUB/RETURN
...........................................................................
9/10/00 Added STDCALL as an option to $DLL
...........................................................................
9/04/00 Made INPUT compatible with QB\PB when inputting STRINGS
...........................................................................
9/12/00 Modified CONST to add a space between parsed fields
...........................................................................
7/20/00 Added ELSEIF compatibility
...........................................................................
7/19/00 Minor tweaks to DB -- cleaner and better formatted
...........................................................................
7/16/00 $NOWIN corrected
...........................................................................
7/15/00 Added ability to use #include statements in BASIC source
............................................................................
7/01/00 Small tweak to DB to cast WinMain to int
...........................................................................
6/15/00 BCX handles TABS in BASIC source lines
...........................................................................
6/09/00 Updated the .HLP file
6/09/00 DIM, GLOBAL, SHARED, & LOCAL now support multiple dimensions & UDT's
...........................................................................
6/04/00 Improved the parsing of the OPEN statement
6/04/00 Added LessThan & GreaterThan ( < > ) string comparison functionality
6/04/00 Fixed bug with MID$ statement
............................................................................
5/31/00 Updated Website with new download
...........................................................................
5/28/00 Created new Con_Demo (Set Wall Paper)
5/28/00 Created new GUI_demo (DragWin) for dragging a form w/o a title bar
5/28/00 Created new GUI_demo (Tile) for tiling a bmp to a form
5/28/00 Created new GUI_demo (Calendar) -- how to call MonthCal Win32 Control
............................................................................
5/27/00 I purchased "Programming Windows 5th Edition" by Charles Petzold
............................................................................
5/20/00 Created SWAP command and a demo function
............................................................................
5/8/00  Lots more work on the help file ... what a pain
5/8/00  Created built-in function SetAttr ( Complement to GetAttr )
5/8/00  Changed built-in function GetFileAttr to GetAttr
............................................................................
5/07/00 More work on the Windows Help File.  Coming along nicely
5/07/00 Wrote BCX GRADIENT FX demo in GUI_DEMO
............................................................................
5/06/00 Added the RUN command which calls the Win32 "ShellExecute" function
    NOTE:  Using RUN in your program requires linking shell32.lib
............................................................................
5/03/00 Added INT built-in function.
............................................................................
4/30/00 Recoded the INSTR function.  Faster and supports huge strings
............................................................................
4/29/00 Added ENVIRON$ built-in function.
4/29/00 Added ROUND built-in function.
............................................................................
4/28/00 Added SGN built-in function.
4/28/00 fixed minor CASE bug
............................................................................
4/25/00 Added FRAC built-in function.
............................................................................
4/24/00 Added a sample program that demonstrates these new functions
4/24/00 Added RANDOMIZE built-in function
4/24/00 Added RND built-in function
............................................................................
4/22/00 Started work on new BCX Windows Help file
4/22/00 Created OCT$ built-in function
4/22/00 Created HEX$ built-in function
............................................................................
4/21/00 Created built-in REMOVE$ function & console demo program for it
4/21/00 Dlg2Bas (DB.EXE) now supports most user selected Dialog styles
4/21/00 Created another GUI sample : HowTo: draw 3d-Frames
4/21/00 Created console mode sample: HowTo: use Winsock
4/21/00 Added #include winsock.h to the standard generated includes
............................................................................
4/16/00 Created console mode sample: HowTo: GetText/PutText
............................................................................
4/13/00 Created console mode sample: HowTo: Forcing FullScreen mode
............................................................................
4/9/00  Modified DB source code modifying format of the output
4/9/00  Modified BC by creating another temp file "bcx.cst" which is used to
    buffer CONST statements and places them above global variable init's
............................................................................
2/28/00 back from a long break -- downloaded newest version of LCC-Win32 and
    discovered that Jacob Navia redefined NULL so I modified several of
    the demos and the DB translator to emit 0 instead of NULL in some
    selected routines.
............................................................................
1/15/00 updated website with new Windows based installation (WISE)
...........................................................................
1/10/00 added FIX function ( akin to INT ) for truncating fraction portions
1/10/00 fixed minor bug with Select Case structure
...........................................................................
12/31/99 Added $INCLUDE capability.  Nested includes allowed.
12/29/99 Created FeatCode utility for work and added it to GUI_DEMO's
............................................................................
12/27/99 Updated Website
12/27/99 Fixed Nesting Bug with "Select Case"
12/27/99 Added $NOWIN -- which removes Win32 header files
12/27/99 Modified CONST to produce true parameterized MACROS
............................................................................
12/26/99 Added DATA statement string capability.  Here's an example ...
    Dim i
    While DATA$ [i] <> "EndOfData"
      Print DATA$ [i]
      Incr i
    Wend
    DATA "111","222","333","444"
    DATA "555","666","777","888"
    DATA "999","EndOfData"
............................................................................
12/26/99 Adopted ANSI "C" comment style, e.g.  /* here's an ANSI C comment */
12/26/99 Added support for "CASE ELSE" in SELECT CASE blocks
12/26/99 Speeded up SELECT CASE blocks
12/26/99 Created MsgBox FUNCTION.  Updated S18.BAS in \DEMOS\
12/26/99 Renamed MessageBox to MsgBox to avoid Windows conflicts
...........................................................................
12/23/99 Changed "END" to execute an ExitProcess(0).  Works for Console & GUI
...........................................................................
12/20/99 Added "DO WHILE" compatibility,  e.g.  Do While A < 100
12/20/99 "IF" statements containing "or" and "and" are treated as "Boolean"
    Non-"IF" statements containing "or" and "and" are treated as "bitwise"
12/20/99 Created "Abort" Procedure to trap "if without then" errors
12/20/99 Added a HELPER for SendMessage.  This HELPER takes care of adding
    the appropriate "C" type casting making for an easier syntax.
12/20/99 Introduced HELPERS, for simplifying certain Win32 statements.
...........................................................................
12/19/99  Created my first true dialog using BCX
...........................................................................
12/18/99  Updated Website with new files
12/18/99  $DLL must be first statement in program file
12/18/99  Added DLLDEMO folder to demostrate the technique
12/18/99  Added $DLL as a simple means of creating DLLs with BCX
12/18/99  Added User Defined Types (UDT) -- arrays of UDTs not supported yet
...........................................................................
12/13/99  Fixed problem with "NOT" in cases like "IF NOT hPrev"
12/13/99  Created a sample GUI program to be used as a template.
12/13/99  BCX does GUI's!  BCX recognizes and fixes up WinMain & WndProc
...........................................................................
12/12/99 Removed DYNAMIC altogether and simply enhanced DIM to support it

    Valid Examples:
    GLOBAL A$ * LOF("MyFile.Exe")
    SHARED A$ * LOF("MyFile.Exe")
    LOCAL  A$ * LOF("MyFile.Exe")
    Dim    A$ * LOF("MyFile.Exe")

    Dynamic strings use global LPSTR (pointer) variables so they aren't true LOCAL
    variables but their memory space is dynamic and MUST be FREE'd when finished
...........................................................................
12/11/99 Added KEYPRESS function and a demonstration program for it
...........................................................................
12/08/99 Added a couple more SAMPLE programs
...........................................................................
12/05/99 Added ability to specify arg types and FUNCTION types using "AS"
........................................................................**
12/04/99 Updated Website with all new files and 1st release of version 1.5
12/04/99 Added _ line continuation.  Cannot be followed by a REMark or ' char
12/04/99 Expanded DIM to handle statements like:    DIM r AS SMALL_RECT
...........................................................................
12/03/99 User Defined Variables, Labels, SUB & FUNCTION names have been made
12/03/99 CASE SENSITIVE. This allows easy usage of Windows Structures and
12/03/99 Windows Functions.
12/03/99 All 69 demo programs have been updated and tested with this version
...........................................................................
12/01/99 added IS keyword.  IS is a syntactic substitution for the "=" symbol
...........................................................................
11/29/99 added FREE for releasing DYNAMIC strings back to Windows.
11/29/99 added DYNAMIC for creating dynamic strings [ex. dynamic a$ * 5000 ]
...........................................................................
11/28/99 added TempDir$ function --returns operating system temporary directory
11/28/99 added SysDir$ function -- returns operating system directory
11/28/99 added CurDir$ function -- returns current working directory
...........................................................................
11/26/99 added SHARED & GLOBAL keywords
...........................................................................
11/21/99 added GetFileAttr Function
11/21/99 negative FOR-NEXT loops controlled using a "STEP -"
...........................................................................
11/20/99 added MID$ statement  ( complement to mid$ FUNCTION )
11/20/99 added INSTAT function
11/20/99 fixed bug with WHILE correcting "=" condition
...........................................................................
11/15/99 added LOF function
...........................................................................
11/14/99 added FindFirst$ and FindNext$ functions
11/14/99 started this revision log

