This file is the *brief* version of what has been changed; see
ChangeLog.alpha, ChangeLog.beta, and ChangeLog.old/ for all the gory
details.

(pre-v22.2 changes)
      * new options:
	. GET_CHAR_IS_BUFFERED
	. USE_32BIT_ADDRESSING
	. NUM_EXTERNAL_CMDS
      * features:
	. new efun: socket_status()
	. classes can be inherited multiple times so long as the definitions
	  are consistent
	. implemented MUD mode external ports
	. improved warnings for code with no side effects
	. resolve() can now take a function pointer as the second arg
	. filter() can now iterate over each character of a string
	. LPC programs can now exceed 64k in size with USE_32BIT_ADDRESSING
	. deep_inventory() and living() now default to this_object()
	. cp() now errors like mv() when source and dest are the same
	. -> syntax now uses call_other() simul_efun if one exists
	. function tables are now always compressed
	. '&' is now a synonym for 'ref' when COMPAT_32 is defined
	. added #warn and #error preprocess directives
	. when no address server connection exists, an attempt will be made
	  once every fifteen minutes to establish one.
	. (s)printf() is now re-entrant, so it can be used from the
	  object_name() master apply.
	. on most platforms, localtime() efun adds a new element to the array
	  it returns indicating daylight savings time
	. the 3rd argument to tell_room() can now be an object
	. when COMPAT_32 is defined, closeurep becomes an alias for functionp
	. added extensive socket statistics and network_stats() as a new
	  contrib efun to retrieve these stats.
	. socket_bind() now takes an optional 3rd argument that is the address
	  to bind to rather than INADDR_ANY or the 'mud ip' config address.
	. socket_address() now takes an optional 2nd argument to get the local
	  address for a socket
	. all objects now 'inherit' the class definitions from the simul_efun
	  object if there are any.
	. restructured PACKAGE_DB to make it easier to add more database
	  support
	. added support for MySQL in addition to MSQL to PACKAGE_DB
	. compile_object() master apply now gets a second argument indicating
	  whether or not a clone is being done
	. compile_object() master apply now gets arguments passed to new()
	  when cloning a virtual object as they'd be passed to create() in a
	  real object.
	. implemented rfc 1184 (telnet linemode option) to be support running
	  on port 23.
      * parser enhancements:
	. new error ERR_MANY_PATHS
	. new modifier ':c' that means just choose the first one found
	. two object rules are examined more thoroughly.  This changes the
	  semantics for direct_ and indirect_ applies.  They can now be called
	  with 0s as the object-type arguments, but it is now guaranteed that
	  they will be called with filled object arguments at least once
	  during the processing of a rule.
	. added optional 3rd and 4th arguments to parse_sentence().  The 3rd
	  is an array of objects to use in the parse instead of the inventory
	  of the user's environment.  Nested arrays indicate containment.  The
	  4th is mapping of string -> object which can be used to supply
	  nicknames and similar things.
      * COMPAT BUSTERs:
	. dump_socket_status() efun is gone, see socket_status()
	. SERVER_IP is no longer a compile-time option.  it is now a runtime
	  configuration option called "mud ip"
	. when COMPAT_32 is defined with PACKAGE_UIDS, the uid assigned to a
	  new object is the euid of the current object rather than the uid of
	  the current object.
	. when loading/cloning a virtual object, mudlib stats, uid/euid and
	  privs are now properly reset with the newly assigned object name.

