TinyMUX 2.0:  CHANGES
Last Update:  December 2002

Major changes that may affect performance and require softcode tweaks:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 --  MUX 2.0 no longer uses any version of GDBM for it's database.
 --  Broad Time/Date from 27255 BC to 30826 AD with a proleptic Gregorian
     Calender. The internal resolution of time is 100 ns.
 --  Large 64-bit Integer Math support.
 --  Moved code from C to C++.
 --  Shared sources between Unix and Win32 including native NT networking.
 --  Queuing (@wait/@notify/@kick) is completely re-written and fits more 
     seamlessly with the networking. 
 --  Added optionally included WOD_REALMS support.
 --  Replace udb_ocache with an attribute cache using CHashTable.
 --  vmul() behavior didn't match PennMUSH, MUSH 3, or MUX 2 help files.

Feature Additions:
~~~~~~~~~~~~~~~~~
 --  Greatly improve @dbclean so that it checks the internal and external 
     integrity of five data structures against themselves, removes stale 
     attributes, and renumbers the attributes that remain. And, it's very 
     much faster than the original version. Removing stale attributes by 
     itself takes 6 seconds. 
 --  Allow comtitles to -replace- your name instead of just prefix it. 
     Staff continues to see who is who. This behavior is choosen with
     @cset/spoof <channelname>.
 --  Server automatically creates a minimal database if one does not 
     already exist.  
 --  dbconvert will not allow you to load into a non-empty database or 
     unload from a non-existent one.
 --  Added a TinyMUSH-style backup script which runs dbconvert, as well as 
     creating a tarball that includes flatfile, mail.db, comsys.db, 
     mux.config, GAMENAME.conf, and all .txt files except help and wizhelp.  
 --  Added %cu for ANSI underline.
 --  columns() is fully ANSI-aware and maintains the intended color.
 --  strtrunc() is fully ANSI-aware and maintains the intended color.
 --  ucstr() and lcstr() are now fully-ANSI aware and only uppercases 
     (lowercase) the non-ANSI text.
 --  ANSI has been re-worked and there are no known color leaking issues in 
     the server. The server automatically goes to normal color mode even if 
     you don't specify it explicitly in your text. ANSI sequences are 
     optimized (sometimes totally out of existence). Truncation of ANSI 
     strings into fixed-sized buffers or fixed-width fields is handled 
     properly.
 --  Better NOBLEED support. NOBLEED support is accomplished with fewer 
     ANSI codes.
 --  Reworked the game's command line processing and filled in some 
     combinations. 
 --  Added a @list resources command to show total number of open files, 
     sockets, etc. 
 --  Added @mail/reply[/quote], and @mail/replyall[/quote]
 --  Included safer_passwords configuration option.
 --  Configuration option added to deal with guest logins at reg-only MUXen.
 --  Added channel functions: comalias(), channels(), and comtitle().
 --  Added functions: doing(), motd(), and poll().
 --  Added @idletimeout
 --  Added SIGUSR2 signal handler.
 --  IRIX builds cleanly and runs.
 --  Solaris builds and runs cleanly.
 --  Added @log command.
 --  Added iadd(), div(), imul(), and isub() functions.
 --  Use dynamic string allocation in conf.cpp to support filenames longer
     than 30 characters.
 --  OpenBSD and FreeBSD build and run clean.
 --  comtitle prefix/replace behavior is now optional on a per-channel
     basis. See @cset/spoof
 --  Added @idletimeout
 --  Added comtitle(), alias(), comalias(), channels(), poll(), doing()
     and motd() functions.
 --  Tiny_ltoa() and Tiny_i64toa() are about twice as fast.
 --  db_write is about 4 times faster.
 --  putstring is about 30% faster.
 --  Added @function/list from RHostMUSH.
 --  Added /noeval to @pemit and @npemit
 --  ucstr(), lcstr(), capstr(), reverse(), and revwords() are now
     ANSI-aware.
 --  band(), bnand(), and bor() were added months ago.
 --  Added lpos() function from MUSH 3.
 --  Added @timecheck command from MUSH 3 and changed it to use
     MUX 2's internal time format and to work on WinNT and Win9x.
 --  Added flag_access configuration option from MUSH 3.
 --  Rewrote PERMISSIONS topic in wizhelp.txt to accurately reflect the code.
 --  Have server abort() with a log entry instead of just abort()'ing.
 --  Added 'head' access permission.
 --  Added 'lag_maximum' configuration option with default of 120 seconds.
 --  Added the object list stack originally from U1 and ChaoticMUX that
     keeps certain operations (when nested) from stepping on each other's
     object searches.
 --  Use ANSI_TruncateToField on object names so that embedded ANSI
     in object names are ANSI-optimized and correctly terminated with %cn.
 --  Added a 'report' command that shows a distribution of 'last logged in'
     times for a week in 8 hour intervals. 
 --  Updated lnum() function to accept three arguments.
 --  Enhanced secs(), convsecs(), time(), and convtime() to handle both
     UTC and local timezones with room for others.
 --  Added the Mersenne Twister random number generator.
 --  Added various time/accounting functions from DooferMUX.  This is
     controlled by the GAME_DOOFERMUX define and it's turned off by default.
     Some of the DooferMUX stuff may be removed at a future time.
 --  Subnets can now be expressed with the 'slash' notation. i.e, a.b.c.d/e
 --  guest_site configuration option is in, but based on input from ChaoticMUX,
     and RHostMUSH, this may be accomplished in another way or with a different
     name. And, there is currently no help for this option.
 --  Bug #401 - @dump/flatfile is now supported.
 --  Included all but two GAME_DOOFERMUX changes in the default build.
 --  Bug #251 - pos() is now ANSI-aware for pattern and source. I also
     optimized the single-character case.
 --  Bug #524 - Wizards can no longer clear each other's @mail with
     '@mail/debug clear=<dbref>'.
 --  Bug #493 - @function/pres and @function/priv are not allowed together.
 --  Bug #247 - ljust was ANSI-ignorant and now it supports a string for
     padding.
 --  Bug #248 - rjust was ANSI-ignorant and now it supports a string for
     padding.
 --  Bug #302 - center was ANSI-ignorant and now it supports a string for
     padding.
 --  Bug #531 - inc() should return 1.
 --  Bug #532 - inc(WIBBLE) should return 1.
 --  Bug #375 - Added table() function from PennMUSH.
 --  Bug #522 - Enhanced '@mail/debug' to check for and repair mailbag item
     reference counts.
 --  Bug #539 - Server will wait 10 seconds after startup before accepting
     @restart requests, and any SIGSEGVs during this period do not cause a
     @restart either, but a prompt abort.
 --  Added CRC32, PACK, and UNPACK softcode functions.
 --  Included changes from port to Tru64 Unix.
 --  Can now use @set and set() to set multiple flags at a time.
 --  Added ChaoticMUX's colored channel names including the same file format.
 --  Added floordiv(), remainder(), and changed mod().
 --  Added INFO command which can be used at the connect screen and from within
     the game.
 --  Added automagic date parsing as part of convtime. The date parser supports
     free-form dates and also ISO formats including year/day, month/day, and
     weekofyear/dayofweek.
 --  Morgan added @conformat and @exitformat from PennMUSH.
 --  Marlek added @nameformat.
 --  Hellspawn added @dolist/notify.
 --  Hellspawn added @notify/quiet.
 --  @pemit/list to behave like a series of @pemits. Requested by Alierak.
 --  Added output separator to ITER, PARSE, and MAP. Patch from Ashen-Shugar.
 --  Added PICKRAND() from ChaoticMUX.
 --  Added LRAND() from TinyMUSH 3.0.
 --  GAGGED players no longer allowed to speak on channels.
 --  The WOD_REALMS option now shows up in INFO.
 --  Added LADD() from TinyMUSH 3.0.
 --  Bug #704 - Added T() from PennMUSH. Thanks Raevnos.
 --  Bug #563 - Add emit() function. Thanks Raevnos.
 --  Added remit() function.
 --  Bug #677 - Add oemit() function. Thanks Raevnos.
 --  Added if() from PennMUSH. Thanks Raevnos.
 --  Hellspawn added @backup from ChaoticMUX with corresponding backup
     script.
 --  @break command from Raevnos and PennMUSH.
 --  LROOMS() function from Marlek and RhostMUSH.
 --  Locks no longer require surrounding square brackets.
 --  switch() function now accepts < and > operators like @switch.
 --  Roy Anger updated comsys help.
 --  Reformatted wizhelp.txt.
 --  Freshened help for @aconnect and @adisconnect.
 --  Support second argument for squish().
 --  Compiles under Cygwin.
 --  Changes for DEC Alpha Linux and IA64.
 --  Bug #799 - Update lcmds() to handle spaced commands and ^-listens.


