2013 November 9
   Initialize repository
   Add scanner files
   Add Makefile
   Add README, COPYING, and this ChangeLog
   Add binary search routine for scanner to lookup identifiers to find
     keywords, built-in function names, etc.
   Add character class support

2013 November 10
   Add FSM itself
   Add test code for scanner
   Add support for numeric  literals
   Add support for string literals
   Fix bugs where variables were in scanner.h instead of scanner.c
   Add main.c with options processing

2013 November 11
   Begin work on parser, stub it out with a self test, recognize
     REM, STOP, END.
   Much thought and a few fixes to T_NUMBER in scanner FSM.
   Add dump_token_stream() as a way to non-destructively dump the
     token stream for debugging.

2013 November 12
   Add missing T_SEMICOLON to scanner for PRINT statement.
   Continue work on parser, recognize GOTO, GOSUB, RETURN, RANDOMIZE,
     PRINT, LET, arithmetic expressions, built-in functions,
     OPTION BASE, RESTORE, INPUT, READ, DATA, DIM, FOR, NEXT.
   Add array syntax support for assignment in LET/READ/INPUT and for
     expressions.
   Add some more simple test programs.
   Add support for quoted strings and string scalar variables in
     DATA, READ, INPUT, PRINT, LET, and IF statements.
   Add support for built-in TAB() function in PRINT statement.
   Add support for user-defined functions with DEF.
   Rewrite GOTO/GOSUB detection in the scanner to happen on a second separate
     pass.  This can be optimized later, but for now at least it works with
     any number of spaces between the GO and the TO/SUB.  Since the list is
     singly linked, it is not easy to backtrack once we hit TO/SUB to see what
     the previous token was, but on a second time trough we can look ahead
     when we hit GO to see if the next token is SUB or TO and merge the
     GO/TO into GOTO and the GO/SUB into GOSUB, all before the parser sees it.
   Add more test cases to parser self-test code.

2013 November 13
   Hack scanner to handle ECMA-55 'unquoted-string' in DATA statements.
   Totally rewrite PRINT grammar so it works with the bizarre empty fields.

2013 November 14
   Begin transcribing actual ECMA-55 standard into a text file so it is
     searchable (and a lot smaller than the PDF).
   Add a man page
   Add a new lineno module that tracks line numbers, jump targets and has
     verify_all_jump_targets() that can, after a syntax-only parse, verify
     that all jump targets actually exist in the program.

2013 November 15
   Typed in ECMA-55 standard as plain-text file in iso_8859-1
     encoding.

2013 November 16
   Write an all new total-FSM scanner, scanner2.[ch]  This handles everything
     except unquoted strings and doesn't need any binary search lookups so it
     is faster, cleaner, and simpler.  It recognizes user-defined function
     names, scalar numeric variables, scalar string variables, real constants
     and integer constants, which means the parser will need some tweaking to
     use it, even though the external API is unchanged, since a few of the
     tokens changed.

2013 November 17
   Create all new DATA item scanner FSM.  Add good tests for this to self-test
     of scanner2.  Actually verify what the scanner does in self-tests for
     scan_buffer including number of tokens, exact token ids and text for
     each token, etc.  Several small fixes to the FSM table data.  At this
     point the data item tests seem to pass, but I don't have the state-change
     to switch scanners for data items hooked up yet, since after all the
     problems and writing it all twice I felt the need to add some
     industrial-strength self test code.  I implemented -v and -V for scanner2
     self-tests, which turn on verbose and force quit at first error
     respectively.

2013 November 18
   Fix grammar in parser2 to enforce rule that END cannot occur
     anywhere but the last line where it MUST occur.

2013 November 19
   Add extensive self-tests to lineno module.  Add get_next_line(),
     get_next_jump_target(), jump_target_exists() to lineno module.
   Update parser2 self-test module to handle -v and -V arguments.
   Add debug_printf() as the one way to print diagnostic information
     so it can be redirected if required.

2013 November 21
   Merge data FSM into main FSM, guarantee a data item does not end on a space,
     allow leading spaces for data items, add more tests for data statements,
     guarantee we have one space (or a newline) after any keyword.

2013 November 22
   Enforce 72 byte + EOL limit
   Enforce 1..9999 line number range
   Enforce blanks before all keywords
   Enforce blanks after all keywords unless they are at the end of
     the line
   Enforce requirement that all lines begin with a line number
   Enforce rule that prohibits duplicate line numbers
   Update parser to handle UQSTRING in DATA statements, now that
     the scanner can produce them
   Remove old scanner/parser
   Improve error messages

2013 November 28
   Add symbol table module.
   Update parser to use symbol table module, with type checking in expressions
     for A..Z that can be array or scalar, and for number of dimensions if
     they are arrays.  This required fixing several parts of the self-test
     program data.
   Add explicit flushing in several parts of parser2 self-test so that the
     output does not get scrambled with -v and -V.

2013 December 9
   Finally implement DATA statement item storage.  I use an array of void
     pointers, and the first byte of the items which they point to is a
     discriminator sort of like Pascal variant records use.

2013 December 11
   Actually implement expression evaluation using a private operand stack.
   The generated assembler code for arithmetic expressions uses macros
     to make the code easy to read and generate.

2013 December 12
   Implement ABS(), SQR() using a macro-based approach.
   Implement INT() using a function.
   Implement RND as a function, RANDOMIZE as a macro, using the system
     rand() from libc.

2013 December 14
   Implement what little string expression handling is required, now
     PRINT statement can print string literals.
   Make commas call a routine to advance to the next print field.  For
     now that routine only prints out a space, but at least fields do
     not run together with a comma, but do with a semicolon, which is
     good enough for an initial try.

2013 December 21
   After a very long and painful time, I finally figured out the problems
     with using SSE trigonometric functions, and have chosen to use
     public domain routines from SLEEF 2.80 (written by Naoki Shibata)
     http://shibatch.sourceforge.net/ to implement SIN, COS, TAN, ATAN,
     LOG, EXP, and POW.  I had to do a bit of grunt work, since they were
     provided as C using intrinsics and I needed assembly language.
     I used 'double' versions in anticipation of changing the compiler
     to use 'double' instead of 'float' eventually.

2013 December 22
   Replaced calling system random number generator for RND with using the
     public domain ISAAC-64 PRNG (written by Bob Jenkins)
     http://burtleburtle.net/bob/rand/isaacafa.html
     It was provided as C code, and no instructions on how to really
     seed it were given, so I had a bit of grunt work to do to create the
     assembly language version.  I use time() and gettimeofday() for
     seeding it, if RANDOMIZE is called.  I used the 64bit version in
     anticipation of changing the compiler to use 'double' instead of
     'float' eventually.
   Added assembly version of float routines from Robert G. Burger
   Added memset() clone since the float routines call that
   Added strlen() close since the float routines call that

2013 December 27
   Replaced printf()-based floating point output with a tweaked assembly
     version of Robert G. Burger's fixed output routine.
   Used a direct system call instead of glibc-wrapped puts/write routines
     for console output.

2013 December 30
   Changed realinit to call gettimeofday system call instead of gettimeofday()
     and time() glibc-wrapped routines.
   Converted from being a glibc-called main() to using _start() and an exit
     syscall so the programs can link without requiring any glibc.

2014 January 1
   Updated code generation so that code for RND/RANDOMIZE, SIN, COS, TAN,
     ATN, EXP, and LOG is only emitted if the source BASIC program needs them.
   Updated code generation so that code to support power operator is only
     included if the source BASIC program needs it.
   Updated copyrights for new year.
   Improve the man page with an example and give credit for runtime library
     routines and document licensing for them in the man page.

2014 January 3
   Added bounds checking for vector (1-dimensional) arrays.
   Added an itoa() procedure to allow printing integers.
   Added code to track current line number and output that on error messages.

2014 January 4
   Fix array indexing for vector (1-dimensional) arrays and bounds checking
     for that to handle both OPTION BASE 0 and OPTION BASE 1.
   Fix array indexing for matrix (2-dimensional) arrays to handle both
     OPTION BASE 0 and OPTION BASE 1.

2014 January 5
   Add bounds checking for matrix (2-dimensional) arrays to handle both
     OPTION BASE 0 and OPTION BASE 1.

2014 January 6
   Add infrastructure code for floating point exception handling.
   Update binary_divide macro to check for uninitialized values and divide by
     zero.

2014 January 7
   Add BASICC script to ease compilation

2014 January 8
   Add overflow checking for binary addition, subtraction, multiplication
     and division.
   Add NaN checking for binary addition, subtraction, multiplication
     and division.

2014 January 9
   Add underflow checking for binary multiplication and division.
   Fix errors found by cppcheck static analyzer.
   Add code to free memory from lineno and symbol_table modules, and update
     main to call them appropriately.
   Add code to check returns from malloc().
   Begin working on ensuring all dynamic memory gets free()'d (work in
     progress).

2014 January 10
   Many, many fixes for memory allocation.
   Got self-tests for scanner2 and parser2 working again.
   Now valgrind gives no errors for ecma55, parser2, scanner2.
   Now cppcheck gives no errors for ecma55, parser2, scanner2.
   Now gcc gives no warnings for ecma55, parser2, scanner2.
   Now clang gives no warnings for ecma55, parser2, scanner2.
   Implement STOP statement.

2014 January 11
   Implement check for NaN on read of scalar and array numeric variables.
   Implement GOTO code generation.
   Implement IF code generation for numeric expressions.
   Implement GOSUB/RETURN code generation.

2014 January 12
   Rewrite string address stack macros.
   Implement LET statement for strings.

2014 January 13
   Improve mystrlen and mystrcpy.
   Implement IF code generation for string expressions.

2014 January 14
   Implement ON .. GOTO statement.
   Implement FOR loop statement.
      NOTE: No error checking is made for jumping into or out of FOR
            loops yet.
   Fix bug in printnewline that was appending a NULL byte to the output.
      I didn't see this since it doesn't show on a terminal, but when
      you redirect output to a file and open it with vi you get crazy
      ^@ signs, and of course hexdump -vC showed what was really wrong.
   Fix unary plus.

2014 January 15
   Work hard on implementing error checking for FOR statement.
      This required tracking more information for jump targets (the
      source and destination BASIC line number of the jump and the
      scope) and the lineno module had to be updated for this
      in tandem with the parser changes.
   Make compiler free unused tokens on error exit.

2014 January 16
   Add more NBS tests
   Add README.NBS that shows test index with status information
   Add URLs for 3rd party code to README and to generated code
   Update Sourceforge web site
   Fix append_new_token so it can take an empty string value
   Print an error message when the RHS of an assignment is incorrect
   Give an error message when DIM tries to use an already-used variable

2014 January 17
   Fix bug in PRINT statement where a trailing ';' or ',' was still
     emitting a newline.
   Add check to TAB() for subscripts < 1 and emit a warning and skip
     over doing any TAB activity (still just a stub right now) but
     let the program continue running.
   Add check for length of RHS string too long in LET statements.
   Add code to check for uninitialized string variables when used
     in expressions.
   Add more NBS tests

2014 January 18
   Many cleanups to error handling in parser.
   Add stub routines for INPUT and READ in code generator.  For
     now they emit a comment.
   Update parser to call code generator routines for INPUT and READ.
   Add INPUT and drain_stdin routines ported from mutant to provide
     low-level support for INPUT statement.  This code is only
     emitted if the program uses the INPUT statement.

2014 January 19
   Add all-new output code that finally supports print zones and TAB.
   READ works and has error checking for numeric and quoted string types,
     but does not handle unquoted strings that are numbers yet.

2014 January 20
   INPUT works for scalar strings.
   INPUT console I/O works for numeric scalars and arrays, but depends
     on atof for conversion.  At present, atof() is just a stub that
     always returns the value 0.
   Improve scanner error reporting so it outputs the last known good
     BASIC source program line number if possible.
   Improve scanner error reporting so it detects trailing spaces
     in a datum and gives an appropriate error message.

2014 January 22
   Created dumpregs.s, which has a fairly complete register dump
     capability for the target (AMD64 with SSSE3 but not SSE4)
     but it skips FP registers and shows XMM registers instead since
     I use SSE exclusively for floating point in this project. This
     dumps eflags and mxcsr user mode flags too.

2014 January 23
   READ now allows a string read for a numeric value, and a numeric
     read for a string value that can be converted, per the (insane)
     rules of Minimal BASIC.

2014 January 24
   User-defined functions are implemented.  There are single-line
     numeric expression functions with 1 or zero arguments.  Since
     there is no way to branch inside a statement, no recursion is
     possible, but one UDF can call another.

2014 January 25
   Division by zero is no longer a fatal exception.  Now + or -
     infinity is substituted for the result and the program continues
     as the standard requires after displaying an exception.

2014 January 26
   Overflow for add, subtract, multiply, and divide now substitutes
     + or - infinity for the result and the program continues
     as the standard requires after displaying an exception.

2014 February 5
   It turns out exceptions in the MXCSR register are 'sticky' and
     must be reset if you want to continue computation after detecting
     an exception.  I had to update binary_add, binary_subtract,
     binary_multiply, and binary_divide for this.  I also realized
     in those macros I do not need to load the MXCSR into a register
     to use it, and that simplified the code.  It turns out if you
     do 0/0, no divide by zero exception occurs.   Instead, you get
     an invalid exception, so that required more logic changes in
     binary_divide to handle that case.  INF/INF also causes such an
     exception, but I have not been able to determine what the
     ECMA-55 rule is for that specific case yet.
   A negative number raised to a non-integral power must result in
     a fatal exception.  The xpow() function returns a NaN in that
     case, but myisnan() was setup for floats.  Since all the math
     operations are on doubles, I converted myisnan() to work on
     doubles, and now after calling xpow() I call myisnan() and if
     it is true a fatal exception occurs as required.

2014 February 7
   When fixing binary_multiply, I missed fixing FE_UNDERFLOW
     condition; this is fixed.
   Rewrite doforloopend() to call binary_add instead of open coding
     an add.  Now the exception handling for the loop increment
     will be the same as any other add in the BASIC program.

2014 February 8
   Multiplication can result in underflow.  Make this report the
     exception and substitute a zero for the value, after clearing
     the exception flag in the MXCSR, so now we obey the ECMA55
     rules for multiplication underflow.
   Division can result in underflow.  Make this report the exception
     and substitute a zero for the value, after clearing the
     exception flag in the MXCSR, so now we obey the ECMA55 rules
     for division underflow.

2014 February 9
   After many days of trying (again) to understand how addition
     or subtraction of SSE floats could ever result in an
     underflow (since the Intel manual says they can) I learned
     from a paper "A precision and range independent tool for
     testing floating-point arithmetic I: basic operations,
     square root and remainder" by Brigitte Verdonk, Annnie Cuyt
     and Dennis Vershaeren (page 10) that it is impossible to
     get underflow if denormals are used.  My generated code does
     not enable FTZ or DAZ because I want the generated code to
     have the benefits of more closely following the IEEE-754
     standard and to get gradual underflow because one of
     the goals of this implementation of BASIC is to be robust and
     correct.  So the end result is that binary_add and binary_subtract
     do not need to check for underflow.  As always, the Intel manuals
     are technically correct, but not very helpful.  If you turn on
     FTZ and you work with two normal numbers and you get a denormal
     result and it cannot be represented exactly and you mask the
     underflow and precision then, and only then, the processor will
     report underflow for addition or subtraction.

        <<<<<<<<<<<<<<   BEGIN RANT MODE   >>>>>>>>>>>>>>

        In other words, underflow detection is just plain
        worthless on Intel SSE for addition and subtraction of
        floats.  My guess is the engineers thought "Hey, let's
        only report underflow sometimes, and sometimes we'll
        just be silent; if nobody notices until after we ship,
        well then it's set in stone for the next 30 years and
        everybody will just turn on FTZ and DAZ (which helps
        our benchmarks) and we can just forget about underflow."
	I suspect they sold that to the boss with something
        like "Well, sure, we could do it correctly, but it'll
        take us a lot more time to implement it, and we'll go
        about 1% of the speed we can do now with this, uh,
        'enhanced reinterpretation' of the standard."  The
	manager said, "OK, cheaper, faster, better, pick any
	2 and ship it!" and so now we'll be stuck with the
	busted-by-design implementation forever.

        <<<<<<<<<<<<<<    END RANT MODE    >>>>>>>>>>>>>>

  Change from Robert G. Burger's print routines to David M. Gay's
    print routines.  For now, they are in separate .s files to
    ease tweaking until I get all the BASIC rules working.  All
    except "NUMBER THAT CAN BE REPRESENTED IN THE UNSCALED
    REPRESENTATION NO LESS ACCURATELY THAN AS IN SCALED FORMAT,
    SHALL BE OUTPUT USING THE UNSCALED FORMAT" seem to work.
    Examples of this problem are numbers like .000022 which
    should be output as .000022 but get 2.2E-6 instead.  I
    suspect Gay's routine decided 2.2E-6 has 6 bytes, and is
    shorter, so use it, but it needs more investigation.
    This shows up in NBS test #9.  At this point, the output
    for tests #9 and #10 is much closer to meeting the
    specification, but it still needs work.

    The reason for the change in floating point display code
    is that while neither is easy to follow, more information
    on the web exists for Mr. Gay's version, and it is currently
    maintained.

2014 February 10
  INPUT has been implemented using David M. Gay's strtod(),
    but I have not implemented proper error checking yet.
  More tweaks to the g_fmt have resulted in having tests
    P009 and P010 pass.
  I have added errno support for strtod(), which was tricky
    since glibc wants to use some whacko function to get
    the errno variable.
  In the parser, fix g_print_item_tail() so that a trailing
    comma still advances to the next print zone.

2014 February 11
  Fix tab() function so that NBS test 203 passes.  I had
    missed one case where "TABBING TO A POSITION, N > MARGIN, M,
    CAUSES TAB TO BE N - M*INT((N-1)/M):"
  Fix more NBS test typographical errors.