(pre-v22.1 changes)
      * new options:
	. NO_SNOOP
      * features:
	. support for token quoting in the preprocessor (#x)
	. 'array' is used in error messages with ARRAY_RESERVED_WORD is on
	. added array |
	  Works analogously to &:
	  ({ 1, 2, 3 }) & ({ 2, 4 }) = ({ 2 })
	  ({ 1, 2, 3 }) | ({ 2, 4 }) = ({ 1, 2, 3, 4 })
	. both &= and |= now work with arrays
	. The requirement that a snooper must be interactive has been lifted
	  (though this isn't particularly useful unless RECIEVE_SNOOP)
	  objects may now snoop other users (logging output to logs,
	  output redirection, etc)
	. #'foo is now the same as (: foo :) when COMPAT_32 is defined
	. added a 'portbind' program; see v22.1a7 for details
	. MudOS now checks if file descriptor #6 is a valid socket when
	  it starts up; if it is, it is used as a login port.
	. support for binding a specific IP number for machines with more
	  than one
	. It is now legal to use a class member of something of type mixed,
	  as long as it is unambigous (e.g. foo->x is ok as long as only
	  one class in scope has a member named 'x', or if 'x' is in the
	  same position in all classes in scope)
	. Unused local variables now generate warnings
	. function arguments no longer need to have names (and not naming
	  them inhibits 'unused' warnings)
	. more than one access specifier (e.g. 'public private protected')
	  generates a warning
	. If SENSIBLE_MODIFIERS is defined, then:
	  (1) 'static' no longer exists, and is replaced by 'nosave' and
	      'protected'
	  (2) 'public' no longer means what it used to; it now means the
	      default visibility
	. if REF_RESERVED_WORD is defined, the 'ref' can be used to declare
	  arguments to functions to be by reference instead of by value.
	  example:
	  int foo(int ref i) {
	    i++;
    	  }
	  void create() {
	    int y = 1; foo(ref y); write(y);
	  }
	  prints '2'.  Note that ref is required both in the declaration
	  and the call.
	. added an 'efun_defined' pseudo function to the preprocessor.  It
	  works just like 'defined', except that it looks up efuns.  Example:
	  #if !efun_defined(snoop)
	     write("snoop efun not available.\n");
	  #endif
      * bug fixes:
	. hidden object fixes for present() and environment()
	. token pasting and preprocessor macro expansion
      * COMPAT_BUSTERs:
	. log_error() filenames have a leading /
	. tail() efun was removed; compat simul in compat/simuls
	. #include <...> now no longer searches based on
	  relative paths; #include "..." still does.
	. ORIGIN_CALL_OUT is now ORIGIN_INTERNAL; in addition
	  most driver callbacks which do not use hard coded function names
	  also use ORIGIN_INTERNAL (add_action, socket callbacks, etc).
	  The practical fallout of this is that such routines may be static,
	  but *not* private.
	. COMPAT_BUSTER: modifiers from a '<modifier>:' declaration only
	  affect declarations which have no modifiers of their own.  I.e.
	  'private: nomask x;' no longer declares x to be private
	
(pre-v22 changes)
      * new options:
	. NO_RESETS
	. added a COMPAT_32 option, which tweaks a few things to allow	
	  some 3.2/3.2.1 code to be ported easier
	. added REVERSIBLE_EXPLODE_STRING
	. added CALLOUT_HANDLES; see v22a28 for details.  Allows a specific
	  call_out to be tracked and removed instead of having to specify
	  the function name.
	. Added a FLUSH_OUTPUT_IMMEDIATELY option, which disables buffering
	  of output.  Useful for debugging.
      * features:
	. It is legal to define variables in foreach() statements, e.g.:
	  foreach (string x, object y in z)
	. various indexing error messages are now more information
	. many changes/improvements to the parsing package
	. added a package for running/communicating with external commands
	  (tar, gzip, etc)  See the v22a15 entry for details.
	. carriage returns are now considered white space by the parser,
	  so DOS style files don't cause errors
	. new(class X) can now specify values for the members.  Examples:
	  class foo { int x; string y; }
	  class foo f1 = new(class foo, x : 5);
	  class foo f2 = new(class foo, y : "foo", x : 1);
	. added named_livings() contrib efun, which is faster than livings(),
	  but only finds livings which have called set_living_name().
	. bind(f, ob) now always succeeds if f is already bound to ob
	. function(...) { ... } is now rebindable if it does not reference
	  local functions or global variables
	. the message of message() may be of any type
	. replaceable now can be optionally passed a second array argument
	  which is a list of function names to ignore; if the second arg
	  is left out, ({ "create" }) is assumed, which gives the old
	  behavior.
	. made the message queue flushing a bit lazier which should result
	  in smoother output and larger packet sizes
	. added a flush_messages(void | object) efun for manually flushing
	  message queues (during a long thread of execution, for example)
	. \012 octal codes and \x1e hex codes are now allowed in string
	  and character constants
	. added a classp() efun
	. fixed sort_array() to work correctly when called from inside
	  itself
	. added repeat_string() contrib efun.  Example:
	  repeat_string("-=", 10) == "-=-=-=-=-=-=-=-"
	. added a memory_summary() contrib efun, which returns a mapping
	  of with entries: map["program name"]["variable name"]
	  Each entry contains the number of bytes used by that variable in
	  all active instances of that program.  The size of shared structures
	  is divided up evenly between all values that reference it.
	. terminal_colour() now has two more optional args; the 3rd is the
	  width to wrap at, and the 4th is the indent for lines after the
	  first
	. characters in user input with the 8th bit set are no longer ignored
	. function_exists(string, object, flag); if flag is nonzero, private
	  and static functions are checked too.
	. SIGUSR2 will now cause the driver to eval out immediately
      * optimizations:
	. sprintf() is about 3 times faster than it used to be
	. optimized present(), terminal_colour()
	. call_out() is now O(1), not O(n)
	. function tables are sorted, so they can be searched in O(log n)
	  time instead of O(n).  Speeds up call_other(), function_exists(),
	  etc.
      * memory usage:
	. fixed leaks in call_out(), illegal arguments to call_stack(),
	  errors in id()
	. function overhead is now 15 bytes per function defined and 5 bytes
	  per function inherited, not 14 bytes for both.  Typically cuts
	  function memory usage in half or more, also:
	. if COMPRESS_FUNCTION_TABLES is defined, the function tables are
	  compressed even further (estimated compression: 2-3x) at the cost
	  of slowing down function calls slightly (seems to be <10%)
	. variable information is now stored only in the program in which
	  the variable is defined; estimated compression ratio is about
	  10:1 on typical libs
      * bug fixes:
	. testsuite now compiles with almost any option settings
	. sprintf()'s %O handles recursive structures gracefully
	. many fixes to center/left justification in sprintf
	. function arguments and variables no longer may be of type 'void'
	. leading and trailing whitespace in the config file is now ignored
	. switch (...) { case 0: function() { break; }; },
	  while (...) { function() { continue; }; },
	  while (...) { e = catch { break; } }
	  and similar pathological code is no longer allowed.
	. message() now behaves correctly when called from inside 
	  recieve_message() [i.e. recursively]
	. a number of changes to $() notation.  See v22a38.
	. several fixes to sscanf(): format strings ending in %, %% as
	  the last pattern
	. fixed socket_close() to not close sockets immediately when data
	  is buffered internally; this adds a new socket state 'CLOSING'
	  which will transparently change to 'CLOSED' when the data has
	  been written.
	. cleaned up the disk full logic a bit; also added error checking
	  on the fclose(), which apparently the call that usually errors.
	  should prevent .o files from getting lost when the disk is full
	. fixed read_file() to return "" and not 0 for zero-length files
	. sending a SIGUSR2 to the mud will now cause it to eval out; temporary
	  fix until eval_cost gets rewritten.
	. sscanf() no longer errors on some legal uses of %%
      * crasher fixes:
	. removing heart_beats during a heart_beat()
	. lots in the parsing package
	. extremely long tables in sprintf(), negative field widths, etc,
	  etc, etc
	. recursive structures in error traces
	. function_owner()
	. unterminated @ and @@ blocks
	. some too deep recursion errors
	. mapping composition
	. quite a number of other rare ones
      * COMPAT_BUSTERS:
	. previous_object() is now 0 in heart_beat()
	. the scope of variables defined in for() and foreach() is inside
	  the loop ONLY; it used to extend to the end of the function
	. "%^" is no longer considered "special" by sprintf(); see
	  terminal_colour() if you want to wrap strings containing it.
	. removed break_string(), process_string(), process_value().
	  See compat/simuls/ for replacements
	. call_stack(3) now uses strings, like origin()
	. call_out_info() elements now have only 3 elements,
	  not 4; this is due to argument handling restructuring, as well
	  as mild security concerns for reference types.  Maybe an option
	  will be added to get the arguments at a latter date if it is
	  desired.
	. all inherits must now precede all global variable definitions
	. Added slashes to the front of many object/program names.  The most
	  noteworthy are: deep_inherit_list(), inherit_list(), call_stack(),
	  names passed to author_file(), domain_file(), privs_file(),
	  creator_file(), a few error messages and tons of debug messages
	. The third argument passed to valid_override() now has a leading
	  slash
	. The filename passed to compile_object() has a leading slash

Thu May 30 14:35:06 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
      * bumped version number to v21.7
      * new options:
        . NO_ENVIRONMENT
      * features:
        . destruct()'ing the master or simul_efun object now fails if a
          new copy can't be loaded, leaving the old copy loaded
        . copy() supports classes
        . the simul_efun object is optional; simply don't specify one in
          the runtime config file if you don't want one
        . outside functions, "modifier:" can be used to make all
          functions, variables, and inherits automatically include
          "modifier" until the next such definition.  For example,
          "private static:" makes all definitions that follow it both
          private and static
        . ed ranges can now extend past the end of the file; any line #
          larger than the last one refers to the last line
        . foreach (int in string)
        . preliminary Windows 95 support, though I'd recommend using
          a v22 beta instead
      * new warnings:
        . return type doesn't match prototype
      * contrib efuns:
        . query_ip_port(), for figuring out which of the external ports
          an interactive object connected to (the port number is also
          passed to connect; this causes it to be stored internally)
      * optimizations:
        . better code generation for some loops, empty blocks in if
          statements, x[y..<1], elimination of expressions with no
          side effects
        . sprintf() is significantly faster
        . most mapping operations are significantly faster
      * memory usage:
        . mapping memory is down about 20%
      * bug fixes:
        . A number of bugs which allowed private functions to be called
          were removed
        . problems with comments in long #define's
        . various problems with the 'array' keyword
        . testsuite works again
        . literally hundreds of fixes to the parsing package, though
          if you use it I'd suggest using a v22 beta instead.
        . ranlib is run on subdirectory archives, for systems that need it
        . using the values of (void) efuns in some cases
        . ... syntax varargs expansion in some cases
        . several bug fixes in macro expansion
        . @@ blocks work again
        . a few crasher and leak fixes in parse_command()
        . query_verb() returns the entire verb even when only part of it
          was matched again
        . SIGFPE and SIGPIPE no longer take down the driver on some
          systems
        . case 0 now works in string switches again
        . (int constant)/(real constant) is a real, not an int
        . the telnet option code is more robust to protect against buggy
          telnet clients
        . a number of other fixes for rare crashers
      * COMPAT_BUSTERS:
        . the each() efun is gone.  Use foreach().
      * minor changes:
        . objects with environments may be cloned
      * LPC->C:
        . valid_compile_to_c() in the master object now controls the use
          of generate_source()
        . RUNTIME_LOADING works if your system supports dlopen()/dlsym();
          see ChangeLog.alpha:v21.7a1 for details

Fri Oct  6 18:58:01 EDT 1995 (tim@handel.princeton.edu (Beek))
	* bumped version number to v21.6
	* LPC->C support:
	  . annonymous functions, function pointers, and foreach now work
	  . classes now work
	  . faster string constants
	  . a number of small fixes to code generation
	* compiler changes:
	  . warning for negative constants not meaning indexing from end
	  . internal representation was changed to support better
	        optimization
	  . warning for (: string constant :)
	* optimizations:
	  . calling of efuns is significantly faster
	  . faster calling of efun function pointers
	  . last use of local variables when #pragma optimize is on
	* removed support for:
	  . #pragma efun
	  . contrib/compat.c
	* features:
	  . variables() has an optional flag like functions()
	  . new contrib parsing package added
	  . implode(array, function) now takes a third arg (the value to
	    start with)
	  . more extensive configure checks
	  . 'array' is now a legal type, meaning 'mixed *'.  See the
	    v21.6a8 ChangeLog for more info
	  . catch { ... } and time_expression { ... } are now legal  
	  . if a function is defined as: void foo(int x, array args...)
	    then all the additional arguments after x are put in args
	  . regexp(string, string) now exists, returns 1/0
	  . remove_call_out() [no args] now removes ALL of this_object()'s
	    call_outs
	* crasher fixes:
	  . remove_interactive()
	  . illegal indexes to array constants, e.g ({ 1, 2 })[5]
	  . regexp() with 8 bit chars when host char is signed
	  . two in parse_command()
	  . don't go down on floating point exceptions on systems which
	    crash when a SIGFPE is raised
	* bug fixes:
	  . replace_string() behavior in some cases
	  . compilation fixes for DEC alpha
	  . ranlib is run on the archives for systems that need it.
	* COMPAT BUSTERs:
	  . origin() and typeof() now return strings.  If you used the
	    defines in the driver includes, that should be fine
	  . filter_mapping() now passes the value as the second element,
	    just like map_mapping()
	
Sun Jul 30 10:14:15 EDT 1995 (tim@handel.princeton.edu (Beek))
	* bumped version number to v21.5
	* features:
	  . a ... operator which expands an array into a list of arguments
	  . %(regexp) format for sscanf()
	  . added implode(array, function)
	  . added foreach()
	  . added \a and \e for bell and escape
	  . a 'local_options' file can be used to override options.h
	* fixed crashers in:
	  . empty sefun objects
	  . non-existent socket callbacks
	* bugfixes in:
	  . type errors including classes
	  . consecutive tokens in sscanf() like %s%%
	  . calling set_heart_beat() from from a heart_beat
	  . LPC->C switch statements
	  . MUD mode sockets
	  . unterminated @ and @@ blocks
	  . load_object()
	  . better configure checks
	  . pluralize()
	* optimizations:
	  . array call_other()
	  . replace_string()
	  . calling function pointers
	  . replace_program()
	  . heart_beats
	  . member_array(), string compares, string hashing
	  . more efficient handling of errors
	* contrib efuns:
	  . remove_interactive(), variables(), heart_beats()
	* COMPAT_BUSTERS:
	  . the apply() efun is gone.  There is a simul for it in compat/simuls
	  . Now, if process_input() returns a non-zero number, no further
	    processing takes place.  Also, returning zero does not disable
	    the function
	  . this_player() is now zero in get_save_file_name(); a new 2nd
	    argument is the player
	  . 'foreach' and 'in' are now reserved words
	  . map_mapping now passes the key and the value
	  . It is now illegal to any of the following from a
	    verb action which return zero:
	        call remove_action()
	        destruct an object which defines commands
	        move an object which defines commands
	        move a living object
	  . the following efuns now return strings and print nothing to
	    this_player():
	        malloc_status(), cache_stats(), lpc_info(), mud_status(),
		dump_file_descriptors(), program_info(),
		debug_info(), dump_socket_status()
  	
Sun Jun 11 03:33:40 EDT 1995 (tim@handel.princeton.edu (Beek))
	* bumped version number to v21.4
	* features:
	  . a file named 'local_options' with the defines from options.h in
	    it will override options.h.  You will be warned if new options
	    that don't exist in your local_options file have been added.
	  . cleaned up the data written to stdout/debug.log.  The same
	    info now goes to both.
	  . the logon() function is no longer required.
	  . sizeof(class) now returns the number of members
	  . '\a' is now bell, '\e' is the escape char
	  . foreach (<var> [, <var>] in <expr) <statement or block>
	    for looping over arrays/mappings
	  . memmove() checks done by edit_source -configure
	  . implode(mixed *, function).  See the v21.4a6 changelog for
	    some uses/examples
	  . '%x' can be used for hexidecimal in sscanf()
	  . w->x[y] = z, w->x[y]++ and w->x[y]-- are legal now
	* fixed crashers in:
	  . people going linkdead in ed
	  . add_action parsing when objects move/get destructed
	  . calling non-existent socket callbacks
	  . simul efuns objects with no simuls
	  . socket_address()
	  . calling function pointers in swapped objects
	  . x->foo compilation errors when x was not a class
	* new contrib efuns:
	  . string variables(object), object *heart_beats(), 
	    int remove_interactive(object)
	* memory leak fixes:
	  . an array in mudlib error tracebacks
	  . throw()
	  . [0..n] array ranges on ref 1 arrays
	  . functionals keeping programs from freeing
	* bugfixes:
	  . previous_object(-1) after an lfun or functional pointer; an
	    extra object is no longer mistakenly inserted
	  . numerous fixes to the pluralize contrib efun
	  . load_object() doesn't error if the file doesn't exist now,
	    like the documentation claims
	  . fixed MUD mode sockets on machines where sizeof(long) > 4
	  . window sizes with widths or heights of 255
	  . '/' is now a legal log file directory
	  . wierd error messages for unterminated @ or @@ blocks
	  . fixed a bug that truncated arrays/mappings on MUD mode sockets
	  . replace_program() objects now look like clones again (clonep)
	  . workarround for a GNU make 'feature' that caused 'can't find
	    rule for obj/grammar.tab.o' errors
	  . str[n..] returns "" when n > strlen(str)
	* optimizations:
	  . replace_string(), member_array(), string comparisons, hashing
	  . shared string deallocations
	* COMPAT BUSTERS:
	  . The following efuns now return their output as strings:
	    malloc_status(), cache_stats(), lpc_info(), mud_status(),
	    dump_file_descriptors(), program_info(), debug_info(),
	    dump_socket_status()
	  . this_player() no longer exists in some places where it
	    previously did
	  . It is now illegal to any of the following from a verb action
	    which return zero: call remove_action(), destruct an object
	    which defines commands, move an object which defines commands,
	    move a living object
	  . 'foreach' and 'in' are reserved words
	  . map_mapping() now passes both the key and the value
	  . get_safe_file_name() is now get_save_file_name(string fname,
	    object who); this_player() is now zero in it
	  . previous_object() is now zero in add_action()'ed functions;
	    this fixes several crashers
	  
Wed May 17 14:54:59 EDT 1995 (tim@handel.princeton.edu (Beek))
	* bumped version number to v21.3
	* features:
	  . new ed option 'verbose'
	  . optional flag to functions() contrib efun gives more extensive
	    info
	  . this_user() is now equivalent to this_player()
	* fixed crashers in:
	  . self-destructing objects with call_outs
	  . call_outs to function pointers
	  . reload_object() on a swapped object
	  . reclaim_objects() and function pointers with no arguments
	* bugfixes:
	  . problems with too wide columns in sprintf's column mode
	  . calling reclaim_objects() no longer corrupts mappings whose
	    keys contain destructed objects
	  . classes now save/restore correctly
	  . various fixes to the configure scripts
	  . fixed non-typechecked functions to not give type errors
	  . TELOPT_NAWS fixed to handle zero bytes correctly
	  . fixed a bug in adding an int to a string
	* optimizations:
	  . explode() and implode()
	  . counted strings
	  . eliminated switches over types for all refcounted types
	  . shared string frees
	  . read_buffer()
	* COMPAT BUSTERS:
	  . ALWAYS_SAVE_COMPILED_BINARIES removed
	  . map_mapping() now passes the value, not the key, to the
	    function pointer

Fri Apr 28 20:24:42 EDT 1995 (tim@handel.princeton.edu (Beek))
	* bumped version number to v21.2
	* features:
	  . packages are now specified in options.h; #define
	    PACKAGE_ANYTHING in options.h will cause packages/anything.c
	    to be compiled in
	  . classes can contain instances of themselves now
	  . NAWS window size negotiation: the callback is 
	    window_size(int width, int height)
	  . to compile MudOS, now type './build.MudOS' and follow the
	    instructions
	  . support for multiple login ports, as well as binary/ascii
	    ports as well as telnet; see ChangeLog.alpha
	  . sockets are now initialized before preload() is called so
	    socket objects can preload normally
	* Two new contrib efuns
	  . store_variable/fetch_variable
	* fixed crashers in:
	  . pointers to void valued efuns
	  . anonymous function pointers
	  . set_hide()
	* bugfixes:
	  . fixed a bug where 'continue' would some jump to the wrong
	    point
	  . typeof() efun
	  . a strsrch() hanger
	* optimizations:
	  . assignment to locals
	  . pushing of call_out arguments
	  . return zero, loop conditions, logical expressions
	  . multiple pushes
	* source changes:
	  . merged intermediate programs that edit the source code into one
	    main program
	* COMPAT BUSTERS:
	  . privs_file() is now called to get new privs for virtual
	    objects; see ChangeLog.alpha for full details
	  . a bunch of LPC predefines which weren't of the __FOO__
	    variety changed names; see ChangeLog.alpha for a list
	  . 'efun', 'new', and 'asm' are no longer valid variable/function
	    names

Thu Mar 30 14:56:48 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped version number to v21.1
	* three new contrib efuns:
	  . int replaceable(object) - returns 1 if the object consists only
	           of a create() function and inherited functions
	  . void program_info() - prints out memory usage of programs
	           divided up by sections
	  . string upper_case() - similar to lower_case(), but ... :)
	* fixed crashers in: 
	  . the compilation of switch tables to C code
	  . duplicate objects in the hash table with LPC objects 
	    precompiled and DEBUG on
	  . type errors in division
	  . the inherits() efun
	  . call_out(function, ...)
	  . regular expressions that end in '\'
	* optimized: 
	  . some of the compile time type checking
	  . void valued efuns (they are all guaranteed to return zero now
	                       as well)
          . mapping operations.  A custom allocator was added, which
	    should decrease mem overhead as well
	  . changed program ref counts to shorts, saving 2 bytes/program
	* removed:
	  . errorp() efun
	  . RUNTIME_LOADING in options.h
	* bug fixes:
	  . a division error message that indicated multiplication
	  . a problem with the types of locals in anonymous functions
	  . a few errors in smalloc accounting
	  . type checking involving classes
	  . it is no longer to illegal to overload a function to have a
	    different number of arguments
	* porting fixes for CX/UX 6.1, IRIX 5.3, amiga
	* COMPAT_BUSTERs:
	  . removed OLD_HEARTBEAT, OLD_COMMAND, IGNORE_STRICT_PRAGMA
	  . removed STRICT_TYPE_CHECKING; use PRAGMA_STRICT_TYPES
	  . removed ALWAYS_SAVE_BINARIES; use PRAGMA_SAVE_BINARIES
	  . move_object() only takes one arg; change
	    move_object(this_object(), foo) to move_object(foo)

Fri Mar 10 11:03:09 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped version number to v21
        * fixes up to v21.1b4 included.
	--- Robocoder
	* fixed smalloc accounting stats, and small leak in small block handler
	* more amiga fixes, and compilation tweaks
	* fixed a memory leak in parse_command()
	* save size of buffer in binaries.c to cut down on allocations a bit
	* a few more fixes to clear_bit() and set_bit()
	* fixed the Amiga port to handle problems with read() and
	  write() macros more cleanly
	* fixed some socket problems by changing recv() to read() in
	  the socket handler
	* fixed a problem that would sometimes allocate a string table
	  that was twice as big as requested
	* fixed some OSF/1 V3.0 cc compile problems with source code
	  formatting
	* fixed Alpha crasher with intersect_array() and alist_sort()
	  -- reported by Dana
	* fixed debugmalloc portability problems for AIX - reported by
	  Curax; and undef'd SBRK_OK automatically for AIX
	* added prototypes that were missing in places
	* added some include files to fix some implicit definitions
	* removed some more unused locals
	* otable.c: copied Beek's power of 2 HTABLE_SIZE test for checking
	  OTABLE_SIZE; increased the max number of characters to hash from
	  20 to 40, to handle longer pathnames (FWIW, this was 100 in
	  0.9.20); cleaned up show_otable_status() to be more consistent
	  with other stats reporting functions
	* eoperators.c: copied Beek's f_sscanf() return value fix to
	  f_parse_command(); also removed a redundant check_for_destr()
	* array.h: removed an unused #include (of itself? *boggle*)
	* parse.c: bumped refcounts to a couple of arrays before calls to
	  splice_array(), and rearranged some code to avoid an uninit'd
	  svalue
	* Makefile, GNUmakefile: to find <sys/rusage.h> on Solaris (5.4),
	  add -I/usr/bsdinclude to OSFLAGS
	* malloc.h, smalloc.c: fixed for SBRK_OK defined; and some changes
	  for the Alpha
	* some Amiga tweaks so that the driver actually works there =)
	* fixed a crasher in parse_command()
	--- Beek
	* COMPAT_BUSTER: objects that call replace_program() no longer
	  return true to clonep() or virtualp().
	* fixed a crasher in binaries (program name is now a shared
	  string)
	* fixed some memory accounting errors
	* sockets are now closed before calling shutdown, since the
	  operating system doesn't always close them right
	* reorganized the logic of parse.c in places; fixed uncountably
	  many memory leaks; added a stack of globals so that it doesn't
	  leak even in the event of an error
	* fixed a leak involving destructing users with notify_fail()
	  messages pending
	* fixed a ref count bug in domain/author_stats()
	* fixed a problem/crasher in compiling files which can't be opened
	* added a non-varargs version of add_message(); profiling shows
	  that the telnet support is slow without it; generally optimized
	  and cleaned up sending of telnet codes; use add_vmessage() if
	  you need varargs support.
	* fixed a crasher in referencing local functions/globals from
	  within a functional in some contexts
	* fixed a crasher in string < string
	* removed some (unused?) prototypes from lint.h
	* fixed a crasher in prototypes in the simul_efun object with no
	  corresponding procedure
	* fixed a bug in the disassembler with non-bindable functionals
	* removed outdated MALLOC defines from GNUMakefile
	* fixed the error message for reverse sorts of arrays to indicate
	  that arrays of arrays are legal
	* fixed some serious bugs in clear_bit() and set_bit() introduced
	  while optimizing
	* fixed crashers in illegal arguments to snoop(); cyclic etc
	* fixed compilation with TRACE defined
	* fixed compilation problems with NO_SOCKETS; awaiting better
	  Amiga patches from Robo :)
	* fixed a bug in show_otable_status() that would print information
	  to this_player()/stdout when memory_info() is used
	* fixed the new ed efuns to return "" rather than 0 when there is
	  no output.
	* un-ANSI-ized the source for archaic/lame/braindead compilers
	  that only understand K&R
	* as part of the above, made the dispatching in generate.c use
	  defines and not token pasting; also optimized a bit
	* fixed a typo in lex.c that could crash on extremely long lines
	* fixed the case for the -d option with DEBUG off
	* COMPAT_BUSTER: previous_object() is now zero when crash() is
	  called in the master object
	* expanded the error messages printed by the creator_file() master
	  apply; revised it to use apply_master_ob()
	* fixed a memory leak in the 'table' feature of sprintf ('%#5s')
	* set the tag of linenumbers correctly when they are swapped back in
	* removed prototypes for some removed functions, some unused
	  locals and globals
	* added a 'block_or_semi: error' rule to the grammar so that 
	  the back half of the function definition rule is always called
	  This is important since the function name is saved on the yacc
	  stack and will otherwise be leaked
	* fixed the switch grammar to accept any constant string
	  expression using () + and concatenation as case labes, same
	  goes for inherit file names
	* fixed some definitions to use Pn()
	* small ed tweaks:
	  . hitting return to get the next line at the end of a file
	    now prints 'End of file.' and not 'Bad line range.'
	  . 3,5 is now the same as 3,5p instead of just printing line 3
	* COMPAT_BUSTER: slight change to the behavior of having two
	  variables with the same name in an object:
	  old one is made static only if the new one is not hidden
	  (so inheriting an object with private foo; wont make the
	  variable in the current object static), also if the new
	  one is hidden, dont make it the 'foo' variable for this
	  object.  Problem reported by Angus.
	* fixed #undef OLD_ED compilation
	* fixed a crasher in ed_start()
	* modified a few references to non-existent files "efuns.h" and
	  "exec.h"
	* fixed a crasher in the optimization of icode (didn't know about
	  F_SHORT_STRING)
	* fixed a bug that caused numbers returned by sscanf() to often
	  be undefined/null
	* fixed a memory leak in constant mappings with duplicate keys
	* compilation fix for DEBUGMALLOC but not DEBUGMALLOC_EXTENSIONS
	* commented out an unused variable in smalloc.c; also cast sbrk()
	  to (char *) since I don't know where to find the prototype and
	  AIX complains ...
	* fixed in_edit() to work with #undef OLD_ED
	* optimized/made the snoop() code more sensible
	* fixed a crasher in call_out(function, ...)
	* disabled the report_holes debugging code
	* updated the generate_source() efun for symmetry's efun changes
	* fixed a bug in loop optimizations:
	   for (...; local_var < integer_constant; ...)
	   when local_var was *not* of type int.
	* removed the mkdir prototype for SunOS 4.1.x; evidentally it
	  exists in a standard include now? (blame Dseven if it doesnt)
	* fixed the GNUmakefile to create mallocwrapper.c
	* put the clear_state() back into backend.c for now
	* fixed the source to actually use the BINARIES define; it
	  was mistakenly using SAVE_BINARIES
	* fixed a memory leak in ed regular expressions
	* fixed array->foo() to set origin() correctly
	* fixed a crasher in locals left behind by errors
	* fixed some really odd (and inefficient) logic in address server
	  callbacks; this implements the multiple query on the same
	  address fix from 0.8.35 more sanely.
	* Added mallocwrapper.c to the GNUmakefile
	* fixed a memory leak in array ranges that return ({ })
	  (array that was indexed was leaked)
	* slight optimization to array addition
	* fixed a memory leak in array intersection (intermediate table)
	* fixed a memory leak in reg_assoc() (regexps not freed)
	* fixed a memory leak in PRIVS (not freed when ob destructed)
	* fixed a few memory leaks in errors in regular expressions
	* in check_memory(), count the shared strings in the ip number
	  table, count FP_FUNCTIONAL | FP_NOT_BINDABLE as a functional,
	  count refs inside of function pointers, count refs from input_to
	  and get_char, print out contents of arrays that are leaked,
	  count references in swapped objects
	* fixed undefinedp() and nullp() to return defined and non-null
	  answers, respectively
	* ( string ) and string + string are legal in case statements
	  now/again, respectively.
	* fixed compilation problems with PROFILE_FUNCTIONS on
	* fixed a crasher in set_this_player()
	* fixed compilation with NEW_FUNCTIONS off
	* fixed a compilation problem with NO_ADD_ACTION and
	  THIS_PLAYER_IN_CALL_OUT
	* fixed a bunch of compilation warnings from gcc re: inline functions
	* Fixed replace_program to not crash if called in an object
	  with expression function pointers.  Global variables and
	  functions can still cause problems tho.
	* COMPAT_BUSTER: the values of funtionp() no longer use origin.
	  use /include/function.h.  Now also returns info as to whether
	  the fp is bindable, and whether it's owner has been dested
	* added: function bind(function, object)
	  returns a function pointer that behaves the same as the one
	  that was passed to it, except the new function pointer belongs
	  to the object passed to bind.  Security is handled through
	  int valid_bind(object binder, object old_owner, object new_owner)
	  (master apply)
	* fixed a bug that would dest any user that sent more than 2k
	  of data to the mud without a pause (pasting into ed, etc)
	* fixed some cast problems in the switch code
	* fixed binaries and string switch to work on machines with 8
	  byte pointers (DEC Alpha)
	* added in the v20.26b3-4.diffs since whoever released them didn't
	  include them in an alpha release and I forgot to add them to
	  mine ...
	* extra arguments passed to new (clone_object) are passed along
	  to create() of the clone.
	* fixed the put_* defines to work as single statements
	* fixed several bugs in the new ed() functionality
	* made reset_object(foo, 0) and reset_object(foo, 1) separate
	  functions
	* added help for '/' and '?' in ed
	* fixed a crasher in save_ed_buffer()
	* added about 15 more different error messages to ed so it's a bit
	  more friendly
	* added a new interface for ed(), which is used if OLD_ED is not
	  defined in options.h
	  . Three new efuns replace ed():
	    string ed_start(string | void, int | void) - start a new ed
	           session on file file.  ed_start(foo, 1) means use 
		   restricted mode.  Only one ed session may be started
		   per object.
	    string ed_cmd(string) - send the command line to ed
	    int query_ed_mode() - returns:
	         0 - the current object is at a normal ed prompt (':')
		-1 - the current object isn't in ed
		-2 - the current object is at the more prompt in the
		     middle of help
		>0 - the object is at a prompt for a line.  The number
		     is the line number.
	  . The string result of ed_cmd() and ed_start() is the output
	    that would have been sent to the user
	  . The mudlib is responsible for setting the user's prompt
	    (see query_ed_mode())
	* added an NO_ADD_ACTION define which has the following effects:
	  . adds an efun: set_this_player()
	  . removes many efuns: 
	      add_action(), remove_action(), query_verb(), 
	      command(), commands(), enable_commands(), disable_commands(),
	      living(), set_living_name(), livings(), find_living(),
	      find_player()
	  . based on the above, the only way to handle user input is
	    through the process_input() apply; but this is better than
	    having add_action(..., "", 1)
	  . the efuns that need to know if an object is living (say,
	    tell_room, shout) now send messages to any object that
	    defines a catch_tell() function.
	  . note that NO_ANSI has no effect b/c it happens after
	    process_input is called
	  . %l removed from parse_command()
	* added a NO_WIZARDS define.  combined with the following defines
	  it has the following effects:
	  . if MUDLIB_ERROR_HANDLER is undefined:
	    all users are wizards (get verbose error messages)
	  . if NO_MUDLIB_STATS is undefined:
	    for the purposes of mudlib stats, no one is a wizard
	    (the 'moves' field includes everyone)
	  . if RESTRICTED_ED is defined:
	    everyone is a wizard (defaults to unrestricted mode)
	    the mudlib should explicitly start ed in restricted mode
	    if this is needed
	* added call_out(function, ...)
	* added apply(function, mixed *) which allows a variable number
	  of arguments to be passed to the function
        --- Symmetry
	* Fixed a possible crasher with #pragma show_error_context
	* Correctly adjusted total array size and mudlib stats
	  for slice_array with ref 1 arrays
        *** Since v21a3 ***
        * Fixed a bug when some efun names are also used as names for
          local vars
        * Allow $(expression) to be a valid indexable lvalue, i.e.
          $(m)[5] = 3 is valid
        * Fixed a crasher involving Illegal LHS errors
        * Don't call clear_state() within the backend loop
        * Allowed
          #define FOO\
          12
          where the \ is right after the macro identifier
        * Added a missing check for stack overflow during an apply
          call using a ref 1 array for e.g.
        * New efuns : unique_mapping(), filter_mapping()
        * optimized slice_array()
        * Some bug fixes to apply()
	* Fixed a constant-folding optimization bug which gave
	  erroneous results for simple subtraction as in 11 - 2
        --- Robocoder
        * Fixed a bug in lex.c concerning array blocks

