[BACK]Return to FIXES CVS log [TXT][DIR] Up to [local] / src / usr.bin / awk

Diff for /src/usr.bin/awk/FIXES between version 1.6 and 1.7

version 1.6, 1997/08/25 16:17:07 version 1.7, 1999/04/18 17:06:29
Line 26 
Line 26 
 This file lists all bug fixes, changes, etc., made since the AWK book  This file lists all bug fixes, changes, etc., made since the AWK book
 was sent to the printers in August, 1987.  was sent to the printers in August, 1987.
   
 Sep 12, 1987:  Mar 5, 1999:
         Very long printf strings caused core dump;          after hearing from yet another innocent victim, changed
         fixed aprintf, asprintf, format to catch them.          isnumber to is_number to avoid the problem caused by
         Can still get a core dump in printf itself.          freeBSD gratuitously and incorrectly including the name
           isnumber in the standard header file ctype.h.
   
 Sep 17, 1987:          distribution now includes a script for building on a Mac,
         Error-message printer had printf(s) instead of          thanks to Dan Allen.
         printf("%s",s);  got core dumps when the message  
         included a %.  
   
 Oct xx, 1987:  Feb 20, 1999:
         Reluctantly added toupper and tolower functions.          fixed memory leaks in run.c (call) and tran.c (setfval).
         Subject to rescinding without notice.          thanks to Stephen Nutt for finding these and providing the fixes.
   
 Dec 2, 1987:  Jan 13, 1999:
         Newer C compilers apply a strict scope rule to extern          replaced srand argument by (unsigned int) in run.c;
         declarations within functions.  Two extern declarations in          avoids problem on Mac and potentially on Unix & Windows.
         lib.c and tran.c have been moved to obviate this problem.          thanks to Dan Allen.
   
 Mar 25, 1988:          added a few (int) casts to silence useless compiler warnings.
         main.c fixed to recognize -- as terminator of command-          e.g., errorflag= in run.c jump().
         line options.  Illegal options flagged.  
         Error reporting slightly cleaned up.  
   
 May 10, 1988:          added proctab.c to the bundle outout; one less thing
         Fixed lib.c to permit _ in commandline variable names.          to have to compile out of the box.
   
 May 22, 1988:          added calls to _popen and _pclose to the win95 stub for
         Removed limit on depth of function calls.          pipes (thanks to Steve Adams for this helpful suggestion).
           seems to work, though properties are not well understood
           by me, and it appears that under some circumstances the
           pipe output is truncated.  Be careful.
   
 May 28, 1988:  Oct 19, 1998:
         srand returns seed value it's using.          fixed a couple of bugs in getrec: could fail to update $0
         see 1/18/90          after a getline var; because inputFS wasn't initialized,
           could split $0 on every character, a misleading diversion.
   
 June 1, 1988:          fixed caching bug in makedfa: LRU was actually removing
         check error status on close          least often used.
   
 July 2, 1988:          thanks to ross ridge for finding these, and for providing
         performance bug in b.c/cgoto(): not freeing some sets of states.          great bug reports.
         partial fix only right now, and the number of states increased  
         to make it less obvious.  
   
 July 2, 1988:  May 12, 1998:
         flush stdout before opening file or pipe          fixed potential bug in readrec: might fail to update record
           pointer after growing.  thanks to dan levy for spotting this
           and suggesting the fix.
   
 July 24, 1988:  Mar 12, 1998:
         fixed egregious error in toupper/tolower functions.          added -V to print version number and die.
         still subject to rescinding, however.  
   
 Aug 23, 1988:  Feb 11, 1998:
         setting FILENAME in BEGIN caused core dump, apparently          subtle silent bug in lex.c: if the program ended with a number
         because it was freeing space not allocated by malloc.          longer than 1 digit, part of the input would be pushed back and
           parsed again because token buffer wasn't terminated right.
           example:  awk 'length($0) > 10'.  blush.  at least i found it
           myself.
   
 Sep 30, 1988:  Aug 31, 1997:
         Now guarantees to evaluate all arguments of built-in          s/adelete/awkdelete/: SGI uses this in malloc.h.
         functions, as in C;  the appearance is that arguments          thanks to nelson beebe for pointing this one out.
         are evaluated before the function is called.  Places  
         affected are sub (gsub was ok), substr, printf, and  
         all the built-in arithmetic functions in bltin().  
         A warning is generated if a bltin() is called with  
         the wrong number of arguments.  
   
         This requires changing makeprof on p167 of the book.  Aug 21, 1997:
           fixed some bugs in sub and gsub when replacement includes \\.
           this is a dark, horrible corner, but at least now i believe that
           the behavior is the same as gawk and the intended posix standard.
           thanks to arnold robbins for advice here.
   
 Oct 12, 1988:  Aug 9, 1997:
         Fixed bug in call() that freed local arrays twice.          somewhat regretfully, replaced the ancient lex-based lexical
           analyzer with one written in C.  it's longer, generates less code,
           and more portable; the old one depended too much on mysterious
           properties of lex that were not preserved in other environments.
           in theory these recognize the same language.
   
         Fixed to handle deletion of non-existent array right;          now using strtod to test whether a string is a number, instead of
         complains about attempt to delete non-array element.          the convoluted original function.  should be more portable and
           reliable if strtod is implemented right.
   
 Oct 20, 1988:          removed now-pointless optimization in makefile that tries to avoid
         Fixed %c:  if expr is numeric, use numeric value;          recompilation when awkgram.y is changed but symbols are not.
         otherwise print 1st char of string value.  still  
         doesn't work if the value is 0 -- won't print \0.  
   
         Added a few more checks for running out of malloc.          removed most fixed-size arrays, though a handful remain, some
           of which are unchecked.  you have been warned.
   
 Oct 30, 1988:  Aug 4, 1997:
         Fixed bug in call() that failed to recover storage.          with some trepidation, replaced the ancient code that managed
           fields and $0 in fixed-size arrays with arrays that grow on
           demand.  there is still some tension between trying to make this
           run fast and making it clean; not sure it's right yet.
   
         A warning is now generated if there are more arguments          the ill-conceived -mr and -mf arguments are now useful only
         in the call than in the definition (in lieu of fixing          for debugging.  previous dynamic string code removed.
         another storage leak).  
   
 Nov 27, 1988:          numerous other minor cleanups along the way.
         With fear and trembling, modified the grammar to permit  
         multiple pattern-action statements on one line without  
         an explicit separator.  By definition, this capitulation  
         to the ghost of ancient implementations remains undefined  
         and thus subject to change without notice or apology.  
         DO NOT COUNT ON IT.  
   
 Dec 7, 1988:  Jul 30, 1997:
         Added a bit of code to error printing to avoid printing nulls.          using code provided by dan levy (to whom profuse thanks), replaced
         (Not clear that it actually would.)          fixed-size arrays and awkward kludges by a fairly uniform mechanism
           to grow arrays as needed for printf, sub, gsub, etc.
   
 Dec 17, 1988:  Jul 23, 1997:
         Catches some more commandline errors in main.          falling off the end of a function returns "" and 0, not 0.
         Removed redundant decl of modf in run.c (confuses some compilers).          thanks to arnold robbins.
         Warning:  there's no single declaration of malloc, etc., in awk.h  
         that seems to satisfy all compilers.  
   
 Jan 9, 1989:  Jun 17, 1997:
         Fixed bug that caused tempcell list to contain a duplicate.          replaced several fixed-size arrays by dynamically-created ones
         The fix is kludgy.          in run.c; added overflow tests to some previously unchecked cases.
           getline, toupper, tolower.
   
 Apr 9, 1989:          getline code is still broken in that recursive calls may wind
         Changed grammar to prohibit constants as 3rd arg of sub and gsub;          up using the same space.  [fixed later]
         prevents class of overwriting-a-constant errors.  (Last one?)  
         This invalidates the "banana" example on page 43 of the book.  
   
         Added \a ("alert"), \v (vertical tab), \xhhh (hexadecimal),          increased RECSIZE to 8192 to push problems further over the horizon.
         as in ANSI, for strings.  Rescinded the sloppiness that permitted  
         non-octal digits in \ooo.  Warning:  not all compilers and libraries  
         will be able to deal with \x correctly.  
   
 Apr 26, 1989:          added \r to \n as input line separator for programs, not data.
         Debugging output now includes a version date,          damn CRLFs.
         if one compiles it into the source each time.  
   
 Apr 27, 1989:          modified format() to permit explicit printf("%c", 0) to include
         Line number now accumulated correctly for comment lines.          a null byte in output.  thanks to ken stailey for the fix.
   
 Jun 4, 1989:          added a "-safe" argument that disables file output (print >,
         ENVIRON array contains environment: if shell variable V=thing,          print >>), process creation (cmd|getline, print |, system), and
                 ENVIRON["V"] is "thing"          access to the environment (ENVIRON).  this is a first approximation
           to a "safe" version of awk, but don't rely on it too much.  thanks
           to joan feigenbaum and matt blaze for the inspiration long ago.
   
         multiple -f arguments permitted.  error reporting is naive.  Jul 8, 1996:
         (they were permitted before, but only the last was used.)          fixed long-standing bug in sub, gsub(/a/, "\\\\&"); thanks to
           ralph corderoy.
   
         fixed a really stupid botch in the debugging macro dprintf  Jun 29, 1996:
           fixed awful bug in new field splitting; didn't get all the places
           where input was done.
   
         fixed order of evaluation of commandline assignments to match  Jun 28, 1996:
         what the book claims:  an argument of the form x=e is evaluated          changed field-splitting to conform to posix definition: fields are
         at the time it would have been opened if it were a filename (p 63).          split using the value of FS at the time of input; it used to be
         this invalidates the suggested answer to ex 4-1 (p 195).          the value when the field or NF was first referred to, a much less
           predictable definition.  thanks to arnold robbins for encouragement
           to do the right thing.
   
         removed some code that permitted -F (space) fieldseparator,  May 28, 1996:
         since it didn't quite work right anyway.  (restored aug 2)          fixed appalling but apparently unimportant bug in parsing octal
           numbers in reg exprs.
   
 Jun 14, 1989:          explicit hex in reg exprs now limited to 2 chars: \xa, \xaa.
         added some missing ansi printf conversion letters: %i %X %E %G.  
         no sensible meaning for h or L, so they may not do what one expects.  
   
         made %* conversions work.  May 27, 1996:
           cleaned up some declarations so gcc -Wall is now almost silent.
   
         changed x^y so that if n is a positive integer, it's done          makefile now includes backup copies of ytab.c and lexyy.c in case
         by explicit multiplication, thus achieving maximum accuracy.          one makes before looking; it also avoids recreating lexyy.c unless
         (this should be done by pow() but it seems not to be locally.)          really needed.
         done to x ^= y as well.  
   
 Jun 23, 1989:          s/aprintf/awkprint, s/asprintf/awksprintf/ to avoid some name clashes
         add newline to usage message.          with unwisely-written header files.
   
 Jul 10, 1989:          thanks to jeffrey friedl for several of these.
         fixed ref-thru-zero bug in environment code in tran.c  
   
 Jul 30, 1989:  May 26, 1996:
         added -v x=1 y=2 ... for immediate commandline variable assignment;          an attempt to rationalize the (unsigned) char issue.  almost all
         done before the BEGIN block for sure.  they have to precede the          instances of unsigned char have been removed; the handful of places
         program if the program is on the commandline.          in b.c where chars are used as table indices have been hand-crafted.
         Modified Aug 2 to require a separate -v for each assignment.          added some latin-1 tests to the regression, but i'm not confident;
           none of my compilers seem to care much.  thanks to nelson beebe for
           pointing out some others that do care.
   
 Aug 2, 1989:  May 2, 1996:
         restored -F (space) separator          removed all register declarations.
   
 Aug 11, 1989:          enhanced split(), as in gawk, etc:  split(s, a, "") splits s into
         fixed bug:  commandline variable assignment has to look like          a[1]...a[length(s)] with each character a single element.
         var=something.  (consider the man page for =, in file =.1)  
   
         changed number of arguments to functions to static arrays          made the same changes for field-splitting if FS is "".
         to avoid repeated malloc calls.  
   
 Aug 24, 1989:          added nextfile, as in gawk: causes immediate advance to next
         removed redundant relational tests against nullnode if parse          input file. (thanks to arnold robbins for inspiration and code).
         tree already had a relational at that point.  
   
 Oct 11, 1989:          small fixes to regexpr code:  can now handle []], [[], and
         FILENAME is now defined in the BEGIN block -- too many old          variants;  [] is now a syntax error, rather than matching
         programs broke.          everything;  [z-a] is now empty, not z.  far from complete
           or correct, however.  (thanks to jeffrey friedl for pointing out
           some awful behaviors.)
   
         "-" means stdin in getline as well as on the commandline.  Apr 29, 1996:
           replaced uchar by uschar everwhere; apparently some compilers
           usurp this name and this causes conflicts.
   
         added a bunch of casts to the code to tell the truth about          fixed call to time in run.c (bltin); arg is time_t *.
         char * vs. unsigned char *, a right royal pain.  added a  
         setlocale call to the front of main, though probably no one  
         has it usefully implemented yet.  
   
 Oct 18, 1989:          replaced horrible pointer/long punning in b.c by a legitimate
         another try to get the max number of open files set with          union.  should be safer on 64-bit machines and cleaner everywhere.
         relatively machine-independent code.          (thanks to nelson beebe for pointing out some of these problems.)
   
         small fix to input() in case of multiple reads after EOF.          replaced nested comments by #if 0...#endif in run.c, lib.c.
   
 Jan 5, 1990:          removed getsval, setsval, execute macros from run.c and lib.c.
         fix potential problem in tran.c -- something was freed,          machines are 100x faster than they were when these macros were
         then used in freesymtab.          first used.
   
 Jan 18, 1990:          revised filenames: awk.g.y => awkgram.y, awk.lx.l => awklex.l,
         srand now returns previous seed value (0 to start).          y.tab.[ch] => ytab.[ch], lex.yy.c => lexyy.c, all in the aid of
           portability to nameless systems.
   
 Feb 9, 1990:          "make bundle" now includes yacc and lex output files for recipients
         fixed null pointer dereference bug in main.c:  -F[nothing].  sigh.          who don't have yacc or lex.
   
         restored srand behavior:  it returns the current seed.  Aug 15, 1995:
           initialized Cells in setsymtab more carefully; some fields
           were not set.  (thanks to purify, all of whose complaints i
           think i now understand.)
   
 May 6, 1990:          fixed at least one error in gsub that looked at -1-th element
         AVA fixed the grammar so that ! is uniformly of the same precedence as          of an array when substituting for a null match (e.g., $).
         unary + and -.  This renders illegal some constructs like !x=y, which  
         now has to be parenthesized as !(x=y), and makes others work properly:  
         !x+y is (!x)+y, and x!y is x !y, not two pattern-action statements.  
         (These problems were pointed out by Bob Lenk of Posix.)  
   
         Added \x to regular expressions (already in strings).          delete arrayname is now legal; it clears the elements but leaves
         Limited octal to octal digits; \8 and \9 are not octal.          the array, which may not be the right behavior.
         Centralized the code for parsing escapes in regular expressions.  
         Added a bunch of tests to T.re and T.sub to verify some of this.  
   
 Jun 26, 1990:          modified makefile: my current make can't cope with the test used
         changed struct rrow (awk.h) to use long instead of int for lval,          to avoid unnecessary yacc invocations.
         since cfoll() stores a pointer in it.  now works better when int's  
         are smaller than pointers!  
   
 Aug 24, 1990:  Jul 17, 1995:
         changed NCHARS to 256 to handle 8-bit characters in strings          added dynamically growing strings to awk.lx.l and b.c
         presented to match(), etc.          to permit regular expressions to be much bigger.
           the state arrays can still overflow.
   
 Oct 8, 1990:  Aug 24, 1994:
         fixed horrible bug:  types and values were not preserved in          detect duplicate arguments in function definitions (mdm).
         some kinds of self-assignment. (in assign().)  
   
 Oct 14, 1990:  May 11, 1994:
         fixed the bug on p. 198 in which it couldn't deduce that an          trivial fix to printf to limit string size in sub().
         argument was an array in some contexts.  replaced the error  
         message in intest() by code that damn well makes it an array.  
   
 Oct 29, 1990:  Apr 22, 1994:
         fixed sleazy buggy code in lib.c that looked (incorrectly) for          fixed yet another subtle self-assignment problem:
         too long input lines.          $1 = $2; $1 = $1 clobbered $1.
   
 Nov 2, 1990:          Regression tests now use private echo, to avoid quoting problems.
         fixed sleazy test for integrality in getsval;  use modf.  
   
 Jan 11, 1991:  Feb 2, 1994:
         failed to set numeric state on $0 in cmd|getline context in run.c.          changed error() to print line number as %d, not %g.
   
 Jan 28, 1991:  Jul 23, 1993:
         awk -f - reads the program from stdin.          cosmetic changes: increased sizes of some arrays,
           reworded some error messages.
   
 Feb 10, 1991:          added CONVFMT as in posix (just replaced OFMT in getsval)
         check error status on all writes, to avoid banging on full disks.  
   
 May 6, 1991:          FILENAME is now "" until the first thing that causes a file
         fixed silly bug in hex parsing in hexstr().          to be opened.
         removed an apparently unnecessary test in isnumber().  
         warn about weird printf conversions.  
         fixed unchecked array overwrite in relex().  
   
         changed for (i in array) to access elements in sorted order.  Nov 28, 1992:
         then unchanged it -- it really does run slower in too many cases.          deleted yyunput and yyoutput from proto.h;
         left the code in place, commented out.          different versions of lex give these different declarations.
   
 May 13, 1991:  May 31, 1992:
         removed extra arg on gettemp, tempfree.  minor error message rewording.          added -mr N and -mf N options: more record and fields.
           these really ought to adjust automatically.
   
 Jun 2, 1991:          cleaned up some error messages; "out of space" now means
         better defense against very long printf strings.          malloc returned NULL in all cases.
         made break and continue illegal outside of loops.  
   
 Jun 30, 1991:          changed rehash so that if it runs out, it just returns;
         better test for detecting too-long output record.          things will continue to run slow, but maybe a bit longer.
   
 Jul 21, 1991:  Apr 24, 1992:
         fixed so that in self-assignment like $1=$1, side effects          remove redundant close of stdin when using -f -.
         like recomputing $0 take place.  (this is getting subtle.)  
   
 Jul 27, 1991:          got rid of core dump with -d; awk -d just prints date.
         allow newline after ; in for statements.  
   
 Aug 18, 1991:  Apr 12, 1992:
         enforce variable name syntax for commandline variables: has to          added explicit check for /dev/std(in,out,err) in redirection.
         start with letter or _.          unlike gawk, no /dev/fd/n yet.
   
 Sep 24, 1991:          added (file/pipe) builtin.  hard to test satisfactorily.
         increased buffer in gsub.  a very crude fix to a general problem.          not posix.
         and again on Sep 26.  
   
   Feb 20, 1992:
           recompile after abortive changes;  should be unchanged.
   
   Dec 2, 1991:
           die-casting time:  converted to ansi C, installed that.
   
   Nov 30, 1991:
           fixed storage leak in freefa, failing to recover [N]CCL.
           thanks to Bill Jones (jones@cs.usask.ca)
   
   Nov 19, 1991:
           use RAND_MAX instead of literal in builtin().
   
 Nov 12, 1991:  Nov 12, 1991:
         cranked up some fixed-size arrays in b.c, and added a test for          cranked up some fixed-size arrays in b.c, and added a test for
         overflow in penter.  thanks to mark larsen.          overflow in penter.  thanks to mark larsen.
   
 Nov 19, 1991:  Sep 24, 1991:
         use RAND_MAX instead of literal in builtin().          increased buffer in gsub.  a very crude fix to a general problem.
           and again on Sep 26.
   
 Nov 30, 1991:  Aug 18, 1991:
         fixed storage leak in freefa, failing to recover [N]CCL.          enforce variable name syntax for commandline variables: has to
         thanks to Bill Jones (jones@skorpio.usask.ca)          start with letter or _.
   
 Dec 2, 1991:  Jul 27, 1991:
         die-casting time:  converted to ansi C, installed that.          allow newline after ; in for statements.
   
 Feb 20, 1992:  Jul 21, 1991:
         recompile after abortive changes;  should be unchanged.          fixed so that in self-assignment like $1=$1, side effects
           like recomputing $0 take place.  (this is getting subtle.)
   
 Apr 12, 1992:  Jun 30, 1991:
         added explicit check for /dev/std(in,out,err) in redirection.          better test for detecting too-long output record.
         unlike gawk, no /dev/fd/n yet.  
   
         added (file/pipe) builtin.  hard to test satisfactorily.  Jun 2, 1991:
         not posix.          better defense against very long printf strings.
           made break and continue illegal outside of loops.
   
 Apr 24, 1992:  May 13, 1991:
         remove redundant close of stdin when using -f -.          removed extra arg on gettemp, tempfree.  minor error message rewording.
   
         got rid of core dump with -d; awk -d just prints date.  May 6, 1991:
           fixed silly bug in hex parsing in hexstr().
           removed an apparently unnecessary test in isnumber().
           warn about weird printf conversions.
           fixed unchecked array overwrite in relex().
   
 May 31, 1992:          changed for (i in array) to access elements in sorted order.
         added -mr N and -mf N options: more record and fields.          then unchanged it -- it really does run slower in too many cases.
         these really ought to adjust automatically.          left the code in place, commented out.
   
         cleaned up some error messages; "out of space" now means  Feb 10, 1991:
         malloc returned NULL in all cases.          check error status on all writes, to avoid banging on full disks.
   
         changed rehash so that if it runs out, it just returns;  Jan 28, 1991:
         things will continue to run slow, but maybe a bit longer.          awk -f - reads the program from stdin.
   
 Nov 28, 1992:  Jan 11, 1991:
         deleted yyunput and yyoutput from proto.h;          failed to set numeric state on $0 in cmd|getline context in run.c.
         different versions of lex give these different declarations.  
   
 Jul 23, 1993:  Nov 2, 1990:
         cosmetic changes: increased sizes of some arrays,          fixed sleazy test for integrality in getsval;  use modf.
         reworded some error messages.  
   
         added CONVFMT as in posix (just replaced OFMT in getsval)  Oct 29, 1990:
           fixed sleazy buggy code in lib.c that looked (incorrectly) for
           too long input lines.
   
         FILENAME is now "" until the first thing that causes a file  Oct 14, 1990:
         to be opened.          fixed the bug on p. 198 in which it couldn't deduce that an
           argument was an array in some contexts.  replaced the error
           message in intest() by code that damn well makes it an array.
   
 Feb 2, 1994:  Oct 8, 1990:
         changed error() to print line number as %d, not %g.          fixed horrible bug:  types and values were not preserved in
           some kinds of self-assignment. (in assign().)
   
 Apr 22, 1994:  Aug 24, 1990:
         fixed yet another subtle self-assignment problem:          changed NCHARS to 256 to handle 8-bit characters in strings
         $1 = $2; $1 = $1 clobbered $1.          presented to match(), etc.
   
         Regression tests now use private echo, to avoid quoting problems.  Jun 26, 1990:
           changed struct rrow (awk.h) to use long instead of int for lval,
           since cfoll() stores a pointer in it.  now works better when int's
           are smaller than pointers!
   
 May 11, 1994:  May 6, 1990:
         trivial fix to printf to limit string size in sub().          AVA fixed the grammar so that ! is uniformly of the same precedence as
           unary + and -.  This renders illegal some constructs like !x=y, which
           now has to be parenthesized as !(x=y), and makes others work properly:
           !x+y is (!x)+y, and x!y is x !y, not two pattern-action statements.
           (These problems were pointed out by Bob Lenk of Posix.)
   
 Aug 24, 1994:          Added \x to regular expressions (already in strings).
         detect duplicate arguments in function definitions (mdm).          Limited octal to octal digits; \8 and \9 are not octal.
           Centralized the code for parsing escapes in regular expressions.
           Added a bunch of tests to T.re and T.sub to verify some of this.
   
 Jul 17, 1995:  Feb 9, 1990:
         added dynamically growing strings to awk.lx.l and b.c          fixed null pointer dereference bug in main.c:  -F[nothing].  sigh.
         to permit regular expressions to be much bigger.  
         the state arrays can still overflow.  
   
 Aug 15, 1995:          restored srand behavior:  it returns the current seed.
         initialized Cells in setsymtab more carefully; some fields  
         were not set.  (thanks to purify, all of whose complaints i  
         think i now understand.)  
   
         fixed at least one error in gsub that looked at -1-th element  Jan 18, 1990:
         of an array when substituting for a null match (e.g., $).          srand now returns previous seed value (0 to start).
   
         delete arrayname is now legal; it clears the elements but leaves  Jan 5, 1990:
         the array, which may not be the right behavior.          fix potential problem in tran.c -- something was freed,
           then used in freesymtab.
   
         modified makefile: my current make can't cope with the test used  Oct 18, 1989:
         to avoid unnecessary yacc invocations.          another try to get the max number of open files set with
           relatively machine-independent code.
   
 Apr 29, 1996:          small fix to input() in case of multiple reads after EOF.
         replaced uchar by uschar everwhere; apparently some compilers  
         usurp this name and this causes conflicts.  
   
         fixed call to time in run.c (bltin); arg is time_t *.  Oct 11, 1989:
           FILENAME is now defined in the BEGIN block -- too many old
           programs broke.
   
         replaced horrible pointer/long punning in b.c by a legitimate          "-" means stdin in getline as well as on the commandline.
         union.  should be safer on 64-bit machines and cleaner everywhere.  
         (thanks to nelson beebe for pointing out some of these problems.)  
   
         replaced nested comments by #if 0...#endif in run.c, lib.c.          added a bunch of casts to the code to tell the truth about
           char * vs. unsigned char *, a right royal pain.  added a
           setlocale call to the front of main, though probably no one
           has it usefully implemented yet.
   
         removed getsval, setsval, execute macros from run.c and lib.c.  Aug 24, 1989:
         machines are 100x faster than they were when these macros were          removed redundant relational tests against nullnode if parse
         first used.          tree already had a relational at that point.
   
         revised filenames: awk.g.y => awkgram.y, awk.lx.l => awklex.l,  Aug 11, 1989:
         y.tab.[ch] => ytab.[ch], lex.yy.c => lexyy.c, all in the aid of          fixed bug:  commandline variable assignment has to look like
         portability to nameless systems.          var=something.  (consider the man page for =, in file =.1)
   
         "make bundle" now includes yacc and lex output files for recipients          changed number of arguments to functions to static arrays
         who don't have yacc or lex.          to avoid repeated malloc calls.
   
 May 2, 1996:  Aug 2, 1989:
         removed all register declarations.          restored -F (space) separator
   
         enhanced split(), as in gawk, etc:  split(s, a, "") splits s into  Jul 30, 1989:
         a[1]...a[length(s)] with each character a single element.          added -v x=1 y=2 ... for immediate commandline variable assignment;
           done before the BEGIN block for sure.  they have to precede the
           program if the program is on the commandline.
           Modified Aug 2 to require a separate -v for each assignment.
   
         made the same changes for field-splitting if FS is "".  Jul 10, 1989:
           fixed ref-thru-zero bug in environment code in tran.c
   
         added nextfile, as in gawk: causes immediate advance to next  Jun 23, 1989:
         input file. (thanks to arnold robbins for inspiration and code).          add newline to usage message.
   
         small fixes to regexpr code:  can now handle []], [[], and  Jun 14, 1989:
         variants;  [] is now a syntax error, rather than matching          added some missing ansi printf conversion letters: %i %X %E %G.
         everything;  [z-a] is now empty, not z.  far from complete          no sensible meaning for h or L, so they may not do what one expects.
         or correct, however.  (thanks to jeffrey friedl for pointing out  
         some awful behaviors.)  
   
 May 26, 1996:          made %* conversions work.
         an attempt to rationalize the (unsigned) char issue.  almost all  
         instances of unsigned char have been removed; the handful of places  
         in b.c where chars are used as table indices have been hand-crafted.  
         added some latin-1 tests to the regression, but i'm not confident;  
         none of my compilers seem to care much.  thanks to nelson beebe for  
         pointing out some others that do care.  
   
 May 27, 1996:          changed x^y so that if n is a positive integer, it's done
         cleaned up some declarations so gcc -Wall is now almost silent.          by explicit multiplication, thus achieving maximum accuracy.
           (this should be done by pow() but it seems not to be locally.)
           done to x ^= y as well.
   
         makefile now includes backup copies of ytab.c and lexyy.c in case  Jun 4, 1989:
         one makes before looking; it also avoids recreating lexyy.c unless          ENVIRON array contains environment: if shell variable V=thing,
         really needed.                  ENVIRON["V"] is "thing"
   
         s/aprintf/awkprint, s/asprintf/awksprintf/ to avoid some name clashes          multiple -f arguments permitted.  error reporting is naive.
         with unwisely-written header files.          (they were permitted before, but only the last was used.)
   
         thanks to jeffrey friedl for several of these.          fixed a really stupid botch in the debugging macro dprintf
   
 May 28, 1996:          fixed order of evaluation of commandline assignments to match
         fixed appalling but apparently unimportant bug in parsing octal          what the book claims:  an argument of the form x=e is evaluated
         numbers in reg exprs.          at the time it would have been opened if it were a filename (p 63).
           this invalidates the suggested answer to ex 4-1 (p 195).
   
         explicit hex in reg exprs now limited to 2 chars: \xa, \xaa.          removed some code that permitted -F (space) fieldseparator,
           since it didn't quite work right anyway.  (restored aug 2)
   
 Jun 28, 1996:  Apr 27, 1989:
         changed field-splitting to conform to posix definition: fields are          Line number now accumulated correctly for comment lines.
         split using the value of FS at the time of input; it used to be  
         the value when the field or NF was first referred to, a much less  
         predictable definition.  thanks to arnold robbins for encouragement  
         to do the right thing.  
   
 Jun 29, 1996:  Apr 26, 1989:
         fixed awful bug in new field splitting; didn't get all the places          Debugging output now includes a version date,
         where input was done.          if one compiles it into the source each time.
   
 Jul 8, 1996:  Apr 9, 1989:
         fixed long-standing bug in sub, gsub(/a/, "\\\\&"); thanks to          Changed grammar to prohibit constants as 3rd arg of sub and gsub;
         ralph corderoy.          prevents class of overwriting-a-constant errors.  (Last one?)
           This invalidates the "banana" example on page 43 of the book.
   
 Jun 17, 1997:          Added \a ("alert"), \v (vertical tab), \xhhh (hexadecimal),
         replaced several fixed-size arrays by dynamically-created ones          as in ANSI, for strings.  Rescinded the sloppiness that permitted
         in run.c; added overflow tests to some previously unchecked cases.          non-octal digits in \ooo.  Warning:  not all compilers and libraries
         getline, toupper, tolower.          will be able to deal with \x correctly.
   
         getline code is still broken in that recursive calls may wind  Jan 9, 1989:
         up using the same space.  [fixed later]          Fixed bug that caused tempcell list to contain a duplicate.
           The fix is kludgy.
   
         increased RECSIZE to 8192 to push problems further over the horizon.  Dec 17, 1988:
           Catches some more commandline errors in main.
           Removed redundant decl of modf in run.c (confuses some compilers).
           Warning:  there's no single declaration of malloc, etc., in awk.h
           that seems to satisfy all compilers.
   
         added \r to \n as input line separator for programs, not data.  Dec 7, 1988:
         damn CRLFs.          Added a bit of code to error printing to avoid printing nulls.
           (Not clear that it actually would.)
   
         modified format() to permit explicit printf("%c", 0) to include  Nov 27, 1988:
         a null byte in output.  thanks to ken stailey for the fix.          With fear and trembling, modified the grammar to permit
           multiple pattern-action statements on one line without
           an explicit separator.  By definition, this capitulation
           to the ghost of ancient implementations remains undefined
           and thus subject to change without notice or apology.
           DO NOT COUNT ON IT.
   
         added a "-safe" argument that disables file output (print >,  Oct 30, 1988:
         print >>), process creation (cmd|getline, print |, system), and          Fixed bug in call() that failed to recover storage.
         access to the environment (ENVIRON).  this is a first approximation  
         to a "safe" version of awk, but don't rely on it too much.  thanks  
         to joan feigenbaum and matt blaze for the inspiration long ago.  
   
 Jul 23, 1997:          A warning is now generated if there are more arguments
         falling off the end of a function returns "" and 0, not 0.          in the call than in the definition (in lieu of fixing
         thanks to arnold robbins.          another storage leak).
   
 Jul 30, 1997:  Oct 20, 1988:
         using code provided by dan levy (to whom profuse thanks), replaced          Fixed %c:  if expr is numeric, use numeric value;
         fixed-size arrays and awkward kludges by a fairly uniform mechanism          otherwise print 1st char of string value.  still
         to grow arrays as needed for printf, sub, gsub, etc.          doesn't work if the value is 0 -- won't print \0.
   
 Aug 4, 1997:          Added a few more checks for running out of malloc.
         with some trepidation, replaced the ancient code that managed  
         fields and $0 in fixed-size arrays with arrays that grow on  
         demand.  there is still some tension between trying to make this  
         run fast and making it clean; not sure it's right yet.  
   
         the ill-conceived -mr and -mf arguments are now useful only  Oct 12, 1988:
         for debugging.  previous dynamic string code removed.          Fixed bug in call() that freed local arrays twice.
   
         numerous other minor cleanups along the way.          Fixed to handle deletion of non-existent array right;
           complains about attempt to delete non-array element.
   
 Aug 9, 1997:  Sep 30, 1988:
         somewhat regretfully, replaced the ancient lex-based lexical          Now guarantees to evaluate all arguments of built-in
         analyzer with one written in C.  it's longer, generates less code,          functions, as in C;  the appearance is that arguments
         and more portable; the old one depended too much on mysterious          are evaluated before the function is called.  Places
         properties of lex that were not preserved in other environments.          affected are sub (gsub was ok), substr, printf, and
         in theory these recognize the same language.          all the built-in arithmetic functions in bltin().
           A warning is generated if a bltin() is called with
           the wrong number of arguments.
   
         now using strtod to test whether a string is a number, instead of          This requires changing makeprof on p167 of the book.
         the convoluted original function.  should be more portable and  
         reliable if strtod is implemented right.  
   
         removed now-pointless optimization in makefile that tries to avoid  Aug 23, 1988:
         recompilation when awkgram.y is changed but symbols are not.          setting FILENAME in BEGIN caused core dump, apparently
           because it was freeing space not allocated by malloc.
   
         removed most fixed-size arrays, though a handful remain, some  July 24, 1988:
         of which are unchecked.  you have been warned.          fixed egregious error in toupper/tolower functions.
           still subject to rescinding, however.
   
 Aug 21, 1997:  July 2, 1988:
         fixed some bugs in sub and gsub when replacement includes \\.          flush stdout before opening file or pipe
         this is a dark, horrible corner, but at least now i believe that  
         the behavior is the same as gawk and the intended posix standard.  July 2, 1988:
         thanks to arnold robbins for advice here.          performance bug in b.c/cgoto(): not freeing some sets of states.
           partial fix only right now, and the number of states increased
           to make it less obvious.
   
   June 1, 1988:
           check error status on close
   
   May 28, 1988:
           srand returns seed value it's using.
           see 1/18/90
   
   May 22, 1988:
           Removed limit on depth of function calls.
   
   May 10, 1988:
           Fixed lib.c to permit _ in commandline variable names.
   
   Mar 25, 1988:
           main.c fixed to recognize -- as terminator of command-
           line options.  Illegal options flagged.
           Error reporting slightly cleaned up.
   
   Dec 2, 1987:
           Newer C compilers apply a strict scope rule to extern
           declarations within functions.  Two extern declarations in
           lib.c and tran.c have been moved to obviate this problem.
   
   Oct xx, 1987:
           Reluctantly added toupper and tolower functions.
           Subject to rescinding without notice.
   
   Sep 17, 1987:
           Error-message printer had printf(s) instead of
           printf("%s",s);  got core dumps when the message
           included a %.
   
   Sep 12, 1987:
           Very long printf strings caused core dump;
           fixed aprintf, asprintf, format to catch them.
           Can still get a core dump in printf itself.
   
   

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7