-------------------------------------------------------------
(v22.2a37 promoted to v22.2b1)

Sat Jul 29 21:32:05 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a37
	* updated with respect to v22.1b32
	* fixed miscellaneous typos and compile errors in a36
	* moved most all add_action code into add_action.c
	* corrected db_connect in PACKAGE_DB to take only four
	  arguments rather than five.
	* strings in PACKAGE_DB are now malloced/counted rather
	  than shared [suggestion from Beek]
	* fixed a memory overwrite crasher in handling prototypes
	  of inherited functions [reported by Zifnab, Loriel,
	  Mystic, and others.  thanks to Javelin@VH for a test
	  case to reliable reproduce]
	* Fix error messages generated when PACKAGE_UIDS is defined
	  and get_root_uid() or get_backbone_uid() either do not exist
	  in the master object or do not work.  Error messages were
	  causing a crash [reported by Mystic]

Fri Jul  7 21:16:16 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a36
	* updated with respect to v22.1b31
	* fixed process_input() so that the modified command is passed
	  on to parse_command() rather than the original unmodified
	  [reported by Beyond@LimaBean]
	* added debug code for tracing object references and finding
	  destructed objects that never get freed.
	* fix receive_snoop() to handle non-nul terminated buffers
	  passed -- use the len argument [reported by Passerby@IoT]
	* prepend slashes to filenames for display in ed (f, w, x
	  commands) [reported by Avenger@AtP -- missed from v22.1b25]
	* implemented rfc 1184 (telnet linemode option) to better
	  support running on port 23.  the implementation is partial
	  at present, but sufficient to serve its purpose.