Bug Fixes:
~~~~~~~~~
 --  Fixed: merge() let *bufc point one character too far.
 --  Fixed: space() SIGSEGV
 --  Fixed: lparent endless loop.
 --  Fixed: bad_command and shout log buffer overrun.
 --  Fixed: welcome screen character creation SIGSEGV
 --  Fixed: @mail could go blank if too large.
 --  Fixed: Players couldn't test dark wizards for AUDIBLE.
 --  Fixed: @mailer queuing loop if mailer was disabled.
 --  Fixed: help topic aliases were shown.
 --  Fixed: Removed DarkZone 990 character limits.
 --  Fixed: non-players can no longer use @mail.
 --  Fixed: @clone stepped on pennies.
 --  Fixed: @ps was not showing @wait 0 commands.
 --  Fixed: SIGSEGV in dbconvert with object @locked to sex:f when no other
     user-defined attributes have been defined.
 --  Fixed: subtle bug in ANSI_TruncateToField going from normal to normal
     color near the end of the buffer.
 --  Fixed: Buffer trash problem with delete() function.
 --  Fixed: Rounding bug in time_format_1 (affected WHO).
 --  Fixed: fun_ansi used ANSI_TruncateToField with the wrong field size.
 --  Fixed: idle() returned '0' for unconnected players instead of '-1'.
 --  Fixed: Protect math libraries against NaN and Inf with IEEE
     floating-point goo.
 --  Fixed: SIGSEGV bug in before() and after() if no second parameter
     was given.
 --  Fixed: HAVE_WAIT3 build issue on FreeBSD.
 --  Fixed: bsd.cpp SIGUSR1 blockage. The second SIGUSR1 would not be
     caught.
 --  Fixed: @program me SIGSEGV.
 --  Fixed: @pemit/list to a list of players sometimes used strtok a
     second time.
 --  Fixed: @dbclean and @prog bug caused by atr_add_raw/atr_get_raw idiom.
 --  Fixed: SIGSEGV in undocumented alphamin() and alphamax().
 --  Fixed: Parser wasn't enforcing minimal number of arguments.
 --  Fixed: Lit() bug and unsaved parser mode.
 --  Fixed: Potential StringCopyTrunc overflow in site names.
 --  Fixed: Potential buffer resuse in atol call in do_open in create.cpp
 --  Fixed: mid() SIGSEGV. Also made mid() ANSI-aware.
 --  Fixed: fun_create SIGSEGV. Argument count not validated.
 --  Fixed: Edge case ANSI bleeding.
 --  Fixed: die() edge case SIGSEGV.
 --  Fixed: buildnum.data missing in distribution.
 --  Fixed: INT64/scanf/printf problem on FreeBSD.
 --  Fixed: Configuration file SIGSEGV.
 --  Fixed: Race conditions in @restart, @dump, and @shutdown which can 
     cause DB corruption have been fixed.
 --  Fixed: @shutdown now waits for a forked dump to finish before exiting 
     the game.
 --  Fixed: All known comsystem buffer overflow issues have been fixed.
 --  Fixed: Setting a room transparent and linking an exit to home would 
     SIGSEGV.
 --  Fixed: Invalid master_room references would SIGSEGV.
 --  Fixed: protect against atof() SIGSEGV in certain libraries.
 --  Fixed: @program + LOGOUT + piping interactions would SIGSEGV.
 --  Fixed: NOBLEED with enough ANSI caused a buffer overrun and stack  
     corruption and a SIGSEGV.
 --  Fixed: Buffer overflow problems with ucstr() and lcstr() causing 
     SIGSEGV.
 --  Fixed: Buffer overflow problems with safe_tprintf_str that would 
     SIGSEGV.
 --  Fixed: @mvattr would still remove the source attribute if it couldn't 
     add the destination attribute.
 --  Fixed: events_daily_hour can now be hour 23 without causing daily    
     activities to execute 3-4 times about every 15 minutes. 
 --  Translate() now quotes backslashes correctly.
 --  @mail/fwd checks whether a message is already in progress.
 --  @doing color leaking.
 --  Trunc() now truly truncates a number instead of rounding.
 --  Fixed: @wait bug.
 --  Fixed: If you have @mail, and then purged it all (everything in all
     folders), you wouldn't be able to receive any further @mail until the 
     game @restarts.
 --  User-attribute name length was enforced incorrectly. 
 --  delcom showed DARK wizards leaving.
 --  Fixed a bug where parse_to was looking for an escape character on byte 
     -before- beginning of an allocated buffer.
 --  Fixed a bug where pending characters in 'session' report was negative. 
     It was caused by receiving a backspace without something to backspace 
     over.  Telnet clients usually demonstrate this bug. Other clients do 
     the editing themselves before they send. 
 --  @mail/fwd caused a SIGSEGV. get_attr_raw can return NULL. 
 --  Set flag2 and flag3 to zero for a minimal room. This is just an
     uninitialized variable that left most of the flags set to random stuff 
     on non-debug builds. 
 --  Fixed a lot of lint-type issues. 
 --  Fixed: mid() SIGSEGV. Also made mid() ANSI-aware. (from Robby Griffin)
 --  Fixed: fun_create SIGSEGV.  Variable number of arguments, pointers not 
     guaranteed valid. (from Robby Griffin)
 --  Fixed: edge case ANSI bleeding. (from Robby Griffin)
 --  die() SIGSEGV. (from Robby Griffin)
 --  Fixed: long integer problem in FreeBSD. (from Robby Griffin)
 --  Fixed: Configuration file SIGSEGV. (from Lew Newby)
 --  Changed: Config option added to deal with guest logins at reg-only 
     MUXen. (from Audumla)
 --  Use g++ explicitly instead of gcc.  This fixes a problem with builds
     under RH 5.1. (thanks MacGuyver)
 --  Documented band(), bnand(), and bor().
 --  Documented link(), subeval(), tel(), and valid() from MUX 1.6
 --  Documented allow_guest_from_registered_site configuration option.
 --  Obsoleted cache_depth, cache_trim, and cache_width in wizhelp.txt.
 --  Documented max_cache_size in wizhelp.txt.
 --  Changed default concentrator port in wizhelp.txt.
 --  Updated crash_database entry in wizhelp.txt
 --  Documented game_dir_file and game_pag_file configuration options.
 --  Obsoleted gdbm_database configuration option.
 --  do_conv now accepts "Jan 01 00:00:00 2000" as well as
     "Sat Jan 01 00:00:00 2000". Long-standing bug where the comments and the
     code describe different things.
 --  Fixed bug in trimmed_site where with a sufficiently large site_chars
     configuration limit, the server will overflow a MBUF_SIZE buffer.
 --  Fixed slow SBUF memory leak in find_power() which is called by the
     haspower() softcode function (from Robby Griffen).
 --  Found memory leak in !MEMORY_BASED + RADIX_COMPRESSION.
 --  Found typo that prevented !MEMORY_BASED + RADIX_COMPRESSION configuration
     from compiling.
 --  Fixed the way convtime() mishandled daylight savings time.
 --  TRUNC(5.0) would return 0 because the fractional part was zero and
     fun_trunc was testing the wrong number. This bug was introduced at the
     time as the IEEE floating-point Ind/+Inf/-Inf stuff was introduced.
 --  Subnet masks for restricted sites are now validated.
 --  Bits in the base IP address for restricted subnets are now removed.
 --  MEMORY_BASED attributes were allocated one byte too short (introduced in
     Beta 8).
 --  isValidSubnetMask() went through the wrong sequence of valid subnet masks
     (introduced in Beta 9).
 --  cf_log_syntax showed gibberish because of the way va_start/va_end-type
     arguments were handled (introduced in Beta 9).
 --  Setting #1 GOING is no longer permitted.
 --  @create no longer can create things with blank names. @create(%b,)
 --  MUX is more restrictive when loading comsys.db
 --  A KILLED database didn't have passwords in it (also with MEMORY_BASED).
     Introduced in Beta 10 (Build #267).
 --  objeval() security was too lax.
 --  The mail_sw and malias_sw tables were not terminated.
 --  Side-effect functions now enforce the same security that the
     corresponding commands enforce.
 --  CR, LF, and TAB are not allowed in @doing and @doing headers.
 --  Creating an exit like 'tes%crt;t' would leak ANSI color.
 --  Using a pipe with an unconnect player would duplicate output.
 --  Security flaw in @mail allowed WIZARD to use objeval to read @mail.
 --  Guests can no longer set attributes on themselves.
 --  @addcom allowed empty aliases.
 --  Strange player names are no longer allowed with
     '@wait 0=@pcreate %b=blah'.
 --  Buffer in view_atr was too small. No ill effects however.
 --  Bug with %v in the parser -- only apparent with syntactically
     incorrect use of %v.
 --  GetProcessorUsage assumed HAVE_GETRUSAGE.
 --  conn() now returns -1 for unconnected players as documented.
 --  A MEMORY_BASED build will now properly create a minimal
     database.
 --  Forward list length is now checked to avoid SIGSEGV.
 --  @toad now releases comsys and @mail resources associated with
     player.
 --  Bug in set_prefix_cmds that would effect space mods.
 --  Fixed minor bug in dbnum() used with sorting dbrefs. It's also
     smaller and faster.
 --  Fixed minor bug in GeneralTimeConversion with how to express the
     pluralization of '0'.
 --  Use time_t instead of long in test_time_t().
 --  Bug #277 - escape() is now ANSI-aware.
 --  Bug #293 - secure() is now ANSI-aware.
 --  Bug #352 - @mail 0 now gives something reasonable.
 --  Bug #422 - Fixed @toad race condition.
 --  Bug #461 - Descriptors 0 and 1 could be closed after a @restart.
 --  Bug #462 - boot_slave could close it's own socket to the DNS slave.
 --  Bug #463 - identd info never made it through on Win32.
 --  Bug #464 - Flag aliases are now put into canonical form.
 --  Bug #480 - @toad strips the zone on chown objects.
 --  Bug #483 - Bad socket descriptions are now discovered and removed.
 --  Bug #484 - @dump/text prevented normal @restart/@dump/@shutdown.
 --  Bug #485, #486, #487, #488, #489, #490, #491 - possible buffer overflows.
 --  Bug #492 - @dbclean is no longer allowed while @dump'ing.
 --  Bug #495 - @destroy strip the zone on chown objects.
 --  Long @malias no longer SIGSEGV at game start time. @malias length is
     limited to 12. @malias description visual width is limited to 40.
 --  columns on @malias reports are lined up even if descriptions include
     ANSI color.
 --  Bug #502 - Don't allow filenames to be @admin'ed from inside the
     game. The bug allowed anyone with #1 access to read files that the MU
     server itself had access to.
 --  Bug #507 - A recursive @function will overflow the stack.
 --  Bug #509 - Wrong call to free_lbuf in comsys.cpp with pointer from
     RestrictTitleValue.
 --  Bug #510 - @teleport should not allow anyone to teleport anything into
     a garbage object.
 --  Bug #513 - SIGSEGV and jibberish from regmatch().
 --  Bug #320 - There were some DarkZone 1000-character limits in mail.db and
     comsys.db which would SIGSEGV at load time if the mail.db or comsys.db
     file had a long line it in.
 --  Bug #520 - q-registers are not cleared properly. The value of the global
     registers leaks between interactive commands. Ancient bug made more
     obvious by MUX2's different scheduler.
 --  Bug #526 - table() didn't default for delimiter and separator.
 --  Bug #270 - Boolexp grammer was ambiguous and could cause the flatfile to
     be ambiguous.
 --  Bug #456 - Add limit to number of comsys aliases.
 --  Bug #414 - pmatch() behavior didn't match its helpfile topic.
 --  Bug #519 - @mail ref counts could be thrown off.
 --  Bug #389 - @mail subject was not ANSI-aware and could leak color.
 --  Bug #523 - Memory leak when importing +V1 mail.db files.
 --  Bug #543 - Because popen is more restrictive with it's second argument
     than fopen, the 'compression' config option didn't work on Unix.
 --  Bug #546 - @fixdb/rename uninitialized variable.
 --  Bug #547 - Buffer in pool_err needed to be larger.
 --  Bug #549 - An fread on the second pass in attrcache.cpp, line 110 needed
     to protect itself against truncated files (disk quota limits for example).
 --  Bug #564 - Encrypt/decrypt printf will leak passwords onto file descriptor
     1 (which, frankly, could be anything).
 --  Bug #542 - timeconv(time()) is off by 1 hour during daylight savings time.
 --  Bug #544 - 'Previous' file is not handled properly with compression on.
 --  Bug #545 - @malias description width not set at @malias creation time.
 --  Bug #565 - Encrypt can be used to generate characters 28, 29, 30, 31, and
     probably more.
 --  Bug #568 - Encrypt/decrypt is not ANSI-aware.
 --  Bug #534 - pi() topic is wrong in helpfiles.
 --  Bug #541 - A page-split shouldn't give the message that it's waiting on a
     @dump unless it really is.
 --  Bug #265 - _ATTRS for Chimera.
 --  Bug #378 - A perpetual @restart doesn't stop until the game is crashed.
 --  Bug #449 - link() permissions need to be enhanced (and tel() and pemit()).
 --  Bug #611 - children() is unintentionally wiz-only.
 --  Bug #599 - @halt/all bug. Pennies are given to #0. Reference to dbref -1.
 --  Bug #601 - @notify over-notifies.
 --  Bug #570 - Objects should be able to send @mail.
 --  Bug #584 - Server hangs if mail.db is zero-length.
 --  Bug #581 - Important configuration dbrefs should be validated.
 --  Bug #590 - A combination of Zones, EnterLocks using user-attributes cause
     attribute name goofiness for examine.
 --  Bug #587 - No help for the ':' help. Bug in the code.
 --  Bug #500 - Change idle times and connect times to floored times instead
     of rounded to nearest.
 --  Bug #613 - #-1 RECURSION LIMIT EXCEEDED missing.
 --  Bug #625 - Fixed max() to work for negative numbers.
 --  Fixed typo that could have affected the logic, but didn't in this
     particular case.
 --  Bug #664 - The "playername" syntax at the connect screen was broken.
 --  Bug #623 - Interaction between GOING and @restart affected exits.
 --  Config commands didn't accept upper-case flag names.
 --  Bug #665 - @mail/nuke corrupted the post office.
 --  Bug #390 - @mail without a body isn't sent.
 --  Bug #637 - semaphores with timeouts wouldn't run when @notified until the
     timeout, and semaphores without timeouts didn't have a predicatable run
     time when @notified, but usually it was right away.
 --  Bug #640 - Whispering to an unconnected player should behave more like
     paging an unconnected player.
 --  Bug #661 - comtitles near the maximum length were truncated when the game
     first starts.
 --  Bug #693 - TRACE with large output causes SIGSEGV. Found on Due Rewards.
     Fixed by Brazil. Bug from MUX 1.6.
 --  Bug #706 - WIZARD could @chownall #1. Reported by Ashen-Shugar. Fixed by
     Hellspawn. Bug from MUX 1.6.
 --  Bug #708 - give to garbage objects. Reported by Ashen-Shugar. Partial
     fix by Hellspawn. Final fix by Marlek. Bug from MUX 1.6
 --  Bug #757 - @wall/admin double emits. Report by many. Fixed by Hellspawn.
     Bug from MUX 1.6.
 --  Bug #751 - @nameformat, @conformat and @exitformat global registers are
     saved and cleared. Reported and fixed by Brazil.
 --  Clean up mkindx. Don't use '\r' in the index. Write clean structures.
 --  conntotal() and friends now account for multiple sessions properly.
 --  Fixed color leaks in long comsys headers.
 --  Work-around in sane_inet_addr() to handle 255.255.255.255.
 --  Bug #707 - Wizard can @chown garbage objects. Marlek fix. Reported
     by Ashen-Shugar. Bug from MUX 1.6.
 --  Bug #709 - Wizard can tel into objects that are inside garbage objects.
     Found by Ashen-Shugar. Fixed by Marlek.
 --  Bug #752 - pmatch() doesn't accept '*' as described in the help.
     Found by Ashen-Shugar. Fixed by Marlek.
 --  Can give objects to themselves. Fixed by Marlek.
 --  search() now uses the DbrefToBuffer() calls to ensure that returned
     dbrefs aren't truncated in the middle of the number.
 --  Workaround nonstandard continuation-line behavior of gcc 2.96 on
     Mandrake 8.0. Thanks Marlek.
 --  On Win32, the logs now use CRLF instead of NL.
 --  Clean build on gcc 3.0. Thanks Morgan.
 --  SIGSEGV bug in revwords(). Bug from Treyvan.
 --  lparent(), lcon(), and lexits() now use the DbrefToBuffer() calls to
     ensure that returned dbrefs aren't truncated in the middle of the number.
 --  Missing type case in destroy_obj(). Thanks Jake
 --  Possible check_pennies() SIGSEGV bug. Thanks Jake.
 --  Fix/extend the display of help so that blank lines in the help files
     are displayed as blank lines.
 --  The inet_ntoa() return value is to a static buffer, so it's value must
     be used or copied before making any other socket calls.
 --  TRACE output didn't keep track of the original player dbref.
 --  Bug #686 - Fix to @listcommands. @addcommand'ed commands weren't shown.
 --  Bug #710 - Leaving an object that is inside a garbage object may garble
     your location and randomly put the server into an endless loop.
 --  Bug #357 - objects on channel can now use MONITOR, @listen, or @ahear.
     @aahear worked before, and it still works.
 --  Bug Fix: cat() with no arguments causes SIGSEGV.
 --  Several semaphores waiting on the same object/attr could be @notified
     out of order.
 --  Channel messages are considered OOC.
 --  Bug #662 - SIGSEGV in @dbck.
 --  Bug #618 - Logic in new_home enables being inside a garbage object.
 --  Bug #424 - Linking deposit refund. Patch from Jake.
 --  Bug #585 - Parent isn't cleared during @destroy process. Patch from Jake.
 --  Bug #765 - whispering to objects with ears should still be allowed.
 --  Bug #602 - fun_ansi reaches backwards into the buffer.
 --  Bug #786 - Interaction between SUSPECT and 'log all_commands'. If both
     on, SUSPECT actions do not show up in the logs. Patch from Raevnos.
 --  The slave boot code doesn't update maxd which (depending on the descriptor
     value of the slave) can prevent communication with it.
 --  Try to avoid crashing with MUSH 2.2.x and U1 flatfiles that were garbled
     in the transfer between Unix and Win32.
 --  Unterminated buffer operation in setinter().
 --  Fractional part of time request can get into the timezone info.
 --  @exitformat passed all exits into %0 if at least one of the exits was
     visible to the user.
 --  Objects could use flags() to see CONNECTED flag of DARK WIZARDs.
 --  Bug #799 - SIGSEGV possible in lcmds().
 --  Fix use of %9 with udefault().
 --  Fix edit(test,,a) --> 'testa'. Found by Ashen-Shugar.
 --  Fix the way nanoseconds are broken into milliseconds, microseconds, and
     nanoseconds. Probably not observable in MUX 2.0.
 --  Fix filter() behavior where a prefix of '1' was enough to test true.
     Fixed by Raevnos.
 --  @chzone should have cleared powers. Fix by Jake.
 --  Fix MAT_HOME bug. Found by Alierak.
 --  Fix channels() against the potential of having more than an LBUF in
     channel names. Channels can only be created by Wizards, so this
     isn't an urgent issue.
 --  Fix SIGSEGV bug in ANSI_String_Copy that becomes an issue with the use
     of center/ljust/rjust. Discovered by Elmeria@Crystal Bridges.
 --  Fixed uninitialized variable in a utility function used by LROOMS().
 --  Fixed @listcommand when @addcommand'ed commands have previous aliases.
     It only affected the report.
 --  Fix '-0' display for 'think imul(1024,1024,1024,1024,1024,1024,8)'
     Reported by Alierak.
 --  Improve/fix 64-bit alignment of buffers via backpatching from MUX 2.1.
     Alierak prompted.
 --  Use A_VA name instead of equivalent literal 100. Reported by Alierak.
 --  pool_check() needed to verify PCACHE pool as well. Reported by Alierak.
 --  Fixed Prefix-without-suffix bug. Reported by Alierak.
 --  On a NetBSD/Alpha system in which sizeof(unsigned long) == 8, IPv4 mask
     validation gave false negatives.  Reported by Alierak.
 --  On same NetBSD/Alpha system, reverse-DNS slave was non-functional because
     gethostbyname() choked on the eight-byte IPv4 argument. Reported by
     Alierak.
 --  IP ranges of the form 'a.b.c.d/m' would allow 'm' to be text and take it
     as a zero value. For example, 'forbid_site 1.2.3.4/foobar' would effect
     every IP address. Too easy to shoot yourself in the foot. Reported by
     Alierak.
 --  LROOMS() would not check across the entire database. It left off
     consideration of the database's last dbref. Reported by Alierak.
 --  For exits, loc(foo) did not return the same answer as rloc(foo,1).
     Reported by Alierak.
 --  Use long signal names if they are available. Bug from MUX 1.6. Reported
     by Alierak.
 --  Fixed a memcpy/strip-ansi idiom bug in pos().  Found by Jake.  Bug
     introduced by Brazil.
 --  raw_broadcast() can be called from a signal handler and therefore, it
     shouldn't be allocating/freeing memory.
 --  After a @restart, '@list resources' reports zero open sockets. This was
     previously fixed in MUX 2.1, so we are just Backpatching.  Prompted by
     Alierak.
 --  Fixed bug in ansi() that was previously fixed, but has returned.
     ansi() returned a result that is much shorter than it needs to be.
     Reported by Alierak (both first and second time).  Brazil's bug.
 --  Backpatched some error messages for several zone functions from MUX 2.2.
 --  Don't allow children(#-1) to return all unparented dbrefs.  Bug
     from MUX 1.6.  Reported by Alierak.  I'm calling it a bug, and yet,
     there is some value in the previous behavior.
 --  Fix IF(,,,,,) from reporting an invocation error for "IFELSE".  Reported
     by Alierak.
 --  think dec(5,2) reported an invocation error for "INC". Reported by
     Alierak.
 --  Strip ANSI from argument to scramble to prevent ANSI from being
     scrambled.  Backpatched from MUX 2.1.  Prompted by Alierak.
 --  lstack(,,,) reported invocation error for "CSTACK".  Reported by Alierak.
 --  empty(,,,) reported invocation error for "CSTACK".  Reported by Alierak.
 --  items(,,,) reported invocation error for "NUMSTACK".  Reported by
     Alierak.
 --  Fixed SIGSEGV bug in vmul().  Reported by Alierak. Bug from MUX 1.6.
 --  Fixed unlikely SIGSEGV bug in function table initialization.
     Brazil's bug.  Fixed by Brazil.  Reported by Kieran Boru.
 --  OutOfMemory() and AssertionFailed() reversed sense of bCanRestart.
     Reported by Alierak.  Brazil's bug.
 --  Fixed convtime() SIGSEGV.  Reported by Alierak.  Brazil's bug.
 --  Fixed probable bug on the Win32 build where a socket could be setup as
     non-blocking.  The non-blocking behavior has not been reported or
     reproduced, but if, by chance, the right four bytes of stack memory
     were zero, a reading of the code indicates that non-blocking would have
     been de-selected instead of selected.  The Unix distribution is
     unaffected, and since this has not been reported or reproduced
     previously, the odds are good that the calling pattern with a connection
     is made doesn't allow those four bytes to be zero.  Brazil's bug.