Sat Jan 21 20:25:44 EST 1995 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.26
	* fixed a problem that would sometimes claim the maximum include
	  depth was exceeded
	* fixed the tags on a bunch of memory allocations
	* removed a memory leak in function overloading warnings
	* fixed ref count problems/crashers in move_object()/tell_room()
	* fixed a crasher in the illegal use of private variables
	* added buffer and function support to sameval(), this means
	  functions and buffers compare equal to themselves for the
	  purposes of unique_array() and also match themselves as
	  mapping keys
	* added function and buffer support to svalue_to_int(); this makes
	  buffers and functions as mapping keys more efficient
	* == and != can now be used to tell if two buffers or functions
	  are in fact the same buffer/function
	* removed debug_message_svalue(); unused and obviously a throwback
	  to Larsian days
	* Solaris compilation tweaks from Robocoder:
	  . gcc defines SunOS_5 so we don't have to
	  . M_ERROR is used; used SPRINTF_ERROR() instead
	* Fixed the contrib efuns to compile again
	* Added some Linux compilation fixes received from marius (?)
	* removed a redundant apply to #global_init#
	* Fixed a compilation problem with call___INIT
	* Fixed a crasher using the 128th thru 255th string constant
	  in an object
	* Fixed a crasher in $() outside function pointers
	* Fixed warnings for clashes between functions inherited at
	  different branches to not be printed if the function is
	  overloaded, or either of the inherited functions is private.
	* Fixed nomask to give errors correctly regardless of inheritance
	  order
	* Fixed a bug in member_array() that caused member_array(x, "")
	  to give an error
	* Fixed the undefined function error message to not give a
	  redeclaration error if the function is defined later
        * Fix a crasher on evaluation of anonymous functions in an
	  inherited program
	* Fixed a crasher in make_range_node
	* added map(string, ...) works just like map_array, except it
	  works on the characters that make up the string.  If the return
	  value is not an integer or is zero, that character is left
	  unchanged.
	* removed the ancient ref count checking code
        * the -d option is now only available when the driver is compiled
          with DEBUG on
        * added add_action( function, string ), updated commands() to
          return "<function>" for function pointer commands
        * added input_to( function ) and get_char( function )
        * fixed the inherit from multiple branches warning o actually work
        * fixed a bug in inheriting nomask functions
        * fixed a few problems with nested calls to expression or
          functional function pointers, and dangling of pointers when
          the associated program objects swap.
	* fixed a ref count bug in string constants for string cases
	* added check_memory(1) which also prints out a summary of all
	  allocated memory
	* changed shared string ref count debugging code to allow tracking
	  of a particular string
	* several changes to DEBUGMALLOC:
	  . changed the tag numbers to be meaningful
	  . use temporary tag info to find leaked blocks with the
	    memory_check() efun (available with DEBUGMALLOC_EXTENSIONS)
	  . added magic numbers to start and end of blocks to catch
	    corrupted blocks
	  . added code to check all ref counts and allocated blocks
	* changed program names to be shared strings
	* changed call_other cache entry names for missing functions
	  to be shared strings
	* Fixed a memory leak in (s)printf which leaked 8 bytes per %O
	  and per (null)
	* converted swap.c to use DXALLOC and FREE
	* added ALLOCATE, CALLOCATE, RESIZE, RESIZE_VECTOR defines to
	  simplify code; note that CALLOCATE does *not* zero the memory
	* move compilation info about functions to a stack so they can
	  be pushed so we can do anonymous functions
	* added support for pass-by-value to function pointers.  The
	  syntax is $(expression), where "expression" will be run when
	  the function pointer is made, not when it is evaluated.
	  Note the difference between (: this_object() :) and
	  (: $(this_object()) :)
	* added anonymous functions.  The syntax is:
	   function( <argument list> ) { <code> }
	   for example:
	   create() {
	     function f;

	     f = function(int x) {
	       int i;
	       for (i = 0; i < x; i++) { write(i+""); }
	     };
	     evaluate(f, 10);
	   }
	* fixed a few bugs/crashers regarding the number 0x80000000
	--- Symmetry:
	*** Since v20.26a5 ***
        * Check the type of 3rd argument passed to regexp, optimized
          match_regexp
        * Free some unused memory, added some %pragmas in make_func
        * Rewrote the automatic echo_line to be more robust, added
          check for starting a new compiler case before ending the
          previous when echo_line mode is on and fixed some line number
          bugs associated with reading from buffered input in
          make_func
        * The compiler return type of the efun call_other is now
          TYPE_ANY if CAST_CALL_OTHERS is not defined
        * If __bsdi__ is defined, don't define HAS_STDARG_H in
          portability.h
        * Introduced range lvalues and limited the possible lvalues
          syntactically
        * Introduced ranging/indexing from the end
        * Added some missing checks for division by 0 or 0.0
        * L_BASIC_TYPE now covers all basic types in grammar.pre
        * Removed some unused fields in YYSTYPE
        * Local variables now have proper (block) scope
	* Switch grammar is more restrictive, but make more sense
	* Don't include getpeername and shutdown prototypes in lint.h
	  for bsdi
        * Optimized the array allocation is get_svalue_trace() for
	  trace information on the topmost control stack 
	* Fixed crasher in get_inherit_index
	* Included port.h in port.c to fix the random() bug again for
	  AIX
	* Fix crasher/memory leak in sprintf when buffer size is 
	  overflowed (in some cases, the fix actually amounts to
	  truncation of the input string near the end of the buffer)
        * Optimized read_file() a little bit more
        * Fixed restore_string and restore_hash_string to work for
	  AIX 3.1.5 (bug reported by Chuck@IdeaExchange)
	* Added an options.h define OLD_RANGE_BEHAVIOR for string/buffer
	  range values with negative indexes to mean counting from the 
	  end
	* Added a doc 'substructures' describing the new lvalue,
	  indexing and ranging features
	* Generate the opcode F_BREAK_POINT only on DEBUG mode
	* Fixed a crasher when a prototype is used before inheriting
	  a function of the same name when that function is overloaded
	  by inheritance again later
	* Optimized the addition of argument type information during
	  compile time
        *** Since v20.26a7 ***
	* Implement the restore_string change (apparently I forgot it
	  in v20.26a5 even though it was done in restore_hash_string)
	* Small optimization to byte insertion for function pointer
	  construction at compile time 
	* Minimal jump threading for a && b && c and a || b || c is 
	  always supported at compile-time
	* Fixed the compile-time assigned return type of a ? b : c
        * Optimized the handling of break and continue jumps in compile
	  time, and removed the compiler stack
	* Fixed a typo in passing a default of 1 for efun function
	  pointers during runtime
        * COMPAT BUSTER: No longer allow foo::bar() to work if foo 
	  is actually only part the ending of an inherited program 
	  whose name can be e.g. "/.../abcfoo.c" 
	* COMPAT BUSTER: No longer allow foo::bar() to work if foo
	  is inherited later than when the function was called
	* Some small changes to the substructures doc
        * Removed the runtime pushing of nulls for local variables
	  defined within blocks
	* explicit calls to inherited functions (i.e. foo::bar()) no 
	  longer create a new function in the current function table
        * Slight optimization to !x
        * Less opcodes generated for F_LOOP_COND optimization of
	  while or for loops
	* Introduced F_SHORT_STRING as a first attempt at getting less
	  program size
	* Fast ___INIT calls and checks for ___INIT's existence in
	  inherited function tables, no longer copy ___INIT in inherited
	  programs to the current function table 
	* Fixed a compiler type-checking problem associated with local
	  vars in blocks after other complete blocks with local vars in
	  them e.g. foo() { int a; { int b; } { int c; c = a; } }, the type
	  of c was wrong
	* Fixed a compiler type-checking problem for anonymous functions
	  E.g. in 
	  	   string foo() { 
		      function f = function() { return 5; }; 
		   }
	  an error was produced because the function pointer was assumed to 
	  return a string. Anonymous functions are now taken to return type 
	  mixed instead.