Tue Jul  4 19:45:03 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a35
	* updated with respect to v22.1b30
	* fixed escape_command() so that ! command escaping
	  works again.
	* if there's no master object present when attempting a
	  virtual object clone (shouldn't ever happen, but ...),
	  be sure to clean up the stack before returning failure
	* removed recently added debug checks for destructed
	  objects pushed onto/assigned into the stack.

Sun Jul  2 19:00:55 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a34
	* updated with respect to v22.1b29
	* fixed lower_case() and upper_case(), both broken in a32 by
	  locale changes
	* updated PACKAGE_DB support to include MySQL support and
	  restructured to ease adding new database support [based on
	  patches from Andrew@Nanvaent]
	* COMPAT BUSTER: When loading/cloning a virtual object, mudlib
	  stats, uid/euid and privs are now properly reset with the
	  newly assigned object name.
	* compile_object() in master.c will now be passed a second
	  argument indicating whether the operation is a clone or not.
	* If arguments are now passed to clone_object() for create() when
	  cloning a virtual object, the arguments will be aggregated and
	  passed on to compile_object() in master.c as the third arg.
	  The prototype for compile_object() is now as follows:

	  varargs
	  object compile_object(string filename, int cloning, mixed args...);
	* Don't bail out of edit_source if PACKAGE_DB is defined and it
	  can't find msql.h, mysql.h, libmsql.a, or libmysql.a.  If they
	  can't be found, you'll have to hack the source for now.

Sat Jul  1 13:18:19 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a33
	* don't save command_giver on the runtime stack.  use a separate
	  stack instead.
	* add missing add_ref in save_command_giver() to match the
	  free_object() in restore_command_giver()

Tue Jun 20 18:41:51 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a32
	* updated with respect to v22.1b28
	* for the network_stats() contrib efun, return the external ports with
	  port number rather than index position in the internal port list
	* restructured more code in comm.c for command handling.  broke out
	  duplicated code into new functions and generally cleaned some stuff
	  up.  This makes way for the next change:
	* command_giver is now reference counted and properly restored on
	  error, etc.  no more need for it to be reset to 0 in the backend.
	* all objects now get the class definitions from the simul_efun object
	  if there are any, just as if they had inherited the simul_efun
	  object.  This resolves problems with class related errors when the
	  simul_efun object is involved [reported by Pinkfish@Discworld]

Sat Jun 17 12:15:08 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a31
	* updated with respect to v22.1b27
	* added extensive packet/volume statistic gathering to comm.c and
	  socket_efuns.c when the network_stats() contrib efun is compiled into
	  the driver [based on patches from Skullslayer@RoD]
	* Patches from Turrican@Discworld:
	  . added an optional 3rd argument to socket_bind efun to specify the
	    address and port to bind to (in the same format as socket_connect)
	  . added an optional 2nd argument to socket_address efun to return the
	    socket's local address when specified as non-zero

Thu Jun 15 17:11:07 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a30
	* NUL terminate user input buffer before passing it to handle_snoop().
	  [reported by Passerby@IoT]
	* correct handling of cr/lf when processing commands [reported by
	  Loriel@Lima Bean]

Mon Jun 12 09:06:09 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a29
	* updated with respect to v22.1b26
	* handle backspace in user input because some clients send everything
	  and don't filter out local edits [reported by Requiem@SG]
	* handle both \r and \n for command delimiters in user input
	  [reported by Requiem@SG]
	* respect NO_IP_DEMON option and -N driver command line option in the
	  new address server reconnection code [reported by Skullslayer@RoD]
	* expanded the array returned from the localtime() efun to include
	  LT_ISDST.  This is supported on most platforms.  For those that it is
	  not, the value will be -1.
	* the third argument to tell_room() can now be an object (from Ideas)
	* when COMPAT_32 is defined, closurep becomes an alias for functionp
	  [reported by Passerby@IoT]
	* made PACKAGE_PARSER compile with NO_ENVIRONMENT again
	* added an error handler to (s)printf to clean up its state when an
	  error occurs (usually only caused by the object_name master apply)
	* edit_source will load options.h/local_options for -configure, but will
	  not yet check the validity of these files.  this is done so that proper
	  configuration can be done for PACKAGE_DB
	* when NO_ANSI and STRIP_BEFORE_PROCESS_INPUT are both defined, escape
	  characters are stripped as they're copied into the user buffer, saving
	  alot of unnecessary work stripping them out later.
	* removed dead telnet_neg() function from comm.c
	* check for tzset() and the need to prototype it in configure phase

Mon Jun  5 13:16:25 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a28
	* updated with respect to v22.1b25
	* rewrote user command handling in comm.c:
	  . several buffer over-run fixes
	  . flush existing buffer before flushing a new OOB buffer
	  . ignore other than IAC IAC and IAC SE while in an IAC SB
	  . remove the space/backspace empty command hack
	  . some optimizations, less string scanning/copying than before
	  . fixed a memory leak when there are more than two lines to be
	    processed in PORT_ASCII and the object is destructed
	  . user input that exceeds the input buffer is now completely
	    thrown away.
	* additional cleanups to parser package from brett@stummies.org
	* check the reference time of the object before calling reset to
	  determine if the object needs cleanup, the same way it's checked
	  for swapping.
	* line number information is now stored as an int rather than a
	  short if USE_32BIT_ADDRESSES is defined.
	* COMPAT_BUSTER: 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.
	* fixed #warn to be properly recognized [fix from Skullslayer@RoD]
	* fix a parser crasher in interrogate_object() when the object has
	  both PI_SETUP and PI_REFRESH flags [reported by Dvarsk@Nightmare]

Wed May 24 12:01:34 CDT 2000 (marius@mudos.org (Marius))
	* raised patchlevel to v22.2a27
	* updated with respect to v22.1b24
	* fixed (s)printf() to be re-entrant.  This allows for the removal
	  of the master()->object_name() restriction which would cause an
	  infinite loop and crash the driver anyway.
	* contrib efun replaceable() does the checks that replace_program()
	  actually does now, and also adds a check for APPLY___INIT in
	  addition to APPLY_CREATE.
	* added a query_replaced_program() contrib efun to return the name
	  of the program that was replaced by replace_program().  Returns 0
	  if replace_program() has not been called on the object.
	* save_object() will save the name of the program that was replaced
	  by replace_program() if it has been replaced rather than the program
	  it was replaced with.
	* fixed crasher when number of locals to pop in the compiler was 0.
	* added GET_CHAR_IS_BUFFERED to options.h.  Not defined by default,
	  but when it is defined, get_char() will be buffered.  See the comment
	  in options.h for more information.
	* an attempt will now be made once every 15 minutes to reconnect to the
	  address server if the connection has been lost (or not made at start-
	  up to begin with).
	* if THIS_PLAYER_IN_CALL_OUT is defined, reclaim_objects() will only
	  zero the saved command_giver if that object has been destructed.

Thu Nov 12 12:53:35 EST 1998 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a26
	* updated with respect to v22.1b22
	* added Skullslayer@RoD's patch for #warn and #error

Wed Mar  4 04:57:16 EST 1998 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a25
	* updated with respect to v22.1b21
	* paranoid debugging check added in compiler.c
	* fixed typo in string_copy() call in add_slash()
	* Fixes from Belgarat:
	  . update patch_in() to take into account the v22.2a17 switch
	    changes
	  . remove obsolete code in DEBUG_MALLOC_EXTENSIONS (privs_file_fname
	    no longer used)
	  . fixed typo that caused parse_refresh() to be ignored
	* SERVER_IP stuff moved to the runtime config file.  SERVER_IP defines
	  in local_options files will still work. [change from Gorta]
	* '&' is now a synonym for 'ref' when COMPAT_32 is defined
	* fixed crasher when ref was used in function calls inside function
	  arguments, e.g. func(foo, bar(ref x), ref x)

Thu Feb 26 00:34:42 EST 1998 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a24
	* more EOF fixes in lex.c [reported by Lathander]
	* fixes from Turrican@DW
	  . call set_non_blocking() on all new accepted sockets since there
	    evidentally exists OSs that don't do this
	  . NUM_EXTERNAL_CMDS is now in options.h
	  . removed name field from lpc_socket_t (was unused, and the lookup
	    didn't use addr_server, ack)
	  . external_start can now take an array of string arguments as the
	    second arg
	* call_stack(0) now correctly returns "<function>" and not
          "/<function>"; actual fix is in add_slash() so this may fix other
          instances of this behavior as well [reported by Donky]

Mon Nov 24 14:58:27 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a23
	* added leading / to filename in function return type warning
	  message [reported by Aragorn]
	* fixed crasher in explode() when result exceeds the max array size
	  [reported by Aragorn]
	* fixed EOF handling in lex.c
	* Errors no longer turn off the heartbeat (and send the heartbeat
	  message) if MUDLIB_ERROR_HANDLER is enabled.
	* program_info() now returns a mapping

Wed Nov 12 21:42:54 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a22
	* recompute runtime_index instead of storing it in the apply_low
	  cache
	* fixed all uses of is*() functions on signed chars with the high
	  bit set
	* fixed typo in apply_low() cache check
	* reference programs in the apply_low() cache to avoid being confused
	  by dangled pointers.  fixes crasher reported by Aragorn, Jihad.
	  See discussion in interpret.c for additional details.

Wed Nov 12 13:17:52 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a21
	* fixed BINARIES to work with the new switch() format
	* updated loop generation for LPC->C
	* fixed a typo in grammar.y.pre (patch was backwards last patchlevel)
	* made the "Multiple access modifiers" error message a bit less
	  ambiguous

Tue Nov 11 18:34:44 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a20
	* three typo fixes from Aragorn (edit_source.c, grammar.y.pre,
	  packages/contrib.c)
	* one from Symmetry (grammar.y.pre)

Fri Nov  7 12:35:42 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a19
	* updated with respect to v22.1b19
	* reduced call_other cache overhead by a factor of two.
	* fixed compilation with PRIVS on [reported by Jihad] and
	  PACKAGE_UIDS/PACKAGE_MUDLIB_STATS defines [reported by Leto]
	* fixed the disassembler to know F_SWITCH addresses are relative now
	* don't warn about m[-1] if m is type mapping
	* fixed crasher in map_mapping()
	* fixed non-existent master applies
	* call pop_value() on the first_for_expr before parsing the body
	  of the loop, so any warnings generated have the correct line number
	  [reported by Aragorn]
	* from Symmetry:
	  . fixed unused warnings for things like {int x = 1; } { int y; }
	  . fixed checks for multiple access modifiers
	  . fixed bug in switch ranges

Tue Nov  4 16:53:54 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a18
	* updated with respect to v22.1b17
	* cp() now also errors (like mv()) if the src and dest files are 
	  the same.  Previously, it just truncated the file.  [suggested
	  by Zod@Delirium]
	* -> syntax now uses a call_other() sefun, if one exists.  Type
	  checking for it was also improved somewhat.
	* master applies are now cached the same way simul_efuns are.
	  applies.h is now autogenerated from 'applies'.  Heartbeats also
	  use the same calling mechanism now.
	* global 's/){/) {/' on the source code (sorry Sym :-))
	* Removed strstr.c; OS's definition is undoubtably better in most
	  cases
	* Correct line number info is now generated for initializers (this
	  is actually almost a side effect of one of Symmetry's changes)
	* Changes from Symmetry:
	  . varargs int global = 2; is an error now
	  . More restrictive, but sensible type order:
            <basic_type> <array|> <ref|> <*|>
            Earlier one could also do basic_type ref array etc.
          . ref cannot be used in global vars, casting (also an earlier
	    crasher), function declaration, local declarations
	  . Can have at most 64 classes now, earlier it was 32 but one
	    would also be able to crash it at 32 I believe
	  . Make sure that variables/functions have appropriate types after 
	    inheriting classes
	  . Better error message if a previous func definition does not match
	    an about to be defined function
	  . Fixed some unused local var warnings which were erroneously
	    (not) generated e.g. in { int x; } { int y; write(y); }
	    Also fixed the order of such warnings in the case of { int x,y; }
	  . fixed a crasher/hanger in scratchpad for having a 
	    scratch_copy_string when the scratchpad is completely filled
	    (reported by Curuntar@Lima Bean)
	  . Actually free the scratchpad immediately after 
    	    new(class foo, x:1, y:2) instead of waiting until 
	    the end of compilation
	  . Give error message for new(class foo, x:1, x:2)
	  . Global modifiers now work a little differently. 
	    There is the notion of access modifiers (private, public, 
	    protected/static).
    
	    Other modifiers are (varargs, nomask, nosave/static).

	    The modifier now affects everything until the next such modifier:

	    private:
		varargs int foo(mixed a, mixed b){
		}

	    means that foo is private varargs. It is an error to have two
	    different access modifiers (such as public private) for any 
	    function, global var or inheritance. 

	    This is the case only if SENSIBLE_MODIFIERS is defined, since 
	    old libs often use private static etc. Also fixed the
	    check of 'public private:'. Earlier it wasn't causing the 
	    warning that  would have been given.
	  . Significantly reduced program size, especially function tables.
    	    A prototypical example of the savings for /std/race/human
    	    on Lima, which normally has 533 functions, 526 of which is 
	    inherited:  The function table size is about 3k normally in
	    prev versions, 2k if COMPRESS_FUNCTION_TABLES is used, and
	    about 1k currently (even though one actually saves 601
	    functions currently, which amounts to 140 bytes extra, which
	    could be removed but at a cost in speed in local calls).
	    This example is typical of most mud programs which inherit
	    many functions but only add a few themselves.

	    The 1st call_other and local_calls should be better than
	    previously having defined COMP_FUNC_TABLES, but worse than 
	    previously not defining it.

	    The program header has also been cut down 8 bytes.
	
	    If BINARIES is not defined, one saves an additional 4 bytes
   	    per non-inherited function.
	    program_info(object ob|void) is a good way to find out about 
	    program sizes.
	  . The order of name resolution for multiple inheritance is as 
	    follows:
	    inherited prototypes < non-inherited prototypes <
    	    inherited functions < non-inherited function (can only be one)
    	    Within each class sequential order is used for resolution (later
	    inh prototypes win over earlier for e.g.).
    
	    The use of prototypes is dual:
	    (1) As an abstract method (see java). You can call prototypes 
	    and only let inheriting programs define the actual functions.
	    (2) A typesetter. At this moment this is semi-strict. A warning
	    is produced for return type not being compatible. Argument types
	    are not checked however.
    	    
	    While it is not crucial in principle, programmers are encouraged
	    not to be too lax about types. In the future (possibly far), it
	    may be that meaningful compile-time types are the only way to 
	    progress. 
	  . If BINARIES is defined, only save string switch info if 
	    PRAGMA_SAVE_BINARY is true
	  . LPC->C RUNTIME_LOADING support for alpha

Tue Oct  7 01:39:30 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a17
	* updated with respect to v22.1b16
	* Don't generate unused argument warnings for variables in prototypes
	  [reported by Jihad]
	* Generate a warning for global variables with the same name as 
	  another global variable (unfortunately, historically this hasn't 
	  been illegal)
	* improved RUNTIME_LOADING support on Linux from Alaron@RetroMUD
	* fixed crasher/garbage error for replace_program(non_string)
	* -Wmissing-declarations added to the develop compile options;
	  lots of local procedures declared static.
	* compat/simuls/apply.c extended to have all the functionality of
	  3.2's apply().
	* added a warning for declaring a global variable with the same
	  name as another global variable
	* fixed the disassembler not to crash on out of range simul_efuns
	  and zero opcodes
	* added USE_32BIT_ADDRESSING which allows up to 4GB of bytecode
	  as long as all branches are less than 64k.  When LPC->C is
	  defined, this is always on.
	* switch() offsets are now all relative
	* deep_inventory() and living() default to this_object()
	* added F_SHORT_INT opcode for two byte integer constants
	* optimized map_mapping() to not copy ref 1 mappings

Sun Oct  5 12:26:39 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a16
	* fixed crashes in attempting to use ::func() to call a private
	  function [reported by Random et al, fix from Cloud]
	* if gcc is being used, try using __USE_FIXED_PROTOTYPES__ to have
	  the gcc header files define prototypes for functions that are
	  missing (hopefully this can get rid of more of lint.h especially
	  on SunOS.  Anyone care to test on SunOS?)
	* fixed typo in Makefiles ($(DRIVER) -> $(DRIVER_BIN))
	* added reclaim_call_outs() prototype
	* added debug() accounting code for COMPRESS_FUNCTION_TABLES;
	  uses "comp_func_tab" as a label
	* added "LPC" and "LPC_line" debug() labels; the former uses line
	  number information to print out the file and line of code as it
	  executes.  The latter pulls the line itself out of the source
	  file and prints it too.
	* fixed crasher in safe_apply() due to args left on stack when an
	  error is caught.  (This is the LIMA "crash when updating SECURE_D
	  or master object and getting a warning" bug)
	* The starting debug_level can now be set from the command line;
	  use -d followed by the name of the flag that set_debug_level() uses.
	  e.g. "-dLPC -dLPC_line -dsockets"

Sat Oct  4 23:29:51 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a15
	* updated with respect to v22.1b15
	* added implementation for filter(string, ...)

Sat Oct  4 23:29:51 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* (v22.2a14 release bungled; number skipped)

Thu Sep 25 00:22:45 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a13
	* updated with respect to v22.1b14
	* improved warnings for code with no side effects
	* changed optimizations for casted string constants to obey their
	  new type (just for consistency)
	* resolve() can now take a function pointer as the second arg

Wed Sep 10 01:14:10 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a12
	* added a Perl script compat/fixstatic that does a pretty good job
	  of converting static to nomask/protected

Fri Sep  5 01:01:54 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a11
	* fixed ASCII external ports
	* implemented MUD mode external ports (use "MUD" in the config file;
	  the mixed value gets passed to process_input)
	* Parsing package changes:
	  . parse_sentence has an optional 3rd and 4th arg.
	  . The 3rd arg an array of objects to use in the parse instead of 
	    the inventory of the environment of the user.  Nested arrays
	    indicate containment, i.e. ({ ob1, ({ object inside ob1 }),
	    ob2, ob3, ({ first ob in ob3, second ob in ob3 }), ... })
	  . The 4th argument is a mapping of string -> object which can
	    be used to supply nicknames and similar things.  For this parse,
	    the 'object' acts as if 'string' were returned by pc_id_list().
	    Entries that do not correspond to objects involved in the current
	    parse are ignored.
	  . fixed crashes in calling parse_refresh() from within a parser
	    callback.  This is now the correct way to say "I'm returning this
	    answer, but ask again next time too"

Wed Sep  3 13:30:07 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a10
	* updated with respect to v22.1b12
	* added missing 'return ret' in dump_socket_status() compat simul
	* added parser packages fixes from Belgarat:
	  . new error: ERR_MANY_PATHS
	    returned when the number of possibilities needed to figure out
	    the meaning of a sentence exceeds a certain number (i.e. figuring
	    out certain highly ambiguous sentences isn't worth the CPU)
	  . PARSE_DEBUG can be used to get parser debugging without compiling
	    with DEBUG on
	  . evil new :c modifier that means just choose the first one you
	    find, for MUDs that want to make a mistake they will regret for
	    the rest of their lives, and be hated by their players
	    [nah, the maintainer would _never_ insert personal opinions into
	     the ChangeLog]
	  . "finally, two-object rules are examined more thoroughly and some
	     strange parse errors are eliminated.

	     Changed semantic for applies:
	     direct_ and indirect_ applies can be called with 0s as the
	     object-type arguments. However it's now guaranteed that they
	     will be called with filled object arguments at least once during
	     the processing of a rule.
	     This allows objects to do explicit checks.
	     The direct_ and indirect_ applies should work as usual when they
	     receive 0 as object argument - they simply should return if the
	     object can or can not participate in the rule.
	     When the arguments are filled, the direct_/indirect_ applies can
	     perform thorough checks and return errors."

Sat Aug 30 19:23:35 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a9
	* updated with respect to v22.1b11
	* fixed typo in '\\' handling in #defines; also added overflow check
	* removed unused local in interpret.c
	* added a #breakpoint preprocessor directive which calls 
	  lex_breakpoint(), which does nothing.  Useful for setting debugger
	  breakpoints that stop at a particular point in LPC compilation

Wed Jul 23 18:30:27 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a8
	* added lex.c fixes from Burty:
	  . Handle '\\' correctly in defines
	  . preserve whitespace when expanding defines
	  . added quote checks in expand_all_defines()

Thu May 15 14:14:42 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a7
	* reformatted the trace information with MUDLIB_ERROR_HANDLER off;
	  should be a bit easier to read now.

Wed Apr 16 07:54:45 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a6
	* updated with respect to v22.1b8
	* object_present() now depends on #ifdef F_PRESENT instead of
	  NO_ENVIRONMENT so it disappears in the !NO_ENVIRONMENT && !F_PRESENT
	  case too. [idea from Jihad]
	* name change: the file "Install" is now "INSTALL" to make it slightly
	  more visible
	* fixed file.h to check file_incl.h for S_IS* first [fix from Leto]
	* fixed the multiple class inherit code to work [fix from 
	  Wodan@Discworld]

Sun Apr 13 23:59:02 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a5
	* updated with respect to v22.1b7
	* fixed compilation with DEBUGMALLOC off
	* (: efun::foo :) is now a valid efun pointer (assuming
	  master()::valid_override() doesn't complain)

Sat Apr 12 15:06:30 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a4
	* updated with respect to v22.1b6
	* reclaim_objects() now cleans destructed this_player's and objects
	  out of the call_out() list
	* commenting out input_to() or get_char() in func_spec.c now removes
	  all related code and variables

Sun Apr  6 18:00:43 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a3
	* updated with respect to v22.1b5
	* classes can now be inherited multiple times, as long as the
	  definitions are consistent.
	* fixed macro expansion to expand all arguments to macros immediately.
	  in particular, the ANSI stringize hack:
	#define S(x) #x
	#define STRINGIZE(x) S(x)
	  now works.  E.g. after #define FOO bar, STRINGIZE(FOO) gives "bar"
	  and not "FOO"

Wed Apr  2 15:11:10 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a2
	* updated with respect to v22.1b4
	* specifying both left and center justification in sprintf() now
	  pushes odd-length strings to the left instead of the right, e.g.
	  sprintf("%|8s",  "foo") == "   foo  "
	  sprintf("%|-8s", "foo") == "  foo   "
	* fixed crasher in calling socket_status() for a socket owned by
	  a destructed object [reported by Jihad]

Tue Apr  1 13:59:43 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a1
	* added a slightly improved version of Tim's socket_status() efun.
	  Usage:
	    socket_status(int fd) returns an array with:
	    . ret[0] = (int) fd
     	    . ret[1] = (string) state
     	    . ret[2] = (string) mode
            . ret[3] = (string) local address
            . ret[4] = (string) remote address
            . ret[5] = (object) owner
	    socket_status() returns an array of arrays; one for each socket.
	* COMPAT_BUSTER: dump_socket_status() is gone; see compat/simuls
	  for a replacement [written using socket_status]
	* socket status information is now cleared when the socket is closed
	* fixed a bug that caused the close callback not to be called for
	  sockets that went through the CLOSING state

----------------------------------------------------------------------------
(v22.1a17 promoted to v22.1b1)

Wed Jan 29 19:15:44 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a17
	* updated with respect to v22b27
	* fixed origin() to not return "call_out" for ORIGIN_INTERNAL
	  [reported by Jihad]
	* added Marius' patch to make the parsing package work with
	  NO_ENVIRONMENT.  Requires the following new master applies:
	  . parse_get_first_inventory(object ob)
	    { must behave like first_inventory(ob) }
	  . parse_get_next_inventory(object parent, object current)
	    { must behave like next_inventory(current); 
	      parent == environment(current) in case you need it }
	  . parse_get_environment(object ob)
	    { must behave like environment(ob) }
	  [I'm not in love with this interface, but it will do for now]
	* fixed a number of warnings

Sat Jan 25 18:14:00 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a16
	* wrapped debug.c in #ifdef DEBUG_MACRO
	* fixed crasher in file operations very early in the boot process
	  (before the master object loads); evidentally some libs actually
	  do this [both reported by Aragorn]

Thu Jan  9 20:20:40 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a15
	* updated with respect to v22b26
	* added Raistlin@IE's patches to make the Win32 build procedure much
	  cleaner and not depend on so many GNU utilities; also did a wonderful
	  job of cleaning up the OS specific Win32 code.  Fixes a number of
	  bugs, as well.
	  [ also, I can't test these, since I still don't have a Win32
	    compiler, so I'd appreciate it if someone would let me know
	    if I messed something up ]
	* fixed crasher in explode("foofoo", "foo") with SANE_EXPLODE_STRING
	  on and REVERSIBLE_EXPLODE_STRING off
	* enhanced DEBUG_MACRO a bit; things are now in terms of identifiers
	  instead of impossible to remember numbers.  To add a new one,
	  add the define to debug.h and the entry near the top of debug.c
	  Then do:
	     debug(mylevel, (...))
	  new efuns:
	  . set_debug_level("mylevel")
	  . clear_debug_level("mylevel")
	  . debug_levels() [returns a mapping showing which messages are
	                    enabled]
	* A few changes to call_out:
	  . 0 delay call_outs are legal
	  . call_outs to the same time are in the order they are set up, not
	    in reverse order
	  . call_outs() from w/in call_outs() are relative to the time the
	    call_out was scheduled to go off, not the actual time; this is
	    because:
	  . the current time is slowly advanced as call_outs are executed
	    until the current time reaches the real time, instead of taking
	    a huge leap forward (in the event that the MUD is busy enough
	    that it is getting behind)

Mon Dec 30 04:08:08 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a14
	* fixed compilation with UIDS enabled [reported by Leto]
	* added support for:
	  . allocate(int n, mixed v):
	    allocates an array of n elements.  The i-th element is set to
	    evaluate(v, i) [i is in the range 0..n-1]
	  . allocate_mapping(array keys, mixed v):
	    - if v is an array, the returned array has keys 'keys' and values
	      'v' (like 3.2.x's mkmapping)
	    - if it is a function, the the mapping has keys 'keys' and values
	      evaluate(v, key)
	    - otherwise, each key has the value 'v'

Mon Dec  9 13:27:42 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a13
	* updated with respect to v22b25
	* fixed a bug introduced recently which caused random() to always
	  return zero when drand48() was being used [reported by Leto]
	* changed restore_object() to ignore ^M's at the end of lines in
	  save files
	* added leading / to get_save_file_name() argument [reported by
	  Leto]
	* fixed ARCH define for Linux/alpha
	* fixed some implicitly defined functions which cause warnings on
	  the alpha
	* fixed crasher/wild pointer write in code like:
	  foreach (string s, ref r in m) { map_delete(m, s); r = 0; }

Sun Dec  8 23:50:32 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a12
	* fixed a bug that would cause implicitly defined functions (ones
	  with no prototype in scope allowed by strict types being off)
	  to become invisible when inherited [reported and tracked by
	  Aragorn; also reported to affect NM muds on alpha drivers]

Fri Nov  8 12:03:53 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a11
	* updated with respect to v22b24
	* changed function pointers whose owners are destructed to be
	  ignored by call_out_list() and to not error when they fire.
	  Changed so that "foo" and (: foo :) have the same/similar
	  behavior.  This isn't strictly an equivalent case, since
	  (theoretically) the function could be owned by a different
	  object than the one that did the call_out(), but that is
	  probably restricted to code doing call_out()s on behalf of
	  other objects anyway, and the runtime error is more annoying
	  than useful.  [Suggested by Mordred@RoD]
	* to_int() now returns undefined if no valid characters were converted.
	* leading slash added to in_edit() [reported by Mystic]
	* call srand48() if using drand48() to make random numbers [fix
	  from Turrican@DW]
	* fixed compilation with NO_ADD_ACTION off or OLD_ED on, or
	  NO_BUFFER_TYPE on
	* fixed the order of .o files for RUNTIME_LOADING
	* fixed switch() when two cases differ by more than 2^31
	* better local_options error message

Sat Nov  2 18:00:04 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a10
	* use -m486 for pentium too
	* added /'s in non mudlib error_handler traces
	* fixed compilation with SUPPRESS_ARGUMENT_WARNINGS off
	* receive() can now take a buffer as its argument (useful for
	  PORT_BINARY connections)
	* fixed PROFILE_FUNCTIONS not to miss calls which miss the apply_low
	  cache
	* fixed the driver not to loop if more than one -D option is passed
	  on the command line
	* the debug.log file is no longer opened and closed every time it
	  needs to be written to; it is held open instead
	* made the DEBUGMALLOC hash a bit more efficient
	* fixed a bug that caused terminal_colour() not to strip spaces of
	  the starts of all lines, instead of just continuations of wrapped
	  lines
	* parser callbacks went back to being ORIGIN_DRIVER, since they
	  are restricted to the 'can_', 'do_' and 'indirect_' namespaces
	* various fixes to compilation with uids enabled
	* add to the errors field of mudlib stats, even if a mudlib error
	  handler exists
	* added parser support for 'a', 'any', 'my'

Tue Oct 29 20:41:26 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a9
	* updated with respect to v22b21
	* fixed possible crashers in code like 'call_out(something, 1, ref x)'
	* fixed wild pointer into stack in code like:
	  mixed global;
	  void foo(mixed args...) { global = args; }
	  void create() { int x; foo(ref x); }
	  void inc(int ref x) { x++; }
	  void increment_random_location_on_stack() { inc(global...); }
	* fixed the 'multiple access modifiers' warning not to consider
	  nomask and nosave to be access modifiers
	* disabled the multiple access modifier error message with
	  SENSIBLE_MODIFIERS off
	* fix for compiling with COMPRESS_FUNCTION_TABLES off from Mystic
	* fixed compilation with FD6 code disabled
	* fixed various crashers in the unused locals warnings
	* various changes to func_spec.c so that built in efuns can be
	  disabled or renamed (e.g. remove or rename clone_object(), etc)
	  [idea from Mystic]
	* added support for foreach (ref x in array), 
	  foreach (x, ref y in mapping)
	* better error message for indexing an illegal type using a range
	* enabled the 'public' keyword with SENSIBLE_MODIFIERS on; it was
	  accidentally disabled.  Also fixed the options.h entry to be
	  clearer
	* added a SUPPRESS_ARGUMENT_WARNINGS option, to cut down on the
	  number of warnings generated by code which existed before
	  omitting the argument name was legal
	* fixed terminal_colour() to treat multiple spaces as one space
	  when wrapping [reported by Jihad]
	* fix for errors writing to flushing sockets

Mon Oct 28 17:14:29 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a8
	* COMPAT_BUSTER: 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.
	* Use fd #6 instead of fd #3, since Solaris uses fd #3 while
	  starting the program [reported by Aragorn]
	* fixed crasher in the parsing package generating the object list
	  [fix from Aragorn]
	* 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
	* 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
	* if VIRTUAL_RESERVED_WORD is defined, then 'virtual' is a
	  reserved word.  Doesn't do anything, though.
	* 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.
	* fixed a bug that would cause compile errors when indexing something
	  of type 'mixed'
	* 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

Mon Oct 21 17:48:12 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a7
	* updated with respect to v22b20
	* added Burty@Nanvaent's fixes for stringizing and macro
	  expansion
	* added support for array &= and |= [idea from Avenger@CoreDump]
	* added the object name to the "Saving successful match" parser
	  debugging message [idea from Aragorn]
	* added Leto's SERVER_IP patch
	* abort compilation after getting 5 errors, since we don't print
	  any more anyway, and the leaks this was supposed to prevent
	  were fixed years ago
	* MudOS now checks if file descriptor #3 is a valid socket when
	  it starts up; if it is, it is used as a login port.
	* added a 'portbind' program:
	  syntax: portbind [-p port#] [-d drivername] [-u uid] [-g gid] [args ...]

	  All it does it bind the specified port, then execv() the driver,
	  passing the bound port as file descriptor #3 (see above).
	  drivername defaults to ./driver, and port# defaults to 23.
	  if uid or gid is specified, setuid() and setgid() are called
	  before exec'ing the driver.

	  This means one can bind the telnet port by making portbind setuid,
	  and using:

	  portbind -u <mud uid> -g <mud gid> config.mud

	  to run the driver

Wed Oct  9 15:26:37 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a6
	* updated with respect to v22b19
	* fixed compilation with NO_ADD_ACTION off, PRIVS on, or
	  PROFILE_FUNCTIONS on [re: the 'ob' global recently removed;
	  reported by Aragorn, Jihad, Avenger, etc]
	* only do promotions (int)<->(float) on assignment, not op=; in
	  the second case the conversion will be done by the efun (if
	  legal) so there is no need.

Mon Oct  7 16:43:45 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a5
	* hidden checks are now compiled out if set_hide() is disabled in
	  func_spec.c [idea from Avenger@CD]
	* buffer code is compiled out if NO_BUFFER_TYPE is defined; also
	  fixed a few old references to DISABLE_BUFFER_TYPE.  [idea from
	  Avenger@CD] Also, a binary port in the config file will cause
	  a sensible error message, and attempting to create a binary
	  socket will return EEMODENOTSUPP.
	* removed the 'ob' global in efuns_main.c and related hacks with
	  respect to object_visible(); also fixes a bug in the return
	  value of environment() when it is hidden (and probably other
	  bugs elsewhere too) [reported by Jihad]
	* fixed crasher in using the name of a file that doesn't exist
	  as the object in an efun callback (e.g. filter(({}), "foo", "bar"))
	* fixed a couple compile problems and a crasher in
	  PACKAGE_MUDLIB_STATS [reported by Avenger@CD]

Thu Oct  3 18:16:53 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a4
	* updated with respect to v22b17
	* need to include "master.h" in the uid package now [fix from Leto],
	  mas well as md.c, and master.c needs comm.h when tracing is
	  enabled
	* fixed Makefiles on non-GNUmake systems to include the two new
	  files introduced last pl
	* fixed crasher in the handling of refreshing the master object;
	  also the literals are cached but are *not* affected by
	  parse_refresh().  The reasoning is that if they change, it
	  would cause all hell to break loose with existing rules.
	  So parse_refresh() only needs to be called when the return
	  value of parse_command_users() changes.

Tue Oct  1 19:14:42 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a3
	* updated with respect to v22b16
	* fixed various crashers in the new snoop code [reported by Jihad]
	* Many thanks to DrFeelgood for helping clean up header file
	  dependencies, and pointing out typos in options.h
	* Warning for using both a 'port number : ' line and an 
	  'external_port_1 : ' line
	* moved master object and function pointer handling to their own
	  files
	
Mon Sep 30 18:56:54 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22.1a2
	* updated with respect to v22b15
	* #'foo is now the same as (: foo :) when COMPAT_32 is defined
	  [suggested by Bubbs]
	* added NO_SNOOP option
	* The requirement that a snooper must be interactive has been lifted
	  (though this isn't particularly useful unless RECIEVE_SNOOP is
	   also defined) [suggested by Larnen]

Tue Jun  4 00:57:30 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22.1a1
	* COMPAT_BUSTER: #include <...> now no longer searches based on
	  relative paths; #include "..." still does.
	* added Blackheart's diffs for using gdbm.  See PACKAGE_GDBM for
	  details; probably this should be merged with Descartes'
	  PACKAGE_DB stuff ...
	* added Avenger@CD's diffs for a union array operator (|)
	  (with trivial changes and a array stat fix)
	  Works analogously to &:
	  ({ 1, 2, 3 }) & ({ 2, 4 }) = ({ 2 })
	  ({ 1, 2, 3 }) | ({ 2, 4 }) = ({ 1, 2, 3, 4 })
	* if ARRAY_RESERVED_WORD is defined, use "array" instead of "*"
	  in error messages [e.g. "Bad assignment ( mapping vs array )"]
	* added Marius@Prilnari's fixes to lex.c: token pasting in
	  preprocessor macro expansion and adds token quoting
	* added the -c option to the RUNTIME_LOADING compile flags since
	  it disappeared somehow
	* Hidden object fixes for present() and environment()
	* COMPAT_BUSTER: removed the tail() efun; a simul_efun is in the
	  compat dir
	* added leading / to log_error() filenames
	* cleaned up a bunch of duplicated code in array.c, and corrected
	  a few statistic bugs
	* Parser package changes:
	  . added the object name to some parser debugging messages
	  . moved names of the applies to top of parser.c as #defines
	  . information from the master object is now cached
	    (parse_command_users, parse_command_prepos_list)
	    COMPAT_BUSTER: this means parse_refresh() must be called
	    if the information changes
	  . livings_are_remote() is now rechecked when a parse_refresh()
	    is done

----------------------------------------------------------------------------
(v22a41 promoted to v22b1)

Mon May 27 16:20:09 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a41
	* variable information is now stored only in the program in which
	  the variable is defined; estimated compression ratio is about
	  10:1. YMMV
	* COMPAT_BUSTER: all inherits must now precede all global variable
	  definitions
	* Added Ceda@IdeaExchange's fixes to the Windows '95 port
	* fixed compilation error in c_prepare_catch()
	* added a COMPRESS_FUNCTION_TABLES option, which compresses function
	  tables even further (estimated compression: 2-3x) at the cost of
	  slowing down function calls slightly (<5-10%)
	* Fixed error() to correctly added a trailing \n to error messages
	  that are missing them
	* Crasher fix in mapping composition (from Avenger@CoreDump)
	
Sun May 26 00:37:08 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a40
	* internal function aliases are handled a little smarter, anticipating
	  more function table memory optimizations later
	* fixed some crashers/problems involving #pragma optimize and some
	  compiler errors
	* fixed a crasher in passing a filename that wasn't a string constant
	  to dump_prog()
	* program_info() can now take an object as a first arg
	* fixed a problem that would cause functions that were prototyped 
	  before inherited to call the first function defined in the
 	  object instead.

Fri May 24 00:30:10 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a39
	* 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
	* Fixed a crasher in some Too deep recursion errors
	* Fixed crashers in constructs like while (...){ e = catch { break; } }
	  Jumping out of a catch block is now illegal.
	* Fixed a crasher in program_info() when there are objects without
	  type information loaded

Thu May 23 15:46:10 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a38
	* YYTYPE's size changed from 10 to 8, which should make the compiler
	  slightly more efficient.
	* Fixed a bug in the generation of information to pass to mudlib
	  error handlers, which would cause an "Illegal array size" error
	  to be flagged before the error handler was even called.
	* A few changes to $() notation:
	  . $() now moves out one level, not all the way out.  So, to use a
	    local variable in a function from inside a doubly nested function
	    pointer, one needs to use $($()), e.g.:
	    string x; function f = (: (: $($(x)) :) :);
	  . Due to the above change, constructs like $($1) are now legal, and
	    work as one might expect, e.g.:
	    function f = (: (: write($($1)) :) :); // The inner function
				// function pointer writes whatever is passed
				// as the first arg of the outer one
	    function g = evaluate(f, "hi"); // creates a function pointer that
	                                    // writes "hi"
	  . this isn't really that complex; just remeber the rule "Each $()
	    temporarily removes one level of (: :) nesting."  Familiarity
	    with functional programming is also recomended; (: (: :) :)
	    constructs are function pointers that create and return function
	    pointers when evaluated, _not_ simply composite functions.
	  . there is now a limit to function pointer nesting; the default is
	    10.  (Anyone who needs more is sick, but I thought I'd mention it)
	  . this also fixes a few crashers in using $() inside doubly nested
	    function pointers

Mon May 13 23:16:05 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a37
	* Fixed a crasher in redefined functions
	* added a STRIP_BEFORE_PROCESS_INPUT option for NO_ANSI
	* fixed call_out() to pass zero args if zero args were specified,
	  instead of always passing a first arg of 0.  (Usually, you'd never
	  notice, but it makes a difference when scheduling call_outs to
	  efun pointers to efuns which take no arguments)
	* COMPAT_BUSTER: 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.
	* minor tweaks to the cleanup rules in the makefiles to get rid
	  of a few irrelevant files in the diffs
	* added Maarten de Jong's documentation on compiling MudOS on
	  an Amiga using gcc as amiga/README-gcc.
	* Changed ED_MAXLINE from 512 to 2048
	* Warning for using | or & when both arguments are "boolean" values
	  (e.g. the result of !, ==, !=, <, etc)

Mon May 13 00:29:11 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a36
	* Fixed a crasher in memory_summary() when some objects are swapped.
	* Fixed a crasher in check_memory() when BINARIES was #undef'd
	* '\"' -> '"' in rc.c, since the former confuses emacs's hilit19 mode
	* Better fix for the undefined function problem; the old solution
	  occasionally didn't work on some systems
	* Fixed a problem with aliases in the function table that would
	  sometimes cause ... args not to be handled right
	* Fixed a crasher involving prototypes preceding inherit statements
	* program_info() now calculates the overhead of save_types as well

Sat May 11 20:28:19 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a35
	* Reversed the function table search order in the new call_other 
	  search code to be consistent with overload search order
	* fixed a crasher in generated error messages for OBS rules which
	  have an indirect object
	* added some entries to the files Bugs and Ideas
	* load_binary() now sorts the function table so it is in the correct
	  order again since the order of shared strings is different from
	  when it was saved
	* fixed a bug in the apply_low cache code which was accidentally using
	  'prog', a global, with disastrous consequences when valid_save_binary
	  was called during the tail end of compilation.  'prog' is no longer
	  a global, and is returned where needed.
	* fixed a bug which caused the identifier hash table to become trashed
	  when a function was used before it was defined
	* 'make clean' now removes the testsuite's compile error log too

Fri May 10 22:21:39 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a34
	* moved strput() from the parsing package to the main distribution
	  so it can be used internally
	* Changed the building of compiler error messages to use strput(),
	  avoiding possible buffer overruns.  Normalized the max length of
	  most compiler error messages to 256 bytes.
	* Fixed compilation of PROFILE_FUNCTIONS
	* Fixed a bug introduced last pl that caused the call_other cache
	  to malfunction
	* Fixed octal escapes in strings; they were getting omitted
	* Fixed a crasher in unterminated @ blocks (which, by the way,
	  had absolutely nothing to do with /V\\age)

Tue May  7 14:23:45 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a33
	* moved the call to save the ed buffer of a user to before the
	  call to net_dead()
	* Rewrote most of the function table handling code.  Memory overhead
	  is now 15 bytes per function defined and 5 bytes per function
	  inherited, instead of 14 bytes per function inherited or defined
	  This cuts function table memory usage about in half on a stock
	  Lima lib.  YMMV.  Large open MUDs may see larger decreases;
	  the program_info() efun is a good way to check.
	* Removed the last traces of OLD_PREVIOUS_OBJECT_BEHAVIOR
	* The inheritance warning is now a bit clearer, e.g.:
	  foo() inherited from both /std/foo.c (via /std/bar.c) and 
	  /std/bazz.c; using the definition in /std/foo.c
	* Fixed the parsing package to not crash on reference to 'me' when
	  'me' isn't within sight (admittedly, an odd situation :-) )
	* Fixed the testsuite to realize call_stack(3) now returns strings
	* Tables of defined functions are now sorted, so they can be binary
	  searched; call_other time is now approximately O(m log n) instead
	  of O(m n) when the cache is missed (m = # of inherits, n = # of 
	  functions in each)
	* Removed OPTIMIZE_FUNCTION_TABLE_SEARCH: the new search method
	  is just as fast with no overhead
	* added Raistlin's patch for a parser bug that would cause the
	  verb name to get inserted at the start of the 'real names' section
	  of parser callbacks

Mon May  6 21:47:59 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a32
	* Small optimization to arrange_call_inherited()
	* Small cleanup to C function pointer handling in dumpstat.c
	* fixed a bug that caused dumpstat.c to ignore the size of array
	  headers
	* Fixed the check_memory(1) table to be formatted nicer
	* removed outdated code from program_info(); also fixed a bug that
	  caused the header size to be an absurd value
	* fixed a crasher in function_owner() [ref count bug]
	* 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.
	* Made the parser end of buffer checks a bit easier to maintain
	* added parse_remove(string verb) which removes all rules for the
	  verb 'verb' which were added by this_object()

Mon May  6 14:23:47 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a31
	* Added a FLUSH_OUTPUT_IMMEDIATELY option, which disables buffering
	  of output.  Useful for debugging.
	* Parsing package fixes:
	  . Fixed a bug that caused OBS rules to silently do nothing if
	    all the possible matches return errors beginning with '#'
	  . COMPAT_BUSTER: Now, zeros are passed for args that aren't
	    available yet (i.e. the indirect object in 
	    direct_foo_obj_bar_obj()).  Also, the arg which is currently
	    being worked on is now passed again (i.e. the direct object in 
	    direct_foo_obj_bar_obj())
	    Summary: "foo sword bar wiggle" would call:
	    . can_foo_obj_bar_obj(0, 0, "sword", "wiggle")
	    . direct_foo_obj_bar_obj(OBJ(sword), 0, "sword", "wiggle")
	    . indirect_foo_obj_bar_obj(OBJ(sword), OBJ(wiggle), "sword", 
				       "wiggle")
	    among other things
	  . Fixed a number of bugs and buglets in disambiguating parses
	    and generating error messages, especially in cases where all of
	    the attempts produce nonsense

Sun May  5 14:52:20 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a30
	* added NAME_TRUE_VARARGS flag to disassembly listings
	* propagate NAME_TRUE_VARARGS up the inheritance tree to avoid
	  incorrect argument type errors when #pragma save_types is in use
	* Parsing package fixes:
	  . made the maximum tokens per parser rule configurable at the top of
	    the parsing package [MAX_MATCHES]
	  . Optimizations to bitvec routines: bitvec_count(), get_single() in
	    the parser
	  . Fixed several spots where > MAX_NUM_OBJECTS involved in a parse
	    would cause crashes
	  . Fixed strput/strput_words to not write past the end of their buffer
	    when constructing long strings 
	  . Fixed a crasher in parse_add_synonym() (though it wouldn't crash
	    until the synonym or parse_dump() was used)

Thu Apr 25 01:32:46 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a29
	* fixed a bug that would cause call_outs which were exact
	  multiples of CALL_OUT_CYCLE to be delayed by one CALL_OUT_CYCLE
	  (sometimes could happen with call_outs that differed by a small
	  multiple of 2 from this)
	* removed an unused local in repeat_string
	* Fixed the parsing package to not crash when given a line containing
	  more than 256 words (now it just returns; the limit can be set at
	  the top of parser.c)

Tue Apr 23 16:58:34 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a28
	* added a contrib efun: repeat_string(string s, int n) which
	  essentially does: sprintf("%-*'"+s+"'s", n, ""), but is readable.
	  e.g. repeat_string("-=", 10) == "-=-=-=-=-=-=-=-"
	* redesigned call_outs slightly to allow constant time insertion
	* added a CALLOUT_HANDLES option, which has the following effects:
	  . call_out returns an int, which can be passed to the following
	    two efuns:
	    remove_call_out(int handle)
	    find_call_out(int handle)
	  . Note that using the handle is more efficient than using the
	    ob, function name version
	
Tue Apr 16 11:29:13 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a27
	* updated with respect to v21.7b21
	* Fixed sort_array to work correctly when called from a sort callback

Sun Mar 10 05:32:19 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a26
	* updated with respect to v21.7b20
	* Added Raistlin@IE's fix for a bug in replaceable()'s one argument
	  case introduced in v22a23 which caused the one argument form to
	  quit working
	* Fixed the ARCH define for 386bsd to not override the FreeBSD define
	* changed "stuf!" -> "unknown architecture", when ARCH cannot
          be determined
	* added a classp() efun
	* added support for \012 octal escapes and \x1e hex escapes in
	  strings and character constants
	* added a comment about what the legal values of CFG_LIVING_HASH_SIZE
	  are
	* crasher fix in the database package
	* put a remove_interactive() call back in that accidentally got removed
	  at one point, which caused the driver to busy loop until a message
	  was sent to the object whose link had died
	* COMPAT_BUSTER: two changes to call_stack(3): first, use strings
	  instead of numbers to be consistent with origin(); second, a bug
	  was fixed which was reporting the origin of the frame below the
	  indicated frame, not the frame itself.
	* fixed compilation on systems that use _SC_PAGE_SIZE, not _SC_PAGESIZE

Mon Mar  4 20:36:27 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a25
	* updated with respect to v21.7b19
	* added code to flush message queues when closing connections and
	  shutting down
	* added a flush_messages(void | object) efun for manually flushing
	  message queues (during a long thread of execution, for example)
	* fixed a bug that would cause some anonymous functions to not
	  be bindable
	* fixed a crasher in recursive structures in error traces
	* fixed a bug in sprintf() column mode that would wrap early if
	  a fit exactly in the width given

Fri Mar  1 13:33:14 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a24
	* added Pace@Callandor's patch for REVERSIBLE_EXPLODE_STRING
	* made PARSE_NUMERIC() into a routine instead of a macro, and
	  added support for scientific notation so that very large/small
	  floating point values restore correctly in restore_svalue() and
	  friends

Mon Feb  5 09:43:36 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a23
	* updated with respect to v21.7b18
	* added a 'parallel' target for parallel makes when using gmake
	* protected process_command against this_player() changing or
	  being destructed during process_input() and other nasty places
	* removed the DEBUG_COMM_FREEZE code
	* made the message queue flushing a bit lazier which should result
	  in smoother output and larger packet sizes
	* added Descartes' database package
	* added heart_beat_info() as a synonym for heart_beats() when
	  COMPAT_32 is on
	* 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.
	* added a function_owner(function) contrib efun.
	* made #undef PACKAGE_SOCKETS/#define PACKAGE_EXTERNAL compilation
	  fail more gracefully
	* fixed a parser callback bug that caused the 'real names' of
	  omitted args to be omitted too
	* added an error message for using the debug mode of parse_sentence
	  when the driver wasn't compiled with DEBUG on
	* fixed a bug that would cause parse_sentence() to return large
	  numbers instead of error strings
	* fixed a typo in the Incorrect argument to type %s error message.
	* fixed compilation when first_inventory() is disabled.

Sat Feb  3 13:06:23 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a22
	* fixed seteuid() to pass the correct second arg to valid_seteuid()
	* fixed the parsing package to not crash if parser_error_message()
	  doesn't exist

Sun Jan 21 21:29:34 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a21
	* updated with respect to v21.7b16
	* The master object and simul_efun object can be updated again when
	  LPC_TO_C is not defined; patch from d.collins@ic.ac.uk
	* unified the code handling function pointers/extra args in
	  various efuns; fixes crashers in rare cases.  Also, sort_array()
	  now takes additional args which are passed down the the function,
	  like filter() et al.
	* Added a check for the /usr/ucbinclude directory in ./build.MudOS;
	  Solaris needs <sys/rusage.h> from there
	* Removed push_string() internally; push_constant_string() should
	  now only be used on string constants.  The following changes
	  will preserve previous behavior:
	  . push_string(x, STRING_MALLOC) -> copy_and_push_string(x)
	  . push_string(x, STRING_SHARED) -> share_and_push_string(x)
	  . push_string(x, STRING_CONSTANT) -> push_constant_string(x)
	  . push_constant_string(x) -> share_and_push_string(x)
	  also, new function: push_shared_string(), which pushes and
	  references a known shared string.
	* optimized the PORT_ASCII code a bit, and fixed some problems/loops
	  in it in the presence of bad input/errors
	* fixed a bug that would cause message() to send messages/avoid the
	  wrong people if the target/avoid argument was _not_ an array,
	  and the function was called during the processing of another
	  message call whose target/avoid was also not an array
	* removed XALLOC(), since it isn't used any more
	* fixed mapping hash distribution and centralized the definition of
	  it
	* optimized terminal_colour a bit
	* optimized present() a bit; also fixed a leak in errors in id()
	  functions
	* the message of the message() efun may now be of any type; this
	  actually was side effect of a fix that makes message() more
	  efficient :-)
	* fixed a crasher in sprintf() table mode, when no number of
	  columns was specified (best fit)
	* improved the packages/ and mudlib/ dependencies a bit
	* configure.h is now remade if the information in 'uname -a' changes
	* no longer log a 'double call to remove_interactive()' if an object
	  self-destructs in net_dead()
	* There is no longer a limit on the number of sockets available;
	  if a limit is wanted it should be enforced in valid_socket()
	* fixed sprintf() column mode to wrap at the column width, not one
	  before
	* added a couple testsuite tests for sprintf table mode
	* ./build.MudOS now prints an error message if an unknown kind of
	  build is attempted instead of silently assuming the default
	* Parser changes:
	  . Two new restrictions; only one plural token is allowed per rule,
	    and only two object tokens are allowed per rule.  The second may
	    disappear after I clean it up a bit.
	  . fixed a crasher in having more than MAX_NUM_OBJECTS involved in
	    a parse
	  . 'all' is now supported, also 'all of ...', 'all red swords', etc
	  . Cases where more than one object are matches, but only one makes
	    sense now work
	  . in callbacks, only objects that have been completely parsed can
	    be refered to.  This means can_ and direct_ functions can't
	    reference the direct or indirect objects.  The corresponding
	    spots in the argument list are missing.
	  . OBS rules use the _obj_ callbacks, with the exception of do_
	  . error handling is now up to the master object via the
	    parser_error_message() apply.  The first argument is a int
	    indicating the error type.  The second is an object if this
	    message corresponds to part of a plural match, otherwise it
	    is zero.  The third and following args depend on the error
	    type (from include/parser_error.h):
	    ERR_IS_NOT, ERR_NO_LIVING, ERR_NOT_ACCESSIBLE:
		the noun used, and then 0/1 depending on whether there
	        ambiguity
	    ERR_AMBIG:
	        an array of objects that might have matched
	    ERR_ORDINAL:
	        The number that was refered to
	    ERR_THERE_IS_NO:
	        The string that couldn't be matched
	    ERR_ALLOCATED:
		The error message returned by the mudlib
	    ERR_BAD_MULTIPLE:
	        nothing
	    [note: if you want more info that you think the parser might
	     have, let me know]
	    compat/parser_error.c has a decent approximation of the old
	    behavior
	  . do_foo_obs() gets an array of objects and error messages as
	    the arg corresponding to obs
	  . Returned error strings which start with '#' are assumed to
	    be nonsense messages, and aren't counted for the purpose of
	    ordinals and all.  Useful to prevent 'get all' from printing
	    an error for yourself and the room, and to keep 'drop first sword'
	    from counting swords in the room.

Sat Jan 20 15:47:06 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a20
	* removed process_string() and process_value(); simul_efuns are
	  availaible in the compat/simuls directory
	* Fixed a memory leak in new(class foo, bar : baz, ...)
	* fixed compilation problems in grammar.y.pre, shallow_inherit_list,
	  object.c
	* fixed a typo: m_indices() is keys(), not values(); also added
	  m_delete
	* pluralization fixes: 'are', 'mackerel'
	* added Rust's timezone efuns to contrib; turned off by default
	  since they may not compile everywhere

Wed Jan  3 16:12:50 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a19
	* updated with respect to v21.7b15
	* All values which were previously 'null' are now undefined instead;
	  nullp() is now exactly the same as undefinedp()
	* added a COMPAT_32 option, which tweaks a few things to allow
	  some 3.2/3.2.1 code to be ported easier; see options.h for
	  what changes
	* shallow_inherit_list() is now the same as inherit_list() [unless
	  COMPAT_32 is on, in which shallow_inherit_list() is the MudOS
	  behavior, and inherit_list() becomes deep_inherit_list() ]
	* error message change: 
	    Missing type -> Missing type for global variable
	* Don't raise type mismatch errors for code of the form
	  'identifier = expr'; 'Missing type for global variable' is good
	  enough
	* Don't manually include <sys/resource.h> and <sys/rusage.h> in
	  interpret.c; trust configure instead
	* fixed a parser crasher in refering to 'noun', when more than
	  4 adjectives are possible
	* Fixed sprintf table mode to not stretch the last line to fit
	  the field width

Wed Jan  3 14:29:43 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a18
	* fixed some serious flaws in class member lookup introduced in a17

Tue Jan  2 17:59:42 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a17
	* updated with respect to v21.7b14
	* fixed a crasher in the call_out leak fix from v22a1
	* turned off PACKAGE_EXTERNAL by default
	* fixed a bug that caused the messages from saving the ed buffer
	  of an object which was dested while in ed to be appended to the
	  start of the next message sent to an object using ed.
	* check for wait3() as well before using BSD signals
	* removed wait() from lint.h since we include <sys/wait.h> now
	* fixed a couple bugs in the handling of functions in the memory
	  leak tracking code
	* fixed a crasher in add_action(function) when the driver is
	  run with the -d flag
	* fixed the addr_server not to crash if gethostbyname() fails for
	  some reason
	* function(...) { ... } is now rebindable if it does not reference
	  local functions or global variables
	* switch (...) { case 0: function() { break; }; },
	  while (...) { function() { continue; }; },
	  and similar pathological code is no longer allowed.
	* bind(f, ob) now always succeeds if f is already bound to ob
	* added back the fast version of livings() from v22a14 as a contrib
	  efun named_livings(); also fixed it to not return objects which
	  are no longer living()
	* added class support in reclaim_objects()
	* trailing justification is no longer added to the last line of
	  tables if no pad string was specified
	* The following is now legal:
	  class foo { int x; string y; }
	  class foo f1 = new(class foo, x : 5);
	  class foo f2 = new(class foo, y : "foo", x : 1);

Sat Dec 30 20:55:41 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a16
	* updated with respect to v21.7b13
	* changed the name of strerror to port_strerror to avoid prototypes
	  on SunOS, which prototypes the function but never defines it
	* Removed a number of prototypes in lint.h for functions which are
	  also prototyped in SunOS headers now
	* Fixed a bug that would prevent two way communication with external
	  commands
	* Small optimization to the string case of socket_write
	* Tracked down the real problem which caused sprintf() to crash
	  on empty tables; also fixed a crasher empty lines in column mode
	* reversed the livings() patch, since not all living objects are
	  in the hash table
	* #ifdef'd out some unnecessary code for when LPC_TO_C is off
	* Remember to wait on our children, so we don't create zombies;
	  configure checks to figure out whether to do it the BSD or
	  Sys V way
	* Removed some archaic defines from portability.h
	* Changed the parse_sentence return codes again:
	  1 - success
	  0 - no such verb
	 -1 - verb exists, but no rule matched
	 -2 - a rule made sense, but can_ or direct_ failed
	* Fixed a typo in the 'Illegal master object file name' error message

Fri Dec  8 20:53:11 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a15
	* updated with respect to v21.7b12
	* changed livings() to walk the living hash table instead of the
	  full object list; idea from Jihad
	* '\r' is now treated as whitespace by the compiler
	* The success return code of parse_sentence is now 3, not 1.
	* changed the return type of parse_sentence from 'int' to 'mixed'
	* Fixed a crasher in using a function pointer as a read callback
	* If PACKAGE_EXTERNAL is defined, then lines of the form:

	  external_cmd_1: /usr/local/bin/gzip

	  in the config file allow the mud to run the command using the
	  following efun:
	  
	  int external_start(int which, string args,
	                     mixed read_cb, mixed write_cb, mixed close_cb)

	  which is the command number (e.g. 1 from the example above)
	  args is the argument passed to the command.  A socket is returned,
	  which can be used to communicate with stdin/stdout of the command.

	  valid_socket() is passed "external" as the operation.
	  Up to 5 commands are allowed.

Thu Dec 21 01:33:34 PST 1995 (gstein@svpal.org (Deathblade))
	* raised patchlevel to v22a14
	* fixed varargs by tweaking grammar.y.pre to not turn off the
          TYPE_MOD_ARRAY flag for the varargs variable
	* fixed sprintf() crasher when tables are used (Rust and Zakk)

Thu Dec  7 12:30:20 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a13
	* fixed crasher in disabling a heart_beat during a heart_beat
	* fixed sprintf() to not add trailing padding onto wrapped strings
	* removed the break_string() efun.  See compat/simuls/break_string.c
	  for a replacement.
	* fixed a few more misoptimizations of last variable references by
	  the optimizer.
	* added a warning for putting varargs args into a variable of
	  non-array type, also fix a bug that would cause type errors
	  if the prototype was in scope
	* parse_sentence now returns:
	    0 - no such verb
	    1 - verb exists, but no rule matched
	    2 - a rule made sense, but can_ or direct_ failed
	  in the cases where it used to return zero.
	* parse_add_rule no longer has a third arg; it is always this_object()
	* New parse efun:
	  parse_add_synonym(string new, string old):
	    . interpret the verb 'new' as if it were the verb 'old', and
	      parse using 'old's rules and routines
	  parse_add_synonym(string new, string old, string rule):
	    . 'new' acts like 'old' for only the rule 'rule', which must
	      have been previously added.  Can be called multiple times.

Wed Dec  6 18:00:15 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a12
	* fixed a crasher in passing a negative number as the field width
	  via the '*' specifier
	* fixed a crasher in strings which were too long to fit into tables
	  in table mode

Tue Dec  5 19:30:12 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a11
	* fixed two crashers in the table generation logic of sprintf(),
	  also fixed a bug that would cause the second and following
	  lines to be indented wrong
	* fixed tables to fully fill the space allocated to them in
	  the format description
	* The fill pattern for tables and columns always fills out the
	  entire 'box' now; e.g.
	  printf("%#|30'.'s\n", "apple\nbannana\ncherry\ndonut\nelf\nfruit\n")
	  gives:
	    ...apple....cherry......elf...
            ..bannana....donut.....fruit..
	  and not:
	    ...apple....cherry......elf
            ..bannana....donut.....fruit

Mon Dec  4 16:13:59 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a10
	* updated with respect to v21.7b11
	* moved values_list in function_context_t and node in decl to
	  align slightly better
	* fixed the direct/dirent check to include std_incl.h in case it
	  has some defines needed by those files
	* removed some really old and unused files of the compiler %union
	  (address and funp; the second of which predates me ...)
	* small optimization to the lexer's handling of comments in
	  preprocessor lines
	* major changes to sprintf.c:
	  . COMPAT_BUSTER: error messages are never returned any more, but
	    are thrown as errors instead.
	  . 'clean' is no longer used, so cannot be leaked
	  . COMPAT_BUSTER: "%^" is no longer special (for efficiency reasons,
	    as well as disagreements on the exact algorithm)
	  . The format string is never written into, eliminating the need
	    for savechars and related hacks; fixes a crasher in extremely
	    long strings in tables (>2k)
	  . The setjmp()/longjmp() is gone, since the cleanup can be done
	    on the next call to sprintf() now
	  . sprintf() is now officially not reentrant, and you will get
	    an error if you try.  It probably crashed before if you tried
	    it.  The only LPC code called by sprintf() is object_name(),
	    so this shouldn't be a problem
	  . on the whole, things should be significantly faster (slightly
	    more than 3 times faster on the small example I used),
	    mostly due to collecting sets of characters instead of adding
	    characters individually, and removing redundant length calculations
	  . large portions of the file are now actually readable

Mon Nov 27 22:51:35 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a9
	* updated with respect to v21.7b10
	* COMPAT_BUSTER: The scope of for and foreach loop variables is now
	  only the inside of the loop.  This also fixes a bug demonstrated
	  by the following:
	   { int i; for (int j;;) ; } { int i; }
	* Some error message changes:
	  . Indexing on illegal type
	    -> Value being indexed is zero/Cannot index value of type 'foo'.
	  . Indexing a (string/array) with an illegal type
	    -> (String/Array) indexes must be integers
	  . Negative index passed to array
	    -> Array index must be positive or zero

Wed Nov 22 12:52:13 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a8
	* updated with respect to v21.7b9
	* fixed a typo in ./build.MudOS (CC -> $CC)
	* fixed a crasher in copying parse_command_* arrays which are empty

Tue Nov 21 17:16:10 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a7
	* updated with respect to v21.7b8
	* fixed the ar test to make sure comptest.o exists in ./build.MudOS
	* Leading and trailing whitespace in the values in the config file
	  is now ignored

Wed Nov 15 14:41:20 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a6
	* updated with respect to v21.7b7
	* Better system for reporting bad malloc configurations (two malloc
	  packages, etc) and system configuration errors
	* Report a redefinition error if classes with the same name are
	  inherited from different files
	* Fixed the "Return type doesn't match prototype' error message
	  to only be printed once per occurance, not twice

Tue Nov 14 12:53:51 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a5
	* updated with respect to v21.7b6
	* A few small tweaks to the testsuite cleanup
	* fixed crasher in printing a string containing a '%' when
	  NONINTERACTIVE_STDERR_WRITE was defined
	* some small cleanups to includes in socket_ctrl.c

Tue Nov  7 17:50:22 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a4
	* updated with respect to v21.7b5
	* updated all the Makefiles with respect to Makefile.master
	* minor change: use 0 instead of -1 for master_ob not loaded yet since
	  we no longer have to distinguish between unloaded/not loaded yet
	* added MDmemcheck() which can be inserted into the source to do
	  internal memory consistency checks and abort if corruption is found
	* added back some parser fixes that were missing due to reversed
	  patches
	* Two new options to ./build.MudOS:
	  - ./build.MudOS develop -> turn on warnings and debugging code
	  - ./build.MudOS debug -> turn on debugging symbols and code

Fri Nov  3 16:41:11 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a3
	* updated with respect to v21.7b4
	* couple changes to void handling, basically (int)->(void) is no longer
	  legal.  The following are now errors:
	  . int f(void x) { ... }
	  . ... { void x; } ...
	  . void x;
	  . class foo { void x; }
          . void f() { return 1; }
	* defining a variable is now allowed in foreach, e.g.:
	  . foreach (string x, object y in z)
	* fixed a crasher in errors in parse_* callbacks

Sun Oct  8 19:48:21 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a2
	* updated with respect to v21.7b3
	* COMPAT_BUSTER: previous_object() == 0 and not this_object() in
	  heart_beats
	* remove_call_out(/* no arg */) now returns 0 always, not -1
	* fixed a bug in the replace_string() with all 5 arguments in
	  some cases
	* fixed a bug in restoring mappings which had arrays/mappings/
	  floats as keys
	* added some missing newlines to regexp() error messages
	* fix to the center/left justify case for ints; remember to
	  add the padding to the right side as well in sprintf()
	* more testsuite efun tests; finished through 'sprintf()'
	  or so
	* made it illegal to undefine or redefine a global define like
	  __VERSION__
	* added a NO_RESETS option
	* better error message for people who don't choose a malloc package
	* fixed various crashers involving passing garbage back to the
	  parser inside arrays
	* fixed leak in sprintf() for printing recursive structures; attempting
	  to do so no longer errors.

Sun Oct  8 19:27:28 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a1
	* removed some outdated code (c_filter() and f_creator())
	* fixed a crasher in removing heart_beats during a heart_beat
	* fixed a leak in call_outs with more than one extra argument
	* fixed a leak in illegal arguments to call_stack()
	* fixed set_light() to compile with NO_ENVIRONMENT (for the
	  ultimate in bleeding edge uses of archaic efuns :) )
	* added some checks to make compilation bomb more informatively
	  if two malloc packages/wrappers are specified
	* cleaned up the signal handling code a bit
	* fixed compilation of the matrix package
	* fixed compilation with NO_ENVIRONMENT and !NO_ADD_ACTION
	* fixed compilation with DO_MSTATS and SYSMALLOC
	* fixed testsuite to compile and work with either setting of
	  INTERACTIVE_CATCH_TELL, NO_ADD_ACTION, PACKAGE_UIDS,
	  NO_ENVIRONMENT, NO_WIZARDS, PRIVS
	* revamped the testsuite efun tests, and added tests for most of
	  the efuns 'a' through 'r' or so
	* testsuite now logs compilation errors to /log/compile
 
----------------------------------------------------------------------------
v21.7a10 promoted to v21.7b1

Fri Sep 22 22:51:20 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a10
	* fixed a bug that caused case 0: to not work in string switches
	* fixed a typo in the unknown pragma error message
	* rule priority is now calculated beforehand in the parser; this
	  fixes the precedence of some errors and allows earlier shortcutting
	* 1st through 9th and first through ninth are now understood by the
	  parser
	* "Which X do you mean?" is now more verbose
	* 'myself' is now the same as 'me'

Mon Sep 11 03:37:53 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a9
	* fixed debug_info(2, ...) to put all the info in the string;
	  it was still sending some of it directly to this_user()
	* slight optimization (condense two consecutive strlen() calls)
	  in regular expressions
	* -DPEDANTIC now allows the use of inline to be turned off, since
	  gcc only defines __STRICT_ANSI__ when -ansi is used, and not
	  when -pedantic is used, but -pedantic complains loudly about inline,
	  and -ansi causes the SGI headers to break.  Unfortunately, gcc
	  only gives some useful warnings when -pedantic is on
	* fixed up some (unsigned char *) <-> (char *) problems
	* fixed an optimizer bug that would clobber range expressions and
	  generate incorrect code
	* Added documentation of makefile targets to the makefiles
	* Added a .DEFAULT rule for the decoy makefiles so better errors
	  are generated when the wrong make is used with a target
	* Made the SIGPIPE always reenable the handler, not just on Linux,
	  since other OS's (Solaris) behave this way as well
	* Fixed the gettimeofday() check to use two args, so it wouldn't
	  fail on BSD based systems
	* fixed a compile error in OPTIMIZE_FUNCTION_TABLE_SEARCH
	* added a handler to ignore SIGFPE for those systems that raise it
	* changed "create" to APPLY_CREATE in replaceable()
	* fixed a parser crasher when parse_command_users() doesn't exist
	* removed a if (pointer >= 0) check in the parser
	* fixed a crasher in the 'last match to error' handling in the parser
	* fixed a crasher in parse_command() when the object array had
	  non-objects in it
	* fixed some NO_ENVIRONMENT compilation problems, especially when
	  NO_ADD_ACTION was NOT also defined.  (add_action w/o environments
	  is a tad pointless, but it works now)
	* fixed a bug that cause query_verb() to only return the matched
	  portion and not the entire verb
	* fixed (s)printf() to not print destructed objects

Fri Sep  8 03:34:50 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a8
	* updated match_path() to know about the mapping changes
	* preliminary OBS changes; OBS and LVS are recognized as tokens now;
	  currently they behave exactly the same as OBJ and LIV
	* fixed a few uses of new_string as a variable name
	* fixed a parser in generating arguments for parser callbacks

Sun Sep  3 21:47:54 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a7
	* cleaned up -Wall compile
	* better code to check the string statistics, leading to:
	* fixed the string stats bug(s); the figure should be correct again now
	* improved the error message for "owner of function pointer destructed"
	* removed the storing of the hash value in mapping nodes; mapping
	  memory usage should be down ~20%; also optimized a bit, so
	  most mapping operations should be faster
	* crasher fix in %o case of parse_command()

Wed Aug 30 19:36:35 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a6
	* crasher fix in edit_source -configure from Valodin
	* moved the CONFIGURE_VERSION define to the end of configure.h so
	  incomplete configure.h files are detected as corrupt
	* removed the each() efun
	* crasher fix in the optimizer (no local variables again)
	* updated the tag info in check_memory(1)
	* fixed check_memory() to not accidentally complain about the string
	  it is building
	* fixed a bug in the mark and sweep memory debugging of the parser
	* fixed a crasher in verb handlers that call parse_refresh()
	* fixed a memory leak in objects that call parse_refresh()
	* remember to add the real names when calling can_* callbacks
	* fixed a bug that would cause parser error messages to be truncated
	* fixed a memory leak in incoming MUD mode socket packets
	* added a bunch of bug reports to Bugs
	* fixed a line number bug in '\<line break>'
	* fixed @@ to work again, evidentally noone has used in in over a
	  year since it hasn't worked since Robocoder added L_ARRAY_OPEN ...
	* fixed odd errors if the end of the input buffer is hit while
	  parsing a macro expansion; found by Tensor
	* fixed a line number bug in macro arguments with newlines in them

Tue Aug 29 17:11:06 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a5
	* updated with respect to v21.6b6
	* Merged in Descartes' diffs for Windows NT and Windows 95.  Someone
	  please check these; I fixed/changed a bunch of things, but have no
	  way of testing them, and there are probably some mistakes.
	* removed the old OS2 code, since noone ever got it to work ...
	* added support for foreach (int in string)
	* fixed a fatal error when a string > 64k in size was added to an
	  outbuffer.
	* changed sprintf() to use outbuffers, speeding up sprintf a bit,
	  and expanding the size limit to 64k
	* fixed type error for sizeof(array constant)
	* it's now legal for an ed range to go past the end of the file;
	  any line # greater than the file size refers to the last line.
	* fixed a bug that caused varargs contraction to not be done when
	  the call_other cache was hit, or when one does inh::foo()

Sat Aug 26 19:37:38 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a4
	* reorganized the function_t struct slightly to save a bit of memory
	* added a warning for return types that don't match their prototypes;
	  currently ignores modifiers, since accepted usage is so gross in
	  this respect it isn't even funny.  The next item might help:
	* added "private:" which makes all function definitions/globals after
	  it private (until the next such section).  Works with any type
	  modifier (static, private, protected, public, nomask, varargs)
	* optimization fix: remember to put the replacement node in the tree
	  when doing: if (x) {} else y -> if (!x) y
	* catch, time_expression, and __TREE__ now generate explicit code
	  to pop the value instead of doing it inside F_END_CATCH.  This
	  makes the grammar a bit simpler, and generates better code for
	  catch { ... } and catch(x = ...), which are common cases
	* fixed sizeof( ({ ... }) ) to preserve side effects inside the
	  array constant, for crappy code like sizeof( ({ i++ }) ),
	  which now compiles to: i++, 1
	* changed edit_source to include configuration info when doing tests,
	  so we can check for defines in include files
	* run ranlib on the mudlib/ and packages/ files for systems that need/
	  like it.
	* added a WRD token in the parser, which is just like a STR but only
	  matches one WoRD.
	* fixed a bug that chopped a letter off the results returned by STR
	  rules
	* xxx_verb_yyy() callbacks now include the name of the verb in the
	  'real names' part of the argument list, so for example "kick! beek"
	  would call (among other things):
	  can_verb_obj("kick", OBJ(beek), "kick!", "beek")
	  This should satisfy the people who have been mailbombing me asking
	  for a way to get at the real form of the verb :)
	* fixed a few warnings in the parser
	* When the return value of a construct is unused, and the construct
	  has no side effects, replace it by it's arguments (recursively)
	  possibly eliminating the construct entirely.
	  i.e. the following generates no code:
	
	int x; class bar y; array z;
	((({ ~x })[!x..<x+3] ? (y->foo)[(x*2)-1..] : ([1:2, 3:x])), -z[x]);

Thu Aug 24 06:58:46 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a3
	* configuration checks for broken libg.a Linux configurations,
	  <dlfcn.h>, -ldl, RTLD_LAZY
	* try cc -E -traditional-cpp as a possible preprocessor in build.MudOS
	* Use ANSI USHRT_MAX instead of MAXSHORT if availiable
	* reworked the handling of novalue efuns to be more robust; fixed
	  crashers in (void efun) || (void efun) among other things.
	* Patches from Symmetry:
	  . made Config.Example match the testsuite setup
	  . fixed mapping case in dump_variable() for testsuite
	  . bugfix in resolve_path() in testsuite
	  . allow (: function() { return $1; } :)
	  . optimize x[y..<1] to x[y..]
	  . optimize dested obs in F_TRANSFER_LOCAL
	  . crasher fix for swapped objects in program_info()
	  . fixed disassembly of efun function pointers

Mon Aug 21 03:58:32 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a2
	* fixes from Symmetry for #undef RUNTIME_LOADING
	* added Zakk's query_ip_port() contrib efun for finding out which
	  port an object connected to
	* fixed a parser bug that would sometimes cause objects to fail
	  to be recognized the first time they were referenced.  Many, many
	  thanks to Deathblade for helping to track down this one
	* Added filenames to the parser error messages
	* improved the handling of punctuation; verbs do NOT include
	  punctuation again, although this may change; stay tuned ...

Thu Aug  3 20:25:27 EDT 1995 (tim@handel.princeton.edu (Beek))
	* created v21.7a1 from v21.6b3
	* valid_compile_to_c() in the master object now controls the use
	  of the generate_source efun.
	* RUNTIME_LOADING works if your system supports dlopen()/dlsym();
	  define it in options.h, then use generate_source(filename)
	  to load the object.  Note that /lpc2c in the mudlib must be
	  a symbolic link to the driver source.  Objects loaded in this
	  manner do not show up on lpc_info() [yet]
	* The restriction which disallowed cloning of objects with
	  environments was removed
	* destruct()'ing the master or simul_efun object now fails if a new
	  copy can't be loaded.  This means that once the mud starts, a
	  master or simul_object is ALWAYS loaded.
	* preliminary changes for disallowing calls to private functions;
	  you can still get past it in odd cases (e.g. calling the function
	  before you inherit it)  More changes in a patchlevel or two.
	* fixed a bug that caused // and /* to be interpreted as comments
	  within continuation lines in #define's
	* fixed the F_WHILE_DEC optimization, and added support for it
	  in loops of the form 'for (...; x--; ...) { ... }'.  Centralized
	  the handling of loop test optimization.
	* optimize empty blocks for if's
	* removed some mentions of 'actlab' in the docs
	* added some new exit codes to the Exit_Codes doc
	* added NO_ENVIRONMENT in options.h
	* fixed the disassembly of F_LOOP_COND_NUMBER
	* fixed a crasher/wierd behavior in using 'array' to declare arrays
	* fixed a bug that made using a (blank) simul_efun object necessary
	* added DEBUGMALLOC support for the parsing package
	* added support for classes in copy()
	* fixed a bug that chopped the last letter off of some
	  parser error messages
	* updated the testsuite lib to run under the default driver 
	  configuration

----------------------------------------------------------------------------
(v21.6a11 promoted to v21.6b1)

Tue Jul 18 02:23:22 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a11
	* updated with respect to v21.5b10
	* fix from Marius for a crasher in x[<y] when x and y are constant
	* fixed a bug that would incorrectly generated varargs expansion
	  code for (*f)()
	* null terminate crypt() strings, in case crypt() is des_crypt() in
	  disguise
	* in get_single() in the parsing package, binary search the bitvectors
	  instead of doing a linear search
	* added int regexp(string, string)
	* fixed a bug in code generation for return statements in LPC->C
	  introduced during the compiler rewrite
	* only include <values.h> if MAXSHORT isn't in <limits.h>
	* fixed a crasher in filter()
	* fixed 'safe' -> 'saves' in pluralize()
	* fixed TRACE compilation with NO_WIZARDS
	* fixed regexp() to not crash on eight-bit characters in the format
	  on hosts where 'char' is signed

Sat Jul 15 14:35:50 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a10
	* updated with respect to v21.5b9
	* backed out the VOLATILE changes to compile_file.c since it relies
	  on a gcc extension
	* fixed a crasher in true varargs functions with local variables
	* added configure checks for <mach.h> and <mach/mach.h>
	* fixed a crasher in undefined functions
	* COMPAT_BUSTER: filter_mapping() now passes the value as the
	  second element, just like map_mapping()
	* fixed the Makefile to support options in grammar.y.pre; this
	  probably should be changed to use a %include "options_incl.h"
	* added y.output and tmpdepend to 'make clean'
	* fixed `system_libs` -> `cat system_libs` in the Makefile
	* fixed a few DEBUG crashers in the parser package

Thu Jul 13 04:05:49 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a9
	* updated with respect to v21.5b8
	* backed out the VOLATILE changes to sprintf.c since it relies on a
	  gcc extension
	* updated the Makefile not to define EDIT_SOURCE any more
	* implemented the parser generated error messages for the parsing
	  package
	* added the other half of varargs support, allowing the following:
	  void log(string file, string fmt, array args ...) {
	      write_file(file, sprintf(fmt, args ...));
	  }
	  void foo(int x) {
	      log("/log/foo", "foo() was called with: %i\n", x);
	  }

Thu Jul  6 03:52:27 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a8
	* fixed to_float("illegal string") to always return 0.000000
	* added testsuite tests for to_int() and to_float()
	* fixed a crasher in illegal indexes to array constants
	* 'make depend' now works again when using GNU make
	* edit_source -configure is never rerun if configure.h exists,
	  even if the file is out of date (it takes too long, and the
	  info shouldn't change).
	* fixed a dependency problem that caused configure.h not to get built
	* DEBUG is now visible to %ifdefs
	* check for <values.h>; MAXSHORT is there on SGI
	* removed some unused variables
	* added __TREE__(expr) and __TREE__{ ... } which evaluate to arrays
	  representing the compiler's internal representation (IR) of the
	  given code.  For example,
	  __TREE__(x + y) gives: ({ "binary op", "+", ({ "opcode_1", "local",
	                            0 }), ({ "opcode_1", "local", 1 }) })
	* catch { ... } and time_expression { ... } are now legal.
	* if ARRAY_RESERVED_WORD is on, then 'array' now associates with the
	  type and not the var, for example:
	  int array x, y == int *x, *y and not int *x, y
	* 'array' by itself is now allowed, meaning 'mixed *'
	* fixed a bug in type checking that allowed 'x *' and 'x' to be
	  compatible in one order, but not the reverse

Fri Jun 30 16:44:33 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a7
	* updated with respect to v21.5b6
	* merged Makefile.MudOS back into the main Makefile
	* added implode(array, function, mixed) where the third
	  argument is the value to start with, as in:
	  flatten(arr) {
	      if (arrayp(arr)) return implode(arr,(: $1 + flatten($2) :),({}));
	      else return arr;
          }
	* fixed make_func.y to give file and line numbers on fatal errors
	* added configure checks for getrusage(), times(), gettimeofday(),
	  and fchmod() instead of using hard coded information
	* figure out the correct type for UINT32 in configure
	* removed the 0.9.18 compat efun package
	* fixed a crasher in remove_interactive()
	* disabled the lookat_rotate2 efun in the matrix package as it
	  uses more arguments than the compiler currently supports

Tue Jun 27 01:10:27 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a6
	* fixed the debug checks to not panic on nested foreach's
	* fixed edit_source -configure to not get fooled by OSF's queer
	  non-standard BSD compatibility includes
	* fixed a crasher in passing a bad argument to call_stack()
	* optimized upper_case() and lower_case()
	* fixed an ANSI style declaration in eoperators.c
	* a couple minor fixes for alpha; also fixed DEBUGMALLOC to work
	  correctly on alphas

Fri Jun 23 02:39:02 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a5
	* updated with respect to v21.5b4
	* fixed a bug that caused sizeof(array constant) to always be 16

Tue Jun 20 16:25:14 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a4
	* updated with respect to v21.5b3
	* fixed a few bug in using x[y..z] as an lvalue
	* fixed an error in setting the return type of time_expression()
	* added packages/parser.c, a flexible parsing system for interactive
	  fiction applications
	* fixed a crasher in variables()
	* added a workaround for getting EINTR while trying to seek the swap
	  file 

Sun Jun 18 11:33:07 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a3
	* fixed a bunch of warnings from gcc -Wall
	* fixed c_update_branch_list() to not generate unused labels
	* COMPAT_BUSTER:
	  origin() and typeof() now return strings.  If you use the defines
	  in the driver include/ files, you're fine (assuming you update your
	  includes)
	* fixed some compilation problems with local variable optimizations
	* put the mudlib/ directory back to the default one
	* fixed a bug that was disabling the while_dec optimization
	* efun::new() is legal again
	* the type info in functions() are now strings
	* variables now has an optional flag just like functions
	* fixed a bug in replace_string() that would not copy the elements
	  which matched the search string which were not replaced in the
	  case when the replace string is longer than the search string

Thu Jun 15 09:15:23 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a2
	* updated with respect to v21.5b2
	* made functional procedures in LPC->C static so they don't interfere
	  across multiple files
	* fixed a bug that inserted extra to_int/to_float() calls even when
	  the expression had already been reduced as a constant, i.e.
	  1 + 2.3 -> 3.3 and not to_float(3.3)
	* reorganized the compiler's intermediate representation to be
	  easier to optimize/generate code from.  nodes now have general
	  types like NODE_BINARY_OP instead of the old form.
	* removed support for PRAGMA_EFUN
	* optimized the last use of a local in a frame by transfering
	  instead of copying.  If the last use is in a switch() or loop
	  it is ignored.  The same trick is also done for use of a local
          right before an assignment, as in: write(x); x = 1;
	  (only done when #pragma optimize is on)
	* split F_LOOP_COND up into F_LOOP_COND_NUMBER and F_LOOP_COND_LOCAL

Mon Jun 12 04:45:44 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a1
	* expression function pointers, anonymous functions, and foreach
	  now work in LPC->C code.
	* added class support in LPC->C code
	* updated ccode.c with the icode.c cleanups
	* added a warning for [x] and [y..x] when x is a negative constant
	* optimized LPC->C string constants
	* optimized the calling of efuns.  All arguments are now checked
	  automatically.  The format is now:
	  . efuns which _always_ take one arg have opcodes like eoperators
	  . New efun eops which includes the number of arguments F_EFUN0,
	    F_EFUN1, F_EFUN2, F_EFUN3 which is followed by the efun index
	  . F_EFUNV for efun calls using 4 or more args
	* some reorganization and cleaning up of make_func.y to allow the
	  above
	* inlined efun calling for efun pointers.  This should make
	  (: efun, ... :) significantly faster than (: efun(...) :)

---------------------------------------------------------------------------
(v21.5a6 promoted to v21.5b1)

Sat Jun  3 21:32:15 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.5a6
	* updated with respect to v21.4b11
	* fixed a bug in replace_string(x, y, z) when strlen(y)==strlen(z)==1
	  and another one when strlen(z) < strlen(y)
	* added a ... operator which expands an array into a list of arguments.
	  it is legal in varargs efuns, function calls, varargs efun pointers,
	  and array constants (the last can be useful; ({ x, y..., z }) is the
	  same as ({ x }) + y + ({ z }), but slightly faster)
	* COMPAT_BUSTER: removed the apply() efun.  A replacement is in the
	  (new) directory compat/simuls.  Basically, apply(f, arr) is now
	  the same as evaluate(f, arr...)
	* fixed the space saving code that only generates a return 0 if the
	  function doesn't end in a return to recognize the return_zero opcode

Sat Jun  3 05:33:46 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.5a5
	* fixed a bug in call_all_other that would return zero for all items
	  other than the first

Thu Jun  1 14:55:53 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.5a4
	* updated with respect to v21.4b10
	* COMPAT_BUSTER: If process_input returns a string, it behaves as
	  before.  If it returns a non-zero integer, no further processing
	  will be done.  In all cases, process_input will continue to be
	  called if it exists.

Mon May 29 22:28:50 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.5a3
	* updated with respect to v21.4b9
	* fixed a crasher in call_all_other

Sat May 27 02:44:33 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.5a2
	* updated with respect to v21.4b7
	* optimized replace_string(foo, bar, bazz) when strlen(bar) is 0 or 1
	
Fri May 26 15:58:23 1995 (tim@handel.princeton.edu (Beek))
	* created v21.5a1 from v21.4b6
	* added the following diffs from Symmetry with minor modifications:
	  . fixed type error messages to handle classes
	  . optimized merge_arg_lists
	  . optimized call_function_pointer a little
	  . optimized call_all_other
	  . support more general sscanf specifiers, including %(regexp),
	    as well as %s%x and %s%% having the typical non-greedy %s support
	  . small optimization to replace_program
	  . made it so that set_heart_beat(0) and set_heart_beat(1) behave
	    more consistently when called during a heart_beat
	  . implemented heart_beats as an array which saves ~12 bytes in
	    objects that don't have heartbeats

---------------------------------------------------------------------------
(v21.4a9 promoted to v21.4b1)

Tue May 16 07:07:17 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a9
	* fixed a crasher in calling sprintf("...%O...") before the
	  master had finished loading
	* fixed a few bugs in LPC->C compilation of string switch statements
	* fixed a problem with the GNUmakefile made by LPC->C
	* implemented ranges in switch statements for LPC->C
	* fixed a crasher in parse_command()
	* fixed catch() to work again from LPC->C code
	* fixed a crasher in dumpallobjects with respect to some function
	  pointers
	* fixed a bug accidentally added last patchlevel which caused
	  arrays and mappings to not restore when the 'noclear' flag was
	  passed to restore_object

Mon May 15 04:12:47 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a8
	* fixed a bug that would truncate arrays/mappings sent over
	  MUD mode sockets
	* added a missing #include of cfuns.h that caused undefined
	  identifier errors during LPC->C compilation
	* specifying an address server in the config file is no longer
	  necessary
	* fixed a crasher when the simul_efun object had no simuls in it
	* fixed a crasher in implode(array, function)
	* fixed a bug that caused catch() and function profiling to be
	  ignored
	* fixed wierd behavior with respect to unterminated @ and @@ blocks
	* fixed a problem that would cause logging to fail of the log dir
	  in the config file was specified as '/'

Sat May  6 22:41:22 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a7
	* updated with respect to v21.3b5
	* fixed a ref count problem in heart_beats()
	* fixed a compilation problem for people who don't use 'local_options'
	* put the v21 README into the distribution
	* optimized implode_array
	* recognize IAC IAC as a quoted IAC character; this has two effects:
	  . IAC can now be received by the mudlib
	  . window sizes with widths and heights of 255 work again
	* fixed MUD mode sockets to work on machines where sizeof(long) > 4
	* optimized member_array(), string compares, string hashing etc
	  to check string length first; idea from Aragorn
	* fixed load_object() to not error if the file doesn't exist,
	  also fixed the error messages to be better than 'Failed to load
	  file' in many places
	* fixed a crasher in calling non-existent socket callbacks
	* fixed a few syntax errors in ed commands to not dump you out of
	  ed
	* Added a bunch of stuff to Bugs/Ideas files; I'm going to try to
	  keep them more up to date; dumped a lot of stuff from my todo list
	  there
	* fixed generate_source() to not leak a file on some errors
	* fixed a bunch of problems with the upper_case() contrib efun;
	  it was out of date with respect to counted strings
	* added Magician's remove_interactive() efun to the contrib package

Sat May  6 19:03:29 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a6
	* added 'mixed implode(mixed *, function)'
	  /* sum all the elements in an array */
	  int sum(int *x) { return implode(x, (: $1 + $2 :)); }
	  /* find the largest element */
	  mixed max(mixed *x) { return implode(x, (: $1 > $2 ? $1 : $2 :)); }
	  /* with respect to an arbitrary function ... */
	  mixed max(mixed *x, function f) {
	    return implode(x, (: evaluate($(f), $1, $2) > 0 ? $1 : $2 :));
	  }
	  /* comma separated list of numbers */
	  string list(int *x) { return implode(x, (: $1 + ", " + $2 :)); }
	* cleaned up a lot of the Makefile dependencies

Fri May  5 21:36:29 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a5
	* fixed a typo in wrappedmalloc.h
	* memmove() is now checked in edit_source -configure
	* COMPAT_BUSTER: this_player() is zero is get_save_file_name().
	  The apply is now get_save_file_name(string fname, object who)
	* added foreach (<var>, <var> in <mapping>), which should behave
	  the same as k = keys(m); for (i = 0; i < sizeof(k); k++) {
	  x = k[i]; y = m[k[i]]; ... }
	* fixed a bug that gave odd error messages for illegal simulefun
	  overrides
	* returned options.h to the MudOS distribution options
	* fixed crashers in terminal_colour()
	
Fri May  5 03:25:54 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a4
	* fixed some bad logic in rc.c that would sometimes write past
	  the end of it's temporary buffer (rc.c needs a rewrite....)
	* fixed a Makefile bug that caused edit_source to try to include
	  configure.h
	* added 'foreach (<var> in <expr>) <statement or block>'
	  . currently only legal when <expr> is an array
	  . foreach (x in y) { ... } should behave identically to
	    for (i = 0; i < sizeof(y); i++) { x = y[i]; ... }
	    with the exception that y is only evaluated once
	* fixed another crasher in people going linkdead in ed
	* added some output in edit_source.c related to local_options
	* fixed a bug in replace_string() that would miss occurences at
	  the end of the string
	* fixed a typo in the alpha fix from last release
	* COMPAT_BUSTER: 'foreach' and 'in' are reserved words
	* COMPAT_BUSTER: map_mapping now passes the key and the value
	  to the function
	* crasher fix in the contrib efun pluralize(); also corrects a bug
	  that caused it to strip adjectives
	* fixed a few typos in smalloc.[ch]
	* added Symmetry's changes to testsuite's master and simul_efun obs
	
Tue May  2 20:38:08 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a3
	* fixed a bug that would ignore 'local_options' during compilation
	* fixed a bug in the handling of _OPTIONS_H_
	* modified the OBJDIR rules not to recompile excessively
	* rewrote the error context handling, propagating Symmetry's error
	  popping tricks everywhere, cleaning up the code, and removing
	  some ancient code
	* fixed a bug in generate_source(string, ...) that produced an
	  error message where there shouldn't be one
	* put ins_long() back in since 64 bit machines need it
	* fixed some incorrect calls to add_message in DO_MSTATS and TRACE_CODE
	* cleaned up user_parser; fixed some crashers
	* COMPAT_BUSTER: 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
	* cleaned up the mudlib error handler code; fixed a leak therein
	* added ;'s in a few places in socket_efuns.c for strict ANSI
	  compilation
	* optimized deallocate_string() in the same way free_string previously
	  was
	* added Robocoder's patch to allow '\a' and '\e' (bell and escape)
	* fixed the stringified efuns to set the type of the return value
	  to 'string'
	* fixed a crasher in clear_notify()
	* fixed a crasher in people going linkdead in ed
	* fixed a bug that would add an extra object on previous_object(-1)
	  for lfun and functional pointers

Tue May  2 19:34:55 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a2
	* fixed a crasher when replace_string() was called on a string with
	  more than one reference, and the replacement was smaller than the
	  thing being replaced
	* fixed addr_server to compile again
	* fixed a crasher in string creation for the reworked efuns
	* added a case for the new F_WHILE_DEC code in the disassembler
	* slight optimization to replace_string :)
	* sizeof(class) now returns the number of members, not zero	
	* fixed #undef OLD_ED compile
	* New contrib efuns: string *variables(object), object *heart_beats()

Sun Apr 30 03:53:32 EDT 1995 (tim@handel.princeton.edu (Beek))
	* created v21.4a1 from v21.3b1
	* updated with respect to v21.3b4
	* added Truilkan's optimized replace_string(): 
	  should be '15% to 40% faster' depending on the use.
	  also modified it to work with counted strings, and slightly
	  optimized the brute force (pattern length == 1) case
	* the logon() function is no longer required to exist
	* rearranged the output of the driver a bit, and cleaned up
	  a lot of the related code.  stdout and debug.log now both
	  get the same information (with the exception of some stuff
	  that only goes to stdout before debug.log is ready)
	* removed a lot of fidgeting with the value of command_giver
	  COMPAT_BUSTER: the definition/existence of this_player()
	  changed in some places.
	* COMPAT_BUSTER: A number of efuns now return strings instead
	  of dumping info to this_player(): malloc_status(), cache_stats(),
	  lpc_info(), mud_status(), dump_file_descriptors(), program_info(),
	  debug_info(), dump_socket_status()
	* reorganized/rewrote varargs handling; default to the ANSI way
	  if possible
	* function pointers can now be used for socket callbacks
	* New Feature: if you have a file 'local_options', it will be used
	  instead of options.h.  Also, edit_source will issue an error message
	  if an option has been added to options.h that you don't have a
	  setting for.

---------------------------------------------------------------------------
(v21.3a7 promoted to v21.3b1)

Tue Apr 25 15:43:47 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a7
	* updated with respect to v21.2b8
	* added Robocoder's optimization to read_buffer()
	* fixed a lot of things gcc -Wall complained about
	* fixed a crasher in disassembling code involving classes
	* fixed type checking to not give an error for missing type
	  for arguments when type checking is off
	* fixed a bug which could cause type errors in non-type checked
	  functions, especially wrt 'return x;'
	* fixed a problem that would cause edit_source -configure to run
	  on every make
	* check return values and report file errors in edit_source -malloc
	* configure checks for <sys/sysmacros.h>, and <bstring.h> if DEBUG
	  is on (sgi prototypes for bzero, which is used by FD_ZERO is there)
	* only add -lmalloc if malloc() isn't in a standard library
	
Tue Apr 25 15:25:06 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a6
	* fixed misoptimizations of nullp() and undefinedp()
	* fixed a bug in array subtraction, intersection, and other
	  operations (next person who uses & when they mean == will be
	  shot)
	* fixed two typos in the build.MudOS script

Sun Apr 23 18:53:24 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a5
	* updated with respect to v21.2b7
	* fixed a bug in the STRFUNCS check in ./build.MudOS
	* fixed some compilation problems with string functions and
	  DEBUGMALLOC

Sat Apr 22 21:38:11 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a4
	* fixed some compilation problems with DEBUGMALLOC tags in function
	  calls
	* fixed a typo in the T_REFED optimization that would cause the
	  gamedriver to crash right after booting
	* fixed save/restore of classes
	* fixed reclaim_objects() to correctly handle destructed objects
	  as mapping keys; the equivalent of map_delete() is now done
	  on them
	* optimized free_string() with some ideas from Armand@TMI-2

Fri Apr 21 02:06:38 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a3
	* updated with respect to v21.2b6
	* optimized free_svalue() and assign_svalue_no_free() by
	  handling all refed objects similarly and saving a switch()
	* fixed some compilation problems in interpret.c
	* fixed some of the tagged routines to depend on DEBUGMALLOC,
	  not DEBUG
	* fixed the external declaration of svalue_strlen_size

Tue Apr 11 12:23:36 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a2
	* updated with respect to v21.2b5
	* fixed a variable name clash (type_names) between interpret.c and
	  compiler.c
	* edit_source -configure now checks for the existence of strerror()
	  for better POSIX compatibility
	* fixed catch() to work from LPC->C code
	* if the compiler found is 'cc', check if it is gcc and if so use
	  gcc's optimization flags
	* MAX_USERS no longer exists; instead, space is allocated as needed.
	  a limit should probably be enforced by the mudlib to avoid running
	  out of file descriptors ...
	* new efun alias: this_user() == this_player()
	* compile hash.o with optimization since it is used in the main
	  driver as well as edit_source
	* added an optional flag to the functions() contrib efun:
	  functions(object, 1) returns:
	  ({ "function_name", num_arg, ret_type, arg1type, arg2type, ... })
	  where the types are the type numbers given by typeof()
	* COMPAT BUSTER: map_mapping now passes the value, not the key,
	  to the function pointer.
	* evaluate() and apply() now return 'mixed' and don't need casting
	  with CAST_CALL_OTHERS defined
	* rewrote malloc'ed strings to be ref counted and remember their
	  lengths.  This gives a factor of 2-5 speed gain on many string
	  operations at the cost of 4 bytes of memory per string.  However,
	  the reference counts means that malloc'ed strings are not duplicated
	  when copied, so despite the new overhead, many muds may see a
	  reduction in memory used by strings.  Note: If you are trying
	  to test this, note that check_memory() and mud_status() now
	  report ALL memory used by strings; previously only the memory
	  used by shared strings was reported, the memory used by malloc'ed
	  strings wasn't reported anywhere.
	* made strings statistics optional since they can have an impact
	  on the speed of string operations.
	* driver guru info:
	  where you used to do:          now do:
	  x = (char *)DXALLOC(n+1, ...   x = new_string(n, "foo")
	  FREE(x)                        FREE_MSTR(x)
	  x = DREALLOC(x, ...            x = extend_string(x, ...
	  strlen(shared_string)          SHARED_STRLEN(shared_string)

	  note that string_copy() now returns a ref'd, counted string.
	  if you really do just want a copy of an area as a normal
	  allocated block, see alloc_cstring()

	  Also, it isn't safe to assume you can write into a malloc'ed
	  string now.  See unlink_string_svalue() if you need to do it.
	* optimized explode() and implode() to use SVALUE_STRLEN to
	  find the length of their arguments
	* removed some unused ed flags
	* added a new ed set option 'verbose' which shows number of lines
	  and bytes in files, etc
	* added a check not to add -lcrypt if crypt() is defined in libc.a

Tue Apr 11 00:36:00 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a1
	* updated with respect to v21.2b3
	* successfully compiled and ran the driver with all loaded objects
	  compiled into the driver (LPC->C); the only things that may not
	  work are catch() and defining functionals/expression pointers
	  (although calling function pointers will work fine)
	* fixed a typo in the type checking code generated for to_float/to_int
	  (LPC->C)
	* precompiled objects now depend upon binaries which are saved with
	  the .B extension so they don't conflict with normal binaries
	* fixed in generation of the following LPC->C code:
	  . while (i--) ...
	  . for or while (x < y) ...
	* added support for (--x), (++x), void_assign_local, x--, (-x), (~x),
	  x[<y], (: ... :) in LPC->C compiled code
	* generate_source() now sends precompiled objects into a mudlib/
	  subdir of the binaries dir if passed an array of files, and
	  creates multiple source files there instead of one huge source
	  file.  The mudlib/ dir can be copied unchanged into the driver
	  source dir and compiled.
	* removed support for ALWAYS_SAVE_COMPILED_BINARIES
	* made the output of lpc_info() more readable
	* F_WHILE_DEC now uses up one less byte
	* removed an unused version of find_status()
	* fixed a bug in sprintf's column option that would omit a character
	  if a line was too wide

----------------------------------------------------------------------------
Thu Mar 30 15:45:30 EST 1995
	* promoted to beta status (see v21.1b1)
	* updated with respect to v21
	* Two new contrib efuns:
	  . void store_variable(string name, mixed value)
	  . mixed fetch_variable(string name)
	  These can be used for simulating set(), implementing debuggers,
	  etc:
	       foo = bar <-> store_variable("foo", bar)
	       return foo <-> return fetch_variable("foo")
	  set(string foo, mixed bar) {
	      switch (foo) {
	      case "name": case "hp":
	            store_variable(foo, bar);
	            break;
	      default:
	            ...
	* fixed a number of typos/problems with the Makefile/GNUmakefile
	  that would cause compilation to fail
	* Added an option to have up to 5 external ports
	  These can be specified in the config file.  The format is:
	  external_port_x : kind #
	  where x is 1, 2, 3, 4, 5; kind is telnet, binary, or ascii
	  and # is the port number.  For compatibility, the line:
		mud port : 5555
	  is the same as
		external_port_1 : telnet 5555
	  'telnet' ports act the same as previously.  'ascii' ports
	  send no telnet characters, and don't do any interpretation of
	  the text they receive except to pass it one line at a time
	  to process_input().  'binary' ports act very much like 'ascii'
	  ports, except that buffers are passed to process_input()
	* Added in a fix from Robocoder for using smalloc or bsdmalloc
	  with debugmalloc or wrappedmalloc; previous smalloc or bsdmalloc
	  was erroneously ignored and sysmalloc used
	* Added in a fix from Jeearr for build.MudOS which would cause
	  it to die if GNU make wasn't present
	* optimizations:
	    return 0 is now 1 opcode
	    loop conditions involving <
	    multiple pushes in a row compressed into a quick format
	    x == y, !(x != y), x < y, !(x >= y), x > y, !(x <= y),
	    x != y, !(x == y) in if statements and ( ? : )
	    !x, x==0, etc in ( ? : )
	* connect() is now passed the port # to which the user connected
	* reworked rc.c a bit
	* changed all the references to NO_UIDS to PACKAGE_UIDS; this was
	  causing compilation to fail with NO_UIDS off
	* re-indented interpret.c
	* fixed compilation of functions(), replaceable() and pluralize()
	  (contrib)
	* COMPAT_BUSTER: "efun", "new", and "asm" are no longer valid
	  function/variable names
	* all type names are now valid in foo::bar
	
Fri Mar 24 20:59:08 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped patchlevel to v21.2a6
	* updated with respect to v21.1b7
	* The build procedure has changed drastically:
	  (1) edit the top of build.MudOS to configure a few things.
	      You should only have to do this if you have an obscure
	      operating system or want to change INSTALL_DIR, etc
	  (2) "./build.MudOS"
	      The script will munge for a while, then print out the
	      configuration it determines.
	  (3) if you don't like what build.MudOS decided, edit the top
	      of Makefile/GNUmakefile.
	  (4) type make/gmake, as appropriate
	  (5) type make install, or move the binary to whereever you want it
	* technical details:
	  The build process goes more or less as follows:
	  (1) ./build.MudOS determines enough system parameters to allow the
	      compilation of edit_source
	  (2) edit_source is built, then run to process options, configure
	      malloc, create various makefiles and check which libraries
	      and include files exist
	  (3) Makefile.MudOS is then executed in order to build the main
	      driver executable
	* stage (2) of the compilation is run with optimization off, as
	  edit_source takes longer to compile than to run ...
	* Both GNUmakefiles and Makefiles are generated from a common file.
	  developers should edit Makefile.master and then run 'make Makefiles'
	  if changes to the build process are wanted.
	  (This was actually added last pl, but now applies to 3 makefiles)
	* modified terminal_type negotiation to comply with the relevant RFC's;
	  this may increase the number of systems it works with.
	* added NAWS window size automatic negotiation; the callback is:
	  void window_size(int width, int height)
	* optimized the pushing of call_out arguments
	* added a missing prototype for c_generate_node()
	* fixed/kludged errors in #include to report the right line number
	* renamed DISALLOW_BUFFER_TYPE to NO_BUFFER_TYPE

Wed Mar 22 23:37:55 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped patchlevel to v21.2a5
	* added a mudlib/ directory to hold LPC->C compiled code
	* mudlib/ and packages/ compilation now use libaries to
	  avoid packages/*.c kludges and the like
	* added Symmetry's diffs to allow for recursive class definitions,
	  allowing linked lists, etc to be constructed
	* packages are now specified in options.h instead of fooling with
	  func_spec.c.  This will work for any package, even ones not
	  included with MudOS (PACKAGE_AURORA, for example, will automatically
	  compile and use packages/aurora.c and packages/aurora.spec)
	  in addition, a #include in func_spec is no longer necessary
	* removed all references to the MIRE package
	* in the driver source:
	     NO_MUDLIB_STATS -> !PACKAGE_MUDLIB_STATS
	     SOCKET_EFUNS    -> PACKAGE_SOCKETS
	* Fixed a number of instances where messages including filenames
	  had no leading '/'
	* added F_VOID_ASSIGN_LOCAL: x = ... is now a single opcode
	* applied Robocoder's fix for a problem where 'continue' would
	  get confused in nested loops
	* removed some useless code from F_VOID_ASSIGN
	* removed make_malloc and make_func and replaced them with
	  edit_source; cleaned up the associated code
	* added preprocess.c which centralizes some of the code used by
	  both lex.c and edit_source.c; more work needed here.  Unfortunately,
	  it has to be #included since edit_source.c can't stand MALLOC
	* COMPAT_BUSTER: removed a bunch of LPC predefines
	    SAVE_EXTENSION:  use __SAVE_EXTENSION__
	    USE_EUID:        use ! __NO_UIDS__
            HAS_BUFFER_TYPE: use ! __DISALLOW_BUFFER_TYPE__
	    HAS_SOCKETS:     use __PACKAGE_SOCKETS__
	    HAS_SHADOWS:     use ! __NO_SHADOWS__
	    HAS_DEBUGMALLOC: use __DEBUGMALLOC__ && __DEBUGMALLOC_EXTENSIONS__
	    HAS_MATH:        use __PACKAGE_MATH__
	    HAS_PROFILE_FUNCTIONS:  use __PROFILE_FUNCTIONS__
	    HAS_MATRIX:      use __PACKAGE_MATRIX__
	    HAS_PRIVS:       use __PRIVS__
	    HAS_EACH:        use __EACH__
	    HAS_CACHE_STATS: use __CACHE_STATS__
	    HAS_OPCPROF:     use __OPCPROF__
	    HAS_MUDLIB_ERROR_HANDER: use __MUDLIB_ERROR_HANDLER
	    HAS_MUDLIB_STATS:use ! __NO_MUDLIB_STATS__
	    HAS_LIGHT:       use ! __NO_LIGHT__
	* removed the debugging code from the identifier hash table code
	  since it appears to be bug free
	* fixed a crasher in Robocoder's config file fix when lines were
	  missing from the config file
	* consolidated some of the error reporting code
	* both GNUmakefile and Makefile are now generated from Makefile.master
	  via GNUmakefile.pre and Makefile.pre; one side effect of this is
	  that you can use 'make Makefiles' to return your Makefile to
	  it's unedited state
	* fixed a crasher in objects dested from some socket callbacks
	  
Sun Mar 19 02:32:56 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped patchlevel to v21.2a4
	* updated with respect to v21.1b6
	* REALLY added in the diffs from v21.1b5 (I forgot to run patch
	  last patchlevel)

Sun Mar 19 02:32:56 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped patchlevel to v21.2a3
	* updated with respect to v21.1b5

Sat Mar  4 16:14:17 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped patchlevel to v21.2a2
	* updated with respect to v21.1b4
	* fixed compilation with #undef OLD_ED (object_ed_output() changed
	  to global scope; it's used by regexp_error())
	* fixed a bug that would incorrectly claim filenames had // in them
	  on some operating systems
	* changed the above error message to say what the filename was :)
	* COMPAT_BUSTER: privs_file is now called to get new privs for
	  virtual objects which are loaded.  This is a bit of an oddity;
	  virtual objects actually get created twice, so it's hard to say
	  what should be done when.  Possibly, mudlib_stats should be
	  also be reinitialized.  Currently, they behave the same way
	  as the object returned from compile_file() which is inconsistent
	  with their filename (which was the old behavior of PRIVS as well)
	  The same problem exists with UIDS.  This may change in the future.

Sat Mar  4 16:14:17 EST 1995 (tim@handel.princeton.edu (Beek))
	* v21.2a1 created from v21.1b3
	* added code to not generate unreachable code in LPC->C generation
	  since SGI cc is very noisy about that and it happens a lot.
	* protect special characters string constant case labels with '\'
	  when generating switch tables (LPC->C)
	* fixed a cases for int switches to use the correct field (LPC->C)
	* added more name mangling for switch table names so they don't
	  collide (LPC->C)

----------------------------------------------------------------------------
Wed Mar  1 18:14:01 EST 1995 (tim@handel.princeton.edu (Beek))
	* v21.1a5 promoted to beta status (see v21.1b1)

Fri Feb 24 23:48:38 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.1a5
	* brought up to date with respect to v21b15
	* MASSIVE source cleanup
	  . 'arrays' are always refered to as arrays and never vectors/pointers
	  . all types now use foo_t syntax instead of struct foo 
	  . several header files cleaned up and includes reorganized
	  . removed internal distinction between internal and external
	    programs (i.e. foo->p.i.bar is now foo->bar)
	* centralized the processing of "/foo/bar.c" -> "foo/bar"
	* removed support for RUNTIME_LOADING
	* removed support for #undef NEW_FUNCTIONS
	* in addition to the above, call_other pointers are gone.
	  (: x, y :) should be converted to (: call_other, x, y :)
	  the functionality remains unchanged, since that's all they really
	  did ...
	* function pointers reorganized to use less memory (the size is
	  now variable based on the ammount of space needed, so a lfun
	  pointer can be significantly smaller)
	* added OPCPROF_2D which keeps statistics on the most commonly
	  executed *pairs* of instructions
	* regexp errors in regexp efuns now use error(), instead of printing
	  a message to this_player() which eroneously refers to ed ...
	* LPC_TO_C now works for compiling objects into the driver.
	  (1) make sure #pragma save_binary is on in all objects to be compiled
	  (2) do a generate_source( <array of filenames> )
	  (3) copy /binaries/interface.c into your source dir (replacing the
	      provided one)
	  (4) recompile the driver
	  (5) the lpc_info() efun can be used to see if the new programs are
	      being used; other than that there should be no visible
	      difference, other than speed.

Wed Feb  15 00:16:55 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.1a4
	* brought up to date with respect to v21b10
	* optimized the handling of the redefinable keywords 'efun', 'asm',
	  and 'new'
	* Floats and ints are now automatically interconverted in the
	  following cases:
	  . Passing an int to a efun that takes a float and not an int, and
	    vice versa.  Hence, sqrt(5) is legal.
	  . during initialization (as in float x = 5)
	  . Note: the above depends on compile time checks so if you exploit
	    mixed, etc to put an int in a float variable it will misbehave
	* added limited support for classes (no member functions):
	  . structure definitions are stored in programs, which means they
	    can be passed down via inheritance

	  . definition of the type is as follows:
	    class <class_name> {
              <type> <member>;
              ...
            }
	    Ex: class my_first_class { int my_number; string my_string; }

          . declaring a variable of that type:
            class <class_name> <var_name>;
	    Ex: class my_first_class my_var;

	  . instantiating a class:
	    <var_name> = new(class <class_name>);
	    Ex: my_var = new(class my_first_class);
	
          . assigning to/using a member
            <var_name> -> <member> = whatever ...	
	    Ex: my_var->my_string = "It worked!";

Thu Feb  2 00:16:55 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.1a3
	* brought up to date with respect to v21b8
	* fixed the define used by cfuns.h to be different from the one
	  ccode.h used
	* generate_source() now returns zero if there were compilation errors
	* modified lower_case() to be slightly more portable and easier to
	  read
	* inlined sapply() into apply() and apply_master_ob() by hand
	* fixed a unrecognized #pragma crasher (the list wasn't terminated)
	* fiddled with the default settings of options.h
	* new contrib efuns:
	  string pluralize(string)
	  int file_length(string)
	  string upper_case(string)

Thu Feb  2 00:16:55 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.1a2
	* brought up to date with respect to v21b7
	* added prototypes for all the c_* functions in ccode.c
	* fixed the Makefile and GNUmakefile; removed obsolete files
	* fixed generate_source() to use 'package fname;' instead of
	  'package lpc_to_c;' when outputting to 'fname.c' and 'fname.spec'
	* removed support for add_action(string); all it did was cause
	  errors anyway ...

Thu Feb  2 00:16:55 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.1a1
	* brought up to date with respect to v21b5
	* COMPAT_BUSTER: removed the following options.h defines and 
	  related behavior: OLD_HEARTBEAT, OLD_COMMAND, IGNORE_STRICT_PRAGMA
	* COMPAT_BUSTER: STRICT_TYPE_CHECKING removed, use 
	  PRAGMA_STRICT_TYPES as a default pragma
	* COMPAT_BUSTER: ALWAYS_SAVE_BINARIES removed, use 
	  PRAGMA_SAVE_BINARY as a default pragma
	* COMPAT_BUSTER: move_object only takes 1 argument.
	  change move_object(this_object(), foo) to move_object(foo)
	* LPC->C restored to working condition in a limited sense:
	  . new pragma #pragma efun ignored during regular compiling
	  . generate_source("source_file.c", "destination_file.c")
	    will compile "source_file.c" into an efun package made
	    up of "destination_file.c" and "destination_file.spec"
	    which can be linked into the driver
	  . note that it is illegal to do the following in an efun:
	    - call a local function -> this really can't be done
	    - call a simul_efun -> see above.  Use efun:: to get around
	      write simul_efuns, etc; the driver won't complain about
	      illegal overrides while generating efun source
	    - use a global variable -> wait for future fixes
	  . LPC->C for objects doesn't work as of this release; only
	    creation of efuns in packages (useful for efunizing simuls)
	  . various things not supported yet; most notably functionals,
	    also string switches are supported but buggy; let me know
	    if you have other problems (esp. linking errors)
	* added some internal stuff for structures; work in progress.
	  ignore the 1 shift/reduce conflict as it won't affect normal
	  LPC code.
	* define_new_function() doesn't take the offset any more; this
	  is set explicitly where needed (2 places)
	* argument types are actually saved why #pragma save_types is
	  used.  They still aren't used yet tho.
	* the format of switch parse trees was tweaked a bit to help
	  LPC->C compilation
	* removed some unused i_generate_* functions
	* push_indexed_lvalue in interpret.c is no longer static; compiled
	  C code needs it
	* removed call_absolute()
	* removed optimization flag, as it was unused
	* rewrote pragma handling to work off of a table for easier addition
	  of pragmas
	* added #pragma no_whatever which turns off the effect of
	  #pragma whatever
	* added program argument types to md.c's list of permanent blocks;
	  not checked for leakage yet tho
	
Thu Oct  2 01:29:26 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a14
	* fix for crasher when using a stale reference [reported by Tigran,
	  fix by Cloud]
	* added implementation for filter(string, ...)

Thu Sep 25 00:22:45 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a13
	* updated with respect to v22.1b14
	* improved warnings for code with no side effects
	* changed optimizations for casted string constants to obey their
	  new type (just for consistency)
	* resolve() can now take a function pointer as the second arg

Wed Sep 10 01:14:10 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a12
	* added a Perl script compat/fixstatic that does a pretty good job
	  of converting static to nomask/protected

Fri Sep  5 01:01:54 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a11
	* fixed ASCII external ports
	* implemented MUD mode external ports (use "MUD" in the config file;
	  the mixed value gets passed to process_input)
	* Parsing package changes:
	  . parse_sentence has an optional 3rd and 4th arg.
	  . The 3rd arg an array of objects to use in the parse instead of 
	    the inventory of the environment of the user.  Nested arrays
	    indicate containment, i.e. ({ ob1, ({ object inside ob1 }),
	    ob2, ob3, ({ first ob in ob3, second ob in ob3 }), ... })
	  . The 4th argument is a mapping of string -> object which can
	    be used to supply nicknames and similar things.  For this parse,
	    the 'object' acts as if 'string' were returned by pc_id_list().
	    Entries that do not correspond to objects involved in the current
	    parse are ignored.
	  . fixed crashes in calling parse_refresh() from within a parser
	    callback.  This is now the correct way to say "I'm returning this
	    answer, but ask again next time too"

Wed Sep  3 13:30:07 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a10
	* updated with respect to v22.1b12
	* added missing 'return ret' in dump_socket_status() compat simul
	* added parser packages fixes from Belgarat:
	  . new error: ERR_MANY_PATHS
	    returned when the number of possibilities needed to figure out
	    the meaning of a sentence exceeds a certain number (i.e. figuring
	    out certain highly ambiguous sentences isn't worth the CPU)
	  . PARSE_DEBUG can be used to get parser debugging without compiling
	    with DEBUG on
	  . evil new :c modifier that means just choose the first one you
	    find, for MUDs that want to make a mistake they will regret for
	    the rest of their lives, and be hated by their players
	    [nah, the maintainer would _never_ insert personal opinions into
	     the ChangeLog]
	  . "finally, two-object rules are examined more thoroughly and some
	     strange parse errors are eliminated.

	     Changed semantic for applies:
	     direct_ and indirect_ applies can be called with 0s as the
	     object-type arguments. However it's now guaranteed that they
	     will be called with filled object arguments at least once during
	     the processing of a rule.
	     This allows objects to do explicit checks.
	     The direct_ and indirect_ applies should work as usual when they
	     receive 0 as object argument - they simply should return if the
	     object can or can not participate in the rule.
	     When the arguments are filled, the direct_/indirect_ applies can
	     perform thorough checks and return errors."

Sat Aug 30 19:23:35 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a9
	* updated with respect to v22.1b11
	* fixed typo in '\\' handling in #defines; also added overflow check
	* removed unused local in interpret.c
	* added a #breakpoint preprocessor directive which calls 
	  lex_breakpoint(), which does nothing.  Useful for setting debugger
	  breakpoints that stop at a particular point in LPC compilation

Wed Jul 23 18:30:27 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a8
	* added lex.c fixes from Burty:
	  . Handle '\\' correctly in defines
	  . preserve whitespace when expanding defines
	  . added quote checks in expand_all_defines()

Thu May 15 14:14:42 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a7
	* reformatted the trace information with MUDLIB_ERROR_HANDLER off;
	  should be a bit easier to read now.

Wed Apr 16 07:54:45 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a6
	* updated with respect to v22.1b8
	* object_present() now depends on #ifdef F_PRESENT instead of
	  NO_ENVIRONMENT so it disappears in the !NO_ENVIRONMENT && !F_PRESENT
	  case too. [idea from Jihad]
	* name change: the file "Install" is now "INSTALL" to make it slightly
	  more visible
	* fixed file.h to check file_incl.h for S_IS* first [fix from Leto]
	* fixed the multiple class inherit code to work [fix from 
	  Wodan@Discworld]

Sun Apr 13 23:59:02 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a5
	* updated with respect to v22.1b7
	* fixed compilation with DEBUGMALLOC off
	* (: efun::foo :) is now a valid efun pointer (assuming
	  master()::valid_override() doesn't complain)

Sat Apr 12 15:06:30 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a4
	* updated with respect to v22.1b6
	* reclaim_objects() now cleans destructed this_player's and objects
	  out of the call_out() list
	* commenting out input_to() or get_char() in func_spec.c now removes
	  all related code and variables

Sun Apr  6 18:00:43 EDT 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a3
	* updated with respect to v22.1b5
	* classes can now be inherited multiple times, as long as the
	  definitions are consistent.
	* fixed macro expansion to expand all arguments to macros immediately.
	  in particular, the ANSI stringize hack:
	#define S(x) #x
	#define STRINGIZE(x) S(x)
	  now works.  E.g. after #define FOO bar, STRINGIZE(FOO) gives "bar"
	  and not "FOO"

Wed Apr  2 15:11:10 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a2
	* updated with respect to v22.1b4
	* specifying both left and center justification in sprintf() now
	  pushes odd-length strings to the left instead of the right, e.g.
	  sprintf("%|8s",  "foo") == "   foo  "
	  sprintf("%|-8s", "foo") == "  foo   "
	* fixed crasher in calling socket_status() for a socket owned by
	  a destructed object [reported by Jihad]

Tue Apr  1 13:59:43 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.2a1
	* added a slightly improved version of Tim's socket_status() efun.
	  Usage:
	    socket_status(int fd) returns an array with:
	    . ret[0] = (int) fd
     	    . ret[1] = (string) state
     	    . ret[2] = (string) mode
            . ret[3] = (string) local address
            . ret[4] = (string) remote address
            . ret[5] = (object) owner
	    socket_status() returns an array of arrays; one for each socket.
	* COMPAT_BUSTER: dump_socket_status() is gone; see compat/simuls
	  for a replacement [written using socket_status]
	* socket status information is now cleared when the socket is closed
	* fixed a bug that caused the close callback not to be called for
	  sockets that went through the CLOSING state

----------------------------------------------------------------------------
(v22.1a17 promoted to v22.1b1)

Wed Jan 29 19:15:44 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a17
	* updated with respect to v22b27
	* fixed origin() to not return "call_out" for ORIGIN_INTERNAL
	  [reported by Jihad]
	* added Marius' patch to make the parsing package work with
	  NO_ENVIRONMENT.  Requires the following new master applies:
	  . parse_get_first_inventory(object ob)
	    { must behave like first_inventory(ob) }
	  . parse_get_next_inventory(object parent, object current)
	    { must behave like next_inventory(current); 
	      parent == environment(current) in case you need it }
	  . parse_get_environment(object ob)
	    { must behave like environment(ob) }
	  [I'm not in love with this interface, but it will do for now]
	* fixed a number of warnings

Sat Jan 25 18:14:00 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a16
	* wrapped debug.c in #ifdef DEBUG_MACRO
	* fixed crasher in file operations very early in the boot process
	  (before the master object loads); evidentally some libs actually
	  do this [both reported by Aragorn]

Thu Jan  9 20:20:40 EST 1997 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a15
	* updated with respect to v22b26
	* added Raistlin@IE's patches to make the Win32 build procedure much
	  cleaner and not depend on so many GNU utilities; also did a wonderful
	  job of cleaning up the OS specific Win32 code.  Fixes a number of
	  bugs, as well.
	  [ also, I can't test these, since I still don't have a Win32
	    compiler, so I'd appreciate it if someone would let me know
	    if I messed something up ]
	* fixed crasher in explode("foofoo", "foo") with SANE_EXPLODE_STRING
	  on and REVERSIBLE_EXPLODE_STRING off
	* enhanced DEBUG_MACRO a bit; things are now in terms of identifiers
	  instead of impossible to remember numbers.  To add a new one,
	  add the define to debug.h and the entry near the top of debug.c
	  Then do:
	     debug(mylevel, (...))
	  new efuns:
	  . set_debug_level("mylevel")
	  . clear_debug_level("mylevel")
	  . debug_levels() [returns a mapping showing which messages are
	                    enabled]
	* A few changes to call_out:
	  . 0 delay call_outs are legal
	  . call_outs to the same time are in the order they are set up, not
	    in reverse order
	  . call_outs() from w/in call_outs() are relative to the time the
	    call_out was scheduled to go off, not the actual time; this is
	    because:
	  . the current time is slowly advanced as call_outs are executed
	    until the current time reaches the real time, instead of taking
	    a huge leap forward (in the event that the MUD is busy enough
	    that it is getting behind)

Mon Dec 30 04:08:08 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a14
	* fixed compilation with UIDS enabled [reported by Leto]
	* added support for:
	  . allocate(int n, mixed v):
	    allocates an array of n elements.  The i-th element is set to
	    evaluate(v, i) [i is in the range 0..n-1]
	  . allocate_mapping(array keys, mixed v):
	    - if v is an array, the returned array has keys 'keys' and values
	      'v' (like 3.2.x's mkmapping)
	    - if it is a function, the the mapping has keys 'keys' and values
	      evaluate(v, key)
	    - otherwise, each key has the value 'v'

Mon Dec  9 13:27:42 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a13
	* updated with respect to v22b25
	* fixed a bug introduced recently which caused random() to always
	  return zero when drand48() was being used [reported by Leto]
	* changed restore_object() to ignore ^M's at the end of lines in
	  save files
	* added leading / to get_save_file_name() argument [reported by
	  Leto]
	* fixed ARCH define for Linux/alpha
	* fixed some implicitly defined functions which cause warnings on
	  the alpha
	* fixed crasher/wild pointer write in code like:
	  foreach (string s, ref r in m) { map_delete(m, s); r = 0; }

Sun Dec  8 23:50:32 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a12
	* fixed a bug that would cause implicitly defined functions (ones
	  with no prototype in scope allowed by strict types being off)
	  to become invisible when inherited [reported and tracked by
	  Aragorn; also reported to affect NM muds on alpha drivers]

Fri Nov  8 12:03:53 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a11
	* updated with respect to v22b24
	* changed function pointers whose owners are destructed to be
	  ignored by call_out_list() and to not error when they fire.
	  Changed so that "foo" and (: foo :) have the same/similar
	  behavior.  This isn't strictly an equivalent case, since
	  (theoretically) the function could be owned by a different
	  object than the one that did the call_out(), but that is
	  probably restricted to code doing call_out()s on behalf of
	  other objects anyway, and the runtime error is more annoying
	  than useful.  [Suggested by Mordred@RoD]
	* to_int() now returns undefined if no valid characters were converted.
	* leading slash added to in_edit() [reported by Mystic]
	* call srand48() if using drand48() to make random numbers [fix
	  from Turrican@DW]
	* fixed compilation with NO_ADD_ACTION off or OLD_ED on, or
	  NO_BUFFER_TYPE on
	* fixed the order of .o files for RUNTIME_LOADING
	* fixed switch() when two cases differ by more than 2^31
	* better local_options error message

Sat Nov  2 18:00:04 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a10
	* use -m486 for pentium too
	* added /'s in non mudlib error_handler traces
	* fixed compilation with SUPPRESS_ARGUMENT_WARNINGS off
	* receive() can now take a buffer as its argument (useful for
	  PORT_BINARY connections)
	* fixed PROFILE_FUNCTIONS not to miss calls which miss the apply_low
	  cache
	* fixed the driver not to loop if more than one -D option is passed
	  on the command line
	* the debug.log file is no longer opened and closed every time it
	  needs to be written to; it is held open instead
	* made the DEBUGMALLOC hash a bit more efficient
	* fixed a bug that caused terminal_colour() not to strip spaces of
	  the starts of all lines, instead of just continuations of wrapped
	  lines
	* parser callbacks went back to being ORIGIN_DRIVER, since they
	  are restricted to the 'can_', 'do_' and 'indirect_' namespaces
	* various fixes to compilation with uids enabled
	* add to the errors field of mudlib stats, even if a mudlib error
	  handler exists
	* added parser support for 'a', 'any', 'my'

Tue Oct 29 20:41:26 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a9
	* updated with respect to v22b21
	* fixed possible crashers in code like 'call_out(something, 1, ref x)'
	* fixed wild pointer into stack in code like:
	  mixed global;
	  void foo(mixed args...) { global = args; }
	  void create() { int x; foo(ref x); }
	  void inc(int ref x) { x++; }
	  void increment_random_location_on_stack() { inc(global...); }
	* fixed the 'multiple access modifiers' warning not to consider
	  nomask and nosave to be access modifiers
	* disabled the multiple access modifier error message with
	  SENSIBLE_MODIFIERS off
	* fix for compiling with COMPRESS_FUNCTION_TABLES off from Mystic
	* fixed compilation with FD6 code disabled
	* fixed various crashers in the unused locals warnings
	* various changes to func_spec.c so that built in efuns can be
	  disabled or renamed (e.g. remove or rename clone_object(), etc)
	  [idea from Mystic]
	* added support for foreach (ref x in array), 
	  foreach (x, ref y in mapping)
	* better error message for indexing an illegal type using a range
	* enabled the 'public' keyword with SENSIBLE_MODIFIERS on; it was
	  accidentally disabled.  Also fixed the options.h entry to be
	  clearer
	* added a SUPPRESS_ARGUMENT_WARNINGS option, to cut down on the
	  number of warnings generated by code which existed before
	  omitting the argument name was legal
	* fixed terminal_colour() to treat multiple spaces as one space
	  when wrapping [reported by Jihad]
	* fix for errors writing to flushing sockets

Mon Oct 28 17:14:29 EST 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a8
	* COMPAT_BUSTER: 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.
	* Use fd #6 instead of fd #3, since Solaris uses fd #3 while
	  starting the program [reported by Aragorn]
	* fixed crasher in the parsing package generating the object list
	  [fix from Aragorn]
	* 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
	* 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
	* if VIRTUAL_RESERVED_WORD is defined, then 'virtual' is a
	  reserved word.  Doesn't do anything, though.
	* 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.
	* fixed a bug that would cause compile errors when indexing something
	  of type 'mixed'
	* 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

Mon Oct 21 17:48:12 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a7
	* updated with respect to v22b20
	* added Burty@Nanvaent's fixes for stringizing and macro
	  expansion
	* added support for array &= and |= [idea from Avenger@CoreDump]
	* added the object name to the "Saving successful match" parser
	  debugging message [idea from Aragorn]
	* added Leto's SERVER_IP patch
	* abort compilation after getting 5 errors, since we don't print
	  any more anyway, and the leaks this was supposed to prevent
	  were fixed years ago
	* MudOS now checks if file descriptor #3 is a valid socket when
	  it starts up; if it is, it is used as a login port.
	* added a 'portbind' program:
	  syntax: portbind [-p port#] [-d drivername] [-u uid] [-g gid] [args ...]

	  All it does it bind the specified port, then execv() the driver,
	  passing the bound port as file descriptor #3 (see above).
	  drivername defaults to ./driver, and port# defaults to 23.
	  if uid or gid is specified, setuid() and setgid() are called
	  before exec'ing the driver.

	  This means one can bind the telnet port by making portbind setuid,
	  and using:

	  portbind -u <mud uid> -g <mud gid> config.mud

	  to run the driver

Wed Oct  9 15:26:37 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a6
	* updated with respect to v22b19
	* fixed compilation with NO_ADD_ACTION off, PRIVS on, or
	  PROFILE_FUNCTIONS on [re: the 'ob' global recently removed;
	  reported by Aragorn, Jihad, Avenger, etc]
	* only do promotions (int)<->(float) on assignment, not op=; in
	  the second case the conversion will be done by the efun (if
	  legal) so there is no need.

Mon Oct  7 16:43:45 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a5
	* hidden checks are now compiled out if set_hide() is disabled in
	  func_spec.c [idea from Avenger@CD]
	* buffer code is compiled out if NO_BUFFER_TYPE is defined; also
	  fixed a few old references to DISABLE_BUFFER_TYPE.  [idea from
	  Avenger@CD] Also, a binary port in the config file will cause
	  a sensible error message, and attempting to create a binary
	  socket will return EEMODENOTSUPP.
	* removed the 'ob' global in efuns_main.c and related hacks with
	  respect to object_visible(); also fixes a bug in the return
	  value of environment() when it is hidden (and probably other
	  bugs elsewhere too) [reported by Jihad]
	* fixed crasher in using the name of a file that doesn't exist
	  as the object in an efun callback (e.g. filter(({}), "foo", "bar"))
	* fixed a couple compile problems and a crasher in
	  PACKAGE_MUDLIB_STATS [reported by Avenger@CD]

Thu Oct  3 18:16:53 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a4
	* updated with respect to v22b17
	* need to include "master.h" in the uid package now [fix from Leto],
	  mas well as md.c, and master.c needs comm.h when tracing is
	  enabled
	* fixed Makefiles on non-GNUmake systems to include the two new
	  files introduced last pl
	* fixed crasher in the handling of refreshing the master object;
	  also the literals are cached but are *not* affected by
	  parse_refresh().  The reasoning is that if they change, it
	  would cause all hell to break loose with existing rules.
	  So parse_refresh() only needs to be called when the return
	  value of parse_command_users() changes.

Tue Oct  1 19:14:42 EDT 1996 (tim@wfn-shop.princeton.edu (Beek))
	* raised patchlevel to v22.1a3
	* updated with respect to v22b16
	* fixed various crashers in the new snoop code [reported by Jihad]
	* Many thanks to DrFeelgood for helping clean up header file
	  dependencies, and pointing out typos in options.h
	* Warning for using both a 'port number : ' line and an 
	  'external_port_1 : ' line
	* moved master object and function pointer handling to their own
	  files
	
Mon Sep 30 18:56:54 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22.1a2
	* updated with respect to v22b15
	* #'foo is now the same as (: foo :) when COMPAT_32 is defined
	  [suggested by Bubbs]
	* added NO_SNOOP option
	* The requirement that a snooper must be interactive has been lifted
	  (though this isn't particularly useful unless RECIEVE_SNOOP is
	   also defined) [suggested by Larnen]

Tue Jun  4 00:57:30 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22.1a1
	* COMPAT_BUSTER: #include <...> now no longer searches based on
	  relative paths; #include "..." still does.
	* added Blackheart's diffs for using gdbm.  See PACKAGE_GDBM for
	  details; probably this should be merged with Descartes'
	  PACKAGE_DB stuff ...
	* added Avenger@CD's diffs for a union array operator (|)
	  (with trivial changes and a array stat fix)
	  Works analogously to &:
	  ({ 1, 2, 3 }) & ({ 2, 4 }) = ({ 2 })
	  ({ 1, 2, 3 }) | ({ 2, 4 }) = ({ 1, 2, 3, 4 })
	* if ARRAY_RESERVED_WORD is defined, use "array" instead of "*"
	  in error messages [e.g. "Bad assignment ( mapping vs array )"]
	* added Marius@Prilnari's fixes to lex.c: token pasting in
	  preprocessor macro expansion and adds token quoting
	* added the -c option to the RUNTIME_LOADING compile flags since
	  it disappeared somehow
	* Hidden object fixes for present() and environment()
	* COMPAT_BUSTER: removed the tail() efun; a simul_efun is in the
	  compat dir
	* added leading / to log_error() filenames
	* cleaned up a bunch of duplicated code in array.c, and corrected
	  a few statistic bugs
	* Parser package changes:
	  . added the object name to some parser debugging messages
	  . moved names of the applies to top of parser.c as #defines
	  . information from the master object is now cached
	    (parse_command_users, parse_command_prepos_list)
	    COMPAT_BUSTER: this means parse_refresh() must be called
	    if the information changes
	  . livings_are_remote() is now rechecked when a parse_refresh()
	    is done

----------------------------------------------------------------------------
(v22a41 promoted to v22b1)

Mon May 27 16:20:09 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a41
	* variable information is now stored only in the program in which
	  the variable is defined; estimated compression ratio is about
	  10:1. YMMV
	* COMPAT_BUSTER: all inherits must now precede all global variable
	  definitions
	* Added Ceda@IdeaExchange's fixes to the Windows '95 port
	* fixed compilation error in c_prepare_catch()
	* added a COMPRESS_FUNCTION_TABLES option, which compresses function
	  tables even further (estimated compression: 2-3x) at the cost of
	  slowing down function calls slightly (<5-10%)
	* Fixed error() to correctly added a trailing \n to error messages
	  that are missing them
	* Crasher fix in mapping composition (from Avenger@CoreDump)
	
Sun May 26 00:37:08 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a40
	* internal function aliases are handled a little smarter, anticipating
	  more function table memory optimizations later
	* fixed some crashers/problems involving #pragma optimize and some
	  compiler errors
	* fixed a crasher in passing a filename that wasn't a string constant
	  to dump_prog()
	* program_info() can now take an object as a first arg
	* fixed a problem that would cause functions that were prototyped 
	  before inherited to call the first function defined in the
 	  object instead.

Fri May 24 00:30:10 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a39
	* 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
	* Fixed a crasher in some Too deep recursion errors
	* Fixed crashers in constructs like while (...){ e = catch { break; } }
	  Jumping out of a catch block is now illegal.
	* Fixed a crasher in program_info() when there are objects without
	  type information loaded

Thu May 23 15:46:10 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a38
	* YYTYPE's size changed from 10 to 8, which should make the compiler
	  slightly more efficient.
	* Fixed a bug in the generation of information to pass to mudlib
	  error handlers, which would cause an "Illegal array size" error
	  to be flagged before the error handler was even called.
	* A few changes to $() notation:
	  . $() now moves out one level, not all the way out.  So, to use a
	    local variable in a function from inside a doubly nested function
	    pointer, one needs to use $($()), e.g.:
	    string x; function f = (: (: $($(x)) :) :);
	  . Due to the above change, constructs like $($1) are now legal, and
	    work as one might expect, e.g.:
	    function f = (: (: write($($1)) :) :); // The inner function
				// function pointer writes whatever is passed
				// as the first arg of the outer one
	    function g = evaluate(f, "hi"); // creates a function pointer that
	                                    // writes "hi"
	  . this isn't really that complex; just remeber the rule "Each $()
	    temporarily removes one level of (: :) nesting."  Familiarity
	    with functional programming is also recomended; (: (: :) :)
	    constructs are function pointers that create and return function
	    pointers when evaluated, _not_ simply composite functions.
	  . there is now a limit to function pointer nesting; the default is
	    10.  (Anyone who needs more is sick, but I thought I'd mention it)
	  . this also fixes a few crashers in using $() inside doubly nested
	    function pointers

Mon May 13 23:16:05 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a37
	* Fixed a crasher in redefined functions
	* added a STRIP_BEFORE_PROCESS_INPUT option for NO_ANSI
	* fixed call_out() to pass zero args if zero args were specified,
	  instead of always passing a first arg of 0.  (Usually, you'd never
	  notice, but it makes a difference when scheduling call_outs to
	  efun pointers to efuns which take no arguments)
	* COMPAT_BUSTER: 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.
	* minor tweaks to the cleanup rules in the makefiles to get rid
	  of a few irrelevant files in the diffs
	* added Maarten de Jong's documentation on compiling MudOS on
	  an Amiga using gcc as amiga/README-gcc.
	* Changed ED_MAXLINE from 512 to 2048
	* Warning for using | or & when both arguments are "boolean" values
	  (e.g. the result of !, ==, !=, <, etc)

Mon May 13 00:29:11 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a36
	* Fixed a crasher in memory_summary() when some objects are swapped.
	* Fixed a crasher in check_memory() when BINARIES was #undef'd
	* '\"' -> '"' in rc.c, since the former confuses emacs's hilit19 mode
	* Better fix for the undefined function problem; the old solution
	  occasionally didn't work on some systems
	* Fixed a problem with aliases in the function table that would
	  sometimes cause ... args not to be handled right
	* Fixed a crasher involving prototypes preceding inherit statements
	* program_info() now calculates the overhead of save_types as well

Sat May 11 20:28:19 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a35
	* Reversed the function table search order in the new call_other 
	  search code to be consistent with overload search order
	* fixed a crasher in generated error messages for OBS rules which
	  have an indirect object
	* added some entries to the files Bugs and Ideas
	* load_binary() now sorts the function table so it is in the correct
	  order again since the order of shared strings is different from
	  when it was saved
	* fixed a bug in the apply_low cache code which was accidentally using
	  'prog', a global, with disastrous consequences when valid_save_binary
	  was called during the tail end of compilation.  'prog' is no longer
	  a global, and is returned where needed.
	* fixed a bug which caused the identifier hash table to become trashed
	  when a function was used before it was defined
	* 'make clean' now removes the testsuite's compile error log too

Fri May 10 22:21:39 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a34
	* moved strput() from the parsing package to the main distribution
	  so it can be used internally
	* Changed the building of compiler error messages to use strput(),
	  avoiding possible buffer overruns.  Normalized the max length of
	  most compiler error messages to 256 bytes.
	* Fixed compilation of PROFILE_FUNCTIONS
	* Fixed a bug introduced last pl that caused the call_other cache
	  to malfunction
	* Fixed octal escapes in strings; they were getting omitted
	* Fixed a crasher in unterminated @ blocks (which, by the way,
	  had absolutely nothing to do with /V\\age)

Tue May  7 14:23:45 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a33
	* moved the call to save the ed buffer of a user to before the
	  call to net_dead()
	* Rewrote most of the function table handling code.  Memory overhead
	  is now 15 bytes per function defined and 5 bytes per function
	  inherited, instead of 14 bytes per function inherited or defined
	  This cuts function table memory usage about in half on a stock
	  Lima lib.  YMMV.  Large open MUDs may see larger decreases;
	  the program_info() efun is a good way to check.
	* Removed the last traces of OLD_PREVIOUS_OBJECT_BEHAVIOR
	* The inheritance warning is now a bit clearer, e.g.:
	  foo() inherited from both /std/foo.c (via /std/bar.c) and 
	  /std/bazz.c; using the definition in /std/foo.c
	* Fixed the parsing package to not crash on reference to 'me' when
	  'me' isn't within sight (admittedly, an odd situation :-) )
	* Fixed the testsuite to realize call_stack(3) now returns strings
	* Tables of defined functions are now sorted, so they can be binary
	  searched; call_other time is now approximately O(m log n) instead
	  of O(m n) when the cache is missed (m = # of inherits, n = # of 
	  functions in each)
	* Removed OPTIMIZE_FUNCTION_TABLE_SEARCH: the new search method
	  is just as fast with no overhead
	* added Raistlin's patch for a parser bug that would cause the
	  verb name to get inserted at the start of the 'real names' section
	  of parser callbacks

Mon May  6 21:47:59 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a32
	* Small optimization to arrange_call_inherited()
	* Small cleanup to C function pointer handling in dumpstat.c
	* fixed a bug that caused dumpstat.c to ignore the size of array
	  headers
	* Fixed the check_memory(1) table to be formatted nicer
	* removed outdated code from program_info(); also fixed a bug that
	  caused the header size to be an absurd value
	* fixed a crasher in function_owner() [ref count bug]
	* 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.
	* Made the parser end of buffer checks a bit easier to maintain
	* added parse_remove(string verb) which removes all rules for the
	  verb 'verb' which were added by this_object()

Mon May  6 14:23:47 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a31
	* Added a FLUSH_OUTPUT_IMMEDIATELY option, which disables buffering
	  of output.  Useful for debugging.
	* Parsing package fixes:
	  . Fixed a bug that caused OBS rules to silently do nothing if
	    all the possible matches return errors beginning with '#'
	  . COMPAT_BUSTER: Now, zeros are passed for args that aren't
	    available yet (i.e. the indirect object in 
	    direct_foo_obj_bar_obj()).  Also, the arg which is currently
	    being worked on is now passed again (i.e. the direct object in 
	    direct_foo_obj_bar_obj())
	    Summary: "foo sword bar wiggle" would call:
	    . can_foo_obj_bar_obj(0, 0, "sword", "wiggle")
	    . direct_foo_obj_bar_obj(OBJ(sword), 0, "sword", "wiggle")
	    . indirect_foo_obj_bar_obj(OBJ(sword), OBJ(wiggle), "sword", 
				       "wiggle")
	    among other things
	  . Fixed a number of bugs and buglets in disambiguating parses
	    and generating error messages, especially in cases where all of
	    the attempts produce nonsense

Sun May  5 14:52:20 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a30
	* added NAME_TRUE_VARARGS flag to disassembly listings
	* propagate NAME_TRUE_VARARGS up the inheritance tree to avoid
	  incorrect argument type errors when #pragma save_types is in use
	* Parsing package fixes:
	  . made the maximum tokens per parser rule configurable at the top of
	    the parsing package [MAX_MATCHES]
	  . Optimizations to bitvec routines: bitvec_count(), get_single() in
	    the parser
	  . Fixed several spots where > MAX_NUM_OBJECTS involved in a parse
	    would cause crashes
	  . Fixed strput/strput_words to not write past the end of their buffer
	    when constructing long strings 
	  . Fixed a crasher in parse_add_synonym() (though it wouldn't crash
	    until the synonym or parse_dump() was used)

Thu Apr 25 01:32:46 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a29
	* fixed a bug that would cause call_outs which were exact
	  multiples of CALL_OUT_CYCLE to be delayed by one CALL_OUT_CYCLE
	  (sometimes could happen with call_outs that differed by a small
	  multiple of 2 from this)
	* removed an unused local in repeat_string
	* Fixed the parsing package to not crash when given a line containing
	  more than 256 words (now it just returns; the limit can be set at
	  the top of parser.c)

Tue Apr 23 16:58:34 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a28
	* added a contrib efun: repeat_string(string s, int n) which
	  essentially does: sprintf("%-*'"+s+"'s", n, ""), but is readable.
	  e.g. repeat_string("-=", 10) == "-=-=-=-=-=-=-=-"
	* redesigned call_outs slightly to allow constant time insertion
	* added a CALLOUT_HANDLES option, which has the following effects:
	  . call_out returns an int, which can be passed to the following
	    two efuns:
	    remove_call_out(int handle)
	    find_call_out(int handle)
	  . Note that using the handle is more efficient than using the
	    ob, function name version
	
Tue Apr 16 11:29:13 EDT 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a27
	* updated with respect to v21.7b21
	* Fixed sort_array to work correctly when called from a sort callback

Sun Mar 10 05:32:19 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a26
	* updated with respect to v21.7b20
	* Added Raistlin@IE's fix for a bug in replaceable()'s one argument
	  case introduced in v22a23 which caused the one argument form to
	  quit working
	* Fixed the ARCH define for 386bsd to not override the FreeBSD define
	* changed "stuf!" -> "unknown architecture", when ARCH cannot
          be determined
	* added a classp() efun
	* added support for \012 octal escapes and \x1e hex escapes in
	  strings and character constants
	* added a comment about what the legal values of CFG_LIVING_HASH_SIZE
	  are
	* crasher fix in the database package
	* put a remove_interactive() call back in that accidentally got removed
	  at one point, which caused the driver to busy loop until a message
	  was sent to the object whose link had died
	* COMPAT_BUSTER: two changes to call_stack(3): first, use strings
	  instead of numbers to be consistent with origin(); second, a bug
	  was fixed which was reporting the origin of the frame below the
	  indicated frame, not the frame itself.
	* fixed compilation on systems that use _SC_PAGE_SIZE, not _SC_PAGESIZE

Mon Mar  4 20:36:27 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a25
	* updated with respect to v21.7b19
	* added code to flush message queues when closing connections and
	  shutting down
	* added a flush_messages(void | object) efun for manually flushing
	  message queues (during a long thread of execution, for example)
	* fixed a bug that would cause some anonymous functions to not
	  be bindable
	* fixed a crasher in recursive structures in error traces
	* fixed a bug in sprintf() column mode that would wrap early if
	  a fit exactly in the width given

Fri Mar  1 13:33:14 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a24
	* added Pace@Callandor's patch for REVERSIBLE_EXPLODE_STRING
	* made PARSE_NUMERIC() into a routine instead of a macro, and
	  added support for scientific notation so that very large/small
	  floating point values restore correctly in restore_svalue() and
	  friends

Mon Feb  5 09:43:36 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a23
	* updated with respect to v21.7b18
	* added a 'parallel' target for parallel makes when using gmake
	* protected process_command against this_player() changing or
	  being destructed during process_input() and other nasty places
	* removed the DEBUG_COMM_FREEZE code
	* made the message queue flushing a bit lazier which should result
	  in smoother output and larger packet sizes
	* added Descartes' database package
	* added heart_beat_info() as a synonym for heart_beats() when
	  COMPAT_32 is on
	* 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.
	* added a function_owner(function) contrib efun.
	* made #undef PACKAGE_SOCKETS/#define PACKAGE_EXTERNAL compilation
	  fail more gracefully
	* fixed a parser callback bug that caused the 'real names' of
	  omitted args to be omitted too
	* added an error message for using the debug mode of parse_sentence
	  when the driver wasn't compiled with DEBUG on
	* fixed a bug that would cause parse_sentence() to return large
	  numbers instead of error strings
	* fixed a typo in the Incorrect argument to type %s error message.
	* fixed compilation when first_inventory() is disabled.

Sat Feb  3 13:06:23 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a22
	* fixed seteuid() to pass the correct second arg to valid_seteuid()
	* fixed the parsing package to not crash if parser_error_message()
	  doesn't exist

Sun Jan 21 21:29:34 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a21
	* updated with respect to v21.7b16
	* The master object and simul_efun object can be updated again when
	  LPC_TO_C is not defined; patch from d.collins@ic.ac.uk
	* unified the code handling function pointers/extra args in
	  various efuns; fixes crashers in rare cases.  Also, sort_array()
	  now takes additional args which are passed down the the function,
	  like filter() et al.
	* Added a check for the /usr/ucbinclude directory in ./build.MudOS;
	  Solaris needs <sys/rusage.h> from there
	* Removed push_string() internally; push_constant_string() should
	  now only be used on string constants.  The following changes
	  will preserve previous behavior:
	  . push_string(x, STRING_MALLOC) -> copy_and_push_string(x)
	  . push_string(x, STRING_SHARED) -> share_and_push_string(x)
	  . push_string(x, STRING_CONSTANT) -> push_constant_string(x)
	  . push_constant_string(x) -> share_and_push_string(x)
	  also, new function: push_shared_string(), which pushes and
	  references a known shared string.
	* optimized the PORT_ASCII code a bit, and fixed some problems/loops
	  in it in the presence of bad input/errors
	* fixed a bug that would cause message() to send messages/avoid the
	  wrong people if the target/avoid argument was _not_ an array,
	  and the function was called during the processing of another
	  message call whose target/avoid was also not an array
	* removed XALLOC(), since it isn't used any more
	* fixed mapping hash distribution and centralized the definition of
	  it
	* optimized terminal_colour a bit
	* optimized present() a bit; also fixed a leak in errors in id()
	  functions
	* the message of the message() efun may now be of any type; this
	  actually was side effect of a fix that makes message() more
	  efficient :-)
	* fixed a crasher in sprintf() table mode, when no number of
	  columns was specified (best fit)
	* improved the packages/ and mudlib/ dependencies a bit
	* configure.h is now remade if the information in 'uname -a' changes
	* no longer log a 'double call to remove_interactive()' if an object
	  self-destructs in net_dead()
	* There is no longer a limit on the number of sockets available;
	  if a limit is wanted it should be enforced in valid_socket()
	* fixed sprintf() column mode to wrap at the column width, not one
	  before
	* added a couple testsuite tests for sprintf table mode
	* ./build.MudOS now prints an error message if an unknown kind of
	  build is attempted instead of silently assuming the default
	* Parser changes:
	  . Two new restrictions; only one plural token is allowed per rule,
	    and only two object tokens are allowed per rule.  The second may
	    disappear after I clean it up a bit.
	  . fixed a crasher in having more than MAX_NUM_OBJECTS involved in
	    a parse
	  . 'all' is now supported, also 'all of ...', 'all red swords', etc
	  . Cases where more than one object are matches, but only one makes
	    sense now work
	  . in callbacks, only objects that have been completely parsed can
	    be refered to.  This means can_ and direct_ functions can't
	    reference the direct or indirect objects.  The corresponding
	    spots in the argument list are missing.
	  . OBS rules use the _obj_ callbacks, with the exception of do_
	  . error handling is now up to the master object via the
	    parser_error_message() apply.  The first argument is a int
	    indicating the error type.  The second is an object if this
	    message corresponds to part of a plural match, otherwise it
	    is zero.  The third and following args depend on the error
	    type (from include/parser_error.h):
	    ERR_IS_NOT, ERR_NO_LIVING, ERR_NOT_ACCESSIBLE:
		the noun used, and then 0/1 depending on whether there
	        ambiguity
	    ERR_AMBIG:
	        an array of objects that might have matched
	    ERR_ORDINAL:
	        The number that was refered to
	    ERR_THERE_IS_NO:
	        The string that couldn't be matched
	    ERR_ALLOCATED:
		The error message returned by the mudlib
	    ERR_BAD_MULTIPLE:
	        nothing
	    [note: if you want more info that you think the parser might
	     have, let me know]
	    compat/parser_error.c has a decent approximation of the old
	    behavior
	  . do_foo_obs() gets an array of objects and error messages as
	    the arg corresponding to obs
	  . Returned error strings which start with '#' are assumed to
	    be nonsense messages, and aren't counted for the purpose of
	    ordinals and all.  Useful to prevent 'get all' from printing
	    an error for yourself and the room, and to keep 'drop first sword'
	    from counting swords in the room.

Sat Jan 20 15:47:06 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a20
	* removed process_string() and process_value(); simul_efuns are
	  availaible in the compat/simuls directory
	* Fixed a memory leak in new(class foo, bar : baz, ...)
	* fixed compilation problems in grammar.y.pre, shallow_inherit_list,
	  object.c
	* fixed a typo: m_indices() is keys(), not values(); also added
	  m_delete
	* pluralization fixes: 'are', 'mackerel'
	* added Rust's timezone efuns to contrib; turned off by default
	  since they may not compile everywhere

Wed Jan  3 16:12:50 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a19
	* updated with respect to v21.7b15
	* All values which were previously 'null' are now undefined instead;
	  nullp() is now exactly the same as undefinedp()
	* added a COMPAT_32 option, which tweaks a few things to allow
	  some 3.2/3.2.1 code to be ported easier; see options.h for
	  what changes
	* shallow_inherit_list() is now the same as inherit_list() [unless
	  COMPAT_32 is on, in which shallow_inherit_list() is the MudOS
	  behavior, and inherit_list() becomes deep_inherit_list() ]
	* error message change: 
	    Missing type -> Missing type for global variable
	* Don't raise type mismatch errors for code of the form
	  'identifier = expr'; 'Missing type for global variable' is good
	  enough
	* Don't manually include <sys/resource.h> and <sys/rusage.h> in
	  interpret.c; trust configure instead
	* fixed a parser crasher in refering to 'noun', when more than
	  4 adjectives are possible
	* Fixed sprintf table mode to not stretch the last line to fit
	  the field width

Wed Jan  3 14:29:43 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a18
	* fixed some serious flaws in class member lookup introduced in a17

Tue Jan  2 17:59:42 EST 1996 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a17
	* updated with respect to v21.7b14
	* fixed a crasher in the call_out leak fix from v22a1
	* turned off PACKAGE_EXTERNAL by default
	* fixed a bug that caused the messages from saving the ed buffer
	  of an object which was dested while in ed to be appended to the
	  start of the next message sent to an object using ed.
	* check for wait3() as well before using BSD signals
	* removed wait() from lint.h since we include <sys/wait.h> now
	* fixed a couple bugs in the handling of functions in the memory
	  leak tracking code
	* fixed a crasher in add_action(function) when the driver is
	  run with the -d flag
	* fixed the addr_server not to crash if gethostbyname() fails for
	  some reason
	* function(...) { ... } is now rebindable if it does not reference
	  local functions or global variables
	* switch (...) { case 0: function() { break; }; },
	  while (...) { function() { continue; }; },
	  and similar pathological code is no longer allowed.
	* bind(f, ob) now always succeeds if f is already bound to ob
	* added back the fast version of livings() from v22a14 as a contrib
	  efun named_livings(); also fixed it to not return objects which
	  are no longer living()
	* added class support in reclaim_objects()
	* trailing justification is no longer added to the last line of
	  tables if no pad string was specified
	* The following is now legal:
	  class foo { int x; string y; }
	  class foo f1 = new(class foo, x : 5);
	  class foo f2 = new(class foo, y : "foo", x : 1);

Sat Dec 30 20:55:41 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a16
	* updated with respect to v21.7b13
	* changed the name of strerror to port_strerror to avoid prototypes
	  on SunOS, which prototypes the function but never defines it
	* Removed a number of prototypes in lint.h for functions which are
	  also prototyped in SunOS headers now
	* Fixed a bug that would prevent two way communication with external
	  commands
	* Small optimization to the string case of socket_write
	* Tracked down the real problem which caused sprintf() to crash
	  on empty tables; also fixed a crasher empty lines in column mode
	* reversed the livings() patch, since not all living objects are
	  in the hash table
	* #ifdef'd out some unnecessary code for when LPC_TO_C is off
	* Remember to wait on our children, so we don't create zombies;
	  configure checks to figure out whether to do it the BSD or
	  Sys V way
	* Removed some archaic defines from portability.h
	* Changed the parse_sentence return codes again:
	  1 - success
	  0 - no such verb
	 -1 - verb exists, but no rule matched
	 -2 - a rule made sense, but can_ or direct_ failed
	* Fixed a typo in the 'Illegal master object file name' error message

Fri Dec  8 20:53:11 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a15
	* updated with respect to v21.7b12
	* changed livings() to walk the living hash table instead of the
	  full object list; idea from Jihad
	* '\r' is now treated as whitespace by the compiler
	* The success return code of parse_sentence is now 3, not 1.
	* changed the return type of parse_sentence from 'int' to 'mixed'
	* Fixed a crasher in using a function pointer as a read callback
	* If PACKAGE_EXTERNAL is defined, then lines of the form:

	  external_cmd_1: /usr/local/bin/gzip

	  in the config file allow the mud to run the command using the
	  following efun:
	  
	  int external_start(int which, string args,
	                     mixed read_cb, mixed write_cb, mixed close_cb)

	  which is the command number (e.g. 1 from the example above)
	  args is the argument passed to the command.  A socket is returned,
	  which can be used to communicate with stdin/stdout of the command.

	  valid_socket() is passed "external" as the operation.
	  Up to 5 commands are allowed.

Thu Dec 21 01:33:34 PST 1995 (gstein@svpal.org (Deathblade))
	* raised patchlevel to v22a14
	* fixed varargs by tweaking grammar.y.pre to not turn off the
          TYPE_MOD_ARRAY flag for the varargs variable
	* fixed sprintf() crasher when tables are used (Rust and Zakk)

Thu Dec  7 12:30:20 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a13
	* fixed crasher in disabling a heart_beat during a heart_beat
	* fixed sprintf() to not add trailing padding onto wrapped strings
	* removed the break_string() efun.  See compat/simuls/break_string.c
	  for a replacement.
	* fixed a few more misoptimizations of last variable references by
	  the optimizer.
	* added a warning for putting varargs args into a variable of
	  non-array type, also fix a bug that would cause type errors
	  if the prototype was in scope
	* parse_sentence now returns:
	    0 - no such verb
	    1 - verb exists, but no rule matched
	    2 - a rule made sense, but can_ or direct_ failed
	  in the cases where it used to return zero.
	* parse_add_rule no longer has a third arg; it is always this_object()
	* New parse efun:
	  parse_add_synonym(string new, string old):
	    . interpret the verb 'new' as if it were the verb 'old', and
	      parse using 'old's rules and routines
	  parse_add_synonym(string new, string old, string rule):
	    . 'new' acts like 'old' for only the rule 'rule', which must
	      have been previously added.  Can be called multiple times.

Wed Dec  6 18:00:15 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a12
	* fixed a crasher in passing a negative number as the field width
	  via the '*' specifier
	* fixed a crasher in strings which were too long to fit into tables
	  in table mode

Tue Dec  5 19:30:12 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a11
	* fixed two crashers in the table generation logic of sprintf(),
	  also fixed a bug that would cause the second and following
	  lines to be indented wrong
	* fixed tables to fully fill the space allocated to them in
	  the format description
	* The fill pattern for tables and columns always fills out the
	  entire 'box' now; e.g.
	  printf("%#|30'.'s\n", "apple\nbannana\ncherry\ndonut\nelf\nfruit\n")
	  gives:
	    ...apple....cherry......elf...
            ..bannana....donut.....fruit..
	  and not:
	    ...apple....cherry......elf
            ..bannana....donut.....fruit

Mon Dec  4 16:13:59 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a10
	* updated with respect to v21.7b11
	* moved values_list in function_context_t and node in decl to
	  align slightly better
	* fixed the direct/dirent check to include std_incl.h in case it
	  has some defines needed by those files
	* removed some really old and unused files of the compiler %union
	  (address and funp; the second of which predates me ...)
	* small optimization to the lexer's handling of comments in
	  preprocessor lines
	* major changes to sprintf.c:
	  . COMPAT_BUSTER: error messages are never returned any more, but
	    are thrown as errors instead.
	  . 'clean' is no longer used, so cannot be leaked
	  . COMPAT_BUSTER: "%^" is no longer special (for efficiency reasons,
	    as well as disagreements on the exact algorithm)
	  . The format string is never written into, eliminating the need
	    for savechars and related hacks; fixes a crasher in extremely
	    long strings in tables (>2k)
	  . The setjmp()/longjmp() is gone, since the cleanup can be done
	    on the next call to sprintf() now
	  . sprintf() is now officially not reentrant, and you will get
	    an error if you try.  It probably crashed before if you tried
	    it.  The only LPC code called by sprintf() is object_name(),
	    so this shouldn't be a problem
	  . on the whole, things should be significantly faster (slightly
	    more than 3 times faster on the small example I used),
	    mostly due to collecting sets of characters instead of adding
	    characters individually, and removing redundant length calculations
	  . large portions of the file are now actually readable

Mon Nov 27 22:51:35 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a9
	* updated with respect to v21.7b10
	* COMPAT_BUSTER: The scope of for and foreach loop variables is now
	  only the inside of the loop.  This also fixes a bug demonstrated
	  by the following:
	   { int i; for (int j;;) ; } { int i; }
	* Some error message changes:
	  . Indexing on illegal type
	    -> Value being indexed is zero/Cannot index value of type 'foo'.
	  . Indexing a (string/array) with an illegal type
	    -> (String/Array) indexes must be integers
	  . Negative index passed to array
	    -> Array index must be positive or zero

Wed Nov 22 12:52:13 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a8
	* updated with respect to v21.7b9
	* fixed a typo in ./build.MudOS (CC -> $CC)
	* fixed a crasher in copying parse_command_* arrays which are empty

Tue Nov 21 17:16:10 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a7
	* updated with respect to v21.7b8
	* fixed the ar test to make sure comptest.o exists in ./build.MudOS
	* Leading and trailing whitespace in the values in the config file
	  is now ignored

Wed Nov 15 14:41:20 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a6
	* updated with respect to v21.7b7
	* Better system for reporting bad malloc configurations (two malloc
	  packages, etc) and system configuration errors
	* Report a redefinition error if classes with the same name are
	  inherited from different files
	* Fixed the "Return type doesn't match prototype' error message
	  to only be printed once per occurance, not twice

Tue Nov 14 12:53:51 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a5
	* updated with respect to v21.7b6
	* A few small tweaks to the testsuite cleanup
	* fixed crasher in printing a string containing a '%' when
	  NONINTERACTIVE_STDERR_WRITE was defined
	* some small cleanups to includes in socket_ctrl.c

Tue Nov  7 17:50:22 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a4
	* updated with respect to v21.7b5
	* updated all the Makefiles with respect to Makefile.master
	* minor change: use 0 instead of -1 for master_ob not loaded yet since
	  we no longer have to distinguish between unloaded/not loaded yet
	* added MDmemcheck() which can be inserted into the source to do
	  internal memory consistency checks and abort if corruption is found
	* added back some parser fixes that were missing due to reversed
	  patches
	* Two new options to ./build.MudOS:
	  - ./build.MudOS develop -> turn on warnings and debugging code
	  - ./build.MudOS debug -> turn on debugging symbols and code

Fri Nov  3 16:41:11 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a3
	* updated with respect to v21.7b4
	* couple changes to void handling, basically (int)->(void) is no longer
	  legal.  The following are now errors:
	  . int f(void x) { ... }
	  . ... { void x; } ...
	  . void x;
	  . class foo { void x; }
          . void f() { return 1; }
	* defining a variable is now allowed in foreach, e.g.:
	  . foreach (string x, object y in z)
	* fixed a crasher in errors in parse_* callbacks

Sun Oct  8 19:48:21 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a2
	* updated with respect to v21.7b3
	* COMPAT_BUSTER: previous_object() == 0 and not this_object() in
	  heart_beats
	* remove_call_out(/* no arg */) now returns 0 always, not -1
	* fixed a bug in the replace_string() with all 5 arguments in
	  some cases
	* fixed a bug in restoring mappings which had arrays/mappings/
	  floats as keys
	* added some missing newlines to regexp() error messages
	* fix to the center/left justify case for ints; remember to
	  add the padding to the right side as well in sprintf()
	* more testsuite efun tests; finished through 'sprintf()'
	  or so
	* made it illegal to undefine or redefine a global define like
	  __VERSION__
	* added a NO_RESETS option
	* better error message for people who don't choose a malloc package
	* fixed various crashers involving passing garbage back to the
	  parser inside arrays
	* fixed leak in sprintf() for printing recursive structures; attempting
	  to do so no longer errors.

Sun Oct  8 19:27:28 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v22a1
	* removed some outdated code (c_filter() and f_creator())
	* fixed a crasher in removing heart_beats during a heart_beat
	* fixed a leak in call_outs with more than one extra argument
	* fixed a leak in illegal arguments to call_stack()
	* fixed set_light() to compile with NO_ENVIRONMENT (for the
	  ultimate in bleeding edge uses of archaic efuns :) )
	* added some checks to make compilation bomb more informatively
	  if two malloc packages/wrappers are specified
	* cleaned up the signal handling code a bit
	* fixed compilation of the matrix package
	* fixed compilation with NO_ENVIRONMENT and !NO_ADD_ACTION
	* fixed compilation with DO_MSTATS and SYSMALLOC
	* fixed testsuite to compile and work with either setting of
	  INTERACTIVE_CATCH_TELL, NO_ADD_ACTION, PACKAGE_UIDS,
	  NO_ENVIRONMENT, NO_WIZARDS, PRIVS
	* revamped the testsuite efun tests, and added tests for most of
	  the efuns 'a' through 'r' or so
	* testsuite now logs compilation errors to /log/compile
 
----------------------------------------------------------------------------
v21.7a10 promoted to v21.7b1

Fri Sep 22 22:51:20 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a10
	* fixed a bug that caused case 0: to not work in string switches
	* fixed a typo in the unknown pragma error message
	* rule priority is now calculated beforehand in the parser; this
	  fixes the precedence of some errors and allows earlier shortcutting
	* 1st through 9th and first through ninth are now understood by the
	  parser
	* "Which X do you mean?" is now more verbose
	* 'myself' is now the same as 'me'

Mon Sep 11 03:37:53 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a9
	* fixed debug_info(2, ...) to put all the info in the string;
	  it was still sending some of it directly to this_user()
	* slight optimization (condense two consecutive strlen() calls)
	  in regular expressions
	* -DPEDANTIC now allows the use of inline to be turned off, since
	  gcc only defines __STRICT_ANSI__ when -ansi is used, and not
	  when -pedantic is used, but -pedantic complains loudly about inline,
	  and -ansi causes the SGI headers to break.  Unfortunately, gcc
	  only gives some useful warnings when -pedantic is on
	* fixed up some (unsigned char *) <-> (char *) problems
	* fixed an optimizer bug that would clobber range expressions and
	  generate incorrect code
	* Added documentation of makefile targets to the makefiles
	* Added a .DEFAULT rule for the decoy makefiles so better errors
	  are generated when the wrong make is used with a target
	* Made the SIGPIPE always reenable the handler, not just on Linux,
	  since other OS's (Solaris) behave this way as well
	* Fixed the gettimeofday() check to use two args, so it wouldn't
	  fail on BSD based systems
	* fixed a compile error in OPTIMIZE_FUNCTION_TABLE_SEARCH
	* added a handler to ignore SIGFPE for those systems that raise it
	* changed "create" to APPLY_CREATE in replaceable()
	* fixed a parser crasher when parse_command_users() doesn't exist
	* removed a if (pointer >= 0) check in the parser
	* fixed a crasher in the 'last match to error' handling in the parser
	* fixed a crasher in parse_command() when the object array had
	  non-objects in it
	* fixed some NO_ENVIRONMENT compilation problems, especially when
	  NO_ADD_ACTION was NOT also defined.  (add_action w/o environments
	  is a tad pointless, but it works now)
	* fixed a bug that cause query_verb() to only return the matched
	  portion and not the entire verb
	* fixed (s)printf() to not print destructed objects

Fri Sep  8 03:34:50 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a8
	* updated match_path() to know about the mapping changes
	* preliminary OBS changes; OBS and LVS are recognized as tokens now;
	  currently they behave exactly the same as OBJ and LIV
	* fixed a few uses of new_string as a variable name
	* fixed a parser in generating arguments for parser callbacks

Sun Sep  3 21:47:54 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a7
	* cleaned up -Wall compile
	* better code to check the string statistics, leading to:
	* fixed the string stats bug(s); the figure should be correct again now
	* improved the error message for "owner of function pointer destructed"
	* removed the storing of the hash value in mapping nodes; mapping
	  memory usage should be down ~20%; also optimized a bit, so
	  most mapping operations should be faster
	* crasher fix in %o case of parse_command()

Wed Aug 30 19:36:35 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a6
	* crasher fix in edit_source -configure from Valodin
	* moved the CONFIGURE_VERSION define to the end of configure.h so
	  incomplete configure.h files are detected as corrupt
	* removed the each() efun
	* crasher fix in the optimizer (no local variables again)
	* updated the tag info in check_memory(1)
	* fixed check_memory() to not accidentally complain about the string
	  it is building
	* fixed a bug in the mark and sweep memory debugging of the parser
	* fixed a crasher in verb handlers that call parse_refresh()
	* fixed a memory leak in objects that call parse_refresh()
	* remember to add the real names when calling can_* callbacks
	* fixed a bug that would cause parser error messages to be truncated
	* fixed a memory leak in incoming MUD mode socket packets
	* added a bunch of bug reports to Bugs
	* fixed a line number bug in '\<line break>'
	* fixed @@ to work again, evidentally noone has used in in over a
	  year since it hasn't worked since Robocoder added L_ARRAY_OPEN ...
	* fixed odd errors if the end of the input buffer is hit while
	  parsing a macro expansion; found by Tensor
	* fixed a line number bug in macro arguments with newlines in them

Tue Aug 29 17:11:06 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a5
	* updated with respect to v21.6b6
	* Merged in Descartes' diffs for Windows NT and Windows 95.  Someone
	  please check these; I fixed/changed a bunch of things, but have no
	  way of testing them, and there are probably some mistakes.
	* removed the old OS2 code, since noone ever got it to work ...
	* added support for foreach (int in string)
	* fixed a fatal error when a string > 64k in size was added to an
	  outbuffer.
	* changed sprintf() to use outbuffers, speeding up sprintf a bit,
	  and expanding the size limit to 64k
	* fixed type error for sizeof(array constant)
	* it's now legal for an ed range to go past the end of the file;
	  any line # greater than the file size refers to the last line.
	* fixed a bug that caused varargs contraction to not be done when
	  the call_other cache was hit, or when one does inh::foo()

Sat Aug 26 19:37:38 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a4
	* reorganized the function_t struct slightly to save a bit of memory
	* added a warning for return types that don't match their prototypes;
	  currently ignores modifiers, since accepted usage is so gross in
	  this respect it isn't even funny.  The next item might help:
	* added "private:" which makes all function definitions/globals after
	  it private (until the next such section).  Works with any type
	  modifier (static, private, protected, public, nomask, varargs)
	* optimization fix: remember to put the replacement node in the tree
	  when doing: if (x) {} else y -> if (!x) y
	* catch, time_expression, and __TREE__ now generate explicit code
	  to pop the value instead of doing it inside F_END_CATCH.  This
	  makes the grammar a bit simpler, and generates better code for
	  catch { ... } and catch(x = ...), which are common cases
	* fixed sizeof( ({ ... }) ) to preserve side effects inside the
	  array constant, for crappy code like sizeof( ({ i++ }) ),
	  which now compiles to: i++, 1
	* changed edit_source to include configuration info when doing tests,
	  so we can check for defines in include files
	* run ranlib on the mudlib/ and packages/ files for systems that need/
	  like it.
	* added a WRD token in the parser, which is just like a STR but only
	  matches one WoRD.
	* fixed a bug that chopped a letter off the results returned by STR
	  rules
	* xxx_verb_yyy() callbacks now include the name of the verb in the
	  'real names' part of the argument list, so for example "kick! beek"
	  would call (among other things):
	  can_verb_obj("kick", OBJ(beek), "kick!", "beek")
	  This should satisfy the people who have been mailbombing me asking
	  for a way to get at the real form of the verb :)
	* fixed a few warnings in the parser
	* When the return value of a construct is unused, and the construct
	  has no side effects, replace it by it's arguments (recursively)
	  possibly eliminating the construct entirely.
	  i.e. the following generates no code:
	
	int x; class bar y; array z;
	((({ ~x })[!x..<x+3] ? (y->foo)[(x*2)-1..] : ([1:2, 3:x])), -z[x]);

Thu Aug 24 06:58:46 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a3
	* configuration checks for broken libg.a Linux configurations,
	  <dlfcn.h>, -ldl, RTLD_LAZY
	* try cc -E -traditional-cpp as a possible preprocessor in build.MudOS
	* Use ANSI USHRT_MAX instead of MAXSHORT if availiable
	* reworked the handling of novalue efuns to be more robust; fixed
	  crashers in (void efun) || (void efun) among other things.
	* Patches from Symmetry:
	  . made Config.Example match the testsuite setup
	  . fixed mapping case in dump_variable() for testsuite
	  . bugfix in resolve_path() in testsuite
	  . allow (: function() { return $1; } :)
	  . optimize x[y..<1] to x[y..]
	  . optimize dested obs in F_TRANSFER_LOCAL
	  . crasher fix for swapped objects in program_info()
	  . fixed disassembly of efun function pointers

Mon Aug 21 03:58:32 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a2
	* fixes from Symmetry for #undef RUNTIME_LOADING
	* added Zakk's query_ip_port() contrib efun for finding out which
	  port an object connected to
	* fixed a parser bug that would sometimes cause objects to fail
	  to be recognized the first time they were referenced.  Many, many
	  thanks to Deathblade for helping to track down this one
	* Added filenames to the parser error messages
	* improved the handling of punctuation; verbs do NOT include
	  punctuation again, although this may change; stay tuned ...

Thu Aug  3 20:25:27 EDT 1995 (tim@handel.princeton.edu (Beek))
	* created v21.7a1 from v21.6b3
	* valid_compile_to_c() in the master object now controls the use
	  of the generate_source efun.
	* RUNTIME_LOADING works if your system supports dlopen()/dlsym();
	  define it in options.h, then use generate_source(filename)
	  to load the object.  Note that /lpc2c in the mudlib must be
	  a symbolic link to the driver source.  Objects loaded in this
	  manner do not show up on lpc_info() [yet]
	* The restriction which disallowed cloning of objects with
	  environments was removed
	* destruct()'ing the master or simul_efun object now fails if a new
	  copy can't be loaded.  This means that once the mud starts, a
	  master or simul_object is ALWAYS loaded.
	* preliminary changes for disallowing calls to private functions;
	  you can still get past it in odd cases (e.g. calling the function
	  before you inherit it)  More changes in a patchlevel or two.
	* fixed a bug that caused // and /* to be interpreted as comments
	  within continuation lines in #define's
	* fixed the F_WHILE_DEC optimization, and added support for it
	  in loops of the form 'for (...; x--; ...) { ... }'.  Centralized
	  the handling of loop test optimization.
	* optimize empty blocks for if's
	* removed some mentions of 'actlab' in the docs
	* added some new exit codes to the Exit_Codes doc
	* added NO_ENVIRONMENT in options.h
	* fixed the disassembly of F_LOOP_COND_NUMBER
	* fixed a crasher/wierd behavior in using 'array' to declare arrays
	* fixed a bug that made using a (blank) simul_efun object necessary
	* added DEBUGMALLOC support for the parsing package
	* added support for classes in copy()
	* fixed a bug that chopped the last letter off of some
	  parser error messages
	* updated the testsuite lib to run under the default driver 
	  configuration

----------------------------------------------------------------------------
(v21.6a11 promoted to v21.6b1)

Tue Jul 18 02:23:22 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a11
	* updated with respect to v21.5b10
	* fix from Marius for a crasher in x[<y] when x and y are constant
	* fixed a bug that would incorrectly generated varargs expansion
	  code for (*f)()
	* null terminate crypt() strings, in case crypt() is des_crypt() in
	  disguise
	* in get_single() in the parsing package, binary search the bitvectors
	  instead of doing a linear search
	* added int regexp(string, string)
	* fixed a bug in code generation for return statements in LPC->C
	  introduced during the compiler rewrite
	* only include <values.h> if MAXSHORT isn't in <limits.h>
	* fixed a crasher in filter()
	* fixed 'safe' -> 'saves' in pluralize()
	* fixed TRACE compilation with NO_WIZARDS
	* fixed regexp() to not crash on eight-bit characters in the format
	  on hosts where 'char' is signed

Sat Jul 15 14:35:50 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a10
	* updated with respect to v21.5b9
	* backed out the VOLATILE changes to compile_file.c since it relies
	  on a gcc extension
	* fixed a crasher in true varargs functions with local variables
	* added configure checks for <mach.h> and <mach/mach.h>
	* fixed a crasher in undefined functions
	* COMPAT_BUSTER: filter_mapping() now passes the value as the
	  second element, just like map_mapping()
	* fixed the Makefile to support options in grammar.y.pre; this
	  probably should be changed to use a %include "options_incl.h"
	* added y.output and tmpdepend to 'make clean'
	* fixed `system_libs` -> `cat system_libs` in the Makefile
	* fixed a few DEBUG crashers in the parser package

Thu Jul 13 04:05:49 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a9
	* updated with respect to v21.5b8
	* backed out the VOLATILE changes to sprintf.c since it relies on a
	  gcc extension
	* updated the Makefile not to define EDIT_SOURCE any more
	* implemented the parser generated error messages for the parsing
	  package
	* added the other half of varargs support, allowing the following:
	  void log(string file, string fmt, array args ...) {
	      write_file(file, sprintf(fmt, args ...));
	  }
	  void foo(int x) {
	      log("/log/foo", "foo() was called with: %i\n", x);
	  }

Thu Jul  6 03:52:27 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a8
	* fixed to_float("illegal string") to always return 0.000000
	* added testsuite tests for to_int() and to_float()
	* fixed a crasher in illegal indexes to array constants
	* 'make depend' now works again when using GNU make
	* edit_source -configure is never rerun if configure.h exists,
	  even if the file is out of date (it takes too long, and the
	  info shouldn't change).
	* fixed a dependency problem that caused configure.h not to get built
	* DEBUG is now visible to %ifdefs
	* check for <values.h>; MAXSHORT is there on SGI
	* removed some unused variables
	* added __TREE__(expr) and __TREE__{ ... } which evaluate to arrays
	  representing the compiler's internal representation (IR) of the
	  given code.  For example,
	  __TREE__(x + y) gives: ({ "binary op", "+", ({ "opcode_1", "local",
	                            0 }), ({ "opcode_1", "local", 1 }) })
	* catch { ... } and time_expression { ... } are now legal.
	* if ARRAY_RESERVED_WORD is on, then 'array' now associates with the
	  type and not the var, for example:
	  int array x, y == int *x, *y and not int *x, y
	* 'array' by itself is now allowed, meaning 'mixed *'
	* fixed a bug in type checking that allowed 'x *' and 'x' to be
	  compatible in one order, but not the reverse

Fri Jun 30 16:44:33 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a7
	* updated with respect to v21.5b6
	* merged Makefile.MudOS back into the main Makefile
	* added implode(array, function, mixed) where the third
	  argument is the value to start with, as in:
	  flatten(arr) {
	      if (arrayp(arr)) return implode(arr,(: $1 + flatten($2) :),({}));
	      else return arr;
          }
	* fixed make_func.y to give file and line numbers on fatal errors
	* added configure checks for getrusage(), times(), gettimeofday(),
	  and fchmod() instead of using hard coded information
	* figure out the correct type for UINT32 in configure
	* removed the 0.9.18 compat efun package
	* fixed a crasher in remove_interactive()
	* disabled the lookat_rotate2 efun in the matrix package as it
	  uses more arguments than the compiler currently supports

Tue Jun 27 01:10:27 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a6
	* fixed the debug checks to not panic on nested foreach's
	* fixed edit_source -configure to not get fooled by OSF's queer
	  non-standard BSD compatibility includes
	* fixed a crasher in passing a bad argument to call_stack()
	* optimized upper_case() and lower_case()
	* fixed an ANSI style declaration in eoperators.c
	* a couple minor fixes for alpha; also fixed DEBUGMALLOC to work
	  correctly on alphas

Fri Jun 23 02:39:02 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a5
	* updated with respect to v21.5b4
	* fixed a bug that caused sizeof(array constant) to always be 16

Tue Jun 20 16:25:14 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a4
	* updated with respect to v21.5b3
	* fixed a few bug in using x[y..z] as an lvalue
	* fixed an error in setting the return type of time_expression()
	* added packages/parser.c, a flexible parsing system for interactive
	  fiction applications
	* fixed a crasher in variables()
	* added a workaround for getting EINTR while trying to seek the swap
	  file 

Sun Jun 18 11:33:07 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a3
	* fixed a bunch of warnings from gcc -Wall
	* fixed c_update_branch_list() to not generate unused labels
	* COMPAT_BUSTER:
	  origin() and typeof() now return strings.  If you use the defines
	  in the driver include/ files, you're fine (assuming you update your
	  includes)
	* fixed some compilation problems with local variable optimizations
	* put the mudlib/ directory back to the default one
	* fixed a bug that was disabling the while_dec optimization
	* efun::new() is legal again
	* the type info in functions() are now strings
	* variables now has an optional flag just like functions
	* fixed a bug in replace_string() that would not copy the elements
	  which matched the search string which were not replaced in the
	  case when the replace string is longer than the search string

Thu Jun 15 09:15:23 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a2
	* updated with respect to v21.5b2
	* made functional procedures in LPC->C static so they don't interfere
	  across multiple files
	* fixed a bug that inserted extra to_int/to_float() calls even when
	  the expression had already been reduced as a constant, i.e.
	  1 + 2.3 -> 3.3 and not to_float(3.3)
	* reorganized the compiler's intermediate representation to be
	  easier to optimize/generate code from.  nodes now have general
	  types like NODE_BINARY_OP instead of the old form.
	* removed support for PRAGMA_EFUN
	* optimized the last use of a local in a frame by transfering
	  instead of copying.  If the last use is in a switch() or loop
	  it is ignored.  The same trick is also done for use of a local
          right before an assignment, as in: write(x); x = 1;
	  (only done when #pragma optimize is on)
	* split F_LOOP_COND up into F_LOOP_COND_NUMBER and F_LOOP_COND_LOCAL

Mon Jun 12 04:45:44 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.6a1
	* expression function pointers, anonymous functions, and foreach
	  now work in LPC->C code.
	* added class support in LPC->C code
	* updated ccode.c with the icode.c cleanups
	* added a warning for [x] and [y..x] when x is a negative constant
	* optimized LPC->C string constants
	* optimized the calling of efuns.  All arguments are now checked
	  automatically.  The format is now:
	  . efuns which _always_ take one arg have opcodes like eoperators
	  . New efun eops which includes the number of arguments F_EFUN0,
	    F_EFUN1, F_EFUN2, F_EFUN3 which is followed by the efun index
	  . F_EFUNV for efun calls using 4 or more args
	* some reorganization and cleaning up of make_func.y to allow the
	  above
	* inlined efun calling for efun pointers.  This should make
	  (: efun, ... :) significantly faster than (: efun(...) :)

---------------------------------------------------------------------------
(v21.5a6 promoted to v21.5b1)

Sat Jun  3 21:32:15 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.5a6
	* updated with respect to v21.4b11
	* fixed a bug in replace_string(x, y, z) when strlen(y)==strlen(z)==1
	  and another one when strlen(z) < strlen(y)
	* added a ... operator which expands an array into a list of arguments.
	  it is legal in varargs efuns, function calls, varargs efun pointers,
	  and array constants (the last can be useful; ({ x, y..., z }) is the
	  same as ({ x }) + y + ({ z }), but slightly faster)
	* COMPAT_BUSTER: removed the apply() efun.  A replacement is in the
	  (new) directory compat/simuls.  Basically, apply(f, arr) is now
	  the same as evaluate(f, arr...)
	* fixed the space saving code that only generates a return 0 if the
	  function doesn't end in a return to recognize the return_zero opcode

Sat Jun  3 05:33:46 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.5a5
	* fixed a bug in call_all_other that would return zero for all items
	  other than the first

Thu Jun  1 14:55:53 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.5a4
	* updated with respect to v21.4b10
	* COMPAT_BUSTER: If process_input returns a string, it behaves as
	  before.  If it returns a non-zero integer, no further processing
	  will be done.  In all cases, process_input will continue to be
	  called if it exists.

Mon May 29 22:28:50 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.5a3
	* updated with respect to v21.4b9
	* fixed a crasher in call_all_other

Sat May 27 02:44:33 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.5a2
	* updated with respect to v21.4b7
	* optimized replace_string(foo, bar, bazz) when strlen(bar) is 0 or 1
	
Fri May 26 15:58:23 1995 (tim@handel.princeton.edu (Beek))
	* created v21.5a1 from v21.4b6
	* added the following diffs from Symmetry with minor modifications:
	  . fixed type error messages to handle classes
	  . optimized merge_arg_lists
	  . optimized call_function_pointer a little
	  . optimized call_all_other
	  . support more general sscanf specifiers, including %(regexp),
	    as well as %s%x and %s%% having the typical non-greedy %s support
	  . small optimization to replace_program
	  . made it so that set_heart_beat(0) and set_heart_beat(1) behave
	    more consistently when called during a heart_beat
	  . implemented heart_beats as an array which saves ~12 bytes in
	    objects that don't have heartbeats

---------------------------------------------------------------------------
(v21.4a9 promoted to v21.4b1)

Tue May 16 07:07:17 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a9
	* fixed a crasher in calling sprintf("...%O...") before the
	  master had finished loading
	* fixed a few bugs in LPC->C compilation of string switch statements
	* fixed a problem with the GNUmakefile made by LPC->C
	* implemented ranges in switch statements for LPC->C
	* fixed a crasher in parse_command()
	* fixed catch() to work again from LPC->C code
	* fixed a crasher in dumpallobjects with respect to some function
	  pointers
	* fixed a bug accidentally added last patchlevel which caused
	  arrays and mappings to not restore when the 'noclear' flag was
	  passed to restore_object

Mon May 15 04:12:47 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a8
	* fixed a bug that would truncate arrays/mappings sent over
	  MUD mode sockets
	* added a missing #include of cfuns.h that caused undefined
	  identifier errors during LPC->C compilation
	* specifying an address server in the config file is no longer
	  necessary
	* fixed a crasher when the simul_efun object had no simuls in it
	* fixed a crasher in implode(array, function)
	* fixed a bug that caused catch() and function profiling to be
	  ignored
	* fixed wierd behavior with respect to unterminated @ and @@ blocks
	* fixed a problem that would cause logging to fail of the log dir
	  in the config file was specified as '/'

Sat May  6 22:41:22 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a7
	* updated with respect to v21.3b5
	* fixed a ref count problem in heart_beats()
	* fixed a compilation problem for people who don't use 'local_options'
	* put the v21 README into the distribution
	* optimized implode_array
	* recognize IAC IAC as a quoted IAC character; this has two effects:
	  . IAC can now be received by the mudlib
	  . window sizes with widths and heights of 255 work again
	* fixed MUD mode sockets to work on machines where sizeof(long) > 4
	* optimized member_array(), string compares, string hashing etc
	  to check string length first; idea from Aragorn
	* fixed load_object() to not error if the file doesn't exist,
	  also fixed the error messages to be better than 'Failed to load
	  file' in many places
	* fixed a crasher in calling non-existent socket callbacks
	* fixed a few syntax errors in ed commands to not dump you out of
	  ed
	* Added a bunch of stuff to Bugs/Ideas files; I'm going to try to
	  keep them more up to date; dumped a lot of stuff from my todo list
	  there
	* fixed generate_source() to not leak a file on some errors
	* fixed a bunch of problems with the upper_case() contrib efun;
	  it was out of date with respect to counted strings
	* added Magician's remove_interactive() efun to the contrib package

Sat May  6 19:03:29 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a6
	* added 'mixed implode(mixed *, function)'
	  /* sum all the elements in an array */
	  int sum(int *x) { return implode(x, (: $1 + $2 :)); }
	  /* find the largest element */
	  mixed max(mixed *x) { return implode(x, (: $1 > $2 ? $1 : $2 :)); }
	  /* with respect to an arbitrary function ... */
	  mixed max(mixed *x, function f) {
	    return implode(x, (: evaluate($(f), $1, $2) > 0 ? $1 : $2 :));
	  }
	  /* comma separated list of numbers */
	  string list(int *x) { return implode(x, (: $1 + ", " + $2 :)); }
	* cleaned up a lot of the Makefile dependencies

Fri May  5 21:36:29 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a5
	* fixed a typo in wrappedmalloc.h
	* memmove() is now checked in edit_source -configure
	* COMPAT_BUSTER: this_player() is zero is get_save_file_name().
	  The apply is now get_save_file_name(string fname, object who)
	* added foreach (<var>, <var> in <mapping>), which should behave
	  the same as k = keys(m); for (i = 0; i < sizeof(k); k++) {
	  x = k[i]; y = m[k[i]]; ... }
	* fixed a bug that gave odd error messages for illegal simulefun
	  overrides
	* returned options.h to the MudOS distribution options
	* fixed crashers in terminal_colour()
	
Fri May  5 03:25:54 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a4
	* fixed some bad logic in rc.c that would sometimes write past
	  the end of it's temporary buffer (rc.c needs a rewrite....)
	* fixed a Makefile bug that caused edit_source to try to include
	  configure.h
	* added 'foreach (<var> in <expr>) <statement or block>'
	  . currently only legal when <expr> is an array
	  . foreach (x in y) { ... } should behave identically to
	    for (i = 0; i < sizeof(y); i++) { x = y[i]; ... }
	    with the exception that y is only evaluated once
	* fixed another crasher in people going linkdead in ed
	* added some output in edit_source.c related to local_options
	* fixed a bug in replace_string() that would miss occurences at
	  the end of the string
	* fixed a typo in the alpha fix from last release
	* COMPAT_BUSTER: 'foreach' and 'in' are reserved words
	* COMPAT_BUSTER: map_mapping now passes the key and the value
	  to the function
	* crasher fix in the contrib efun pluralize(); also corrects a bug
	  that caused it to strip adjectives
	* fixed a few typos in smalloc.[ch]
	* added Symmetry's changes to testsuite's master and simul_efun obs
	
Tue May  2 20:38:08 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a3
	* fixed a bug that would ignore 'local_options' during compilation
	* fixed a bug in the handling of _OPTIONS_H_
	* modified the OBJDIR rules not to recompile excessively
	* rewrote the error context handling, propagating Symmetry's error
	  popping tricks everywhere, cleaning up the code, and removing
	  some ancient code
	* fixed a bug in generate_source(string, ...) that produced an
	  error message where there shouldn't be one
	* put ins_long() back in since 64 bit machines need it
	* fixed some incorrect calls to add_message in DO_MSTATS and TRACE_CODE
	* cleaned up user_parser; fixed some crashers
	* COMPAT_BUSTER: 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
	* cleaned up the mudlib error handler code; fixed a leak therein
	* added ;'s in a few places in socket_efuns.c for strict ANSI
	  compilation
	* optimized deallocate_string() in the same way free_string previously
	  was
	* added Robocoder's patch to allow '\a' and '\e' (bell and escape)
	* fixed the stringified efuns to set the type of the return value
	  to 'string'
	* fixed a crasher in clear_notify()
	* fixed a crasher in people going linkdead in ed
	* fixed a bug that would add an extra object on previous_object(-1)
	  for lfun and functional pointers

Tue May  2 19:34:55 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.4a2
	* fixed a crasher when replace_string() was called on a string with
	  more than one reference, and the replacement was smaller than the
	  thing being replaced
	* fixed addr_server to compile again
	* fixed a crasher in string creation for the reworked efuns
	* added a case for the new F_WHILE_DEC code in the disassembler
	* slight optimization to replace_string :)
	* sizeof(class) now returns the number of members, not zero	
	* fixed #undef OLD_ED compile
	* New contrib efuns: string *variables(object), object *heart_beats()

Sun Apr 30 03:53:32 EDT 1995 (tim@handel.princeton.edu (Beek))
	* created v21.4a1 from v21.3b1
	* updated with respect to v21.3b4
	* added Truilkan's optimized replace_string(): 
	  should be '15% to 40% faster' depending on the use.
	  also modified it to work with counted strings, and slightly
	  optimized the brute force (pattern length == 1) case
	* the logon() function is no longer required to exist
	* rearranged the output of the driver a bit, and cleaned up
	  a lot of the related code.  stdout and debug.log now both
	  get the same information (with the exception of some stuff
	  that only goes to stdout before debug.log is ready)
	* removed a lot of fidgeting with the value of command_giver
	  COMPAT_BUSTER: the definition/existence of this_player()
	  changed in some places.
	* COMPAT_BUSTER: A number of efuns now return strings instead
	  of dumping info to this_player(): malloc_status(), cache_stats(),
	  lpc_info(), mud_status(), dump_file_descriptors(), program_info(),
	  debug_info(), dump_socket_status()
	* reorganized/rewrote varargs handling; default to the ANSI way
	  if possible
	* function pointers can now be used for socket callbacks
	* New Feature: if you have a file 'local_options', it will be used
	  instead of options.h.  Also, edit_source will issue an error message
	  if an option has been added to options.h that you don't have a
	  setting for.

---------------------------------------------------------------------------
(v21.3a7 promoted to v21.3b1)

Tue Apr 25 15:43:47 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a7
	* updated with respect to v21.2b8
	* added Robocoder's optimization to read_buffer()
	* fixed a lot of things gcc -Wall complained about
	* fixed a crasher in disassembling code involving classes
	* fixed type checking to not give an error for missing type
	  for arguments when type checking is off
	* fixed a bug which could cause type errors in non-type checked
	  functions, especially wrt 'return x;'
	* fixed a problem that would cause edit_source -configure to run
	  on every make
	* check return values and report file errors in edit_source -malloc
	* configure checks for <sys/sysmacros.h>, and <bstring.h> if DEBUG
	  is on (sgi prototypes for bzero, which is used by FD_ZERO is there)
	* only add -lmalloc if malloc() isn't in a standard library
	
Tue Apr 25 15:25:06 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a6
	* fixed misoptimizations of nullp() and undefinedp()
	* fixed a bug in array subtraction, intersection, and other
	  operations (next person who uses & when they mean == will be
	  shot)
	* fixed two typos in the build.MudOS script

Sun Apr 23 18:53:24 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a5
	* updated with respect to v21.2b7
	* fixed a bug in the STRFUNCS check in ./build.MudOS
	* fixed some compilation problems with string functions and
	  DEBUGMALLOC

Sat Apr 22 21:38:11 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a4
	* fixed some compilation problems with DEBUGMALLOC tags in function
	  calls
	* fixed a typo in the T_REFED optimization that would cause the
	  gamedriver to crash right after booting
	* fixed save/restore of classes
	* fixed reclaim_objects() to correctly handle destructed objects
	  as mapping keys; the equivalent of map_delete() is now done
	  on them
	* optimized free_string() with some ideas from Armand@TMI-2

Fri Apr 21 02:06:38 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a3
	* updated with respect to v21.2b6
	* optimized free_svalue() and assign_svalue_no_free() by
	  handling all refed objects similarly and saving a switch()
	* fixed some compilation problems in interpret.c
	* fixed some of the tagged routines to depend on DEBUGMALLOC,
	  not DEBUG
	* fixed the external declaration of svalue_strlen_size

Tue Apr 11 12:23:36 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a2
	* updated with respect to v21.2b5
	* fixed a variable name clash (type_names) between interpret.c and
	  compiler.c
	* edit_source -configure now checks for the existence of strerror()
	  for better POSIX compatibility
	* fixed catch() to work from LPC->C code
	* if the compiler found is 'cc', check if it is gcc and if so use
	  gcc's optimization flags
	* MAX_USERS no longer exists; instead, space is allocated as needed.
	  a limit should probably be enforced by the mudlib to avoid running
	  out of file descriptors ...
	* new efun alias: this_user() == this_player()
	* compile hash.o with optimization since it is used in the main
	  driver as well as edit_source
	* added an optional flag to the functions() contrib efun:
	  functions(object, 1) returns:
	  ({ "function_name", num_arg, ret_type, arg1type, arg2type, ... })
	  where the types are the type numbers given by typeof()
	* COMPAT BUSTER: map_mapping now passes the value, not the key,
	  to the function pointer.
	* evaluate() and apply() now return 'mixed' and don't need casting
	  with CAST_CALL_OTHERS defined
	* rewrote malloc'ed strings to be ref counted and remember their
	  lengths.  This gives a factor of 2-5 speed gain on many string
	  operations at the cost of 4 bytes of memory per string.  However,
	  the reference counts means that malloc'ed strings are not duplicated
	  when copied, so despite the new overhead, many muds may see a
	  reduction in memory used by strings.  Note: If you are trying
	  to test this, note that check_memory() and mud_status() now
	  report ALL memory used by strings; previously only the memory
	  used by shared strings was reported, the memory used by malloc'ed
	  strings wasn't reported anywhere.
	* made strings statistics optional since they can have an impact
	  on the speed of string operations.
	* driver guru info:
	  where you used to do:          now do:
	  x = (char *)DXALLOC(n+1, ...   x = new_string(n, "foo")
	  FREE(x)                        FREE_MSTR(x)
	  x = DREALLOC(x, ...            x = extend_string(x, ...
	  strlen(shared_string)          SHARED_STRLEN(shared_string)

	  note that string_copy() now returns a ref'd, counted string.
	  if you really do just want a copy of an area as a normal
	  allocated block, see alloc_cstring()

	  Also, it isn't safe to assume you can write into a malloc'ed
	  string now.  See unlink_string_svalue() if you need to do it.
	* optimized explode() and implode() to use SVALUE_STRLEN to
	  find the length of their arguments
	* removed some unused ed flags
	* added a new ed set option 'verbose' which shows number of lines
	  and bytes in files, etc
	* added a check not to add -lcrypt if crypt() is defined in libc.a

Tue Apr 11 00:36:00 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.3a1
	* updated with respect to v21.2b3
	* successfully compiled and ran the driver with all loaded objects
	  compiled into the driver (LPC->C); the only things that may not
	  work are catch() and defining functionals/expression pointers
	  (although calling function pointers will work fine)
	* fixed a typo in the type checking code generated for to_float/to_int
	  (LPC->C)
	* precompiled objects now depend upon binaries which are saved with
	  the .B extension so they don't conflict with normal binaries
	* fixed in generation of the following LPC->C code:
	  . while (i--) ...
	  . for or while (x < y) ...
	* added support for (--x), (++x), void_assign_local, x--, (-x), (~x),
	  x[<y], (: ... :) in LPC->C compiled code
	* generate_source() now sends precompiled objects into a mudlib/
	  subdir of the binaries dir if passed an array of files, and
	  creates multiple source files there instead of one huge source
	  file.  The mudlib/ dir can be copied unchanged into the driver
	  source dir and compiled.
	* removed support for ALWAYS_SAVE_COMPILED_BINARIES
	* made the output of lpc_info() more readable
	* F_WHILE_DEC now uses up one less byte
	* removed an unused version of find_status()
	* fixed a bug in sprintf's column option that would omit a character
	  if a line was too wide

----------------------------------------------------------------------------
Thu Mar 30 15:45:30 EST 1995
	* promoted to beta status (see v21.1b1)
	* updated with respect to v21
	* Two new contrib efuns:
	  . void store_variable(string name, mixed value)
	  . mixed fetch_variable(string name)
	  These can be used for simulating set(), implementing debuggers,
	  etc:
	       foo = bar <-> store_variable("foo", bar)
	       return foo <-> return fetch_variable("foo")
	  set(string foo, mixed bar) {
	      switch (foo) {
	      case "name": case "hp":
	            store_variable(foo, bar);
	            break;
	      default:
	            ...
	* fixed a number of typos/problems with the Makefile/GNUmakefile
	  that would cause compilation to fail
	* Added an option to have up to 5 external ports
	  These can be specified in the config file.  The format is:
	  external_port_x : kind #
	  where x is 1, 2, 3, 4, 5; kind is telnet, binary, or ascii
	  and # is the port number.  For compatibility, the line:
		mud port : 5555
	  is the same as
		external_port_1 : telnet 5555
	  'telnet' ports act the same as previously.  'ascii' ports
	  send no telnet characters, and don't do any interpretation of
	  the text they receive except to pass it one line at a time
	  to process_input().  'binary' ports act very much like 'ascii'
	  ports, except that buffers are passed to process_input()
	* Added in a fix from Robocoder for using smalloc or bsdmalloc
	  with debugmalloc or wrappedmalloc; previous smalloc or bsdmalloc
	  was erroneously ignored and sysmalloc used
	* Added in a fix from Jeearr for build.MudOS which would cause
	  it to die if GNU make wasn't present
	* optimizations:
	    return 0 is now 1 opcode
	    loop conditions involving <
	    multiple pushes in a row compressed into a quick format
	    x == y, !(x != y), x < y, !(x >= y), x > y, !(x <= y),
	    x != y, !(x == y) in if statements and ( ? : )
	    !x, x==0, etc in ( ? : )
	* connect() is now passed the port # to which the user connected
	* reworked rc.c a bit
	* changed all the references to NO_UIDS to PACKAGE_UIDS; this was
	  causing compilation to fail with NO_UIDS off
	* re-indented interpret.c
	* fixed compilation of functions(), replaceable() and pluralize()
	  (contrib)
	* COMPAT_BUSTER: "efun", "new", and "asm" are no longer valid
	  function/variable names
	* all type names are now valid in foo::bar
	
Fri Mar 24 20:59:08 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped patchlevel to v21.2a6
	* updated with respect to v21.1b7
	* The build procedure has changed drastically:
	  (1) edit the top of build.MudOS to configure a few things.
	      You should only have to do this if you have an obscure
	      operating system or want to change INSTALL_DIR, etc
	  (2) "./build.MudOS"
	      The script will munge for a while, then print out the
	      configuration it determines.
	  (3) if you don't like what build.MudOS decided, edit the top
	      of Makefile/GNUmakefile.
	  (4) type make/gmake, as appropriate
	  (5) type make install, or move the binary to whereever you want it
	* technical details:
	  The build process goes more or less as follows:
	  (1) ./build.MudOS determines enough system parameters to allow the
	      compilation of edit_source
	  (2) edit_source is built, then run to process options, configure
	      malloc, create various makefiles and check which libraries
	      and include files exist
	  (3) Makefile.MudOS is then executed in order to build the main
	      driver executable
	* stage (2) of the compilation is run with optimization off, as
	  edit_source takes longer to compile than to run ...
	* Both GNUmakefiles and Makefiles are generated from a common file.
	  developers should edit Makefile.master and then run 'make Makefiles'
	  if changes to the build process are wanted.
	  (This was actually added last pl, but now applies to 3 makefiles)
	* modified terminal_type negotiation to comply with the relevant RFC's;
	  this may increase the number of systems it works with.
	* added NAWS window size automatic negotiation; the callback is:
	  void window_size(int width, int height)
	* optimized the pushing of call_out arguments
	* added a missing prototype for c_generate_node()
	* fixed/kludged errors in #include to report the right line number
	* renamed DISALLOW_BUFFER_TYPE to NO_BUFFER_TYPE

Wed Mar 22 23:37:55 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped patchlevel to v21.2a5
	* added a mudlib/ directory to hold LPC->C compiled code
	* mudlib/ and packages/ compilation now use libaries to
	  avoid packages/*.c kludges and the like
	* added Symmetry's diffs to allow for recursive class definitions,
	  allowing linked lists, etc to be constructed
	* packages are now specified in options.h instead of fooling with
	  func_spec.c.  This will work for any package, even ones not
	  included with MudOS (PACKAGE_AURORA, for example, will automatically
	  compile and use packages/aurora.c and packages/aurora.spec)
	  in addition, a #include in func_spec is no longer necessary
	* removed all references to the MIRE package
	* in the driver source:
	     NO_MUDLIB_STATS -> !PACKAGE_MUDLIB_STATS
	     SOCKET_EFUNS    -> PACKAGE_SOCKETS
	* Fixed a number of instances where messages including filenames
	  had no leading '/'
	* added F_VOID_ASSIGN_LOCAL: x = ... is now a single opcode
	* applied Robocoder's fix for a problem where 'continue' would
	  get confused in nested loops
	* removed some useless code from F_VOID_ASSIGN
	* removed make_malloc and make_func and replaced them with
	  edit_source; cleaned up the associated code
	* added preprocess.c which centralizes some of the code used by
	  both lex.c and edit_source.c; more work needed here.  Unfortunately,
	  it has to be #included since edit_source.c can't stand MALLOC
	* COMPAT_BUSTER: removed a bunch of LPC predefines
	    SAVE_EXTENSION:  use __SAVE_EXTENSION__
	    USE_EUID:        use ! __NO_UIDS__
            HAS_BUFFER_TYPE: use ! __DISALLOW_BUFFER_TYPE__
	    HAS_SOCKETS:     use __PACKAGE_SOCKETS__
	    HAS_SHADOWS:     use ! __NO_SHADOWS__
	    HAS_DEBUGMALLOC: use __DEBUGMALLOC__ && __DEBUGMALLOC_EXTENSIONS__
	    HAS_MATH:        use __PACKAGE_MATH__
	    HAS_PROFILE_FUNCTIONS:  use __PROFILE_FUNCTIONS__
	    HAS_MATRIX:      use __PACKAGE_MATRIX__
	    HAS_PRIVS:       use __PRIVS__
	    HAS_EACH:        use __EACH__
	    HAS_CACHE_STATS: use __CACHE_STATS__
	    HAS_OPCPROF:     use __OPCPROF__
	    HAS_MUDLIB_ERROR_HANDER: use __MUDLIB_ERROR_HANDLER
	    HAS_MUDLIB_STATS:use ! __NO_MUDLIB_STATS__
	    HAS_LIGHT:       use ! __NO_LIGHT__
	* removed the debugging code from the identifier hash table code
	  since it appears to be bug free
	* fixed a crasher in Robocoder's config file fix when lines were
	  missing from the config file
	* consolidated some of the error reporting code
	* both GNUmakefile and Makefile are now generated from Makefile.master
	  via GNUmakefile.pre and Makefile.pre; one side effect of this is
	  that you can use 'make Makefiles' to return your Makefile to
	  it's unedited state
	* fixed a crasher in objects dested from some socket callbacks
	  
Sun Mar 19 02:32:56 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped patchlevel to v21.2a4
	* updated with respect to v21.1b6
	* REALLY added in the diffs from v21.1b5 (I forgot to run patch
	  last patchlevel)

Sun Mar 19 02:32:56 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped patchlevel to v21.2a3
	* updated with respect to v21.1b5

Sat Mar  4 16:14:17 EST 1995 (tim@handel.princeton.edu (Beek))
	* bumped patchlevel to v21.2a2
	* updated with respect to v21.1b4
	* fixed compilation with #undef OLD_ED (object_ed_output() changed
	  to global scope; it's used by regexp_error())
	* fixed a bug that would incorrectly claim filenames had // in them
	  on some operating systems
	* changed the above error message to say what the filename was :)
	* COMPAT_BUSTER: privs_file is now called to get new privs for
	  virtual objects which are loaded.  This is a bit of an oddity;
	  virtual objects actually get created twice, so it's hard to say
	  what should be done when.  Possibly, mudlib_stats should be
	  also be reinitialized.  Currently, they behave the same way
	  as the object returned from compile_file() which is inconsistent
	  with their filename (which was the old behavior of PRIVS as well)
	  The same problem exists with UIDS.  This may change in the future.

Sat Mar  4 16:14:17 EST 1995 (tim@handel.princeton.edu (Beek))
	* v21.2a1 created from v21.1b3
	* added code to not generate unreachable code in LPC->C generation
	  since SGI cc is very noisy about that and it happens a lot.
	* protect special characters string constant case labels with '\'
	  when generating switch tables (LPC->C)
	* fixed a cases for int switches to use the correct field (LPC->C)
	* added more name mangling for switch table names so they don't
	  collide (LPC->C)

----------------------------------------------------------------------------
Wed Mar  1 18:14:01 EST 1995 (tim@handel.princeton.edu (Beek))
	* v21.1a5 promoted to beta status (see v21.1b1)

Fri Feb 24 23:48:38 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.1a5
	* brought up to date with respect to v21b15
	* MASSIVE source cleanup
	  . 'arrays' are always refered to as arrays and never vectors/pointers
	  . all types now use foo_t syntax instead of struct foo 
	  . several header files cleaned up and includes reorganized
	  . removed internal distinction between internal and external
	    programs (i.e. foo->p.i.bar is now foo->bar)
	* centralized the processing of "/foo/bar.c" -> "foo/bar"
	* removed support for RUNTIME_LOADING
	* removed support for #undef NEW_FUNCTIONS
	* in addition to the above, call_other pointers are gone.
	  (: x, y :) should be converted to (: call_other, x, y :)
	  the functionality remains unchanged, since that's all they really
	  did ...
	* function pointers reorganized to use less memory (the size is
	  now variable based on the ammount of space needed, so a lfun
	  pointer can be significantly smaller)
	* added OPCPROF_2D which keeps statistics on the most commonly
	  executed *pairs* of instructions
	* regexp errors in regexp efuns now use error(), instead of printing
	  a message to this_player() which eroneously refers to ed ...
	* LPC_TO_C now works for compiling objects into the driver.
	  (1) make sure #pragma save_binary is on in all objects to be compiled
	  (2) do a generate_source( <array of filenames> )
	  (3) copy /binaries/interface.c into your source dir (replacing the
	      provided one)
	  (4) recompile the driver
	  (5) the lpc_info() efun can be used to see if the new programs are
	      being used; other than that there should be no visible
	      difference, other than speed.

Wed Feb  15 00:16:55 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.1a4
	* brought up to date with respect to v21b10
	* optimized the handling of the redefinable keywords 'efun', 'asm',
	  and 'new'
	* Floats and ints are now automatically interconverted in the
	  following cases:
	  . Passing an int to a efun that takes a float and not an int, and
	    vice versa.  Hence, sqrt(5) is legal.
	  . during initialization (as in float x = 5)
	  . Note: the above depends on compile time checks so if you exploit
	    mixed, etc to put an int in a float variable it will misbehave
	* added limited support for classes (no member functions):
	  . structure definitions are stored in programs, which means they
	    can be passed down via inheritance

	  . definition of the type is as follows:
	    class <class_name> {
              <type> <member>;
              ...
            }
	    Ex: class my_first_class { int my_number; string my_string; }

          . declaring a variable of that type:
            class <class_name> <var_name>;
	    Ex: class my_first_class my_var;

	  . instantiating a class:
	    <var_name> = new(class <class_name>);
	    Ex: my_var = new(class my_first_class);
	
          . assigning to/using a member
            <var_name> -> <member> = whatever ...	
	    Ex: my_var->my_string = "It worked!";

Thu Feb  2 00:16:55 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.1a3
	* brought up to date with respect to v21b8
	* fixed the define used by cfuns.h to be different from the one
	  ccode.h used
	* generate_source() now returns zero if there were compilation errors
	* modified lower_case() to be slightly more portable and easier to
	  read
	* inlined sapply() into apply() and apply_master_ob() by hand
	* fixed a unrecognized #pragma crasher (the list wasn't terminated)
	* fiddled with the default settings of options.h
	* new contrib efuns:
	  string pluralize(string)
	  int file_length(string)
	  string upper_case(string)

Thu Feb  2 00:16:55 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.1a2
	* brought up to date with respect to v21b7
	* added prototypes for all the c_* functions in ccode.c
	* fixed the Makefile and GNUmakefile; removed obsolete files
	* fixed generate_source() to use 'package fname;' instead of
	  'package lpc_to_c;' when outputting to 'fname.c' and 'fname.spec'
	* removed support for add_action(string); all it did was cause
	  errors anyway ...

Thu Feb  2 00:16:55 EST 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.1a1
	* brought up to date with respect to v21b5
	* COMPAT_BUSTER: removed the following options.h defines and 
	  related behavior: OLD_HEARTBEAT, OLD_COMMAND, IGNORE_STRICT_PRAGMA
	* COMPAT_BUSTER: STRICT_TYPE_CHECKING removed, use 
	  PRAGMA_STRICT_TYPES as a default pragma
	* COMPAT_BUSTER: ALWAYS_SAVE_BINARIES removed, use 
	  PRAGMA_SAVE_BINARY as a default pragma
	* COMPAT_BUSTER: move_object only takes 1 argument.
	  change move_object(this_object(), foo) to move_object(foo)
	* LPC->C restored to working condition in a limited sense:
	  . new pragma #pragma efun ignored during regular compiling
	  . generate_source("source_file.c", "destination_file.c")
	    will compile "source_file.c" into an efun package made
	    up of "destination_file.c" and "destination_file.spec"
	    which can be linked into the driver
	  . note that it is illegal to do the following in an efun:
	    - call a local function -> this really can't be done
	    - call a simul_efun -> see above.  Use efun:: to get around
	      write simul_efuns, etc; the driver won't complain about
	      illegal overrides while generating efun source
	    - use a global variable -> wait for future fixes
	  . LPC->C for objects doesn't work as of this release; only
	    creation of efuns in packages (useful for efunizing simuls)
	  . various things not supported yet; most notably functionals,
	    also string switches are supported but buggy; let me know
	    if you have other problems (esp. linking errors)
	* added some internal stuff for structures; work in progress.
	  ignore the 1 shift/reduce conflict as it won't affect normal
	  LPC code.
	* define_new_function() doesn't take the offset any more; this
	  is set explicitly where needed (2 places)
	* argument types are actually saved why #pragma save_types is
	  used.  They still aren't used yet tho.
	* the format of switch parse trees was tweaked a bit to help
	  LPC->C compilation
	* removed some unused i_generate_* functions
	* push_indexed_lvalue in interpret.c is no longer static; compiled
	  C code needs it
	* removed call_absolute()
	* removed optimization flag, as it was unused
	* rewrote pragma handling to work off of a table for easier addition
	  of pragmas
	* added #pragma no_whatever which turns off the effect of
	  #pragma whatever
	* added program argument types to md.c's list of permanent blocks;
	  not checked for leakage yet tho
	