2014 February 12
  Fix more NBS test typographical errors.
  Update parser to give error messages when a datum in a DATA
    statement is missing.
  Update parser to give error messages when a target variable
    in a READ or INPUT statement is missing.
  Update to use binary_power macro, and add check for 0 raised
    to a negative power and print an exception but continue
    using the value of +Infinity as required by the ECMA-55
    standard (NBS test case #31).
  Use an ugly big-hammer fix on xpow to clear all pending exceptions
    upon function exit.
  Fix DIM statement so if OPTION BASE is 1, zero is not a permitted
    upper bound (NBS test case #73).
  Fix DATA statement parser so that it checks to ensure all quoted
    and unquoted strings are not more than 18 characters long
    (NBS test case #100).
  Document why NBS test case #26 fails for -2 ^ 2 (test case error).
  Document why NBS test case #38 fails for 4 ^ -2 (test case error).

2014 February 13
  Implement SGN() function.
  Add many more NBS tests.

2014 February 14
  Fix bug in user-defined function parameter naming that was causing
    duplicate variable names.
  Fix bug where user-defined function call failed to pop the argument
    from the stack into xmm0 before the call, and failed to push the
    result onto the stack after the call.  This fixes NBS test #152.
  Fix bug where call to UDF with no arguments was still pushing an
    argument.
  Improve error message when reading an uninitialized variable; now the
    variable name is printed.
  Add many more NBS tests.

2014 February 15
  Duplicate xpow big hammer fix for xtan_u1 to clear all pending exceptions
    on function exit.
  Finished adding all the NBS tests for which I have the complete source.
    Some are not available in any form I could find (both of my PDF file
    are missing some data) so they cannot be used at this time.
  Check for LOG() argument not greater than 0 and generate fatal exception
    in that case.
  Fix bug where 'RND+3' was seen as 'RND' '+3' instead of 'RND' '+' '3'
    (NBS test case #164).
  Fix bug where user-defined function did not detect an attempt to call
    itself. (NBS test case #161).
  Update binary_power macro to report overflow (non-fatal exception)
    (NBS test case #168).
  Fix bug where 'UDF+3' was seen as 'UDF' '+3' instead of 'UDF' '+' '3'
    (like NBS test case #164 but with a user-defined function with no
    arguments instead of an implementation-supplied function with no
    arguments.)
  Update call to EXP to report overflow (non-fatal exception)
    (NBS test case #174).

2014 February 16
  Report overflow when pushing numeric constants.
    (NBS test case #30).
  Duplicate xpow big hammer fix for xatan_u1 to clear all pending exceptions
    on function exit. (NBS test case #183)
  Give custom error message when an attempt to assign to a numeric scalar
    variable using an array index (heuristic is that '(' immediately follows
    the scalar variable name). (NBS test case #79)
  Fix TAB() with an argument less than 1 to have a non-fatal exception and
    substitute a 1 for the value. (Fix second test in NBS test program #175).
  More tweaks to numeric formatting and now it matches the specification in
    all known cases.

2014 February 17
  Fix problems with DATA statements formatting numeric data incorrectly.  This
    required major changes.  I now use the same g_fmt/dtoa code in the
    compiler as is used in the runtime, modulo a fix for errno which must be
    a TLS variable for the compiler since I link with glibc and some renames
    to avoid collisions with the real dtoa.  The errno must not be
    a TLS variable for the runtime since I do not link with glibc.  Also,
    the parser was prematurely formatting the numbers for unquoted strings
    which broke NBS test #93.  NUMFORMAT was removed since any formatting
    _must_ be done with g_fmt().
  Finally found the bug in my typing in of the matrix for NBS test #140, so
    now it passes.
  Duplicate xpow big hammer fix for xlog_u1 to clear all pending exceptions
    on function exit. (NBS test case #167)
  Very ugly big hammer fix for EXP() - the function fails for values less
    than about -100, so hard-code a return of zero if the argument to EXP
    is less then -100.  The SLEEF code appears to just plain break on
    extremely low values, but seems fine otherwise.  This fixes NBS test
    #175.  Unfortunately the other tests for EXP (NBS tests #121, #122,
    and #123) are not available to verify everything else is fine.

2014 February 22
  Create dot graph of the data item part of the scanner FSM.
  Begin writing input subsystem scanner.

2014 February 23
  Add parseinput() and associated FSM data.

2014 February 25
  Finally get new INPUT system working.  I got stuck on a bug for about 10
     hours where I had the rodata section declared as:
        .section .rodata.str1.1,"aMS",@progbits,1
     which doesn't give any errors, it just breaks.  I need this instead:
        .section .rodata,"a",@progbits
     The first one is ONLY for read-only string literals that will be printed.
     anything else needs to use the second form.
  NBS test #108 now passes.
  NBS test #110 wants to permit trailing spaces on numeric input, which the
     FSM does not support yet.
  Add numeric overflow checking for INPUT (for NBS test #112), but still
     get spooky prints if you enter something like A,,B (empty string)
  Implement rule that says no input data gets stored in the real variable
     locations until all types are checked and numeric overflow has been
     checked.

2014 February 26
  Finally found the bug for the spooky print; in the conversion to using
     printstring2, I missed change rsi to rdi for .ParseinputC0 inside of
     parseinput.  Now NBS test #112 passes.
  Added more states to INPUT state machine so that it can accept trailing
     spaces for numeric input.
  NBS test #110 now passes.
  Sadly, now NBS test #108 then failed.  An easy case of this was:

    10 INPUT I,A(I)
    20 END

  On line 10, the first time through I is not set, but we try to compute
  the address of A(I) and we crash.  This was because when I changed the
  divert code in the parser, I got it wrong.  Now it is fixed and NBS test
  #108 now passes.

2014 February 27
  OK, all KNOWN bugs with READ/DATA are fixed.  It turns out the grammar
    in the ECMA-55 specification does not permit trailing spaces on numeric
    datum in a DATA statement, but the rules on page 5 of the specification
    override that saying "spaces may occur anywhere in a BASIC program without
    affecting the execution of that program".  Also, on page 24 the standard
    explicitly requires a fatal exception when "An attempt is made to
    assign a string datum to a numeric variable".  I was permitting that if
    the string could be converted to a valid number, but that is not permitted
    so this has been fixed.
  Enforce rule on page 5 that says 'spaces shall not appear at the beginning
    of a line'.

2014 March 13
  Added support for using 64bit doubles for the basic math operations.  This
    is activated with the -d switch.  Note that this may cause trouble with
    print zones in some cases.
  Make 64bit math the default in the compiler.  Use the '-s' switch to get
    the old behavior with 32bit floats constants and arithmetic.

2014 March 14
  Add documentation about the arithmetic expression evaluation begin
    stack-based.

2014 March 18
  Add slide show about compiler (.ODP and .PDF formats)

2014 March 28
  Add missing NBS test code for tests 56, 57, 65, 66, 67, 68, 69, 109, 117,
    118 using printouts supplied by Emmanuel Roche.
  Fix bug where ON .. GOTO expression was assumed to be single even when we
    are using double (turned up in NBS test 109 line 700)
  Fix bug where -s switch wasn't working (getopt() option list argument still
    had a d instead of an s)

2014 March 29
  Add missing NBS test code for tests 119, 120, 121, 122, 123, 124
    using printouts supplied by Emmanuel Roche
  Add BASICCS, a compile script to generate code with 32bit arithmetic
    expression math and narrower output, more closely matching the
    NBS test suite expectations.
  Handle overflow in doexp cvtsd2ss when using -s switch" codegen.c
  Fix output to use narrower output that works with our print zones.  This is
    controlled by a new boolean, use_double_output, which if set to true
    would give wide output.  This cannot be set with a runtime switch yet;
    that must wait until I get the print zones to adjust for wide output.
  Begin implementing an automated test suite to use for regression testing.
  Add statement specifying behavior for attempts to read uninitialized values
    to the README as required by the standard. (NBS test 23)

2014 March 30
  Fix bug in scalar and array numeric input for 64bit mode.  When I removed
    the 64->32 conversion, I failed to realize it was putting the result in
    a different register than the source.  This is fixed.
  Add back lost EOF detection.  The jump target and error message were there,
    but were never wired up after the big INPUT subsystem conversion.
  Fix bad code generation for 32bit dosgn().
  Add check32 target to makefile to run 32bit arithmetic operator checks.
  Completed test suite.  64bit has problems with two coredumps on tests 93
    and 95, and failures to pass on tests 107, 108, 109, 110, 112, 127, 164,
    166, and 203.  All INPUT tests have problems since batch INPUT is not
    working.
  Fixed typos in NBS test 127 on lines 3620 and 3630  that were breaking
    the test on 64bit.
  Add -w switch to allow wide output.  This breaks the print zone code, so
    it is not the default yet.
  Fix bugs in doabs().

2014 March 31
  Fix READ for 64bit unquoted string that is a valid number but we read into a
    string variable (NBS tests 93 and 95).
  Update parseinput.c so that it reads 1 byte at a time, stopping on newline,
    so that it can support reading STDIN redirected from a file.  While I was
    at it, switch to low-level read/write for console I/O.  Also fix it so
    that it supports unquoted strings correctly.  The FSM already did, but
    the format string handling needed updating.
  Rewrite INPUT() function in the input subsystem so it reads one byte at
    a time and stops on the newline.  This allows it to work with redirected
    input from a file or a pipe.

2014 April 1
  Add isterminal() function and call it at program start, leaving the result
    in global variable .Lecho_input.  Update INPUT() so that if that variable
    is not set (we are not a terminal) then INPUT will be echoed to the
    output.
  Updated a few sample output files now that all tests Pass in both 64 and
    32 bit mode (except test 131 which must be run by hand since it has
    different output ever run intentionally).
  Fix coredump on EOF on INPUT after latest changes.

2014 April 2
  Create a separate peephole program that has a very simple peephole optimizer
    that runs on the generated assembly code.  It looks for lines with
    'pushxmm 0' followed immediately by 'popxmm 0' and removes that pair of
    lines.
  Update BASICC and BASICCS to call the peephole optimizer.
  Update run_tests to show why a test did not pass.
  Update run_tests to show percentages of Pass, Fail, and Unknown.  This part
    quite ugly since bash does not support floating point and I had to do
    a faked scaled representation.
  Update run_tests to be more robust by verifying compiler and optimizer
    exist, are marked executable, and are valid 64bit x86-64 ELF binaries.
  Update slide show files with information about the test harness and the
    peephole optimizer.

2014 April 3
  Re-tested with cppcheck and valgrind, no problems detected.
  Updated Makefile with better debugging support.
  Fix bug in BASICCS where after running the optimizer, the assembler then
    assembled the original unoptimized code.
  Add peephole man page.
  Fix initbuf() to use OUTPUT_WIDTH constant, not a hard-coded value.

2014 April 4
  Correct NBS test 203 input/output test files.
  Correct NBS test 203 header display for 132 columns.
  Update g_fmt (both versions) to have a parameter for EXRAD_WIDTH.
  Fix tab and appendbuf to use constants, not hard-coded values.
  Add files that describe how to generate assembly code that I
    hand-tweaked for the print zone and input code.

2014 April 8
  Update peephole optimizer to remove sequences of 'pushsaddr' followed
    immediately by 'popsaddr %rdi'.
  Update README to explain how to clone the upstream repository, submit
    patches, and report bugs.
  Create gen_stack() and use it instead of having main() directly generate
    code for the stack.
  Update codegen.c to include the assembly code dtoa5.s g_fmt_BASIC.s now
    that things are stable and working with both narrow and wide settings.

2014 April 9
  Teach BASICC, BASICCS, and run_tests to work with ECMA55 and PEEPOLE
    environment variables so you can use an installed version of the
    compiler and optimizer if you wish.  If the environment variables are
    not set, revert to old behavior looking in the current directory.
  Add BASICCW that does 64bit wide compiles (-w switch to emca55).
  Add man pages for BASICC, BASICCS, and BASICCW.
  Add 'install' target to makefile that respects DESTDIR.
  Add INSTALL file to explain how to install the software.
  Add input line width overflow checking to peephole optimizer.
  Release version 1.0!

2014 June 10
  Update README to reflect that batch mode works.  It worked for 1.0, but
    I missed updating the README.

2014 June 18
  In doloc() when storing BASIC line numbers they must be less than 10000
    so use a two-line sequence with sign extension instead of a full 64bit
    movabsq three-line sequence.
  Fix uninitialized variables in peephole spotted by clang (but not gcc).
  Fix bad printf (one percent instead of two) in peephole that neither
    clang nor gcc spotted.
  Fix code generation to use 'popxmm 0' not 'popxmm  0' (one space, not two)
    so that peephole optimizer will be able to process it.
  Fix line number handling in write_epilogue().  It was never a problem since
    our line numbers are always small, but still fix it for the future.
  Shrink code emitted in write_epilogue() by 37 lines.
  Stack depths should be defined constants so they are easier to modify.
  Omit generating code for READ, INPUT, SQR support when not needed.
  Move version number to globals module.
  Fix option handling in main.c to show -w option and be more informative,
    and add -h option.
  Update README with information about how -w option modifies the
    implementation defined constants, with more about bug reporting,
    and to document that valgrind on Fedora 20 has trouble if you compile
    with clang (but clang ecma55 and peephole work fine).

2014 June 19
  Update README implementation-defined limits section for -w option.

2014 June 20
  Cleanup peephole.c code.
  Use macros for magic numbers in scanner2, merge two different special case
    sections into one switch.
  Update Makefile to support address sanitizer, install-strip, improved
    install target to support separate PREFIX and DESTDIR.
  Update Makefile to support COMPILE_MODE to make it much easier for
    people to switch between configurations.
  Shut up annoying clang warnings for David M. Gay's code.

2014 June 23
  Update code generator to add comments to generated FOR loop code.

2014 June 25
  Fixed self-test code of symbol_table to work with current ABI.
  Add emit_comment() function that works like fprintf(), use it in
    parser2.c
  Fix FOR loop label and synthetic variable trailing numeric suffixes so
    all 4 are the same for any given FOR loop.
  Improve FOR loop commenting some more.
  Convert FOR loop assembly code to macros.

2014 June 26
  Add zonermore and robert1 support to Makefile.

2014 June 27
  Use defined constant NAK instead of hard-coding 21 in emitted assembly.
  Fix bug in push_navar() error messages for bounds checking where the
    compiler was incorrectly giving errors about write instead of read.
  Redo bounds checking so that just one compare is used for each subscript
    expression to implement the bounds checking.  This technique is from
    "Hacker's Delight, 2nd. Edition" by Henry S. Warren, Jr. page 67.
  Enforce a maximum array size of 10000, fix and improve array .data section
    code emission in symbol table.  The .size generated for arrays was
    incorrect for arrays in some cases and didn't adjust between float
    and double like it should.
  Removed the bogus .text.unlikely and replaced it with plain .text in
    code generation.
  Change compile scripts to state we use AT&T syntax and mnemonics and
    request memory saving when we invoke the assembler.
  Fix bad DATA statement storage of numbers.  The symbol table generation
    was always using float even in 64bit (default) mode when it should
    use double.  This noticeably improved accuracy on tests P039, P040, P043,
    P117, P119, P120, P121, P124, P127, P128, and P140, and the expected
    output for those tests was updated to match the better results.
  Simplify g_on_gotostmt() code but keep it functionally the same.
  Use const and static where it makes sense to improve code quality.
  Flip equality conditionals to catch accidental = instead of == in the
    future.
  Fix maximum width of floating point literals in the symbol table to use
    a defined constant, be consistent, and guarantee termination.

2014 June28
  Begin converting to fixed-width integers using inttype.h method.

2014 June28-29
  Finish converting to fixed-width integers using inttype.h method.
  Use 64 bit integers only when required.
  Fix error handling and reporting of line numbers that are invalid.

2014 June 30
  Document how to build with pcc compiler on Fedora 20 in README.
  Add a final '.end' to assembly output for correctness.
  Add an '.ident' section to generated output.
  Add missing header guards to dtoa5_normal.h and g_fmt_BASIC_normal.h.
  Try to ensure a C99 compiler is being used by checking __STDC_VERSION__.
  Document that pcc is capable of compiling this software correctly.
  When pushing literal values, add those to the comments in the generated
    assembly to make it easier to read the generated assembly and follow
    the logic of the original BASIC program.

2014 July 2
  Update optimizer so that it can ignore leading whitespace and trailing
    comments when looking for patterns.

2014 July 7
  For loop macro comments were using too many columns; fix that.
  Fix wrong code generation for error reporting when a function parameter
    is uninitialized.  This could not be hit in practice, but it is fixed
    for correctness sake.  Also, if something did corrupt the passed in
    argument value through some future bug in the compiler, this will
    at least print the function name and argument name, not '.L'.  Now you
    will get a message like this:
"Read of uninitialized function parameter X of function FNA on line number 20"
    if the argument X in this code is uninitialized when the function is
    called:
"10 DEF FNA(X)=X"
  Make beginfor/endfor check index, increment, and limit.
  Mark all macro parameters as required.

2014 July 10
  Make compiled programs explicitly check for CMOV, SSE2, SSE3, and SSSE3
    since Xeon Phi claims to be x86-64 but does not include them.

2014 July 15
  Convert ON..GOTO to use a jump table in code generation.
  Add -l short license information display option to ecma55.
  Add -L full license display options to ecma55, embed the entire GPLv2.
  Fix option handling in ecma55 not to talk about saving partial output
    when option handling failed.
  Fix typo in NBS test 88 string literal (cosmetic issue).

2014 July 16
  Ran aspell on the NBS test sources and found an amazing number of typos;
    fixed them.
  While fixing typos, I discovered NBS test 41 not only had an EE in the
    middle of a number, but somehow the expected results file had been
    created to expect the resulting error from that instead of the correct
    passing test behavior.  I don't know how that happened, but it is fixed.
  Remove unused mymemset assembly routine.
  Move numeric variables to .bss segment, and initialize them to SNaN in
    the program prologue.
  Move buf used by isterminal to bss.

2014 July 17
  Omit numeric variable initialization if there are no numeric variables.
  Avoid emitting empty .sections in cases where there are no string
    variables, or no numeric variables.
  Move string variables to .bss segment, and initialize them to all NAK in
    the program prologue.
  Implement constant merging for numeric and string variables.
  Rewrote DATA symbol table support.  Now there is one list of the data
    blocks, and a second list of the pointers to those blocks, and finally
    implement data block merging.

2014 July 18
  Ran sparse on the files, did the required fixes.  It was tricky to get
    it to run.  I finally figured out to do this:

    sparse -v -gcc-base-dir /usr/lib/gcc/x86_64-redhat-linux/4.8.3/ \
       -D__STDC_VERSION__=199901L whatever.c

  Fix bug in error handling in put_array_data() of symbol_table.c found
    by gcc after the sparse check updates.  Why it wasn't triggered before
    I do not know.

2014 July 20
  Document each token in scanner2.h, convert tabs to spaces in my source
    code files, use const a few more places in scanner.
  Ran clang static analyzer on the files, did the required fixes.  I ran
    it like this:

    scan-build make CC=clang

    Wow is that thing smart!  It was able to show step-by-step that if
    -o option was used twice, memory would be leaked.  This is now fixed.

  Use static and const more where it makes sense.
  Fix cut & paste errors in error message function names in code generator.
  Finally got sparse to run on dtoa5_normal.[ch], fixed the warnings.
  Add some missing header file includes that sparse detected.
  Learned about cgcc, use it like this (much easier than raw sparse):

    make distclean all CC='cgcc' CHECK='sparse -Wshadow -Wreturn-void \
      -Winit-cstring' REAL_CC='gcc'

2014 July 29
  Manual page improvements.
  Makefile updated to support a (primitive) uninstall.

2014 August 4
  Fix run_tests for the case where no ecma55/peephole exist on the PATH
    but they do exist locally

2014 August 19
  Add comments for peephole optimizer.

2014 August 20
  Add comments for linenumber and global modules.
  Add comments to main driver module.
  Fix bug where if the program has no floating point literals but uses
    the same string literal several times, the string literal constants
    were not merged, which was the result of a cut and paste typo.  This
    was a lost optimization that did not effect correctness of output
    for programs.
  Add comments for symbol table.

2014 August 21
  Start adding comments to document code generator module.
  Split non GPLv2 library code out to separate files:
  1) Split code generation for runtime library for David M. Gay's code
     to gay.[ch]
  2) Split code generation for runtime library code for Bob Jenkins' code
     to jenkins.[ch]
  3) Split code generation for runtime library code for Naoki Shibata's
     code to shibata.[ch]
  Add some documentation to these new 6 files describing what the
     C-level functions for code emission do.

2014 August 22
  Finish adding comments to document code generator module.

2014 August 23
  Add text file with grammar of Minimal BASIC.
  Add comments for documenting parser and scanner modules.
  Minor cleanups to g_letstmt in parser module.

2014 August 24
  Improve comments for runtime DFSM used for INPUT.

2014 August 25
  Add comments to parser to explain the way INPUT statement code
    generation and format string implementation works.

2014 August 26
  Fully comment zonermore.c, the C source for the PRINT runtime library
    implementation.
  Fix bug where low-level tab implementation (for TAB() of PRINT) failed
    to update the current print zone.

2014 August 27
  Fix bug where when spaces occur between an array name and the left
    parenthesis for the subscript, the scanner decided the variable
    was a scalar instead of an array.
  Add some tests for the recent TAB() and array type bugs.
  Release version 1.4

2014 August 29
  More comment improvements.
  Generated DATA statement blocks now have some descriptive comments.

2014 August 30
  Fix bug where compiler did not detect the case where a bad input
    program is syntactically valid, but has a READ statement and no
    DATA statements.  It was generating code that would not compile,
    instead of giving the appropriate error message and refusing to
    generate any output.

2014 September 4
  Add documentation comments to parseinput.c

2014 September 7
  Use macros to clean up mainline code for dostore_nvar() and
    push_float_literal() in codegen.c
  Fix bug where .LSTART_BSS was not force-aligned correctly which caused
    the uninitialized variable read checking to fail for scalar numeric
    variables.
  Create new HAM test suite harness, and add a test for the uninitialized
    scalar numeric variable read as the first test.
  Add floatmem_to_floatreg macro and convert push_nvar() to use it.
  Continue adding more tests.

2014 September 9
  Update peephole to accept 200-byte wide lines to accommodate new macros
    that have very long parameter list definitions.
  Split push_navar() into two functions, push_1D_navar() and push_2D_navar().
  Create array_1D_to_floatreg macro, convert push_1D_navar to use it.
  Create array_2D_to_floatreg macro, convert push_2D_navar to use it.
  Split dostore_navar() into dostore_1D_navar() and dostore_2D_navar().

2014 September 10
  Add floatreg_to_array_1D macro, update dostore_1D_navar() to use it.
  Add floatreg_to_array_2D macro, update dostore_2D_navar() to use it.

2014 September 12
  Update documentation files.
  Update peephole.c to check return values from write() function calls.
  Release 1.6

2014 September 12 (post-release)
  Add test P215 to verify CVE-2010-4645 does not affect this compiler for
    literal constants in expressions.
  Add test P216 to verify CVE-2010-4476 does not affect this compiler for
    literal constants in expressions.

2014 September 13
  Add test P217 to verify CVE-2010-4645 does not affect this compiler for
    literal constants in runtime input from the INPUT statement.
  Unify SIGNIFICANCE_WIDTH and EXRAD_WIDTH definitions for all files so
    if it is changed in globals.c, both the compile-time code and runtime
    code will use the same rules.
  Another TAB() fix was required due to bugs that showed up in 132 column
    testing.
  Add test P218 for 132 column mode TAB().
  Add -4 switch to compiler.  This allows the code generator to emit SSE4.1
    instructions by setting the use_SSE4_1 flag to true.  This will add
    a check for SSE4.1 support to the prologue to ensure that any program
    compiled with the -4 option will first check, at runtime, to ensure
    the processor in use actually supports SSE4.1 instructions before
    running the user program's code.  The default is to NOT generate SSE4.1
    instructions.
  Update binary_add, binary_subtract, binary_multiply, binary_divide, and
    binary_power to use SSE4.1 when available.
  Update BASICC, BASICCS, and BASICCW to add ECMA55FLAGS environment
    variable to command-line when calling the compiler.  To compile for
    machines with SSE4.1 support, do something like this:
    ECMA55FLAGS=-4 ./BASICCW WHATEVER.BAS

2014 September 14
  Add -A switch to compiler.  This allows the code generator to emit AVX
    instructions by setting the use_AVX flag to true.  This also sets the
    use_SSE4_1 flag.  There is a runtime check to ensure the CPU knows AVX.
    The default is NOT to generate AVX instructions.  For now, nothing except
    the CPU feature check uses AVX instructions.

2014 September 17
  Update push_nparm() in codegen.c to use floatmem_to_floatreg macro.
  Update doinput_nvar() and doinput_navar() for SSE4.
  Update doread_nvar() and doread_navar() for SSE4.
  Update doabs() for SSE4.

2014 September 29
  Fix error in calculating operand_stack_size when using 64bit floating point
    stack.  This was never hit in practice with the input line length of 72
    bytes.  We need at least 8 bytes for line number, space, LET, space,
    variable name, and equals.  That leaves only 64 bytes for the expression.
    If we use the shortest value of 1, and a +, we can do at most this:

    1 LET X=1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1)))))))))))))))

    or you could do it with PRINT like this:

    1 PRINT 1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+(1+1)))))))))))))))

    Each has depth 17 for the expression.  A depth of 17 should cover anything.
    But we were doing >>2 instead of >>3 in the calculation, so only dividing
    by 4 instead of 8.  For (17*8)>>2 we get 34 instead of 17 like we should,
    so overflowing the stack was not detected.  The >>2 is correct for 32 bit.
    The code now generates the correct shift value depending on use_double.
  Lower MAX_NUMERIC_OPERANDS from 40 to 20, even though 17 should be enough.
    Leave 3 spares as a safety margin for now.
  Improve comments in lineno.c

2014 October 7
  Fix bugs in NBS test P012.BAS.  Jorge Giner Cordero spotted two lines with
    typographical errors, and while investigating I also saw that several lines
    used a lowercase 'e' incorrectly instead of an uppercase 'E' for specifying
    an exponent.  In one line 'O' was used instead of '0'.  Fix one line with
    one too many zeros in the 'ASSIGNED CONSTANT' column.  The corresponding
    expected output was also updated.
  Fix typo on line 670 of P014.BAS spotted and reported by Jorge Giner Cordero.
    The corresponding expected output was also updated.
  Fix typo on line 3630 of P043.BAS spotted and reported by Jorge Giner Cordero.
    The corresponding expected output was also updated.
  Fixed the final bug in P012.BAS reported by Jorge Giner Cordero.  The
    corresponding expected output was also updated.

2014 October 10
  Made compile-time forstack[] dynamically allocated.
  Changed some #define constants to 'const' constants.
  Some small improvements to comments in parser2.c file.

2014 October 12
  Fix assign_magicvar() to validate the input parameter is non-NULL and
    non-empty.
  Fix doforloopstart() in parser2 self-test to actually generate the labels
    since they are now required for assign_magicvar().
  Fix add_float_literal() to validate the input float value is non-empty.
  Fix parser2 self-test to use real g_fmt() since the values are required to
    pass to the now-fixed add_float_literal().
  After the previous 4 changes today, parser2 self-test now correctly shows
    magic variables and floating point literals when run with the -v option
    that dumps the symbol table data.
  Clean up and add comments to g_nvar().

2014 October 17
  Various small cleanups to parser.
  Convert dolog,doexp,dosin,docos,dotan,doatan,doabs,dosgn,dosqr,doint, and
    dornd for register-based style.

2014 October 25
  Add binary tree module.
  Update parser to create binary trees for g_numeric_expression() [for now it
    leaks]

2014 October 29
  Update parser to create binary trees for g_string_expression().
  Carefully delete binary trees to reclaim memory and prevent leaks.

2014 November 1
  Fix tree dumps in parser to print when they are generated, not randomly later,
    by adding required fflush(stdout) calls.
  Make tree dumps unique, displaying function, file and line number information.
  Change Makefile to build using -std=c11 for C11 instead of C99.

2014 November 5
  Fix Makefile to set STD for all 3 cases, not just one (oops!)
  Fix built-in functions to properly populate binary tree string data with
    function name.
  Fix user-defined functions to properly populate binary tree string data with
    function name.

2014 November 7
  Be more paranoid about string length in bst_center_string()
  Update bst_delete_all() to take a pointer to function to clear out any dynamic
    memory within the data payload
  Use a custom structure for the data payload in the abstract syntax trees
    created for expressions in parser2, updating support functions as needed.
  Fix UDF AST node generation.

2014 November 8
  Fix g_target_variable() to always create a proper AST node and send it to the
    caller; update callers to dump and free that.
  Update AST to hold pointer to array data.
  Update AST node to have a label name field for string and numeric literals.

2014 November 21
  Move string expression code generation out of grammar and replace it with
    emit_string_expression() that does code generation from traversing the AST.

2014 November 27
  Move numeric expression code generation out of grammar and replace it with
    emit_numeric_expression() that does the code generation from traversing
    the AST.

2014 November 28
  Make optimization_level unsigned.
  Constant folding implemented for binary add, subtract, multiply, power and
    divide.

2014 December 2
  Begin working on changing from emulated stack-based math to xmm register-based
    math.

2014 December 3
  Continue working on changing from emulated stack-based math to xmm register-
    based math.  So far binary add, subtract, multiply, divide, & power, and
    unary minus, are done for constant float values.
  Implemented constant folding for unary minus.  This can be needed if unary
    minus acts on a parenthesized expression which itself can be folding into
    a single constant.  Consider the expression:
      1+2*(-(3))/6-0
    Without unary minus folding, no folding occurs.  With unary minus folding
      to convert -1(3) to -3, the entire expression folds to zero as it should.
  Rewrote floatlit_to_floatreg macro so it works for any xmm register, and so
    it doesn't destroy the contents of the the xmm0 register every time.

2014 December 4
  Implemented proof-of-concept register spill & fill code for binary add.  This
    needs to be cleaned up, provided for the other arithmetic operators, and
    documented.  In theory, only 2 registers are actually required using
    register/register SSE arithmetic operations.

2014 December 5
  Fixed bug in init_xmmregs() where top of stack was not reset.
  Completed register spill & fill code.

2014 December 6
  Continue work on changing from emulated stack-based mat to xmm register
    based math.  Scalar numeric variables are now supported.
  IF statement updated to work with new expression handling.

2014 December 7
  Re-implemented binary power operator for xmm register-based math.
  ON .. GOTO statement updated to work with new expression handling.
  Updated print item handling to reinitialize the floating point register
    management after each numeric expression.
  Added xmm_spillall_but() and xmm_fillall_but() to handle save/restore of
    floating point registers since SLEEF code doesn't preserve them and the
    new register-based math requires they be preserved.  Updated power
    operator code generation to issue required save/restore of busy FP
    registers.
  Added support for some built-in functions: ABS, ATN, COS, EXP, INT, LOG,
    SGN, SIN, SQR, TAN, RND.
  Put back math checking for binary add, subtract, multiply, and divide.

2014 December 8
  Re-wrote FOR loop handling so it works again.
  Got user-defined functions working again.

2014 December 9
  Fixed a regression in floatlit_to_floatreg for 32 bit.
  Lots of work on arrays.

2014 December 10
  All normal tests pass again with 16 FP registers.
  Make parser2 self-test pass again.
  Fix READ and INPUT statements to call init_xmmregs() after each item,
    which fixes test P094.BAS.

2014 December 11
  Fix READ and INPUT statements to call init_xmmregs() after each item.
  Free up unneeded register in load_realarrayvariable().
  Specify owner in more cases for allocate_fp_register().
  Clean string handling in g_relational_expression().
  Improve let_navar().
  Add comment that xmm0 and xmm1 are hard-coded for doinput_navar().
  Add more parser diagnostic output for verbose mode.
  Move code generation from g_target_variable() to let_navar().
  Add missing register loads for g_readstmt().
  Fix g_inputstmt() code generation including missing register loads and
     out-of-order code emission.
  All normal tests pass now with 4 FP registers.

2014 December 12
  Make more file global stuff static.
  Use 8 bit register counts.
  Track spill and fill counts and make sure they are equal at the END of each
    statement.
  Add missing de-allocation of column index register for 2D array read.
  Add missing reloads in g_relational_expression().
  Major fixes to g_forstmt() register handling.
  Add missing reloads for emit_numeric_expression() and let_navar().
  Let_svar() was leaking the lhs bst_node; fix it.

2014 December 14
  Remove bizarre but benign redundant register loads in prologue.
  Remove dead code that was #ifdef 0 but not actually removed.
  Add (disabled by default, enabled with CPPFLAGS=-DSUPPORT_CMDLINE_ARGS) code
    to save argc and argv in prologue.
  Convert tests/SIMPLE.BAS to test P219.BAS.
  Make input line width compile-time tunable with -DINPUT_WIDTH=###.
  Do not double double compile for check targets.
  Enhance OPERANDSTACK.BAS and let it be test P220.BAS.
  Cleanup prologue some more.
  Emit better error messages for cases when -4 or -A code fails due to the
    processor not supporting those features.

2014 December 15
  Add code to track number of times each variable is used in an arithmetic
    expression (reggie_numeric_expression(), reggie_numeric_node()).
  Move register handling code from parser2 to its own registers module.
  Move bst support code to its own module.
  Move optimizer code to its own module.

2014 December 16
  Add more self-tests (221, 222, 223).
  Fix bugs and leaks in READ and INPUT to arrays.

2014 December 20
  Create create_ast_node() and use it to factor out repetitive code in
    the parser.

2014 December 21
  Add test #224 to test longer numeric expressions with scalars.  This test
    made the tree pretty printing diagnostic code crash and show that code
    would not scale.
  Remove tree printing code.  It does not scale and causes crashes when the
    expression tree gets large enough.

2014 December 22
  Implement register management code to support the optimizer locking in the
    most frequently used scalars.
  Complete reggie optimizer pass that allows to use up to 1/2 the floating
    point registers (but keeping 3 in reserve for expression handling no matter
    what) for locking in scalars.  The most frequently used scalars in an
    expression are the ones that get locked.  Like the constant folding,
    this is a per-expression.

2015 January 16
  Add new test 225

2015 January 19
  Remove unused parameter from xmm_set_daddy().
  Make reggie_numeric_node() skip function parameter variable s instead of
    corrupting memory.
  Register names need room for the trailing NULL.
  We only need to move the pointer, not dereference it in David M. Gay's code;
    found by clang.

2015 January 20
  Fix many leaks on error paths that were detected by address sanitizer in
    clang-3.5.
  Remove unused g_expression() function.
  Fix an embarrassing number of cut & paste errors in the run_tests* scripts.
  Add more intense testing (with ASAN in addition to existing VALGRIND tests).
  Silence all warnings from clang-3.5 static analyzer.

2015 January 21
  Fix many warnings from cppcheck static analyzer.
  Change from sscanf() to dgstrtod() in parser2.c.

2015 February 6
  Update grammar and comments to reflect reality as expressed in the current
    parser2.c code.  This means the g_letstmt does not really use g_expression
    or g_target_variable.
  Fix warnings in zonermore self-test code.
  Fix bt self-test. Too much had been removed, so I put it back, but within the
    UNIT_TEST guards.
  Use proper EXIT_SUCCESS/EXIT_FAILURE macros in generated assembly code.
  Fix symbol_table self-test by adding missing clear_symbol_table() to free
    dynamic memory.

2015 February 7
  Add new 'canrelease' target that runs the self-tests with both the address
    sanitizer and then again with valgrind.

2015 February 8
  Rename bst_node to tree_node.
  In tree_node, instead of left and right, have children[left] and
    children[right] so that in the future it would be easier to support n-ary
    trees.
  Dynamically allocate tree_node.children[], finally supporting n-ary trees.

2015 February 11
  Change bst.[ch] to store and use a pointer to the token instead of copying
    data.  Update scanner2.[ch] to return pointers from *_next_token() routines.
    Update parser2.c to deal with these changes.

2015 February 13
  Parallelized the self-test suite code in run_tests and run_tests2.  This cuts
     the time for running a 'make canrelease' for my i7-4790 from approximately
     21 minutes to just a hare over 6 minutes.  It looks like it hangs, but be
     patient.  It runs as many parallel tests as you have cores in batches.  So
     if you have 8 cores, it will run 8 tests to completion, then 8 more, then
     8 more, and so on.  I did not want to depend on anything new, so it uses
     only bash and getconf (part of glibc).  There is room for improvement, but
     this first version already is a measurable improvement.
  Remove clone_next_token() and update all code in parser that was using it to
    use either get_next_token() or peek_next_token() instead to avoid making
    copies of tokens.
  Fix more leaks on error paths in parser.

2015 February 14
  Fix bugs where '-0' was generated and accepted.  David M. Gay's g_fmt had code
    to special case this, but I had not set the IGNORE_ZERO_SIGN.  Also, that
    special case code had not yet been modified to add the leading and trailing
    space around the zero as required for MinimalBASIC.  These changes were
    made, the assembly (for runtime) and C99 (for compile time) versions were
    updated, and the test suite errors where -0 was mistakenly accepted were
    corrected.
  Improve Makefile by adding GCC_ONLY_CFLAGS and moving the flags only gcc can
    handle (as opposed to clang) that were used in generating parseinput to that
    variable when CC is gcc, and clearing that variable when CC is not gcc.
  Fix bad format string in parser2.c self-test code.
  Bump version to 1.96 to reflect changes about '-0' and the many leak fixes.

2015 February 17
  Make delete_ast_node_contents() more thorough and explicitly mark nodes as
    deleted in bst.c file.
  Remove useless assignment in robert1.c file.
  Remove accidental shadowing of i variable in dump_xmmreg_slots() in
    registers.c file.
  Make MAX_GOSUB_DEPTH static in codegen.c file.
  Remove unused assignments to rez in doinput() in parseinput.c file.
  Modify  process_numeric_node()'s udf handling so that clang static analyzer
    accepts it in parser2.c file.
  Ensure check and check32 do not attempt to use valgrind if we are using tcc
    compiler in Makefile.
  Add new files to sparse example, show how to run make check for tcc in README.

2015 February 18
  Merge bst.[ch] into tree.[ch] files.
  Update Makefile dependencies.
  Get rid of left/right and use 0/1.
  Merge tree_node and ast_node to tree_node, no more void pointers!
  In fold_numeric_node() in optimizer.c, use actual NAN bit patterns instead of
    relying on non-standard NAN which expands to __builtin_nan and
    __builtin_nanf and confuses sparse.
  Remove unused level-order tree traversal code.
  Rename remaining bst_whatever functions to remove the 'bst' and use 'tree'
    instead in the name.
  Add some self-test code to tree.c file.
  Only allocate needed-children pointers in parser2.c file.

2015 February 19
  Fix two cases of code before variable declarations in scanner2.c file.
  Cleanup return logic in g_dimstmt(), g_readstmt(), g_optionbasestmt(),
     g_letstmt(), and g_rnd() in parser2.c file.
  Add some more missing token free()s on error paths in parser2.c file.
  Introduce match2() and use it to simplify code in parser2.c file.
  Replace g_abs(), g_atn(), g_cos(), g_exp(), g_int(), g_log(), g_sgn(),
     g_sin(), g_sqr(), and g_tan() by g_bif() in parser2.c file.

2015 February 22
  Move actual compilation from g_optionbasestmt() to run_optionbasestmt(),
     and create a tree_node as the IR.
  Add a dump of what is returned by get_next_token() in verbose mode, and
     make dump_token_stream() use stderr.
  Add a dump of all input tokens before the parse in verbose mode.
  Make g_remstmt() create a tree_node.
  Make g_randomizestmt() create a tree_node.

2015 February 23
  Move actual symbol table updates from g_datastmt()/g_datum() to
     run_datastmt(), and create a tree_node as the IR.
  Slit DIM parse and semantic checks, resulting in g_dimstmt(), g_getdim(),
     and run_dimstmt().

2015 February 24
  Improve logic in g_datastmt() so that code is not duplicated.
  Improve logic in g_dimstmt() so that code is not duplicated.
  Split g_stopstmt() parse and semantic checks.
  Create g_endstmt() and treat END like any other statement for parsing,
     but check to ensure that no other statement follows it.  This resulted
     in the ability to avoid spewing token match failures, so the test
     results were updated to reflect the new, better END handling.
  Split g_gotostmt() parse and semantic checks.  This required adding
     g_lineno2() which works like g_lineno() but takes a passed-in
     token instead of fetching its own.
  Split g_gosubstmt() parse and semantic checks.
  Split g_go_stmt() parse and semantic checks.

2015 February 25
  Split g_return() parse and semantic checks.

2015 February 27
  Rewrite LET logic again, resulting in easier-to-read code.
  Split out parse and semantic checks in LET statement.

2015 February 28
  Simplify logic in g_print_item_tail().

2015 March 2
  Simplify overly-complex PRINT statement handling by merging g_printlist(),
    g_print_item(), and g_print_item_tail() into g_printstmt().
  Merge run_print_item() into g_printstmt().
  Create run_printstmt() and move code generation from g_printstmt() into it
    for handling the PRINT statement.

2015 March 3
  Document parameters of doongotostart() in codegen.c file.
  Create run_on_gotostmt() and move code generation from g_on_gotostmt() into
    it for hadling the ON .. GOTO ... statement.

2015 March 4
  Create run_readstmt() and move move code generation from g_readstmt() into it
    for handling the READ statement.

2015 March 5
  Create run_inputstmt() and move code generation from g_inputstmt() into it
    for handling the INPUT statement.  Now that the AST exists, the complexity
    with the two extra temporary files is not required and that code has been
    removed.
  Create run_nextstmt() and move code generation from g_nextstmt() into it for
    handling the NEXT statement.
  Create run_forstmt() and move code generation from g_forstmt() into it for
    handling the FOR statement.

2015 March 6
  Some miscellaneous cleanups.
  Create run_ifstmt() and move code generation from g_ifstmt() into it for
    handling the IF statement.  This required changing g_relational_expression()
    to create an AST node.

2015 March 10
  Create run_defstmt() and move code generation from g_defstmt() into it for
    handling the DEF statement.
  Update code for END and RESTORE to create AST nodes.
  Update g_statement() to pass back an AST for every statement to g_lines().
  Update compiler to create an AST for the entire program.

