Fri Nov 13 21:54:56 GMT-0500 1992 (MudOS Development Team at Portals)

        * changed major version number to 0.9, rolled patchlevel to 0
	* gave a round of applause

Fri Nov 13 21:05:56 GMT-0500 1992 (Truilkan)

	* bumped version number up to 0.8.121
	* added #ifdef PRINTF around the right stuff in efunctions.c
	* added #ifndef NO_SHADOWS around the right stuff in efunctions.c

Fri Nov 13 19:23:32 GMT-0500 1992 (Truilkan)
	* bumped version number up to 0.8.120
	* added a missing #include <sys/time.h> to backend.c
	* cleaned up the Makefile a bit.

Fri Nov 13 17:11:49 1992  Erik Kay  (wayfarer at milo.mit.edu)

	* bumped version number up to 0.8.119

	* fixed ASSERT macro in bsdmalloc.c to actually work

	* fixed function declaration in smalloc.c to be a std C decl

	* fixed missing variable declaration problem in simulate.c

	* fixed ->user references in simulate.c and efunctions.c

Fri Nov 12 03:25:05 CST 1992 (Truilkan)

	* bumped version number up to 0.8.118
	* changed Makefile and GNUmakefile to add support for SMALLOC since
	  some people actually do want to use this (not generally recommended).
	* change set_author so that it debits objects total for previous author
	  and credits the new author (so that new author doesn't end up with
	  a negative object count).
	* applied a patch for sprintf that fixes the printf("@s","stuff") crasher
	* modified backend() so that the select() is called with a zero timeout
	  if heart_beat_flag is true (and 60 second timeout otherwise).  hopefully
	  this fixes the 'Took too long to login' problem seen on some MudOS
	  mudlibs.
	* removed the last flush_message() from add_message() since it doesn't
	  seem necessary and its absence ups average packet size and lowers
	  netlag (on Genocide anyway).
	* changed the 2nd BSDMALLOC_C to BSDMALLOC_O in the Makefile.
	* removed the check for euid in the shutdown() efun.  This can be done
	  in a simul_efun (also using valid_override in master).
	* moved the add_objects() call in simulate.c:init_object() so that it
	  is after init_stats_for_object() (fixes the main negative objects
	  problem in domain_stats/author_stats).

Mon Nov  9 21:51:04 CST 1992 (Truilkan)
	* bumped version number up to 0.8.117
	* change hb_list and hb_tail to non-static (in backend.c)
	* added _AIX to defines for RUSAGE in port.h
	* added break; following f_parse_command call in interpret.c
	* initialized plur_flag to 0 in single_parse() in parse.c.  This fixes
	  a potential hanger.

Sun Nov  8 18:19:46 CST 1992 (Truilkan)
	* bumped version number up to 0.8.116
	* fixed sort_array so that it doesn't call qsort on zero-sized arrays
	  (hopefully this will fix the 'tried to free zero-sized shared vector'
	  crasher).
	* changed the #if around include sys/param.h to be #if !defined(NeXT).
	* moved f_parse_command from efunctions.c to eoperators.c and added
	  F_PARSE_COMMAND case to interpret.c.
	* switched order of 1st and 2nd parms in do_message so that message()
	  efun now sends arguments in the same order receive_message() gets them.
	* fixed so that if VALID_CLONE is defined, master object can still
	  be updated.
	* added a strcmp() efun which will be quite useful in compare functions
	  used by sort_array() efun.
	* ifdef'd out the rc.c that looks for maximum efun sockets (not used)
	* changed tell_room() in func_spec.c so 2nd arg can be int|string|object
	* changed two index() calls in mudlib_stats.c to strchr()

Sat Nov  7 18:25:37 CST 1992 (Truilkan)
	* bumped version number up to 0.8.115
	* changed most of the "void *" types in qsort.c to "char *" since the
	  HP doesn't like to do pointer arithmetic on void *.

Sat Nov  7 15:29:35 CST 1992 (Truilkan)
	* bumped version number up to 0.8.114
	* changed sort_array to use replacement qsort routine (that is tolerant
	  of incorrect "compare functions") in qsort.c.  Fixes a potential crasher.

Sat Nov  7 05:31:40 CST 1992 (Truilkan)
	* bumped version number up to 0.8.113
	* included sys/param.h in mudlib_stats.c for sun and rs/6000 and sequent.
	* added Wayfarer's patch to ed.c that fixes the crasher that occurs when
	  using ed to try to list ('z') files with very long lines.
	* added a line to 'make clean' in Makefile to remove efunctions.h,
	  base.h, and efun_protos.h (all are auto-generated)

Fri Nov  6 14:50:40 CST 1992 (Truilkan)
	* bumped version number up to 0.8.112
	* hopefully fixed 'objects' field of domain_stats() so that it doesn't
	  become negative (did add_objects() for clone as well as load).

Fri Nov  6 10:13:14 CST 1992 (Truilkan)
	* bumped version number up to 0.8.111
	* fixed a few places where ANSI prototypes were being used (uid.c, uid.h)
	* added #include <sys/param.h> to mudlib_stats.c for hpux
	* fixed a place in simulate.c where euid was not being set (see FIXME)
	* fixed an error in the restore_array and restore_size code which
	  was causing .o files containing arrays similar to this:
	  ({"blah\\",}) to fail to load.

Fri Nov  6 01:46:45 CST 1992 (Truilkan)
	* bumped version number up to 0.8.110
	* removed call to valid_author() since this can be handled via
	  valid_override() and simul_efun.
	* added save_stat_files to crashMudOS in main.c so that domain list
	  and author list stats will be saved when driver crashes.
	* fixed a couple of warnings in make_func.y
	* added a new warning fprintf to free_vector()
	* cleaned up a lot of new compiler generated warnings that showed
	  up after switching to the cc in NeXTSTEP 3.0.

Fri Nov  6 22:00:00 PST 1992 Erik Kay (wayfarer at milo.mit.edu)

	* bumped version number up to 0.8.109

	* COMPAT BUSTER - removed obsolote efun domains().  Use
	  domain_stats() efun instead.

	* finished the domain/author stuff

	* added new efun void set_author (string name);  Sets the author
	  of the current object.  This is so you don't necessarily have to
	  know the author of a file by its filename.  Just put this in the
	  create of an object.

Fri Nov  6 00:10:48 CST 1992 (Truilkan)
	* bumped version number up to 0.8.108
	* changed a couple of malloc calls in uid.c to MALLOC
	* fixed insert_uid in uid.c to update uids when necessary
	* added two new efuns 'mapping author_stats(void|string)' and
	  'mapping domain_stats(void|string)'.  Use these two efuns to
	  write a mudlib object that produces the wizlist report.  See
	  the included efun documentation for more information.

Tue Nov  2 18:00:00 PST 1992 Erik Kay (wayfarer at milo.mit.edu)

	* bumped version number up to 0.8.107

	* COMPAT BUSTER - Changed how domains stats (formerly wizlist)
	  works completely.  (removed domain_stats.[ch], replaced with
	  mudlib_stats.[ch])  There are now two mudlib stat groups: authors
	  and domains.  Every object should have a domain and an author.
	  The author of an object is self explanatory (there can be only one
	  author per object unfortunately), and the domain of an object is
	  the region, area or group that it exists within.  As a result, two
	  new functions must be added to the master object: string
	  domain_file (string domain); and string author_file (string
	  author);  Both of these functions should return the name of the
	  domain or author associated with the file. (very similar to
	  creator_file)

	* COMPAT BUSTER - (added uid.c and uid.h). Separated the concept
	  of uid's and euid's from that of domains (wizlist). Under the
	  old system, domains (or wizlist statistic entries under 3.1.2)
	  and uids were the same thing. This meant that you couldn't have
	  domains that weren't valid uids and you had to keep stats for
	  every uid that is exists. Under the new system, uid's are
	  totally separate.  They are simply strings, and nothing else.

	* The wizlist (domain list) code is no longer
	  based on uids but rather on domains.  Two new functions are
	  required in master.c: string domain_file(string domain); and
	  string author_file (string author); In addition,
	  valid_author(string author) should be added to master if you wish
	  set_author(string author) to be functional.  Note: domain_file and
	  author_file are similar to creator_file (which returns information
	  for uids).  domain_file lets the gamedriver know which domain a
	  given object should be in an author_file lets the gamedriver know
	  the author of the file.

Fri Oct 30 15:45:31 CST 1992 (Truilkan)
	* bumped version number up to 0.8.106
	* added a NO_ANSI option to options.h that if defined will change
	  all ESCAPES (ANSI 27) in player-typed input into spaces (' ').
	* changed say() and tell_room() so that they use buffers of size
	  LARGEST_PRINTABLE_STRING instead of 256 (this lets longer strings
	  be passed to say() and tell_room() the same as are allowed by
	  tell_object() and write().
	* changed the apply() calls in socket_efuns.c to safe_apply() since
	  Blackthorn reported that errors in the socket callbacks were sometimes
	  causing the driver to loop.

Thu Oct 29 09:06:38 CST 1992 (Truilkan)
	* bumped version number up to 0.8.105
	* added a new eoperator F_CALL_EFUN so that efuns and eopers no longer
	  have to share the 256 available instruction slots (now each has its
	  own set of 256 slots).  This new opcode now prefixes all efun
	  instructions.  Prior to adding this opcode, there was room for only
	  four new efuns.  Now there is room for approximately 80 new efuns.
	  This new opcode also makes it possible to easily extend the driver
	  to raise the maximum # of efuns from 256 to over 65,000 by using a short
	  instead of a char for storing the efun code (should the need arise).
	* removed check for an euid in snoop() efun (new_set_snoop) since
	  such a check is best done in a simul_efun masking snoop.
	* changed sysmalloc_init() in main() to wrappedmalloc_init() so that
	  WRAPPEDMALLOC is now functional.
	* changed (sp-1) to sp in f_localtime() (at Cyno's request)

Wed Oct 21 21:39:38 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.104
	* made the new strict type checking requirement optional (added
	  STRICT_TYPE_CHECKING macro to options.h) so that Overdrive could use
	  it without spending two weeks fixing 30 megabytes of gross untyped
	  mudlib code.

Tue Oct 20 01:56:35 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.103
	* changed postlang.y so that a function without a return type is assigned
	  a return type of mixed so that strict type checking will be in affect
	  even on code without a specified return type (this is unrelated to
	  typecasting of call_other() but rather to code like this:
	  create() { string output; output = allocate(3); }).  I
	  think this was a nasty holdover from compat mode.  I also suspect
	  it is responsible the recurring unknown instruction 275 crash on
	  Overdrive.
	* added Jacques' one line fix to MUD mode for send in socket_efuns.c (makes
	  sure string is initially empty i.e. begins with '\0')
	* fixed rc.c set_defaults so that it prints out a more reasonable message
	  when it fails to find the config file.
	* added int clonep(mixed) efun which returns true iff the argument is
	  objectp() and the O_CLONE flag is set. (by Cynosure)
	* added listen survivability code.  Once the listen (read) callback
	  function is called for a socket, no subsequent listen callback will
	  occur until socket_accept() has been performed on it. (by Cynosure)

Sun Oct 18 00:33:02 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.102
	* fixed a bug in Makefile and GNUmakefile by adding port.o to the
	  dependencies for addr_server.
	* changed eval_instruction so that it does a dump_trace(1) before
	  calling fatal in the event that an undefined instruction is encountered.
	* changed flush_message() in comm.c so that it doesn't do an immediate
	  remove_interactive but rather sets a flag in the user struct to
	  tell process_io to remove it the next time it sees it.  This was
	  necessary because ed.c doesn't account for the fact that add_message()
	  could invalidate the "interactive" field of an object (it was fixed
	  in flush_message because that was the easiest place to do it).  This
	  fixes a crasher.

Fri Oct 16 00:27:26 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.101 [0.9.0, here we come?]
	* fixed make_func.y to handle lines of the form '# <number>' in addition
	  to lines of the form '# <number> "/usr/include/stdio.h"' since some
	  preprocessors output using one form and some the other.  This should
	  fix the problems that occur with func_spec.c on HPs and Sequents
	  without requiring a Makefile modification.
	* changed Makefile and GNUmakefile so that the name of the driver binary
	  can be easily changed by changing the value of the DRIVER_BIN macro.
	* moved the include "config.h" in efunctions.c before the #ifdef TIMES
	  so that efunctions.c will compile on the HP. 
	* added changed an #ifdef _AIX to #if defined(_AIX) || defined(hpux) in
	  the f_localtime() efunction so that efunctions.c will compile on the HP.

Thu Oct 15 02:08:51 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.100 [0.9.0, here we come :-)]
	* added a "void tzset();" declaration to main()
	* changed f_malloc_status() and bsdmalloc.c so that malloc_status()
	  efun correctly reports when BSD malloc is being used.
	* added (unsigned char) cast to a line in push_indexed_lvalue so that
	  str[i] produces numbers in the range [0..255] on all machines.
	  