Fri Jan 13 20:17:20 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v20.25
	--- Beek:
	* changed string *get_dir() to mixed *get_dir() since get_dir()
	  can return an array of arrays
	* removed contrib efun map_string(); it's slow, and it leaks.
	* added terminal_colour() contrib efun.
	* fixed void foo(string str) { string str; ... } to give an
	  error message
	* added for (int i = 0; ... 
	* optimized the insertion of bytes into program blocks
	* mudlib_stats.c: include std.h before checking NO_MUDLIB_STATS
	* fixed call_others not to give type errors with CAST_CALL_OTHERS
	  off
	* crasher fix/optimized ++, -- (all three forms), +=, assignment
	* removed some unecessary code from skip_comment()
	* added COPY_SHORT, COPY_INT, COPY_PTR, COPY_FLOAT, LOAD_SHORT,
	  STORE_SHORT, etc for code clarity and portability; slight
	  optimizations in places
	--- Symmetry:
	* optimized allocate_array, explode(), implode(), users(), array
	  copying, commands(), filter_array(), sameval, unique_array(),
	  array addition, array subtraction, all_inventory(), map_array(),
	  deep_inventory(), array intersection, regexp(),
	  deep_inherit_list(), inherit_list(), children(), livings(),
	  objects(), typeof(), regexp(), each(), keys(), values(),
	  allocate(), function_profile(), stat(), call_out(),
	  call_out_list(), get_dir(), localtime()
	  matrix package efun identity()
	  contrib package efuns functions() and copy() on arrays
	* optimized check_valid_socket()
	* optimized ++x, while_dec, local lvalues, F_BYTE and F_NBYTE,
	  branches, &&/||, local values, <, +, +=, array constants,
	  mapping constants, =, --x, >, >=, global values, indexing,
	  <=, %, !, global lvalues, string constants
	* optimized array->foo(), removed a memory leak
	* optimized get_svalue_trace (used by the mudlib error handler)
	* optimized type name
	* small optimization to assign_svalue_no_free
	* optimized add_slash, push_indexed_lvalue, bad_argument
	* optimized stack overflow checks, made stack overflow an error
	* optimized function calls (push_nulls, copy_some_svalues, apply_low)
	* optimized stack pushes:
	   No STACK_CHECK checks here, because end_of_stack is 5 below
	   the actual end, and 5 pushes is infrequent.  Anything that
	   is going to push that many values should check.
	* optimized setup_new_frame(), check_for_destr()
	* removed a memory leak in unique_array()
	* added a flag to regexp() to get line number / index info
	* added a reg_assoc() efun
	* introduced an error callback mechanism (used to solve the
	  unique_array leak)
        *** Following since v20.25a3 ***
	* changed to use only one unsigned short local in eval_instruction
        * fixed crasher in global initialization
        * optimized copy_variables()
        * fixed error message for illegal type array indexing of arrays
        * fixed a crasher in while_dec
        * added code generation for do-while loops
        * fixed a memory munger in unique_array
        * added a prototype for drand48 which otherwise causes random()
          to behave inappropriately for AIX 
        * fixed a crasher in call_out_info
        * optimized efun calling by not passing number of args or 
          instruction code in eval_instruction().
        * various optimizations to add_action(), all_inventory(), 
          allocate_mapping(), break_string(), call_other(), capitalize(), 
	  children(), clear_bit(), clonep(), commands(), cp(), crc32(), 
	  creator(), ctime(), deep_inherit_list(), set_debug_level(), 
	  deep_inventory(), destruct(), dumpallobj(), each(), errorp(), 
	  environment(), exec(), explode(), file_name(), file_size(), 
	  find_call_out(), find_living(), find_object(), find_player(), 
	  function_exists(), function_profile(), get_char(), get_dir(), 
	  implode(), in_edit(), in_input(), inherits(), inherit_list(), 
	  input_to(), interactive(), intp(), functionp(), keys(), link(), 
	  lower_case(), member_array(), mkdir(), move_object(),
	  new(), notify_fail(), nullp(), objectp(), opcprof(), 
	  previous_object(), process_string(), process_value(), 
	  query_host_name(), query_idle(), query_ip_name(), query_privs(), 
	  query_snooping(), query_snoop(), remove_action(), 
	  remove_call_out(), rename(), replace_string(), resolve(), 
	  restore_object(), rm(), rmdir(), restore_variable(), 
	  save_object(), set_bit(), set_heart_beat(), query_heart_beat(), 
	  set_privs(), shadow(), shutdown(), snoop(), sprintf(), stat(), 
	  strsrch(), strcmp(), stringp(), bufferp(), tail(), tell_object(), 
	  tell_room(), test_bit(), this_player(), to_float(), to_int(), 
	  typeof(), undefinedp(), userp(), wizardp(), virtualp(), write(), 
	  write_bytes(), write_buffer(), write_file(), memory_info(), 
	  reload_object(), query_shadowing(), set_reset(), floatp(), 
	  first_inventory(), next_inventory(), crypt(), localtime()
        * optimized all socket and math efuns
        * optimized uid efuns, domain_stats(), author_stats()
	* optimized the freeing of arguments in the matrix efuns
        * optimized refs(), trace(), traceprefix(), evaluate() 
	* optimized next_living(), cat(), log_file() (in packages/compat.c)
	* Fixed a crasher in type_name 
	* Fixed a typo in find_or_add_perm_ident in lex.c which causes
          some bogus "Unknown efun : ... " errors
	* Fixed possible crashers in clear_bit and test_bit when the 2nd 
	  argument passed is negative
	* Fixed a possible crasher in member_array for searching in strings
          when the starting index given as 3rd arg is too large
	* Fixed a possible crasher (typo?) in socket_acquire 
	* removed first_inventory and next_inventory from packages/compat.c 
	* remove extra stack for error callbacks, and use the interpreter 
	  stack instead. This slows down freeing of svalues somewhat, but 
	  unfortunately is the best way I can think of to allow catching of 
	  errors from unique_array for e.g. without a memory leak.
        * no longer do clear_state() if a master apply fails, but rather 
	  recover the stack conditions before the apply. This fixes some 
	  crashers if for e.g. master::valid_override has an error.
	* simul efun is updatable again
	*** Since v20.25a6 ***
	* Fixed crashers in previous_object(-1), query_ip_name(), 
	  query_host_name()
	* More optimizations to read_file() 
	* Optimized match_path(), -= for arrays
	* Fixed bugs in subtract_array(), alist_sort() 
	* Fixed a memory leak in intersect_array()
	* Fixed a nasty crasher in scratchpad.c dealing with long strings
	* Minor scratchpad optimizations
        * Small optimization to simul_efun calling and call_all_other()
	* Optimized void_assign in interpret.c
        * Fixed compilation type checking for: assignments, &, ==, !=, >,
	  <, >=, <=, +, - (define OLD_TYPE_BEHAVIOR to not check types for
	  >, <, >=, <=, ==, != and +)
	* Optimized compilation type checking for: assignments, ?:, |, ^,
	  <<, >>, %, -, *, /, ++x, --x, ~, -x, x++, x--, a[b..c],
	  a[b]
	* The compiler now generates a warning instead of an error
	  if in a ? b : c, the types of b and c do not match
        * indexing of sscanf(..), parse_command(..) , time_expression(..),
	  real or integer constants are no longer syntactically valid at
	  the parser level 
	* Compactified grammar a bit by grouping <, >, <= and >= under 
	  the same L_ORDER token  
	* Run time defines using the -D flag are now added as 
	  permanent defines for speed
	* Fixed a possible crasher in scratchpad when it is almost (or
	  completely) used up in scratch_copy_string
        * Fixed a crasher when string literals of "literal length" (\n
	  counted as 2 for e.g.) greater than 1016 are used
	* Fixed crashers when errors are reported for unidentified
	  variables or illegal use of private variables when the 
	  variable names have length greater than about 236 
        * Rewrote the lexer to read chunks from the current file at
	  a time, which allows optimization of lexical parsing
	* Implement linked buffers in the lexer to allow for larger
          add_input such as those due to macro expansions
	* Disallowed newlines right after a # symbol and 
	  before a preprocessor directive
	* Added #pragma show_error_context to show approximately
	  where an error occurs before/around in a line
	* Corrected line numbers when literal strings with newlines 
	  not directly after a \ are used
        * Optimized the generation of string literals by copying to
	  the scratchpad directly if possible
        * Made literal strings error only when real length is > 1023
	* Optimized the check for global include files in lex.c
	* Added a missing '{' to f_copy in packages/contrib.c (reported
	  by Artagel)
	* don't define MAXSHORT in stralloc.c if it's already defined in
	  math.h (problem reported by Artagel on a NeXT)
        * Added INLINE to some prototypes in interpret.h 
	* Changed the interpretation of the 3rd arg in regexp, if it has
	  bit 1 set, then only non-matches are returned. If bit 0 is
	  set, indexes to matches/non-matches are returned as well.
	* Updated doc for regexp and added doc for reg_assoc
	* crasher in long error messages
	--- Robocoder:
	* revamped malloc package and wrapper selection to centralize it
	  all in options.h; added malloc.h and plainwrapper.c; changed
	  config.h, options.h, make_malloc.c, debugmalloc.c, wrappedmalloc.c
	  and Makefile
	* smalloc.c: removed small bit of text left over from cutting and
	  pasting from bsdmalloc.c; renamed functions; removed SBRK_OK
	  requirement...so it'll fall back onto system malloc;
	  (Note: apparently there is a small leak in accounting stats)
	  (Beek: I believe it's in restore_array, haven't had time to
	  check)
	* bsdmalloc.c: renamed func names to avoid conflict with system
	  malloc packages; (Note: even though it still only supports
	  sbrk())
	* Makefile: renamed references to config.h to options.h instead
	  (since config.h is static) (Note: out of sync with GNUmakefile)
	*** Since v20.25a5 ***
	* Corrected some bad_arg calls in packages/matrix.c and
	  packages/compat.c

Tue Jan  3 10:19:00 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v20.24
	* various Amiga and Solaris tweaks for cleaner compiles
	* compiler.c: added Alpha/OSF patch to clean_parser() to properly
	  handle 64 bit pointers to strings -- crasher reported by Dana
	* socket_efuns.c: changed send(blah, 0) to write(blah) ... fixes
	  socket_write() hang reported by Dm for SunOS5/Solaris 486
	* removed lock_expressions and all related things because it
	  is no longer needed
	* fixed make_func.y to properly protect backslahes in defines
	  in options.h	
	* second arg to dump_prog: now a set of flags; 1 = do disassembly;
	  2 = dump line number info
	* changed code generation to occur at the code block level instead
	  of the expression level; rewrote switch and loop code generation
	  to work with this
	* macro-ized compile node creation (for speed), removed compile
	  node flags
	* added a warning for inheriting the same function from two
	  branches; should be fixed to not give an error if it is
	  overloaded later ...
	* fixed a few prototypes for OS/2
	* fixed several instances in the OS/2 code which used the old
	  interactive flags, instead of iflags
	* rewrote line number tracking; the new way handles include files
	  using a more compact format, and never messes up even if the
	  mapping lines -> program bytes is not monotonic (i.e. order
	  preserving).  Fixed line number bugs in things like:
	  for ( ... ; error ; ... ) { ... several lines ... } 
	* optimized the memory leak fix from v20.23
	* removed references to efuns.h from the Makefile
	* Updated Credits.MudOS; added Symmetry
	* vastly reorganized the .h files, made compatibility checks more
	  consistent.
        * redesigned/optimized the identifier hash table
	
Mon Dec  5 12:14:46 EST 1994 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v20.23
	* __DIR__ now has a leading slash; "/u/b/beek/", not "u/b/beek"
	* removed all LPC_OPTIMIZE_LOOPS ifdefs
	* fixed a ref count bug in array + ({ })
	* comm.c: fixed so "address server ip" in config file can be
	  in dotted decimal (quad) form
	* fixed sprintf("%n.ndfoo", whatever) to not truncate after
	  the number
	* fixed binaries to only add the correct functions to the
	  function tree
	* resync'd "clean" and "neat" rules in makefiles
	* main.c: #undef'd write macro for Amiga SAS/C (see amiga/socket.h)
	* file.c: removed a useless #undef for Amiga SAS/C
	* added a few sanity checks to swap() to make it harder to crash
	* various compilation fixes for AUX from Magician
	* fixed an incorrect DEBUG check in scratch_join
	* fixed a crasher for unterminated string constants
	* added malloc.c to the 'make clean' list
	* Added Symmetry's fix for parse_command, where parsing
	  "all of my X" could hang the driver
	* SMakefile, make_func.y: fixed for Amiga
	* icode.c: removed i_generate_continues() as it was copied and
	  renamed to i_update_continues()
	* generate.c: added missing #include to clear up warnings about
	  missing prototypes
	* lex: fixed memory leak in free_defines; removed some unused
	  prototypes and variable
	* added push_funp() back in, since query_notify_fail() needs it
	* prototyped scratch_large_alloc() to avoid warnings
	* added #ifdef's around <stdlib.h> to avoid redefinition errors
	* fixed the LIVING_HASH_SIZE to be a power of 2
	* modified scratchpad.c to correctly mark the start of the
	  scratchpad
	* fixed the definition of HDR_SIZE (crasher fix on large blocks)
	* added some more DEBUG checks to scratchpad.c to ensure it
	  doesn't break
	* added some casts to fix unsigned char */char * problems
	* fixed two crashers in scratch_realloc() on large blocks
	* fixed scratch_join to leave the resulting string in a consistent
	  state, else joining 3 or more strings will corrupt them
	* commented the authors of the contrib efuns
	* added Gudu@VR's copy(), functions(), and map_string() efuns
	  as contrib efuns; anyone who uses %^FOO%^ colors should look
	  at map_string() ...

Mon Nov 21 13:51:25 EST 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.22
	--- Beek section
	* COMPAT_BUSTER: The environment_destructing() master apply has
	  been removed.  move_or_destruct() is now called in all objects
	  in the inventory of a destructed object, regardless of whether
	  the object being destructed has an environment.  This
	  consolidates the behavior of the old move() apply and
	  the destruct_env_of/environment_destructing() apply.
	* Fixed a bunch of cases where non-scratchpad strings were
	  misrepresented as scratchpad strings (possible crashers?)
	* Rewrote scratchpad.c since it was accidentally based on FIFO
	  and not LIFO order; tests show the correct implementation
	  of the optimization speeds up compiling by something like 30%
	* fixed @BLOCK blocks to work correctly again
	* inlined string(), number(), and real() in lex.c
	  number() and real() were pointlessly short; string() is mostly
	  in scratch_copy_string now, as it's optimized to copy to the
	  scratchpad.
	* added a check to make sure the LIVING_HASH_SIZE is an even power
	  of 2; other hash tables are safe b/c we don't actually use the
	  numbers from the config file (!), we get them from options.h
	  instead.
	* fixed the int x = destruct(this_object()); crasher.  I'd love to
	  see the code that found it if Drevreck really ran into it ... :)
	--- Symmetry section
	* crasher/memory munger fix in switch()
	* fixed and optimized the subtraction case in interpret.c
	* crasher/memory munger fix in add_define
	* crasher fix in free_unused_identifiers
	--- Robocoder section
	* updated Smakefile, file.c and amiga/ support directory from
	  adr32 hosts/amiga dir support by Lars Duening
	* make_func.y: creates packages/Smakefile; added this file to the
	  "neat" cleanup in Makefile and GNUmakefile
	* cleaned up a bunch of files to avoid/suppress various warnings
	* func_spec.c: changed comments around a few #include to
	  preprocessor conditionals
	* lex.c fixed a possible problem with using an uninitialized
	  auto variable in skip_comment()