2015 March 17
  Pass AST all the way back up to parseit().
  Add stub ast module with stub regenerate_source() function.
  Change OPTION BASE statement AST generation to make argument to be child of
    BASE node.
  Update g_go_stmt() to build GOTO and GOSUB AST nodes from 'GO TO' and
    'GO SUB' input.

2015 March 21
  Fix bug in g_navar() in parser.c where all numeric array variables were
    allocated two children.  One dimensional arrays should of course only
    be allocated one child.
  Add new -P option to usage() in main.c file.
  Implement initial PRINT expression pretty-print support in ast.c file.
  Fix AST population of text for line numbers in ON..GOTO statement.
  Implement ON..GOTO pretty-print support in ast.c file.
  Implement DATA pretty-print support in ast.c file.
  Fix AST population of g_target_variable() for T_NAVAR and T_NVAR.
  Implement LET pretty-print support in ast.c file.
  Implement READ and INPUT pretty-print support in ast.c file.
  Implement IF..THEN pretty-print support in ast.c file.
  Do not hard-code keywords in regenerate_source().
  Implement FOR and NEXT pretty-print support in ast.c file.
  Fix AST population in g_udf() in parser2.c file.
  Fix AST handling in process_numeric_node() in parser2.c file.

2015 March 22
  Fix bug handling UDF parameter names that have a trailing digit where
    the trailing digit was lost in g_defstmt() in parser2.c file and
    in doudf_header() in the codegen.c file.  This bug did not manifest
    itself in normal testing since both places had the same wrong
    assumption and it worked by accident.  The bug was finally seen
    when implementing pretty-print for the DEF statement.
  Implement ABS pretty-print support in ast.c file.
  Implement DEF pretty-print support in ast.c file.

2015 March 24
  Fix typo in P030.BAS.
  Update test harness to test ecma55 -P option.
  Make regenerate_expression() handle +/- Infinity constants in ast.c file.
  Add missing ABS() function support to regenerate_source() in ast.c.file.
  Add missing space after emitting DATA keyword to regenerate_source() in
    ast.c file.
  Fix relational expression emitting in regenerate_source() in ast.c file.
  Add DIM pretty-print support in ast.c file.
  Fix parenthesis generation in arithmetic expressions in the
    regenerate_expression() function in ast.c file.  This was quite tricky
    to get working.
  Preserve REM comment contents in regenerate_source() in ast.c file.
  Better fix for parenthesis generation in arithmetic expressions in the
    regenerate_expression() function in ast.c file.

2015 March 25
  Make regenerate_expression() and trim() static functions in ast.c file.

2015 March 26
  Change UINT_MAX to UINT32_MAX as it should be for uint32_t in lineno.c file.
  Fix possible NULL dereference of parent in regenerate_expression() in the
    ast.c file.
  Move line number handling, including jump target checking, to a separate pass
    over the AST which is called by parseit(), replacing the old post-parse
    function verify_all_jump_targets_exist().  As part of this work, improve
    the error messages to mention the statement keyword (GOTO, IF, etc.) when
    an invalid jump target is used.
  Update add_new_jump_target() to remove third parameter that passes scope
    since we can get it from the linedata[] array.

2015 March 27
  Ensure when we ICE we abort() in symbol_table.c file.
  Completed splitting out AST creation, line number processing, symbol_table
    population, and code generation into separate phases, where everything
    done after the AST is created works with the AST.  This is a rather large
    commit since it has changes spread all over the program and adds
    many new functions.  All tests pass after this commit, thanks to a
    rather painful and extended debugging effort.

2015 March 28
  Fix bug where if a string variable is the target of an assignment, but is
    never otherwise accessed, it wasn't added to the symbol table and its
    definition was missing from the assembly output, resulting in a file
    that would not assemble.
  Update ast.[ch] to allow output of newly regenerated program to a specified
    file name, but default to stdout if the filename is NULL or "".
  Updated system so that -P option obeys -o output file specification, but
    still just sends to stdout if no output file is specified.  When the -P
    switch is used, no assembly output is created.

2015 March 30
  Do not allocate a zero-entry vector when tree node has zero children, just
    set it to NULL.

2015 March 31
  Remove some debugging code from binary_search() in lineno.c file.
  Improve error messages given when match() and match2() encounter incorrect
    tokens.
  Rearrange code in parser2.c so that code generation, semantic checking,
    and parsing routines are grouped appropriately.
  Improve comments in parser2.c file.
  Ensure every ICE in parser.c file calls abort().
  Fix double error message bug when RHS numeric expression of LET statement
    is invalid in parser2.c file.
  Improve user-defined function call handling by moving function call checks
    to the semantic_check_expression() function in the parser2.c file.
  Move DEF statement UDF function registration and parameter checking to
    semantic_checks() function in parser2.c file.
  Create an ICE() function and use that instead of fprintf/abort throughout
    the parser.c file.
  Add reg_to_reg() function to codegen module and update the parser to use
    it instead of directly emitting register to register moves any more.
  Emit assembly for UDFs in a separate pass after the epilogue is
    written.  Since this is done from the AST, the strange tricks with
    emitting code to a temporary file and then appending it later are
    no longer needed.

2015 April 1
  Move ICE() to globals module so the entire compiler can use it.
  Upgrade code throughout the compiler to use ICE() when it makes sense.
  Be more careful about snprintf() usage and buffer termination.
  Remove unused arguments from dostring_comparison() function.
  Since there is no practical way to recover from a failed invocation
    of a code generation function, convert those functions to void.
  Do not use a retval in parser2.c file when it is not required.

2015 April 2
  Add stand-alone ast program to self-tests run by canlogin target.
  Update documentation to describe how to run the 'canrelease' self-tests.
  Add a copy of the MDPI Computers paper I wrote about version 1.7 of
    this compiler.
  Cleanup globals module source code.

2015 April 3
  8 bits is enough for 256 optimization levels, more than will ever be
    required.
  Reduce number of calls to printf() and stop using fflush() in the
    codegen.c, gay.c, shibata.c, and jenkins.c files.

2015 April 4
  Fix bug in string literal handling of backslash characters when emitting
    the symbol table.  Re-code symbol_table.c self-test code to be a
    bit nicer, and to add a backslash string literal test.
  Add P226.BAS HAM test which tests for the weird backslash-related
    string literal combinations recognized by GNU as to ensure that
    we actually get the literal string and not the interpreted value.
    For instance, "\041" should output 4 characters, not an exclamation
    mark.  \b, \f, \n, \r, \t should all output 2 normal characters each,
    not control characters.  \x21 should output 4 characters not an
    exclamation mark.  A single \ should output exactly a single \.  There
    is no way to specify a double quote character in a Minimal BASIC
    string literal, so \" cannot occur.

2015 April 5
  Update zonermore.c to include a new outputbuf2() routine.  This routine
    will output the partial print buffer contents if there are any without
    appending a newline.  This is used for the case when the last PRINT
    statement did not trigger a newline and we reach an INPUT statement and
    we need that previous PRINT (which is probably a prompt) to be flushed
    before the INPUT prompt ('? ') is displayed.
  Update do_INPUT() to use new outputbuf2() routine.
  Add P227.BAS HAM test which tests INPUT after a PRINT that ends with
    either semicolon or a comma and thus has a non-empty, unflushed buffer.
    It also tests error messages for invalid input.
  Fix ICE when a keyword was used in a PRINT statement, such as PRINT FOR.
    Cleaned up some double error reports that were exposed once the ICE was
    changed to an error.
  Add test P228.BAS to verify a keyword after PRINT will not cause an ICE.

2015 April 6
  Change ICE() and the calls to it so that the file, function, and linenumber
    in the file of the call to the ICE are included in the ICE message, so
    it is easy to know exactly where in the compiler the ICE occurred.
  Avoid double error messages when the arithmetic expressions in a
    conditional expression are invalid.
  Fix ICE when a keyword follows LET instead of a valid variable name.
  Add test P229.BAS to verify a keyword after LET will not cause an ICE.
  Fix bug where READ followed by a keyword cause the parser to fail without
    any error message provided.
  Add test P230.BAS to verify a keyword after READ will not cause an ICE and
    will give an appropriate error message.
  In g_target_variable() in parser2.c, do not fall through to default after
    T_COMMA error expression since that results in double error messages.
  Give a better error message if a real keyword that is not valid as a
    statement-starting keyword is used to start a statement.
  The run_tests2 was sometimes not waiting for all tests to run.  Improve
    the script to be more robust, and merge those changes back into
    run_tests script.
  Add test P231.BAS to verify that using a keyword that is not valid to begin a
    statement to begin a statement gives an appropriate error message.

2015 April 21
  Mark linno argument as const in ICE() in globals.[ch] files.
  Make parameters of regenerate_source() const in ast.[ch] files.
  Make some parameters in g_lines(), g_program(), and parseit() const in
    parser2.[ch] files.
  Make clear_lineno_data() only free non-NULL pointers in lineno.c file.
  Do not allocate children[] if maxchildren is 0 in create_tree_node() and
    do not attempt to free NULL pointers in tree_delete_all() in tree.c file.
  Add FATAL() to globals.[ch] file.
  Change scanner to work a token at a time instead of having it
    create the entire token stream at once.  So instead of using the
    scan_buffer() function, you will do a load_buffer(), then get_next_token()
    many times, and finally unload_buffer(), using clear_token_stream() when
    you need to free an existing but unconsumed token stream.  To make things
    work, for some tokens an additional token will be fetched and added to the
    stream, but this is transparent to the get/peek next token routines.
  Improve existing scanner2 self-tests, and add a few more.
  Update main.c and parser2.[ch] to adapt to recent scanner changes.
  Actually ICE() instead of silently ignoring errors in run_target_variable()
    in parser2.c file.

2015 April 22
  The clear_symbol_table() routine actually removed the data list, but forgot
    to set data_list_head and data_list_tail to NULL in symbol_table.c file;
    this is fixed.
  The is_final[] array is not actually used in the scanner, but remains as
    good documentation; bracket it with #if 0/#endif so it is not actually
    compiled, which removes the warning from clang about it.
  Bump version to 1.98 in globals.c file.

2015 April 23
  If we are using GNU libc, we can use mallopt() to disable mmap() and then use
    mallinfo() to check for memory leaks.  Finally, we can call malloc_stats to
    dump statistics.  This is only done if we compile with GNU glibc.  If no
    error occurs, nothing is printed unless -v is specified.  The statistics are
    only shown if -v is specified.
  Teach Makefile about ASAN_EXTRA so example from README actually works.
  Merge in dynamic memory interceptor code.  If MJOLNIR is defined (COMPILE_MODE
    set to DEBUG3 in Makefile) then we track every dynamic memory allocation.
    Otherwise we call routines that call FATAL() if the memory allocation fails.
    This is done with macros in globals.h (to choose what routines to run) and
    the routines themselves are in the globals.c file.  There is some overhead
    even when MJOLNIR is not defined since we must check for failed memory
    allocations, but this is much easier than actually coding checks for every
    single allocation throughout the compiler.  Using the macro solution means
    that we can use normal malloc(),free(),realloc(),strdup(), and strndup()
    in all code except the special routines in globals.c and we don't have to
    check for OOM.  This was the least invasive way I could find to get full
    OMM checking.  I had already written the mymalloc(), etc. routines while
    debugging the recent scanner changes, and realize I could keep them in case
    that kind of debugging is ever needed again.  Those routines are quite
    slow, so they are not used by default.

2015 April 24
  Replace all uses of strndup() by strdup().

2015 April 25
  Fix Makefile so canrelease works for tcc again (tcc cannot generate assembly
    so parseinput must be compiled from .c to .o for tcc) and valgrind does
    not work for tcc executables so the leak checks must be skipped.
  Fix a warning from llvm's scan-build in generate_one_token().
  Remove unused FP stack and fix a lot of stale comments in codgen.c file.
  Add AVX versions of SLEEF routines SIN, COS, TAN, ATN, LOG, EXP, and POW
    and use then when the -A switch is specified.
  Update canrelease Makefile target to test -4 switch.
  Fix code generation so that if we are on 64bit mode (the usual case) we
    just use movq to move between GP and XMM registers.  If we are on 32 bit
    mode and have SSE4.1, use pinsrq/pextrq, and only if we are on 32 bit
    mode and lack SSE4.1 (like on original core 2 duo) then we use the stack
    to pass the data.

2015 April 28
  Do not include TAB() support code in generated assembly unless it is actually
    called.
  Do not include gosub/return runtime support macros if they are not actually
    used.

2015 April 29
  Do not include for/next runtime support macros if they are not actually used.
  Only include binary operator macros that are actually used.
  Only include 1D or 2D array read/write macros if they are actually used.

2015 April 30
  Add missing .type for .Lsstack_full_msg in codegen.c file.
  Do not include .Lbaddivide, .Ldividebyzero_msg, or .Lbaddivide_msg in
    generated assembly if we do not do a divide.
  Fix g_string_expression() error where it created a leaf node with 2 children
    instead of zero children.
  Fix adding string literals and variables to occur during the symbol table
    update phase and not during code generation.
  Do not include string stuff in generated assembly if it is not actually used.
  Dump all the need_* and use_* flags with new dumpflags() if in verbose mode.

2015 May 1
  Only include .Longotofail_msg in generated assembly if it is actually used.
  Use xorpd instead of pxor and andpd instead of pand in generated assembly.

2015 May 2
  Only include PRINT support in generated assembly if it is actually used.
  Only include real number load/store macros in generated assembly if they are
    actually used.
  Further reduce the number of print() calls in codegen.c file.

2015 May 3
  FOR and NEXT semantic checks were still mixed into the code generation.  Fix
    the code so that the semantic checks are done at the correct time before
    and code generation is attempted.
  Fix ICE when a non-existent filename is used as input to ecma55.
  Only include .LFLT_NEG_MASK in generated assembly if it is actually used.
  Somehow need_POW and need_POWER both got created - change everything to use
    need_POWER and remove need_POW.
  Move setting of the need_WHATEVER flags from the scanner code to the semantic
    checking code.
  Only include printfloat in generated assembly if it is actually used.
  Move the code for generating assembly from the AST from parser2.c into
    a new module called asmgen.[ch] so that asmgen can be considered the
    high-level assembly generation code that walks the AST, and codegen
    is the low-level assembly that actually emits x86-64 code.

2015 May 5
  Move the code for semantic checking, symbol table population, and jump
    target verification into a new module called semantic_checks.[ch] so that
    parser2.c now finally is just the parser that creates the AST.
  Sparse cannot handle the ICE() and FATAL() definitions, so remove the sparse
    notes from the README.

2015 May 6
  Move convert_line_number() to globals module.
  Clean up header includes to only include what is necessary.
  Update Makefile to reflect header file dependancy changes.
  Improve code generation for binary_add and binary_subtract so that they do
    not trash any xmm registers.
  Fixed a bad shift for binary_multiply when in 64bit mode.
  Add test 232: TEST ADD OVERFLOW EXCEPTION
  Add test 233: TEST SUBTRACT OVERFLOW EXCEPTION
  Add test 234: TEST MULTIPLICATION OVERFLOW EXCEPTION
  Teach optimizer.c constant folding not to fold when exceptions will occur
    since the exceptions must be generated so that output is compliant.
  Fix expected output for test 29 to expect all 4 required exceptions.
  Fix expected output for test 35 to expect another exception.  It gets
    one overflow for the power and one for the multiply on line 250.
  Fix busted overflow handling in binary_multiply macro for 64 bit.  This had
    many bugs: 1) r11 was trashed when printing the exception and 2) right shift
    was incorrect (need psrlq for 64 bit) 3) overflow needs to be checked at
    the end of the macro to cover the case when an operand is +/- infinity.
  Improve code generation for binary_multiply so that it does not trash any xmm
    registers.

2015 May 7
  Add missing SSE4 optimizer level 2 32 bit tests to Makefile check32 target.

2015 May 8
  Rewrite binary_divide macro in a cleaner style and fix exception handling.
  Improve tests 232, 233, 234.
  Add test 235: TEST DIVIDE UNDERFLOW
  Add test 236: TEST DIVIDE OVERFLOW
  Add 32 bit test version for 232 .. 236, a run_tests3 to run them, and update
    the Makefile canrelease to run run_tests3.
  Improve ABS() code generation.
  Improve SGN() code generation.
  Only attempt to fill registers if we spill them.

2015 May 9
  Add comment header/footer blocks around emitted SLEEF code.
  Fix register spilling offsets.   Stomping on the stack did not seem to cause
    any problems, but I have no idea why not.  I think I just got lucky.  The
    error was found by visual inspection when chekcing spilling one register
    and I found it used offset 120 even though only 16 bytes had been allocated
    since only 1 register would be saved/restored.  These incorrect offsets were
    generated in xmm_spillall() and xmm_fillall() in the registers.c file.
  Try to be smarter in process_numeric_node() of asmgen.c and only save the
    xmm register to r15 for calling SLEEF functions if there was a spill/fill
    sequence required.
  Use .equiv instead of .equ to ensure we do not redfine symbols by accident
    in the codegen.c file.
  The memcpy and mystrcmp were marked .globl but should not be in the codegen.c
    file.  You can check was is exported with 'nm -g WHATEVER.o' command.
  Mark show_GPLv2() as static.
  Mark fold_numeric_node() and reggie_numeric_node() as static.
  Mark match() as static and rename to peephole_match() in peephole.c file.
  Do not mark badxit as .globl in the codegen.c file.

2015 May 11
  Rewrite binary_multiply again, replacing bad MASK that worked by accident
    with btr that works by design.
  Fix bug where assembly code was storing 1 to ah instead of al in features
    tests.  It worked by accident since setcc also set the zero flag and the
    jumps were based on that, but it is still incorrect.
  Consolidate CPU feature tests into one function using bit tests instead of
    anding with masks.
  Add Bob Jenkins' original public domain ISAAC-64 C language reference
    implementation and associated documentation.  That code was used to create
    the jenkins.[ch] files.
  Add Naoki Shibata's original public domain SLEEF C language reference
    implementation.  That code was used to create the shibata.[ch] files.
  Update run_tests and run_tests2 to include the improvements pioneered
    in run_tests3.
  Add test 237: TEST MULTIPLICATION UNDERFLOW EXCEPTION

2015 May 12
  Remove unused MAX_NUMERIC_OPERANDS from globals.[ch] files.
  Fix optimizer so that if ANY exception happens, constant folding (for that
    operation) is NOT done in order to guarantee the correct exceptions will
    be generated at runtime.
  Use btc instead of a mask for unary minus implementation.  This improved
    version does not need the mask in memory or a scratch register.
  Add test 238: TEST DIVIDE BY ZERO
  Improve binary_subtract and binary_add macros to use bt to test sign bit.
  Improve binary_multiply macro to use bt to test sign bit.
  Add test 239: TEST INVALID CHARACTER INPUT OUTSIDE OF CHARACTER CLASS RANGE.
  Fix scanner coredump on UTF-8 input that is outside the range of 7 bit ASCII.
  The clang ASAN hates divide by zero so a check for zero denominator has been
    added for the optimizer when attempting divide folding.

2015 May 13
  Makefile improvements.
  Improve binary_divide macro to use bt to test sign bit.  I hit a strange
    error with -0 vs +0 (and IEEE float thing) in 32 bits so after a divide
    by zero exception, the denominator is forced to +0 in order to ensure
    we get the right sign of infinity.
  Improve beginfor macro to use btc to flip the sign bit.
  Improve error messages when an invalid statement or line number is used.
  Add test 240: TEST 4O INSTEAD OF 40 (LETTER 'O' INSTEAD OF ZERO) IN LINE
    NUMBER.

 2015 May 15
  In lineno.c, verify_all_jump_targets_exist() is only used by the unit test,
    so move it inside the UNIT_TEST ifdef area.
  The parseit() function does not need a file pointer parameter any more.
  Remove unused parameters from functions in codegen module.
  Completely rewrite Makefile variable setting to be more correct.
  Rewrite mystrlen assembly version to use a conditional backwards jump.
  More Makefile fixes:
    1. allow pcc and tcc to use COMPILE_MODE=DEBUG with a warning.
    2. on Ubuntu 15.04, the header files have bizzare __THROW and __LEAF macros
       that break pcc.  Define each of them to the empty string in CPPFLAGS
       for pcc.
    3. the parseinput.s target rebuild rules were missing CPPFLAGS.
  Remove unreachable break in g_statement() of parser2.c file.
  In xmalloc() real_malloc() might return NULL and that is not necessarily zero
    in globals.c file.

2015 May 16
  Yet another round of Makefile fixes (sigh).  Current version is a bit more
    brute-force, but manages to get the ASAN variable handling right.  Also,
    pcc spews some temp filename if you compile and link in the same invocation
    so split compile and links for the unit tests.  Analyzed the dependancies
    of the unit tests and managed to find a build order that worked and didn't
    end up with a duplicate main() on link avoiding the need to clean between
    each unit test.  IMNSHO, non-trivial make files are fiendishly tricky to
    get right.
  Well, the CPU consolidated feature tests failed badly on my ancient
    Core 2 Duo.  It turns out the detection worked but a couple of branches
    were missing (sigh).

2015 May 18
  Fix incorrect use of UINT_MAX instead of UNIT32_MAX in symbol_table
    binary_search() funciton.

2015 May 19
  Replace the three different binary_search() routines with one shared generic
    mybsearch() function.

2015 May 21
  Do line number sorts immediately after inserts instead of delaying them to
    searches.  This is done to allow using the same macro that the symbol table
    module uses and eliminate the need for a custom binary_search() function in
    the lineno module.

2015 May 22
  Add 'vzeroupper' calls at the end of the AVX versions of Naoki Shibata's
    SLEEF code to fix the bad performance of the AVX generated code.  This
    fixes the remarkable slowdown, but sadly AVX code does not run any faster
    than the SSE code does.  At least now it doesn't run slower either.  So
    things are better, but there's still something spooky wrong in there.

2015 May 23
  Fix a typo in floatlit_to_floatreg macro.  How it ever worked before I have
    no idea.  It was supposed to use 'movq', but had 'movd' instead.
  Same bug in myisinf and myisnan; gas seems to promote movd to movq silently,
    but movq is what should be used.
  Use movapd for xmm register to register move since vex encoded movsd won't
    work but vex encoded movapd will.
  Add AVX versions of David M. Gay's code in gay.c for the part of the code
    that acutally uses floating point.

2015 May 24
  Finish converting code generation to generate AVX code with the -A switch.
    Sadly, it's not faster than SSE code, but research indicates that AVX
    is not faster for scalar math, only for vectorized code.  At least with
    the vzeroupper calls it isn't _much_ slower.
  Do not allow unsupported optimization levels to be specified on the command
    line.

2015 May 26
  Update slideshow.

2015 May 27
  Change __FUNCTION__ to __func__ since gcc 5.x spews stupid warnings on every
    single use of __FUNCTION__, and I still want the pedantic switch on.
  Change all strncmp() to just strcmp().

2015 May 28
  Add an error_messages module and use it for ICE() and FATAL().
  Create deep_debug_printf() which is implemented with a macro.  Converted a lot
    of developer-only debug_printf() calls to use deep_debug_printf().  Under a
    normal compile, there is no cost for deep_debug_printf(), but if you compile
    with CPPFLAGS=-DDEEP_DEBUG, then the -v option gives all the information
    like before.  Without that special, non-default compile, the output of -v is
    now briefer, showing grammar rules matched, etc.

2015 June 19
  Update README to change from 'make check' to 'make canrelease' since
    'make check' is no longer supported.

2015 June 21
  Add Quicksort, Bubblesort, Heapsort, and Mergesort demo programs.
  Add Binary Search demo program.

2015 June 22
  Add Singly-linked list demo program.

2015 July 8
  Add insertion sort demo program.
  Add comb sort demo program.
  Add selection sort demo program.

2015 July 11
  Add singly-linked list insertion sort demo (inorder insertion into singly
    linked list, followed by retrieval starting at head).

2015 July 12
  Fix dump_jump_targets() to show correct scope information.
  Update semantic_checks() so it calls dump_line_numbers() and
    dump_jump_targets() if the verbose flag is set.

2015 July 13
  The main.c file does not need to include lineno.h any more.
  The scanner2.c file does not need to include lineno.h any more.
  Remove unneeded mergesort() in add_new_line_number() function.

2015 July 14
  Add line number management to ast.c self-test main() function.
  Better management of line number and symbol table dynamic memory.
  Remove lineno.[ch] and use the line numbers inside the AST directly.
  Update compiler to use indexes into the AST for jump targets.
  Add -R option to compiler to support renumbering.
  Update documentation.

2015 August 8
  Fix bug where string support was omitted if a print of a string
    variable occurs without any assignment to that variable.  That is
    a coding error, but it generated a file that would not assemble
    instead of a file that would report the uninitialized variable at
    runtime like it should.  This was a result of not stting the
    need_STRINGS to true when a new string variable was encountered
    in a PRINT statement.
  Add test P241: ENSURE PRINTING A SCALAR STRING BEFORE IT HAS BEEN ASSIGNED
    A VALUE GENERATES THE APPROPRIATE MESSAGE AT RUNTIME.
  Use _start, not main, in our generated assembly since we do not use libc.

2015 August 10
  Add tokens for AND, OR, and NOT.
  Update parser and semantic checker for AND, OR, and NOT.

2015 August 12
  Update pretty printer for AND, OR, and NOT.

2015 August 15
  Update binary_subtract support to handle infinity values instead of claiming
    a variable was uninitialized.  The rules are:
      +Inf - -Inf gets +Inf
      -Inf - +Inf gets -Inf
      -Inf - -Inf terminates the program with an error
      +Inf - +Inf terminates the program with an error
  Add tests P242 through P245 to test for the 4 cases of subtraction involving
    infinity.

2015 August 16
  Update binary_add support to handle infinity values instead of claiming
    a variable was uninitialized.  The rules are:
      +Inf + -Inf terminates the program with an error
      -Inf + +Inf terminates the program with an error
      -Inf + -Inf gets -Inf
      +Inf + +Inf gets +Inf
  Add tests P246 through P249 to test for the 4 cases of addition involving
    infinity.
  Update binary_multiply support to handle infinity values instead of claiming
    a variable was uninitialized.  The rules are:
      0    * +Inf terminates the program with an error
      +Inf * 0    terminates the program with an error
      0    * -Inf terminates the program with an error
      -Inf * 0    terminates the program with an error
      +Inf * +Inf gets +Inf
      +Inf * -Inf gets -Inf
      -Inf * +Inf gets -Inf
      -Inf * -Inf gets +Inf
      +Inf * 5    gets +Inf
      5    * +Inf gets +Inf
      +Inf * -5   gets -Inf
      -5   * +Inf gets -Inf
      -Inf * 5    gets -Inf
      5    * -Inf gets -Inf
      -Inf * -5   gets +Inf
      -5   * -Inf gets +Inf

2015 August 17
  Add more tests for add, subtract, multiply, divide, and power involving a
     constant and infinity.
  Add special test for power with 0 and +/- 1 vs. infinity.
  Update binary_divide to throw fatal NaN exception when an indeterminate
     result occurs.
  Add more tests for division involving infinity.

2015 August 18
  Fix mystrcmp to include missing cltq at end to promote result to 64 bits.
  Replace all-in-one donumeric_comparsion() that did compare and conditional
     jump with a pair of functions: donumeric_comparison2() that only does a
     comparison, and doconditional_branch() that only does a conditional jump.
     The comparison function must leave the final result as a 0 (false) or
     1 (true) in al, which the doconditional_branch() uses.  The
     donumeric_comparison2() has a isrhs argument that when true leaves the
     boolean value in ah, and when false it leaves the value in al.  This
     allows using it with logical AND and OR when they get coded.  Both of
     those must leave their final answer in al so doconditional_branch() will
     work as expected.
  Replace all-in-one dostring_comparison() with dostring_comparison2() that
     just does the comparison, and use the new doconditional_branch() with it.

2015 August 19
  Finish implementing logical AND, OR, NOT support for conditional expressions.
  Fix NBS tests 25, 74, 108, 185, 191, and 206 using Jorge Giner Cordero's
     corrected versions.

2015 August 21
  Add T_EXIT token for 'EXIT' used for 'EXIT FOR' in ECMA-116 BASIC-1.
  Update parser to handle 'EXIT FOR' statement.
  Finish implementing EXIT FOR.
  Add -X flag to ecma55 that controls 'extensions' global flag.  If true,
     extensions are permitted, if false they are not.  Defaults of false.
  Update parser to reject AND, OR, NOT, and EXIT FOR unless extensions are
     enabled.
  Update scanner to prohibit lower-case letters in REM unless extensions are
     enabled.
  Update scanner to prohibit lower-case letters in quoted strings unless
     extensions are enabled.

2015 August 23
  Implement the required short-circuit behavior for AND and OR.  This version
     of the code does not require using the stack.
  Fix precedence of AND vs. OR in pretty printer.
  Fix valgrind testing to use -X for tests that need extensions.
  Add HAM tests 269 and 270 for AND and OR respectively.

2015 August 24
  Add HAM test 271 for NOT.
  Update documentation to explain how to use ECMA55FLAGS to specify -X option.
  Update ECMA55-slideshow.odp and regenerate ECMA55-slideshow.pdf adding
     feature and extension pages, and updating test counts and code linecounts.
  Add HAM test 272 for lower-case strings when extensions are enabled.
  Improve test 269 with another test case.

2015 August 31
  Add SEQSEARCH.BAS sequential search of an array demo to CSCLASSICS collection.

2015 September 1
  Update SEQSEARCH.BAS to not use unnecessarily confusing decreasing loop
    indices.

2015 September 3
  If you have a program that has an INPUT but no PRINT, you still need the
    printzone code because the prompt for the INPUT must be displayed.  This
    was not being included, so the simple example from 2014 February 26
    changelog entry would not compile.  This is fixed.