Wed Oct 14 02:37:37 CDT 1992 (Jacques)
	* bumped version number up to 0.8.99
	* added -D_ALL_SOURCE to RS/6000 case in makefile so that EAGAIN
	  is equivalent to EWOULDBLOCK.
	* added EWOULDBLOCK check to socket_read_select_handler() in
	  socket_efuns.c
	* added an #ifdef sun #include <sys/time.h> into efunctions.c so that
	  the new localtime() efun will compile.
	* added an #ifdef _AIX to the localtime() efun in efunctions.c so that
	  it will compile on RS/6000.

Wed Oct 14 02:37:37 CDT 1992 (Cynosure)
	* bumped version number up to 0.8.98
	* COMPAT_BUSTER: changed valid_ln callback to valid_link (to match
	  name of efun)
	* added Cynosure's localtime() efun

Tue Oct 13 10:39:15 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.97
	* added rusage() efun support for HP via the times() call.  Note, times
	  are returned in units of clock ticks which is system dependent.
	  Do a 'man times' to see what the clock tick time is for your system.
	* fixed f_shutdown so that it only push_number(0)'s when it should.
	* added MAX_SAVE_SVALUE_DEPTH to options.h.  this is used to prevent
	  crashes from occuring when doing save_object on objects with variables
	  having mappings or arrays with circular (recursive) references.  This
	  is a temporary fix to the problem (eventually should save the circular
	  structure in such a way that restore_object can recover it).
	* added another return type of socket_write EEBADDATA which is returned
	  when a variable is sent in MUD mode and the variable is nested too
	  deeply (according to MAX_SAVE_SVALUE_DEPTH).
	* added a check to message() efun so it doesn't try to print a string
	  that is too long for add_message to handle (fixes a potential crasher).
	* fixed it so that destructing player while driver is in
	  process_input() in player object doesn't crash the driver.
	* COMPAT_BUSTER the socket's close_callback is now called AFTER the
	  socket has been closed. (cyno)
	* fixed bug in process_io() where the socket state was not checked
	  before calling socket_write_select_handler().  The read handler
	  could close the socket and the write handler would still be called.(cyno)
	* fixed bug in socket_connect() where EINPROGRESS was not being
	  returned as EESUCCESS. (cyno)

Sat Oct 10 17:18:50 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.96
	* added valid_shadow callback back to validate_shadowing() since there
	  isn't anyway to protect shadow via a simul_efun (the object calling
	  shadow() is the one that shadows and we don't want the simul_efun
	  object to be the one shadowing).

Sat Oct 10 01:35:49 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.95
	* changed sendto and send in socket_write to write to lpc_socks[fd].fd
	  instead of fd (Cyno found it).
	* nuked fork and vfork from lint.h once more (how do these keep coming
	  back?) since the driver no longer uses them.
	* fixed calculation of total bytes written in flush_message (COMM_STAT)
	* added MESSAGE_BUFFER_SIZE to options.h
	* changed socket_write in socket_efuns.c so that DATAGRAM mode sends
	  strlen() + 1 bytes rather than strlen() (in order to send the null byte)

Fri Oct  9 22:22:29 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.94
	* fixed the stat(path, 1) crasher.  From now on stat(path, -1) is the
	  only way to have stat return an array of arrays (this is consistent
	  with the way stat() was commented in the driver -- however, the actual
	  behavior has been to treat anything non-zero as the same as -1).
	  For now, any argument other than -1 will behave as stat(path, 0).
	  This is to allow the future possibility of values different than 0 or
	  -1 to cause stat() to behave differently.
	* fixed a few warnings in socket_efuns.c (unhandled cases)
	* upped MESSAGE_BUF_SIZE in comm.h from 1024 to 4096 since we are
	  seeing dataloss.

Fri Oct  9 08:14:32 PDT 1992 (Cynosure)
	* bumped version number up to 0.8.93
	* added a comment to Makefile for Sequent DYNIX/ptx instructing users
	  on how to do parallel makes of $(OBJ).  Admittedly this is not
	  general-purpose but my driver builds typically take 1.5 minutes.
	* COMPAT_BUSTER: (sort of)  I added a replace_string() efun which is
	  not completely compatible with the simul_efun version.  The prototype
	  is: string replace_string(string, string, string).  If string #2 (the
	  pattern string) is "" then string #1 (the search string) is returned
	  verbatim.  Otherwise each occurance of string #2 in string #1 is
	  replaced with string #3 (the replacement string).  If the resultant
	  string exceeds MAX_STRING_LENGTH, then 0 is returned and undefinedp()
	  returns 1.
	* socket_create() now supports up to 3 arguments.  If there are 2
	  arguments the 2nd is the close callback.  If there are 3, the 2nd
	  is the read callback and the 3rd is the close callback.  (If you
	  can't stand it, change it back the other way.  I like always having
	  read before close.  I can remember that.)  This allows UDP sockets
	  to specify the read routine since you do not call socket_connect()
	  or socket_accept() on UDP sockets.  UDP sockets do nt need write
	  callbacks.
	* fixed socket_read_select_handler() so that UDP datagrams would be
	  read in the NOUND state, not the DATA_XFER state.  Be careful!  If
	  you don't apply this fix and do use UDP sockets, you can loop your
	  driver.

Fri Oct  9 01:56:12 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.92
	* added O_WILL_RESET to debug_info() efun
	* changed replace_interactive (f_exec) to update num_hidden.
	* put f_set_hide back the way it was in 90 (was correct the way it was)
	* changed "loading config" message in rc.c so it prints out the right
	  filename when loading defaults file in current dir.
	* closed a few potential file descriptor leaks in write_bytes() efun.