Sun Nov 20 12:56:33 EST 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.21
	* fixed some serious bugs in restore_object(foo, 1);
	* fixed a crasher in the saving of negative integers
	* fixed call_outs so that they can be static again
	* changed a bunch of !c to c == '\0'; evidentally some compilers
	  are that stupid...
	* fixed a couple of problems with the static'ing of duplicate
	  variable names, also improved the handling of private variables
	  slightly.
	* fixed a crasher in the copying of large (>204 entry) function
	  tables

Wed Nov 15 12:04:11 EST 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.20
	* changed all MALLOC() calls to DMALLOC() calls
	* implemented the grammar for anonymous functions and expression
	  by value in functionals
	* Added some debugging code to clear_state()
	* fixed a bug that caused the size of mappings not to be set
	  right, which causes memory to be corrupted when keys() is called
	  on the mapping.  Fixes several rather nasty and delayed crashes
	  in array -= and elsewhere.
	* fixed a bug that caused the number of references in the
	  identifier hash table to be too high when the simul_efun object
	  was updated; this could cause a crash if the first simul was
	  deleted.
	* updated the following docs:
	  __INIT
	  environment_destructing
	  implode
	  notify_fail
	  origin
	  restore_object
	  restore_variable
	  save_variable
	  telnet_suboption
	  terminal_type
	* removed an unused variable from copy_functions
	* converted #define's to use whashstr instead of hashstr (it's
	  faster)
	* converted the living hash table to use whashstr
	* added a warning to options.h that certain mudlibs require
	  certain options
	* converted the object hash table to use whashstr
	* COMPAT_BUSTER: if you redefine a variable, the old copy becomes
	  static.  previously, the first one was the one that was saved.
	* COMPAT_BUSTER: if a function is inherited from two different
	  objects, the second one is used.  Previously, the first one
	  was.