2015 September 5
  Add more .cfi directives to generated assembly output in codegen.c file.
  Update array_1D_to_floatreg so that it prints the array name in error
    message for index out of bounds read on 1 dimensional numeric arrays.
  Update array_2D_to_floatreg so that it prints the array name in error
    message for index out of bounds read on 2 dimensional numeric arrays.
  Update floatreg_to_array_1D so that it print the array name in error
    message for index out of bounds write on 1 dimensional numeric arrays.
  Update floatreg_to_array_2D so that it print the array name in error
    message for index out of bounds write on 2 dimensional numeric arrays.

2015 September 6
  Update array_1D_to_floatreg to display the subscript in error messages
    when possible, or use a message that says the subscript is invalid
    if the subscript expressions generates a NaN.
  Update floatreg_to_array_1D to display the subscript in error messages
    when possible, or use a message that says the subscript is invalid
    if the subscript expressions generates a NaN.
  Add new tests for verifying proper error messages when using bad array
    indices.
  Fix bug in subscript printing for errors when OPTION BASE 1 is in
    effect.
  Update expected output for tests 63, 65, 67, 68, and 70 to include
    subscript values in the error messages.
  Add missing HAM_compile_output/P227.BAS.compile file.
  Update run_tests2 to ensure the P???.BAS.compile file exists before
    running any test.
  Add new tests for verifying proper error messages when using bad
    one-dimensional array indicies with OPTION BASE 1 in effect.

2015 September 7
  Add subscript error message tests for two-dimensional arrays that
    correspond to the one-dimensional array tests and have no
    OPTION BASE statement (so they use default zero-based arrays).
  Add missing P23{2,2,3,4,5,6,7.8}.BAS32.compile files.
  Update run_tests to ensure the P???.BAS.compile file exists before
    running any test.
  Update run_tests3 to ensure the P???.BAS32.compile file exists before
    running any test.
  Add new tests for verifying proper error messages when using bad
    two-dimensional array indicies with OPTION BASE 1.
  Add NaN subscript error detection to array_2D_to_floatreg and
    floatreg_to_array_2D macros.
  Add subscript output to out of bounds error messages for
    array_2D_to_floatreg macro.
  Update semantic_checks.c to not mistakenly set need_WRITE_1D to true
    for 2D array writes.
  Finish support for subscript error messages for two-dimensional
    arrays.
  Add tests for read of uninitialized array elements.
  Fix array_2D_to_floatreg uninitialized element error message
    subscript output.
  Add more tests.

2015 September 8
  Add more array input tests with DIM and OPTION BASE 1.
  Add tests for built-in functions with NaN argument.
  Add tests for user-defined function witih NaN argument.

2015 September 9
  Fix tab function c to refuse negative arguments, not just a zero argument.
  The standard says to throw a non-fatal exception if the argument to the
    TAB() function is less than 1 but that was missing - now it has been
    implemented.
  Add tests for TAB() function.

2015 September 14
  Rename printfloat to appendfloat in codegen.c, since that function will
    use appendbuf and does not directly print the float.
  Add comments to print zone code.
  Fix some bugs where pending output was lost when fatal errors occurred.
  Get ABS() and ATN() tests working for +/- Infinity.
  Get COS(), SIN(), TAN(), and EXP() tests working for +/- Infinity.

2015 September 15
  Get LOG() tests working for 0,1,+/- Infinity.
  Add need_INT flag and use it to only include support for INT() if the
    program needs it.
  Rename assembly function intf to floor to more accurately reflect what
    it does.
  Update INT() too give an appropriate error message when the magnitude of the
    argument is too large to be converted to an integer.
  Store MXCSR on stack instead of in .Lnewmxcsr for the ON .. GOTO
    implementation.
  Get SGN() tests working for -Infinity,0,+Infinity.

2015 September 27
  Simplify SQR() code checking for a negative argument.
  Move XMM_REGCOUNT from registers.h to a new register_count.h header file so
    codegen.c can use it.
  Improve SQR() error message reporting.
  Update SQR() to give an appropriate error message for +Infinity.
  Update TAB() to give better error messages showing argument values when
    they are invalid.
  Update user-defined-function code generation to check for +/-Infinity values
    and give a warning in that case, but on if extensions (-X switch) are on.
  Add new flags to dumpflags() in globals.c file.
  Release 2.14 version.

2015 September 28
  Add test P347 for NaN generated in an arithmetic expression.
  Add test P348 for attempt to print undefined array element.  The compiler
    fails to flush pending output and mixes the output with the error message.
    This test expects the correct output, and will ensure the problem gets fixed
    before the next release.
  Add test P349 for attempt to use lower-case comments with extensions active.
    This should work, but does not even compile.
    This test expects the correct output, and will ensure the problem gets fixed
    before the next release.
  Add test P350 for 'OR' keyword in logical expression when extensions are
    active.
  Add test P351 for 'AND' keyword in logical expression when extensions are
    active.
  Add test P352 for 'NOT' keyword and parenthesis in logical expression when
    extensions are active.
  Add test P353 for a logical expression using both a string comparison and a
    numeric comparison.
  Update test P338 to print something first so we know the output was flushed
    by the error handler.  This test shows another flush failure by the error
    handling code.
  Update test P339 to print something first so we know the output was flushed
    by the error handler.  This test shows another flush failure by the error
    handling code.
  Update test P340 to print something first so we know the output was flushed
    by the error handler.  This test shows another flush failure by the error
    handling code.
  Add test P354, a simple TAB() test with a column specified that is less than
    the current column, which should flush the current line, then force output
    to the first column of the next line without any error.
  Add test P355, a simple use of an uninitialized scalar in a let statement
    that must give a fatal exception.
  Add test P356, a non-trivial set of AND/OR/NOT tests.
  Update grammar.txt to include AND/OR/NOT and EXIT FOR.
  Fix grammar comments in parser2.c file.
  Add test P357, a minimal program consisting of just an END statement.  This
    should work, but does not even compile.

2015 October 3
  Change codegen.c to always include print routines since error messages now
    use them.  This fixes the problem where a program with just "1 END" would
    not compile.  Test P357 now passes.
  Change tab assembly routine to flush any pending output before printing the
    warning message if a non-fatal exception occurs.

2015 October 6
  Use printline function instead of directly printing newlines in outputbuf
    and flushoutputbuf.
  Convert all calls to printstring to use printstring2 in generated code,
    remove prinstring.
  Major rework of output handling so that fatal exceptions and non-fatal
    exceptions both get sent through the print subsystem.  NOTE WELL!!!!
    Arithmetic expressions (divide by zero, etc.) are still not printing
    correctly yet.....

2015 October 10
  Update all array-specific error messages to get sent through the print
    subsystem.

2015 October 11
  Update the remaining error message code so it is sent through the print
    subsystem.  Create error-specific buffer and routines, and route all
    error messages through that so error lines and regular output are not
    mixed together on the same line any more.

2015 October 20
  Remove redundant load in initbuf and initebuf routines.
  Make initbuf and initebuf wrappers for calls to initbuffer which has
    the common code.

2015 October 23
  Finally remove initbuf and initebuf; all callers now directly call the
    initbuffer routine.

2015 October 24
  Make outputbuf and outputebuf directly emit newlines.  The write
    system call uses length, not zero termination, so modify code to
    append a newline instead of a zero, and increase the length by
    one, and now one system call is used for the output instead of
    tow, the first being for the ASCIIZ string and the second for a
    newline.
  Replace outputbuf and outputebuf by outputbuffer.
  Fix embarassingly bad bugs in appendbuf/appendebuf where address of
    .Lobuf_next was used instead of the value.  These bugs were found by
    code inspection, since they mysteriously never manifest themselves during
    testing.
  Add appendbuffer parameterized routine to replace appendbuf and appendebuf.
  Convert appendbuf and appendebuf calls to use new appendbuffer, and remove
    appendbuf and appendebuf.

2015 October 25
  Replace flushoutputline and flushoutputeline with flushoutputln.
  Update appendfloat to use parameters, convert code to use it and remove
    appendefloat.

2015 October 26
  Remove unused forceit parameter support from nextzone.
  Update nextzone to use parameters.
  Remove unneeded register saves from tab subroutine.
  Update tab to use parameters.

2015 October 28
  Update doexp() to use a local variable for storing the MXCSR register.
  Update dotab() to use a local variable for storing the MXCSR register.
  Update binary_add macro to allocate the space it releases.  How the
    unbalanced usage worked remains a mystery.
  Update binary_add macro to use a local variable for storing the MXCSR
    register.

2015 November 1
  Update binary_subtract macro to use a local variable for storing the
    MXCSR register.
  Update binary_multiply macro to use a local variable for storing the
    MXCSR register.
  Update binary_divide macro to use a local variable for storing the
    MXCSR register.
  Fix large model violations when accessing .Loldmxcsr and .Lnewmxcsr
    variables.

2015 November 2
  Add test P358 that attempts to use every feature of ECMA-55 Minimal
    BASIC in one program.

2015 November 13
  Add test P359 that triggers parser bug in IF statement parenthesis
    handling.

2015 November 17
  Convert more magic numbers in generated assembly code to defined
    constants.
  Fix grammar typographical errors.

2015 November 18
  It turns out the ECMA-116 grammar for relational expressions is not
    LL(1), so I had to implement backtracking in the parser.
    When choosing a rule for g_relational_primary one symbol of
    lookahead is not enough.  If a left parenthesis is seen, there
    is no way with that one symbol to know if the left parenthesis
    is part of the arithmetic expression or not.  To allow parsing
    in this case I first had to implement backtracking in the scanner.
    That consisted of recording the absolute byte offset of each token in
    a new field of the token structure at token creation time and
    adding a function set_buffer_position() that would clear any
    tokens that were already created (via peek_next_token(), etc.)
    and reset the input byte position.  Once this was done, I was
    able to update the g_relational_primary() function in the parser to
    record the position and try the:
      g_relational_primary -> ( g_relational_expression )
    rule first if peek_next_token() returns a left parenthesis, and
    if that expansion fails, to rewind and try again with
      g_relational_primary -> g_comparision
    instead.  This allows test P359 to be compiled and run correctly,
    but the error message for the failed rule match is still printed.
  Add ERROR() function to parser2.c, update the parser to use it to print
    errors instead of emitting them directly.
  Add suppress_errors and update ERROR() to skip error display when
    suppress_errors is true.  Initialize suppress_errors to false.  It
    is only set to true when trying the first g_relational_primary
    expansion when extensions are on (-X option).
  Update scanner2.c self-tests to know about the new position field in
    the token structure.
  Fix bug in sign token position calculation when converting a +/-INT to
    separate sign and INT which was revealed by updated self-tests.

2015 November 21
  Move output flush from the call to doinput into the actual doinput routine.
  Write the input '? ' prompt in dointput routine through the normal
    output system.
  The fix for dinput to use the normal output system caused a bug in
    test P227's expected output to manifest itself (off by 1 column) so
    the expected output had to be updated.

2015 November 22
  Carefully clear entire input buffer in doinput assembly routine.

2015 November 23
  Begin cleaning up doinput assembly routine and adding comments to it.

2015 November 25
  Fix INPUT() and doinput() in parseinput.c file.
  Make INPUT errors should be upper case in codegen.c.
  Update parseinput.c so it directly makes system calls instead of using
    libc library calls for read(), write(), and fstat().

2015 December 1
  Use direct write system calls in the zonermore.c program, making the
    generated assembly easier to use in the runtime library.
  Update parseinput.c program to use appendbuf/outputbuf/initbuf routines
    like they do in the real runtime library.  Ensure the implementations
    of those routiones make direct system calls so the generated assembly
    can be directly used by the runtime library.  Finrally really fix the
    INPUT() routine to correctly echo output in the appropriate fixed-column
    manner when not running on a tty.  Improve self-test code in main().
    Fix a bug accepting unquoted strings.
  Make dumpregs.s diagnostic output go to STDERR, not STDOUT.
  Make asmgen.c request unquoted strings instead of quoted strings for INPUT
    of strings like it should.  The parseinput code will allow quoted
    strings when needed.
  Fix expected output for full width input echo.
  The MinimalBASIC standard does not permit lower-case letters.  Fix the
    expected output to be upper-case.
  The MinimalBASIC standard does not permit lower-case letters.  Fix the
    routines from David M. Gay to use upper-case output.
  Tweak compiler options for zonermore.c and parseinput.c compilation to
    allow generating easier-to-use assembly code.
  Finally replace doinput, parseinput, and INPUT run-time routines in
    codegen.c with working versions created from the newly fixed
    parseinput.c's generated assembly.
  OBUF and EBUF need room for OUTPUT_WIDTH columns of data, a newline, and
    a terminator, so fix the size.
  Update all messages in generated runtime in codegen.c to use upper-case
    since the MinimalBASIC standard does not permit lower-case letters.
  Since tcc cannot handle inline assembly, the zonermore and parseinput
    programs cannot be compiled successfully with it.  Update the Makefile
    to use gcc for parseinput and to just skip zonermore when CC=tcc.

2015 December 2
  Do not hard-code MAX_STRING_BYTES value into runtime library code.
  Do not hard-code numeric constants into runtime library code error messages.
  Modernize GNU GPL notice comments.
  Improve ecma55.1 manual page.

2016 June 7
  Add latex source to new free book "An Introduction to Programming with ECMA-55
    Minimal BASIC".

2016 June 8
  Fix typographical errors in man pages.
  Update book to note that a DEF statement must be run only once.

2016 June 10
  Make documentation use the GNU FDL Version 1.3.
  Improve comments in tree.[ch] and ast.[ch]

2016 June 13
  Use ERROR_BUFFER_LEN from globals.h instead of local ERROR_BUFFER_MAX in
    optimizer.c.
  Use ERROR_BUFFER_LEN instead of hard-coding buffer size in asmgen.c

2016 June 14
  Move XMM_REGISTER_NAME_WIDTH from registers.c to registers.h

2016 June 16
  Make pop_xmmreg() argument const.
  Improve comments in registers.[ch], optimizer.[ch], scanner2.c

2016 June 17
  Improve comments in parser2.c

2016 June 18
  Add more comments to parser2.[ch] documenting the backtracking used in
    conditional expressions using AND/OR/NOT and parenthesis, documenting
    internal linked lists used for statements like PRINT, DIM, etc.

2016 June 19
  Use ERROR_BUFFER_LEN for error buffers in scanner2.c
  Improve comments in semantic_checks.[ch], use better parameter names.
  Move some error messages from semantic_checks module to error_messages module.

2016 June 21
  Move more error message texts from various modules to emsg[] array in
    error_messages.c, and try to make the messages more uniform, which required
    updating the expected output of many NBS tests.  Modules included
    semantic_checks, scanner2, symbol_table, and globals.
  Fix typo in grammar.txt file.

2016 June 22
  Add MAX_VARNAME_LEN definition to globals.h, update symbol_table.c to use
    it.
  Improve comments and reduce buffer size in fold_numeric_node() in optimizer.c
    file.
  Improve comments, use MAX_VARNAME_LEN, and move an error to emsg[] array for
    registers.c module.
  Make clang quit whining about 'asm volatile' and 'noclone' with Makefile
    tweaks.
  Remove incomplete array variable register lock-in code.

2016 June 23
  Add allocate_stack(), deallocate_stack(), store_float_to_stackslot(), and
    load_float_from_stackslot() to codegen module.
  More cleanups and comment improvements for asmgen and registers modules.

2016 June 24
  Removed an unreachable ICE() in scanner2.c
  Remove bogus breaks after ICE() in ast.c  and asmgen.c (ICE does not return).
  In asmgen.c, emit_string_expression() always returns true or ICE()s, so change
    it to a void function.
  Remove entire broken reggie_nuemric_expression register allocator.  While
    documenting this code I found several issues, and realized it was complex,
    fragile, and ultimately the compiler is better off without it.
  Remove unused doforinc_one() function from codegen module.
  Ran cppcheck, and made many small cleanups to address problems it found in the
    asmgen.c, ast.c, globals.c, parseinput.c, parser2.c, robert1.c, scanner2.c,
    semantic_checks.c, and tree.c files.
  Improved comments in globals module.

2016 June 26
  Improved comments in symbol_table module.

2016 June 27
  Began implementing value-number DAG.
  Also updated optimizer module to have a self-test, and updated the Makefile to
    build the optimizer self-test.
  Updated new self-test tree to have a common sub-expression so the DAG makes a
    visible difference.

2016 June 30
  Add mytrim() function to globals module.
  Fix bug in fold_numeric_expression() where T_INTEGER nodes were not correctly
    handled.  Those have never been generated by the compiler, but they might be
    in the future.
  Make optimizer module self-test test constant folding.
  Add optimizer unit test to build.
  Add new raw_registers module with simpler register allocation/deallocation for
    use by DAG expression evaulation code.

2016 July 1
  Add raw_registers unit test to build.
  Add dag module to convert an AST into a DAG for arithmetic expression
    evaluation.
  Rename init_xmmregs() to init_floatregs(), dump_xmmregs() to dump_floatregs()
    in raw_registers module to avoid conflict with registers module.
  Fix bug in init_floatregs() where floatregs_stack_tos was not reset in
    raw_registers module.
  Fix problems in asmgen and codegen modules by making dosqr() and doint() have
    correct signatures.  doint() requires register xmm0, so it should have have
    a register paramter.  dosqr() can work on any float register, so it should
    have a register name and not a number.
  Teach raw_registers module to never use xmm0 since it is reserved for function
    calls to built-in-functions.
  Fix child deletion in fold_numeric_node().
  Improve comments in assembly emitted by codegen module.
  Document xpow() register requirements in shibata module.
  Save/restore xmm1 in drand() in jenkins module.
  Fix bug in dosqr() where error message did not show the parameter if the
    register argument to dossqr was not xmm0.
  Make binary_power() macro properly save/restore FPU state.
  Now that dofppow() [binary_power macro] saves the FPU state we do not need to
    spill/fill around dofppow(), so update asmgen module to know this.

2016 July 2
  Add missing columns to first self-test expected dagger dump table in dag
    module.
  Add test of folding an unfoldable expression to self-tests in optimizer
    module.
  Update to allow multiple different numeric expression functions in the future
    (for when the DAG code generator code is ready)
  Update Makefile to remove parser2.o from optimizer self-test link since it is
    not needed.

2016 July 3
  Add new test P361 to verify  ^ is done before unary - for -2^2
  Fix silly typographical error in command-line help text in main.c file.
  Add new test P362 to verify multiple consecutive unary - operators gives the
    correct error message.
  ECMA-55.TXT had tabs, but the width of a tab depends on your text editor, so
    replaced the tabs with spaces so it always should look the same (assuming
    you use a fixed-width font).  This makes the file slightly larger, but more
    portable.
  Fix scanner so T_INTEGER and T_REAL are always unsigned, since that is
    required
  for a 'numeric-rep' in the ECMA-55 standard.  Remove now unneeded custom code
    to split sign from value for some cases.
  Mark tests P026 and P038 in NBS suite as Passing, not test case errors.
  Update README with information about current testing machines.
  Update several HAM tests to include the required parenthesis for unary
    operators now that the compiler is fixed.
  Plug a particularly ugly memory leak in parser2.c that only now occurs (the
    code was not triggered before the recent unary operator changes) that would
    lose a token if the input had multiple consecutive operators (like --) in
    the input.
  This was hard to track down and actually required both GDB and MJOLNIR
    together to finally find the root cause.
  Improve error messages in parser module.
  Another round of updating expected output for tests to reflect the change in
    the error message.
  Remove call to clear_token_stream() in main.c since that is already called by
    the parseit() even on a bad parse and thus the second call to clear the
    token stream is redunant.

2016 July 4
  Update copyrights, NEWS, ChangeLog, in preparate for new release.
  Update grammar.txt to include a detailed explanation of the unary operator
    weirdness fixed yesterday.
  Update mathnotes.txt to include a section documenting how to use
    fxsave64/fxrstor64 since there are no exmaples ANYWHERE on the internet
    that I could find.

2016 July 5
  Some header files failed to include the types they use; fix that.
  Fix Makefile link statements.
  Add fpu module to save/restore FPU state.
  Convert doint() and dornd() to take a regname argument.
  Update comments to match the code.
  ICE() on attempt to push_xmmreg() and deallocate_register() an unallocated
    register and add some debugging instrumentation.

2016 July 6
  Implement case for T_INT, T_EXP for generate_dagger().
  Teach DAG creator not to merge RND nodes.
  Add new DAG walking code generation and use it for -O2.

2016 July 7
  Dump pointer values in dump_tree_node().
  Fix test P362.BAS.
  Teach constant folder to convert 0+anything and anything+0 to just anything.
  Add test P363.BAS.
  Simply folder handling of 0+? by just swapping it to ?+0.
  Teach constant folder to convert 0-anything to -(anything) and anything-0 to
    anything.
  Add test P364 for 0-? and ?-0.
  Add stub for dag simplification, and add new test for dag simplification.

2016 July 9
  Ensure all fields are initialized in fold_numeric_node() when it overwrites
    existing node data.
  Teach constant folder to convert 1*anything and anything*1 to just anything.
  Add test P365 for 1*? -> ? and ?*1 -> ?.
  Fix wrong subscripts in cut & paste errors in fold_numeric_node().

2016 July 11
  Add support for -O3.
  Refactor constant folder and add some perhaps unsafe transformations for -O3.
  Require -X if -O3 is specified, since some -O3 transformations can violate
    strict standards conformance when NaNs are involved or arithmetic exceptions
    would occur.
  Add optimizations for level 3 optimization ?/1, ?^0, ?^1.
  Teach fold_power the 1^? special case for level 3 optimization.
  Use Full, verbose '.section' clause for .data section in gay module.
  Make register pointers const for freg_to_freg().
  Push fpu state save/restore down to xtan_u1, xsin_u1, xcos_u1, xatan_u1.
  Move COS() bad argument error display so there is only one copy.

2016 July 12
  Move SIN(), TAN(), SQR() bad argument error display so there is only one copy.

2016 July 13
  Make MJOLNIR memory routines print messages directly to stderr.

2016 July 14
  Convert dag_delete_all to work on the actual DAG and not from the array used
    to build the DAG.
  Add comments to emitted code for built-in numeric functions that document the
    registers used.
  Improve comments emitted for macros and calls to built-in numeric functions.
  0<=RND<1, so nearest integer might be 0 or 1, so correct tests to work either
    way.
  Fix dornd() to really return 32 bit floats for 32 bit mode.
  Fix expected output for programs using RND in 32 bit mode.
  Improve emitted comments for drand and realinit.
  Fix preservation of xmm1 in drand.
  Fix dornd so it returns 32 bit values in 32 bit mode, and remove unnecessary
    fpu state save/restore.
  Embed optimization level and option information about -4 and -A in generated
    assembly code comments at start of generated output.
  Fix 32 bit expected output for programs that use RND.
  Now that xatan_u1 has full FPU state save/restore, remove its old MXCSR
    save/restore code.
  Fix one place where vxorpd was not used when it could be in prologue.

2016 July 15
  Add fpu state save/restore to xlog_u1.
  Remove fpu state save/restore from dolog(), move LOG() error message
    out-of-line.
  Note LOG() also has FPU state save/restore internal now.

2016 July 16
  Push FPU state save/restore down into EXP() implementation.
  Fix bug where the valgrind compile test was not using 32 bit mode when BIT64
    was zero.
  INT() does not need a complete state save, so remove it and just save xmm0
    when necessary.
  Remove unused functions from fpu module.
  Add some missing calls to init_floatregs() in asmgen module.
  Add code to record highest register ever allocated program-wide.
  Files were changed this year too.
  Now that we have full FPU state save/restore,remove unneded MXCSR clearing in
    xexp().
  Remove fpu module; have doudf() do state save/restore inline.
  Move T_LINE and T_PROGRAM into token_names[] so they are printable.
  Improve create_tree_node() and create_tree_node2() initilization of
    numeric_value,
  parent_count, parent_count2, leftchild_height, and rightchild_height fields.
  Improve dump_tree_node() to show numeric_value, parent_count, parent_count2,
  leftchild_height, and rightchild_height fields.
  Move FLOAT_BUFFER_LEN macro to globals.h.
  Fix ast self-test bugs with line number display.

2016 July 17
  Relative line number goes in GOTO/GOSUB node, BASIC line numbers are unchanged
    in INTEGER nodes.
  Use dgstrtod() not libc version in tree module.
  Use correct infinity values and checks for 32 bit mode when in 32 bit mode.
  Add missing -s switch for 32 bit reformatted code generation in run_tests.
  Fix stale dependancies in Makefile.
  Remove unused xmm_spillall() and xmm_fillall() and stale prototypes in
    registers module.
  We no longer spill/fill, so remove checking for balanced usage and aging.
  Add new bottom-up tree expression code emitter and use it for -O1.

2016 July 18
  Lots of cleanups, remove reload_register() calls.
  Remove 'daddy' concept from registers module, update asmgen for those changes.
  Merge pop_xmmreg() and allocate_fp_register(), rename push_xmmreg() to
    deallocate_fp_register().

2016 July 19
  Merge register_count.h into raw_registers.c file.
  Remove old registers module.
  Move load_realval(), load_realvariable(), and load_realarrayvariable() from
    registers module to asmgen module where they should be.

2016 July 20
  Fix bug in dag_delete_all() logic.
  Add folding and algebraic transformations to DAG for -O3 with -X.
  Fix test P244.
  Do not fold division by zero ever.

2016 July 21
  Add test P366 for DAG folding.
  Improve comments for DAG folding routines.
  Add better comments to expression code and also change the functions to
    procedures since any real error always results in an ICE() that does
    not return anyway.
  Use a more standard, easer-to-read formatting style in asmgen module.
  Comment out some assignments that were not necessary, finally shutting
    up the lst 4 complains from scan-build.

2016 July 22
  Use a more standard, easer-to-read formatting style in ast, optimizer,
    tree, raw_registers, and symbol_table modules.

2016 July 23
  Do not declare loop index variables within for loops.
  Use a more standard, easer-to-read formatting style in scanner2,
    semantic_checks, and parser2 modules.  Also in parseinput,
    peephole, zonermore, and dtoa5_normal.c g_fmt_BASIC_normal.c code.

2016 July 24
  Use a more standard, easer-to-read formatting style in globals and
    codegen modules.

2016 July 25
  Continue quest to use a more standard, easer-to-read formatting style
    in many C source code files.
  Move peephole logic into a function and integrate it into the main
    program.

2016 July 26
  Update documentation to reflect removal of stand-alone peephole optimizer.
  Continue style cleanups.
  Move more error messages to emsg[] array.

2016 July 27
  Fix bug in parser g_relational_primary() where when we rewind the input,
    the current column position was not rewound in parallel.
  Update test harness to test using '-X -O3' flags when possible.
  Add -r information to usage()

2016 July 28
  Update version number to 2.18.
  Remove unused code for dofpspill()/dofpfill() routines.
  Create unary_minus macro and use it so all fp math uses macros and reading
    the code is easier.

2016 July 29
  Update codegen module to follow the style rule where function arguments must
    be space separated.

2016 July 30
  Use const in doudf() and reg_to_reg() arguments when it makes sense.
  Continue adding missing comments for function parmaeters in codegen module.
  Finish commenting every parameter for every subroutine in codegen module.

2016 July 31
  Continue improving comments and formatting of source code.

2016 August 2
  Update datum.dot to reflect current reality where +/- return T_ADD and
    T_SUBTRACT and are not merged into constants by the scanner.

2016 September 5
  Add _DEFAULT_SOURCE to shut up compiler warning.
  Undefine strdup macro if it is defined before redefining it.
  Use ULL suffix for unsigned long long constants.
  Enable  -fstack-protector-strong for gcc and clang builds.
  Fix typo in Makefile error message.

2016 September 6
  Add support for LTO variable in Makefile.
  Change Makefile to not attempt to build robert with pcc since the pcc
    preprocessor is broken and cannot compile that file.

2016 September 20
  Change style in dag.c to use more intentional fallthroughs in the code,
    with the necessary comments to make it clear they are intentional.
  In dag.c, set leftchild_height and rightchild_height to zero if children[]
    is removed.
  Teach main.c not to attempt to run the peephole scanner when -P (pretty
    print) has been selected.
  Update dump_tree_node() in tree.c so it does not attempt to access the token
    node fields if the token node pointer is NULL.
  Add some fflush() calls to generate_assembly() in asmgen.c so that if the
    compiler does crash, it doesn't have partial output of the prologue or
    epilogue.

2016 September 21
  Fix typos in dag.c's self-test code.
  In dag.c, set child heights to zero in dag_fold_subtract() for ?-? and in
    dag_fold_divide() for ?/? synthetic replacement nodes.
  Add a more complex ?-? testcase to the self-tests in the dag.c file.
  Fix a failure to deallocate memory in the self-test code of the dag.c file.
  Fix one childheight problem in dag_fold_subtract() dag.c routine.
  Fix one childheight problem in dag_fold_add() dag.c routine.
  Fix two childheight problems in dag_fold_multiply() dag.c routine.
  Simplify dag_fold_multiply()'s ?*0 case in dag.c file.
  Do not attempt to print the children[] pointer in tree.c's dump_treee_node()
    if it is NULL.
  Make dag.c's generate_dagger() check that T_SUBTRACT is either OP_SUBTRACT or
    OP_UMINUS and abort() on anything else.
  Correctly set oid in ?*0 case in dag.c's dag_fold_multiply().

2016 September 23
  Copy ps field with lno and cno in dag.c's build_dag().
  Fix formatting of dump_tree_node_string2() parameter in dag.c file.
  Set pos field in self-test nodes in dag.c file.

2016 September 24
  Fix ugly shallow copy bugs for tokens in special cases that were ?-0, ?+0,
    ?*0, ?*1, ?/1 and ?^1 in various folding routines in the dag.c file.
  Add a new more difficult self-test to dag.c file: "C*(C-C)-(C-C)".
  Fix epxected tree heights on self-tests in dag.c file.
  Remove bogus optimization level changes in dag.c file self-test code:
    "C*(C-C+2-(1+1))-(C-C+2-(1+1))".
  Always set oid field in self-test tree nodes in dag.c file.
  Remove bogus mytrim() calls that were preventing constant merging in dag.c,
    optimizer.c, and parseinput.c files.
  Remove now unused mytrim() global function from globals.[ch] files.
  Remove a stry debug print line that was left in by mistake in the dag.c
    self-test code.