Performance Enhancements:
~~~~~~~~~~~~~~~~~~~~~~~~
 --  The parser speed has been substantially increased: TinyExec() and 
     parse_to()
 --  Main networking loop is brief, to the point, and fast.
 --  Combined all the queues, do_second, dispatch, cache_tick, do_top, etc.
     and the way process_output and process_commands were scheduled into a 
     single unified mini-task design. Everything is now scheduled, or it 
     doesn't run.  @kick, @timewarp, @enable/disable queuing all still 
     work. The server will sleep until there is work to do or IO to 
     perform, otherwise, it will sleep for an arbitrarily long time (which 
     ight now is 5 minutes). The WinNT shovechars loop is now 12 lines long 
     (not counting blanks, braces, or comments). Alarm() has been removed 
     from the server. It caused the main networking loop to run once a 
     second regardless of whether there was anything on the queue to run or
     whether the status of any connections changes.
 --  Commands that are waiting on quota are now scheduled more fluidly.
 --  The interface for safe_copy_chr() and safe_copy_str() is now different 
     which was done to support a speed increase.
 --  Bread-and-butter dumping functions: putref, getref, putstring, and 
     getstring_noalloc have all been highly optimized for speed.
 --  Translate() and all handling of ANSI functions has been optimized in 
     terms of execution speed and also optimized in terms of using only 
     the minimal number of sequences to accomplish the color goal.
 --  ansi() is faster.
 --  Got rid of unnecessary static buffers to save memory.
 --  and(), or(), xor(), add(), mul(), max(), and min() re-written for 
     speed. They will also handle a single argument.
 --  Using ChashTable instead of the htab. The newer implementation uses 
     extendable hashing of large pages of memory. This avoid the linked 
     lists that are virtual memory hostile and keeps the server's working 
     set small. Also this structure automatically grows as necessary 
     without degrading performance.
 --  User memcpy or memmove appropriately depending on overlap assumptions. 
     Compilers deal with memcpy as an instrinsic function and so these are 
     typically the same as large structure assignments.
 --  Use stricmp, toupper, tolower as approriate instead of server's 
     variety of these same functions.
 --  Avoided a lot of unnecessary memory allocations, improved code 
     readability and performance of how help file topic names are indexed 
     when the game loads.
 --  Changed the way user attributes are stored and accessed to save a 
     duplicate copy of attribute names from memory. This saved 1.5MB of 
     memory for me.
 --  Increased the size of stream buffers for @dump and game startup.
 --  Improved performance of dbconvert when loading a DB by doing some key
     sorting.
 --  mid() was still one character too agressive.
 --  repeat() was one character too conservative.
 --  Save and restore global registers using memcpy instead of strcpy.
 --  Save and restore global registers in a few extra places in the code.
 --  Use our own tables for character typing instead of ctype.h
 --  Use MakeCanonicalAttributeName and MakeCanonicalAttributeCommand with
     their truncation, uppercasing, and validity checking done in one place
     and in one pass. And have them called from one level in the code.
     This instead of having these steps performed redundantly at
     different levels in the code.
 --  Removed cache_reset calls throughout the server as the call is a null
     operation with CHashFile.
 --  Maintain a length for the current A_LIST so we can use memcpy instead
     of strcpy for speed.
 --  Wrote DbrefToBuffer_* functions that deal with creating dbref lists
     more efficiently.
 --  Improved speed of get(), xget(), and v() by using length from the
     database layer.
 --  Improved speed of switch() by avoiding a buffer allocation.
 --  Improved speed of lt(), lte(), gt(), gte(), eq(), and neq() by 
     avoiding use of the floating point conversions when possibly.
 --  Use safe_chr instead of safe_str whereever possible for speed.
 --  Added safe_ltoa because it's faster than using
     safe_tprintf_str(buff, bufc, "%d", i);
 --  Improved speed of insert(), replace(), and ldelete() by using memcpy
     instead of strcpy.
 --  Re-wrote do_conv to avoid a buffer allocation, safe_db_copy call, etc.
 --  Re-wrote ljust() and rjust() for speed, and they do the right thing
     ANSI-wise as well.
 --  The random number generators are now given a seed which is based upon
     the full resolution of the current time (milliseconds or better) and
     the game's process id.
 --  LAST() is faster.
 --  Removed duplicate code.
 --  Improved speed and consistancy of object name checking.
 --  Use assert checking macros.
 --  Improve speed of queue argument and environment passing.
 --  Removed three unused LBUF_SIZE buffers in !RADIX_COMPRESSION builds.
 --  Rewrote parse_msglist to avoid an extra buffer. The parse is no longer
     destructive.
 --  Improved speed of Tiny_atol and Tiny_atoi64 by 68%.
 --  Improved speed of Tiny_atof by 13 times for common cases.
 --  Changed fval() to avoid using sprintf() and strip_useless_zeros for
     the common cases.
 --  Minor typo in quota.cpp that didn't change the statements logic.
 --  Fixed SIZEOF__LONG typo in code that would be very unlikely to affect any
     platform.
 --  Removed unintialized have_macros config option. Could have been an
     issue if you were running a non-DEBUG build and wanted to disable the
     comsys.
 --  Fixed SIGSEGV bug in timeutil with how the timezone offset table was
     maintained. It required three things to happen at the same time.
 --  Fixed memory leak of Bools upon a @backup or @dump/flatfile. Bug
     originated in MUX 1.6, first fixed in Chaotic MUX, and is already
     fixed in MUSH 3.0.
 --  Fixed @dbclean so that it updates the @addcommand and @function data
     structures as well.


Cosmetic Changes:
~~~~~~~~~~~~~~~~
 --  Removed the unused 'empty' column from @list hashstats.
 --  All the tools have a version number now so that you can tell that they 
     go together.
 --  README and related server docs have been reviewed and updated. 
 --  buildnum.data added into distribution.
 --  Spelling error in 'wizhelp have_macros' topic.
 --  Bug #521, #527, #529 - help topic typos.
 --  Freshened help.
 --  Changed db_load and db_unload usage message.
 --  @list hashstats report is reformated to avoid rolling over to negative
     numbers.

Miscellaneous:
~~~~~~~~~~~~~
 --  Game uses UTC time internally.
 --  Free memory properly when the game exits to allow potential memory 
     leaks to be more easily found.
 --  Source code untars into its own directory.
 --  Miscellaneous server documentation moved to docs/
 --  Increased the size trigger for rotating logfiles on Win32.
 --  Syncronized version.cpp, _build.cpp, and _build.h between Unix and Win32.
 --  No longer use vfork.
 --  Update config.guess and config.sub to support MAC OX X more conveniently.