Mon Nov 14 12:56:40 EST 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.19
	* fixed a bug in the real/real case of /=; fix from
	  Aleas@Nightmare
	* new apply:
	  void terminal_type(string term)
	  called in the object returned by connect() in the master object.
	  'term' is the terminal type of the user, as reported by terminal
	  negotiation; e.g. "xterm"
	* the telnet GA characters are only printed if the connection
	  responds to terminal negotiation
	* fixed a crasher in implode()
	* include file names are made shared strings early, instead of
	  malloc'ing a copy and making a shared string later
	* fixed a bug in the calling of ::#global_init# functions
	* fixed a crasher in object::foo() compilation
	* function table aliases are now replaced after compiling; fixes
	  the 'function not compiled with type testing' bug and two
	  crashers
	* fixed a problem with nomask prototypes causing odd errors
	* fixed it so that if the function actually isn't compiled with
	  type testing, you only get 1 error message, not two
	* fixed a typo that caused compilation to fail with
	  LOCALS_IN_TRACEBACK on
	* fixed a memory leak in restoring a value with duplicate keys
	* fixed several crashers in attempting to restore illegal strings
	* COMPAT_BUSTER: restore_object now leaves the affected variable
	  untouched when in finds a syntax error in a nested structure,
	  then gives an error.
	  previous behavior was to leave the value partly restored,
	  and to silently move on.
	* fixed a typo in mudlib_stats.c that caused compilation to fail
	  with NO_MUDLIB_STATS off
	* fixed a line in scratchpad.c that caused a compilation error
	  for some compilers
	* optimized variable name lookup for restore_object a lot.  Now
	  uses shared string comparisions, and is optimized for the
	  case where the variables are in the order they're defined
	  in the object (i.e. guesses that the save file was made
	  by save_object)
	  
Thu Nov 10 09:08:26 EST 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.18
	* removed a number of unused variables
	* added prototypes for some functions that were missing them
	* fixed alloc_local_name to actually return the name it allocated
	* fixed a crasher in check_valid_socket call from socket_create()
	* Rewrote the handling of inheritance and function tables;
	  only useful functions are put into the function trees, making
	  function searches even faster.
	* The above changes remove the nomask inheritance problem
	  mentioned in the Bugs file
	* removed the entry in the Bugs file for f=(: ob, ({ func, a, b }) :)
	  since NEW_FUNCTIONS fixes this already
	* Fixed a crasher in destruct(); if the object was dested again as
	  a result of moving it's inventory out of itself the mud would
	  crash. (old bug from Bugs file of 19.3)
	* changed the move() master apply since many mudlibs use move()
	  and it's a bad name anyway; now named "environment_destructing"
	* fixed a crasher for when tell_object() was passed a string
	  larger than LARGEST_PRINTABLE_STRING; as a result successfully
	  sent a 500k message to an interactive user.
	* Added Nightmare LPmud to the Credits file
	* COMPAT_BUSTER: the driver no longer uses __INIT for global
	  initializations, so anything that uses call_other(ob, "__INIT")
	  or ::__INIT() won't work any more.  The new function is:
	  private void #global_init#, so it can't be called explicitly
	  or played with.
	* origin() will now be right in all cases; functions called from
	  efuns (sort_array(), etc) get ORIGIN_EFUN.
	* added a case for function pointers in sameval(), which should
	  make function pointers act sanely as mapping keys.
	* optimized explode(); COMPAT_BUSTER:
	  if the first element of the array is not a string, a leading
	  delimeter is not printed, making it more consistent since
	  extra delimeters are not added internally, e.g.
	  old: implode( ({ 0, "a", "b", 5, "c" }), "," ) -> ",a,b,c"
	  new: implode( ({ 0, "a", "b", 5, "c" }), "," ) -> "a,b,c"
	* All driver applies can now be static or private.
	* previous_object is now zero in logon(), call outs, input_to
	  functions, socket and resolve callbacks
	* removed the need for '::' checks in call_other (optimization)
	* fixed a crasher in (: global_var :) with NEW_FUNCTIONS on
	* the heart_beat function is found via the function search tables
	  in epilog, instead of looking for it as we go
	* fixed a crasher for reporting runtime errors in the last line
	  of a file
	* removed the flags field of variables, saving 2 bytes/global var
	  per program
	* updated the disassembler with the new function flags
	* fixed some prototypes which didn't use Pn() in compiler_shared.c
	* changed the name of ORIGIN_BACKEND to ORIGIN_DRIVER; 
	  /include/origin.h keeps both names for compat
	* Fixed the old 'Warning: redefinition of #define ...' error that
	  was sent to users to actually be a real warning.
	* Removed almost all need for calling malloc() during compilation;
	  use various optimized allocators instead
	* Added a identifier hash table for quicker lookup of identifiers
	  and keywords
	* fixed restore_object to report which variable had a problem
	* fixed a crasher in string constants greater than 1k in size
	* added the start of a set_prompt() efun; not completed
	
Tue Nov  1 23:59:06 EST 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.17
	* fixed a typo in compiler.pre that caused yacc to fail with
	  NEW_FUNCTIONS defined
	* fixed a problem with an IF_DEBUG define in apply_low and sapply that
	  prevented compilation with DEBUG off
	* moved the TRACE defines to interpret.h to allow the driver to
	  with TRACE_CODE on again.
	* fixed a crasher based on incorrect code generation for
	  conditional expressions whose value was unused.
	* Fixed a crasher in errors going through the error handler
	  when current object was zero (This is possible for some internal
	  errors like "No action linked to verb")
	* adding ({}) now copies the array again if it is referenced more
	  than once, fixes COMPAT_BUSTER accidentally introduced in 
	  v20.2
	* Small optimization to sapply()
	* added some debugging code to get better error messages on double
	  frees
	* added push_refed_vector() and friends, allowing referenced
	  arrays to be pushed onto the stack without having to fudge
	  the ref count afterwards.
	* added a check_valid_socket() routine, which eliminates a large
	  ammount of code duplication for calling valid_socket()
	* added a improved system for allocation of temporaries during
	  compilation, with several advantages: (1) it avoids calling
	  malloc(), (2) it doesn't leak memory on syntax errors
	* added an identifier hash table, speeding up the lookup of
	  identifiers during compilation
	* benchmarks show compilation is approx 15% faster
	* changed pop_n_elems(2) -> pop_2_elems(), etc
	* fixed a bug that caused crashes when optimizing
	* fixed a typo, allowing LOCALS_IN_TRACEBACK && 
	  !ARGUMENTS_IN_TRACEBACK to compile
	* moved the TRACE defines to interpret.h so eoperators.c can find
	  them
	* added a check for a maximum include file depth, for systems that
	  don't run out of file descriptors
	* fixed a bug that gave warnings for '\''
	* defines now allocate 1 chunk, not 3
	* fixed a use of FREE in make_func.y; make_func should compile
	  with wrappedmalloc or mallocdebug now
	* fixed a problem with saving/restoring integers within a factor
	  of 10 of MAXINT
	* fixed saving and restoring of real variables
	* fixed a bug that caused create() to sometimes not get called
	  with NO_UIDS defined

Mon Oct 31 15:24:20 EST 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.16
	* changed a typo in c_filter_array in array.c
	* added back in a check for maximum array size that had gotten
	  removed from array addition
	* removed some old debuging code in ccode.c
	* added a few new macros:
	  IF_DEBUG(x) evaluates to x only if DEBUG is on
	  DEBUG_CHECK(x,y) issues fatal(y) if x is true
	  this simplifies much of the debugging code since #ifdef
	  .. #endif isn't required
	* converted most of the debugging code to use the new macros
	* removed a reference to comp_stackp in ccode.c that caused
	  linking problems with LPC_TO_C on
	* fixed the code for preventing catch()ing of too deep recursion
	  and eval_cost errors.  Several wierd design flaws caused the old
	  code to work in many but not all situations.  Code is now
	  airtight.
	  (also resulted in a small optimization to function calls)
	* fixed a typo in the attempt to call a simul_efun while loading
	  the simul_efun object error message
	* added defines/functions call_program/call_absolute for running
	  code; with LPC_TO_C off they just call eval_instruction; with it
	  on they centralize the dispatch code.
	* added an error for Function is no longer a simul_efun
	* fixed a typo in the is_static fatal error message
	* removed the DEBUG check around TRACE_CODE again
	* removed an archaic prototype for comp_stackp in lint.h
	* fixed a bug that added the line '#include ""' to files if the
	  global include file line was missing from the config file
	* added several missing %ifdef and #ifdef NEW_FUNCTIONS lines
	* fixed a crasher in previous_object(-1)
	* fixed previous_object(-1) to return ({ }) instead of ({ 0 })
	  when there is no previous_object().
	* Lots of work cleaning up LPC_TO_C code so bring it closer to
	  compiling again

