tmi2/
tmi2/bin/
tmi2/etc/
tmi2/lib/
tmi2/lib/adm/
tmi2/lib/adm/daemons/languages/
tmi2/lib/adm/daemons/network/I3/
tmi2/lib/adm/daemons/virtual/template/
tmi2/lib/adm/obj/master/
tmi2/lib/adm/priv/
tmi2/lib/adm/shell/
tmi2/lib/adm/tmp/
tmi2/lib/cmds/
tmi2/lib/d/
tmi2/lib/d/Conf/
tmi2/lib/d/Conf/adm/
tmi2/lib/d/Conf/boards/
tmi2/lib/d/Conf/cmds/
tmi2/lib/d/Conf/data/
tmi2/lib/d/Conf/logs/
tmi2/lib/d/Conf/obj/
tmi2/lib/d/Conf/text/help/
tmi2/lib/d/Fooland/adm/
tmi2/lib/d/Fooland/data/
tmi2/lib/d/Fooland/data/attic/
tmi2/lib/d/Fooland/items/
tmi2/lib/d/TMI/
tmi2/lib/d/TMI/adm/
tmi2/lib/d/TMI/boards/
tmi2/lib/d/TMI/data/
tmi2/lib/d/TMI/rooms/
tmi2/lib/d/grid/
tmi2/lib/d/grid/adm/
tmi2/lib/d/grid/data/
tmi2/lib/d/std/
tmi2/lib/d/std/adm/
tmi2/lib/data/adm/
tmi2/lib/data/adm/daemons/
tmi2/lib/data/adm/daemons/doc_d/
tmi2/lib/data/adm/daemons/emoted/
tmi2/lib/data/adm/daemons/network/http/
tmi2/lib/data/adm/daemons/network/services/mail_q/
tmi2/lib/data/adm/daemons/network/smtp/
tmi2/lib/data/adm/daemons/news/archives/
tmi2/lib/data/attic/connection/
tmi2/lib/data/attic/user/
tmi2/lib/data/std/connection/b/
tmi2/lib/data/std/connection/l/
tmi2/lib/data/std/user/a/
tmi2/lib/data/std/user/b/
tmi2/lib/data/std/user/d/
tmi2/lib/data/std/user/f/
tmi2/lib/data/std/user/l/
tmi2/lib/data/std/user/x/
tmi2/lib/data/u/d/dm/working/doc_d/
tmi2/lib/data/u/l/leto/doc_d/
tmi2/lib/data/u/l/leto/smtp/
tmi2/lib/doc/
tmi2/lib/doc/driverdoc/applies/
tmi2/lib/doc/driverdoc/concepts/
tmi2/lib/doc/driverdoc/driver/
tmi2/lib/doc/driverdoc/efuns/arrays/
tmi2/lib/doc/driverdoc/efuns/buffers/
tmi2/lib/doc/driverdoc/efuns/compile/
tmi2/lib/doc/driverdoc/efuns/ed/
tmi2/lib/doc/driverdoc/efuns/floats/
tmi2/lib/doc/driverdoc/efuns/functions/
tmi2/lib/doc/driverdoc/efuns/general/
tmi2/lib/doc/driverdoc/efuns/numbers/
tmi2/lib/doc/driverdoc/efuns/parsing/
tmi2/lib/doc/driverdoc/lpc/constructs/
tmi2/lib/doc/driverdoc/lpc/preprocessor/
tmi2/lib/doc/driverdoc/lpc/types/
tmi2/lib/doc/driverdoc/platforms/
tmi2/lib/doc/mudlib/
tmi2/lib/ftp/
tmi2/lib/log/
tmi2/lib/obj/net/
tmi2/lib/obj/shells/
tmi2/lib/std/board/
tmi2/lib/std/body/
tmi2/lib/std/fun/
tmi2/lib/std/living/
tmi2/lib/std/object/
tmi2/lib/std/shop/
tmi2/lib/std/socket/
tmi2/lib/std/virtual/
tmi2/lib/student/
tmi2/lib/student/kalypso/
tmi2/lib/student/kalypso/armor/
tmi2/lib/student/kalypso/rooms/
tmi2/lib/student/kalypso/weapons/
tmi2/lib/u/l/leto/
tmi2/lib/u/l/leto/cmds/
tmi2/lib/www/errors/
tmi2/lib/www/gateways/
tmi2/lib/www/images/
tmi2/old/
tmi2/v21.7a10/
tmi2/v21.7a10/ChangeLog.old/
tmi2/v21.7a10/compat/simuls/
tmi2/v21.7a10/include/
tmi2/v21.7a10/testsuite/
tmi2/v21.7a10/testsuite/clone/
tmi2/v21.7a10/testsuite/command/
tmi2/v21.7a10/testsuite/data/
tmi2/v21.7a10/testsuite/etc/
tmi2/v21.7a10/testsuite/include/
tmi2/v21.7a10/testsuite/inherit/
tmi2/v21.7a10/testsuite/inherit/master/
tmi2/v21.7a10/testsuite/log/
tmi2/v21.7a10/testsuite/u/
tmi2/v21.7a10/tmp/
Fri Sep 22 22:51:20 EDT 1995 (tim@handel.princeton.edu (Beek))
	* raised patchlevel to v21.7a10
	* fixed a bug that caused case 0: to not work in string switches
	* fixed a typo in the unknown pragma error message
	* rule priority is now calculated beforehand in the parser; this
	  fixes the precedence of some errors and allows earlier shortcutting
	* 1st through 9th and first through ninth are now understood by the
	  parser
	* "Which X do you mean?" is now more verbose
	* 'myself' is now the same as 'me'

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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