2016 September 25
  Properly set numeric_value field in dag.c's self-test nodes with numeric
    constant values.
  Make dag folding routines promote integers to reals.
  Change one dag.c self-test to use T_INTEGER to test the new promotion code.
  Fix some embarassing cut & paste typos in RHS integer->float promotion in
    dag.c's dag_fold_....() routines.
  Move integer->float promotion code to promote_int2fp() and use that instead
    of inlining the logic five times.
  Make dag.c's main() understand the -v option and obey it for self-tests; if
    dag is run with no options, verbose is false, but if run with -v then
    verbose is true.
  Add more self-tests to dag.c file.

2016 September 26
  Finally fixed the 'DAG of DOOM' bug for the expression:
    "D*(C-C+2-(1+1))-(C-C+2-(1+1))+(C+C)*2+(A-(-B)*2+1)*(C+C)"
    I was able to reduce the problem with "0-0+(1+C)" and then with the gcc
    address sanitizer I was able to see that the issue was that the memory
    handling when promoting the LHS of a ?+0 (and similar cases for ?*0, ?^1,
    etc.) was not getting the handling of the children[] array right and wound
    up causing the program to access free()'d memory.  This together with the
    shallow copy bugs fixed n September 24 took me two weeks to track down and
    fix.  The gcc address sanitizer finally let me find out what was happening
    where, and with that the solution became painfully obvious.  Not one of my
    finer moments....
  Added a new test P367 to the test suite contianing the original 'DAG of DOOM'
    expression.
  Use '_' instead of '-' for unary minus in dump_tree_node_string2() in dag.c
    so that it is possible to differentiate unary and binary minus in verbose
    mode postfix dumps of the expression trees.
  Add missing debug output for the "g_letstmt -> T_LET g_letstmt_tail"
    production to g_letstmt() in parser2.c file.

2016 September 27
  Fix a potential NULL pointer dereference in tree.c's dump_tree_node() that
    was found by clang's scan-build.

2016 September 28
  When using -P option to emca55, do not emit a skipping peephole message.
  Ensure tree.c's tree_delete_all() does not access fields inside of the
    leaftoken if leaftoken is NULL; abort() instead.
  If global.[ch]'s MJOLNIR's myshowleakdata() detects a leak, abort() This is
    only used with COMPILE_MODE=DEBUG3, which must be selected by hand and
    intercepts the system memory allocation and deallocation routines.  If a
    leak was detected, force a coredump so that post-mortem debugging can
    actually see what was in the memory that was leaked in order to try and
    track the bug down.
  Add some debug tracing to ast.c's regenerate_expression() that is activated
    when the verbose global flag is true.
  Mark test P367.BAS as passing.
  Rewrite ast.c's regenerate_expression() parenthesis generaiton logic for
    unary minus.
  Add new test P368 to excercise unary minus parenthesis regeneration logic.
  Convert _Noreturn to noreturn and include stdnoreturn.h so that cppcheck-1.75
    will know that ICE() and FATAL() do not return.
  Adjust globals.h include of stdnoreturn.h to avoid including it for tcc and
    pcc since they do not have that header file.  Instead, in those two cases,
    add a macro define that replaces noreturn with _Noreturn (which is all that
    stdnoreturn.h does anyway).
  Mark test P368 as passing.

2016 September 29
  Update README with current mercurial website URL, and update the notes on how
    to build the compiler and finally the information about what software
    versions were used for development and testing of ecma55.
  Update NEWS for recent bugfixes.
  Update ADDBENCH.BAS to include the 'DAG of DOOM', and regenerate benchmarking
    data for the README file.

2016 October 2
  Update ChangeLog file with changes between August 3 and October 2 2016.
  Add missing BASICCW information to README.

2016 October 3
  Update version number to 2.19 in globals.c file.
  Create mercurial tag v2.19 for version 2.19 of ecma55.

2016 October 10
  Update Makefile to remove workarounds for broken pcc preprocessor now that
    upstream has fixed the problem.
  Update README to specify exactly what snapshot pair is required for pcc
    support.
  Update NEWS to note the Makefile change.
  Fix cno and pos values for 'ugly torture test 3' in dag.c self-tests.
  Update README to sepecify that new cppcheck-1.76 version was used.
  Fix cno and pos values for 'ugly torture test 2' in dag.c self-tests.

2016 October 11
  Update exists_in_dagger() in dag.c to try switch operands for + and *
    (commutative).
  Add new test in dag.c for (A+B)-(B+A) which should be zero.
  Add test P369.BAS for testing commutative arithmetic transformation behavior.

2016 October 12
  Unify like cases in switch statement in generate_dagger() in dag.c file.
  Unify the two loops in exists_in_dagger() in dag.c file.
  Fix more cno and pos values in dag.c self-test hand-made trees.

2016 October 15
  Update README to note I now use cppcheck version 1.76.1.
  Update ecma55.1 to note in the -X section that -X must be specified whenever
    optimization level 3 or higher is used.

2016 October 21
  Fix bug in main.c argument processing where extra arguments were ignored.
  Now the code ensures that exactly 1 file name is specified as a command-line
    argument.

2016 November 9
  Update Makefile to handle wierd Ubuntu 16.10 gcc-6.2.0 by force disabling
    PIE code.  Update README to note this change.
  Update README to explain how to use link-time-optimization with gcc/gold.
  Teach run_tests, run_tests2, and run_tests3 to accept PIE executables.
  Update Makefile some more handle PIE and LTO better; now for gcc it will
    try to determine whether gcc defaults to PIE or not and adjust the
    build to suit the gcc default.  This can be overridden with PIE=0 to
    disable and PIE=1 to enable position independent executable generation.
  Ubuntu 16.10 clang whines about duplicate string literals if built with
    LTO and address sanitizer, so add detect_odr_violations=0 to the
    ASAN_OPTIONS for clang.
  Update show_version() in main.c to display compiler and platform
    information, and to warn that generated programs require the
  AND64 Linux platform when running if the compiler itself was not built
    for an AMD64 Linux platform.
  Use gold linker when using either gcc or clang.

2016 November 11
  Add '-z relro -z now' options to link in BASICC/BASICCS/BASICCW scripts.
  Update Makefile so that LDFLAGS includes -fstack-protector-strong so SSP
    actually works.
  Update Makefile to add -D_FORTIFY_SOURCE=2 to CPPFLAGS.
  Update Makefile to correctly use -fPIE, not -fPIC which is for shared
    libraries.
  Update Makefile so that LTO is now a switch set to 0 or 1.  If 0, LTO is
    not used.  If 1, LTO is used.  Defaults to 0.
  Update Makefile to support generating PIE executables with clang.
  Update Makefile to add noexecstack, defs, relro, and now options to link
    to help make the generated programs meet modern standards.
  Update Makefile to use -Bsymbolic-functions linker option when LTO=1 to
    help make the generated programs meet modern standards.
  Update NEWS and README to reflect recent changes.

2016 November 12
  Update run_tests, run_tests2, and run_tests3 so they work with musl; musl
    requires all non-option arguments to come after all option arguments.
  Update run_tests, run_tests2, and run_tests3 so they use ${ECMA55} instead
    of ./ecma55 directly.
  Update Makefile so that if an unsupported compiler is used,
    check_with_valgrind is not attempted when doing a canrelease test.
  Document how to build using musl-libc.

2016 November 14
  It turns out using -D_FORTIFY_SOURCE=2 requires compiling with optimization
    enabled.  I got a warning with vanilla gcc, but the custom hacked Ubuntu
    said nothing so I did not know until I tested on my home system.  I
    considered using -Og for gcc instead of -O0, but decided to just use
    -D_FORTIFY_SOURCE=2 when using -O3 instead.  The Makefile was updated for
    both gcc and clang since they both have the same needs.

2016 December 3
  Fix typo in ecma55.1 man page.

2016 December 19
  Fix error in Makefile where zonermore.c compile erroneously specified
    LDFLAGS.
  Use linker directly to include COPYING verbatim instead of including it in
    the main.c module.

2016 December 20
  Add a test in the makefile to verify -L option to ecma55 works, just in case
    it compiles and links but somehow fails.
  Update shibata.c write_SIN() to use SLEEF 1.110 SSE code.  This is done by
    using the linker to include the assembly verbatim instead of using a monster
    printf statement.

2016 December 23
  Update shibata.c write_COS() to use SLEEF 1.110 SSE code via linker.
  Update shibata.c write_TAN() to use SLEEF 1.110 SSE code via linker.
  Update shibata.c write_ATN() to use SLEEF 1.110 SSE code via linker.

2016 December 24
  Update shibata.c write_LOG() to use SLEEF 1.110 SSE code via linker.
  Update shibata.c write_EXP() to use SLEEF 1.110 SSE code via linker.
  Update shibata.c write_POW() to use SLEEF 1.110 SSE code via linker.

2016 December 27
  Update shibata.c write_SIN() to use SLEEF 1.110 AVX code.
  Update shibata.c write_COS() to use SLEEF 1.110 AVX code.
  Update shibata.c write_TAN() to use SLEEF 1.110 AVX code.
  Update shibata.c write_ATN() to use SLEEF 1.110 AVX code.
  Update shibata.c write_LOG() to use SLEEF 1.110 AVX code.
  Update shibata.c write_EXP() to use SLEEF 1.110 AVX code.
  Update shibata.c write_POW() to use SLEEF 1.110 AVX code.
  Update all references to SLEEF to use current URL:
    https://github.com/shibatch/sleef
  Remove old sleef-2.80 archive, add new sleef-2.110 archive.
  Add notes about how SLEEF assembly routines were created.
  Update NEWS to note SLEEF upgrade.

2016 December 31
  Add comments about code origin to SLEEF .s files.
  Fix some typos in NEWS and README.
  Add benchmark files referenced in README to repository.
  Fix instructions on using musl-libc in README.
  Move assembly code in jenkins.c to isaac64.s and link that directly.
  Move memcpy assembly code to gay.c since it is only used by those routines.

2017 January 1
  Update copyrights for new year.

2017 January 2
  Add test P370 to test number INPUT/OUTPUT and conversion.
  Move memcpy runtime assembly to memcpy.s and link that directly.
  Move David M. Gay's routines to dmgay.s and link that directly.  As part of
    this change, remove the avx version since it offered no measurable speedup
    but increased complexity and the mainentance burden.
  Update version number to 2.20.

2017 January 5
  The compare_line_numbers() function in semantic_checks.c worked, but after
    enabling clang's -fsanitize=integer I learned that it depended on undefined
    behavior - this is now fixed.
  Fix a few spots in dtoa5_normal.c with more casts to deal with expressions
    that clang's -fsanitize=integer claimed were possibly undefined.
  Fix two places in semantic_checks.c where clang's -fsanitize=integer claimed
    expressions were possibly undefined.
  When valgrind in run_tests, run_tests2, or run_tests3 says there was a
    memory leak, run it again to show the details.
  Enable -fsanitize=integer for clang in Makefile when building with the other
    sanitizers.

2017 January 6
  Update year of copyright notice printed for -V option.
  Update NEWS file with recent changes.
  Update test P358.BAS to call SIN() and use a constant with scientific
    notation, and correct the value of the PI constant.
  Align comments in runtime library assembly.

2017 February 25
  Convert NULL pointer checks to use more natural C idiom.

2107 March 10
  Registers in asm() constraints should not have a percent sign.
  Use 0.0 instead of 0 when a double type zero is used in a comparison in
    optimizer.c file.
  Convert NULL pointer checks to use more natural C idiom in main.c file.
  Convert empty string checks to use a more natural C idiom.
  After the fix on asm() constraints, tcc works, but pcc fails.  Adjust the
    Makefile for this.

2017 March 11
  Another round of updating conversion of pointer checks and empty string
    checks to use a more natural C idiom.

2017 March 12
  The pcc compiler, when compiled with gcc and -O0, has bad code generation.
    If compiled with -Og, -O1, -O2, or -O3 it works fine.  So this is a problem
    with gcc and -O0, not pcc.  I have updated the Makefile to go ahead and
    compile zonermore and parseinput with pcc now.

2017 March 18
  Add '-m elf_x86_64' to $(LD) invocations in the Makefile, since while GNU ld.bfd
    and ld.gold work fine without it, ld.lld (from 4.0.0 which finally understands
    '-b binary') needs it and ld.bfd and ld.gold will accept it and work fine.
  Removed unused dtoa5.s file.
  Make gcc builds always use gold linker.
  Make clang builds always use lld linker.

2017 March 19
  Fix tab problems in Makefile.
  Use better rules in Makefile when converting text files to object files.
  Move tab runtime assembly to tab.s and link that directly.
  Use gold linker for gcc.

2017 March 21
  Create four separate Makefile versions, one each for gcc, clang, pcc, and tcc.

2017 March 22
  Remove pragma comment from parser2.c
  Add fp configuration code to main.c, but leave it commented out since no FOSS
    compiler implements the pragma, and thus the routines cannot be expected to
    work, despite __STDC_IEC_559__ being defined and set to 1.

2017 March 23
  Split makefile into 4 makefiles, one for each compiler.
  Disabled PIE+LTO+LLVM/clang combination since it won't link.

2017 March 27
  Fix comments that claimed the program would abort when it does not for tab
    and flushoutputln runtime library assembly routines.
  The pcc snapshot from 20170327 fixes the asm bug, so update Makefile.pcc to
    go ahead and use pcc for parseinput and zonermore.
  Update memcpy.s to use the obvious 'rep movsb' sequence since that is easier
    to read and works fine with unaligned strings.
  Move runtime library assembly routines (initbuffer, outputbuffer,
    flushoutputln, appendbuffer, nextzone) to buffer.s and link that directly.

2017 March 29
  Improve comments, avoid creating unused temp variable in tab.s file.
  Update parseinput to have assembler compute MAX_STRINGS_BYTES*2 instead of
    doing it in codegen.c file.
  Move runtime library assembly routines (drain_stin, INPUT, mytrim,
    parseinput, doinput) to doinput.s and link that directly.

2017 March 30
  Move runtime library assembly routine mystrcmp to mystrcmp.s and link that
    directly.
  Move runtime library assembly routine mystrcpy to mystrcpy.s and link that
    directly.

2017 March 31
  Move runtime library assembly routine mystrlen to mystrlen.s and link that
    directly.
  Replace runtime library assembly routine mystrlen with a better version.
  Move runtime library assembly routine myitoa to myitoa.s and link that
    directly.
  Replace runtime library aseembly routine mystrcpy with a better version.

2017 April  1
  Move runtime library assembly routines myisnan and myisinf to myisnan.s
    and myisinf.s and link those directly.
  Move runtime library assembly routine isterminal to isterminal.s and link
    that directly.
  Improve runtime library assembly routine initbuffer in buffer.s file.

2017 April 6
  Clang 3.9 is the version that ships with Ubuntu 16.10, and it supports using
    the gold linker.  Since the lld linker in 4.0 version for Ubuntu 16.10
    that is available on llvm.org only supports lld, and that version of lld
    fails with PIE+LTO, revert the changes to the Makefile that tried to
    support that not-ready-for-prime-time lld version.  While clang/LLVM 4.0
    can compile ecma55, the lld 4.0 linker cannot link it, so Makefile.clang
    need to specify the gold linker which can.  No (known) version of
    clang/LLVM 4.0 with support for gold is available for Ubuntu 16.10 at
    this time, so if you want to test with clang/LLVM 4.0 on Ubuntu 16.10,
    you must build and install your own private version of clang/LLVM 4.0
    yourself and include support for gold.  Most users won't do that, so
    at this time there is no 'official' support for clang/LLVM 4.0.  We can
    only hope the next version of lld fixes the bugs that prevent large
    mode programs with PIE and LTO from linking.
  Update documentation to match current reality.
  Update version number to 2.21.