Tue Oct 17 22:59:30 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.15
	* added some files that were missing from the Makefile
	* fixed a typo in a comment in backend.c
	* removed a line that caused crashes for Demon@TMI-2 (optimizer
	  bug in xlc?  The change is essentially x &= ~2; x = 0; -> x = 0;)
	* fixed some cases that can cause fatal errors if code get
	  generated for them (it shouldn't, but evidentally it is ...)
	  from Symmetry
	* mapping and array constants are no longer marked as E_CONST
	  internally; check kind == F_AGGREGATE instead.
	* prevent cascading errors in the case of an undefined var, also
	  give the undefined var message in more cases; from Symmetry
	* fixed a typo in an error message for illegal index to a constant
	  mapping.
	* fixed a crasher where the flags were set wrong for function
	  calls; from Symmetry
	* changed the optimization of sizeof(constant mapping) slightly
	* moved generate_source() to the correct spot in alphabetical
	  order
	* fixed the tail() problem; from Symmetry
	* optimize_expr() now walks the tree; still does nothing
	* optimized generate_node() somewhat
	* fixed a problem that causes crashes for optimizable loops
	  of size > 256
	* added Symmetry's fixes for functionals
	* added a string addition optimization back in that got removed
	  some how
	* added a missing break; for NEW_FUNCTIONS undefined; probably
	  the cause of Drevreck's crasher
	* optimized and unspaghetified part of lex.c
	* added a warning for unimplemented \x escapes
	* added the HAS_STATUS_TYPES define to options.h
	* removed unused variables from generate_lvalue_list, 
	  assert_master_ob_loaded

Wed Oct 12 01:56:14 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.14
	* rewrote the compiler (!) to use parse trees; numerous
	  optimizations possible b/c of this; also greatly simplified
	  the fix for the lvalue lifetime bug, etc
	* removed some code duplication in checking efuns
	* removed F_JUMP; all branches are relative now (F_BBRANCH added)
	* renamed a lot of stuff to be more informative:
	  F_GLOBAL, F_GLOBAL_LVALUE, F_LOCAL, F_LOCAL_LVALUE
	  instead of the previous inconsistent names
	* only put () after the instruction name if it's an efun
	  in bad argument error messages
	* F_LOOP_COND constant can now by F_BYTE etc and not just F_NUMBER
	* added a string out of range debug message in F_STRING
	* simplifications to the grammar:
	* all types are now returned as L_BASIC_TYPE with semantic value
	  of the type ("object" is an exception b/c of object:: parsing)
	* same with L_TYPE_MODIFIER
	* same with L_ASSIGN
	* new pragma: #pragma optimize
	  #pragma optimize - do default optimizations
	  #pragma optimize high - do all optimizations, and assume that
	                          the declared types are correct
          #pragma optimize all - all optimizations; currently the same as
                        	 high
	* fixed a bug in printing out of floating point numbers with %0
	* fixed a crasher resulting from the simul_efun object swapping
	  out and leaving the simul_efun pointers dangling; the simul_efun
	  object no longer swaps.
	* fixed the 'declare a temporary function to prevent tons of
	  errors' fix to not give redeclaration errors if the function
	  does show up later.
	* fixed a crasher when an object loaded without a current program
	  and an error occured and the error handler tried to call the
	  master object.  Caused crashes when the master object failed
	  to load off the boot.
	* If your global include file doesn't have "'s around it, they are
	  added.
	* Really fixed the crasher that was claimed fixed in v20.12
	  (moving an interactive and then returning zero from a command)
	  evidentally dates back to 0.9.16.18
	* fixed a crasher when OPCPROF and TRACE_CODE or TRACE was defined;
	  this also makes OPCPROF functional again
	* 'w' and 'W' with no argument now work in restricted ed mode;
	  this allows 'w', 'q' instead of 'x' to be used as well
	* Fixed ed to print tabs correctly with line numbers on;
	  caused the indentor to appear broken

Thu Oct 6 19:22:48 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.13
	* removed an unnecessary clear_notify() call in notify_fail()
	* moved f_simul_efun to eoperators.c since it is an eop
	* eoperators are now void f_eop(void) and not void f_eop(int, int);
	  the first argument was always -1 and the second was always the
	  same ...
	* fixed eoperators.h, which obviously hadn't been touched in
	  years ...
	* fixed the write_bytes error message; the two arguments were
	  backwards: "Wrong permissions for opening file /foo for
	  File does not exist. (append)"
	* Fixed a bug that caused write_bytes() to fail if the file didn't
	  exist.
	* slight optimization to <, >, <=, >=
	* fixed the DEBUG checks to check the stack after evaluation of
	  eoperators again
	* fixed some code that could in very rare cases miscalculate the
	  number of svalues to pop when an error occured
	* removed F_DUP
	* removed the type 'status' which was identical to 'int'; define
	  HAS_STATUS_TYPE in options.h to get it back
	* reorganized options.h a bit; put the compatibility defines
	  together up top, and noted what driver version each corresponds
	  to
	* Minor editing of some old changelogs
	* added query_notify_fail() as a contrib efun
	* added Symmetry's fix for the restore_object() memory leak
	* packed several interactive flags into one int saving about 
	  1K memory
	* only include trace_level and trace_prefix in the interactive
	  struct if TRACE is defined
	* notify_fail() no longer implictly calls process_string(); do so
	  explicitly if you want to use it
	* added notify_fail(function); the function is called when the
	  message is printed.  If a string is returned, it is printed
	  (tell_object or write can be used too; write() will go to the
	  person the message would have gone to if it were a string)
			
Tue Sep 27 21:21:47 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.12
	* fixed a definition of function_context in compiler_shared.c
	* improved the error message for bad argument 3 to message()
	* improved the error message for bad argument 1 to memory_info()
	* improved the error message for bad argument 1 to reload_object()
	* improved the error message for bad argument 2 to tell_room()
	* improved the error message for bad argument 1 to first_inventory()
	* fixed a bug in restore_variable
	* removed some code duplication in the routines for building
	  mappings (used by the error handler)
	* fixed some problems where 'signed' was used instead of 'SIGNED';
	  pre-ANSI compilers can't understand it
	* fixed a bug that caused write_bytes() to fail to write to the
	  correct position on some systems
	* fixed a bug that gave the wrong line numbers in tracebacks in
	  the error mapping
	* removed a prototype of mapping_too_large() since it's a macro
	  now
	* fixed a bug that caused .o files to occasionally be corrupted
	* added the file name to some error messages (Illegal path name,
	  Error in loading object, etc)
	* Fixed a bug that caused disable_commands() to remove the object
	  from it's environment
	* fixed a crasher when an object moves itself as the result of a
	  command then returns zero
	* added a debugging error message that prints the file name and
	  line if a crash occurs during compilation
	* small optimization to ref_string
	* fixed a type bug involving the use of casts in initializers, for
	  example:  int i = sizeof( (string *)foo->bar() ) used to give
	  type mismatch (string vs int) while initializing i.
	* fixed a crasher involving using an efun name as an undefined
	  variable
	* debug_info(ob, 2) now prints out a brief summary of the global
	  variables in an object

Sun Sep 25 16:04:31 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.11
	* Fixed a compile time line number bug that crept in when runtime
	  line numbers in include files was added.
	* Fixed a problem where default argument were not getting put into
	  efun pointers
	* fixed a bunch of definitions in object.c that didn't use Pn()
	* added string save_variable( mixed ) and mixed 
	  restore_variable( string ) for converting variables to and
	  from save_object's form
	* added a missing #ifndef NO_UIDS in set_privs_for_object()
	* Changed 'Error in look_for_objects_to_swap' to
	  'Error in clean_up() or reset()'
	* Fixed a typo in efuns_main.c (wrong number of args to
	  load_object())
	* fixed an incorrect prototype of previous_object() in func_spec.c
	* significantly optimized eval_instruction; made the code flow
	  clearer and easier to read
	* Fixed a bug that could leave constant strings dangling on when
	  objects were destructed
	* Added the start of a system to automatically put %line in the
	  grammar; not functional yet
	* Added a error message in make_func if you have more than 510
	  opcodes (which implies 430 efuns or so ...)
	* Fixed a crasher due to root_author and backbone_domain being
	  based on uids even when uids don't exists; with
	  #undef NO_MUDLIB_STATS and #define NO_UIDS the backbone
	  domain is now hard coded to "BACKBONE" and the root_author
	  is "NONAME".  Also, the root_author was changed to master_author
	  throughout the source as this is more accurate.
	* AUTO_SETEUID now works for the simul_efun object too
	* Added debugging code for easier debugging of future string
	  reference problems
	* The create() function doesn't need a type even if strict_types
	  is on this follows common LPC usage and C++ syntax; create()
	  is implicitly void unless defined otherwise

Sat Sep 24 16:51:06 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.10
	* Updated the following docs:
	  doc/concepts/message_doc
	  doc/lpc/types/function
	  doc/efuns/core/map.3
	  doc/efuns/core/evaluate.3
	  doc/efuns/communication/message.3
	  doc/efuns/properties/add_action.3
	  doc/efuns/system/eval_cost.3
	  doc/efuns/system/reset_eval_cost.3
	  doc/efuns/system/shadow.3
	  doc/efuns/system/max_eval_cost.3
	  doc/efuns/mappings/map_mapping.3
	  doc/efuns/filesystem/write_file.3
	  doc/efuns/objects/objects.3
	  doc/efuns/objects/load_object.3
	  doc/efuns/state/all_previous_objects.3
	  doc/efuns/types/sizeof.3
	  doc/efuns/types/typeof.3
	  doc/efuns/types/pointerp.3
	  doc/efuns/types/arrayp.3
	  doc/efuns/interactive/commands.3
	  doc/efuns/interactive/in_edit.3
	  doc/efuns/interactive/snoop.3
	  doc/efuns/arrays/map_array.3
	  doc/efuns/arrays/filter_array.3
	  doc/efuns/arrays/sort_array.3
	  doc/efuns/arrays/member_array.3
	  doc/applies/error_handler.4
	  doc/defines/__FILE__
	  doc/defines/README
	* Fixed another two "Anomaly" messages
	* added disassembler support for function pointers
	* fixed a problem that caused recursion if log_error used a 
	  simul_efun to try to report an error in the simul_efun object
	* fixed a crasher (dangling pointer) in simul_efun object updating
	  after it had failed to load
	* Fixed a problem with runtime line numbers;  they should be right
	  again now
	* made nesting of (: $var :) functionals work correctly
	* fixed a problem with using local variables in functionals
	* fixed some add_defines which should have been add_predefines
	  (snuck in via the v20 source)
	* move the -y flag to allow YYDEBUG to be used on the master and
	  simul_efun objects
	* variable names are not necessary for prototypes; i.e.
	  int stupid_function(int, string);
	  is legal
	* cleaned of the handling of argument names in the grammar
	* fixed a mistake in the "Undefined function foo" error message
	* prototyped yywarn()
	* define a varargs function when an undefined function is
	  encountered to reduce the number of errors produced
		
Wed Sep 21 08:46:51 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.9
	* added Thorin@TMI-2's patches to compile on SCO Unix
	* fixed problems (on some systems) with *= and /= based on
	  undefined behavior.
	* added changes from 0.9.19.26 -> v20
	* fixed a few "<< =" 's that survived since indent screwed them
	  up, spotted by Dana@TMI-2
	* remove some unused code in some of the function pointer
	  constructors
	* Fixed some function pointers to make errors before the function
	  pointer was called to not show the trace as in the function
	* Fixed a few bugs in restore_object(); should work correctly now
	* Fixed a counting problem with array statistics
	* Fixed a bug that reported ridiculous sizes for function pointers
	  in memory_info()  - Noticed by Meph@TMI-2
	* Added missing support for sprintf("%O", ...) when passed an
	  simul_efun pointer
	* Reorganized the tokens and made sure every expression returns
	  a start address (necessary for expression function pointers)
	* "Extra ';'.  Ignored." is now a warning instead of a fatal
	  error.
	* Simplified the grammar by condensing two comma_expr cases
	* COMPAT BUSTER: support for this_object function pointers
	  ( i.e. (: "foo" :) ) has been removed with NEW_FUNCTIONS
	  defined.  Use (: foo :) instead.  (: "foo" :) is now a
	  function which returns "foo" (see below).
	* Added support for the second to last version of function
	  pointers; "(: expression :)".  Arguments to the function
	  are represented as $1, $2, $3 ...
	  For example:
	  sort_array(arr, (: sizeof($1) < sizeof($2) :) );
 
Mon Sep 19 18:28:08 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.8
	* snoop() can now be called when this_player() is zero; the
	  restriction dated back to when snoop() used this_player()
	* removed two extraneous calls to store_line_number_info() that
	  were causing runtime line numbers to be off; they're now off
	  by exactly 1 I believe; still looking into it.
	* Several bugfixes to restore/save_object; they should work
	  correctly again
	* fixed a few potential crashers in parse_command
	* fixed a problem which caused extraneous printing of "Error in
	  error handler" when no error handler was in use
	* cleared the error state after a error in error handler;
	  previously the error handler became non-functional
	* added a call to end_new_file() when epilog() returns because
	  of errors or inheritance; fixes a bug which would erroneously
	  report "missing #endif"

Mon Sep 19 15:25:34 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.7
	* removed outdated rules for compiler.y and lpc_compiler.y in the
	  GNUmakefile
	* function arguments specified when a function pointer is made can
	  be used with arguments specified when it is called, and the
	  order is what you would expect, i.e.
	  function f = (: foo, a, b :);
	  (*f)(c);
	  is the same as foo(a,b,c);
	* classes for the message() efun may be of any type, not only a
	  string (idea from Misery@TMI-2)
	* used Px() defines for function definitions where they weren't
	  being used (reported by Drevreck@TMI-2)
	* moved contrib.c and contrib.spec to the packages/ directory
	* moved a bunch of ed defines to a new file (ed.h)
	* in_edit() now returns the file that is being edited
	  (idea from someone whose post has scrolled of the board)
	* print out compile errors to stderr if master::log_error doesn't
	  exist
	* fixed a problem with the definition of unique_array that
	  prevented function pointers from working with it
	* evaluating a function pointer created by an object which has
	  since been destructed is now an error 
	* fixed a bug that caused mappings to crash
	* added #ifdef NEW_FUNCTIONS around a reference to fake_prog
	* fixed a crasher in get_line_number_info
	* traces no longer go to stdout, only the debug.log
	* fixed some incorrect prototypes (add_define, etc)
	* fixed a few bugs in linenumbers, some involving the global
	  include file
	* added a warning for unknown pragmas
	* fixed a crasher involving the simul_efun not loading at startup
	* added a better message than 'Anomaly in the fabric of world
	  space.'
	* fixed a crasher with MUDLIB_ERROR_HANDLER and LOG_CATCHES
	* don't try to print a trace if the call to the mudlib error
	  handler fails, it will have been destroyed
	* gzip'ed two of the old changelogs
	* check arguments to efun function pointers

Sun Sep 18 07:22:17 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.6
	* optimized commands()
	* fixed a typo in commands()
	* optimized check_for_destr()
	* cleaned up the Bugs file
	* updated the GNUmakefile on the make_func changes from v20.5
	* added evaluate(f, ...) which is the same as (* f)(...)
	* evaluate(f, ...) now returns f if f is not a function
	* added global include file option based on diffs from
	  Marius@Savage.Garden
	* rewrote smart_log
	* added a max_eval_cost() efun
	* runtime errors now report the correct file and line for errors,
	  even if it was in a #include'd file
	* pragmas now use bits; change from Marius@Savage.Garden
	* predefined symbols (like HAS_SOCKETS) are added only once
	  instead of whenever a new file is started
	* Added support for compiler warnings; enabled with #pragma warnings
	* added a warning for '/*' inside of a comment
	* added a warning for unused conditional expressions, as in:
	    if (x == 0) x == 1;
	* any define in options.h is now sent to the mudlib surrounded by
	  '__' i.e. if LOG_CATCHES is defined in options.h, then
	  __LOG_CATCHES__ will be defined in all LPC objects.  This
	  adds a number of useful new predefines like __NEW_FUNCTIONS__
	* added a __FILE__ define
	* added support to turn some pragmas (warnings for example) on
	  by default in options.h
	* fixed an instance of add_map_stats with NO_MUDLIB_STATS defined
	  in object.c
	* removed light and object info from the object struct if they
	  aren't in use
	* fixed a compilation warning for NeXT
	* made scan_config_line iterative instead of recursive
	* moved start_new_file() into compile_file
	* the mudlib error handler now gets a 'file' field in addition to
	  the 'line' field in tracebacks
	* improved the bad arg x to efun ... error message
	* fixed a bug that caused type errors on simul efuns which had
	  type modifiers (varargs string vs string)
	* changed testsuite/clone/user.c's commandHook to use load_object

	* More diffs from Symmetry@TMI-2:
	* filter_array() can now pass multiple arguments to the function,
	  i.e. filter_array(arr, fun, a1, a2, a3, ...)
	  same with map()
	* Support for @foo and @@foo blocks in the indentor

Mon Sep 12 07:53:11 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.5
	* Fixed the generation of packages/GNUmakefile and dependencies in
	  the GNUmakefile
	* the array from commands() now includes the function as well as
	  the object; from Decker@TMI-2
	* optimized load_mapping_from_aggregate
	* write_file now takes a second arg, 1 means overwrite instead of
	  append.  Idea from Decker@TMI-2
	* Improved a lot of compile time error messages
	* Added type checking to save_object()
	* Fixed a crasher in updating of the simul_efun object on
	  some systems
	* New efuns:
	  . load_object(string) - finds an object, loading it if necessary
	  . find_object(string, 1) - see load_object
	      - idea from Decker@TMI-2
	  . member_array(int, string) - find a character in a string
	  . third argument to member_array is now the start index;
	    support for the old flag removed
	  . sizeof(string) == strlen(string), and optimized sizeof
	  . this_interactive() == this_player(1)
	  . all_previous_objects() == previous_object(-1)
	  . arrayp(mixed) == pointerp(mixed)
	      - idea from Cygnus@TMI-2	  
	  . shadow(ob) == shadow(ob, 1)
	  . reset_eval_cost() == set_eval_limit(0);
	  . eval_cost() == set_eval_limit(-1);

	* Changes from Symmetry@TMI-2:
	* compiler.y and lpc_compiler.y are generated by make_func now
	  instead of via cat.
	* Fixed the function pointer grammar to compile on bison
	* optimized use of string function names in map_array etc.
	  (use them directly instead of simulating them with function pointers)
	* Fixed a really nasty bug in compatible_types() which effectively
	  disabled compile time type checking.  OLD_TYPE_BEHAVIOR is
	  offered for those who would rather have their buggy code
	  compile instead of fixing it.
	* Optimized and improved type checking in many of the eoperators
	* Optimized ident() in lex.c
	* optimized mapping operations
	* optimized save/restore_object

Fri Sep  9 02:14:18 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.4
	* Added tracebacks for errors in error handlers
	* Changed strdup() to string_copy() where it has snuck in
	* Added a Makefile option for bsdcc
	* Added support for efun packages
	  . package 'foo' has the functions specified by packages/foo.spec
	    and source in packages/foo.c; it is enabled with a
	    #include "packages/foo.spec" in func_spec
	  . Added a contrib package, currently empty (Send in those efuns!)
	  . moved efuns which deal with driver internals to 'develop'
	    package
	  . moved uid efuns to 'uid' package
	  . moved domain and author stats to 'mudlib_stats' package
	  . moved socket efuns to the 'socket' package
	  . moved math efuns to the 'math' package
	  . moved matrix efuns to the 'matrix' package
	* optimized eval_instruction()
	* Added the typeof() efun back in
	* added /include/type.h for return values of typeof()
	* Moved a <sys/select.h> prototype AIX complained about
	* Code for 2 byte efuns is not compiled in if there are less than
	  256 efuns, offering extra speed to those who trim their efun
	  list below 256 opcodes
	* Improved handling of efun name aliases; fixed several bugs in
	  map(), map_array(), map_mapping()
	* ({ string, string })->func() is now legal; previously only
	  objects could be used - idea from Inspiral@TMI-2

Mon Aug 29 17:47:41 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.3
	* fixed virtual objects
	* added function pointer support for:
	   filter_array( mixed *, function, void | mixed )
	   unique_array( mixed *, function, void | mixed )
	   map_array( mixed *, function, void | mixed )
	   objects( function )
	   sort_array( mixed *, function )
	* Made map_mapping work, as well as function pointer support for
	  it
	* Added map(mapping | mixed *, ...) which is what map_mapping and
	  map_array are really aliases for
	* slight change to sort_array:
	   sort_array(arr, 1) is now forward, and
	   sort_array(arr, -1) is reverse.
	   sort_array(arr, 0) is forward as well
	* LPC_TO_C compiles again; compiler still needs some of the
	   function pointer code tho
	* added new simul_efun format support to the disassembler
	* Error message for illegal local variable number with DEBUG on
	* Fixed a crasher for errors in function pointers
	* Fixed a crasher involving updating of the master object, cleaned
	   up the master object handling even more
	* "efun" and "asm" are legal argument names for functions
	   arguments again
	* Fixed a 'should be a push!' crasher when an function name was used
	   as a variable but not defined as one
	* Added changes from 0.9.19.26

Mon Aug 29 17:47:41 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.2
	* Note: This version is also based on 0.9.19.25, not v20.
	* split and reorganized the Changelogs.  Old Changelogs are now in
	  ChangeLog.old/...
	* finally remembered to remove the __builtin_valist from lint.h
	* moved the defined_named typedef to exec.h so lint.h would be
	  happy
	* Added a NO_UIDS option - Idea from Alexus@TMI-2
	  btw, the old old USE_EUID which used to always be defined
	  on MudOS drivers works with this change; so you can use:
	  simul_efun:
	    getuid(ob) {
	    #ifdef USE_EUID
	    return efun::getuid(ob);
	    #else
	    return "NONE";
	    #endif
	    }
	* Fixed miscellaneous typos etc from the function pointer merge
	* added 'make remake' == 'make neat; make all'
	* added 'make neat', which removes object files but leaves
	  .orig, .rej, driver.old, addr_server etc alone
	* moved the defined_name definition so lint.h will compile
	* added support for an array as the second argument to add_action,
	  i.e:
	        add_action( "look", ({ "look", "l", "glance" }) );
	  idea from Decker@TMI-2
	* fixed a bug that caused add_array to complain it was out of
	  memory when it really wasn't on some systems
	* fixed a bug that caused the first argument of lfun pointers
	  to be ignored
	* fixed a typo in the definition of get_simul_efuns
	* fixed a crasher with LOG_CATCHES and MUDLIB_ERROR_HANDLER
	* fixed a problem with write_prompt and process_input after
	  an error with LOG_CATCHES and MUDLIB_ERROR_HANDLER
	* fixed some indented preprocessor defines from the patching
	* Added a __MAX_USERS__ LPC define which has the value of
	  MAX_USERS in the driver
	  idea from Misery@TMI-2
	* changed the default MAX_USERS from 5 to 50
	* Changed handling of the master object:
	   - you should be able to to just about anything in your master
	     object now and it will still be updateable, even stuff like
	     efun::, even really nasty ideas like calling shadow() from
	     the master's create() or having 
	     create() { destruct(this_object()); } won't crash the mud.
	   - Errors in master compilation are actually printed now,
	     instead of a cryptic message
	   - The mud WILL NOT go down if the master object stops working;
	     all file accesses etc will simply fail.  When the master is
	     fixed the mud will resume normally.
	* indentor fixes:
	  fixed // comments
	  removed quoted array, closure etc support
	  added function datatype support

Mon Aug 29 17:47:41 EDT 1994 (tim@handel.princeton.edu (Beek))
        * raised patchlevel to v20.1
	* Note: This version is based on 0.9.19.25, not v20.
	* Name change: The 0.9 part of the version number is being dropped.
	* Large number of function pointer changes:
	* A fake frame is inserted when function calls are evaluated now.
	  The practical outcome is that previous_object() will be the
	  object that created the function pointer, not the object that
	  used it.  The object that used it is previous_object(2)
	* efun, lfun, and simul_efun pointers are now available.
	  Examples:
	  function f = (: previous_object, -1 :);
	  
	  int foo() { }
	  ...
	  function f = (: foo :);

	* arguments can be passed either by including them in the
	  definition:
	  function f = (: write_file, "/log/fp", "evaluated.\n" :)

	  or when evaluated:
	  function f = (: explode :);
	  result = (*f)("this is a test", " ");