Thu Oct  8 21:33:19 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.91
	* fixed f_set_hide so that it doesn't modify num_hidden unless a change
	  in the O_HIDDEN flag is actually made.
	* fixed the throw(0) crasher by adding an END_CATCH eoperator (modeled
	  after Amylaar's solution).
	* took out the safe_apply in compile_object for now (since it was causing
	  problems when an error occured in compile_object() when in DEBUG mode).
	* fixed a bug in push_indexed_lvalue (interpret.c) which was preventing
	  negative indices from being caught (e.g. x[-1]).  This was a potential
	  crasher.
	* fixed f_malloc_status in efunctions.c not to check for BSDMALLOC macro.
	* added a slight optimization to object_visible() (if current_object is
	  already hidden, there isn't any need to do an apply on valid_hide()).

Wed Oct  7 07:36:56 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.90
	* COMPAT_BUSTER:
	  added call to master.c::valid_override(string filename, string function)
	  for each attempt to override a simulated efunction via the
	  efun::func_name() method.  'filename' is the path to the file which
	  is attempting to call efun::func_name().  'function' is the name of
	  the efun that is to be overridden.  If valid_override returns 0, then
	  the current compilation will fail (note: valid_override is only called
	  at compile time and _not_ runtime).  valid_override allows
	  valid_destruct, valid_exec, valid_shadow, etc. to be dispensed with
	  since the same functionality can be obtained by wrapping the efun in
	  question with a simul_efun of the same name (and including valid_*
	  checking in the simul_efun).  Idea taken from Amylaar's done file.
	* COMPAT_BUSTER: removed calls to valid_exec, valid_destruct, 
	  valid_shutdown, valid_shadow, and valid_snoop.  Read the above
	  ChangeLog entry for information on how to deal with this change.
	* added an optional extra arg to ed() efun that allows it to be
	  started in restricted mode (this is useful if you wish to allow
	  ed to be used as a pager and don't want to worry about inadvertant
	  or malicious 'writes').
	* added a safe_apply_master_ob which calls safe_apply and changed
	  the applies to "compile_object" to use it.
	* changed both instances of index() in comm.c to strchr()
	* added object_visible prototype to lint.h

Tue Oct  6 19:45:04 CDT 1992 (Blackthorn)
	* bumped version number up to 0.8.89
	* fixed a bug introduced in 0.8.87 which caused writemask checking
	  to crash the driver when a user lost connection
	* COMPAT_BUSTER: removed unused string-to-object code from
	  simulate:environment(), simulate:destruct_object(),
	  efunctions:f_destruct()
	* renamed NEW_STRING_BUF_SIZE to LARGEST_PRINTABLE_STRING in options.h
	* fixed array:users() to return hidden user objects if the calling 
	  object has hidden privs
	* changed array:children(), array:all_inventory(), 
	  simulate:first_inventory(), and efunctions:f_next_inventory()
	  to honor hidden flags/privs
	* added proper checks for object visibility when using LPC string
	  filenames (as opposed to an LPC object var) into all efuns that 
	  can take strings intended to represent objects.
	* changed efunctions:f_stats() to honor hidden flags/privs (by not
	  reporting that objects hidden to you are loaded)

Tue Oct  6 01:46:29 CDT 1992 (Jacques)
	* bumped version number up to 0.8.88
	* fixed lint.h and prelang.y and make_func.y so that suns and rs6000s
	  don't complain about malloc(), realloc(), and free() prototypes.
	* moved NEW_STRING_BUF_SIZE to options.h (from comm.h).

Mon Oct  5 22:41:54 PDT 1992 (Cynosure)
	* bumped version number up to 0.8.87
	* added support for BSDMALLOC on DYNIX/ptx.
	* removed superfluous flush_message()s.
	* COMPAT_BUSTER: re-added support for "valid_domain". If valid_domain()
	  returns non-zero then the new domain is added to the domain_stat
	  database, otherwise get_bb_uid()'s database entry is used;

Mon Oct  5 21:57:27 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.86
	* BSDMALLOC now can only be defined in the Makefile or GNUmakefile and not
	  in options.h (to allow it to be used in conjunction with DEBUGMALLOC
	  or WRAPPEDMALLOC).
	* renamed SYSMALLOC to WRAPPEDMALLOC and let SYSMALLOC stand for the
	  vanilla builtin malloc (no wrappers).
	* made it possible to define DEBUGMALLOC _and_ BSDMALLOC at the same
	  time (or SYSMALLOC _and_ BSDMALLOC though this doesn't buy you much --
	  just a few extra statistics).
	* removed some unused variables from comm.c
	* changed value of MEMPAGESIZE in port.h for hpux to sysconf(_SC_PAGE_SIZE)
	* redirect all of SIGABRT, SIGILL, and SIGIOT in crash_MudoS (in main.c)
	  to the default SIG_DFL so that calling abort() won't loop the driver
	  (every machine seems to have its own idea of what signal to send when
	  abort() is called).

Mon Oct  5 16:52:49 PDT 1992 (Cynosure)
	* bumped version number up to 0.8.85
	* converted the interactive message_buf[] to a ring buffer
	* make_selectmask() now adds interactive sockets to the write select
	  mask when message_length != 0.
	* added select-for-write support for message_buf[].  process_io() now
	  calls flush_message() when a user's socket selects true for write.

Mon Oct  5 06:11:02 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.84
	* added a missing comma in socket_errors.c
	* added MEMPAGESIZE to port.h.  If your system does not have getpagesize()
	  you may need to change the value of this define.
	* removed code in flush_message that prints warnings for zero-length
	  messages.
	* changed various of the malloc prototypes in lint.h to match what is
	  used by bsdmalloc().
	* returned names in bsdmalloc.c to the original names.  So bsdmalloc()
	  is again malloc() and bsdfree() is now free().  The reason for
	  this change is that some of the yacc code generates malloc() calls
	  (as do some of the UNIX(tm) system calls) instead of MALLOC() which
	  is used in the rest of the driver code.  This means that bsdmalloc()
	  and system malloc() could be called in the same program (both written
	  in terms of sbrk() -- this will eventually likely lead to conflicts
	  and a segfault.  Thus the only solution is to have the routines in
	  bsdmalloc.c actually replace the the system versions of malloc() etc
	  (note: replacing system calls isn't supported on some machines e.g.
	  NeXT and RS/6000).

Mon Oct  5 01:40:26 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.83
	* removed flush_all_user_mess from driver and added flush_message in
	  add_message.
	* changed NEW_STRING_BUF_SIZE in comm.h back to 4096 (from 8192) since
	  socket efuns now do flow control.
	* hopefully fixed the 0 at end of arrays returned by explode_string
	  problem.
	* changed a call in comm.c from first_cmd_in_buf to cmd_in_buf
	  (efficiency reasons -- Blackthorn's suggestion).
	* added global ints for various of the runtime config macros to try
	  to lessen the number of calls to get_config_int (especially MAX_COST
	  which was being evaluated once each time through eval_instruction).
	* added an uptime() efun which returns the number of seconds since the
	  mud was booted.
	* COMPAT_BUSTER: changed inherit_list(object obj) efun _not_ to include the
	  filename of obj in the returned array (that is only return filenames of
	  objects that are actually inherited via the inherit statement).  Made
	  the same change to deep_inherit_list() efun.
	* COMPAT_BUSTER: changed valid_destruct to take only one argument
	  (the object to be destructed).  Use previous_object() in
	  valid_destruct() if you wish to get the caller of destruct() efun.
	* COMPAT_BUSTER: changed valid_exec to be called with args
	  valid_exec(object from_object, object to_object).  Use previous_object()
	  in valid_exec if you wish to check identity of the caller of exec() efun.
	* removed unused trap_sigio variable from backend.c
	* changed svalue_to_int in mapping.c to handle T_POINTER.  This
	  is of marginal impact since arrays aren't often used as indices to
	  mappings :) but if someone does use them that way, then the mapping
	  hash table will be more balanced than it would have been without
	  this change.
	* removed char *index(); from allow_host_access in comm.c
	* added a new malloc choice BSDMALLOC.  We suggest using SYSMALLOC and
	  profiling the driver.  If system malloc appears too inefficient then
	  you may wish to try BSDMALLOC and compare.  Note that BSDMALLOC
	  requires the sbrk() system call (won't work on the NeXT which uses
	  MACH memory management primitives - e.g. vm_allocate()).
	* changed THIS_PLAYER_IN_CALL_BACK to be THIS_PLAYER_IN_CALL_OUT (in
	  options.h) to match what is expected in call_out.c

Sun Oct  4 19:40:39 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.82
	* same CAVEAT applies as does to 0.8.81
	* added socket_errors.c to GNUmakefile
	* changed prototype of socket_create and moved it to socket_efuns.h
	* added CLOSED to switch() in socket_connect()
	* moved crash_MudOS prototype from main.c to lint.h
	* added empty CLOSED, BOUND, and UNBOUND cases to
	  socket_read_select_handler.
	* removed unused variable ob from socket_acquire
	* removed unused variable i from get_socket_owner
	* added "extern int d_flag" to socket_efuns.c for add_ref() macro
	* changed recv() to recvfrom() in DATAGRAM case of
	  socket_read_select_handler().

Sun Oct  4 14:23:15 PDT 1992 (Cynosure)
	*** CAVEAT ***
	  This version is intended as an internal release!  Production MUDs
	  like Genocide and Overdrive should not even consider upgrading to
	  it!  Development MUDs like TMI-2 and Portals probably shouldn't
	  either.  This release features quite a number of enhancements to
	  the sockets code to improve robustness and provide support for
	  DATAGRAM (UDP) sockets.  Although the code is fundementally the
	  same in terms of algorithms, structure, naming etc, it has gone
	  through some serious hacking, so don't even bother trying to diff
	  it.

	* bumped version number up to 0.8.81
	* fixed the bug in clone_object() regarding lazy resets
	* the socket code now models a state machine that I sent out to all
	  the driver developers a while back.  (This is probably the wrong place
	  to document it.)  This state machine is more rigid than that defined
	  by BSD UNIX, but is quite usable and is easy to understand.
	* moved the error_strings[] array definition to it's own module
	  socket_errors.c.  If you modify socket_errors.h you must also
	  update socket_errors.c!
	* added a write select mask.
	* rename make_readmask() to make_selectmasks().  It now builds both
	  the read and write select mask concurrently.
	* removed efun_sock_handler().
	* added 2 new select handlers, one for read and one for write.
	  process_io() now dispatches the appropriate select handler for each
	  LPC sockets.
	* select no longer maps the OS file descriptor into an efun socket
	  descriptor.  process_io() now passes the LPC socket descriptor.
	* added support for DATAGRAM (mode 2) sockets
	* COMPAT_BUSTER: socket_create() now return an error (EEMODENOTSUPP)
	  if an illegal socket mode is specified.  It used to silently default
	  to MUD mode and return success.
	* COMPAT_BUSTER: MUD mode sockets cannot communicate with pre.81
	  MUD mode sockets.  The encoding of svalue length on the network has
	  been changed from an ASCII to binary representation.
	* COMPAT_BUSTER: sockets now have the concept of a single owner.
	  The object that creates a socket is the owner until a successful
	  socket_release() is done on the socket.  Only the socket owner can
	  do socket operations on a socket.  The only exception is
	  socket_acquire(), where the socket is being released and acquired
	  by a new object.
	* COMPAT_BUSTER: socket_accept() now has the new argument list
	  int fd, string read_callback, string write_callback.
	* COMPAT_BUSTER: socket_connect() now has the new argument list
	  int fd, string address, string read_callback, string write_callback.
	  The object cannot socket_write() to a socket after doing a
	  socket_connect() until the write_callback routine has been called.
	  This allows the driver to inform the object when the connection has
	  been made to the remote machine.
	* For DATAGRAM sockets: socket_write() must specify a 3rd argument which
	  is a string that contains the address and port for the remote machine;
	  (i.e. the same format as socket_connect() requires).  This is the
	  address and port that the datagram will be sent to.  Like STREAM mode
	  (but unlike MUD mode) socket_write() on DATAGRAM only supports
	  strings.
	* COMPAT_BUSTER: socket_write() now has the following return
	  semantics: EESUCCESS, this indicates that the message specified
	  has been sent, and that the object may continue sending more
	  data. EECALLBACK, this indicates that the message has been
	  queued within the driver to be sent, but that the object should
	  now stop sending anything else until the write_callback frunction
	  has been called.  EEALREADY indicates that the object has
	  violated the callback protocol, i.e. that a socket_write() was
	  done before the write_callback function was called.  In this
	  case the message WAS NOT sent or enqueued, and the object must
	  resend the message AFTER the write callback function is called.
	  Any other error indicates that some other error occurred while
	  doing the send() system call.
	* COMPAT_BUSTER: the socket_release() and socket_aquire() protocol
	  now works differently.  The socket owner calls socket release as
	  before.  socket_release() calls the acquirers callback function
	  as before.  The acquirer's callback function must now call the
	  socket_acquire() function from the callback.  socket_acquire() no
	  longer require's a releaser's callback function, however it doesn
	  require the new write_callback, so it has the same number of
	  arguments and argument types as before, but they have slightly
	  different semantics.  If the object does not call acquire, then
	  socket_release() will return EESOCKNOTRLSD, and the releaser
	  must decide what to do about it, (e.g. close it).  If EESUCCESS
	  is returned then the release/acquire protocol has succeeded and
	  the object should remove all knowledge of the socket's existence.

Thu Sep 24 00:05:32 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.80
	* COMPAT_BUSTER: nuked remove_all_users from comm.c which applied
	  "quit" on each user object at shutdown time.  If someone wants this
	  behavior, they should call users()->quit() from their LPC shutdown
	  command.
	* removed f_indirect from efunctions.c since it is really an eoperator
	  and wasn't being used (it was a copy of f_identifier)
	* cp() efun was checking source for valid_write.  changed it to check
	  only for valid_read (still checks destination for valid_write).
	  Blackthorn@Genocide found this one.
	* removed #include <sys/socket.h> from file.c since file.c includes
	  comm.h which already includes socket.h (Ultrix was complaining).
	* changed f_sort_array so that it once again checks the vector to
	  be sorted for destructed objects.
	* COMPAT_BUSTER: the callback called by sort_array is now expected
	  to return an integer -1, 0, or 1 depending on whether or not the
	  first arg is less than, equal to, or greater than the second
	  (respectively).  This is in the style of UNIX(tm) qsort, strcmp, etc.
	  It also allows us to avoid doing two LPC callbacks to get the info
	  that qsort needs in order to work.

Wed Sep 23 02:11:25 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.79
	* added a check to remove_interactive so that it returns immediately
	  if an object is passed to it that isn't interactive (prevents crashes).
	  This was made necessary because I earlier moved the remove_interactive
	  call into destruct_object() out of destruct2().  This change prevents
	  the mud from crashing when the player object won't compile.

Wed Sep 23 00:14:05 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.78
	* split options.h into options.h + port.h.  The portability/compatibility
	  defines are now in port.h (the type of machine you wish to compile
	  the driver on will dictate what changes you need to make to port.h).
	  options.h is reserved for those #defines that are completely determined
	  by the preferences of the administrator of the mud.

Mon Sep 21 22:31:41 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.77
	* added the LAZY_RESETS #define to options.h (at request of
	  Blackthorn@Genocide).  See comments in options.h for more info.
	* added a flag to object.h O_WILL_RESET which is initially set
	  true in all objects.  This flag gets set false if reset() doesn't
	  exist in the object (determined by a failed first call to reset()).
	  reset() isn't called again if O_WILL_RESET is set false.

Mon Sep 21 18:01:22 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.76
	* cast arg1 of qsort call in sort_array to (char *)
	* added hpux to the #ifdef in file.c for the sysmacros.h file
	* added more parenthesis to IS_* def'ns at bottom of interpret.h
	* added explicit checks for trying to write 0-valued strings via
	  log_file, write_file, write_bytes since doing so causes the driver
	  to hang on some machines.
	* fixed problem in restore_svalue that was causing restore_object
	  not to unescape quote marks.
	* upped NEW_STRING_BUF_SIZE in comm.h to 8192 (from 4096)
	* changed error message given when attempt made to send too long
	  string to the player via add_message().
	* fixed handling of DEFAULT_ERROR_MESSAGE so that it works as intended
	  (non-wizards get wizardly error messages when DEFAULT_ERROR_MESSAGE is
	  not specified in the config file).

Sun Sep 20 21:40:13 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.75
	* added replacement for sort_array() from Blackthorn (the old one was
	  buggy -- sometimes put duplicates in the result array).  This one uses
	  qsort().

Sun Sep 20 18:55:08 CDT 1992 (truilkan)
	* bumped version number up to 0.8.74
	* fixed a bug I introduced into restore_object (forgot to ignore trailing
	  quote (") when restoring a string)

Sun Sep 20 17:54:12 CDT 1992 (Truilkan)
	* bumped version number up to 0.8.73
	* fixed a bug in mapping_save_size (in mapping.c) that caused too
	  much memory to be allocated when restoring a map (I don't think it
	  was a leak... just an inefficiency).
	* changed a printf in main.c to fprintf (at Cynosure's request)
	* mostly completed functionality of MUD mode of the socket efuns so that
	  you can now do things like: socket_write(fd, xyz) where xyz is a mapping,
	  array, string, or int.  Writing objects is still not supported
	  (although I have some ideas on the Right Way(tm) to do it).
	* modularized code in save_object and restore_object in object.c so that
	  functions called by them could be reused in encoding and decoding
	  svalues for MUD mode (non-STREAM mode) of the socket efuns.
	* fixed a memory leak in restore_object that used to occur when
	  an illegal mapping or array format was encountered.
	* fixed some problems in children() in which elements of str and ob->name
	  were accessed that may not have been part of str or ob->name (accessing
	  non-allocated memory can cause protection violations on some machines).

Sat Sep 19 14:17:16 PDT 1992 (Cynosure)
	* Update the patch level to 0.8.72
	* Just a general comment: this version focused on problems in file
	  descriptor management.  The extensions added are mostly to help make
	  smarter decisions, better diagnostics and statistics to debug
	  problems on running systems.
	* added "maximum efun sockets" to config file (change in rc.c)
	* changed the hardcoded 80 in rc.c to MAX_LINE_LENGTH (up'd it to 120)
	* changed rc.c to print out the path of the config file it loads
	* Added dump_file_descriptors and dump_socket_status efuns
	* apparently NeXT 2.1 fstat() doesn't work properly on fd's that are
	  sockets (so don't be surprised if dump_file_descriptors produces
	  output on NeXTs that looks wrong).
	* Added called to setdtablesize() and some (hopefully) useful analysis
	  to main.c
	* Added MAX_EFUN_SOCK to options.h
	* Added HAS_SETDTABLESIZE to options.h

Tue Sep 15 15:27:25 CDT 1992 (Truilkan)
	* added Cynosure's fix for handling errors on socket close (via close())
	  to efun_sock_handler().  This fixes a potential pathological condition
	  in which close() gets interrupted by a SIGALRM or whatever and the
	  socket stays in the readmask even though it is closed.  This caused
	  the driver to never block in select() (i.e. driver busy waits, CPU usage
	  skyrockets).

Sat Sep 12 23:56:17 CDT 1992 (Truilkan)
	* bumped the patchlevel up to 0.8.70
	* marked those changes that I have any doubt at all about the side
	  effects of with 'o' instead of '*'.
	o moved the call to remove_interactive() from destruct2() into
	  destruct_object() in order to prevent users() efun from putting a
	  zero element in the returned array (need to make sure this has no
	  side effects.  This one is easy to put back the way it was -- its
	  only #if 0'd out in the place where it used to be). 
	* changed socket_acquire() efun so that it allows the read callback and
	  the close callback names to be changed.  usage:
	  socket_acquire(fd, notifyFunc, dataFunc, closeFunc);
	o implemented variable args call_out() (like input_to and call_other).
	  (to put this one back the way it was, copy 0.8.66's call_out.c and
	  f_call_out() from efunctions.c and the call_out() def in func_spec.c).
	* if THIS_PLAYER_IN_CALL_OUT is #undef'd in options.h then this_player()
	  will be 0 in the call_out()'s callback.
	* changed T_NULL to be T_NULLVALUE since it conflicted with a builtin
	  Ultrix #define T_NULL
	* fixed formal parameter of shutdownMudOS to be non-ansi (simulate.c)
	* changed LONGJMP and SETJMP from _longjmp and _setjmp to longjmp and
	  setjmp (the way they were was causing error messages to be delayed
	  until the next time select() detected data).
	* added a define to options.h TRAP_CRASHES which if undef'd, prevents
	  MudOS from trapping signals which would normally crash the mud.
	  If TRAP_CRASHES is defined (and DEBUG is not), then MudOS will
	  call crash() in master.c as usual (when the trapped signals are
	  received).
	* changed the strcpy() in crash_MudOS so that it is strncpy()
	* changed allocate_array to set p->user NULL if current_object NULL
	* fixed an error in f_add (memory scribbles -- my fault)
	o fixed a problem in skip_line() in lex.c that made lines like
	  this cause problems:  define X "blah" // newstyle comment
	* fixed f_socket_create so that it puts the right object in the info
	  vector (this was causing spurious crashes).
	* changed push_object(ob) so that it calls push_null if ob is null.
	  this should make push_object(current_object) safe even if
	  current_object is null
	* COMPAT_BUSTER: changed replace_interactive to send valid_exec an
	  actual object rather than the name of the object (string).
	  You'll need to change your valid_exec() function in master.c if you
	  use exec().
    * added a new optional entry to the config file (read by rc.c).  If
	  "default error message" is defined, then all players (not wizzes)
	  will get that message when an error occurs (e.g. MudOS driver tells you:
	  that action triggered an error).  If "default error message" is not
	  defined in the config, then everyone (players and wizzes) will get
	  the error message previously reserved for wizards (i.e. those that
	  enable_wizard() has been called from)
	* changed users() not to call get_interactive_object() twice (inefficient)
	* fixed SWAPPED(in)/SWAPPED(out) messages in dumpstat.c
	* change crash_MudOS to redirect appropriate signal (SIGILL or SIGABRT)
	* ifdef'd the bounds checking in get_config_* in rc.c with #ifdef DEBUG
	  (get_config_* is called umpteen gillion times, this should save a
	  noticeable amount of CPU time).
	* reverted back to 0.8.66 since successive versions crashed too much.
	  I am reapplying most of the fixes in 67-69.

Wed Sep  9 19:09:37 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.66
	* changed main.c so that "MudOS x.y.z" is printed about before
	  defaults file is read so that a bad defaults file won't suppress it.
	* added a DROP_CORE define to config.h.  This specifies whether or not
	  crash_MudOS tries to drop core files via the abort() call (otherwise
	  it just does an exit(-2).  The driver tries to put cores in the
	  root dir of the mudlib (${MUDLIB})or in ${MUDLIB}/cores if it exists.
	* changed SIGINT and SIGTERM so that they are always trapped (and call
	  crash_MudOS) since these signals are always externally (user) generated.
	* replaced a couple of gratuitous goto's in interpret.c with a while (1)
	  construct.
	* changed "Setting up IPC" message to include port number.
	* moved config.h include before lint.h include in several places in
	  order to get the INLINE definition (I removed the INLINE def from
	  lint.h since it was already in config.h where it should be).
	* changed definition of INLINE in config.h so that it is defined to
	  nothing if __STRICT_ANSI__ is defined (-ansi option of gcc doesn't
	  support the "inline" keyword).
	* moved #defines for USE_POSIX_SIGNALS into config.h instead of lint.h
	  (left the prototypes in lint.h though).
	* added an additional efun called nullp() to supplement undefinedp().
	  nullp() returns true for uninitialized variables and destructed
	  objects.  undefinedp() returns true for 1) call_others to non-existent
	  methods, 2) accesses to map keys that don't exist in the map, and
	  3) arguments in the formal parameter list of a method for which values
	  were not passed (i.e. didn't call a call_other with enough arguments).
	  The nullp() efun was added so that undefinedp(map[key]) would only
	  return true when key is not in the map and not also when map[key]
	  happens to point to an object that has been destructed.  The undefinedp()
	  efun was originally added so that zero wouldn't be overloaded.  nullp()
	  has been added so that undefinedp() isn't overloaded.
	* changed dumpstat so that it shows SWAPPED(in) if the object was once
	  swapped out but is currently swapped in (displayed by dumpallobj()).
	* fixed crash_MudOS once again.  This time if command_giver and/or
	  current_object aren't defined we push_undefined() rather than the
	  null pointer (was causing crashes to hang).
	* added a SYSV_HEARTBEAT_INTERVAL #define to config.h (this is derived
	  from the value of HEARTBEAT_INTERVAL and should not be changed).  Read
	  the comments for HEARTBEAT_INTERVAL in options.h for more information.

Wed Sep  9 08:03:15 PDT 1992 (Cynosure (demon@sequent.com))
	* bumped the patchlevel up to 0.8.65
	* Added support for Sequent DYNIX/ptx (System V Release 3)
	* Makefile: uses $(INSTALL) to install executables in $(INSTALL_DIR)
	* Makefile: added EXTRALIBS for DYNIX/ptx
	* Makefile: addr_server now loads port.c (be careful)
	* lint.h: added USE_POSIX_SIGNALS.  Perhaps this is a misnomers.  What
	  it does is allow the BSD signal functions to be re-#defined into
	  port_ function name, so that they can be emulated in port.c.
	* lint.h: added all kinds of _SEQUENT_ #ifdefs
	* options.h: added USE_POSIX_SIGNALS option (and a comment)
	* addr_server.c: cleaned up signal() return value stuff
	* addr_server.c: block_signal_mask is now initialized at run-time so
	  that sigmask() can be emulated with a function instead of a macro
	* alloca.c: now includes lint.h
	* array.c: added casts for ANSI compatibility
	* backend.c: System V systems don't support usec time.  Therefore,
	  HEARTBEAT_INTERVAL is rounded to the nearest sec and alarm() is
	  used instead.
	* backend.c: moved heart_beat_flag = 0 above the call to [u]alarm()
	  This should close a pathalogical race condition where the alarm
	  fired before heart_beat_flag was initialized.
	* comm.c: cleaned up signal() return value stuff
	* dumpstat.c: added casts for ANSI compatibility
	* eoperators.c: made off_tab an unsigned short array instead of
	  short.
	* eoperators.c: added casts for ANSI compatibility
	* file.c: added _SEQUENT_ #ifdefs
	* interpret.c: added casts for ANSI compatibility
	* lex.c: converted a very strange while loop into an if *shrug*
	* mapping.c: added casts for ANSI compatibility
	* object.c: added casts for ANSI compatibility
	* parse.c: converted a very strange for loop into an if *sigh*
	* port.c: added POSIX emulation of BSD signals
	* simul_efun.c: added cast for ANSI compatibility
	* simululate.c: added casts for ANSI compatibility
	* simululate.c: added _SEQUENT_ #ifdefs
	* socket_ctrl.c: DYNIX/ptx does not support FIONBIO.  Instead it
	  supports the POSIX non-blocking functionality.

Fri Sep  4 02:43:20 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.64
	* changed mapping_each in mapping.c so that each() starts over at
	  the beginning of the map if it is called by a different object
	  than the one that called it the time before.
	* changed safe_apply() in interpret.c so that it saves the value
	  of command_giver before the apply and restores it afterwards.
	  Apparently the error() function zeroes it out.  This solves the
	  problem of ed crashing when its exit_fn contains a runtime error.
	* tweaked the amounts by which eval_cost is incremented in
	  f_add and f_add_eq so that endless loops involving these
	  instructions max_eval out in a reasonable time.

Thu Sep  3 16:20:58 1992  Erik Kay  (erikkay at milo.mit.edu)

	* bumped the patchlevel up to 0.8.63

	* removed smalloc from the driver completely.

	* added an optional argument to the shutdown() efun.  It takes an
	int that will be the exit code for the driver when it shuts down.
	This is useful for startup scripts where you could tell the driver
	to shutdown and come back up, or to shutdown and stay down until
	explicitly restarted.  ****NOTE**** for future driver
	modifications, the exit code of -1 is to signify that the driver
	is exiting in such a way that it does not want to be restarted
	again automatically.  This exit code is generated by functions
	that have determined that the mud would simply crash again if it
	were brought up and no changes were made to the environment (such
	as an error in the runtime config file.  all errors in rc.c cause
	the driver to exit with a -1 code)  An exit code of 0 should only
	be used to indicate that the driver was manually shutdown without
	error and doesn't mind being restarted automatically.  ALL OTHER
	EXIT CODES SHOULD INIDICATE AN INTERNAL ERROR OF SOME SORT.  This
	means that the driver got confused and just needs to restart
	itself.

	* removed the PARSE_COMMAND #define from options.h since we have a
	less buggy version now.

	* removed the sync mode #define's from options.h since we decided
	not to use sync mode after all.

	* merged Pinkfish's bug fixes to parse.c into the driver

Thu Sep  3 04:50:46 CDT 1992 (Jacques@TMI)

	* bumped the patchlevel up to 0.8.62
	* made major changes and optimisations to the comm code and
	  backend loop.

Wed Sep  2 19:49:09 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.61
	* cleaned up the comments in options.h some.
	* changed INLINE so that it isn't defined for HPs.  Blackthorn said
	  those inline's in the HP/UX *.h files turned out to be for C++.

Wed Sep  2 12:21:58 1992  Erik Kay  (erikkay at milo.mit.edu)

	* bumped the patchlevel up to 0.8.60

	* made a fix for blackthorn so that when catch_tell is shadowed,
	and someone is being snooped, the snooper still gets the info.

	* added a better model for switching back to async mode.  I made
	it based on real time without data rather than number of loops
	without data.  The current cutoff is that if there is no new data
	on the port for 2 seconds, then it switches back to async mode.
	I'm not convinced that this is the best idea in the world either,
	but it seems more consistant than the previous method.

	* made the INLINE defined always on hp machines in lint.h since it
	appears to be recognized by the native compiler

	* made remove_destructed_objects INLINE since it's called once per
	loop.

	* documented the #define options that I added in 0.8.57

	* fixed the call to f_cache_stats from verbose mud_status.

Wed Sep  2 05:14:27 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.59
	* fixed the decrementing of new_user_pending so that it doesn't go
	  negative (and prevent pause() from ever being called).

Wed Sep  2 03:48:43 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.58
	* changed backend.c so that doesn't pause() if new_user_pending and
	  it checks for new_users in a different part of the backend loop.
	* changed backend.c to check !sigio_pending before doing pause().
	* changed hname_handler in comm.c back to the way it was in 0.8.53.
	  apparently the multiple requests per read was getting into an
	  infinite loop.  We no longer have to worry about malloc's called
	  from inside sigio_handler since that handler now simply sets a flag.

Wed Sep  2 00:21:58 1992  Erik Kay  (erikkay at milo.mit.edu)

	* bumped the patchlevel up to 0.8.57

	* fixed a bug blackthorn discovered in exec where a connection was
	being dropped in the middle of the exec and the interactive object
	was being used without being checked.  It also turns out that bug
	also exists in several other areas.  The problem is that
	flush_message() can wind up calling remove_interactive.  Several
	functions that called flush_message() were dealing with the
	interactive object without checking it to see if it was still valid.

	* made synchronous mode an option so that users of shared systems
	can chose to be kinder to their neighbors and not try to suck up
	all available cpu.

	* fixed a synchronous mode bug that prevented it from moving back
	to asynchronous mode.

	* added statistics on the io mode.  these were added to the
	verbose mode of the mud_status efun.  (added function cache info
	to the verbose mud_status as well)  Also created a separate efun
	for just getting the io mode info: io_mode_stats().

Tue Sep  1 22:52:08 1992  Erik Kay  (erikkay at milo.mit.edu)

	* changed the following functions to use safe_apply rather than
	apply: net death notification, ed's exit function.  It might be
	wise to add it to process_input, quit, write_prompt, and maybe
	others. 

	* added a configurable option which allows objects to
	automatically set their euid to their uid upon creation.  We
	talked about this at one point, but never really decided anything
	about it.  I still maintain that anything that would have a
	security risk by this behavior, would have the risk without it as
	well.  However, I made it a #define: AUTO_SETEUID, which is
	#undef'd by default, so that security conscious people don't have
	to worry.

	* added Blackthorne's suggestion that we make a #define option to
	decide whether objects with the backbone uid are automatically
	trusted.  Currently the default is that they are trusted, but I
	added a #define to options.h: AUTO_TRUST_BACKBONE which you can
	#undef if you want the new behavior.

	* added safe_apply, which is a "safe" version of apply.  It is
	meant for the driver<->mudlib dependencies other than the master
	object, so that if the apply errors out, the driver doesn't lose.

Tue Sep  1 20:36:06 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.56
	* changed comm.c and backend.c so that if the driver is getting pounded
	  with sigio's then it goes into synchronous mode and ignores SIGIO.
	  The SIGIO_THRESHHOLD macro in config.h specifies what constitutes
	  pounding.  If the backend makes it through an iteration without
	  receiving any new events, then the driver goes back into asynchronous
	  mode.  This change should make muds like Genocide (ones that have 60
	  players most using macros like crazy) run faster.
	* changed comm.c and backend.c so that new users are no longer handled
	  via the event queue.  Instead a new_user_pending counter is used.
	  This change is to prevent a malicious person from flooding the
	  event queue with NEW_USER events.

Tue Sep  1 03:10:33 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.55
	* changed ref_string and free_string so that they don't check to
	  make sure the passed string is shared unless DEBUG is defined.
	  This is a possible source of memory scribbling if in fact these
	  two functions are ever called with a non-shared string (haven't seen
	  it happen in any of the Genocide test runs).  This change was made
	  for efficiency reasons.  If you suspect that you are crashing because
	  of a memory scribble here, then run with DEBUG defined for a while
	  to make sure.
	* removed check_for_destr() calls in POINTER case of f_add_eq since
	  they weren't being done in the same case of f_add() and didn't seem
	  necessary there (check_for_destr is called by all efuns that take
	  vector args anyway).
	* changed f_add() and f_add_eq() so that eval_cost is incremented
	  appropriate to the cost of the operation (in terms of cpu).  This
	  is to prevent things like: while (1) { arr += ({"xyz"}); }
	  from hanging the driver.
	* changed keys() and values() to bump eval_cost as well.  Really should
	  do a real profile of the driver and adjust eval_cost in all of the
	  efuns according to the percentage of time spent in that function
	  (as shown by the profile).
	
Mon Aug 31 03:45:02 CDT 1992 (Jacques@TMI)
	* bumped patchlevel up to 0.8.54
	* added a flag in the interactive struct and functionality in comm.c
	  so that only one USER event per user can be on queue at once.
	* added flag to lpc_sock struct and functionality in socket_efuns.c
	  and comm.c so that only one EFUN_SOCK event per efun socket can be on
	  queue at once.
	* added queue_max variable to comm.c -- this is high water mark for
	  queue length.
	* fixed bug in which input_to in a destructed object crashed the
	  driver.
	* added flag (ipd_event_on_queue) to comm.c so that only one IP_DAEMON
	  event is on queue at a time. changed hname_handler() so it can
	  handle multiple replies per packet.
	* fixed bug in which calls to socket efuns with invalid fds would
	  crash driver (depending on definition of valid_socket).
	* made some high profile functions INLINE. {process_queue(),
	  handle_top_event(), dequeue_top_event(), enqueue_event(),
	  pop_queue_element(), push_queue_element()}

Sun Aug 30 16:44:01 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.53
	* fixed a place in comm.c where it was calling process_input even
	  when it knew that process_input wasn't in the player object.
	* fixed comm.c so that it does the right thing when process_input
	  isn't in the player object (it was eating player input and not
	  digesting it)
	* fixed a bug in f_get_dir() that was causing it report incorrect
	  filesizes when stat(path, -1) was used.
	* changed ref_string in stralloc.c so that it checks to make sure it
	  was called with a shared_string (unless BUGFREE is defined).
	* optimized a couple of places in which an object is searched for
	  a given function (apply_low in interpret.c and function_exists in
	  interpret.c.  The idea for this optimization comes from the
	  lp-strcmpoptim file on alcazar (someone should put the author's name
	  in that file).  The optimization depends on the fact that all
	  LPC function names are stored in the shared string table.

Wed Aug 26 22:57:46 CDT 1992 (Jacques@TMI)
	* bumped patchlevel up to 0.8.52
	* fixed a flag bug in main.c (bug from cynosure at TMI)
	* fixed a type check error bug with array element multiplication.
	  fix was in postlang.y (bug from Sunnywiz@VH)
	* undid the string ref size change (below), but put in a check in
	  make_shared_string() so that refs won't overflow.
	* changed free_string() so that checks for freeing nonshared strings
	  are done always, unless BUGFREE is defined.

Mon Aug 24 18:42:40 CDT 1992 (Jacques@TMI)
	* bumped patchlevel up to 0.8.51
	* further improved heartbeat processing, mainly by modifying backend
	  loop some more.
	* changed string ref size in stralloc.h from a short to a long.
	  this was to test a theory that a string reference overflow was
	  crashing the driver with a "string ref negative" error. this theory
	  appears to be correct.
	* added a define to options.h: OLD_HB_BEHAVIOR -- when this is defined
	  heartbeats will not be called when there are no users logged in.
	  this is defined by default.

Sun Aug 23 20:38:10 CDT 1992 (Jacques@TMI)
	* bumped patchlevel up to 0.8.50
	* minor change to snoop printout (took out a \n because people
	  complained).
	* added heart_beat_flag so that heartbeat processing (hopefully)
	  cannot dominate CPU.

Fri Aug 21 21:08:29 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.49
	* reset SIGABRT to SIG_DFL before calling abort() in crash_MudOS
	  to prevent possibility of endless looping there.

Fri Aug 21 19:53:58 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.48
	* fixed error with net_dead code in comm.c (reversed order of first two
	  args of the memcpy following the net_dead apply).
	* fixed lex.c to handle '\n', '\t', etc. correctly (it wasn't).  Fix
	  from Wing@TMI (it was making '\n' be 'n' etc).

Thu Aug 20 21:16:45 1992  Erik Kay  (erikkay at milo.mit.edu)

	* bumped patchlevel up to 0.8.47

	* COMPAT BUSTER. changed slow_shutdown to call slow_shutdown in
	master.c rather than calling "shut" in /obj/shut.c.  Make
	slow_shutdown return anything but 0 if you want to handle the
	shutdown in a delayed fashion rather than just having the driver
	shutdown immediately.

	* COMPAT BUSTER. removed the functionality from say that dealt
	with passing it an array of strings.  This wasn't fully
	functional, and we weren't interested in getting it to work.

Wed Aug 19 14:57:44 1992  Erik Kay  (erikkay at milo.mit.edu)

	* COMPAT BUSTER. removed the transfer efun from the driver.  It
	was disabled before anyway, now it just doesn't exist.

	* COMPAT BUSTER - removed the global define of LPCA.  It is now
	MUDOS. (so that you can add #ifdef MUDOS in your lpc code if
	you're really that anal :-)

	* removed all references to LPCA from the comments

Tue Aug 18 22:05:08 CDT 1992 (Jacques@TMI)
	* bumped the patchlevel up to 0.8.46
	* fixed a bug in comm.c where the interactive input buffer could be
	  overflowed when a user pasted large amounts of data to the driver.
	* fixed a bug in comm.c where the interactive output buffer could be
	  overflowed under certain circumstances.

Tue Aug 18 20:34:25 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.45
	* crash_MudOS now tries to chdir to MUD_LIB/cores and then abort()'s
	  (chdir's to MUD_LIB if MUD_LIB/cores doesn't exist).  Hopefully
	  this change will make it easier to find core files :).
	* changed main.c to trap SIGTERM and call crash_MudOS
	* replaced setjmp with SETJMP and longjmp with LONGJMP so that
	  it will be easy to redefine whether we use _setjmp or setjmp etc.
	* removed time_to_call_heartbeat flag since it was not being used
	* gamedriver now calls crash(crash_string, command_giver, current_object)
	  in master.c at crashes (if DEBUG not defined).  the only change is
	  in the arguments passed to crash().
	* scrapped all changes in 8.43 and 8.44
	* fixed the backspace \0 buffer size thing again (in the right way)

Tue Aug 18 00:13:21 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.44
	* don't include unistd.h in addr_server for hpux
	* changed %f to %lf in f_cache_stats
	* moved heartbeat_pending check out of loop
	* changed the way ualarm was being called so that call_heart_beat doesn't
	  need to reset it.

Mon Aug 17 21:24:37 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.43
	* heartbeat is getting lost on the HP because it doesn't buffer a sigalrm
	  when sigalrm is blocked.  Solution for now is to move heartbeats out
	  of the event queue and treat as a heartbeat_pending counter.
	* removed time_to_call_heartbeat flag since it was not being used
	* gamedriver now calls crash(crash_string, command_giver, current_object)
	  in master.c at crashes (if DEBUG not defined).  the only change is
	  in the arguments passed to crash()

Sun Aug 16 16:30:55 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.42
	* added CACHE_STATS macro to options.h.  This lets you decide whether or
	  not to keep stats on apply_low (call_other).  These stats are
	  accessible via the cache_stats() efun (which isn't compiled into
	  the driver unless CACHE_STATS is defined).
	* changed interpret.c so that if a function is call_other'd with less
	  than the correct number of arugments then the extra args are set to
	  be undefined rather than 0 (undefined behaves like zero except that
	  it returns true to undefinedp()).
	* fixed explode_string() so that it doesn't try to make an array
	  bigger than max array size.
	* fixed comm.c so that buf in user_command_handler is of size
	  MAX_TEXT * 3 (needed because of the \0 backspace thing)
	* added more stats collecting code to apply_low (for call_other)
	* (note: 0.8.41 was built by Jacques but I couldn't find it uploaded
	  anywhere so I made the changes that he said were going to be in it.
	  may have to integrate others in later if he in fact made other changes).

Sat Aug 15 18:41:43 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.40
	* fixed some more of those damned implicit definition errors that
	  keep creeping in (-Wall).
	* fixed a lot of places that were including lint.h before config.h
	* added APPLY_CACHE_BITS to the options.h file.  You can use this
	  to specify the size of the call_other(apply_low) cache.  The
	  value used prior to parameterizing the size was 6 bits.  6 bits
	  gives a cache with 64 entries (2^6).  10 bits gives 1024 entries.
	  Somewhere in between is probably sufficient.  The benefit to having
	  a larger cache is that you will likely get a higher cache hit rate.
	  Cache hits require only a cache table lookup to do the call_other.
	  Cache misses require a linear search of the list of functions in the
	  object.
	* COMPAT BUSTER!: changed main.c so that crash is called with two
	  arguments (string telling what kind of crash, and the current_object
	  at the time of the crash)

Sat Aug 15 01:14:27 1992  Erik Kay  (erikkay at milo.mit.edu)

	* bumped the patchlevel up to 0.8.39

	* hmm... I did something for which I'm sure I'm going to regret.
	I changed the behavior of load_object().  Basically the old
	behavior never called create() or reset on 'inherited' objects.
	However, if someone inherits from an object that is actually used,
	(a room for example), create is never called in that room if the
	object that inherits it is loaded first. This seems to me that it
	was an efficiency hack to prevent periodic calling of reset() in
	large numbers of building block objects, and nothing more.
	Realistically, reset shouldn't exist in building blocks very often
	anyway.  On this basis, I change the behavior so that inherited
	objects have create(), etc called on them when first loaded.

	* COMPAT BUSTER! removed all references to global verbs and global
	preverbs from the driver.

	* COMPAT BUSTER! changed set_hide to call valid_hide(object
	target) in the master object rather than depending on priv
	objects. 

	* COMPAT BUSTER! removed everything to do with priveleged objects
	from the driver.  This includes the efuns set_priv and privp.

Fri Aug 14 20:16:34 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.38
	* added malloc hiwater water mark to debug malloc stats
	* fixed opcdump() so that it doesn't write an empty file when arg == 0
	* cleaned up explode_string some... slightly more efficient
	* moved calculation of hiwater into md.c (from debugmalloc.c)
	* made dumpallobj(), opcprof(), and debugmalloc() take string argument
	  specifying files to dump to (defaults as usual) (except for
	  debugmalloc which requires string and int (filename and mask)).
	* removed call to opcdump() that occurred at shutdown since its now
	  an efun (opcprof()).
	* fixed a couple of error messages in save_object and restore_object
	* added DEBUGMALLOC_EXTENSIONS macro to options.h (and #ifdef'd various
	  parts of the source with it).
	* changed legal_path to disallow filenames with '#' in them
	* split the ChangeLog in two! (0.8.14 and before now in ChangeLog.0).
	* malloc_mask can be manually set in md.c
	* added efun cache_stats that reports on the call_other cache hit rate
	  (maybe this should return a 2 element vector so that some object
	  could easily monitor the cache hit rate).
	* added code to make_malloc.c that prints out which malloc is being used
	* removed addr field from debugmalloc struct (malloc the struct and
	  the requested memory as one chunk now).

Thu Aug 13 21:14:58 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.37
	* enhanced the debugmalloc stuff that Jacques patched in for me in 0.8.36.
	  To use it, simply define DEBUGMALLOC in options.h.  Debugmalloc
	  imposes some hefty overheads and really should only be used when
	  trying to find memory leaks or otherwise debug problems in which you
	  suspect involve mismanagement of malloc'd memory.  To use debugmalloc,
	  use DMALLOC(int size, int tag, char *desc) instead of MALLOC(size).
	  When DEBUGMALLOC is not defined, DMALLOC(size, tag, desc) will compile
	  as if it were MALLOC(size).  DXALLOC is also allowed.  Note: debugmalloc
	  allows malloc_stats to specify exactly how much memory has
	  been malloc'd.
	* added the debugmalloc(int mask) efun which dumps information on blocks
	  of memory that were allocated with a tag that shares a bit with the
	  mask passed to debugmalloc().  The information is written to a file
	  named MALLOC_DUMP (in the mudlib root dir).
	* moved the ualarm, str, and alloca stuff out of config.h
	  (too much of a pain to recompile when only a relink is necessary)
	* changed all xalloc()'s to XALLOC()'s. (to support the debugmalloc
	  stuff).
	* added two optional efuns: set_debug_level(int) and set_malloc_mask(x).
	  The former is compiled in if -DDEBUG_MACRO is used in the makefile.
	  The latter is used if DEBUGMALLOC is defined in options.h.  The
	  former allows you to set debug_level from inside the mud.  This
	  controls which of the debug() calls in the driver cause debug messages
	  to be printed.  The latter lets you set malloc_mask from inside the mud
	  (controls what memory blocks get dumped when you call debugmalloc()).
	* changed call_out.c so that the name of call_out functions is
	  made a shared string.
	* added efun opcprof() which dumps efun call counts to EOPER_DUMP and
	  EFUN_DUMP.

Thu Aug 13 00:50:21 CDT 1992 (Jacques@TMI)
	* bumped the patchlevel up to 0.8.36
	* made some changes to comm.c so that:
		if the address server dies, driver stops looking for it.
		remove_interactive() no longer sometimes calls flush_message()
		some errors should be handled a little better.
	* added in Truilkan's patches for debugmalloc.

Mon Aug 10 23:35:24 CDT 1992 (Jacques@TMI)
	* bumped the patchlevel up to 0.8.35
	* made some #ifdef changes so that compilation on an hpux machine
	  should go more smoothly.
	* made HEARTBEAT_INTERVAL a define in options.h -- default is now
	  2000000. Note that this number is in microseconds.
	* changed addr_server so that it should now handle multiple requests
	  per packet. This addresses the problem of many people logging in
	  simultaneously not having their ip numbers resolved to names.
	* removed remove_interactive() call from sigio_handler().
	  put a remove_interactive() call into flush_message().

Sun Aug  9 20:00:11 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.34
	* changed so that alloca.c and str.c are always compiled (the code is
	  included or not based on choices in options.h)
	* renamed comm1.c to comm.c (is no more comm2.c anyway)
	* added init_comm to comm.c to initialize the event stack (in an
	  attempt to prevent simultaneous mallocs if they were in fact
	  somehow happening)

Sat Aug  8 21:18:04 CDT 1992 (Jacques@TMI)
	* bumped the patchlevel up to 0.8.33
	* COMPAT BUSTER - valid_destruct() in master.c has changed.
	  old way: int valid_destruct(string eff_user,object ob);
	  new way: int valid_destruct(object destructor,object destructee);
	* removed euid check from socket efun code in efunctions.c since
	  valid_socket() can do this.
	* removed if !defined(ultrix) ualarm() stuff from backend.c since
	  ualarm source is now included with the driver.
	* added EXTRALIBS line for RS/6000 in Makefile.
	* added OSFLAGS line for RS/6000 in Makefile.
	* cleaned up addr_server.c some -- should make it more robust.
	* changed init_addr_server() in comm1.c so that it doesn't think
	  address server is connected when it really isn't.
	* Note: MAX_USERS *is* used in the driver.

Sat Aug  8 20:15:33 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.32
	* fixed GNUmakefile so that malloc.c is compiled to malloc.o like it
	  should be (and not to make_malloc.o)
	* in comm1.c removed char *index(); from allow_host_access (causes NeXT
	  to not be able to compile for certain config.h setups).
	* made a new source module socket_ctrl.c that isolates the code which
	  makes changes to the mode of sockets.
	* changed comm1.c, socket_efuns.c, and addr_server.c to call the
	  functions in socket_ctrl.c.

Sat Aug  8 15:56:08 CDT 1992 (Truilkan@TMI)
	* bumped the patchlevel up to 0.8.31
	* changed the remaining free()'s in eoperators.c to FREE()'s
	* added #include "options.h" to ualarm.c to get MISSING_UALARM def.
	* changed a realloc in rc.c to REALLOC (these things are insidious :)
	* changed a malloc in rc.c to MALLOC
	* changed rc.c so that the unused config entries are optional in the
	  config file (just changed the last arg of 1 to be 0 in a few places)
	* changed FNDELAY to O_NDELAY in the remaining places it existed.
	* fixed debug message in free_string() in stralloc.c to print the
	  value of the offending string.

Sat Aug  8 04:59:01 1992  Erik Kay  (erikkay at milo.mit.edu)
	* bumped the patchlevel up to 0.8.30
	* COMPAT BUSTER - the runtime config file variable max players is
	now max users. (still makes no difference since it isn't used by
	the driver)
	* in the version name, changed it from MudOS driver 0.8.29 to
	Mudos 0.8.29.
	* added, and then removed code that enabled the last 4 runtime
	config variables.  This caused the driver to become totally flakey
	for no good reason, and we couldn't figure it out. (You're welcome
	to try)
	* fixed a bunch of references to free and realloc to FREE and
	REALLOC. 
	* removed two extraneous lines from the runtime config file (they
	weren't being used: global include file and max cmds per beat)

Sat Aug  8 01:57:59 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.29
	* removed the char *CALLOC() in comm1.c (it shouldn't have been there)
	* added ualarm.c for machines that don't have ualarm()
	  (#define MISSING_UALARM in config.h)
	* changed FNDELAY to O_NDELAY in comm1.c (FNDELAY is obsolete)
	* changed all occurrences of "player" in source to "user".  mostly
	  semantic reasons.  driver has progressed to the point where its
	  useful for much more than games (of course maybe life is a game).
	* changed all occurances of "game" in source to "MudOS"

Fri Aug  7 21:25:30 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.28
	* split out part of config.h into options.h (the part that contains the
	  the macros that may need changed).
	* removed clilib.c from the distribution since Jacques already removed
	  the mudwho stuff from comm1.c anyway.  Mudwho can probably be better
	  handled at the mudlib level using the socket efuns.
	* removed the describe efun which was doing nothing at all
	* removed the cindent() efun since we don't even include the indent
	  executable anymore anyway.
	* changed svalue_to_int in mapping.c to handle mappings as well
	* made parse_command() and ed() #ifdef'd (so they are now optional)
	* removed s from the block_t struct in stralloc.c since it was
	  taking up 4 bytes that weren't really needed.
	* refixed the #ifdef VALID_CLONE sections in simulate.c (I botched
	  the application of wayfarer's last patches).
	* added T_MAPPING to def of T_ANY in interpret.h

Thu Aug  6 17:41:48 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.27
	* fixed bug in save_dstats_file (wasn't malloc'ing enough space)
	* made free_svalue INLINE
	* added a fix to simulate.c:player_parser()... another check to see if
	  command_giver == 0 (crasher shows up if a wiz does a call_other on a
	  function in an object that does a disable_commands -- Positron's code
	  exposed this bug -- I imagine this same bug is in other drivers as 
	  well).

Thu Aug  6 00:47:07 CDT 1992 (Jacques@TMI)
	* bumped patchlevel up to 0.8.26
	* Fixed comm1.c so that it no longer confuses MallocDebug into
	  thinking that there is a memory leak.
	* applied the same MallocDebug fix to addr_server.c
	* fixed addr_server_init() in comm1.c so that it no longer aborts
	  the address server connection if the connection is not immediate.

Wed Aug  5 22:56:44 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.25
	* changed stralloc.c some more to avoid extraneous calls to
	  stralloc.c:findblock() and strlen().
	* changed assign_svalue_no_free so that it calls ref_string
	  instead of make_shared_string when it already knows the string
	  is shared (this change and the stralloc.c changes come at the
	  suggestion of Amylaar).
	* changed *lang.y so that it resets switches and switch_sptr to 0
	  at each new compile (in case previous compile failed).
	* added for_expr to the <type> line in *lang.y (rids us of another
	  warning).
	* added 'maximum string length' to config file.  this value is
	  consulted at all string assignments.  This should help avoid
	  needing excessive cpu time to reach a max_eval.

Wed Aug  5 21:15:52 CDT 1992 (Jacques(TMI))
	* bumped patchlevel up to 0.8.24
	* changed stralloc.c to not use so damned many strlen() calls.
	  should noticeably boost performance (boost comes at a small cost in
	  memory per shared string). -- Tru
	* implemented an address server (addr_server.c) to replace hname.c
	  This server can be run on a different machine from the driver and
	  can accommodate multiple drivers simultaneously. NOTE that the
	  addr_server program must already be running when the driver starts
	  up so that the driver can connect to it.
		usage: addr_server port_number
	* added two (2) new config file entries for the address server:
		address server ip : comet.rice.edu
		address server port : 4445
	  note that at the present time, address server ip MUST be the 
	  symbolic name form.

Wed Aug  5 05:10:02 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.23
	* fixed the switch/continue bug.  "continue" from inside a "switch"
	  caused the driver to crash because the continue was preventing
	  the "break_sp" stack from being popped.  Solution was to add
	  another eoperator (F_POP_BREAK) and another stack (switch_stack)
	  to *lang.y.  "continue" statements issued from inside a "switch"
	  now generate the code required to pop the "break_sp" stack as
	  many times as exist nested "switch" statements (since the beginning
	  of the nearest containing loop).
	* changed a malloc() in comm1.c to MALLOC()

Tue Aug  4 17:23:30 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.22
	* fixed various warnings that show up when -Wall flag of gcc is used
          (down to five (5) warnings when using -Wall)
	* fixed a bug in svalue_size that I introduced in 0.8.21 that
	  caused dumpallobj to crash the driver.

Mon Aug  3 21:23:48 CDT 1992 (Truilkan@TMI)
	* bumped patchlevel up to 0.8.21
	* changed rusage() efun (f_rusage) so that it returns more readable
	  information.  It now returns a mapping containing all the 
	  fields from the structure that getrusage() returns.  This one is
	  for Dainia@DreamShadow.  Usage: m = rusage();
	  write("usertime: " + m["usertime"] + "\n"); etc.
	* didn't fix anything in message() *smirkle*
	* added malloc_status efun, replaces hardcoded 'malloc' command
	* added malloc_debug efun, replaces hardcoded 'mallocdebug' command
	  (only available when SMALLOC is defined in config.h)
	* added mud_status efun, replaces 'status' and 'status tables' commands
	* fixed a bug in allocate_mapping that was potentially setting the
	  hashing mask (theMask) incorrectly.
	* fixed the code that gathers statistics on total mapping size
	* oops! I still had some debug code in that was preventing any
	  of the mappings from being freed (this code was introduced after
	  0.8.14 -- i.e. it wasn't in 0.8.14)
	* fixed svalue_size to handle mappings so that dumpallobj now
	  takes mappings into account when reporting data_size.

Mon Aug  3 15:01:21 1992  Erik Kay  (Wayfarer@Portals)

	* bumped patchlevel up to 0.8.20

Mon Aug  3 14:16:57 1992  Erik Kay  (Wayfarer@Portals)

	* made clone_object and load_object do a check_valid_path only if
	VALID_CLONE is defined. (it's defined by default now in config.h)

	* fixed another bug in message() so that it deals with string args
	without crashing.

Mon Aug 3 14:13:42 1992  Erik Kay  (Wayfarer@Portals)

	* COMPAT BUSTER made clone_object and load_object do a
	check_valid_path for read permissions.  Don't want people cloning 
	objects they can't read! (I did this at the request of some users,
	but I think it's going	to introduce some bugs in the euid system.
	For example, let's say I'm a level 1 player, and I move into a
	room which hasn't been loaded.  I think under the current model,
	this object is loaded as the current player, and unless the mudlib
	has security set up so that players can "read" any file they might
	inadvertantly clone, errors will result.  This will cause compat
	problems with existing mudlibs.  You can turn this off by
	undefining VALID_CLONE in config.h.

Mon Aug 3 14:12:46 1992  Erik Kay  (Wayfarer@Portals)

	* I fixed several bugs in message which caused the driver to dump.
	(we were dereferencing some null pointers... ack)  It's amazing
	the bugs you'll find in a efun as soon as you start to *use* it!
	Btw... one other point of note.  When converting a mudlib to use
	message for all of it's message display functions (write, shout,
	etc), it's a *very* good idea to nuke INTERACTIVE_CATCH_TELL,
	since you need to do a tell_object in receive_message(), and going
	through yet another level of indirection is both wasteful and
	*completely* unnecessary. (and confusing!).  Oops... one other
	thing to note with converting completely to using message(): if
	you ever use a different object other than the user object for
	interactive connections (such as a login object or a player
	registration object), make sure that all of these have
	receive_message() defined, or you might get some unusual results.

Mon Aug  3 14:10:11 1992 Truilkan@TMI

	* Bumped the patchlevel number to 0.8.19

	* Changed f_socket_acquire to call socket_acquire and
	f_socket_release to call socket_release (as per Jacques'
	instructions).

Sun Aug  2 22:21:27 CDT 1992  Truilkan@TMI Jacques@TMI Wayfarer@TMI
	* bumped the patchlevel number to 0.8.18 (alpha)
	* applied fix to -= operator (Truilkan)
	* added capability to move a socket from one object to another.
	  This entailed adding two new efuns; socket_release() and
	  socket_acquire().
	* changed socket efuns so that returning 0 doesn't indicate an error.
	* made socket_errors.h file that has #defines of errors and values.
	* changed valid_socket():
	  old way:
		int valid_socket(string eff_user, string fun, string address,
		                 string port)
	  new way:
		int valid_socket(ob calling_ob, string func, mixed *info)
		where info is a 4 element array:
			mixed info[4] :
			info[0] = int fd
			info[1] = object owner
			info[2] = string ip_addr
			info[3] = int port
	* cleaned up usage of flush_all_player_mess().
	* added some defines etc. so that MudOS now compiled on Ultrix.
	* fixed a bug that crept in when add_message() was rewritten. This
	  bug caused VAX/VMS users to not get CR's.
	* added an efun: string socket_error(int error_num). This returns a
	  string version of the socket error.

Thu Jul 23 00:59:40 CDT 1992  Truilkan@TMI Jacques@TMI
        * bumped the patchlevel number to 0.8.17 (alpha)
	* added in major changes to the driver: comm1.c was almost entirely
	  rewritten (again), including add_message() which is now varargs.
	  The driver now implements an event queue -- this is a major change
	  to the way the driver handles events/interrupts. This should/does
	  also fix the infamous "connection bug" in which the driver stopped
	  listening for new connections after a variable length of time.
	* added in the proper include files for compiling efunctions.c and
	  eoperators.c on a sun.
	* changed value of NUM_INTS in rc.c to 23, since another configuration
	  int has been added by Truilkan.
	* fixed a bug with snooping cased by the comm1.c rewrite.
	* fixed the f_catch() bug (major bug) which caused the driver to
	  crash when:
		1) an object containing undeclared variables was loaded.
		2) catch() was used (as in goto cmd in TMI mudlib).
	  This was found/fixed by Truilkan.

Tue Jul 21 01:50:08 CDT 1992  Truilkan@TMI
	* changed the preload call back to where it was (this was the source
	  of the famous "big bug" that caused crashes when updating files
	  with errors (from within other files).  Wayfarer found this.
	  (and boy did *I* feel stupid afterwards! - wayfarer :-)
	* fixed f_message so it pops stack correctly even when it doesn't
	  do the freeavoid (wayfarer found it)

Sun Jul 19 17:22:21 CDT 1992  Truilkan@TMI
	* COMPATIBILITY BUSTER. added a new config file parameter
	  MAX_MAPPING_SIZE.  This was needed in order to prevent someone
	  from bringing the driver to its knees (via excessive use of memory)
	  by repeatedly adding elements to a mapping (say by adding 1,000
	  elements at each heartbeat).  You will need to add this parameter
	  to your mud's config file.  A good rule of thumb is to set this
	  value to be approximately the same as the MAX_ARRAY_SIZE.
	* cleaned up lots of stuff so that it mainly compiles without warnings
	  even with gcc's -Wall option (mostly adding prototypes for efunctions.c).
	* completely rewrote the implementation of the data structure used to
	  store mappings.  It now uses an extensible hash table instead of
	  a binary tree.  This makes deletes more robust.  It should also
	  improve performance since the recursive functions to handle
	  traversing the data structure went away with the change.
	* added values() to supplement keys().  values() returns an array of
	  values that correspond to the indices returned by keys().
	* added each() to traverse a mapping - it returns ({key, value}) a pair
	  at a time.  Returns the null_vector when at end of map.
	* changed lots of code that returned allocate_array(0) to return
      null_array() instead (a shared null vector) which works fine since
	  arrays are copied when extended.
	* moved mapping_save_size and save_mapping into mapping.c (out of object.c)
	* fixed bugs in f_sub_eq and f_subtract and subtract_array (in array.c)
	* fixed a nasty bug in mapping.c:find_for_insert that was allocating
	  memory from the initial contiguous block even when the contiguous
	  block had long been exhausted (net affect was to cause non-malloced
	  memory to be freed at some time in the future).  This could explain
	  a lot of the crashes related to map_delete().

Fri Jul 17 12:40:13 1992  Erik Kay  (Wayfarer@Portals)

	* added a fix to fix the strange initial login problem listed in
	the previous entry.  I basically do a call to new_user_handler()
	just in case a user tried to connect while preloading was
	happening.  It may very well be that similar things need to be
	done just in case some other socket connection is established
	during this time (mail, finger, etc.).  Jacques?

	* changed placement of preload_objects.  It used to be before
	backend() was called, but this causes problems with preloading
	objects which have socket efuns, etc.  Now it is called on the
	first loop through backend().  As a result of this backend now
	takes an arg so that it knows what to pass to preload_objects().
	The only bad side effect I've seen from this is that if a user
	connects before the preloads have finished and happens to
	interrupt an object which is preloading, which his logging in
	causes to preload, a few odd (but non-fatal) results occur.

	* (I actually did this before the other wizlist changes mentioned
	below) Fixed a bug in the driver which caused wizlist with no args
	to dump the driver.

Thu Jul 16 11:50:29 1992  Erik Kay  (Wayfarer@Portals)

	* COMPATIBILITY BUSTER. made some gratuitous changes to the
	wizlist functionality.  Removed wiz_list.[ch], and replaced with a
	functionally identical domain_stats.[ch].  For the most part, all
	that changed were the names.  Efuns that have been changed are:
	wizlist->domain_stats, wizards->domains.  The output for
	domain_stats has been cleaned up as well.  I was going to make
	some major changes, but decided that it really wasn't needed for
	the most part.

	* fixed socket_address so that it returns the correct result,
	rather than 0 like it used to. (it now returns a string formatted
	in the same way that socket_connect takes its string)

	* fixed the socket_efuns so that their call to valid_socket also
	includes a inet address and a port number if appropriate.  both
	are passed as strings.  The appropriate definition of valid_socket
	is as follows: int valid_socket (string eff_user, string function,
	string address, string port);

Wed Jul 15 20:25:16 1992  Erik Kay  (Wayfarer@Portals)

	* COMPATIBILITY BUSTER! Changed the behavior of message() so that
	instead of calling catch_tell, it instead calls
	receive_message(string class, string msg) in the target objects.

	* fixed the LOG_SHOUTS function to work use query_cap_name, and to
	then fall back to query_name.  Previous to this, it was using
	query_real_name, which isn't used in most MudOS mudlibs in the
	same sense that the driver intended.

Fri Jul 10 21:05:30 1992  Erik Kay  (Wayfarer@Portals)

	* added >>some<< of Whiplash's changes in.  Specifically, the
	patch to hidden objects, which allowed them to actually be hidden.
	(I'm not sure I like this) The other addition is a maximum inherit
	chain size to prevent infinite inherit chains.  This is a
	compatibility buster as it requires a new addition to the runtime
	config file: "inherit chain size".  The number value given is the
	max depth of inheritance the driver will allow.

	* made call_other's so that you don't have to cast the return
	value.  This is controlled via a #define in config.h:
	CAST_CALL_OTHERS.  If undefined, casting is optional.

	* COMPATIBILITY BUSTER!!! - made destruct call valid_destruct()
	before it can legally destruct.  valid_destruct takes two args
	(string eff_user, object ob).  The first if the eff_user of the
	object which is trying to do the destruct, and the second is the
	object which is being destructed.  valid_destruct isn't called if
	the destructing object is the same as the object being destructed.

Fri Jul  3 13:58:55 1992  Erik Kay  (Wayfarer@Portals)

	* COMPATIBILITY BUSTER!!! - I made all socket efuns return 1 for
	success. A return value of 0 indicates a failed call to
	valid_socket. (not really much of a compat buster since all of
	about 4 people were using 0.8.15 :-)

	* made all socket efuns call valid_socket in master.c.  That
	function takes two arguments.  The first is the euid of the
	caller, the second is the socket function being called ("close",
	"connect", "write", etc).  Any value returned which is non-zero is
	a success.

	* fixed explode so that if passed a null delimiter, it returns
	each character of the string as a separate string (truilkan)

	* fixed stack corruption problem in f_message()

	* fixed stack corruption caused by f_deep_inventory(truilkan)

	* copy_file now closes files (heh) (truilkan)

	* fixed load_object and find object so that they generate errors
	on multiple "/"'s in pathnames

	* fixed legal_path so that on amigas it fails if there's a : in
	the pathname (the #ifdef is probably wrong though)

Sat Jun 27 00:38:10 CDT 1992  Truilkan@TMI
	* bumped the patchlevel number to 0.8.16 (alpha)
	* fixed f_get_dir so that it pops its args like it should
	* fixed mapping_indices so that it doesn't do v->refs-- since
	  f_keys already does it.  the code that mucks with refs definitely
	  needs reworked... maybe refs should be initialized to 0 instead of 1.
	* moved %token F_CASE, F_DEFAULT, and F_RANGE from postlang.y to
	  prelang.y so that "if (instruction >= BASE)" test works properly.
	* added a few prototypes to lint.h to handle eoperations.c calling
	  functions in interpret.c
	* replaced sprintf.c 1.04 with 1.05 from ucbvax.berkeley.edu ftpsite
	* changed check for HIDDENs in find_living_object so that it
	  wouldn't hang the mud.
	* added 'eval_cost = 0' to look_for_objects_to_swap so that
	  won't get max eval exceeded when have many objects to cycle through.

Wed May 20 11:47:26 1992  Erik Kay  (erikkay at milo.mit.edu)

	* fixed GNUmakefile so that it works with 0.8.15 stuff.

	* bug fix to interpret.c to allow comparisons between mappings.
	Like arrays, this does pointer compares and not content compares.

	* fixed bug in rc.c which got confused by near duplicate entries

	* merged in Jacques bug fixes to comm and socket efuns

Thu Apr 23 02:20:05 CDT 1992 Truilkan@TMI
	* bumped the patchlevel number to 0.8.15
	* added Shadowhawk@TMI's patch to input_to to allow multiple arguments
	  which get passed on to the function called by input_to!
	* added Michael's changes to the GNUmakefile (Wayf had left in some
	  localized specials)
	* deleted a line in lint.h that was causing problems _flshbuf or
	  some such (messed up AIX 3.2 and Utlrix 4.2)
	* fixed prototype of do_message() in lint.h
	* changed name of set() in ed.c to ed_set() (wayf wanted it)
	* modified make_func.y to produce efunctions.h and efun_table.h
	* added Jacques's mods for comm1.c, backend.c and comm.h
	* fixed save_mapping not to save deleted nodes
	* removed Shadowhawk's dprint addition to ed.c.  Somehow it was screwing
	  up the 'I' indent command in ed.
	* added back Shadowhawk's mods to ed.c.  He found the problem.
	* fixed bug in lex.c that causes the driver to crash if one tried to
	  load a file in root (/)
	* fixed another bug in call_all_other (still wasn't pushing args on right)
	* removed CALL_EXIT options (should go in mudlib if wanted)
	* included config.h before lint.h in port.c instead of after.  this should
	  fix the drand48 bug.
	* fixed defn's of IS_ZERO and IS_UNDEFINED in interpret.h.  Was crashing
	  the driver under certain circumstances. (Jubal@TMI found this one)
	* added Jacques socket efuns.  These are totally cool!  Read
	  ./doc/socket.notes for more info.
	* made StrHash in stralloc.c into a macro.  call init_strings from
	  main.c now instead of in StrHash (saves an if statement).
	* note there is a bug in rc.c that I'm leaving for Wayfarer to fix.
	  it reads "living hash table size" in place of "hash table size".
	  solution is to switch the order of these two in your config file
	  so that "hash table size" comes first.

Wed Apr 22 21:43:21 CDT 1992 Truilkan@TMI
	* bumped the patchlevel number to 0.8.14
	* added the CONFIG_FILE_DIR back to config.h due to popular demand
	* mucked some with prototypes that were giving some people problems
	* added in Wayf's changes to GNUmakefile
	* split CALL_EXIT into ROOM_CALL_EXIT and ALL_CALL_EXIT (see config.h
	  for details)
	* added a fix to ed.c to prevent driver from dumping core when
	  ed displays way long lines. (whiplash@TMI reported this)

Tue Apr 14 14:19:36 CDT 1992 Truilkan@TMI
	* bumped the patchlevel number to 0.8.13
	* changed name of do_message() efun back to message() (turns out that
	  only the name of the function called from inside the F_MESSAGE case
	  in interpret.c needed to be changed to do_message()).
	* fixed a bug in call_all_other in interpret.c (pushing same value onto
	  stack numargs times)
	* fixed another bug in call_all_other (wasn't popping right number
	  of things off the stack).
	* added Shadowhawk's dprint option to ed.c (automatic print after delete)
	* added tell_npc(ob,str) back to end of object.c:tell_object (was
	  mistakenly removed a few releases back).  -- Soulsinger@Dreamshadow
	  noticed this one.
	* changed svalue_to_int in mapping.c to explicitly handle T_OBJECT
	* applied Wayf's fix to simulate.c so that the failed to load file
	  message is specific.
	* added Darker Realm's interpret.c:F_ADD fix for a memory leak
	* added a fix to keep error messages generated by clean_up from going
	  to a random player (whoever happens to be this_player() at the time).
	* changed a the wording of a few error messages to make more sense
	* added object type O_MASTER.  fixed validate_shadowing so it will not
	  allow shadowing of the master object (previously this had to be
	  explicitly prevented in master.c itself).
	* changed all malloc's to MALLOC's and free's to FREE's etc.
	  so that stats can be kept on system malloc and so that smalloc.
	  can be used on machines that don't allow malloc to be redefined.
	  Any additions to the driver should not use malloc(), free(), realloc(),
	  or calloc().  Instead use the capitalized versions of these.  Any
	  c module using these should include both config.h and lint.h in
	  that order.  The desired memory package must now be specified in
	  config.h.  Added make_malloc.c.
	* added a link(string,string) efun to do UNIX links.  queries
	  valid_ln(string source,string target) in master.c.
	* fixed F_SHUTDOWN in interpret.c so that it actually pays attention
	  to the value returned by valid_shutdown in master.c
	* enhanced sizeof() to work on mappings as well.  Because of the
	  implementation of mappings this efun is really only useful to see
	  whether or not a mapping has just been set to ([]).
	  e.g. if (!sizeof(mapping)) do_something();
	* cleaned up the shared string hash table data structure.
	* modified object_present() in simulate.c so that if OLD_PRESENT isn't
	  #defined, the present() efun behaves in a new way.  If present calls
	  id() in an object and id() returns an object, then present will
	  return the object returned to it by id().  The potential uses for
	  this are left up to the imagination of the reader (oh well... ok.
	  You could use it to make a charmed monster that made you attack someone
	  else in the room whenever you tried to attack it.   You could also
	  use it to make a chair that let you look at whoever was inside it by
	  typing "look at joe" or whoever).  -- this one was at the request of
	  Jubal@TMI.
	* added conditional code to move_object so that if CALL_EXIT is
	  defined in config.h, then move_object will call the "exit" method
	  in objects in the inverse manner in which "init" is called.
	  That is, when a living object leaves a room, it will call "exit"
	  on the room and on each living object in the room.  Each living
	  in the room will also call "exit" on the living leaving the room.
	  This is expensive and so it is optional.  This functionality
	  was added at the request of Dainia@Dreamshadow.
	* fixed a bug in F_RECEIVE (wasn't saving command_giver).  This lets
	  INTERACTIVE_CATCH_TELL be safely defined in config.h.  Defining
	  INTERACTIVE_CATCH_TELL causes tell_object to call catch_tell in
	  interactives.  The catch_tell can call receive(str) to display
	  the message to the interactive.
	* changed driver so that everything goes to catch_tell if
	  INTERACTIVE_CATCH_TELL is defined (shouts, says, tell, room tells).
	  Also changed things so that monsters get shouts via catch_tell.

Mon Apr 13 13:40:27 CDT 1992 Truilkan@TMI

	* bumped the patchlevel number to 0.8.12
	* changed comm1.c so that FIONBIO isn't used for sun3's.  some number of
      them seem not to be able to handle that ioctl.
	* fixed in_input and in_edit in interpret.c to pop the stack like they
	  should (Pariah@TMI found this one).

Sun Apr 12 20:55:26 CDT 1992 Truilkan@TMI

	* bumped the patchlevel number to 0.8.11
	* fixed set_bit, test_bit, and clear_bit so that they work and produce
	  printable strings once again (somebody mucked with them)
	* refixed bug causing game to consider ! an escape even when not in
	  ed or input_to (somehow this fix was lost)
	* added Vincent's Hollow's patch to lex. to allow token pasting (using ##)

Sun Apr 12 04:56:56 CDT 1992  Truilkan@TMI

	* bumped the patchlevel number to 0.8.10
	* updated the installation documentation in ./README and ./doc/install

Sat Apr 11

	* bumped the patchlevel number to 0.8.9
	* no real changes (fixed a problem that was causing patches to
	the Makefile to be rejected -- Buddha's makefile was out of sync with
	the one I was using). 

Sat Apr 11 03:59:46 CDT 1992  Truilkan@TMI

	* bumped the patchlevel number to 0.8.8
	* renamed delete() to be map_delete() and fixed a bug in the
	F_MAP_DELETE case of interpret.c.

Thu Apr  9 22:55:49 CDT 1992  Truilkan@TMI

	* bumped the patchlevel number to 0.8.7
	* refixed save_object so that it can save 2-d mappings
	* changed reset_object so that it undefines this_player while reset is
	  called (so that charlie brown doesn't get snoopy's error messages).

Thu Mar  5 00:13:55 CST 1992  Truilkan@TMI
 
 	* bumped the patchlevel number to 0.8.6
 	* added Lars 3.1.1-3.1.2 diffs (the one that we hadn't already found)
 	* added efun undefinedp().  This was added to
 	make it unnecessary to overload zero (0) to mean two different things
 	(zero and/or undefined). call_other()'s on nonexistant methods
 	return undefined (const0u) and map references on keys not in map return
 	undefined (const0u).  This is, the value returned by a call_other on
 	a nonexistant method will caused undefinedp(value) to return TRUE etc.
 	* modified the makefile (not gnu makefile) to move y.tab.h to lang.tab.h
 	and y.tab.c to lang.tab.c (to be compatible with the GNU makefile).
 	* fixed a bug in backend.c just after process_input was called
	(was accessing ret->type even when ret was NULL) - Wayf found this one.
	* changed Huthar's message() to be do_message() (at request of Wayfarer)
 	* changed call_out.c so that call_out's are legal on static methods
 	(added code that temporarily changes current_object).
 	* added delete(map,element) which deletes an element from a map
 	* fixed save_object so that it can save 2-d mappings

Wed Mar  4 21:33:09 1992  Erik Kay  (erikkay at panacea.media.mit.edu)

	* removed all RCS stuff from the driver.  The current
	implementation sucks, so we'll take it out until it's rewritten
	better.

	* bumped the patchlevel number to 0.8.5

	* added two new efuns to the driver courtesy of Huthar of Portals
	and TMI.  children(object): returns all objects which were cloned
	from the object you pass to it, and message (string msg, string
	class,	mixed targets, object *exclude_targets).  This efun is a
	generic messaging function meant to replace all current
	communication efuns in the future (say, shout, tell_*, printf,
	write, etc).  It communicates directly to catch_tell in the
	targets.

	* added the file GNUmakefile to the dist which allows GNU make to
	be used with some greater flexibility in the compile cycle.

	* added support to allow yacc to be replaced with bison if so
	desired. 

	* fixed a couple of parser bugs in postlang.y revealed by using
	bison. 

	* cleaned up a number of warning messages generated by gcc 2.0.

	* cleaned up the Makefile still more. (there was a lot of useless
	stuff in it)

	* merged in Truilkan's fix to the memory leak in indices(), that was
	causing extra arrays to sit around.

Sat Feb 22 14:28:35 1992  Erik Kay  (erikkay at panacea.media.mit.edu)

	* made addition so that crash() could be defined static in
	master.c so that users can't do a call_other on it.

	* fixed the bug which screwed up the swap file location if you had
	a leading space.  It's now a file relative to the mudlib's home.

	* removed all dependance on query_player_level from the driver.
	It is now no longer needed in master.c.  (trace and traceprefix
	use O_IS_WIZARD)

	* changed the call to query_allow_shadow to valid_shadow to be
	more consistant with master.c naming conventions.

	* changed the apply of get_wiz_name in wiz_list.c to creator_file
	so that we don't have to have two functions which do exactly the
	same thing.

	* made set_inc_list happen before the master object is loaded so
	that the master object doesn't have to use explicit path names in
	it's #includes.

	* made simul_efun load before the master object so that the master
	object doesn't have to inherit simul_efun.

Fri Feb 21 18:30:36 1992  Erik Kay  (erikkay at panacea.media.mit.edu)

	* Added make depend instructions to the README file.

	* Fixed bug in rlog which caused the driver to dump core.  RCS
	should work (at least partially) now.

	* Commented out interactive catch tell code, since it's dumping
	the driver.  No clue on this one guys.

	* Took out all #ifdef LPCA and #ifndef LPCA since we always want
	that behavior.

	* Redid the Makefile to use makedepend.  Took -DLPCA out of the
	makefile as well as TRACE_CODE.

Thu Feb 20 00:35:40 CST 1992 Truilkan@TMI [0.8.2]

    * Added #include "config.h" to port.c so that the chosen random
    number generator will be used (instead of the default bad one).
    This corrects a bug introduced when -DRANDOM was moved out of
    the Makefile and into config.h.

    * fixed a bug in lex.c related to the C++ // style comments that
    could cause an infinite loop under certain circumstances.

    * added a #define INTERACTIVE_CATCH_TELL to config.h which should
    be defined if you want catch_tell to be called on interactives as
    well as NPCs (you'll need to define a catch_tell that calls receive()
    if you use this option).

    * Figured out why dumpallobj was crashing the mud.  It was because
    dumpstat.c wasn't grokking the T_MAPPING type (32).  I added
    a couple of empty cases to the switch statement to prevent crashing
    but Whiplash needs to go in and add code for those cases.

    * updated the doc/install file.


Tue Feb 18 18:51:57 1992  Erik Kay  (erikkay at dearth.media.mit.edu) [0.8.1]

	* commented out dumpallobj until we can fix it.

	* Made enable_wizard() require that the caller be interactive.  It
	now returns 1 on success, and 0 on failure.

	* Removed ETCDIR from the Makefile, and replaced it with
	CONFIG_FILE_DIR in config.h.  Put an explanation around it, so that
	there was no confusion as to its purpose.

	* Changed the config variable "include directories" so that it no
	longer needs the /%s on the trailing end.  So instead of /sys/%s,
	you can have /sys instead.

 
	* split part of config.h into options.h (the part that contains the
	  the macros that may need changed).
	* removed clilib.c from the distribution since Jacques already removed
	  the mudwho stuff from comm1.c anyway.  Mudwho can probably be better
	  handled at the mudlib level using the socket efuns.
	* removed the describe_items efun which was doing nothing at all
	* removed the cindent() efun since we don't even include the indent
	  executable anymore anyway.
	* changed svalue_to_int in mapping.c to handle mappings as well