2017 May 25
  Use consistent style and parenthesize ((!passed) && ... in symbol_table.c
    file.
  Document how to build a static version of the compiler with musl-libc in
    README file.

2017 May 29
  Document clobbered registers in mystrlen, drain_stdin
  Better comments for mystrlen.s and mystrcpy.s

2017 May 30
  Update mystrcmp.s to use byte moves and add better comments
  Update memcpy.s to have better comments
  Update myisinf.s to be branchless and have comments
  Rewrite myisnan.s to be more efficient and add comments

2017 May 31
  Update myisinf.s to use btrq to clear sign bit, use sete instead of cmoveq
  Update myisnan.s to use btrq to clear sign bit
  Add comments to initbuffer, outputbuffer, and flushoutputln in buffer.s file

2017 June 2
  Add comments to nextzone in buffer.s, improve the code a bit too.

2017 June 5
  Add comments to appendbuffer in buffer.s, improve the code a bit too.
  Since isterminal has no local variables, remove stack frame code.
  Add comments to isterminal is isternminal.s

2017 June 6
  Add self-test code to myitoa.s file
  Fix horrible bug in myitoa where string was defined as a quad and thus
    conversion of -9223372036854775808 never worked.
  Fix other horrible bug in myitoa where local variable offset was wrong.

2017 June 7
  Improve comments for tab and mystrlen runtime assembly language functions.

2017 June 14
  Do not allocate two buffers for the input source file, just use one.
  Make ./ecma55 -V output information about detected POSIX compliance.
  Correct variable types in load_file_into_buffer() function.

2017 June 15
  Add MIN.BAS and MAX.BAS examples to CSCLASSICS collection.
  Add test P371 which is an intense DAG torture test
    makes the compiler coredump when using '-O3 -X' options.

2017 June 16
  Add a realistic tree self-test example to tree.c self-test code.
  Add a tortue DAG test self-test example to dag.c self-test code.
  Update run_tests, run_tests2, and run_tests3 to accept a valgrind that
    has been compiled in PIE mode.
  Fix bug in dag_delete_all() in dag.c where children were deleted before
    checking if the node would be deleted or not.  This, in turn, fixes
    test P371.
  Mark test P371 as passing now that dag_delete_all() has been fixed.

2017 June 17
  Make test P371 more thorough by adding a second test expression.
  Update main.c not to show number of leaked bytes according to GLIBC
    unless verbose has been specified, since GLIBC's results are only
    approximate (false positive for lost bytes).
  Fix bug in '-R' option where '-P' should be implied but wasn't.

2017 June 18
  Fix ecma55.1 man page so it states -R implies -P.
  Update version number to 2.22.

2017 June 19
  Update book appendix about bas55 to reflect current version.
  Update book appendix about ecma55 to reflect current version.
  Improve book indexing.

2017 June 20
  Update version of pcc used for testing in README.

2017 June 22
  Tag version 2.22

2017 June 27
  Fix typo 'strings' instead of 'strict' in '-h' output text.

2017 June 28
  Add self-test code to asmgen module, update Makefiles to build it.
  Add comments to shut gcc-7.x up when we fall through a switch case.

2017 June 29
  Proper pedantic casting for optimization_level constants.
  Add another case to asmgen self-tests.

2017 July 1
  Update unary_minus macro to rax for scratch register to avoid the
    need to push/pop r15.  Also fix btc to have proper q or l suffix.
  Fix stack imbalance bug in ON..GOTO code error path.
  Replace unary_minus macro with simpler, more straight-forward
    implementation.

2017 July 2
  Update Makefiles to run asmgen self-test.

2017 July 4
  Make logic in asmgen clearer by using symbolic names instead of just
    0 and 1 for the left and right children.

2017 July 5
  Make dump_tree_node_string() show '_' for unary minus to distinguish
    it from '-' used for subtraction.
  Improve debug output in exists_in_dagger() to show '_' for unary minus
    to distinguish it from '-' used for subtraction.
  The g_integer() function in the parser2 module was converting T_INTEGER
    values to real, but failing to update the type to T_REAL; fix that.
  Only call fold_numeric_expression() in emit_numeric_expression() for
    trees; DAGs do their own folding.

2017 July 6
  Add another test case to asmgen module.
  Make dag_binop() smarter about register usage for commutative operators.

2017 July 13
  Change .type statements to use '@object' instead of '%object', since
    '@object' is more standard.

2017 July 13
  Update README file software version data to match versions currently used.

2017 July 14
  Ensure floating point literal constants in .rodata are aligned on 8 byte
    boundaries.

2017 July 19
  Remove EM64T from '-V' output since Intel has used INTEL64 since 2006.
  Update NEWS file.
  Update version to 2.23.
  Update book's example version to 2.23.

2017 July 21
  Add LL_INSERT() macro to parser2.c to simplify g_printstmt() function.
  Split parts of semantic_checks() into separate functions forchecks1(),
    forchecks2(), forchecks3(), and bifcheck() in semantic_checks.c file.
  Split sc_print() out from semantic_checks() in semantic_checks.c file.
  Rename forchecks1() to sc_addlines().
  Rename forchecks2() to sc_check_loopindex_scope().
  Rename forchecks3() to sc_verify_jump_targets().
  Rename bifcheck() to sc_bifcheck().
  Split out bss_numeric(), bss_string(), ds_read_data(), and ds_literals()
    from generate_symbol_table() in sybmol_table.c file.

2017 July 22
  Move assembly macros for arithmetic operations from codegen.c to separate
    assembly files named binary_add32.s, binary_add64.s, binary_divide32.s,
    binary_divide64.s, binary_multiply32.s, binary_multiply64.s,
    binary_subtract32.s, binary_subtract64.s, unary_minus32.s, and
    unary_minus64.s .
  Change how assembly text files are handled.  Instead of having many individual
    .o files, one from each, created with the linker and then finally linked into
    the final executable, now all of those files are included in one special
    runtime_assembly.o object.  This greaty simplifies the build.  It also
    allows storing those text objects in the .rodata section instead of the
    .data section (so now they cannot be modified), and allows specifying the
    alignment as well.  The C code to include any routine is unchanged, only
    the build process was changed.
  Add suppressions for clang for robert1.c routines since they are supposed to
    have unsigned wrapping math (and they work) but the UBSAN whines about it.

2017 July 23
  Fix unsigned integer bug in dump_floatregs() in raw_registers.c that was
    found by clang -fsanitize=integer sanitizer.
  Update Makefile.clang to add UBSAN_OPTIONS=print_stacktrace=1 when using
    sanitizers to get backtraces.
  Remove redunant self-test invocations of raw_registers in Makefiles.
  Improve raw_registers self-test output.
  Move assembly macros for floatlit_to_floatreg, floatmem_to_floatreg, and
    floatreg_to_floatmem to separate text files.
  Split giant main() self-test in dag.c into smaller subroutines to clarify
    the logic.

2017 July 25
  Move array_1D_to_floatreg and floatreg_to_array_1D assembly language macros
    to array_1D_to_floatreg32.s, floatreg_to_array_1D32.s, array_1D_to_floatreg64.s,
    and floatreg_to_array_1D64.s, and update runtime_assembly.s, codegen.c,
    and the Makefiles to deal with that change.
  Do not check tree program for leaks twice.
  Update runtime_assembly.s to put assembly text into .rodata.str marked with
    string type, not just plain .rodata.
  Add .size lines to runtime_assembly.s to make linker actually realize the
    subroutine texts have non-zero size.
  Move array_2D_to_floatreg and floatreg_to_array_2D assembly language macros
    to array_2D_to_floatreg32.s, array_2D_to_floatreg64.s, floatreg_to_array_2D32.s,
    and floatreg_to_array_2D64.s, and update runtime_assembly.s, codegen.c,
    and the Makefiles to deal with that change.
  Move .Lsoperand_stack and .Lretaddr_stack to .bss segment where they should be.
  Move gosub and return assembly language macros to gosub_return.s and update
    runtime_assembly.s, codegen.c, and the Makefiles to deal with that change.
  Move binary_power assembly language macro to binary_power32.s and
    binary_power64.s, and update runtime_assembly.s, codegen.c, and the
    Makefiles to deal with that change.

2017 July 26
  Move .Ldividebyzero_msg definition into binary_divide64/32.s files.
  Move .Lbadpower_msg and .Lzero_to_negative_power_msg into binary_power64/32.s
    files.
  Move pushsaddr and popsaddr and related data to push_pop_saddr.s, and
    update runtime_assembly.s, codegen.c, and the Makefiles to deal with that
    change.
  Move .Lretaddr_stack_full .Lretaddr_stack_empty into gosub_return.s file.
  Move .Lbogus_write_subscript_msg into floatreg_to_array_1D64/32.s files.
  Move .Lstring_too_long_msg and .Lstring_too_long into push_pop_saddr.s file.
  Move .Lbadpower to binary_power64/32.s files.

2017 July 27
  Add MAX_SADDR_DEPTH parameter and use it instead of hardcoded number in
    push_pop_saddr.s file.
  Move beginfor and endfor macros and associated error messages to for_next32.s
    and for_next64.s files.
  Simplify push_pop_saddr.s error handling so it avoids a double-jump sequence.
  Simplify binary_power64/32.s files error handling to avoid double-jump
    sequence.
  Simplify gosub_return.s file error handling to avoid double-jump sequence.
  Move CPU feature checking code to havefeatures.s file.
  Move badlog error handler to badlog.s file.
  Move badsqrarg error handler to badsqrarg.s file.

2017 July 28
  Remove unused .LINBUFFER variable.
  Add timeout wrapper to program invocations in test suite so a program that
    hangs does not hang the entire test run.
  Split main() into several functions in symbol_table.c file self-test code.
  Do not try to merge un-mergable string .rodata.str sections.
  Split main() into several functions in scanner2.c file self-test code.
  Split main() into several functions in asmgen.c file self-test code, and
   add -h support with usage().
  Move some comments from C to assembly from codegen.c file.

2017 July 29
  Split out process_command_line_arguments() from main() to simplify code in
    main.c file.
  Move floor assembly language function into floor32/64.s files.
  Merge floor32.s and floor64.s files.
  Merge unary_minus32.s and unary_minus64.s files.
  Move badsinarg, badcosarg, badtanarg to .s files.
  Make drain_stdin, mytrim, parseinput, and doinput private symbols in
    doinput.s file.
  Use uniform write_ prefix for functions that emit text blobs in codegen.c
    file.
  Merge binary_add32.s and binary_add64.s
  Make tab assembly language function private
  Make isterminal and statbuf private in isterminal.s file.
  Merge binary_subtract32.s and binary_subtract64.s
  Merge binary_multiply32.s and binary_multiply64.s

2017 July 30
  Merge binary_divide32.s and binary_divide64.s
  Merge binary_power32.s and binary_power64.s
  Merge for_next32.s and for_next64.s
  Merge array_1D_to_floatreg32.s and array_1D_to_floatreg64.s
  Merge floatlit_to_floatreg32.s and floatlit_to_floatreg64.s
  Merge floatmem_to_floatreg32.s and floatmem_to_floatreg64.s
  Merge floatreg_to_floatmem32.s and floatreg_to_floatmem64.s
  Merge floatreg_to_array_1D32.s and floatreg_to_array_1D64.s
  Merge floatreg_to_array_2D32.s and floatreg_to_array_2D64.s
  Move .LTAB_msg definition into tab.s
  Create a tab macro and use it to simplify code generation.
  Move .LINT_msg and .Linttoobig_msg into floor.s
  Remove unused .Lnegative_sqrtf_msg and .Lnegative_sqrtf from codegen.c file.
  Move .LCOS_msg to badcosarg.s
  Move .LSIN_msg to badsinarg.s
  Move .LTAN_msg to badtanarg.s
  Move .Lbogus_read_subscript_msg to array_1D_to_floatreg.s
  Merge array_2D_to_floatreg32.s and array_2D_to_floatreg64.s
  Move .Lbogus_write_first_subscript_msg and .Lbogus_write_second_subscript_msg
    to floatreg_to_array_2D.s
  Create an exp_macro and use it to simplify code generation.
  Make myitoa function private
  Ensure jump tables are 8 byte aligned.
  Make initbuffer, outputbuffer, flushoutputln, appendbuffer, and nextzone from
    buffer.s private

2017 July 31
  Make mystrcmp, mystrcpy, and mystrlen private
  Move appendfloat assembly code to appendfloat.s file.
  Make appendfloat private
  Make appendvarname and appendevarname private
  Merge myisnan.s into binary_power.s since that is the only caller.
  Inline the myisnan code and remove myisnan altogether.
  Inline the myisinf code and remove myisinf altogether.
  Cleanups for .Liniit_bss
  Move exception_non_fatal to exception_non_fatal.s file.
  Create a log_macro and use it to simplify code generation.
  Remove unused .LERR_on_input and .LERR_on_input_msg
  Move .LEOF_on_input_msg to doinput.s, and inline the one call to
    .LEOF_on_input and remove it.

2017 August 1
  Create a read_nvar macro and use it to simplify code generation.
  Create a sqr_macro and use it to simplify code generation.
  Merge badsqrarg.s into new sqr_macro.s file and then remove the
    unneeded badsqrarg.s file.
  Improve sqr_macro.s so it has one combined macro.
  The need_READ is not specific enough, so replace it with more granular
    variables need_READSTMT, need_READSTMT_SVAR, need_READSTMT_NVAR,
    need_READSTMT_NAVAR_1D, and need_READSTMT_NAVAR_2D.
  Create a read_navar_1D macro and use it to simplify code generation.
  Add missing need_SGN flag.
  Create sgn_macro and use it to simplify code generation.
  Remove .Lout_of_data .Lbad_string_read .Lbad_number_read and inline
    that code instead to avoid double jumps.

2017 August 2
  Create push_svar macro and use it to simplify code generation.
  Convert functions that always return true to void in asmgen.c file.
  Update README with current software versions and document PIE
    vs. sanitizer issues.
  Use BITS32 and improve code emitted by dosin(), docos(), dotan(),
    and doatan() in codegen.c file.
  Remove some redundant comments in codegen.c file.

2017 August 3
  Create sin_macro and use it to simplify code generation.
  Create cos_macro and use it to simplify code generation.
  Create tan_macro and use it to simplify code generation.
  Fix benign errors in sin and cos invocation.  The xmm0 registers
    was being trashed, but since the compiler uses xmm0 as a
    scratch register, the bug didn't cause any visible errors.
  Fix stack alignment in exp_macro when saving/restoring xmm0.
  Create atan_macro and use it to simplify code generation.

2017 August 6
  Add missing need_ABS flag.
  Create abs_macro and use it to simplify code generation.
  Create rnd_macro and use it to simplify code generation.
  Move runtime assembly language source files to new AMD64 directory, and
    adjust build for that.
  Add a hexdump() routine to globals module.
  Add new static text loading module load_textmodule (but it is not used yet).
  Move struct ilist definition into header file
  Convert codegen modele to use new textdata system
  The shibabata module just loaded text blobs, so merge it into the codegen
    module.
  ***> NOTE: PIE=1 causes gcc-7.1.1 from SVN 20170805 to actually
    ICE, and for clang it generates a program that doesn't work.
  ***> NOTE: address sanitizers do not work for either gcc or clang

2017 August 7
  The gay module just loaded a text blob, so merge it into the codegen module.
  The jenkins module just loaded a text blob, so merge it into the codegen
    module.
  Replace last use of runtime_assembly for COPYING in main.c with the textdata
    system and remove runtime_assembly module.
  Add origin URLs to assembly files.
  Create calludf macro and use it to simplify code generation.
  Move goodxit and badxit asm fragments to good_bad_xit.s and use that
    to simplify code generation.

2017 August 8
  Now that comments are in each assembly file, remove the write_SLEEF_header()
    and write_SLEEF_footer() routines.
  Remove unused deallocate_stack() and allocate_stack() functions.
  Use macros instead of C if statements in store_float_to_stackslot() and
    load_float_from_stackslot().
  Convert C if logic to assembly in the doudf_header() and doudf_footer()
    routines.
  Create udf_footer macro and use it to simplify code generation.
  Create udf_header macro and use it to simplify code generation.

2017 August 9
  Move some prologue assembly definitions to definitions.s file.
  Reduce the number of printf() calls in codegen module, and convert static
    string output calls to puts().
  Refactor regenerate_expression() in the ast module by creating two helper
    functions: regenerate_unary_operator() and regenerate_binary_operator().
  Refactor semantic_checks() in the semantic_checks modules by creating
    a helper function: sc_read().
  Refactor regenerate_source() in ast module by creating a helper function:
    regenerate_print().
  Refactor regenerate_source() in ast module by creating a helper function:
    regenerate_data().
  Refactor regenerate_source() in ast module by creating a helper function:
    regenerate_read_or_input().
  Refactor regenerate_source() in ast module by creating a helper function:
    regenerate_dim().
  Refactor regenerate_source() in ast module by creating a helper function:
    regenerate_on_goto().
  Create LOADCHILD macro and use it to simplify process_numeric_node() in
    asmgen module.
  Refactor semantic_checks() in the semantic_checks module by creating
    a helper function: sc_def().

2017 August 10
  Refactor regenerate_binary_operator() in the ast module by creating a
    helper function: set_parent_precedence().
  Refactor dump_symbol_table() in the symbol_table module by creating a
    helper function: dump_symbol_table_read().

2017 August 11
  Style cleanups for symbol_table module: reduce number of fprintf() calls,
    use fputs() when possible.
  Add WRITE() macro and use it in parseinput.c file.
  Style cleanpus and reduce scope of loop indices in parseinput.c file.
  Remove all goto statements and associated labels from parseinput.c file.
  Replace 3 if statements with a swtich in parseinput.c file.
  Refactor doinput() in the parseinput.c file by createding a helper function:
    process_stack().
  Do not use hexadecimal constants unnecessarily in process_one_byte() in the
    scanner2 module.
  Refactor process_one_byte() in scanner2 module by creating 3 helper
    functions: process_one_byte_dump(), process_one_byte_reject(), and
    process_one_byte_move().
  Refactor parseinput() in parseinput.c by creating a healper function:
    parseinput_case18().
  Use puts() when possible in dag module.
  Style cleanups in dag module.

2017 August 12
  Use isupper(), isdigit(), and write get_var_index() to make symbol table
    code not depend on ASCII.  The self-tests for the symbol_table module
    still assume ASCII though.

2017 August 13
  Create read_navar_2D and use it to simplify code generation.

2017 August 14
  Create int_macro and use it to simplify code generation.
  Remove unfinshed command-line argument support.
  Move constant definitions from printf/puts in write_printzone() in codegen
    module to buffer.s assembly file.
  Add advance_to_nextfield, output_newline, output_string, and output_number
    macros and use them to simplify code generation.
  Add read_svar macro and use it to simplify code generation.
  Simplify doinput_2D_navar_phase2() by moving logic into assembly code.
  Simplify doinput_1D_navar_phase2() by moving logic into assembly code.
  Simplify doinput_svar_phase2().
  Simplify doinput_nvar_phase2() by moving logic into assembly code.
  Simplify doinput_nvar() by moving logic into assembly code.

2017 August 15
  Remove duplicate code in doinput_nvar().
  Simplify doinput_navar() by moving logic into assembly code.
  Use _exit() instead of exit() in FATAL().

2017 August 17
  Remove dead code from doint().
  Simplify donumeric_comparison2() by moving logic into assembly code.
  Simplify freg_to_freg() by moving logic into assembly code.

2017 August 18
  Simplify doongotostart() by moving logic into assembly code.
  Create freg_to_freg macro and use it to simplify code generation.
  The need_INPUT is not specific enough, so add some more granular
    variables need_INPUT_NVAR, need_INPUT_SVAR, need_INPUT_NAVAR_1D,
    and need_INPUT_NAVAR_2D to enable parts of it.
  Refactor semantic_checks() and add sc_input() to set the new
    need_INPUT_* globals.
  Create input_nvar macro and use it to simplify code generation.
  Make doinput_navar() use input_nvar macro to simplify code generation.
  Simplify doinput_svar_phase2() by moving logic into assembly code.
  Simplify doinput_nvar_phase2() by moving logic into assembly code.
  Simplify doinput_1D_navar_phase2() by moving logic into assembly code.
  Simplify doinput_2D_navar_phase2() by moving logic into assembly code.

2017 August 19
  Create input_svar_phase2 macro and use it to simplify code generation.
  Remove unused store_float_to_stackslot() and load_float_from_stackslot()
    functions from codegen module.
  Create input_nvar_phase2 macro and use it to simplify code generation.
  Create doinput_1D_navar_phase2 macro and use it to simplify code generation.

2017 August 20
  Create doinput_2D_navar_phase2 macro and use it to simplify code generation.
  Simplify dostring_comparison2() by moving logic into assembly code.
  Simplify donumeric_comparison2() by moving logic into assembly code.
  Create string_comparison macro and use it to simplify code generation.
  Simplify donumeric_comparison2() by moving more logic into assembly code.
  Create numeric_comparison macro and use it to simplify code generation.
  Create randomize macro and use it to simplify code generation.
  Remove unused write_init_RND(), rename randomize to randomize_nonrepeatable,
    and add randomize_repeatable.
  Create input macro and use it to simplify code generation.
  Create exitfor macro and use it to simplify code generation.
  Create ongotostart macro and use it to simplify code generation.

2017 August 21
  Add need_RESTORE flag to globals module.
  Set need_RESTORE in semantic_checks module.
  Create restore macro and use it to simplify code generation.
  Create prologue1 and prologue2 macros and use them to simplify code
    generation.
  Create prologue3 macro and use them to simplify code generation.
  Create init_bss_numeric, init_bss_string, begin_init_bss,
    end_init_bss, and drainstdin macros and use them to simplify
    code generation.

2017 August 22
  Remove .Luninitialized and just fill in the message and jump to the
    .Lprint_error_message target directly when required.
  Remove .LNaN and just fill in the message and jump to the
    .Lprint_error_message target directly when required.
  Remove unused .Loverflow jump target.

2017 August 23
  Move .LNaN_msg definition into binary_add.s, binary_divide.s,
    binary_multiply.s, and binary_subtract.s using a macro guard to
    prevent defining it more than once.
  Move .Longotofail_msg definition into ongoto.s file.
  Move .Larray_OOB_write_msg_len definition into floatreg_to_array_1D.s
    and floatreg_to_array_2D.s using a macro guard to prevent defining
    it more than once.
  Move .Lsubscript_msg definition into array_1D_to_floatreg.s and
    floatreg_to_array_1D.s using a macro guard to prevent defining it
    more than once.
  Move .Lsubscript2_msg definition into array_2D_to_floatreg.s and
    floatreg_to_array_2D.s using a macro guard to prevent defining it
    more than once.
  Move .Larray_OOB_read_msg and .Luninitialized_element_msg into
    array_1D_to_floatreg.s and array_2D_to_floatreg.s using a macro guard
    to prevent defining them more than once.

2017 August 24
  Fix statbuf to be .Lstatbuf in .type statemnt in isterminal.s file.
  Move .LTAB_msg from tab.s to tab_macro.s where it really used.
  Move .Lbad_string_read_msg to read_svar.s where it is used.
  Move .Lbad_number_read_msg to read_nvar.s where it should be.
  Move .Lout_of_data_msg to read_nvar.s, read_svar.s, read_navar_1D.s, and
    read_navar_2D.s using a macro guard to prevent defining it more than once.
  Move .Lbadarg_msg, .Lcrazyarg_msg, and .Lfunction_msg into badcosarg.s,
    badsinarg.s, badtanarg.s, floor.s, sqr_macro.s, tab_macro.s, and
    udf_macro.s using a macro guard to prevent defining them more than once.
  Merge prologue2 into prologue1.
  Remove no longer used runtime_assembly.o target from the Makefile.gcc and
    Makefile.clang files.
  Add AMD64/ prefix to .incbin line textdata.s.in to avoid the need for
    -I AMD64 in the makefiles.
  Labels are not data, so remove bogus .type declarations in textdata.s.in
    file.

2017 August 25
  Removed unused .Lappendvarname subroutine.
  .Lappendevarname is only used in two places, so just inline it and remove it.
  Make show_version() indicate whether the program was compiled as EXE or PIE.

2017 August 26
  Merge the two distinct macros into one macro that works for either 64bit or
    32 bit in the read_nvar.s file.
  Just inline the short code in .Lprint_error_message where needed and then
    remove the stand-alone code fragment.
  Add a warning to the NEWS file about the kernels that do not work with
    ASAN.  I lost an entire month trying to debug that [sigh].
  Move end of program MXCSR and SP restoration code to a flat file.
  The need_strcpy needs to be set by the semantic analysis BEFORE code
    generation, so remove bogus assignments to need_strcpy flag.
  Move dostore_svar() assembly to store_svar.s flat file.
  Add goto macro and use it in dostop() and dogoto() codegen routines to
    simplify code generation..

2017 August 27
  Add jump_if_true and jump_if_false macros and use them to simplify code
    generation.
  Add test P372.BAS for string literals with backslashes.
  Move fixbackslashes(), SYMNAME_MAX_BYTES, and LITVAL_MAX_BYTES to globals
    module.
  Add push_sliteral macro and use it, and improve comments in the
    push_string_literal() function.
  Add conditional_branch and logical_not macros and use them to simplify
    code generation.

2017 August 28
  Update instructions for generating a full-static musl-libc ecma55 in README.
  Improve doloc() in codegen module.
  Use cmovne to optimize binary_add and binary_subtract macros.
  Remove incorrect second deallocation of MXCSR from stack in binary_multiply
    macro.
  Use cmovne to optimize binary_multiply macro.
  Remove redundant code from floatreg_to_array_1D macro.
  Remove redundant code from floatreg_to_array_2D macro.
  Remove redundant code from array_1D_to_floatreg macro.
  Remove redundant code from array_2D_to_floatreg macro.

2017 August 29
  Move .Lstring_too_long_msg from push_pop_saddr.s to store_svar.s where it is
    used.
  .Lstring_too_long is only used once, so just inline it in the
    store_svar macro.
  Remove redundant code from beginfor and endfor macros.
  Change badxit label to .Lbadxit since it doesn't need to be public.
  Make goodxit and finalxit have .L prefixes since they do not need to be
    public.
  Make realinit, randinit, drand, and isaac64 have .L prefixes  since they do
    not need to be public.

2017 August 30
  Make exception_non_fatal and INPUT have .L prefixes since they do not need to
    be public.
  The SLEEF functions do not need to be public.
  Remove unused self-test from myitoa.s file.
  Update tool versions used on home system.
  Add glibc version on ubuntu-17.04 system.
  Update memcpy to have .L prefix since it does not need to be public.
  Remove bogus msgcnt from buffer.s file.
  Add .L prefix to soperand_stack_size since it does not need to be public.
  Add .L prefix to retaddr_stack_size since it does not need to be public.
  Make symbols in dmgay.s private by adding .L prefxies.

2017 September 1
  Remove unused YES and NO definitions from buffer.s file.
  Fix missed .L prefix for .type of tens in dmgay.s file.
  Make many more symbols in assembly code private by adding .L prefixes.
  Use .equiv instead of .set for compile-time assembly language constants.
  Make more assembly code symbols private with .L prefix.

2017 September 2
  Make user-defined function names private in assembly code.
  Consoliate all string macros into strings.s, update symbol_table string
    definition code to use assembly macros.
  Set and use .LBALIGN to simplify assembly output for symbol table.
  Set and use .LBYTES_IN_NUMBER to simplify assembly output for symbol table.
  Avoid using .rept in array definitions.
  Compute sizes from labels in symbol table.

2017 September 3
  Add define_list macro and use it to simplify symbol table code generation.
  Add macro file numbers.s, update symbol_table numeric definitions code to use
    the new assembly macros.
  Create data_item_numeric and data_item_string macros and use them in
    symbol_table module to simplify code generation.

2017 September 10
  Update README to remove files no longer used and llvm/clang version.
  Add check_unit_tests to run unit tests and display output to Makefile.tcc and
    Makefile.pcc files.
  Add notext option to LDFLAGS, change error to warning for LTO+PIE, use
    LINKER instead of hard-coding gold.

2017 September 11
  Fix bug in figure 1.1 flowchart, and erroneous it in Chapter 6.

2017 September 12
  Silence warnings from llvm/clang-5.0.0 static analyzer about code in scanner2
    module.  The code worked, but lacked some error checking which has now been
    added.

2017 September 21
  Fix typo in error messages in BASICC, BASICCS, BASICCW.
  Teach BASICC, BASICCS, BASICCW to use obey LD environment variable for linker
    selection, then fall back to gold, and only then fall back to ld.
  Document LD environment variable in BASICC.1, BASICCS.1, and BASICCW.1 man
    pages.
  Add missing copyright notices to BASICC, BASICCS, and BASICCW.

2017 September 23
  Add missing timeout handling to run_tests2.
  Improve alignment of output from freg_to_freg() in codegen module.

2017 September 26
  Remove junk.s file if the self-test passes in symbol_table module.

2017 September 27
  Simplify Makefile.tcc and Makefile.pcc canrelease regression test support.
  Add missing include to asmgen self-test for getopt which is required if you do
    not use GNU extensions.
  Since 'asm' is a GNU extension, so update zonermore.c to use '__asm__'
    instead.
  Update software version list in README.
  Improve OPT support in Makefile.tcc file.
  Add STD support, improve OPT support, and remove bogus MODEL and TUNE support
    for Makefile.pcc file.
  Force COMPILE_MODE settings in recursive invocations of make for the
    Makefile.pcc and Makefile.tcc files.

2017 September 28
  Improve Makefile.clang and Makefile.gcc canrelease regression test support.

2017 October 1
  Stop emitting assembly directly, use macros instead, in symbol_table module.
  Move the rest of the ON..GOTO assembly code to the ongoto.s file.

2017 October 2
  Add need_DATA and set it when a DATA statement is encountered.
  Move general DATA support to new data.s file, and load it when need_DATA is
    set.

2017 October 3
  Do not print unused/unsupported variables STD, MODEL, and TUNE in the
    Makefile.tcc file.
  Build asmgen only when we need it, and include the clean as part of the
    recursive make invocation in the Makefile.tcc and Makefile.pcc files.
  Depending on distclean is unreliable so move that into recursive make
    invocation in the Makefile.tcc and Makefile.pcc files.
  Update Makefile.tcc and Makefile.pcc to run unit tests first in canrelease
    target to match Makefile.gcc and Makefile.clang files.
  Fix nonsense .if broken in move from codegen.c to inpout_nvar_phase2 macro
    in input_nvar.s file.
  Do not use UINT64_C() superfluously in scanner2.c file.

2017 October 4
  Instead of having .LBITS64 and .LBITS32 and using .ifdef, just have .LBITS64
    and set it to 1 for 64 bits, and 0 for 32 bits, using .if .LBITIS64==1 and
    .if .LBITS64==0 instead.
  Move .LBALIGN and .BYTES_IN_NUMBER definitions into definitions.s file.
  Fix allocation size computation error in append_new_token() in scanner2.c
    file.
  Do not use UINT32_C() superfluously in main.c file, and use size_t for string
    lengths.
  Add more comments and be more careful with types in load_textdata.[ch] files.
  OPTION BASE argument does not need 64 bits in sc_optionbasestmt() in
    semantic_checks.c file.
  String length type should be size_t in add_data_literal() of symbol_table.c
    file, and for append_new_token() and process_one_byte() of scanner2.c file.

2017 October 5
  Fix to use an unsigned multiply in .Lnextzone subroutine in buffer.s file.
  Fix to use an unsigned multiply in .Lappendbuffer subroutine in buffer.s file.
  Add comments to int_macro.s file.
  Do not uselessly use r13 in bad{cos,sin,tan}arg.s files.
  Fix comments and use xorl to zero out rax in exp_macro.s file.

2017 October 6
  Many small cleanups to assembly code files.

2017 October 8
  Use a 32 bit stack slot number instead of 64 bit in gosub_return.s file.

2017 October 9
  Add reg_to_reg.s with reg_to_reg macro, use it in reg_to_reg() in codegen.c to
    avoid emitting raw assembly directly from the C code.
  Update gen_stack() in codegen.c to use stackandident macro from definitions.s
    and use end.s to avoid emitting raw assembly directly from the C code.
  Use .if \var\()==1 instead of .ifeqs "\var\()","1" in assembly.
  Use 32 bit moves when possible in havefeatures.s file.
  Add missing q and l suffixes to bt instructions in sqr_macro.s file.
  Add missing q suffixes to cmp instructions in array_1D_to_floatreg.s,
    array2D_tofloatreg.s, floatmem_to_floatreg.s, floatreg_to_array_1D.s, and
    floatreg_to_array_2D.s files.
  Add final zero byte to .rodata.str1.1 in dumpregs.s to make linker happy.
  Add missing q suffix to bit testing instructions in sqr_macro.s, binary_add.s,
    binary_subtract.s, and sqr_macro.s files.
  Add missing instruction suffixes in binary_multiply.s, cos_macro.s, doinput.s,
    floatmem_to_floatreg.s, sin_macro.s, sqr_macro.s, strings.s, tan_macro.s,
    and udf_macro.s files.
  Make .LAVX, .LSSE4, and .LWIDE boolean (0 or 1) and adjust code for that.

2017 October 12
  Remove bogus $(LDFLAGS) from robert1.o target in the make files.
  Add code to report if stack protector or address sanitizer is in use for
    gcc and clang when -V option is used to show the version information.

2017 October 13
  Simplify Makefile.clang by insisting LLVM/clang 5.0 or better is used, and
    update NEWS and README.

2017 October 14
  Update NEWS with current version of tcc and notes on clang.
  Update BOOK information about TAN function that explains where it is not
    defined.
  Update BOOK pdf generation to create a pdf/A-1b file.
  Fix typo in dumpflags() that used the wrong variable when showing the
    need_PRINT_NUMERIC value.
  SIN(), COS(), TAN(), SQR(), INT(), and TAB() all need to have the
    need_PRINT_NUMERIC flag set to true, so updated sc_expression() in the
    semantic_checks module to do that.

2017 October 15
  When the register spilling code was removed in July, the spillname field
    was left in the tree_node structure by accident.  The spillname field
    has now been removed.

2017 October 16
  Small style cleanups and comment improvements to dag.c file.
  Major spell-check in comments and character literals.
  Small style cleanups to use more idiomatic C in asmgen.c, globals.c,
    parser2.c, scanner2.c, semantic_checks.c, and symbol_table.c files.
  Simplify floor.s code, and use the stack for temporary values.

2017 October 17
  Move more error messages to error_messages module.
  Add some missing header file dependancies to the Makefile.* files.

2017 October 18
  Tests P330 and P345 should not generate fatal exceptions. Fix the expected
    results and notes in README.HAM files.
  Fix .Lfloor assembly function to handle cases where the resulting integer
    would be out of range to just leave the argument unchanged instead of
    raising a fatal exception.
  Use ROUNDSS/ROUNDSD for .Lfloor assembly function for machines that support
    SSE4.1 or better.
  Rename .LSSE4 to .LSSE4_1 to reflect it is for SSE4.1 support.

2017 October 19
  Update NEWS file with recent changes.
  Fix embarassing variable shadowing that only shows up on PIE compile of
    load_textdata.c file.
  Use movd to move data from 32bit GP registers to 32bit XMM registers instead
    of moving the data through a stack temporary variable.

2017 October 20
  Update NEWS and README.

2017 October 24
  Add test P373 to test INT() function.
  Update README to include the patch necessary for pcc to work with modern
    glibc header file versions.

2017 October 25
  Release version 2.23.

2017 October 29
  Add first part of new chapter about linked lists to the book.

2017 October 30
  Complete text descriptions of all algorithms and diagrams in the linked list
    chapter.

2017 November 1
  Add a section explaining the dynamic memory concept, and update explanation
    of array method to show how it relates to the dynamic memory concept
    section.
  Use \mbox{} to prevent word splitting of function names in Linked List
    book chapter.

2017 November 2
  Add a careful explanation of what a pointer and pointer variable are to
   the Link List book chapter.
  Add a diagram showing the difference between pointer and scalar variables.
  Add BASIC code for dump_raw_storage and print_nodes to book.

2017 November 3
  Add BASIC code for initialize_storage, load_storage, find_node,
   update_qty, and update_price to book.
  Fix bug setting end of list in initialize_storage BASIC code in book.
  Add BASIC code for append_node to book.

2017 November 4
  Fix compilation of scanner2 module with DEEP_DEBUG
  Fix parser2.c:g_printstmt() to show grammar expansions for g_printlist for
    -v option.
  Major update to complete linked list chapter of book.

2017 November 6
  LaTeX style and indexing fixes.
  Improve pointer variable diagram and add more indexing to Singly Linked Lists
    chapter.
  Revise linked list chapter, add better indexing, improve pointer
    memory concept diagram some more.  Add chart mapping between subroutines,
    BASIC lines, and flowcharts for SLLDEMO program.
  Avoid using groff-only nroff commands in man pages when possible.
  Improve wording in all man pages, delete no longer valid references to stand-
    alone optimizer output file.
  Add missing '-z relro -z now' to link example in ecma55.1 man page.
  Fix mandoc style warnings on ecma55.1 manual page.
  Note versions of groff, ghostscript, gzip, and sed used in README.
  Update NEWS with recent changes.

2017 November 7
  Update FAQ in README file with better instructions for renumbering.
  Add a section to FAQ explaining how to generate PDF files for the
    manual pages.
  Remove dead code from load_textdata.c file.
  Trust st_size field from stat in main.c:load_file_into_buffer() function.

2017 November 8
  Update scanner2 module to use length of input buffer to determine when
    to terminate instead of requiring an unnatural, extra appended NULL
    terminator be added to the file input data.
  Teach main.c:load_file_into_buffer() not to require zero terminated buffer
  Remove unused scanner2.c:unload_buffer().
  Use mmap() for input BASIC source file.
  Rewrite append_node section of linked list chapter of the book.
  Use better variable names in append_node and delete_node diagrams and
    flowcharts in linked list chapter of the book.

2017 November 9
  Fix list of figures and list of tables formatting problems in the book.

2017 November 12
  Fix grammar statement for g_on_gotostmt in grammar.txt file.
  Fix parser2.c grammar output for verbose mode to handle GOTO vs. GO TO.

2017 November 13
  Rewrite delete_node section of linked list chapter of the book.

2017 November 15
  Teach scanner about LEN token.
  Add need_LEN flag to globals flag list for LEN() function, and teach
    semantic_checks.c about LEN() function.
  Use proper getopt() support and recognize -X in parser2.c self-test.
  Refactor parser2.c self-test and create test1() to simplify code.
  Refactor ast.c self-test and create test1() to simplify code.
  Use proper getopt() support and recognize -X in dag.c self-test.
  Make clean targets of Makefile.* remove core files.
  Fix bug in run_tests2 where tests marked X lost the other ECMA55FLAGS.
  Add dolen() to codegen module.
  Add an implementation of len_macro to strings.s file.
  Add test P374.BAS for LEN() function.
  Add test2() self-test for LEN to parser2 module.
  Teach parser2.c about LEN() function.
  Teach ast.c about LEN() function.
  Teach asmgen.c about LEN() function.
  Teach dag.c about LEN() function.
  Note LEN() as an extension in README file.
  Update NEWS with recent changes including LEN() support.

2017 November 16
  Use proper getopt() support in symbol_table.c self-test.
  Use proper getopt() support in scanner2.c self-test.
  Move and consolidate self-test usage() to globals module.

2017 November 17
  Update grammar.txt for LEN() function.
  Fix a bug in read_navar_2D macro that never manifested in any of the
    self-tests.
  Stop using pinsrd/pextrd for low 32 bits; just use movd in assembly code.
  Fix typo in test P206.BAS test.
  Fix another typo in test P206.BAS test [sigh].
  .Lcrazyarg_msg is only needed in udf_macro.s, so remove it from other files.

2017 November 18
  Fix expected output for test P205 (it runs with -X now).
  Use load-nvar() and load_realvariable() instead of open-coding in asmgen
    module.
  Remove redundant allocations in load_realarray_variable() in asmgen module.
  Add support for < <= > >= comparison of strings when extensions are enabled.
  Improve test harness so it allows better testing of extensions.
  Make globals module source code 80-column friendly.

2017 November 19
  Fix buggy run_tests handling of ECMA55FLAGS.
  Make globals module 80 column friendly.
  Update version number to 2.24 for upcoming release.
  Update ECMA55-Slideshow documents.
  Tag version 2.24.

2017 November 22
  Update software versions in README file.

2017 November 25
  Move len_macro to a new stringsX.s file so it only gets included when needed.
  Do a better job documenting software used.
  Fix error in chapter 17 BASIC code for the case when you delete a
     non-existing node. It gave an error message as it should, but gave the
     wrong ID number.
  Add SLLDEMO.BAS from chapter 17 of the book to CSCLASSICS.  This program has
     a menu driven interface and is a demonstration of manipulating a linked
     list of records.
  Add mercurial home to 'Where to get sources' list in README.
  Update bas55 sample output for new upstream 1.12 version.
  Do not hard code 18 byte string lengths in parseinput.c file.

2017 November 26
  Improve Makefile.tcc build file.
  Improve parseinput.s generation in Makefile.gcc build file.
  Add -fno-jump-tables to parseinput.s assembly generation for Makefile.clang file.

2017 November 27
  Change 'no break' comments to 'INTENTIONALLY FALLS THROUGH' to shut up stupid gcc
    warnings in dtoa5_normal.c file.
  Enable more warnings for Makefile.gcc build of g_fmt_BASIC_normal.o and
    dtoa5_normal.o object files.
  Enable more warnings for Makefile.tcc build of g_fmt_BASIC_normal.o and
    dtoa5_normal.o object files.
  Improve Makefile.pcc build file.
  Enable more warnings for Makefile.clang build of g_fmt_BASIC_normal.o and
    dtoa5_normal.o object files.

2017 November 30
  Make .Lrealinit less confusing, and use a rep stosq to zero the bufffer.

2017 December 1
  Update tcc and kernel version information in README.
  Rewrite .Linitbuffer to use stosq for speed when it can.
  Preserve rcx value in .Lmymemcpy in memcpy.s file.
  Use rep stosq when possible in init_bss_string routine.
  Cleanup .Ldoinput runtime assembly code a little bit.

2017 December 4
  Update realinit() in robert1 to only call gettimeofday() when a
    non-repeatable sequence is requested.
  Only call gettimeofday() in .Lrealinit if we need to for RANDOMIZE.
  Add limit_var to NEXT statement AST nodes, populate them in semantic checks
    module, pass them through the asmgen and codegen modules to the endfor
    macro, and update the endfor macro to expect the limit_var parameter.

2017 December 5
  Update NEWS file with recent changes.

2017 December 7
  Update ecma55.1 man page to note that you should normally just use the
    BASICC script to compile your programs.
  Merge in changes from BAP README.

2017 December 9
  Fix error in "Subroutine Example Flowchart (2 of 2)"
  Generalize "Sequential Search Flowchart for 20 elements" to support N
    elements.

2017 December 11
  Fix bug in ast module self-test where LEN() was treated like PRINT.
  Fix bug in scanner2 module self-test where LEN() was tested without -X option
    being specified.
  Note recent bug fixes in NEWS file.

2017 December 12
  Document "live" scanner FSM table changes done for extended mode to accept
    lower-case REM conetent and quoted strings.
  Tweak width of gray box in delete_node flowchart in book.
  Use proper TeX double quotes in book.
  Improve preface of book by clarifying that you don't need an AMD64 system,
    just an AMD64 _compatible_ system.  Also update to state that skills will be
    transferrable to any _mainstream_ programming language.
  Explicitly define line number in book.

2017 December 13
  Add new assembly support routines beginfor2 and endfor2 that support improved
    for loop generation.
  Update compiler to use new for loop generation.  Given this code:

    100 FOR X=1 TO 10
    110 BODY
    ...
    200 NEXT X
    210

    we used to produce this:

            .LIMIT=10
            .STEP=1
            X=1
    .L1:    IF (X-.LIMIT)*SGN(.STEP) > 0  GOTO .L3
            ....
            X=X+.STEP
            GOTO .L1
    .L3:

    but now we produce this:

            .LIMIT=10
            .STEP=1
            X=1
            JMP .L2
    .L1:
            ....
            X=X+.STEP
    .L2:    IF (X-.LIMIT)*SGN(.STEP) <= 0 GOTO .L1
    .L3:

     (.L3 is stell needed for extended mode 'EXIT FOR' support)

    At least according to most references, this should be better on modern CPUs
    since backwards jumps run better than forward jumps since backwards jumps
    can take advantage of the cache.
  Add AVX support to new endfor macro.

2017 December 14
  Update endfor macro to use binary_add and binary_subtract so it gets proper
    specifications-compliant floating-point exception handling for those
    mathematical operations.
  Update endfor macro to use binary_multiply so it gets proper
    specifications-compliant floating-point exception handling for that
    mathematical operations.
  Improve Makefile.pcc to enable stack protector and more warnings.
  Update pcc/tcc/hg/kernel versions in README file.

2017 December 15
  Update NEWS file with recent changes.

2017 December 21
  Update NEWS and README to recommend the recently released official
    tcc-0.9.27 version and not a git snapshot.

2017 December 24
  Vanilla glibc-2.26 whines if you use -D_FORTIFY_SOURCE with tcc, so remove
    from Makefile.tcc for now.

2017 December 26
  Fix corner cases in rounding of 1D array subscripts.  CVTSS2SI was using
    round to even instead of proper rounding that just happened to work for the
    cases tested by accident.

2017 December 28
  Preserve r8 in .Lmyitoa macro.
  Update array_1D_to_floatreg macro rounding code so that it does not
    hard-code r14 and r15 registers and make it use the stack instead of xmm15.
  Use better macro parameter names in array_1D_to_floatreg macro.
  Update floatreg_to_array_1D macro rounding code so that it does not
    hard-code r14 and r15 registers and make it use the stack instead of xmm15.
  Use better macro parameter names in array_2D_to_floatreg macro.
  Avoid converting row/column registers twice in array_2D_to_floatreg macro.
  Use better macro parameter names in floatreg_to_array_2D macro.

2017 December 29
  Remove bogus deallocation of 1 byte in array_2D_to_floatreg macro.
  Update floatreg_to_array_2D macro to perform proper rounding of subscripts.

2017 December 30
  Avoid permanently changing the contents of the fp register holding the index
    value in array_1D_to_floatreg and floatreg_to_array_1D macros.  This can
    matter if we are evaluating a DAG expression and a node has indegree > 1.
  Update array_2D_to_floatreg macro to perform proper rounding of subscripts.
  Avoid permanently changing the contents of the fp registers holding the index
    values in array_2D_to_floatreg and floatreg_to_array_2D macros.  This can
    matter if we are evaluating a DAG expression and a node has indegree > 1.
  Update README software version numbers.
  Update NEWS to note array subscript rounding fixes.
  Only allocate the space we need in floor macro.

2017 December 31
  Update copyright notices for 2018.
  Add 'More About Subscripts' section to 'Arrays' chapter of book that
    explains non-integral subscripts and shows why they are bad and what to do
    instead.  It also shows in detail with examples some counter-intuitive
    floating point behavior.

2018 January 1
  Improve chapter 5 in the book by adding a summary detailing the critical
    ideas about loops from the chapter.
  Improve chapter 9 in the book by rewriting several parts, and being more
    pedantic in explanations about OPTION BASE and DIM.  Add a new example
    program that shows issues when using floating point values for subscripts
    and loop increments.
  Update version number of ecma55 to 2.25 in prepration for new release.

2018 January 4
  Add entry to README for BOOK/Learn_BASIC.pdf to list of files included.

2018 June 15
  Append a comment including GNU Free Documentation License to ecma55.1 man
    page.
  Improve ecma55.1 ROFF code and make semantic improvements to content.
  Make a small fix to ensure the man page formats properly with
    heirloom-doctools 20160308.
  Update bas55 book appendix for bas55-1.16 version.

2018 June 20
  Update README to specify upstream as git, update software version numbers
    for software used, and change hg clone to a git clone.
  Append GFDL text in comments for BASICC*.1 man pages.
  Add verify (using apache preflight) target for BOOK/Makefile.

2018 June 29
  Update regex used in run_test* so it works with file-5.33.
  Update software version numbers in README.

2019 January 26
  Fix assembly for clang-7.x by using llvm-mc.

2019 January 28
  Remove unnecessary casting.

2019 January 29
  Do not use the same line numbers many times in self-tests
  and clean up some trailing whitespace to shut git apply up.

2019 March 18
  Simplify casting some more.

2019 March 20
  Improve tracing output.
  Fix self-test errors in dag and optimizer modules.

2019 March 25
  Update Makefile.clang to handle clang 8.x versions.

2019 April 6
  Improve man page roff code.

2019 April 18
  Fix issues found by LLVM/clang-8.0.0 scan-build tool.
  Add opid_names[] array with opid_count elements to allow mapping opid
  back to a string name in error messages.
  Give an ICE with error message, don't just abort() when there is a
  problem with '-'.
  Fix ASAN violation that occurred when an integer > 32 bits was returned
  by the scanner by converting it to a 64 bit real.  Also remove some
  redundant code.  Note well that while this works with gcc, pcc, and tcc,
  with clang compiled for debugging, it segfaults. Since it works in the
  other 3 compilers, I suspect this is a code generation bug in clang 8.0.0.

2019 July 24
  Initialize some pointers to NULL to appease cppcheck.

2019 July 26
  Some pdftops versions do not support -r option, and we do want duplex.

2019 July 30
  Fix expected output of test4.

2019 August 12
  In the book, fix wrong index i in Bubble Sort explanation picture,
  remove bogus italic highlight in Bubble Sort explanation picture.

2019 August 17
  After many months of frustrating crashes with clang >= 8.0.0
  analyzers, it finally works again, thanks to gcc-9.2.0 (yes, really).
  The gcc-9.2.0 gave some warnings about some string operations,
  and fixing those to satisfy gcc fixed the clang analyzers as a side
  effect.

2019 August 19
  Update software versions in README file.
  Update ChangeLog.

2019 October 7
  Add support for clang 9 to Makefile.clang

2019 October 14
  Use puts() instead of printf() when possible.
  Update copyright year lists in source files.
  Update version numbers, note problems with PIE & clang in README.
  Add README.clang noting the issue with clang and PIE mode.
  Tweak Makefile.clang to prevent building with PIE=1.
  Further improve output using putc, fputs, etc. in C source files.
  Print the trees in the self-tests of tree.c module.
  Update ChangeLog.

2019 October 15
  Update software versions for Ubuntu machine in README.

2019 October 16
  Attempt to use 'const' more intelligently in C source code.
  Use memset() instead of iterating over the array to reset values
    in init_dagger().

2019 November 13
  Add MATMUL.BAS demo program, which uncovered a problem:
  Fix missing 'BAD NUMBER READ' error messages in READ statement
    runtime assembly routines for 1D and 2D array variables.
  Update NEWS, ChangeLog.
  Add test case P375 for testing READ into 1D array variable.
  Add test case P376 for testing READ into 2D array variable.
  Fixed run_tests, run_tests2, run_tests3 broken logic.
  Update version number of ecma55 to 2.26 in prepration for new release.

2019 November 14
  Update all Makefiles to use ASFLAGS.
  Update Makefile.tcc to set STD to c11 and use it.
  Update Makefile.gcc and Makefile.clang to set STD to c17 since those
    compilers support that newer standard.
  Update README home machine version information.

2019 November 15
  Improve MATMUL.BAS (matrix multiply demo)
  Add MATDET.BAS (matrix determinant demo)
  Add MATINV.BAS (matrix inverse demo)

2019 November 16
  More cleanups to Makefile.pcc
  Move matrix demos to CSCLASSICS
  Update README

2019 November 18
  Update ChangeLog, NEWS
  Update version number in the book
  Tag version 2.26

2019 November 29
  Allocate rlineno and lineno on the heap instead of using static arrays in
     parser2.c's g_on_gotostmt().
  Update dag and optimizer routines to avoid using static buffers for g_fmt()
     conversions.

2019 November 30
  Fix some issues with INPUT_WIDTH.
  Stop using duplicate names for fields in different structures of symbol table.

2019 December 1
  Add tests for add_data_literal() to symbol_table.c self-test code.

2019 December 4
  Update software versions in README file.
  Try to be smarter about message output by combining printf() calls, and using
    puts() instead when possible.

2019 December 24
  Mark ilist.datalength const & make item_list extern in load_textdata.h file.
  Use a typedef and create arraydata type instead of using struct directly
    in symbol_table.[ch] files.
  Fix dumb typos for verify target in BOOK/Makefile file.

2019 December 25
  Change tokens and tree nodes to use typedefs instead of using the structs
     directly.
  Make some whitespace cleanups while make the typedef changes.

2020 January 2
  Fix silly syntax errors about .DEFAULT: targets in Makefiles.
  Add missing help information for -o option in main.c file.
  Update copyright year to 2020.
  Fix one place where -s flag wasn't passed through in run_tests file.
  Do not change directory change messages on sub-makes since we never really
     change directories anyway.
  Add missing test output for NBS tests 7 and 8.  These weren't noticed as
     missing due to bugs in the run_tests script.
  Add new Makefile.runtests test harness, which will eventually replace the
     run_tests script.

2020 January 13
  Cleanup Makefiles to pass parameters to sub-makes correctly, and also change
     test execution order to be reasonable.
  Remove bogus NBS test 130 32 bit output file.  This is another file that
     didn't matter due to bugs in the run_tests file.
  Fix DAG folding so it works for floats too, not just doubles (oops!).
  Switch main Makefiles to use Makefile.runtests instead of run_tests file.
  Improve Makefile.runtests summary output to show fractional percentages
     like run_tests does.
  Finally remove run_tests, now that Makefile.runtests is truly better.
  Fix redundant grep filtering used when testing CPU features in Makfiles.
  Make another round of whitespace fixes to remove trailing spaces in text
     files, since git complains so much about it.
  Update README software version information, and document the new
     Makefile.runtests file.

2020 January 15
  Update ChangeLog and NEWS with recent changes.

2020 January 17
  Fix exit code, show diffs if files don't match in Makefile.runtests file.

2020 January 19
  Be more conservative: do not do constant folding unless all operands are
     literal values.
  The new testing of 32bit code has shaken several issues that I fixed:
     Fix 32 bit mode for tangent, stop trashing xmm0 on exit of tangent.
     Fix 32 bit mode for sine
     Fix 32 bit mode infinity detection for cosine
     Fix 32 bit mode for array_1D_to_floatreg
     Fix incorrect .LQNaN_Indefinite definition
  Fix uninitialized vs NAN reporting

2020 January 20
  Add .LEXTENSIONS and use it instead of a parameter to udf_header
     to indicate that the -X switch has been used.

2020 January 21
  New make went weird with '#' character, so use '=' instead for progress bar.

2020 January 25
  Update README with recent changes.
  Use parentheses to make expression evaluation order explicit in nextzone().
  Add an in-place trim() to globals module, add a self-test for it.

2020 January 26
  Update ast, dag, optimizer to use new trim() from globals module.
  Update Makefile.* to add support for building globals self-tests.
  Remove some leftover debug code from globals module.
  Refactor self-test into test1() in optimizer module.
  Add full command-line options support to self-tests in optimizer module.
  Add another self-test to dag module.
  Explicitly set child heights in optimizer self-tests.
  Convert HAM test suite to new style based on GNU make using
     Makefile.runtests2 in a similar way to the way the NBS test suite was
     converted to a version based on Makefile.runtests. As part of this,
     delete run_tests3 and run_tests2.  This is an ugly commit since it
     wasn't done using proper renames, and it is a flag day commit.
     Deal with it.
  Convert hard-coded NBS to SUITENAME variable in Makefile.runtests file.
  Note replacement of run_tests[23] in NEWS file.

2020 January 27
  Fix typo in NBS test P183.BAS and it's corresponding support files.
  Fix typo in NBS test P130.BAS and it's corresponding support files.

2020 February 25
  Fix a few typos in the Learn_BASIC.tex file.

2020 March 4
  Update version number to 2.27 in globals module and NEWS file.
  Update pcc/tcc 'good' version information in README and
     Learn_BASIC.tex files.
  Add .gitattributes to tell git not to worry about whitespace in *.BAS
     files and their corresponding support files.

2020 March 5
  Update this ChangeLog with recent changes.
  Release version 2.27

2020 March 8
  Update README to note bas55 --debug support and fix URL for bas55.

2020 March 23
  Use strdup() when possible in asmgen, dag, optimizer, parser2,
     symbol_table, and tree modules, as well as in main module.
  In semantic_checks module, varname array does not need to
     be static in sc_nvar().
  When using snprintf() in codegen module, be more careful about
     string termination.

2020 March 24
  Fix typos in NBS tests 43, 115, and 128 spotted by the sharp eyes of
     Jorge Giner Cordero.
  Update expected output for those fixed tests.

2020 March 30
  Fix yet another typo, this time in NBS test 12, spotted by the sharp eyes of
     Jorge Giner Cordero.
  Update expected output for that fixed test.
  Fix outright wrong comments for FATAL and ICE functions.

2020 March 31
  Fix more typos in NBS tests 39, 115, and 128 spotted by the sharp eyes of
     Jorge Giner Cordero.
  Update expected output for those fixed tests.
  Update book for Jorge Giner Cordero's bas55 version 1.18, and describe the
     major math improvements.
  Remove unused tlen variable in main.c and symbol_table.c files.

2020 April 1
  The bas55 BOOK appendix should not be about ecma55 compiler.

2020 April 3
  Don't use unicode minus signs in README.

2020 April 5
  Stop setting need_PRINT_NUMERIC unneccessarily in semantic_checks module.

2020 April 6
  Remove references from README to removed run_tests, run_tests2, and
    run_tests3 files, and document accepting []{}| when extensions active.
  Raw initial import of new scanner3.[ch] files.
  Add CSCLASSICS/FIBOR.BAS, a small program with a recursive implementation
    of Fibonacci sequence generator.

2020 April 8
  Flag day switch to new scanner3 module.  HAM tests have not even been
    attempted yet.  The self-tests are known to leak rather badly right now.

2020 April 9
    Plug leaks from bad uses of peek_next_token() and remove trailing spaces
      and ensure assignments have spaces surrounding the equals sign.
    Use character literals instead of numbers in scanner.
    Enable -Wconversion for gcc/clang and fix code to compile cleanly with it
      except for robert1.c and dtoa5_normal.c (3rd party code).
    Improve scanner error messages:
      1.  Say must be 7-bit ASCII when hitting a character with high bit set.
      2.  If extensions are off and we hit an unknown keyword, check to see.
    Update expected output to reflect scanner changes.
    Fix regeneration (-P, -R) for AND, OR, and NOT.
    Add scanner special case where NOT can be preceded by a left parenthesis
      instead of a space.
    Remove mention of scanner2 from README.
    Note new scanner in NEWS.
    Update this file (ChangeLog).

2020 April 10
    Include software version in ecma55.1 man page.
    Improve book's ecma55 appendix installation instructions.
    Simplify NEWS information about new scanner.
    Fix (false positive) warning from gcc about strncpy truncation in the
      semantic_checks.c file.
    Update version number in code, book, and manual page to 2.28 version.

2020 April 11
    Add an explicit scanner_state type and use it to simplify scanner API.
    Remove '#if 0' code and fix some comments from scanner3.c file.
    Extensions cannot change once the scanner starts, so make that field
      const in the scanner_state type.
    Update ON .. GOTO appendix entry to note there is an example in
      Chapter 8.
    Improve tests/READNUMBER.BAS demo program so it shows 3 different common
      ways to handle reading from DATA statements.

2020 April 12
    Expand chapter 10 with a new example which shows 3 common ways to read
      lists of data from DATA statements.
    Add explanation of bubble sort BASIC program to chapter 13.
    Improve discussion of OPTION BASE 0 in chapter 12.
    Split out multi-way branching into a separate chapter removing it from
      the already complex Multi-column output chapter.
    Allow at least building ecma55 with dash or ksh.

2020 April 15
    Improve new multi-way branch chapter, divide mutli-column printing
      chapter into sections.  Improve five-way IF flowchart tikz code.

2020 April 16
    Move pos variable outside of __GLIBC__ ifdef like it should be, and
      add comment.  This fixes building with musl.
    Update Makefile.gcc to allow canrelease when CC=musl-gcc by having it
      skip the check_with_asan and check_unit_tests_asan targets.
    Release version 2.28.1

2020 April 18
    Create .LPinf64 constant and convert assembly files to use it.
    Use .asciz, not .string, in buffer.s to match rest of code.
    Add comments to memcpy.s describing purpose of saving/restoring rcx.
    Add missing .text .section markers to mystrcmp.s, mystrcpy,s, and
      mystrlen.s files.
    Add better comments to floor.s, fix bug with SSE4.1 code where it
      used the same storage for backup original mxcsr and the temporary
      scratch mxcsr.

2020 April 19
    Rewrite unary_minus macro in unary_minus.s to avoid conversions by
      using btc.
    Mark jump in myitoa.s as 8bit.
    Add more and better comments to binary_add.s, end_start.s, epilogue.s,
      for_next.s, freg_to_freg.s, gosub_return.s, goto.s, havefeatures.s,
      ongoto.s, reg_to_reg.s, sqr_macro.s, atan_macro.s, cos_macro.s,
      sin_macro.s, and tan_macro.s files.
    In log_macros.s, save backup copies of xmm0 and xmm1 on stack, not in
      GP registers, and add comments.
    Add comments and fix stack alignment for mxcsr temp variable in
      exp_macro.s file.

2020 April 20
    Add -B option for enabling AVX2 to ecma55, and add feature detection to
      verify AVX really is available when -B option is selected.  However,
      nothing uses it yet.
    Add more and better comments to abs_macro.s, badlog.s, binary_add.s,
      binary_divide.s, binary_multiply.s, binary_power.s, binary_subtract.s,
      buffer.s, good_bad_xit.s, isterminal.s, and restore.s files.

2020 April 21
    Simplify macros and add comments to badcosarg.s, badsinarg.s, badtanarg.s,
      and badlog.s files.
    Add comments to drain_stdin function in the doinput.s file.
    Add comments and fix two bugs in appendfloat.  On was bad stack alignment,
      and the other occured when using 32 bit floats, where xmm0 was left as a
      double when it should remain a float.
    Fix warning from clang about implicit conversion in g_fmt_BASIC_normal.c
      file.

2020 April 23
    Simplify exception_non_fatal() in exception_non_fatal.s file.  It does not
      need a stack frame and it was saving rax for no reason.
    Add comments to binary_power.s and conditional_branch.s files.
    Change ON..GOTO processing to automatically generate jump table names in
      the ongotostart macro.  Add comments to ongotostart, ongotochoice, and on
      macros.  Update codegen.c:doongotostart() to not pass cur_jumptable_no or
      up and finally remove that now unused variable altogether.
    Improve comments for gosub/return assembly code and its associated stack
      and stack pointer in gosub_return.s file.

2020 April 25
    Update Makeile.clang to accept clang version 10.  Clang 10 is still
      broken for PIE.
    Document what .end does in end.s file.
    Add comments and only include error message that are needed in udf_macro.s
      file.

2020 April 26
    Document some more constant values in SLEEF assembly routines in
      xatan_u1.s, xatan_u1_avx.s, xcos_u1.s, xcos_u1_avx.s, xlog_u1.s,
      xlog_u1_avx.s, xpow.s, xpow_avx.s, xsin_u1.s, xsin_u1_avx.s,
      xtan_u1.s, and xtan_u1_avx.s files.
    Update Makefile.runtests to note SKIPped tests.
    Add .LFLOATHALF and .LFLOATNEGHALF constants to definitions.s and use
      them in array_1D_to_floatreg.s, array_2D_to_floatreg.s,
      floatreg_to_array_1D.s, and floatreg_to_array_2D.s files.
    Prefer memcpy to strncpy when either works in parser2 and symbol_table
      C code.

2020 April 27
    Improve comments for exception_non_fatal.s, floor.s, and tab_macro.s
      files.
    Add built-in math function CEIL from ECMA-116 as part of extentions
      available when -X option is used.  Add a new test and update the
      included book's built-in math functions appendix to document the
      CEIL() function.

2020 April 28
    Fix rare bug that occured if you used CEIL/COS/INT/SIN/SQR/TAB built-in
      functions but didn't PRINT a number anywhere the program.  In that
      case some required runtime code was mistakenly omitted.  Add a new
      test for that too.
    Only track SKIP tests in Makefile.runtests2 if they are actually present
      in the test suite.  This case should never happen normally, but during
      testing it might.
    Improve error message in Makefile.runtests2 for the case of an existing
      testlogs directory and/or log file.
    Fix bug in Makefile.runtests2 where it was not handling specialized 32bit
      float tests correctly.
    Add built-in math function PI from ECMA-116 as part of extensions available
      when -X option is used.  Add a new test and update the included book's
      built-in math functions appendix to document the PI function.

2020 April 29
    Add missing reporting of need_CEIL value to dumpflags() diagnostic function
      in the globals.c file.
    Add built-in math functions DAG() and RAD() from ECMA-116 as part of
      extensions available when -X option is used.  Add a new test and
      update the book's built-in math functions appendix to document the
      DAG() and RAD() functions.
    Update ecma55.1 man page to mention CEIL(), DAG(), and RAD() functions.
    Update README with current software versions used for development.
    Add INTEL_CET.TXT to explain why this compiler does not support CET yet.
    Update this file to document recent changes.

2020 April 30
    Fix alignment of need_CEIL diagnostic output in dumpflags() in globals
      module.
    Add command-line option processing to tree module self-test code.
    Update documentation for recent changes.
    Add implementations of CEIL, DEG, RAD, and PI written in pure
      ECMA-55 Minimal BASIC dialect.
    Fix bug in ecma55's -v mode where entire program was dumped for every
      line instead of just one line at a time. This bug crept in when the
      storage of lines changed to using mmap() as part of the new scanner.
    Improve symbol_table module's dump_symbol_table() output by adding
      section headers.
    Add support for self-tests to semantic_checks module and the make files
      for tcc, pcc, gcc, and clang.

2020 May 1
    Dump symbol table upon successful compile with ecma55 with -v enabled.

2020 May 2
    Fix bug where parser was not marking TAB as a built-in function.
    Simplify -v line number termination in parser (use for the display of
      source lines).
    Rewrite ast module so that processing built-in functions and operators are
      distinct cases. Also add a self-test for RND, the only built-in function
      in ECMA-55 that takes no arguments.
    Add implementations of FP, IP, MAX, MIN, MOD, REMAINDER, ROUND, and
      TRUNCATE written in ECMA-55 Minimal BASIC.
    Teach tree module's create_tree_node2() to set the oid and then remove the
      many places which set it that no longer need to do that.

2020 May 3
    Refactor ast module code to make it easier to understand and maintain.

2020 May 4
    Teach hexdump() in globals module to output to a file (use stdin for
      screen) and update load_textdata for this.  Also make MJOLNIR leak
      display actually hexdump every single leaked byte.
    Fix embarassing error where dag_delete_all() did not work for n-ary dags.
    Implement DAG for jump targets always, to make renumbering easier and
      also make asmgen module simpler to read.
    Update unit tests to work better with MJOLNIR (COMPILE_MODE=DEBUG3).
    Fix three bugs in parser:
      1.  Missing xit level for C goto in self-test
      2.  Referencing line numbers that don't exist in self-test BASIC code
          ON..GOTO statements
      3.  Wrong override of semantic_checks()
    Fix embarassing error where I was using parent_count instead of
      parent_count2 when DAGifying the program in semantic_checks module.
    Update Makefiles for each compiler because parser2 self-tests need
      to link to the semantic_checks and symbol_table modules.

2020 May 5
    The clear_symbol_table() in the symbol_table modules was only freeing
      memory, but not resetting static tables; fix it to reset those tables.
    Remove mistakenly committed HAM_compile_output/P380.compile.X file.
    Add built-in math functions MIN and MAX from ECMA-116 as part of
      extentions (available when -X option is used), including a new test
      and updating the book's built-in math functions appendix to document
      the MIN and MAX functions.
    Add HAM test suite test P381 to test MIN/MAX functions.
    Add self-test to semantic_checks module.
    Fix flag-setting bug in semantic_checks module, and make self-test pass.
      There was a bug in the semantic_checks module where accessing numeric
      variables without any PRINT statements failed to include the required
      runtime printing support assembly code for error messages that could
      possibly occur.
    Update this file to document recent changes.
    Add comments in ecma55.1 man page source file to describe how to fix
      the bug with groff 1.22.4 and \*[Tm] register display on text terminals.

2020 May 6
    Add some blank lines in output from codegen and symbol_table modules
      in order to separate things in theassembly output.

2020 May 7
    Improve documentation for CEIL, DEG, RAD, PI, MIN, and MAX.
    Add built-in math functions IP(), FP(), MOD(), and REMAINDER() from
      ECMA-116 as part of extentions (available when -X option is used),
      including new tests and updating the book's built-in math functions
      appendix to document the new functions.
    Fix bug in dag module's dag_fold_multiply where bitwise and was
      used intead of logical and in one if test.  At most an optimization was
      missed, so this bug did not interfere with correctness, only efficiency.

2020 May 8
     Document relationship between double_output, .LWIDE, and output width.
     Move FORSTACK_DEPTH to globals module, use ERROR_BUFFER_LEN in
       semantic_checks instead of a private custom ERROR_BUFFER_MAX.
     Add document with text of ECMA-116 section 5.4 about Implementation-
       supplied Numeric Functions.

2020 May 9
     Explain FLAGS and MXCSR better in dumpregs.s file.
     Simplify logic to populate registers and improve overall layout in the
       dumpregs.s source file.

2020 May 10
     Return false for out of range errors in tree module's str2uint32()
       instead of crashing.
     Add SIGNIFICANCE_WIDTH_INTERNAL to globals module.  This is a constant
       specifying the  number of significant digits to use with g_fmt()
       internally when processing floating point constants.  It turns out
       there are very bad effects on 32 bit results if this is too small.
     Do not regenerate token text in parser2 module's g_real(), use proper
       FLOAT_BUFFER_LEN and SIGNIFICANCE_WIDTH_INTERNAL for conversions in
       g_integer.  Regenerating the token text when it isn't strictly necessary
       can lead to loss of precision which is bad and should be avoided.
     Do not fold unary minus with infinity, use SIGNIFICANCE_WIDTH_INTERNAL
       for numeric conversions, in dag and optimizer modules.
     Do not override INF values in ast modle's regenerate_float_literal.
     Fix floatlit_to_floatreg assembly macro to properly detect and force an
       ECMA-55 BASIC Overflow exception for infinite values.
     Move actual generation of floating point literal definition assembly code
       to code generator in a new dodefine_nlit, and use the
       SIGNIFICANCE_WIDTH_INTERNAL and FLOAT_BUFFER_LEN constants when doing
       unavoidalbe numeric conversions.  Try very hard to handle infinity
       correctly, using hexadecimal constants in the actual assembly
       definitions for those cases.  Work around a GNU as issue where things
       like 0E22 turn into 22 instead of zero.  The idea is that the compiler
       now avoids converting such things in the token text in the DAGs, and
       only does conversion during the actual output to the asembly code.
       This allows regeneratin of source code to work and give the same
       constants that were in the original programs, but at the same time use
       better constant representation in the generated assembly.
     Mark tests 215, 216, 217 as 64 bit only in Makefile.runtests2 file.
     Update expected output of NBS tests to reflect increase in accuracty for
       32 bit mode and improved handling of extreme values.
     Update this file to document recent changes.
     Add built-in math function MAXNUM from ECMA-116 as part of extentions
       (available when -X option is used), including new tests and updating
       the book's built-in math functions appendix to document the new function.
     Move new error messages to error_messages module where they belong.

2020 May 11
    Remove unused define_nlit macro from numbers. file.
    Mark unused error messages in error_messages.c file for recycling.
    Add implementations of LOG2 and LOG10 written in ECMA-55 Minimal BASIC.
    Add logarithm information to mathnotes.txt file.
    Fix wrong comments on EFLAGS processing for dumpregs.s file.
    Add public domain stack dumper dumpstack.s file.
    Fix typos in comments in abs_macro.s and unary_minus.s files.
    For log_macro, use only the passed-in xmm register for the > 0 test,
      use a stack frame instead of trying to maintain fragile stack padding,
      and remove slower (than SSE2) scalar AVX code.
    Add assembly-language support for LOG2 and LOG11 functions.

2020 May 12
    Add built-in math function LOG2 from ECMA-116 as part of extentions
      (available when -X option is used), including new tests and updating
      the book's built-in math functions appendix to document the new function.
    Refactor get_next_token() to split out process_letters() as a separate
      function since it was so huge.  Also, use more idiomatic C style with
      multiple returns instead of tedious deep nesting.  Also use lightweight
      peek_next_tid() a few places when possible instead of the more
      heavyweight peek_next_token() in scanner3 module.
    Fix ROUND.BAS and TRUNCATE.BAS examples.
    More corrections for need_* flags and printing in semantic_checks module.
    Replace SSE2 versions of SIN, COS, and TAN with newer versions from
      Naoki Shibata's SLEEF-3.4.1.

2020 May 13
    Replace SSE2 version ATN with newer version from SLEEF-3.4.1.

2020 May 14
    Replace SSE2 version of POW with newer version from SLEEF-3.4.1.
    Replace AVX versions of SIN, COS, TAN, ATAN, and POW with newer versions from
      SLEEF-3.4.1.
    Replace SSE2 and AVX versions of xexp with newer versions from SLEEF-3.4.1
      and actually got underflow exception reporting for EXP working.  Since the
      Intel hardware (and everybody who clones it) is fundamentally broken, I had
      to use a hard-coded heuristic for 32 bit mode, which is ugly, but it seems
      to work reasonbly well in practice.
    Update man page and README to note SLEEF license change from public domain
      to Boost Software License Version 1.0.

2020 May 15
    Make -l and -L options output all licenses used, not just GPLv2. 
    Add more links to upstream sources to README and ecma55.1 man page.
    Upgrade version number to 2.29, add v2.29 tag, and release.

2020 May 16
    Update hint in Makefile.runtests for removing stale NBS_runtests.?
      directory to include the required DIRNO=? setting.
    Raise a specific 'NEGATIVE QUANTITY RAISED TO A NON-INTEGRAL POWER'
      exception for that case in POW instead of just raising the 'BAD POWER'
      exception.  Also correct some incorrect comments and dodgy re-use of a
      register in the binary_power macro.
    Fix two corner cases for ^ operator (power)
      1.  -1^+INF now properly returns 1  (added new test P391 for this)
      2.  -1^-INF now properly returns 1  (added new test P392 for this)
    Add tests for six more corner cases of ^ operator
      1.  -INF^7 RETURNS -INF     (added new test P393 for this)
      2.  -INF^8 RETURNS +INF     (added new test P394 for this)
      3.  0^-9 RETURNS +INF       (added new test P395 for this)
      4.  0^-10 RETURN +INF       (added new test P396 for this)
      5.  +INF^-3.1 RETURNS 0     (added new test P397 for this)
      6.  +INF^1E-18 RETURNS +INF (added new test P398 for this)

2020 May 17
    Add tests for six more corner cases of ^ operator
      1.  99999^99999 RETURNS +INF  (added new test P399 for this)
      2.  99999^-99999 RETURNS -INF (added new test P400 for this)
      3.  -INF^-7 RETURNS 0         (added new test P401 for this)
      4.  -INF^-8 RETURNS 0         (added new test P402 for this)
      5.  0^7 RETURNS 0             (added new test P403 for this)
      6.  0^8 RETURNS 0             (added new test P404 for this)
    Replace LOG10 assembly implementation with SLEEF-3.4.1 log10 code.

2020 May 18
    Replace LOG2 assembly implementation with SLEEF-3.4.1 log2 code.

2020 May 19
    Add support for ACOS() and ASIN() functions from ECMA-116 Full BASIC
      using SLEEF implementations (available when extensions are enabled
      with -X).
    Improve ACOS/ASIN/ATN descriptions in the book's built-in math
      functions appendix.

2020 May 21
    Simplify create_tree_node() and just use strdup to copy the toketext.
      This avoids using a complex malloc and strcopy so it's faster, simpler,
      and easier to maintain.  It also avoids using the non-standard
      explicit_bcopy routine, which may not be available with alternate
      compiler toolchains and/or C libraries.
    Put BASIC source lines into assembly code as comments.  Instead of storing
      'One line of program' in each root node of the DAG for each line of
      input, actually store the BASIC source code for the corresponding line.
      This allows access to the appropriate BASIC input line for any node in
      the entire program DAG.  For now, use it in the assembly output to put a
      comment with the BASIC program source line immediately before the
      corresponding assembly code.  This makes reading the assembly a little
      bit less tedious since at least now you don't need to open the BASIC
      source file also when you read the assembly.  Also this fixes a bug with
      the static buffer size that occurred if an input line was too long.
      Strangely, non of my analysis tools caught this until I moved the buffer
      definition out of the innermost block.  Now the buffer in question is
      dynamically allocated with the correct size, which prevents this issue. 

2020 May 22
    Update mathnotes.txt with more information.
    Group built-in functions better, and explicitly mark extensions with
      comments.

2020 May 24
    Avoid a costly division in buffer.s by using shift tricks.
    Refactor parser2 code by replacing g_rnd(), g_pi(), and g_maxnum() with
      a single g_bif0() function.
    Stop assuming built-in functions names are 3 bytes long (and chopping
      them off). Define a proper MAX_BIFNAME_LEN constant, and set it
      to 20 for now which is large enough for REMAINDER, etc.
    Add built-in math functions COSH(), SINH(), and TANH() from ECMA-116 as
      part of extentions (available when -X option is used), including new
      tests and updating the book's built-in math functions appendix to
      document the new functions.

2020 May 26
    Add -fno-common switch for tcc in Makefile.tcc file.
    Reorder switch targets more rationally in asmgen module.

2020 May 28
    Fix cut and paste errors (T_LEN hardcoded as tid in error messages
      instead of using node->leaftoken->tid).
    Fix embarassing search & replace errors in new tests.
    Fix using wrong variable to get tid in an error message.
    Add built-in math functions ROUND(), and TRUNCATE()
      from ECMA-116 as part of extentions (available when -X option is used),
      including new tests and updating the book's built-in math functions
      appendix to document the new functions.

2020 May 30
    Fix a typo in the ECMA-116-NUMERIC-FUNCTIONS.TXT file.
    Add missing extension check for built-in functions with two parameters
      to the parser.  Those functions must only be available with the
      -X option, and the check for that was missing.
    Add built-in math function ANGLE() from ECMA-116 as part of extentions
      (available when -X option is used), including new tests and updating
      the book's built-in math functions appendix to document the new
      function.

2020 May 31
    Fix another typo in ECMA-116-NUMERIC-FUNCTIONS.TXT file in EPS()
      description.
    Update software versions in README file.

2020 June 3
    Use vDSO to access gettimeofday() for RANDOMIZE using code from
      Andrew Lutomirski.
    Change ISAAC64 seed generation for RANDOMIZE to use clock_gettime()
      from vDSO instead of gettimeofday() since clock_gettime() seems to be
      the currently recommended way to access time according to POSIX, since
      nobody's kernel can set the tz parameter of gettimeofday() reliably.
      Also, in theory, we now get nanosecond precision instead of microsecnd
      precision in the factional seconds part.

2020 June 4
    Add Creative Commons Zero license file (for vDSO parser code), and update
      compiler to emit it as part of -L output, and a summary as part of -l
      output.  Update the man page and README to mention this too.
    Add the vDSO C language original files in their own vDSO directory for
      future reference.

2020 June 6
    Update ChangeLog with recent changes.
    Update NEWS, and spell TRUNCATE correctly in the file too [sigh].
    Update version number in man page, the book, NEWS, and globals.c files.

2020 June 9
    Update version number to 2.30.

2020 July 13
    Make parseinput module pass cppcheck testing.
    Add a test of parseinput to unit testing.

2020 October 16
    Add support for LLVM/clang 11.x.

2020 October 30
    Fix memory leaks in self-tests.
    If clang user chooses PIE, switch to small code model so it will actually
       work.
    For gcc and clang, make -V report the code model used.
    Update README with current versions of software used.

2020 November 2
    Convert COMPILE_MODE=DEBUG to enable bounds-checking for tcc.
    Enable backtraces for tcc.
    Update Makefile.tcc to do testing with bounds-checking enabled.
    Update main.c -V option to display bounds-checking status for tcc.

2020 November 12
    Improve discussion about unary minus problems

2020 November 17
    Update README with fact that tcc only implements small model, and
      PIE does work with clang for small model.
    Change MAX_SUBSCRIPT_VALUE from 10000 to 10000000.

2020 November 23
    Use undocumented 'clang -dumpversion' in Makefile.clang since the crazy
      Ubuntu fools broke the 'clang --version' output.  While I was there,
      I dropped support for versions of clang older than version 8.
    Update NEWS with information about changes since version 2.30.

2021 January 20
    Fix obviously incorrect comments in load_textdata.[ch] files.
    Update README with new software versions.
    Update copyright year in files.

2021 Janaury 23
    Update README sources table with info for Boost Software License.
    Convert tabs that crept into runtime assembly code back into spaces.
    Rename SLEEF/magik to SLEEF/magik.sh since it's shell code.

2021 January 24
    Rename SLEEF/AVX to SLEEF/SLEEF-3.4.1-AVX.
    Rename SLEEF/SSE2 to SLEEF/SLEEF-3.4.1-SSE2.
    Fix warning in robert1.c's realint() (sometimes) triggered by left shift.
    Fix warning in semantic_checks.c's sc_nvar() (sometimes) triggererd by
      strncpy().
    Make -V option to ecma55 show glibc version, or unkown libc if it cannot
      because glibc is too old or some other libc (musl) is being used.
    Make -V option show Linux kernel version.

2021 January 26
    Replace runtime code for sin function with version from SLEEF-3.5.1.
    Replace runtime code for cos function with version from SLEEF-3.5.1.

2021 January 30
    Replace runtime code for tan function with version from SLEEF-3.5.1.
    Replace runtime code for log2 function with version from SLEEF-3.5.1.
    Replace runtime code for log10 function with version from SLEEF-3.5.1.
    Replace runtime code for log function with version from SLEEF-3.5.1.

2021 January 31
    Replace runtime code for exp function with version from SLEEF-3.5.1.
    Replace runtime code for pow function with version from SLEEF-3.5.1.
    Replace runtime code for asin function with version from SLEEF-3.5.1.
    Replace runtime code for acos function with version from SLEEF-3.5.1.
    Replace runtime code for atan function with version from SLEEF-3.5.1.
    Replace runtime code for atan2 function with version from SLEEF-3.5.1.
    Replace runtime code for cosh function with version from SLEEF-3.5.1
    Replace runtime code for sinh function with version from SLEEF-3.5.1
    Replace runtime code for tanh function with version from SLEEF-3.5.1
    Update NEWS with note that SLEEF routines have been upgraded to
      version SLEEF-3.5.1.
    Update README with current software versions.

2021 February 1
    Update NEWS to prepare for new release.
    Update README with current software versions.

2021 February 3
    Update SLEEF license function lists in main.c file.
    Update man pages for new release.
    Update version number in source to 2.31.
    Update this ChangeLog with February 2021's changes.
    Update NEWS (again) to prepare for new release.

2021 Febuary 5
    Update main.c to use mallinfo2 instead of mallinfo if using glibc
      and glibc version >= 2.33 .
    Update README with current software versions.

2021 March 2
    Fix spelling error in ECMA-116-NUMERIC-FUNCTIONS.TXT file.

2021 March 23
    Simplify zonermore.c's genheaderline0 and shut up a cppcheck 3.4 warning.
    Update home machine software versions in README.

2021 April 20
    Update tarball version of Minimal BASIC to 2.31 in the book.

2021 April 22
    Fix bit-shift undefined behavior in dtoa5_normal.c found by clang 12
      undefined behavior sanitizer.
    Fix bit-shift undefined behavior in robert1.c found by clang 12 undefined
      behavior sanitizer.
    Update Makefile.clang to support clang 12.0.
    Update README software versions and note that clang 12.0 has working PIE
      code generation.

2021 April 25
    Add -Wwrite-strings to tcc CFLAGS.
    Increase timeout to 60 seconds on tests.
    Silence warnings which show up with newer tcc and clang.
    Update README with new tcc git version info.

2021 April 28
    Enable control-flow protection for the compilers that support it (gcc
      and clang).
    Update main.c to report control-flow protection settings for the compilers
      that support it (gcc and clang).
    Add -Wwrite-strings to gcc and clang CFLAGS.

2021 May 1
    Remove pcc support, since pcc is once again unsupported and unmaintained.
    Add README.pcc to explain why pcc support was removed.
    Update README.clang to note that versions >= 12 work fine with PIE & large
      mode.
    Add built-in math functions DATE and TIME from ECMA-116 as part of
      extensions (available when -X option is used).  For now, they just
      return -1, which is permissible according to the specification.  The
      required runtime code to make these functions return correct answers
      is still in development.  Updated the book's built-in math functions
      appendix to document the new functions _current_ behavior.
    Silence a warning from gcc's static analyzer in scanner3.c.

2021 May 2
    Completed the runtime support for built-in math fuctions DATE and TIME
      from ECMA-116.  I cannot conceive of any simple way to test these, and
      so no tests for them have been added (yet).  Updated the book's built-in
      math functions appendix to document the now working behavior of DATE and
      TIME.

2021 May 3
    Enable static analyzer for Makefile.gcc.
    Avoid using multiple returns in regenerate_source() in ast.c.

2021 May 4
    Update software versions for work machine.
    Update prologue.s to save argc, argv, and environment data from program
      startup.
    Replace getenv stub with working implementation in AMD64/localtime.s.
      This means DATE and TIME now respond to TZ environment variable if it
      is populated correctly.  If it has a bogus value, then that value is
      silengly ignored and we fall back to whatever /etc/localtime specifies.

2021 May 7
    Make scanner3 self-test logic simpler and more robust.
    Move direct code generation in symbol_table's ds_read_data() to codegen
      module.
    Use open coding instead of macros to generate DATA statement definitions.

2021 May 8
    Use open coding instead of macros to generate stack, ident, and .end.
    Move PI and MAXNUM defintions to definitions.s
    Correctly support PI and MAXNUM in DATA statements when extensions (-X)
      are used.

2021 May 9
    Fix parse_tests() error propegation in scanner3 module.
    Fix swapped comment values for .LMAXNORMAL in definitions.s file.
    Improve diagnostic output for diff failures in Makefile.runtests2 file.
    Add test P417 to test PI and MAXNUM in DATA statement.
    Removed unused need_DATA global variable.
    Replace push_literal with open code in codegen module.
    Replace pi_macro with open code in codegen module.
    Replace maxnum_macro with open code in codegen module.
    Update P388 test to include assignment test for MAXNUM.
    Add supplementary tests/MRTIME.BAS example.
    Update P379 test to be more thorough.
    Replace restore macro with open code in codegen module.

2021 May 10
    Replace goto, jump_if_true, and jump_if_false macros with open code.
    Update the book's built-in math functions appendix MAXNUM and PI entries
      to note that they work in DATA statements as named constants.
    Replace reg_to_reg macro with open code.

2021 May 12
    Replace min and max macros with open code.
    Update README to include download and license information about tzcode.
    Replace abs macro with open code.
    Fix typo in do_abs (incorrect double percent).

2021 May 13
    Update makefiles to build unit tests more efficiently using a single
      combined compile+link step instead of using two discrete compile and
      link steps.

2021 May 15
    Update makefiles to do the canrelease sequence based on proper dependencies
      instead of requiring non-standard .NOTPARALLEL directives, and reduced
      the number of recursive make calls.
    Replace deg_macro and rad_macro with inline code.
    Avoid duplicating error message code in mode_macro.
    Replace rnd_macro, randomize_nonrepreatable, randomize_repeatable macros 
      with inline code.

2021 May 16
    Update makefiles to run unit tests in parallel.
    Update makefiles to verify output of unit tests.
    Replace int_macro with inline code.

2021 May 17
    Replace sgn_macro with inline code.

2021 May 18
    Cleanup floatlit_to_floatreg macro, remove AVX code since it's actually
      slower in this case.
    Remove redundant code from floatmem_to_floatreg macro, remove AVX code
      since it's actually slower in this case.
    Explicitly set size of many of the relative jump instructions.
    Cleanup AMD64/localtime.s file, making inadvertanly global symbols local,
      conert labels to local labels, convert all .comm to proper .bss entries.
    Replace floatreg_to_floatmem with inline code.
    Replace floatlit_to_floatreg with inline code.
    Replace freg_to_freg with inline code.
    Fix typo in clean rules.

May 19, 2021
    Create .Lbadxit_msg entry point, use it for simple errors that just print
      a message and exit.
    Replace begin_init_bss, end_init_bss, init_bss_numeric, init_bss_string,
      and drainstdin macros with inline code.
    Replace tabs with spaces in AMD64/fb_date_n.s and AMD64/fb_time_n.s files.

May 20, 2021
    Replace unary_minus macro with inline code.
    Fix typo in Makefile's clean targets.  Had semantic_checks_test instead of
      semantic_checks_test.log by mistake.
    Replace end_start macro with inline code.
    Remove bogus trailing whitespace from assembly language files.
    Replace non-standard comments with standard comments in assembly code.
    Remove AVX code from macros in floatreg_to_array_1D.s,
      floatreg_to_array_2D.s, input_1D_navar_phase2.s, input_2D_navar_phase2.s,
      and input_nvar.s since it's actually slower.
    Move misplaced comments in log10_macro.s, log2_macro.s, and log_macro.s
      files which were intended to be within the macros.
    Update badchar() in scanner3 module to show a line number in verbose mode.

May 21, 2021
    Fix relative jump in push_svar macro of strings.s file.
    Use proper 1-byte NAK, not 8-byte NAK sequence, in init_bss() in
      codegen.c file.
    Convert macros in prologue.s to C code routines in codegen.c file.
    Convert macros in buffer_macros.s to C routines routines in codegen.c file.
    Convert macros in date_macro.s to C routines in codegen.c file.
    Convert macro in ceil_macro.s to C routine in codegen.c file.
    Convert store_svar macro to C routine in codegen.c file.

May 21, 2021
    Convert string_comparison, extended_string_comparison macros to C routines
      in codegen.c file.

May 22, 2021
    Fix jump displacement in exp macro.
    Split sqr_macro.s into sqr_macro.s and badsqrarg.s to avoid code duplication
      of the error handler.
    Improve comments in many assembly language files.

May 23, 2021
    Implement DATE$ and TIME$ string functions.
    Show diff output when there are differences in Makefile.runtests.
    Add P418 test for TIME$.  Like P131, this test requires manual verification.
    Add P419 test for DATE$.  Like P131, this test requires manual verification.
    IF it's bad enough we need dumpregs.o, we need debugging, so enable -g flag
      in BASICC, BASICCS, and BASICCW if dumpregs.o is used.
    Add P420 test for TIME.  This test requires manual verification.
    Add P421 test for DATE.  This test requires manual verification.
    Update main.c -l/-L options to include license information for David Olsen's
      localtime code.
    Update emca55.1 to include license information for David Olsen's localtime
      code (and fix some typos too).
    Avoid a warning from clang static analyzer in scanner3.c file.
    Report more diagnostic information with -V option to ecma55.
    Avoid redundant loads in fb_time_s.s file.
    Avoid redundant loads in fb_date_s.s file.

May 25, 2021
    Fix jumps in dmgay.s file to work without relaxation.
    Fix jumps in floatmem_to_floatreg.s to work without relaxation.
    Fix jumps in binary_power.s to work without relaxation.
    Fix jumps in binary_multiply.s to work without relaxation.
    Fix jumps in binary_divide.s to work without relaxation.

May 27, 2021
    Use inline code instead of calling IP_Macro in truncate_macro.s file.
    Convert IP_macro and FP_Macro to C routines in codegen.c file.

May 29, 2021
    Update binary_power macro to use per-instance labels which are unique.
    Update binary_add macro to use per-instance labels which are unique.
    Update binary_subtract macro to use per-instance labels which are unique.
    Fix bad comments resulting from sloppy cut & paste.
    Update cos_macro to use per-instance labels which are unique.
    Update sin_macro to use per-instance labels which are unique.
    Update tan_macro to use per-instance labels which are unique.
    Update acos_macro to use per-instance labels which are unique.
    Update asin_macro to use per-instance labels which are unique.
    Update cosh_macro to use per-instance labels which are unique.
    Update cot_macro to use per-instance labels which are unique.
    Update csc_macro to use per-instance labels which are unique.
    Update exp_macro to use per-instance labels which are unique.
    Update log_macro to use per-instance labels which are unique.
    Update log2_macro to use per-instance labels which are unique.
    Update log10_macro to use per-instance labels which are unique.
    Update tanh_macro to use per-instance labels which are unique.
    Update mod_macro to use per-instance labels which are unique.
    Update angle_macro to use per-instance labels which are unique.
    Update truncate_macro comments.
    Update tab_macro to use per-instance labels which are unique.
    Update round_macro to use per-instance labels which are unique.
    Update floatmem_to_floatreg to use per-instance labels which are unique.
    Update remainder_macro to use per-instance labels which are unique.

May 30, 2021
    Update array_1D_to_floatreg to use per-instance labels which are unique.
    Update array_2D_to_floatreg to use per-instance labels which are unique.
    Update floatreg_to_array_1D to use per-instance labels which are unique.
    Update floatreg_to_array_2D to use per-instance labels which are unique.
    Update read_navar_1D to use per-instance labels which are unique.
    Update read_navar_2D to use per-instance labels which are unique.
    Update macros in gosub_return to use per-instance labels which are unique.
    Update input_nvar to use per-instance labels which are unique.
    Update read_nvar to use per-instance labels which are unique.
    Make -Wl,-z,notext explicit, not implicit, for gcc links.
    Update beginfor and endfor to use per-instance labels which are unique.
    Update read_svar to use per-instance labels which are unique.

May 31, 2021
    Update ongotostart to use per-instance labels which are unique.
    Update sqr_macro to use per-instance labels which are unique.
    Update conditional_branch to use per-instance labels which are unique.
    Update pushsaddr and popsaddr to use per-instance labels which are unique.

June 1, 2021
    Add -Wl,-z,defs -Wl,-z,relro  -Wl,-z,now -Wl,-z,noexecstack to LDFLAGS.
    Removed AVX support, since simple scalar AVX didn't improve performance.
      Until vectorization is implemented, AVX instructions provide no benefit
      yet add extra complexity and increase testing requirements.
    Update secant to use per-instance labels which are unique.
    Update udf_header to use per-instance labels which are unique.

June 2, 2021
    Convert time_macro to C routine in codegen.c file.
    Convert ongotochoice, ongotoend, and ongotostart macros to C routines in
      codegen.c file.
    Convert return macro to C routine in codegen.c file.
    Convert gosub macro to C routine in codegen.c file.
    Convert exitfor macro to C routine in codegen.c file.

June 3, 2021
    Convert logical_not macro to C routine in codegen.c file.
    Remove redundant label from endfor macro in for_next.s file.
    Rename bol_label to done_label in doforloopend in codegen.c file.
    Convert conditional_branch to C routine in codegen.c file.
    Convert numeric_comparison macro to C routine in codegen.c file.
    Convert calludf macro to C routine in codegen.c file.
    Convert sqr_macro to C routine in codegen.c file.
    Convert sine macro to C routine in codegen.c file.
    Convert cosine macro to C routine in codegen.c file.
    Convert tangent macro to C routine in codegen.c file.
    Convert cotangent macro to C routine in codegen.c file.

June 4, 2021
    Convert secant macro to C routine in codegen.c file.
    Convert cosecant macro to C routine in codegen.c file.
    Convert cosh macro to C routine in codegen.c file.
    Convert sinh macro to C routine in codegen.c file.

June 5, 2021
    Convert tanh macro to C routine in codegen.c file.
    Convert acos macro to C routine in codegen.c file.
    Convert asin macro to C routine in codegen.c file.
    Convert arctangent macro to C routine in codegen.c file.
    Convert log macro to C routine in codegen.c file.
    Convert log2 macro to C routine in codegen.c file.
    Convert log10 macro to C routine in codegen.c file.
    Convert len_macro to C routine in codegen.c file.
    Convert truncate_macro to C routine in codegen.c file.
    Convert round_macro to C routine in codegen.c file.

June 6, 2021
    Convert push_svar to C routine in codegen.c file.
    Convert remainder_macro to C routine in codegen.c file.
    Convert mod_macro to C routine in codegen.c file.
    Convert input_1D_navar_phase2 macro to C routine in codegen.c file.
    Convert input_2D_navar_phase2 macro to C routine in codegen.c file.
    Convert read_navar_1D macro to C routine in codegen.c file.
    Convert read_navar_2D macro to C routine in codegen.c file.

June 7, 2021
    Convert exp macro to C routine in codegen.c file.
    Convert read_nvar macro to C routine in codegen.c file.
    Convert read_svar macro to C routine in codegen.c file.

June 8, 2021
    Convert floatmem_to_floatreg macro to C routine in codegen.c file.
    Convert tab macro to C routine in codegen.c file.
    Convert floatreg_to_array_1D and floatreg_to_array_2D macros to C routines
      in codegen.c file.

Jun 12, 2021
    Fix benign typo in endfor macro in for_next.s file.
    Convert endfor macro to C routine in codegen.c file.

Jun 13, 2021
    Convert beginfor macro to C routine in codegen.c file.
    Convert angle_macro to C routine in codegen.c file.
    Convert input_svar_phase2 to C routine in codegen.c file.
    Convert input_nvar_phase2 to C routine in codegen.c file.
    Convert udf_footer to C routine in codegen.c file.
    Split out badudfarg.s file from udf_macro.s file.
    Convert gosub_return.s to C code in codegen.c file.
    Convert input_nvar.s to C code in codegen.c file.
    Convert input macro to C code in codegen.c file.

Jun 14, 2021
    Convert udf_header to C code in codegen.c file.

Jun 15, 2021
    Convert array_1D_to_floatreg and array_2D_to_floatreg to C routines
      in codegen.c file.

Jun 17, 2021
    Convert pushsaddr and popsaddr to C routines in codegen.c file.
    Convert binary_add macro to C routine in codegen.c file.
    Convert binary_subtract macro to C routine in codegen.c file.

Jan 19, 2021
    Convert binary_multiply macro to C routine in codegen.c file.
    Convert binary_power macro to C routine in codegen.c file.
    Convert binary_divide macro to C routine in codegen.c file.

Jan 20, 2021
    Various cleanups, removed unused global, and fixed comments.
    Update BASICC, BASICCS, & BASICCW to hunt for as like they
      hunt for gold/ld.
    Add BASICC.clang, BASICCS.clang, & BASICCW.clang which work
      like BASICC, BASICCS, & BASICCW but use llvm-mc and ld.lld
      from the clang toolchain to process the ecma55 compiler
      output assembly code.
    Move .LSleef_rempitabdp to rempitabdp.s and remove the 3 identical copies
      from the xcos_u1.s, csin_u1.s, and xtan_u1.s files.

Jan 22, 2021
    Reduce number of printf/puts calls and improve generated comments.

Jan 24, 2021
    Fix bug where '@' was permitted without extensions.  Added new test
      HAM/P422.BAS to check for this.  This bug was reported by Doug Kearns.

Jun 26, 2021
    Make back-tick, backslash, and tilde permitted characters when extensions
      (-X) are endabled.   Add new tests HAM/P423.BAS, HAM/P424.BAS, and
      HAM/P425.BAS to check for these.  This feature was requested by Doug
      Kearns.

Jun 27, 2021
    Add many missing HAM test wide expected output files.
    Ensure line lengths do not exceed 80 characters in NEWS and README files.
    Improve test P218, and create a wide version of the test which has distinct
      output.

Jun 29, 2021
    Fix wide expected output for more tests.
    Enable some wide HAM tests.
    Fix benign typo in NBS test P008.BAS file and its expected output.
    Add expected wide output for NBS tests.
    Update tcc, gcc, and clang Makefiles to add some simple wide testing for
      NBS tests.

July 2, 2021
    Add expected wide output for NBS tests using 32-bit math (-s -w).
    Update tcc, gcc, and clang Makefiles to add more wide testing for NBS tests
      with wide output and 32-bit math (-s -w).
    Apply spelling fixes from Doug Kearns to Learn BASIC book.
    Apply spelling fixes from Doug Kearns to codegen.c file.
    Add TESTING file to explain how to run the self-tests.
    Improve INSTALL instructions, including documenting PIE and LTO flags.
    Reflow paragraphs for 80 columns and make some small clarifications in the
      INTEL_CET.TXT file.
    Clarify the problems with pcc a bit more in the README.pcc file.
    Update NEWS & THANKS to note Doug Kerns' spelling fixes.
    Update hardware & software information in README file.
    Add TODO file.

July 3, 2021
    Begin the Flowcharts appendix in Learn BASIC book by adding a table of all
      flwochart symbols used in the book.
    Fix two underlined characters in ECMA-55.TXT that have somehow remained 
      unnoticed for many, many years.

July 4, 2021
    Add suport for INWIDE=1 variable to Makefile.runtests so it will skip NBS
      test 202 which breaks for BASIC source that exceeds 72 columns.
    Document in INSTALL how to create and test an ecma55 that supports 132
      column source code and generates 132 column output.
    Add diagrams for straight-line code example to the Flowcharts appendix in
      the Learn BASIC book.

July 5, 2021
    Update TODO removing fixed bug and adding new one from Doug Kearns.

July 6, 2021
    Fixed error message when strange characters are encountered by the scanner.
      This was prompted by a bug report from Doug Kearns who noted that the
      error message when he had a horizontal tab in his source code wrongly
      complained that lower-case letters were not allowed.  Added HAM/P426.BAS
      test for that.

July 7, 2021
    Fix error message when DEL character (ASCII 127) is encountered by the
      scanner.

July 13, 2021
    Apply patch from Doug Kearns for a typo on ECMA-55.TXT.

July 16, 2021
    Add flowchart diagrams to Flowcharts appendix.

July 17, 2021
    Complete straight-line and simple if pages in Flowcharts appendix.

July 24, 2021
    Add example code for IF/ELSE, MULTI-WAY BRANCH, WHILE, and DO..WHILE to
      pages in Flowcharts appendix.

July 25, 2021
    Update software versions and compile examples in README.
    Fix EX04 and EX05 examples in Flowcharts appendix.
    Add EX07 and EX08 examples in Flowcharts appendix.
    Add runtime output for EX02, EX03, EX04, EX05, EX07, and EX08 in Flowcharts
      appendix.

July 26, 2021
    Fix impossible dates in this ChangeLog file (blush).
    Something in the Verabtim environment breaks parskip, so reset parskip
      after the last Verbatim on each page where Verbatim is used.
    Replace Simple If demo with a simpler if demo that more literallly
      implements the flowchart.
    Replace If with Else demo with a simpler if demo that more literallly
      implements the flowchart.
    Add If with Else flowchart with flipped condition for Minimal BASIC.
    Replace While Loop demo with a simpler demo.
    Add While Loop flowchart with flipped condition for Minimal BASIC.
    Replace Do..While Loop demo with a simpler demo.

July 31, 2021
    Add note in README about gcc-11.2.0's static analyzer's detected leaks
      in optimizer.c noting they are true but safe to ignore.

August 15, 2021
    Update README tcc git tag.
    Complete flowchart appendix examples, Add Repeat..Until flowchart adjusted
      for Minimal BASIC, fix page layout issues in flowchart appendix.
    Update book Makefile to remove preflight stuff, since it only works on
      Java 8 which is dead.
    Update book source to enable compression.
    Update Makefile to use qpdf to linearize the book's PDF file.

August 22-29, 2021
    Improve the included book by adding 'on page X' to figure references that
      reference figures not on the same page, rewording a few things, fixing
      some opacity issues, and replacing the draft watermark with a better one.
    Update software versions in README to match current situation.
    Add qpdf to README software lists.
    Update NEWS to reflect recent book changes.
    Change version number to 2.40.
