[PENNMUSH-ANNOUNCE] 1.7.6-patch08

dunemush at tala.mede.uic.edu dunemush at tala.mede.uic.edu
Tue Mar 25 16:00:59 CST 2003


This is patch08 to PennMUSH 1.7.6. After applying this patch, you will
have version 1.7.6p8

To apply this patch, save it to a file in your top-level MUSH directory,
and do the following:
	patch -p1 < 1.7.6-patch08
	make install

If you use GNU patch 2.2, you probably want the above to be 'patch -b -p1',
not just 'patch -p1'.

Unix (or cygwin) users need not worry about failed hunks in src/switchinc.c,
hdrs/switches.h, hdrs/cmds.h, or hdrs/funs.h. These files are automatically
rebuilt on compile.

Then @shutdown and restart your MUSH.
    - Alan/Javelin

In this patch:

Minor changes:
   * The CHANGES file has been renamed so that it always refers to
     a version number, and utils/mkvershelp.pl now generates seperate
     .hlp files for each CHANGES file. This will prevent patch hunk 
     failures when two patchlevels of different versions are released
     and both used to try to modify the same .hlp file.
   * Channel names are restricted to printable characters, with no
     leading or trailing spaces. Suggested by Letters at M*U*S*H.
   * Calling time() with any argument other than 'utc' now generates
     an error. Report by Time at M*U*S*H.
Fixes:
   * Some redundant code cleanup in look_exits suggested by Vadiv at M*U*S*H.
   * Help file fixes by Ves at M*U*S*H, Jules at M*U*S*H, Cerekk at bDv.
   * When page_aliases is on, there's a space between the player's
     name and alias. Suggested by Saturn at M3.
   * Command-checking for ZMR contents didn't function when a ZMR
     was used as a player's personal zone. Reported by BlaZe at M*U*S*H.
   * Default idle_timeout was different in code and mushcnf.dst.
     Reported by James Bond at M*U*S*H. [SW]


Prereq: 1.7.6p7
*** 1_7_6.118/Patchlevel Sat, 22 Feb 2003 11:08:23 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.1.1.7 600)
--- 1_7_6.132(w)/Patchlevel Sat, 22 Mar 2003 10:33:54 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.1.1.8 600)
***************
*** 1,2 ****
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.6p7
--- 1,2 ----
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.6p8
*** 1_7_6.118/CHANGES Sat, 22 Feb 2003 11:08:23 -0600 dunemush (pennmush/g/17_CHANGES 1.10.1.6.1.2.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.9.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1 600)
--- 1_7_6.132(w)/CHANGES.176 Sat, 22 Mar 2003 10:33:49 -0600 dunemush (pennmush/g/17_CHANGES 1.10.1.6.1.2.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.9.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1 600)
***************
*** 18,23 ****
--- 18,46 ----
  
  ==========================================================================
  
+ Version 1.7.6 patchlevel 8                      March 21, 2003
+ 
+ Minor changes:
+    * The CHANGES file has been renamed so that it always refers to
+      a version number, and utils/mkvershelp.pl now generates seperate
+      .hlp files for each CHANGES file. This will prevent patch hunk 
+      failures when two patchlevels of different versions are released
+      and both used to try to modify the same .hlp file.
+    * Channel names are restricted to printable characters, with no
+      leading or trailing spaces. Suggested by Letters at M*U*S*H.
+    * Calling time() with any argument other than 'utc' now generates
+      an error. Report by Time at M*U*S*H.
+ Fixes:
+    * Some redundant code cleanup in look_exits suggested by Vadiv at M*U*S*H.
+    * Help file fixes by Ves at M*U*S*H, Jules at M*U*S*H, Cerekk at bDv.
+    * When page_aliases is on, there's a space between the player's
+      name and alias. Suggested by Saturn at M3.
+    * Command-checking for ZMR contents didn't function when a ZMR
+      was used as a player's personal zone. Reported by BlaZe at M*U*S*H.
+    * Default idle_timeout was different in code and mushcnf.dst.
+      Reported by James Bond at M*U*S*H. [SW]
+ 
+ 
  Version 1.7.6 patchlevel 7                      February 20, 2003
  
  Fixes:
*** 1_7_6.118/game/txt/hlp/pennfunc.hlp Mon, 30 Dec 2002 19:01:02 -0600 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.1.1.1 600)
--- 1_7_6.132(w)/game/txt/hlp/pennfunc.hlp Tue, 18 Mar 2003 15:57:11 -0600 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1 600)
***************
*** 3454,3465 ****
    attribute, %# refers to the original enactor and not the 'calling' object;
    'me' refers to the object that supplied the attribute.
   
!   However, unlike the u() function, the global registers r(0) through r(9)
!   (%q0 - %q9) are preserved in their initial state. This means that functions
!   "below" the level of the u() can reset global registers for temporary
!   calculations, without needing to worry about "clobbering" the original
!   values.
!  
    This makes ulocal() particularly useful for global or shared code which
    calls arbitrary u() functions, where global register values need to be
    preserved from accidental user clobbering.
--- 3454,3465 ----
    attribute, %# refers to the original enactor and not the 'calling' object;
    'me' refers to the object that supplied the attribute.
   
!   However, unlike the u() function, the global registers r(0)-r(9) and
!   r(A)-r(Z) (%q0-%q9, %qa-%qz) are preserved in their initial state. This
!   means that functions "below" the level of the u() can reset global
!   registers for temporary calculations, without needing to worry about
!   "clobbering" the original values.
! 
    This makes ulocal() particularly useful for global or shared code which
    calls arbitrary u() functions, where global register values need to be
    preserved from accidental user clobbering.
*** 1_7_6.118/game/txt/hlp/pennflag.hlp Sun, 22 Dec 2002 00:51:08 -0600 dunemush (pennmush/17_pennflag.h 1.1.1.1.1.2.1.1.1.2.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.4.1.2 600)
--- 1_7_6.132(w)/game/txt/hlp/pennflag.hlp Sat, 15 Mar 2003 20:25:47 -0600 dunemush (pennmush/17_pennflag.h 1.1.1.1.1.2.1.1.1.2.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.4.1.2.2.1 600)
***************
*** 46,58 ****
    V - Visual            W - Wizard              X - Safe
    Z - Shared, Z_Tel
    
!   a - Audible           b - Debug               c - Connected, Cloudy
    d - Destroy_Ok        e - Enter_Ok            g - Gagged
    h - Halt              j - Jury_Ok             l - Light             
    m - Myopic            n - No_Command          o - On-Vacation
    p - Puppet, Paranoid  r - Royalty             s - Suspect
    t - Transparent       u - Uninspected         v - Verbose
!   w - No_Warn           x - Terse               ? - Unregistered
    ^ - Listen_Parent     ~ - Noaccents
  ---------------------------------------------------------------------
  Some flags may not be enabled on some MUSHes.
--- 46,58 ----
    V - Visual            W - Wizard              X - Safe
    Z - Shared, Z_Tel
    
!   a - Audible           b - Debug               c - Connected
    d - Destroy_Ok        e - Enter_Ok            g - Gagged
    h - Halt              j - Jury_Ok             l - Light             
    m - Myopic            n - No_Command          o - On-Vacation
    p - Puppet, Paranoid  r - Royalty             s - Suspect
    t - Transparent       u - Uninspected         v - Verbose
!   w - No_Warn           x - Terse, Cloudy       ? - Unregistered
    ^ - Listen_Parent     ~ - Noaccents
  ---------------------------------------------------------------------
  Some flags may not be enabled on some MUSHes.
*** 1_7_6.118/game/txt/hlp/penncmd.hlp Tue, 17 Dec 2002 15:56:03 -0600 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.10.1.1.1.1.1.1 600)
--- 1_7_6.132(w)/game/txt/hlp/penncmd.hlp Sun, 23 Feb 2003 16:09:29 -0600 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.10.1.1.1.1.1.1.1.1 600)
***************
*** 2448,2454 ****
    @remit[/switches] <object> = <message>.
  
    Sends the message to all contents of <object>, which can be a room,
!   thing, or player. (The TinyMUSH equivalent is @pemit/contents).
  
    The /silent switch stops the remitter from getting feedback if they're
     in a different location than the target.
--- 2448,2455 ----
    @remit[/switches] <object> = <message>.
  
    Sends the message to all contents of <object>, which can be a room,
!   thing, or player. The message is also sent to the <object> itself.
!   (The TinyMUSH equivalent is @pemit/contents).
  
    The /silent switch stops the remitter from getting feedback if they're
     in a different location than the target.
*** 1_7_6.118/src/switchinc.c Sat, 22 Feb 2003 11:08:23 -0600 dunemush (pennmush/b/32_switchinc. 1.3.1.2.1.6.1.18.1.2.1.2.2.5.1.4.2.4.1.1.1.2.1.5.1.2.1.5.2.1.1.31.3.4.1.5.1.2 660)
--- 1_7_6.132(w)/src/switchinc.c Sat, 22 Mar 2003 10:37:08 -0600 dunemush (pennmush/b/32_switchinc. 1.3.1.2.1.6.1.18.1.2.1.2.2.5.1.4.2.4.1.1.1.2.1.5.1.2.1.5.2.1.1.31.3.4.1.5.1.3 660)
***************
*** 132,136 ****
    {"WIZARD", SWITCH_WIZARD},
    {"YES", SWITCH_YES},
    {"ZONE", SWITCH_ZONE},
! {NULL, 0}
  };
--- 132,136 ----
    {"WIZARD", SWITCH_WIZARD},
    {"YES", SWITCH_YES},
    {"ZONE", SWITCH_ZONE},
!   {NULL, 0}
  };
*** 1_7_6.118/src/speech.c Sun, 22 Dec 2002 01:40:58 -0600 dunemush (pennmush/b/35_speech.c 1.21.1.2.1.3.1.5.1.1.1.7.1.3.1.1.1.8.1.1.1.1.1.1.1.10.1.2.1.13.2.4.1.1 660)
--- 1_7_6.132(w)/src/speech.c Sat, 22 Mar 2003 10:37:07 -0600 dunemush (pennmush/b/35_speech.c 1.21.1.2.1.3.1.5.1.1.1.7.1.3.1.1.1.8.1.1.1.1.1.1.1.10.1.2.1.13.2.4.1.1.3.1 660)
***************
*** 828,834 ****
  
    /* Figure out the 'name' of the player */
    if (PAGE_ALIASES && (a = atr_get_noparent(player, "ALIAS")))
!     current = tprintf("%s(%s)", Name(player), uncompress(a->value));
    else
      current = (char *) Name(player);
  
--- 828,834 ----
  
    /* Figure out the 'name' of the player */
    if (PAGE_ALIASES && (a = atr_get_noparent(player, "ALIAS")))
!     current = tprintf("%s (%s)", Name(player), uncompress(a->value));
    else
      current = (char *) Name(player);
  
*** 1_7_6.118/src/look.c Thu, 26 Dec 2002 14:20:42 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.1.1.1 660)
--- 1_7_6.132(w)/src/look.c Sat, 22 Mar 2003 10:37:06 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.1.1.1.1.1 660)
***************
*** 124,180 ****
      mush_free((Malloc_t) buff, "string");
      return;
    }
!   if (COMMA_EXIT_LIST) {
!     if (Dark(loc)) {
!       for (thing = Exits(loc); thing != NOTHING; thing = Next(thing)) {
! 	if (!(DarkLegal(thing)) && Light(thing)) {
! 	  total_count++;
! 	  if (!Transparented(loc) || Opaque(thing))
! 	    exit_count++;
! 	}
        }
-     } else {
-       for (thing = Exits(loc); thing != NOTHING; thing = Next(thing)) {
- 	if (!(DarkLegal(thing))) {
- 	  total_count++;
- 	  if (!Transparented(loc) || Opaque(thing))
- 	    exit_count++;
- 	}
-       }
-     }
-     if (total_count == 0) {
-       mush_free((Malloc_t) tbuf1, "string");
-       mush_free((Malloc_t) tbuf2, "string");
-       mush_free((Malloc_t) nbuf, "string");
-       return;
      }
-     thing = Exits(loc);
- 
    } else {
! 
!     /* Scan the room and see if there are any visible exits */
!     if (Dark(loc))
!       for (thing = Exits(loc);
! 	   (thing != NOTHING) && (DarkLegal(thing) || !Light(thing));
! 	   thing = Next(thing)) ;
!     else
!       for (thing = Exits(loc);
! 	   (thing != NOTHING) && DarkLegal(thing); thing = Next(thing)) ;
!     if (thing == NOTHING) {
!       mush_free((Malloc_t) tbuf1, "string");
!       mush_free((Malloc_t) tbuf2, "string");
!       mush_free((Malloc_t) nbuf, "string");
!       return;
      }
    }
  
    PUSE;
    tag_wrap("FONT", "SIZE=+1", exit_name);
    PEND;
    notify_by(loc, player, pbuff);
  
!   for (; thing != NOTHING; thing = Next(thing)) {
!     if (Name(thing) && !DarkLegal(thing) && (!Dark(loc) || Light(thing))) {
        strcpy(pbuff, Name(thing));
        if ((p = strchr(pbuff, ';')))
  	*p = '\0';
--- 124,162 ----
      mush_free((Malloc_t) buff, "string");
      return;
    }
!   /* Scan the room and see if there are any visible exits */
!   if (Dark(loc)) {
!     for (thing = Exits(loc); thing != NOTHING; thing = Next(thing)) {
!       if (!(DarkLegal(thing)) && Light(thing)) {
! 	total_count++;
! 	if (!Transparented(loc) || Opaque(thing))
! 	  exit_count++;
        }
      }
    } else {
!     for (thing = Exits(loc); thing != NOTHING; thing = Next(thing)) {
!       if (!(DarkLegal(thing))) {
! 	total_count++;
! 	if (!Transparented(loc) || Opaque(thing))
! 	  exit_count++;
!       }
      }
    }
+   if (total_count == 0) {
+     /* No visible exits. We are outta here */
+     mush_free((Malloc_t) tbuf1, "string");
+     mush_free((Malloc_t) tbuf2, "string");
+     mush_free((Malloc_t) nbuf, "string");
+     return;
+   }
  
    PUSE;
    tag_wrap("FONT", "SIZE=+1", exit_name);
    PEND;
    notify_by(loc, player, pbuff);
  
!   for (thing = Exits(loc); thing != NOTHING; thing = Next(thing)) {
!     if (!DarkLegal(thing) && (!Dark(loc) || Light(thing))) {
        strcpy(pbuff, Name(thing));
        if ((p = strchr(pbuff, ';')))
  	*p = '\0';
*** 1_7_6.118/src/game.c Mon, 06 Jan 2003 12:48:49 -0600 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.4.1.1.1.1.1.1.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.5.1.3.1.2.1.2.1.1.1.1 660)
--- 1_7_6.132(w)/src/game.c Sat, 22 Mar 2003 10:37:06 -0600 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.4.1.1.1.1.1.1.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.5.1.3.1.2.1.2.1.1.1.1.1.1 660)
***************
*** 931,958 ****
  	if (DO_GLOBALS && IsRoom(Zone(Location(player)))) {
  
  	  /* zone of player's location is a zone master room */
! 
! 	  if (Location(player) != Zone(player)) {
! 
! 	    /* check zone master room exits */
! 	    if (remote_exit(player, cptr)) {
! 	      if (!Mobile(player))
! 		goto done;
! 	      else {
! 		do_move(player, cptr, 2);
! 		goto done;
! 	      }
! 	    } else
! 	      /* check commands in the zone master room if no exits
! 	       * can match more than one $command in zone master room
! 	       */
! 	      a += list_match(Contents(Zone(Location(player))));
! 	  }			/* end of zone master room check */
  	} else
- 	  /* try matching commands on area zone object if GLOBALS
- 	   * aren't in use or zone object isn't a room
- 	   */
- 	if ((!a) && (Zone(Location(player)) != NOTHING))
  	  a += cmd_match(Zone(Location(player)));
        }
        /* end of matching on zone of player's location */
--- 931,950 ----
  	if (DO_GLOBALS && IsRoom(Zone(Location(player)))) {
  
  	  /* zone of player's location is a zone master room */
! 	  /* check zone master room exits */
! 	  if (remote_exit(player, cptr)) {
! 	    if (!Mobile(player))
! 	      goto done;
! 	    else {
! 	      do_move(player, cptr, 2);
! 	      goto done;
! 	    }
! 	  } else
! 	    /* check commands in the zone master room if no exits
! 	     * can match more than one $command in zone master room
! 	     */
! 	    a += list_match(Contents(Zone(Location(player))));
  	} else
  	  a += cmd_match(Zone(Location(player)));
        }
        /* end of matching on zone of player's location */
***************
*** 961,967 ****
         */
        if ((!a) && (Zone(player) != NOTHING) &&
  	  (Zone(Location(player)) != Zone(player))) {
! 	a += cmd_match(Zone(player));
        }
        /* end of zone stuff */
        if (DO_GLOBALS) {
--- 953,965 ----
         */
        if ((!a) && (Zone(player) != NOTHING) &&
  	  (Zone(Location(player)) != Zone(player))) {
! 	if (DO_GLOBALS && IsRoom(Zone(player)))
! 	  /* Player's personal zone is a zone master room, so we
! 	   * also check commands on objects in that room
! 	   */
! 	  a += list_match(Contents(Zone(player)));
! 	else
! 	  a += cmd_match(Zone(player));
        }
        /* end of zone stuff */
        if (DO_GLOBALS) {
***************
*** 989,994 ****
--- 987,993 ----
  	do_log(LT_HUH, player, 0, "%s", unp);
      }
    }
+ 
    /* command has been executed. Free up memory. */
  
  done:
***************
*** 1282,1295 ****
  			num, atrname);
  	}
        }
!       ptr = atrname;
!       if ((Zone(player) != NOTHING) && (Zone(player) != Zone(Location(player)))) {
! 	/* check the player's personal zone */
! 	if (ScanFind(player, Zone(player))) {
! 	  *ptr = '\0';
! 	  notify_format(player, T("Matched personal zone: %s  [%d:%s]"),
! 			unparse_object(player, Zone(player)), num, atrname);
  	}
        }
      }
    }
--- 1281,1306 ----
  			num, atrname);
  	}
        }
!     }
!     ptr = atrname;
!     if ((Zone(player) != NOTHING) && (Zone(player) != Zone(Location(player)))) {
!       /* check the player's personal zone */
!       if (IsRoom(Zone(player))) {
! 	if (Location(player) != Zone(player)) {
! 	  notify(player, T("Matches on personal zone master room:"));
! 	  DOLIST(thing, Contents(Zone(player))) {
! 	    if (ScanFind(player, thing)) {
! 	      *ptr = '\0';
! 	      notify_format(player, "%s  [%d:%s]",
! 			    unparse_object(player, thing), num, atrname);
! 	      ptr = atrname;
! 	    }
! 	  }
  	}
+       } else if (ScanFind(player, Zone(player))) {
+ 	*ptr = '\0';
+ 	notify_format(player, T("Matched personal zone: %s  [%d:%s]"),
+ 		      unparse_object(player, Zone(player)), num, atrname);
        }
      }
    }
***************
*** 1326,1332 ****
    char placestr[10];
    int j;
    char delim = ' ';
- 
    if (!command || !*command) {
      notify(player, T("What do you want to do with the list?"));
      if (flags & DOL_NOTIFY)
--- 1337,1342 ----
***************
*** 1349,1364 ****
      wnxt[j] = wenv[j];
    for (j = 0; j < NUMQ; j++)
      rnxt[j] = renv[j];
- 
    bp = outbuf;
- 
    if (flags & DOL_DELIM)
      list += 2;
- 
    place = 0;
- 
    objstring = trim_space_sep(list, delim);
- 
    if (objstring && !*objstring) {
      /* Blank list */
      if (flags & DOL_NOTIFY)
--- 1359,1369 ----
***************
*** 1370,1383 ****
      curr = split_token(&objstring, delim);
      place++;
      sprintf(placestr, "%d", place);
- 
      if (!(flags & DOL_MAP)) {
        /* @dolist, queue command */
        bind_and_queue(player, cause, command, curr, placestr);
      } else {
        const char *replace[2];
        char *ebuf, *ebufptr;
- 
        /* it's @map, add to the output list */
        if (bp != outbuf)
  	safe_chr(delim, outbuf, &bp);
--- 1375,1386 ----
***************
*** 1391,1397 ****
    }
  
    *bp = '\0';
- 
    if (flags & DOL_MAP) {
      /* if we're doing a @map, copy the list to an attribute */
      (void) atr_add(player, "MAPLIST", outbuf, GOD, NOTHING);
--- 1394,1399 ----
***************
*** 1412,1418 ****
  {
    char tbuf1[BUFFER_LEN];
    char *p;
- 
  #if defined(HAS_UPTIME) && !defined(linux)
    FILE *fp;
    char c;
--- 1414,1419 ----
***************
*** 1428,1484 ****
    char line[128];		/* Overkill */
    char *nl;
  #endif
- 
    sprintf(tbuf1, T("     Up since: %s"), ctime(&first_start_time));
    if ((p = strchr(tbuf1, '\n')))
      *p = '\0';
    notify(player, tbuf1);
- 
    sprintf(tbuf1, T("  Last reboot: %s"), ctime(&start_time));
    if ((p = strchr(tbuf1, '\n')))
      *p = '\0';
    notify(player, tbuf1);
- 
    sprintf(tbuf1, T("Total reboots: %d"), reboot_count);
    notify(player, tbuf1);
- 
    sprintf(tbuf1, T("   Time now: %s"), ctime(&mudtime));
    if ((p = strchr(tbuf1, '\n')))
      *p = '\0';
    notify(player, tbuf1);
- 
    /* calculate times until various events */
    notify_format(player,
! 		T("Time until next database save: %ld minutes %ld seconds."),
  		(options.dump_counter - mudtime) / 60,
  		(options.dump_counter - mudtime) % 60);
    notify_format(player,
! 		T("   Time until next dbck check: %ld minutes %ld seconds."),
  		(options.dbck_counter - mudtime) / 60,
  		(options.dbck_counter - mudtime) % 60);
    notify_format(player,
! 		T("        Time until next purge: %ld minutes %ld seconds."),
  		(options.purge_counter - mudtime) / 60,
  		(options.purge_counter - mudtime) % 60);
  #ifdef USE_WARNINGS
    if (options.warn_interval)
      notify_format(player,
! 		  T("    Time until next @warnings: %ld minutes %ld seconds."),
  		  (options.warn_counter - mudtime) / 60,
  		  (options.warn_counter - mudtime) % 60);
  #endif
- 
    /* Mortals, go no further! */
    if (!Wizard(player) || mortal)
      return;
  #ifdef linux
    /* Use /proc files instead of calling the external uptime program on linux */
- 
    /* Current time */
    {
      struct tm *t;
      t = localtime(&mudtime);
- 
      strftime(tbuf1, sizeof tbuf1, "%I:%M%p ", t);
      nl = tbuf1 + strlen(tbuf1);
    }
--- 1429,1481 ----
    char line[128];		/* Overkill */
    char *nl;
  #endif
    sprintf(tbuf1, T("     Up since: %s"), ctime(&first_start_time));
    if ((p = strchr(tbuf1, '\n')))
      *p = '\0';
    notify(player, tbuf1);
    sprintf(tbuf1, T("  Last reboot: %s"), ctime(&start_time));
    if ((p = strchr(tbuf1, '\n')))
      *p = '\0';
    notify(player, tbuf1);
    sprintf(tbuf1, T("Total reboots: %d"), reboot_count);
    notify(player, tbuf1);
    sprintf(tbuf1, T("   Time now: %s"), ctime(&mudtime));
    if ((p = strchr(tbuf1, '\n')))
      *p = '\0';
    notify(player, tbuf1);
    /* calculate times until various events */
    notify_format(player,
! 		T
! 		("Time until next database save: %ld minutes %ld seconds."),
  		(options.dump_counter - mudtime) / 60,
  		(options.dump_counter - mudtime) % 60);
    notify_format(player,
! 		T
! 		("   Time until next dbck check: %ld minutes %ld seconds."),
  		(options.dbck_counter - mudtime) / 60,
  		(options.dbck_counter - mudtime) % 60);
    notify_format(player,
! 		T
! 		("        Time until next purge: %ld minutes %ld seconds."),
  		(options.purge_counter - mudtime) / 60,
  		(options.purge_counter - mudtime) % 60);
  #ifdef USE_WARNINGS
    if (options.warn_interval)
      notify_format(player,
! 		  T
! 		  ("    Time until next @warnings: %ld minutes %ld seconds."),
  		  (options.warn_counter - mudtime) / 60,
  		  (options.warn_counter - mudtime) % 60);
  #endif
    /* Mortals, go no further! */
    if (!Wizard(player) || mortal)
      return;
  #ifdef linux
    /* Use /proc files instead of calling the external uptime program on linux */
    /* Current time */
    {
      struct tm *t;
      t = localtime(&mudtime);
      strftime(tbuf1, sizeof tbuf1, "%I:%M%p ", t);
      nl = tbuf1 + strlen(tbuf1);
    }
***************
*** 1510,1516 ****
      if (fgets(line, sizeof line, fp)) {
        double load[3];
        char *x, *l = line;
- 
        load[0] = strtod(l, &x);
        l = x;
        load[1] = strtod(l, &x);
--- 1507,1512 ----
***************
*** 1528,1534 ****
  
    *nl = '\0';
    notify(player, tbuf1);
- 
  #else				/* linux */
  #ifdef HAS_UPTIME
    fp =
--- 1524,1529 ----
***************
*** 1536,1542 ****
      (FILE *)
  #endif
      popen(UPTIME_PATH, "r");
- 
    /* just in case the system is screwy */
    if (fp == NULL) {
      notify(player, T("Error -- cannot execute uptime."));
--- 1531,1536 ----
***************
*** 1548,1582 ****
      tbuf1[i] = c;
    tbuf1[i] = '\0';
    pclose(fp);
- 
    notify(player, tbuf1);
  #endif				/* HAS_UPTIME */
  #endif				/* !linux */
- 
    /* do process stats */
- 
    pid = getpid();
    psize = getpagesize();
!   notify_format(player, T("\nProcess ID:  %10u        %10d bytes per page"),
  		pid, psize);
- 
  #ifdef linux
    /* Linux's getrusage() is mostly unimplemented. Just has times, page faults
       and swapouts. We use /proc/self/status */
- 
  #ifdef HAS_GETRUSAGE
    getrusage(RUSAGE_SELF, &usage);
    notify_format(player, T("Time used:   %10ld user   %10ld sys"),
  		usage.ru_utime.tv_sec, usage.ru_stime.tv_sec);
    notify_format(player,
! 		T("Page faults: %10ld hard   %10ld soft    %10ld swapouts"),
  		usage.ru_majflt, usage.ru_minflt, usage.ru_nswap);
  #endif
- 
    fp = fopen("/proc/self/status", "r");
    if (!fp)
      return;
- 
    /* Skip lines we don't care about. */
    while (fgets(line, sizeof line, fp) != NULL) {
      static const char *fields[] = {
--- 1542,1571 ----
      tbuf1[i] = c;
    tbuf1[i] = '\0';
    pclose(fp);
    notify(player, tbuf1);
  #endif				/* HAS_UPTIME */
  #endif				/* !linux */
    /* do process stats */
    pid = getpid();
    psize = getpagesize();
!   notify_format(player,
! 		T("\nProcess ID:  %10u        %10d bytes per page"),
  		pid, psize);
  #ifdef linux
    /* Linux's getrusage() is mostly unimplemented. Just has times, page faults
       and swapouts. We use /proc/self/status */
  #ifdef HAS_GETRUSAGE
    getrusage(RUSAGE_SELF, &usage);
    notify_format(player, T("Time used:   %10ld user   %10ld sys"),
  		usage.ru_utime.tv_sec, usage.ru_stime.tv_sec);
    notify_format(player,
! 		T
! 		("Page faults: %10ld hard   %10ld soft    %10ld swapouts"),
  		usage.ru_majflt, usage.ru_minflt, usage.ru_nswap);
  #endif
    fp = fopen("/proc/self/status", "r");
    if (!fp)
      return;
    /* Skip lines we don't care about. */
    while (fgets(line, sizeof line, fp) != NULL) {
      static const char *fields[] = {
***************
*** 1584,1590 ****
        "SigPnd:", "SigBlk:", "SigIgn:", "SigCgt:", NULL
      };
      int n;
- 
      for (n = 0; fields[n]; n++) {
        Size_t len = strlen(fields[n]);
        if (strncmp(line, fields[n], len) == 0) {
--- 1573,1578 ----
***************
*** 1596,1602 ****
    }
  
    fclose(fp);
- 
  #else				/* LINUX */
  #ifdef HAS_GETRUSAGE
    getrusage(RUSAGE_SELF, &usage);
--- 1584,1589 ----
***************
*** 1608,1628 ****
  		"Integral mem:%10ld shared %10ld private %10ld stack",
  		usage.ru_ixrss, usage.ru_idrss, usage.ru_isrss);
    notify_format(player,
! 		T("Page faults: %10ld hard   %10ld soft    %10ld swapouts"),
  		usage.ru_majflt, usage.ru_minflt, usage.ru_nswap);
!   notify_format(player,
! 		T("Disk I/O:    %10ld reads  %10ld writes"),
  		usage.ru_inblock, usage.ru_oublock);
!   notify_format(player,
! 		T("Network I/O: %10ld in     %10ld out"), usage.ru_msgrcv,
! 		usage.ru_msgsnd);
!   notify_format(player,
! 		T("Context swi: %10ld vol    %10ld forced"), usage.ru_nvcsw,
! 		usage.ru_nivcsw);
    notify_format(player, "Signals:     %10ld", usage.ru_nsignals);
  #endif				/* HAS_GETRUSAGE */
  #endif				/* LINUX */
- 
  #ifdef WIN32
    Win32stats(player);
  #endif
--- 1595,1612 ----
  		"Integral mem:%10ld shared %10ld private %10ld stack",
  		usage.ru_ixrss, usage.ru_idrss, usage.ru_isrss);
    notify_format(player,
! 		T
! 		("Page faults: %10ld hard   %10ld soft    %10ld swapouts"),
  		usage.ru_majflt, usage.ru_minflt, usage.ru_nswap);
!   notify_format(player, T("Disk I/O:    %10ld reads  %10ld writes"),
  		usage.ru_inblock, usage.ru_oublock);
!   notify_format(player, T("Network I/O: %10ld in     %10ld out"),
! 		usage.ru_msgrcv, usage.ru_msgsnd);
!   notify_format(player, T("Context swi: %10ld vol    %10ld forced"),
! 		usage.ru_nvcsw, usage.ru_nivcsw);
    notify_format(player, "Signals:     %10ld", usage.ru_nsignals);
  #endif				/* HAS_GETRUSAGE */
  #endif				/* LINUX */
  #ifdef WIN32
    Win32stats(player);
  #endif
***************
*** 1756,1762 ****
  extern PTAB ptab_command;
  extern PTAB ptab_attrib;
  extern PTAB ptab_flag;
- 
  void
  do_list_memstats(dbref player)
  {
--- 1740,1745 ----
***************
*** 1769,1800 ****
    hash_stats(player, &htab_player_list, "Players");
    hash_stats(player, &htab_reserved_aliases, "Aliases");
    hash_stats(player, &help_files, "HelpFiles");
- 
    notify(player, "Prefix Trees:");
    ptab_stats_header(player);
    ptab_stats(player, &ptab_attrib, "AttrPerms");
    ptab_stats(player, &ptab_command, "Commands");
    ptab_stats(player, &ptab_flag, "Flags");
- 
    notify(player, "String Trees:");
    st_stats_header(player);
- 
    st_stats(player, &atr_names, "AttrNames");
    st_stats(player, &object_names, "ObjNames");
    st_stats(player, &lock_names, "LockNames");
- 
  #if (COMPRESSION_TYPE >= 3) && defined(COMP_STATS)
    if (Wizard(player)) {
      long items, used, total_comp, total_uncomp;
      double percent;
      compress_stats(&items, &used, &total_uncomp, &total_comp);
      notify(player, "---------- Internal attribute compression  ----------");
-     notify_format(player, "%10ld compression table items used, "
- 		  "taking %ld bytes.", items, used);
      notify_format(player,
! 		  "%10ld bytes in text before compression. ", total_uncomp);
!     notify_format(player,
! 		  "%10ld bytes in text AFTER  compression. ", total_comp);
      percent = ((float) (total_comp)) / ((float) total_uncomp) * 100.0;
      notify_format(player,
  		  "%10.0f %% text    compression ratio (lower is better). ",
--- 1752,1780 ----
    hash_stats(player, &htab_player_list, "Players");
    hash_stats(player, &htab_reserved_aliases, "Aliases");
    hash_stats(player, &help_files, "HelpFiles");
    notify(player, "Prefix Trees:");
    ptab_stats_header(player);
    ptab_stats(player, &ptab_attrib, "AttrPerms");
    ptab_stats(player, &ptab_command, "Commands");
    ptab_stats(player, &ptab_flag, "Flags");
    notify(player, "String Trees:");
    st_stats_header(player);
    st_stats(player, &atr_names, "AttrNames");
    st_stats(player, &object_names, "ObjNames");
    st_stats(player, &lock_names, "LockNames");
  #if (COMPRESSION_TYPE >= 3) && defined(COMP_STATS)
    if (Wizard(player)) {
      long items, used, total_comp, total_uncomp;
      double percent;
      compress_stats(&items, &used, &total_uncomp, &total_comp);
      notify(player, "---------- Internal attribute compression  ----------");
      notify_format(player,
! 		  "%10ld compression table items used, "
! 		  "taking %ld bytes.", items, used);
!     notify_format(player, "%10ld bytes in text before compression. ",
! 		  total_uncomp);
!     notify_format(player, "%10ld bytes in text AFTER  compression. ",
! 		  total_comp);
      percent = ((float) (total_comp)) / ((float) total_uncomp) * 100.0;
      notify_format(player,
  		  "%10.0f %% text    compression ratio (lower is better). ",
***************
*** 1819,1825 ****
    if (God(player))
      list_mem_check(player);
  #endif
- 
  }
  
  char *
--- 1799,1804 ----
***************
*** 1829,1835 ****
  {
    static char result[BUFFER_LEN];	/* STATIC! */
    /* Unlink the last the_epoch and create a new one */
- 
    sprintf(result, "%s.#%d#", basename, the_epoch - 1);
    unlink(result);
    sprintf(result, "%s.#%d#", basename, the_epoch);
--- 1808,1813 ----
*** 1_7_6.118/src/funtime.c Sat, 30 Nov 2002 15:49:22 -0600 dunemush (pennmush/c/12_funtime.c 1.11.1.14 660)
--- 1_7_6.132(w)/src/funtime.c Sat, 22 Mar 2003 10:37:06 -0600 dunemush (pennmush/c/12_funtime.c 1.11.1.14.1.1 660)
***************
*** 82,89 ****
    char *s;
    struct tm *t;
  
!   if ((nargs == 1 && strcasecmp("UTC", args[0]) == 0) ||
!       strcmp("UTCTIME", called_as) == 0)
      t = gmtime(&mudtime);
    else
      t = localtime(&mudtime);
--- 82,95 ----
    char *s;
    struct tm *t;
  
!   if (nargs == 1) {
!     if (!strcasecmp("UTC", args[0]))
!       t = gmtime(&mudtime);
!     else {
!       safe_str(T("#-1 INVALID TIME ZONE"), buff, bp);
!       return;
!     }
!   } else if (!strcmp("UTCTIME", called_as))
      t = gmtime(&mudtime);
    else
      t = localtime(&mudtime);
*** 1_7_6.118/src/extchat.c Mon, 20 Jan 2003 16:17:39 -0600 dunemush (pennmush/c/23_extchat.c 1.1.1.1.1.1.1.1.1.2.1.1.1.3.1.1.1.5.1.1.1.1.1.5.1.2.1.3.1.3.1.1.1.4.1.2.1.6.1.2.1.1.2.4.2.9.1.2.1.2.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.2.1.1.2.1.1.2.1.1.1.1 660)
--- 1_7_6.132(w)/src/extchat.c Sat, 22 Mar 2003 10:37:04 -0600 dunemush (pennmush/c/23_extchat.c 1.1.1.1.1.1.1.1.1.2.1.1.1.3.1.1.1.5.1.1.1.1.1.5.1.2.1.3.1.3.1.1.1.4.1.2.1.6.1.2.1.1.2.4.2.9.1.2.1.2.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.2.1.1.2.1.1.2.1.1.1.1.1.1 660)
***************
*** 72,77 ****
--- 72,78 ----
  static void channel_join_self(dbref player, const char *name);
  static void channel_leave_self(dbref player, const char *name);
  static void do_channel_who(dbref player, CHAN *chan);
+ static int ok_channel_name(const char *n);
  
  const char *chan_speak_lock = "ChanSpeakLock";
  const char *chan_join_lock = "ChanJoinLock";
***************
*** 1331,1336 ****
--- 1332,1341 ----
        notify(player, T("The channel needs a shorter name."));
        return;
      }
+     if (!ok_channel_name(name)) {
+       notify(player, T("Invalid name for a channel."));
+       return;
+     }
      if (!Hasprivs(player) && !canstilladd(player)) {
        notify(player, T("You already own too many channels."));
        return;
***************
*** 1466,1471 ****
--- 1471,1507 ----
    }
  }
  
+ static int
+ ok_channel_name(const char *n)
+ {
+   /* is name valid for a channel? */
+   const char *p;
+   char name[BUFFER_LEN];
+ 
+   strcpy(name, remove_markup(n, NULL));
+ 
+   if (!name || !*name)
+     return 0;
+ 
+   /* No leading spaces */
+   if (isspace((unsigned char) *name))
+     return 0;
+ 
+   /* only printable characters */
+   for (p = name; p && *p; p++) {
+     if (!isprint((unsigned char) *p))
+       return 0;
+   }
+ 
+   /* No trailing spaces */
+   p--;
+   if (isspace((unsigned char) *p))
+     return 0;
+ 
+   return 1;
+ }
+ 
+ 
  void
  do_chan_user_flags(player, name, isyn, flag, silent)
      dbref player;
*** 1_7_6.118/src/conf.c Tue, 17 Dec 2002 15:56:03 -0600 dunemush (pennmush/c/31_conf.c 1.41.2.3.1.3.1.2.1.15.1.1.1.1 660)
--- 1_7_6.132(w)/src/conf.c Sat, 22 Mar 2003 10:37:04 -0600 dunemush (pennmush/c/31_conf.c 1.41.2.3.1.3.1.2.1.15.1.1.1.1.1.1 660)
***************
*** 799,805 ****
    options.player_start = 0;
    options.master_room = 2;
    options.base_room = 0;
!   options.idle_timeout = 10801;
    options.dump_interval = 3601;
    strcpy(options.dump_message,
  	 T("GAME: Dumping database. Game may freeze for a minute"));
--- 799,805 ----
    options.player_start = 0;
    options.master_room = 2;
    options.base_room = 0;
!   options.idle_timeout = 0;
    options.dump_interval = 3601;
    strcpy(options.dump_message,
  	 T("GAME: Dumping database. Game may freeze for a minute"));
*** 1_7_6.118/hdrs/version.h Sat, 22 Feb 2003 11:08:23 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.17.1.2.1.6 660)
--- 1_7_6.132(w)/hdrs/version.h Sat, 22 Mar 2003 10:37:09 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.17.1.2.1.7 660)
***************
*** 1,2 ****
! #define VERSION "PennMUSH version 1.7.6 patchlevel 7 [02/20/2003]"
! #define SHORTVN "PennMUSH 1.7.6p7"
--- 1,2 ----
! #define VERSION "PennMUSH version 1.7.6 patchlevel 8 [03/21/2003]"
! #define SHORTVN "PennMUSH 1.7.6p8"
*** 1_7_6.118/Makefile.SH Wed, 30 Oct 2002 14:50:55 -0600 dunemush (pennmush/d/30_Makefile.S 1.14.1.1.1.7 700)
--- 1_7_6.132(w)/Makefile.SH Sun, 23 Feb 2003 10:43:13 -0600 dunemush (pennmush/d/30_Makefile.S 1.14.1.1.1.7.1.1 700)
***************
*** 121,127 ****
  
  versions: CHANGES*
  	-rm -rf CHANGES*~ CHANGES*bak
! 	utils/mkvershlp.pl game/txt/hlp/pennvers.hlp CHANGES*
  
  safety:
  	$(CP) src/*.c /var/pennmush-bak/src
--- 121,127 ----
  
  versions: CHANGES*
  	-rm -rf CHANGES*~ CHANGES*bak
! 	utils/mkvershlp.pl game/txt/hlp CHANGES*
  
  safety:
  	$(CP) src/*.c /var/pennmush-bak/src
*** 1_7_6.118/MANIFEST Mon, 11 Nov 2002 20:39:30 -0600 dunemush (pennmush/d/34_MANIFEST 1.21.1.2.1.7.1.3 600)
--- 1_7_6.132(w)/MANIFEST Sun, 23 Feb 2003 10:59:21 -0600 dunemush (pennmush/d/34_MANIFEST 1.21.1.2.1.7.1.3.1.1 600)
***************
*** 1,5 ****
  Patchlevel
! CHANGES
  MANIFEST
  options.h.dist
  Configure
--- 1,5 ----
  Patchlevel
! CHANGES.176
  MANIFEST
  options.h.dist
  Configure
***************
*** 190,196 ****
  game/txt/hlp/pennmail.hlp
  game/txt/hlp/pennpueb.hlp
  game/txt/hlp/penntop.hlp
! game/txt/hlp/pennvers.hlp
  game/txt/nws/index.nws
  game/txt/nws/pennmush.nws
  BUGS
--- 190,199 ----
  game/txt/hlp/pennmail.hlp
  game/txt/hlp/pennpueb.hlp
  game/txt/hlp/penntop.hlp
! game/txt/hlp/pennvOLD.hlp
! game/txt/hlp/pennv174.hlp
! game/txt/hlp/pennv175.hlp
! game/txt/hlp/pennv176.hlp
  game/txt/nws/index.nws
  game/txt/nws/pennmush.nws
  BUGS
*** 1_7_6.118/utils/mkvershlp.pl Thu, 26 Apr 2001 10:27:46 -0500 dunemush (pennmush/d/41_mkvershlp. 1.4 700)
--- 1_7_6.132(w)/utils/mkvershlp.pl Sun, 23 Feb 2003 10:58:00 -0600 dunemush (pennmush/d/41_mkvershlp. 1.5 700)
***************
*** 1,26 ****
  #!/usr/local/bin/perl
  #
! # Generate game/txt/hlp/pennvers.hlp from the CHANGES file(s).
  # Should be run by Makefile from top-level directory
  #
! # Usage: mkvershlp game/txt/hlp/pennvers.hlp CHANGES CHANGES.OLD ...
! # Most recent file should be first, and files should have changes
! # in reverse chronological order.
  #
  use strict;
  use Sort::Versions;
  use Text::Wrap;
  
! my $target = shift;
  my @sources = @ARGV;
  my $verspat = '^Version (\S+) patchlevel (\S+)';
  my %patchlevels;
  
! open(OUT,">$target") or die "Unable to open $target\n";
! print OUT "& changes\n";
  my $really_started = 0;
  foreach my $file (@sources) {
    warn "Can't open $file!\n", next unless open(IN,"<$file");
    my $started = 0;
    while (<IN>) {
      if (/$verspat/o) {
--- 1,30 ----
  #!/usr/local/bin/perl
  #
! # Generate game/txt/hlp/ files from the CHANGES file(s).
  # Should be run by Makefile from top-level directory
  #
! # Usage: mkvershlp game/txt/hlp CHANGES.176 CHANGES.OLD ...
! #
! # Each file CHANGES.<blah> generates file pennv<blah>.hlp in the
! # specified directory.
  #
  use strict;
  use Sort::Versions;
  use Text::Wrap;
  
! my $targetdir = shift;
  my @sources = @ARGV;
  my $verspat = '^Version (\S+) patchlevel (\S+)';
  my %patchlevels;
  
! @sources = sort byrevision @sources;
! 
  my $really_started = 0;
  foreach my $file (@sources) {
    warn "Can't open $file!\n", next unless open(IN,"<$file");
+   my $target = $file;
+   $target =~ s/.*\.(.*)/pennv$1.hlp/;
+   open(OUT,">$targetdir/$target") or die "Unable to open $targetdir/$target\n";
    my $started = 0;
    while (<IN>) {
      if (/$verspat/o) {
***************
*** 30,35 ****
--- 34,40 ----
          # This is the first one 
          unless ($really_started) {
            print OUT <<'EOP';
+ & changes
  This is a list of changes in this patchlevel which are probably of
  interest to players. More information about new commands and functions
  can probably be gotten via 'help <name of whatever>'. 'help credits'
***************
*** 78,80 ****
--- 83,92 ----
  close OUT;
  
  
+ # A sort subroutine to order CHANGES.<blah> in reverse chronological
+ # order
+ sub byrevision {
+   return $b cmp $a if ($a =~ /\d/ and $b =~ /\d/);
+   return $a cmp $b;
+ }
+ 
*** 1_7_6.118/game/txt/hlp/pennvOLD.hlp Sat, 22 Mar 2003 10:37:13 -0600 dunemush ()
--- 1_7_6.132(w)/game/txt/hlp/pennvOLD.hlp Sat, 22 Mar 2003 10:34:15 -0600 dunemush (pennmush/g/30_pennvOLD.h 1.1 660)
***************
*** 0 ****
--- 1,4440 ----
+ & 1.7.3p14
+ Version 1.7.3 patchlevel 14                    January 29, 2001
+ 
+ Major Changes:
+       * Commands and functions can now be aliased to other names
+         in mush.cnf, so you can provide translated command names
+         as well as the english one, etc. Suggested at various times
+         by Krad at M*U*S*H and David at M*U*S*H. New file aliases.cnf
+         in game/ is created to put these command_alias and function_alias
+         directives (as well as reserve_alias). [SW]
+ Minor Changes:
+       * smalloc and bigram compression options are no longer supported. [SW]
+       * Internal improvements to @search/lsearch, which are now more
+         consistent with one another. [SW]
+       * mush.cnf options that refer to dbrefs now understand #<number> as 
+         well as just <number>. They are also formatted as dbrefs in @config 
+         and config(). [SW]
+       * Much longer game/names.cnf file contributed by Kyieren at M*U*S*H.
+       * New internal function notify_format() to replace notify+tprintf
+         more safely. [SW]
+       * Tweaks to network activity timeout code. [SW]
+       * @stat and lstats no longer needs to scan the entire database. [SW]
+ Commands:
+       * @switch and @select can now take a /notify switch, like @dolist.
+       * Players may @chown by dbref, but they must still be carrying
+         the object if it's a thing. Suggested by Kyieren at M*U*S*H.
+       * @clone can now clone rooms. Suggested by Kyieren at M*U*S*H.
+       * @verb's matching of the <actor> argument has been relaxed so
+         non-privileged objects can use it on remote actors, if the normal
+         permission checks succeed. This makes @verb much more useful for zones
+         and master room objects. [SW]
+ Attributes:
+       * @forwardlist [2.2,SW]
+ Functions:
+       * itemize() takes a list "a b c" and produces "a, b, and c" and 
+         similar tricks. Also callable as elist() for Rhost compatibility.
+       * ilev() returns the current iter nesting level. [Rhost,SW]
+ Fixes:
+       * When indexing help files, ones that aren't in the right format
+         weren't being properly closed. Report by Nammyung at M*U*S*H. [SW]
+       * We're much more forgiving about help files that start with
+         blank lines now.
+       * Help updates by Kyieren at M*U*S*H, [SW]
+       * Games w/o MAIL_ALIAS couldn't load maildbs that had mail aliases.
+         Reported by Nymeria. [SW]
+       * max_pennies had a limit of 10,000 in conf.c, even though it
+         has always defaulted to 100,000. Reported by Intrevis at M*U*S*H.
+       * src/filecopy.c didn't include hdrs/log.h. Fixed by Noltar at Korongil.
+       * MacOS portability fixes. [DW]
+       * vsnprintf used in place of vsprintf everywhere when available. [SW]
+       * Cleanup of @atrlock code. [SW]
+       * '#' without any trailing numbers was treated as #0 when used as a 
+          dbref. [SW]
+       * Added explicit checking for lower-case letters in good_atr_name(). [SW]
+       * Trying to set an attribute with a bad name now gives a better 
+         error message. [SW] 
+       * Fix to potential overflow bug in revwords. [SW]
+       * Fix to potential overflow bug in @grep. [SW]
+       * Configure checks for snprintf. Systems unfortunate enough not to
+         have this (Solaris 2.5.1, for example) are stuck with sprintf.
+         Report by Broncalo at DuneIII.
+       * CHARGES were decremented whenever an A-attribute would be 
+         executed, *even if the attribute wasn't set on the object*.
+         Reported by Kyieren at M*U*S*H.
+ 
+ & 1.7.3p13
+ Version 1.7.3 patchlevel 13                    January 9, 2001
+ 
+ Major Changes:
+       * Semaphores may use attributes other than SEMAPHORE. These 
+         "named semaphores" make it easier to have multiple semaphores
+         waiting on the same object. [SW]
+       * New attribute flag AF_NODUMP prevents attributes from being
+         dumped to the db. It applies to QUEUE, SEMAPHORE, and attributes
+         used as named SEMAPHORES. [SW]
+ Commands:
+       * @wait/until can be used to put commands on the wait queue until
+         some absolute time (in secs) is reached. [SW]
+       * @cpattr/noflagcopy copies attribute data without flags.
+         Same for @mvattr. Suggested by Noltar at Korongil.
+ Functions:
+       * foreach() takes start and end arguments like TM3/MUX2. [3,SW]
+       * locate() has a new option to force matching the preferred type, 
+         and an undocumented option to eliminate ambiguous matching is now
+         documented. [SW] 
+ Minor Changes:
+       * Experimental support for translating 8-bit accented characters to HTML
+         entities for Pueblo. [SW]
+       * Objects without a @lock/zone that are used as zones are noticed and 
+         warned about during dbcks. [SW]
+       * Some people prefer that +channel "foo now cause you to say "foo 
+         on the channel, instead of stripping the initial quote. Now
+         it's a mush.cnf option (chat_strip_quote). Suggested by Dave Milford.
+       * isint() now ignores tiny_math, so isint(foo) will always return 0. [SW] 
+ Fixes:
+       * Hopefully fixed a problem with puppets doing look for non-Pueblo
+         players with Pueblo support turned on. The line after the look
+         could appear to come from the puppet even if it didn't. [SW]
+       * If you disabled a command with a one-character token (like say),
+         then running the command with the token ("hi!) would fail, but 
+         wouldn't return the right thing for $command matching. Now it
+         returns the canoncalized raw command (SAY hi!) so you can trap
+         it in softcode. Reported by Mackenzie at SWGT Mush  
+       * General linting [SW]
+       * Help fixes by Eratl at M*U*S*H.
+       * make customize doesn't try to link mkindx any more. And README and
+         os2/Makefile don't refer to it either. By Bobby Bailey (Chil at M*U*S*H).
+       * The internal tprintf() function is safer. [SW]
+       * Crash bug in @edit fixed, and @edit code is cleaned up. [SW] 
+       * max_pennies documented in mush.cnf. Noted by Oriens at Alexandria
+       * cmdlocal.dst now includes cmds.h. Reported by David at M*U*S*H.
+ 
+ 
+ & 1.7.3p12
+ Version 1.7.3 patchlevel 12                    January 4, 2001
+ 
+ Locks:
+       * A new @lock/chzone, set on a ZMO, controls who may @chzone
+         objects to the ZMO. This can simplify multi-player building
+         using ZMOs. Suggested by David at M*U*S*H
+ Commands:
+       * @wcheck/me checks all of a player's objects for them.
+ Functions:
+       * cflags() function gets channel flags.
+       * ctitle() gets channel title for an object. Suggested by Luke at M*U*S*H.
+       * strinsert() function does insert() on strings. Suggested by
+         Reagan at M*U*S*H. [SW]
+       * channels() on an object you can't examine now shows you channels 
+         that you have in common with it. Suggested by Trispis at M*U*S*H
+ Minor changes:
+       * Runaway objects are now logged, along with the command that
+         pushed them over the edge. Suggested by Trispis at M*U*S*H.
+       * All instances of fprintf(stderr,...) after logging is started
+         are now handled through do_rawlog(LT_ERR,...). By David at M*U*S*H.
+       * @atrchown works more reasonably. [SW]
+       * @lock/link on an unlinked exit restricts who may link it.
+       * Everyone (even mortals) sees object names at the top of
+         their descriptions when they look at them. Suggested by Jeff
+         Ferrell most recently.
+       * New reserve_alias mush.cnf directive makes run-time command
+         alias reservation possible. Suggested by Jeff Ferrell.
+       * Mortals may use @command to get info about commands. Suggested by
+         Chili at M*U*S*H.
+       * Messages logged during help file indexing distinguish indexing
+         of admin topics. Suggested by mith at M*U*S*H
+ Fixes:
+       * Help fixes by [SW], Jeff Ferrell, mith at M*U*S*H, Mirth at AtheneuMUSH.
+       * Help update to @cpattr based on behavior noted by Noltar at Korongil.
+       * cwho and @chan/who behave better with hidden (@hide) players.
+         Reported by Reagan at M*U*S*H.
+       * MUSHes with no @functions crashed on @list calls due to a 
+         problem with the hashtable code. Reported by Whiskey. [SW]
+       * A bug in handling of errors under debug in process_expression
+         was reported by Reagan at M*U*S*H. [SW]
+       * Rare memory leak in process_expression fixed. [SW] 
+       * Inconsistencies in the handling of destroyed objects/players
+         and their locations fixed. [SW]
+       * The QUEUE attribute was not properly cleared on restart
+         for non-player objects. It was buggy in other ways, too. [SW]
+       * The AF_SAFE attribute flag couldn't be reset. Reported by
+         Pegasus at StarQuest.
+       * @teleporting into garbage could cause crashes. Reported by Howie
+       * The help_command and ahelp_command directives now look for
+         whitespace generally, not spaces specifically. 
+         Suggested by Krad at M*U*S*H
+       * SIGHUP once again re-reads the config file. [SW]
+       * If an exit @created an object, that object would be inside the exit 
+         until the next dbck. Now it is created in the exit's source room. [SW]
+       * Turning the lowest possible integer number into a string could 
+         result in garbage output. [SW]
+       * Solaris needed arpa/nameser.h before resolv.h in mysocket.c
+ 
+ & 1.7.3p11
+ Version 1.7.3 patchlevel 11                    December 4, 2000
+ 
+ Minor changes:
+       * Added 'comsys' as help alias for 'chat'. Suggested by David at M*U*S*H
+       * New win32 project files and MSVC build instructions by Jenny Lind.
+ Fixes:
+       * Improved test for non-broken getdate and getnameinfo.
+       * Loading panic dumps does better on chatdb. By Maverick at M*U*S*H
+       * You may leave a channel even if you're the wrong type
+         to get onto it. Suggested by Cheetah at M*U*S*H.
+       * Typo in the win32 strcasecmp code fixed [NJG]
+       * stddev's algorithm improved. [TAP]
+       * If the go command is restricted, other commands produce spurious
+         errors during the exit-matching phase of command parsing.
+         Reported by Jamie at M*U*S*H
+ 
+ & 1.7.3p10
+ Version 1.7.3 patchlevel 10                    November 20, 2000
+ 
+ Major Changes:
+       * Improved detection of errors saving the game. If any problems 
+         are encountered, the save is aborted, and online admins notified so
+         they can fix the problem before finding out about it too late. [SW] 
+ Flags:
+       * The INHERIT flag has been renamed TRUST, which better describes
+         its function. INHERIT remains as an alias.
+ Commands:
+       * @chan now takes /ungag, /unhide, and /unmute as well as the
+         usual @chan/gag <channel>=no. By David at M*U*S*H.
+ Minor Changes:
+       * money() called on a no_pay player returns the value of
+         MAX_PENNIES to ease softcode checks. Suggested by Oriens at Alexandria.
+       * Removed help and &help entries from the distributed pennmush.nws
+         because people will generally want to override them anyway
+         and we shouldn't introduce problems. Suggested by Jeff Heinen.
+       * safe_str and friends optimize trivial 0 and 1 letter strings. [SW]
+       * A version of word-based compression that's almost 8-bit clean
+         is now included. [SW]
+       * We now use stricmp and friends for strcasecmp and friends on
+         Win32, rather than roll our own. [SW]
+ Fixes:
+       * @mail aliases couldn't be used by players who didn't have
+         permissions to see the alias members, which is wrong.
+         Fixed now. Report by Grinna at M*U*S*H.
+       * lnum(1) and lnum(0,0) were broken. Report by Jeff Ferrell 
+       * Help updates. [SW]
+       * @set obj/notanattribute=flag now returns a 'No such attribute' error.
+         Reported by David at M*U*S*H. [SW]
+       * Help file indexing tries to detect files that aren't in the right 
+         format. [SW]
+       * function restrictions were checking the wrong object. [SW] 
+       * objmem and playermem counted eval-locks and atr-locks incorrectly. 
+         Reported by Javin at DynamixMUSH. [SW]
+       * Fixes to win32 NT_TCP stuff. [NJG]
+       * Rare memory leak in do_page fixed by David at M*U*S*H. 
+ 
+ & 1.7.3p9
+ Version 1.7.3 patchlevel 9                    November 20, 2000
+ 
+ Major Changes:
+       * Help files and their associated commands are now defined with
+         the 'help_command' (or 'ahelp_command') directive 
+         in mush.cnf. So you can translate the help to french and
+         add an "aidez-moi" command if you like. [SW]
+       * Help file indexes are now kept in memory and built by the
+         server. The mkindx program is no longer used. [SW]
+       * Added restrict_function and @function/restrict, like the versions 
+         for commands. [SW]
+       * User @functions can now override built-in functions, if you
+         @function/delete the built-in first. You can also @function/restore
+         the built-in back. [SW]
+ Attributes:
+       * @[oa]zenter and @[oa]zleave on ZMOs are triggered when someone
+         enters or leaves a given zone. Motion between rooms in the same
+         zone doesn't trigger these. "Zone" is based on the mover's
+         absolute room (outermost container) so that entering and leaving
+         an unzoned object in a zoned room doesn't trigger these either.
+         Suggested by Michael Kurtz.
+ Commands:
+       * New /silent switch for @teleport without @[o|a|ox]tport msgs.
+ Minor Changes:
+       * Still less allocation involved in outputting text to connections. [SW]
+       * @scan has better output when multiple attribs match. [SW]
+       * Added internal absolute_room function for use by fun_room
+         and move.c and wiz.c, etc.
+       * MEM_CHECK now uses a sorted linked list and is faster. [SW]
+ Fixes:
+       * References to kill_timer removed from win32 sections. [SW]
+       * conf.c reports error via logging routines, not fprintf. [SW]
+       * Assorted minor bug and warning fixes. [SW]
+       * Fix to example in help regedit by Amberyl.
+       * @wait and other timing functions were broken under win32.
+         Fixed now. [LdW]
+ 
+ 
+ & 1.7.3p8
+ Version 1.7.3 patchlevel 8                    November 12, 2000
+ 
+ Major Changes:
+       * Objects' names are stored in a string tree like attributes, so
+         we don't have hundreds of copies of 'West <W>;west;w' and such
+         taking up memory. Attribute name "hash table" is now a strtree. [SW]
+       * We no longer use alarm() to know when to run stuff on the queue. [SW]
+       * @shutdown/reboot is now supported on Windows builds. This is
+         slightly experimental. By Revian.
+ Minor Changes:
+       * %qa-%qz now operate as global registers like %q0-%q9. 
+         Suggested by Trispis at M*U*S*H and probably others.
+       * Hashtable lookups are faster (collision chains are sorted) [SW]
+       * @uptime/mortal suppresses the extra process information [SW]
+       * Wizard @uptime prints better process information on linux. [SW]
+       * @listen, @filter and @infilter respect the REGEXP and CASE attribute 
+         flags.  Suggested by Maestro at M*U*S*H [SW]
+       * Having many @waits or semaphores is more efficient, because we
+         sort those queues by time and we stop looking sooner. [SW]
+       * User-defined lock names must follow the same rules as attribute 
+         names. The name part of attrib and eval locks have to also. [SW]
+       * @chan/title's confirmation message is nicer. [SW]
+       * Minor optimizations related to strcpy() and malloc() overhead. [SW]
+       * safe_format uses vsnprintf if your system has it. By Luke at M*U*S*H.
+       * replace_string is safer. By Luke at M*U*S*H.
+ Fixes:
+       * iter() is smarter about quitting when the function invocation
+         limit is reached or the buffer is filled. [TAP]
+       * lnum() has been greatly sped up. [TAP]
+       * RWHO references removed from game/mushcnf.dst, game/restart,
+         etc. by mith at M*U*S*H.
+       * Fix to help filter by Revian.
+       * COMPRESSION_TYPE 0 didn't compile. Report by David at M*U*S*H.
+       * Clarification of @lock/teleport in help @elock by Envinyatar at M*U*S*H
+       * Compiling w/o MAIL_ALIASES didn't declare load_maliases.
+         Reported by Envinyatar at M*U*S*H
+       * clone() was stomping %0-%9. Report by Revian.
+       * @dol with an empty list now does the right thing (nothing)
+         instead of running the command once. Report by Linda Naughton [SW]
+       * spname cleanup by mith at M*U*S*H.
+       * Fixed a bug in @function function-name [SW]
+       * make update should finally handle CHAT_TOKEN_ALIAS right.
+         It's also smarter with mush.cnf
+       * isword() on a null string now returns 0. Suggested by Ashen-Shugar.
+       * channels(object) returns a better error when object isn't matched.
+         Suggested by Trispis.
+       * Fix to help rand() to reflect actual error return value. Reported
+         by Philip Mak.
+       * More translated strings noted by Krad.
+       * Problems with encrypt()'s logic fixed by Ashen-Shugar. [Rhost]
+       * Other encrypt() sillyness fixed by Brazil.
+       * Potential crashers around DEBUG and other buffer overruns
+         have been fixed. Report by Tajan and Rimnar. [SW]
+       * notify_anything allocates less memory. [SW]
+       * Fixed mistagged memcheck "restart.descriptor". 
+       * MacOS portability changes. Should build on MacOS X public beta
+         (Darwin) systems nearly straightaway. [DW]
+       * Restart script test for already-running MUSH condensed to one
+         line. Suggested most recently by Cory Albrecht.
+       * Serious crash bug in page fixed. Reported by Revian.
+       * Win32 bugs fixed by Luke at M*U*S*H: problems with dumping
+         compression suffixes, problems with @uptime
+       * MUSH no longer crashes if a player alias is > 32 chars in length.
+         It truncates names that are too long instead. By Luke at M*U*S*H.
+       * We don't check AF_PRIVATE attributes for $/^commands on children.
+         By Luke at M*U*S*H.
+       * Under win32, the MUSH would often start ignoring commands from
+         players after the first 98 per connection. Fixed by Revian.
+         
+ & 1.7.3p7
+ Version 1.7.3 patchlevel 7                    October 12, 2000
+ 
+ Functions:
+       * filterbool(), for TM3 compatibility. Like filter(),
+         but tests for any true value, not just 1. [3,SW]
+       * case(), for TM3 compatibility, and caseall().  Like switch() 
+         and switchall(), but does an exact match, not wildcard. [3,SW]
+       * valid() takes more categories. [SW]
+       * localize(), for TM3 compatibility. Like a cross between
+         s() and ulocal(). [3,SW]
+ Commands:
+       * @break, for Rhost compatibility. Stops processing the
+         current action list. [Rhost,SW]
+       * @enable and @disable can be used on any boolean config option. [SW]
+       * @function/enable and @function/disable for built-ins
+       * @function function-name reports some information on the function,
+         like @command command-name.
+ Flags:
+       * New attribute flag 'safe' prevents accidental modification.
+         Suggested by Stephen Viscido. [TAP]
+ Minor Changes:
+       * The daytime config option is no more. Do a few @searches in
+         its honor. [SW]
+       * lsearch() permission is controlled by @search, and entrances()
+         by @entrances, for consistency with other functions that have
+         a corresponding command. [SW]
+       * The number of reboots is tracked, and the restarts() function
+         added, for TM3 compatibility. [3,SW]
+       * Rearranged some compile flags to suit systems that have
+         /usr/local/include/ident.h. By Luiz Claudio Duarte.
+       * More strings marked for translation. By Krad at M*U*S*H
+       * :, [, ], (, and ) are no longer legal in attribute names
+         due to ambiguities and security issues. [TAP,SW]
+       * Ranges in @search, lsearch() and @find can be either #dbrefs or 
+         (for backwards compatibility), integers. Inspired by ElendorMUSH. [SW]
+       * Broadcast messages in bsd.c replaced with GAME prefix.
+         Suggested by Krad at M*U*S*H.
+ Fixes:
+       * Fixed a bug in filter() where it only looked
+         at the first character of the evaluated attribute. [SW]
+       * Some more noise from info_slave was removed. [SW]
+       * do_pcreate and do_chownall now live in game.h and not
+         externs.h. Reported by Maestro at M*U*S*H.
+       * Clean-up of atr_add calls in void context. [TAP]
+       * IPv6 buglet fixed. Report by Vexon at M*U*S*H. [SW]
+       * @config/set can no longer be used to set options in the files   
+         and messages categories, as this has icky consequences. [SW]
+       * Fixed a logic bug in letters_to_privs where not all the letters 
+         were being turned into privs properly. Report by Bolt at M*U*S*H [SW]
+       * Fix to isint() so that isint(1a) is 0. [SW]
+       * Added safe_boolean internal function, and fixed a hang bug
+         in edit() reported by Walker at M*U*S*H. [SW]
+       * Fixed problems in panic dumps/reads of maildb and chatdb. [SW]
+       * @edit is a bit more efficient. [SW]
+       * Assorted lock structures are allocated in big chunks like 
+         attribute structures, to save malloc overhead. [SW]
+       * User-defined lock names are stored in the attribute name tree. [SW]
+       * Various help fixes [SW, Javelin]
+       * LASTLOGOUT time now forces two-digit day for convtime niceness. [SW]
+       * Very large malias names or member lists could cause buffer 
+         overruns. [SW]
+       * Buffer overrun fix, fix to str_chr. [TAP]
+       * tprintfs removed from DEBUG output so DEBUG doesn't mess up
+         messages in ^-commands anymore. [TAP]
+ 
+ & 1.7.3p6
+ Version 1.7.3 patchlevel 6                    September 20, 2000
+ 
+ Minor Changes:
+       * Translation files are now archived separately on the ftp site.
+       * A variety of options.h settings have been removed.
+         EXTENDED_ANSI, DUMP_EMPTY_ATTRS, DUMP_LESS_GARBAGE and the *_LOCK 
+         defines are totally gone. [SW]
+         OLD_NEWLINES, DELETE_ATTRS and VISIBLE_EMPTY_ATTRS have been 
+         moved out of options.h as they're special-purpose. [SW]
+       * More common function error messages were made into variables 
+         rather than being hardcoded in as string literals. [SW]
+       * If a player is set HALT, their queued commands will not run.
+       * Speedup in process_expression. [TAP].
+ Functions:
+       * The regedit(?:all)?i? family of functions, like perl's s///. [SW]
+       * Case-insenstive versions of regrab() and regraball(). [SW]
+       * etimefmt(), which is to timestring() as timefmt() is to time(). [SW]
+ Fixes:
+       * Error messages that were already variables are now translated. [SW]
+       * Fixes to various metaconfig rules. [SW]
+       * Open_Anywhere and Link_Anywhere were sharing the same
+         bitmask. Fixed. [SW]
+       * You can escape : in $command patterns that are being regexp-
+         matched now. [SW]
+       * Rewrites of the regexp functions so that, say, regrab() and
+         regraball() point to the same actual code, using called_as to 
+         know when to stop. They also use PCRE's match optimizing 
+         pcre_study() function when appropriate. [SW]
+       * Buglets in game/restart and game/mushcnf.dst fixed.
+         Reported by Krad and Nymeria at M*U*S*H.
+       * page_aliases directive in mush.cnf works now. Report by Nymeria.
+       * Same for float_precision. Report by Oleo at M*U*S*H.
+       * mushtype.h now included in compress.c. [DW]
+       * Less noise in log/netmush.log from failed ident queries.
+       * More strings marked for translation.
+       * Fixes to problems with @search reported by Oleo at M*U*S*H. 
+       * Weird evaluation of functions in softcoded commands fixed. [TAP]
+       * Cleanup of typos here and there by Padraic at M*U*S*H.
+ 
+ 
+ & 1.7.3p5
+ Version 1.7.3 patchlevel 5                    September 7, 2000
+ 
+ Minor Changes:
+       * FLOATING_POINT is no longer an option (it's always on). [SW]
+       * EXTENDED_ANSI defaults to enabled. [SW]
+ Attributes:
+       * @receive/@oreceive/@areceive triggered on the recipient
+         after a get or give, so you've got access to who caused
+         you to acquire the object and the object's dbref now.
+       * @give/@ogive/@agive triggered on the giver with object's
+         dbref in %0. Suggested by Oriens at Alexandria. 
+ Fixes:
+       * Fixes for systems with broken or incomplete IPv6 support. [SW]
+       * Uses of index() changed to strchr() for consistency. [SW]
+       * Much removal of duplicate function prototypes and rearranging
+         of headers.  hdrs/globals.h is now hdrs/case.h. hdrs/intrface.h is 
+         no more, and hdrs/boolexp.h, hdrs/log.h were added. [SW]
+       * @search supports "quoted player names".
+       * We no longer report failed connect to ident servers in the log.
+ 
+ & 1.7.3p4
+ Version 1.7.3 patchlevel 4                    August 8, 2000
+ 
+ Major Changes:
+       * Internationalization:
+         * Support for international time formats via LC_TIME locale [SW]
+         * Support for message translation
+         * Support for locale-sensitive ordering of strings (LC_COLLATE) [SW]
+         To take advantage of the new features, you should have your
+         LANG environment variable set to an appropriate locale 
+         before you 'make install' (which will cause the right message
+         catalog to be compiled), and you should see the section 
+         in game/restart for setting it there (which will actually cause
+         the server to use it).
+       * IPv6 support [SW]
+ Commands:
+       * @dolist/delim and @map/delim [SW]
+       * @stats/tables [SW]
+       * SESSION command displays session statistics (experimental) [SW]
+ Functions:
+       * uldefault(), like udefault but saves registers like ulocal() [SW]
+       * switchall(), for Tiny compatibility. [SW]
+       * cemit() with an option to act like @cemit/noisy [SW]
+       * vmin() and vmax(), for returning the min and max of each pair in two
+         vectors. [SW]
+       * utctime(), convutcsecs() for UTC/GMT time instead of server-local. [SW]
+       * convtime() uses getdate() if present, along with a variety of templates
+       * that it can accept. [SW]
+       * timefmt() - like the strftime() C function. [SW]
+       * pcreate() side effect function suggested by Adamas and Padraic at M*U*S*H
+       * starttime() now returns the first startup time, and 
+         restarttime() returns the time of the last @shutdown/reboot [SW]
+ Minor Changes:
+       * +help is mentioned in help help. Suggested by Trispis at M*U*S*H.
+       * include directive for config files, with an example moving all
+         the restrict_command's to another file. [SW]
+       * make indent runs expand, then indent, because indent doesn't seem to
+         handle tabs very well. [SW]
+       * index-files.pl sorts patchlevels correctly. Patch by Jeff
+         Heinen.
+       * LASTLOGOUT attribute records logout time, like LAST, but not
+         visual. Suggested by Oriens at Alexandria, and others.
+       * Internal cleanup by David at M*U*S*H. New @config category 'messages',
+         no more OBJECT_ENDOWMENT or OBJECT_DEPOSIT macros, etc.
+       * Internal functions safe_integer(), safe_number(), and safe_dbref()
+         to replace safe_str(unparse_FOO(data), buff, bp) calls  [SW]
+       * You can now @trigger an attribute containing a $command or
+         ^listen and it'll work (skipping the $...: or ^...: parts).
+         So you can now do this:
+          &DO_WHO obj=$who *: @pemit %#=[u(who,%0)]
+          &DO_+WHO obj=$+who *: @tr me/do_who=%0
+         (But you can do this much more efficiently with regexp...)
+ Fixes:
+       * table() is less CPU-intensive in extreme cases. [SW]
+       * Hopefully, Configure now determines pagesize on FreeBSD.
+         Method suggested by Matt Harris.
+       * CHAT_TOKEN_ALIAS comment clarification by Oleo at M*U*S*H.
+       * pcre regexp engine updated to version 3.4.
+       * Typo in @chan/who fixed by Vexon at M*U*S*H.
+       * @attribute/access won't modify AF_INTERNAL attributes now.
+       * Additional win32 portability fixes. [NJG]
+       * con() was buggy in a bad way. Fixed now.
+       * Configure -d should now work on linux systems that don't have
+         crypt libraries. Reports by mith and Inek at M*U*S*H.
+       * Fix to Z_TEL on things.
+       * Help fix to @lock5 by Datron at SW2.
+ Languages:
+       * Swedish and Hungarian translations for most strings are
+         included in this patchlevel.
+ 
+ 
+ & 1.7.3p3
+ Version 1.7.3 patchlevel 3                    July 12, 2000
+ 
+ Major Changes:
+       * Restrictions to the 7-bit ascii charset have largely been removed
+         except in attribute names, to help international users. [SW]
+       * If available, we now use setlocale to support international
+         charsets (and eventually other conventions, though this should
+         be considered experimental). If you set your LC_CTYPE environment
+         variable to, say, 'fr_FR', french-accented characters should work.
+         Wide (multibyte) charsets are not supported.
+ Minor Changes:
+       * Internal cleanup of page/whisper code by David at M*U*S*H.
+       * New mush.cnf directive, page_aliases, for showing alias of
+         paging player. Supported by code by David at M*U*S*H.
+         Requested by many. A contrib version by Flame dates to 1996.
+       * @chat on a non-existant channel returns an error message. [SW]
+       * Two new CRYPT_SYSTEM options. One checks both SHS and crypt(3)
+         for passwords, and saves them back using SHS. The other does 
+         the same for plaintext passwords. These should encourage folks
+         who currently use crypt(3) to make a painless move to SHS. [SW]
+ Commands:
+       * @remit can take /silent and /noisy switches now. Suggested by
+         Philip Mak.
+       * @lemit and @emit can take /silent switch. [SW]
+       * @config/set can set configuration parameters at runtime. [SW]
+ Functions:
+       * The set algebra functions can be given a sort order for output. [SW]
+ Fixes:
+       * CHAT_TOKEN_ALIAS could get defined w/o a character value.
+         Added a better explanation of CHAT_TOKEN_ALIAS in options.h.dist.
+         and fixed utils/update.pl to handle commented defines that take 
+         values a bit better. Report by Nymeria at M*U*S*H.
+       * You can no longer initiate following a disconnected player.
+         Report by Dave at Galactic.
+       * CHANGES for 1.7.1 and 1.7.0 were missing. Back now.
+       * Typo in options.h.dist corrected. Report by Padraic at M*U*S*H.
+       * Small Configure portability improvements.
+       * Better handling of cases where the maildb has messages from
+         dbrefs that are out of range (due to truncating a db to remove
+         corruption, for example). Suggested by Ashen-Shugar.
+       * We now check for sitelocked sites before asking info_slave to
+         do ident lookups.
+       * Many help clarifications. [SW]
+       * linux Configure can use nm to find symbols, finally.
+       * help locate() now includes the z flag.
+ 
+ 
+ & 1.7.3p2
+ Version 1.7.3 patchlevel 2                    June 3, 2000
+ 
+ Commands:
+       * New @sitelock options to control access to god, wizards, admin
+         by site. [SW]
+       * @force can now take /noeval [SW]
+ 
+ Functions:
+       * squish() can take a second argument to squish non-spaces. [SW]
+       * div(), floordiv(), modulo(), and remainder(), a set of functions
+         jointly adopted by MUSH and MUX servers for compatibility. [TAP]
+       * @@() and null() functions suggested by [LdW].
+ 
+ Minor Changes:
+       * @uptime now shows initial restart time, not just time since
+         last reboot.
+       * Each player now has a limit to the number of @mail messages
+         in their inbox (folder 0), configurable in mush.cnf.
+         Suggested by Edwin at M*U*S*H.
+ 
+ Fixes:
+       * More linting and improved indenting [SW]
+       * PARANOID works right for broadcast messages (like @cemit) now
+         too. Report by Vexon at M*U*S*H.
+       * You can no longer follow what you can't see.
+       * CHAT_TOKEN_ALIAS info appears in options.h now. Report by 
+         Rhysem at M*U*S*H.
+       * Mac portability changes. [DW]
+       * Disconnected players don't follow any more. Suggested by Don Burks.
+       * Various fixes to better resist crashing due to attacks involving
+         overwhelming connections. 
+       * @mail/stats for all was broken. Fixed now.
+       * Clearer message after failed @pemit. Suggested by Eratl at M*U*S*H
+       * Destroyed things stop following/leading. Report by Ashen-Shugar.
+       * follow didn't properly set up the followers as enactors.
+         We no longer short-circuit process_command. Report by Moe at Chicago.
+ 
+ & 1.7.3p1
+ Version 1.7.3 patchlevel 1                    May 18, 2000
+ 
+ Commands:
+       * @oemit now takes a list of players. Adapted from patch by Philip Mak.
+ 
+ Minor Changes:
+       * Reconnecting is less spammy - we don't show motds again
+         to players already connected. Suggested by Trispis at M*U*S*H.
+ 
+ Fixes:
+       * Configure problem that resulted in weird compile failures on
+         bind/accept in src/bsd.c fixed.
+       * Further linting. [SW]
+       * FreeBSD getrlimit problem diagnosed by [SW] is worked around.
+       * Couldn't compile w/o FLOATING_POINTS defined. Fixed.
+       * Fixed a few dependencies in the Makefiles to insure that
+         hdrs/patches.h and hdrs/switches.h are rebuilt properly.
+       * Indentation cleanup.
+       * We now recognize egcs as if it were gcc 2, and set ccflags
+         accordingly.
+       * Increased size of some hash tables for performance. [SW]
+       * Help fixes. [SW]
+       * flags(obj/attrib) behaved badly unless attrib was CAPITALIZED.
+         Fixed now. Reported by Vexon at M*U*S*H.
+ 
+ & 1.7.3p0
+ Version 1.7.3 patchlevel 0                    April 20, 2000
+ 
+ Major Changes:
+       * If you create a 'patches' subdirectory and keep any user-contrib
+         patches you apply in there, and if the patches are properly 
+         formatted, i.e., they include these lines:
+               # Patch name:
+               # Patch version:
+         your MUSH's @version and INFO output will report them.
+         In addition to being helpful for you, this will help the
+         developers when you send us a bug report including your 
+         @version. [TN]
+       * As @cemit doesn't override @chan/gag and allows 
+         NOSPOOF notification, it basically now operates just like
+         @pemit/list (you can protect yourself from spoofing, and you can
+         silence it). Accordingly, the cemit power is no longer 
+         necessary. It's now a runtime option.
+       * @malias (@mailing lists) by Daniel Peters.
+       * Attribute names are now stored in a single string tree,
+         so we don't have thousands of copies of the string
+         "FINGER_NOTE", etc., taking up memory. [TAP]
+       * As a consequence of the attribute name tree, the STARTUP flag 
+         is no longer needed, and will be automatically removed from
+         dbs.
+       * Attributes are now inserted in alphabetical order, which
+         speeds lookup. [TAP]
+       * Panic dumps now dump the maildb and chatdb, appended to the
+         end of PANIC.db. The MUSH handles breaking them up on restart.
+       * New link_anywhere power allows @link'ing to any destination.
+       * Mortals may create VARIABLE exits. At the time the destination 
+         is computed, the exit is check to see if it has permission to
+         link there (i.e., the exit controls the destination or the
+         exit is link_anywhere or the destination is link_ok).
+         To keep old code from breaking, all existing variable exits are 
+         given the link_anywhere power at first db read in this patch.
+         Suggested by David at M*U*S*H.
+       * The follow command is implemented!
+       * Nested iter is now useful. The itext(n) function returns
+         the value of ## for the nth innermost iteraction, where
+         0 is the most inner, and inum(n) does the same for #@. [TN]
+       * New regexp library, pcre, now allows perl 5.005 compatible
+         regular expressions! Suggested by [SW].
+       * Objects are now limited in the number of attributes that may
+         be set on them. This prevents a DoS attack. Suggested by
+         Ashen-Shugar.
+       * Some more english-style matching (look my 2nd box). [TN]
+ 
+ Functions:
+       * config() returns a list of config option names. 
+         config(<option>) returns the value of a config option.
+         (e.g. config(money_singular))
+       * sort() now accepts an output delimiter, a la iter().
+         Suggested by Jason Newquist.
+       * channels() now accepts a delimiter. Suggested by Trispis at M*U*S*H.
+       * money(<integer>) returns the name of the money, either singular
+         or plural, depending on <integer>. Suggested by Trispis at M*U*S*H.
+       * timestring() with a pad flag of 2 forces 2 digit numbers.
+         Suggested by Trispis at M*U*S*H.
+       * fmod() function returns floating point remainder on division.
+         Written by Michael Thole.
+       * brackets() function returns bracket counts for its unparsed
+         argument. Handy for debugging. By Jason Wilcox.
+       * edit() can take multiple find-replace pairs. By Chili at M*U*S*H.
+       * clock() function by Ari at SpaceMUSH and Chili at M*U*S*H.
+       * flags() function can show attribute flags as well. 
+         Suggested by Kami at SW2
+       * mailstats(), mailfstats(), and maildstats() added by Kami at SW2
+       * nattr() (aka attrcnt()) returns number of attributes on 
+         an object. Suggested by Ashen-Shugar.
+       * map() and foreach() now provide the element's position
+         through %1. [LdW]
+       * spellnum() function spells out numbers in words. [LdW]
+       * wrap() for server-based line wrapping. Adapted from code by [LdW]
+       * lmath() function lets you do math on delimited lists, and makes
+         it easy to emulate Tiny's ladd/lsub/etc. [SW]
+       * bitwise math functions. [SW]
+       * mean(), median(), and stddev() functions. [SW]
+       * bound() function for bounding numbers. [SW]
+       * regrab(), regraball(), and regrep() regular expression 
+         versions of grab/graball/grep. [SW]
+       * controls() can now be used if you control either the <obj> or
+         the <victim>. [RLM] suggested this in July 1998, but we were
+         too boneheaded at the time to agree on it.
+ 
+ Commands:
+       * teach <command> shows others in your room the (unparsed)
+         command that you want to demonstrate, and then causes you
+         to execute it. Suggested by Reed Riner.
+       * /preserve switch for @clone and @chown to preserve privbits.
+         By Kurt Fitzner.
+       * rpage and rwho have been removed.
+       * @nameformat on a room allows you to specify how the room's
+         name should be displayed to those inside it when they look.
+       * An optional second token for chat (in addition to +) can
+         be set if you'd like + and = (or whatever) to both work.
+         Patch by Kami at SW2.
+       * @scan returns the matched attribute name as well as object.
+         Suggested by many, including Thi at M*U*S*H.
+       * ; waves is treated as :waves, instead of as ;waves.
+         Suggested by Sandi Fallon, for tiny compatibility.
+       * cv command at connect screen forces a !DARK connect.
+         Suggested by David at M*U*S*H.
+       * with obj=command tries a $command on a specific object. [TN]
+       * @mailsignature finally implemented.
+       * @chan/join and @chan/leave are aliases for @chan/on and @chan/off,
+         respectively. Suggested by [LdW]
+       * @chan/decomp/brief decompiles a channel without listing players.
+ 
+ Flags:
+       * LISTEN_PARENT flag causes the object to inherit ^listens
+         from its parent. By Kurt Fitzner.
+       * Internal ACCESSED flag removed.
+       * PARANOID player toggle replaces the old paranoid_nospoof
+         configuration directive, and allows per-player setting of
+         nospoof format. Suggested by Trispis at M*U*S*H
+ 
+ Minor Changes:
+       * New lock @lock/command controls who may use $commands on an
+         object. @lock/listen controls ^patterns, @lock/use controls both.
+         Patch by Kurt Fitzner.
+       * The max_obj_val and max_wiz_obj_val configuration options
+         have been removed, as they're rarely used. You can change them
+         in hdrs/conf.h (search for ENDOWMENT).
+       * src/connect.c is no longer distributed. It wasn't ever used
+         for anything anyway.
+       * @fixdb command removed.
+       * @config/functions and commands can show listings in lowercase.
+       * match_list changed to try to match player aliases. Allows
+         "look <alias>" for a player in the same room. Reported by Corum.
+       * See_All players can now see/check AF_WIZARD attributes
+         (but AF_MDARK still requires that you be roy/wiz).
+         Suggested by Balazs Gasparin.
+       * VERBOSE PUPPETs relay to their owners even if the owner's
+         in the same room. Dedicated to Julianna at ATS.
+       * You may now @dest objects that you control via a zone,
+         as you could have done so indirectly before anyway.
+         Reported by [LdW]
+       * Sending the MUSH process an INT signal now causes graceful
+         shutdown (not panic dump). Sending a USR2 signal causes
+         a normal dump. As before, HUP causes config reload and
+         TERM causes a panic dump. [TAP]
+       * @chan/list shows your gag status. Suggested by Matt at M*U*S*H
+       * When chatting, we only match partial channel names against
+         channels you're actually on. Suggested by Matt at M*U*S*H
+       * By default you can no longer speak to a channel you're not
+         on. This is configurable per-channel with the new "open"
+         priv. Suggested by Akiko at M*U*S*H.
+       * If you can't go through an exit because it's linked to
+         garbage or its variable destination is invalid, we no longer
+         process the SUCC and DROP message set on the exit.
+       * The Inherit() macro no longer includes a Wizard test -- we
+         don't need it anymore as we protect Wiz objects in controls().
+       * getrandom has been replaced by get_random_long, with a better
+         algorithm and interface. Suggested by Stephen Dennis. [TAP]
+       * Win32 compilers now get the __cdecl hint so they can compile
+         using __fastcall which can greatly increase speed. Patch by
+         Stephen Dennis.
+       * For WIN32, use GetSystemTime instead of timeGetSystemTime.
+         Patch by Stephen Dennis.
+       * For WIN32, use a combination of wsadata.iMaxSockets and
+         options.max_logins to pick a reasonable number of available file
+         descriptors. Patch by Stephen Dennis.
+       * Default dump messages now call it a 'save', not a 'dump',
+         to avoid newbie confusion. Suggested by Vedui.
+       * You're notified if you set an attribute/flag on a quiet object
+         that you don't own. Patch by Kurt Fitzner.
+       * @decomp now comments its "No attributes found" message so as
+         not to break scripts.  Report by Kurt Fitzner.
+       * More Mac tweaking. [DW]
+       * \ and % are no longer valid in attribute names. Suggested by Ali Abdin
+       * Cleanup to logging code. We now try to do almost all of it through
+         log.c functions for better encapsulation. Patch by David at M*U*S*H.
+       * New @lock/examine to restrict who may examine visual objects.
+         Suggested by [LdW]
+       * Examining objects now shows channels they're on, if any.
+         Suggested by Big Spoon at M*U*S*H.
+       * Channel-hidden players are now marked in @chan/who for those
+         who are allowed to see them.
+       * @uptime shows more upcoming events, and shows them to mortals.
+         Suggested by Kyieren at M*U*S*H.
+       * @chzone obj works like @chzone obj=none. Suggested by Mystery8 at M*U*S*H
+       * Player creation is now announced to MONITOR players. Suggested
+         by Paul at M*U*S*H.
+       * Poll message kept across @shutdown/reboot. Suggested by [SW].
+       * The military_time directive is removed from mush.cnf. It only
+         affected the way time was shown in @idle/@haven/@away messages
+         anyway. Reported by Angelus at M*U*S*H.
+ 
+ Fixes:
+       * help for lnum() and dig() improved. Leo at ATS TrekMUSH
+       * help for @charges improved. Suggested by Scott Weber
+       * @mvattr a/b=a/b would clear the attribute. No longer.
+         Reported by Octavian at M*U*S*H
+       * type(obj) would log a "WEIRD OBJECT" message if obj was 
+         a garbage object. Reported by RLM. [TAP]
+       * Bug in deciding when to take a penny for queued commands fixed
+         by Stephen Dennis.
+       * Portability fixes for gcc 2.95.2 and other compilers who require
+         that function pointers in prototypes include the function args. 
+         Reported by Gepht.
+       * @chan/decomp should include the channel description, too. 
+         Report by David at M*U*S*H.
+       * Two other ways to be inside an object inside yourself reported by
+         Ashen-Shugar, and one by Rhysem at M*U*S*H.
+       * Small memory leak when doing @cpattr of a standard attribute to a
+         non-standard attribute is fixed.
+       * Help clarification for pemit() suggested by Falor at M*U*S*H.
+       * Help parents and @search3 fixed. Suggested by rodregis at M*U*S*H.
+       * Tport_anything didn't allow teleporting things to exits. 
+         Noted by Vexon at M*U*S*H.
+       * Z_TEL flag works on ZMO's as promised now. Report by [SW].
+       * Potential crash in moveit fixed. Report by Howie at NF TrekMush
+       * @cemit now does the checks that @chat does, in regard to being
+         of the right type, allowed to speak, on the channel, etc.
+         Suggested by Oleo at M*U*S*H.
+       * getstring_noalloc was doing an fgetc into a char variable,
+         instead of an int, so wasn't 8-bit clean. Report by Slava.
+ 
+ & 1.7.2p35
+ Version 1.7.2 patchlevel 35                        January 27, 2001
+ 
+ Fixes:
+       * Fixed a bug in filter introduced in p34. Report by Jason Rhodes.
+       * Help for sort() now indicates that 'n' sorts integers. Report by
+         Dave Milford.
+ 
+ 
+ & 1.7.2p34
+ Version 1.7.2 patchlevel 34                        October 2, 2000
+ 
+ Fixes:
+       * filter now looks at the whole result, not just the first
+         character, when checking if the filter function returned '1'. [SW]
+       * raw_input and raw_input_at are now unsigned char *, so
+         they build right on HP/UX and similar. Report by Jeff Hildebrand
+ 
+ 
+ & 1.7.2p33
+ Version 1.7.2 patchlevel 33                        August 17, 2000
+ 
+ Fixes (backported from 1.7.3p4):
+       * Bug in con() patched.
+       * Bug in deciding when to take a penny for queued commands fixed
+         by Stephen Dennis.
+       * Configure portability fixes
+       * Better handling of cases where the maildb has messages from
+         dbrefs that are out of range (due to truncating a db to remove
+         corruption, for example). Suggested by Ashen-Shugar.
+       * Various fixes to better resist crashing due to attacks involving
+         overwhelming connections. 
+       * @mvattr a/b=a/b would clear the attribute. No longer.
+         Reported by Octavian at M*U*S*H
+       * type(obj) would log a "WEIRD OBJECT" message if obj was 
+         a garbage object. Reported by RLM. [TAP]
+       * Small memory leak when doing @cpattr of a standard attribute to a
+         non-standard attribute is fixed.
+       * Tport_anything didn't allow teleporting things to exits. 
+         Noted by Vexon at M*U*S*H.
+       * Z_TEL flag works on ZMO's as promised now. Report by [SW].
+       * Potential crash in moveit fixed. Report by Howie at NF TrekMush
+       * getstring_noalloc was doing an fgetc into a char variable,
+         instead of an int, so wasn't 8-bit clean. Report by Slava.
+ 
+ & 1.7.2p32
+ Version 1.7.2 patchlevel 32                        April 17, 2000
+ 
+ Fixes:
+       * @cpattr from a non-standard attribute to a standard one
+         didn't preserve the AF_STATIC flag, and a subsequent atr_clr
+         could cause a crash.
+ 
+ & 1.7.2p31
+ Version 1.7.2 patchlevel 31                        April 9, 2000
+ 
+ Minor Changes:
+       * The SAY_TOKEN now applies to channels. That is, +public "Hi!
+         will not result in a doubled initial quote any more.
+         Suggested by Tyler Spivey.
+ Fixes:
+       * Uninitialized negate_perms in the monitor flag table.
+         Report by Concordia at Beyond the Fire.
+       * Updates to help changes to match CHANGES.
+       * Another way to end up in an object in your inventory has been 
+         fixed. Report by Lensman.
+       * Unused ancient ccflags cruft removed from hints files.
+       * Considerable linting and cleanup. [SW]
+       * MacOS portability improvements. [DW]
+       * You may reset your @alias to itself in different case.
+         Suggested by Bolt.
+ 
+ & 1.7.2p30
+ Version 1.7.2 patchlevel 30                        March 14, 2000
+ 
+ Major Changes:
+       * New US export rules allow us to include shs.c and funcrypt.c
+         in the Penn distribution! Yay!
+       * Code is included in bsd.c for Windows NT users that uses
+         NT's native i/o instead of the bsd socket layer for
+         much improved performance. If you want it, edit src/bsd.c
+         and uncomment the define at the top. [NJG]
+ Minor Changes:
+       * New eplayer, eroom, eexit, eobject classes for searches,
+         like Tiny. By Rhysem.
+       * @sitelock/access.cnf can now use regexp patterns. By Raevnos.
+       * The Exits() macro is replaced with Source(), Home(), etc.
+         where sensible. By Maverick at M*U*S*H.
+       * Example of bzip2 compression defines in mushcnf.dst by David at M*U*S*H.
+       * shs.c can now be configured to reverse endianness, so you
+         can more easily use win32 dbs on unix (or vice versa) without
+         password hassles. This is in mush.cnf. [NJG]
+       * JUMP_OK no longer allows anyone to @tel an exit into your room.
+         You must control the destination or have the open_anywhere 
+         power in order to do this now. Report by rodregis.
+ Fixes:
+       * Calling do_log with LT_TRACE resulted in no logging. Report by David.
+       * MacOS (and general) portability improvements, suggested by [DW]
+       * help for before(), after() notes case-sensitivity. By Audumla.
+       * hasflag() didn't work with MONITOR. Report by Mystery8.
+       * A little more linting. [NJG]
+       * Fixed help reference to 'global functions'. Report by Falor.
+       * Some gmalloc fixes around missing newlines. Report by Raevnos
+       * Improvements to help switch(). Report by Omozali.
+       * Buffer overflow in @wall fixed. Report by rodregis.
+       * Fixed (I think) the FreeBSD/Linux problem of not finding
+         sigchld/sigcld and similar ilk. Hints for FreeBSD are back.
+       * Crash bug in @link fixed. Report by Howie at New Frontier TrekMUSH
+ 
+ & 1.7.2p29
+ Version 1.7.2 patchlevel 29                        January 23, 2000
+ 
+ Fixes:
+       * src/sig.c didn't include config.h. As a result, some systems
+         with sigaction that didn't keep signal handlers installed
+         (some linuxes) would crash very quickly on the second SIGALRM.
+ 
+ & 1.7.2p28
+ Version 1.7.2 patchlevel 28                        January 14, 2000
+ 
+ Minor Changes:
+       * New 'deny_silent' option for access.cnf sites.
+         Turns off logging of denied connection/creation/guest/register
+         from a site, to prevent logfile spamming by twinks.
+         Reported by Kludge-BC.
+       * TFPREFIX attribute, if set, is used in place of FugueEdit>
+         in @decomp/tf. [SW]
+       * @grep/print no longer requires you to be set ANSI. Suggested 
+         by Philip Mak.
+       * Improved reporting of function invocation limit. [TAP]
+       * /noeval switch added to think command.
+       * Changes to enhance portability to Mac 68k platform and others
+         that need < 32k of local data per function. [DW]
+       * Objects are only considered to be listening if they're
+         connected players, puppets, have an @listen set, or
+         are things/rooms with MONITOR flags. Previously, things/rooms
+         with ^patterns in attributes were considered listeners, even if
+         they weren't MONITOR. Suggested by Luke.
+ Fixes:
+       * gmalloc.c updated from 1987 version to 1995 version. By Gepht.
+       * help corrections for shl and shr by Vexon at M*U*S*H.
+       * help corrections for @clock by Krad at M*U*S*H.
+       * RLIMIT_NOFILE bug fixed by Susan Thorne.
+       * Eliminated variables named 'new' to promote easier C++
+         compiles. Suggested by Gepht.
+       * Compiling with CSRI_TRACE works again. [TAP]
+       * signal stuff broken out to src/sig.c to allow link w/info_slave.
+       * strcasecmp and friends prototyped better in externs.h. [DW]
+       * Overzealous test for inherit flag on zoned objects corrected
+         by Nveid.
+       * Clearing an @attribute'd attribute's value on some object
+         and later manipulating the attribute could corrupt the
+         @attribute table in some cases. Fix suggested by Kami at SW2.
+       * Nested pemits could truncate one another. Reported by Alierak.
+       * Channel messages didn't correctly set %#. Reported by Saberwind.
+       * info_slave used ident even if use_ident was off in the 
+         mush.cnf file. Reported by Rhysem.
+ 
+ & 1.7.2p27
+ Version 1.7.2 patchlevel 27                        September 22, 1999
+ 
+ Minor Changes:
+       * Added Raevnos's sitelock/name patch to allow removing names
+         with @sitelock/name !<name> and to fix a display bug.
+       * bsd.c, info_slave.c, and player.c now deal in IP addresses as well
+         as hostnames (which can be spoofed), providing more reliable logging
+         and access control. IP addresses are stored in the LASTIP attrib
+         on players, as per LASTSITE. Suggested by David at M*U*S*H.
+       * Hidden connections are announced as per DARK ones. Suggested 
+         by Julianna at ATS.
+       * New /noisy switch to @cemit prepends <Channel> to message.
+         Suggested by Spork at M*U*S*H.
+ Fixes:
+       * help vmul() incorrectly defined the dot product (which vdot() does).
+         Reported by [SW].
+       * Typo fixed in help @set3. Reported by Logain at ATS
+       * Typo fixed in help @emit. Reported by Rhysem at M*U*S*H.
+       * Various help fixes by mith, Big Spoon, and Krad at M*U*S*H.
+       * @function now works for mortals as the help indicates. Report by mith.
+       * @log/wipe should be @logwipe in comments in mushcnf.dst. 
+         Report by Spork at M*U*S*H.
+       * Object names are now limited to 256 characters. Fixes some
+         buffer overflow issues.
+ 
+ & 1.7.2p26
+ Version 1.7.2 patchlevel 26                        July 18, 1999
+ 
+ Minor changes:
+       * @verb didn't save stack args before dealing with the WHAT/OWHAT
+         msgs, as TinyMUSH does. Changed to emulate TinyMUSH.
+         Reported by Angel. [SW]
+ Fixes:
+       * The noeval-eqsplit fix cause weirdness with attribute setting by
+         directly connected players when specifying the obj by function.
+         Fixed. Reported by Julienna at ATS.
+       * Wizards couldn't modify atrlock'd attribs without breaking the 
+         lock first. [SW]
+       * @find by Wizards showed all garbage objects. Reported by mith.
+ 
+ 
+ & 1.7.2p25
+ Version 1.7.2 patchlevel 25                        July 10, 1999
+ 
+ Minor changes:
+       * New 'nofixed' command restriction, by popular demand.
+       * CONFIGURATION messages in netmush.log shortened to CONFIG.
+         Suggested by mith.
+       * Attributes with the Wizard flag can no longer by created/modified
+         by any non-wizard, even that attribute's owner. Reported by
+         Kurt Fitzner.
+       * @pcreate now shows the dbref of created player. Suggested by
+         Oderus.
+       * When you receive an @mail message, you're now told the number.
+         Suggested by Rak at M*U*S*H, among others.
+       * The @toad command has been removed. The security issues it
+         presents, though not unsolvable, aren't worth solving just to
+         provide Wizards with a humiliating alternative to @newpassword.
+ Fixes: 
+       * %q0-%q9 were not preserved during evaluation of player-message
+         attributes (DESC, SUCC, DROP, etc.) Reported by Geoff Gerrietts
+       * Added some hints from FreeBSD. Suggested by Lord Argon of mux.net.
+       * Better Configure handling of library paths. 
+       * 'nogagged' wasn't working correctly in restrict_command. Fixed.
+       * @search on rooms sometimes reported a null room. Reported by mith.
+       * Nearly all source files now include conf.h (which includes options.h), 
+         and do so before any other PennMUSH header file except config.h 
+         and copyrite.h.  Suggested by Joel Ricketts.
+       * Fixed a few comparisons of <= db_top. Reported by Kurt Fitzner.
+       * @oemit <obj>=<message> was emitting to the enactor's location,
+         rather than to <obj>'s location, as it should have been. Fixed that
+         and fixed help oemit() which documented this wrong behavior.
+         Reported by Kurt Fitzner.
+       * An 8-bit-unclean construction in bsd.c fixed by Christoper/Chicago.
+       * p/noeval <message> (repaging) eval'd message anyway.
+       * Args to $commands that looked like functions were being eval'd
+         even if not in brackets. Reported by [SW]. [TAP]
+       * @lock/listen could cause weird pose corruption. Reported by
+         David at M*U*S*H. [SW]
+       * Clarification of wiz_noenter in mush.cnf suggested by 
+         Interloper at M*U*S*H.
+       * Bug in orflags/andflags could cause weird results with toggles.
+         Like nospoof players tested positive for 'J'. Reported by Saberwind.
+       * Bug in make customize fixed. Reported by Saberwind.
+       * References to a PASSWORD attribute removed from help. Reported by
+         Saberwind.
+       * Fixed db_top bug in search/lsearch reported by Saberwind.
+       * @halt code was screwy. Reported by Krad at M*U*S*H
+       * Wizards could grant @powers to God. Reported by Saberwind.
+       * delete() with negative position arg could crash. Reported by
+         Ashen-Shugar.
+       * @clone of an exit while inside an object could have unpredictable
+         effects. Reported by Andy at RobotechMUSH
+       * Typo in help aposs() fixed. Reported by Philip Mak.
+       * @hide now defaults to @hide/on. Reported by Saberwind.
+       * ldelete() added help list functions. Reported by Rak at M*U*S*H
+       * @attribute/rename didn't update the attribute's name quite right.
+         Reported by mith.
+       * @clone by a room didn't properly set the cloned object's location.
+         Reported by Philip Mak.
+ 
+ & 1.7.2p24
+ Version 1.7.2 patchlevel 24                        April 5, 1999
+ 
+ Fixes:
+       * @search/lsearch didn't behave right when given an upper range
+         argument of exactly the highest dbref in the db. Reported by
+         [SW].
+       * Unlinked and HOME-linked exits were mishandled during dbcks, 
+         just like variably-linked ones in pl23. Reported by [SW].
+       * Help fixes. [TAP]
+ 
+         
+ & 1.7.2p23
+ Version 1.7.2 patchlevel 23                        April 2, 1999
+ 
+ Fixes:
+       * The NoLeave() macro was misdefined, but also not used (whew).
+         Now it's defined right and used.
+       * Giving a / without a switch to commands caused unpredictable
+         behavior. Fixed. Report by Broncalo at Dune III.
+       * Variable-linked exits were mishandled during dbcks, resulting in
+         them being relinked to their source rooms.
+       * @grep/iprint showed the hilighted matches in the same case as 
+         the pattern was given, rather than the case there were in the
+         attribute. Reported by Philip Mak.
+       * The LAST attribute was set differently when players created and
+         when the later connected. The latter case wasn't appropriately
+         prepending single-digit dates with a 0, which fouls up convtime()
+         calls on LAST. Noted by [SW].
+ 
+ 
+ & 1.7.2p22
+ Version 1.7.2 patchlevel 22                        March 19, 1999
+ 
+ Minor changes:
+       * More extensive macro cleanup, based on a patch by David at M*U*S*H
+       * Notable for your own code: Inherit() is now Inheritable(),
+         DarkLegal() checks if something's ok to be invisible when it's DARK,
+         Destroyed() is now IsGarbage(), and some other new helpful macros
+         can be found in hdrs/dbdefs.h
+       * Objects now store their creation cost, not their 'value' (which
+         used to be cost/5 - 1, and had relevance for sacrificing, a now
+         obsolete concept). There is no longer a limit on how much you
+         can spend to create an object, and it's all refunded when the
+         object is recycled. Reported by David at M*U*S*H.
+ 
+ Fixes:
+       * Two memory leaks and one unbalanced mem_check fixed. [SW]
+       * @oemit <room>/<object> was broken in many ways. 
+         Reported by [SW].
+       * Help @drop/@odrop/@adrop updated to mention use on exits.
+         Suggested by Stewart Evans.
+       * God using @logwipe and giving the wrong password crashed the MUSH.
+         [SW]
+       * search() was behaving as lsearchr() not lsearch(). Noted by
+         KMoon.
+       * Bad range arguments for @search and lsearch() now give an
+         error message and don't charge the player. [SW].
+       * Help @search3 had a typo. Fixed by Halatir at M*U*S*H.
+       * Restricting the 'goto' command now also restricts movement
+         through exits. Suggested by Christopher Poff.
+       * Objects and rooms now notify their contents when they start/stop 
+         listening. Report by [RLM].
+       * Error in help for @channel referring to @config. Krad at M*U*S*H
+ 
+ 
+ & 1.7.2p21
+ Version 1.7.2 patchlevel 21                   February 16, 1999
+ 
+ Minor changes:
+       * The restart script now tries to determine its own directory,
+         so it may not require editing to set GAMEDIR any more.
+         Idea by David at M*U*S*H.
+       * Various @find/@search/@entrances commands charged you the
+         FIND_COST even if you didn't have permission to run the command.
+         We don't do that any more. Report by Jonathan Booth.
+       * $command and ^listen pattern matching is now case-insensitive
+         even when the attrib is set REGEXP, unless the attrib is set
+         CASE. In the past, glob matching was case-insensitive and
+         regexp matching was case-sensitive, which cause problems if
+         you tried to regexp match a disabled standard command.
+         Now you've got full flexibility. This may break any current
+         regexp-based $command or ^listen matching that relies on
+         case sensitivity (set those attributes CASE). We now also
+         have a new insensitive regmatch function: regmatchi()
+         Report by Jonathan Booth.
+ 
+ Fixes:
+       * Anyone could @chan/priv channels, even if they didn't pass
+         the modlock. Report by David at M*U*S*H.
+       * DARK disconnects are now shown correctly on chat channels.
+         Really this time. :) Report by Broncalo at Dune III
+       * help for CONNECTED flag updated. Report by matcat at M*U*S*H
+       * Using @kick within a user-defined command could crash the MUSH.
+         Reported by Kludge-BC. [TAP]
+ 
+ 
+ & 1.7.2p20
+ Version 1.7.2 patchlevel 20                   January 26, 1999
+ 
+ Minor changes:
+       * Many expression replaced with macros by David at M*U*S*H.
+ Fixes:
+       * @mail/silent/urgent didn't set the message urgent. 
+         Patch by Halatir at M*U*S*H.
+       * You could get free coins by repeatedly killing your objects.
+         Reported by Max at M*U*S*H. [TAP]
+       * You could rename a channel to a name already in use.
+         Reported by David at M*U*S*H.
+ 
+ 
+ & 1.7.2p19
+ Version 1.7.2 patchlevel 19                   December 2, 1998
+ 
+ Minor changes:
+       * The main select() polling loop now times out every second,
+         so we will reliably call local_timer() and handle alarms
+         every second. Suggested by [NJG].
+       * 'make' now performs a make in game/txt, assuring that help
+         indices are rebuilt after a patch. Suggested by Broncalo at Dune III.
+ 
+ Fixes:
+       * Crash in using @cpattr with standard attribs fixed.
+         Reported by Atuarre at ATS.
+ 
+ 
+ & 1.7.2p18
+ Version 1.7.2 patchlevel 18                   November 25, 1998
+ 
+ Minor changes:
+       * Guest players don't receive a paycheck any more. Suggested by
+         Kyieren at M*U*S*H
+       * look_helper() internal function now uses privtabs. As an
+         epiphenomenon, @set obj/attr=locked is now synonymous to
+         @atrlock obj/attr=on. Suggested by [SW].
+ 
+ Fixes:
+       * Win32 compile fixes. [NJG]
+       * DARK disconnects are now shown correctly on chat channels.
+         Report by Broncalo at Dune III
+       * Quiet players no longer see 'Title set.' messages when
+         using @chan/title. Patch by Halatir at M*U*S*H.
+       * @cpattr/@mvattr now copy attribute flags. Report by Jon Booth.
+       * Some compiler warnings fixed by Atuarre.
+       * The 1 and 5 minute dump warning messages weren't being used.
+       * When matching regexp's, later parenthesized subexpressions 
+         weren't correctly assigned to %-vars when earlier ones 
+         were empty. Report by Geoff Gerrietts. [TAP]
+       * Some messages as a result of looking at a room were being
+         placed onto the wrong queue, so remote viewers (@listen *,
+         @pemit/remit to somewhere) would get things out of order.
+         Reported by David at M*U*S*H. 
+       * Help added for functions() and fixed for timestring(). 
+         Report by Geoff Gerrietts.
+       * soundex() misbehavior for very short words fixed.
+         Report by kmoon.
+       * @attribute/access acted as if it were always /retroactive. [SW]
+       * Changes of flags on a standard attribute were lost across
+         restarts. Reported by [SW].
+       * lcstr, ucstr, capstr, and encrypt and decrypt in the 
+         "real" funcrypt.c are now ansi-aware. The former 3 preserve
+         ansi formatting, while the latter two strip it. You must download
+         a new version of funcrypt.c from ftp.pennmush.org (USA/Canada)
+         or export.pennmush.org -- it is not patched herein. 
+         Reported by Ashen-Shugar.
+ 
+ 
+ & 1.7.2p17
+ Version 1.7.2 patchlevel 17                   November 11, 1998
+ 
+ Minor changes:
+       * Newly created players now have a default uselock of =me.
+       * Number of available file descriptors is printed in startup log.
+         Suggested by Doogie at ATS Trekmush.
+       * The @chat/@cemit commands can no longer be used by gagged players.
+ 
+ Fixes:
+       * Adding functions in funlocal.c shouldn't produce compiler warnings.
+         Patch by Halatir at M*U*S*H
+       * log(0) or ln(0) could crash non-IEEE compliant math libraries.
+         Reported by Drakwil and Talos at SNW.
+       * csrimalloc wouldn't compile with glibc. Fix by Mike Selewski.
+       * Order of checks for number of file descriptors changed to
+         do better on POSIX and hybrid systems like FreeBSD. Suggested by
+         Doogie at ATS Trekmush.
+ 
+ 
+ & 1.7.2p16
+ Version 1.7.2 patchlevel 16                   October 17, 1998
+ 
+ Fixes:
+       * table() could be used to crash the MUSH. Report by Ashen-Shugar. [TAP]
+       * whisper/list didn't work. Report by Kamala at ATS TrekMUSH, via
+         Mikey at M*U*S*H 
+       * andflags(player,C) checked for the (useless) CHOWN_OK flag
+         rather than the COLOR flag. Its now been special-cased to
+         check COLOR on players. This is a kludge, but probably worth it.
+       * Top of admin WHO now lists 'Loc #' not 'Room #', as that's more
+         accurate. Suggested by Saberwind.
+       * @log/wipe returns as @logwipe. Its absence was reported by 
+         Nveid at M*U*S*H.
+       * Date in hdrs/version.h now y2k compliant.
+ 
+ 
+ & 1.7.2p15
+ Version 1.7.2 patchlevel 15                   September 7, 1998
+ 
+ Fixes:
+       * @emits weren't propagated through AUDIBLE exits. Report by Nammyung.
+       * Building w/o ROYALTY_FLAG defined works again. Report by Scott Weber.
+       * When matching $ or ^ patterns with the REGEXP attribute flag set,
+         a failed match would then be improperly checked for normal 
+         matching as well. Reported by Jason Rhodes.
+       * Attribute flags weren't listed in @decomp. Reported by
+         Jonathan Booth.
+       * Make customize never got updated to match the new mushcnf/restart
+         system. Now it has. Reported by Manic at FinalFrontier
+       * @edit now works on attribs starting with _. Reported by Jason Rhodes.
+       * Help files should work better on Win32. Reported by Miphon. [TAP]
+ 
+ 
+ & 1.7.2p14
+ Version 1.7.2 patchlevel 14                   August 4, 1998
+ 
+ Minor Changes:
+       * You may @parent to an object you control via ZMO, even if you
+         don't own it. Patch by Halatir at M*U*S*H
+       * In lsearch() and @search, you may refer to object types
+         in either the singular (ROOM) or plural (ROOMS).
+       * Most chat messages now include the name of the channel. 
+         Suggested by Philip Mak.
+ 
+ Fixes:
+       * Long @chat messages crashed the server. Reported first by Rusty
+         and Siris at M*U*S*H. [TN]
+       * Setting the ZONE flag on a non-zonelocked player should give
+         a warning, and wasn't. Reported by Halatir at M*U*S*H
+       * @@ was parsing its argument. No longer. [RLM]
+       * The @config listing was weird w.r.t. compression. [TN]
+       * @shutdown/reboot could cause a crash if a player had an
+         OUTPUTPREFIX or OUTPUTSUFFIX set.
+       * Hint to linux users about undefining I_MALLOC when using
+         gmalloc. Reported by Kyle Forbes.
+       * @shutdown/reboot now calls local_shutdown(). Reported by Kyle Forbes.
+       * When loading a db in which an object with dbref n has attributes
+         owned by players with dbrefs > n, the attribute ownership was
+         reset to GOD. This should no longer happen unless the owner 
+         really is invalid. Most recently noted by [SW].
+       * Exits that have contents (corrupt!) are fixed up in dbck.
+       * dbck is run whenever the db is loaded.
+       * objeval() help fixed. Reported by Yeechi Chen.
+       * Compiling without ROYALTY_FLAG defined was broken. Reported by
+         Scott Weber.
+       * Sufficiently tricky use of locks could cause a crash due to
+         massive function invocation or recursion. Reported by Atuarre. [TN]
+ 
+ 
+ & 1.7.2p13
+ Version 1.7.2 patchlevel 13                   July 7, 1998
+ 
+ Minor changes:
+       * @mail/file now shows the folder name of the destination folder
+         as well as its number. Suggested by Julianna at ATS TrekMUSH
+ 
+ Fixes:
+       * Problems with ANSI causing Pueblo to bleed have been identified
+         and fixed!
+       * Bug with cwho() fixed. Report by Tripsis at M*U*S*H. [TAP]
+       * 'make diffs' in Makefile updated to use prcs and to produce
+         non-POSIX versions of patch.  
+       * Fixed typo in options.h reported by Kyle Forbes.
+       * Comments in src/services.c and src/filecopy.c are now C-style,
+         not C++ style. Some compilers were puking on these, even though 
+         WIN32 wasn't defined and the preprocessor should've ignored this 
+         stuff. Go figure.
+       * Side-effect functions like pemit() didn't obey the restrictions
+         on the corresponding command (like @pemit), and setting attributes
+         with @set could get around restrictions on ATTRIB_SET. 
+         Reported by Scott Weber. [TAP]
+       * Help for t() and elock() clarified by Octavian at M*U*S*H.
+       * next() could be used on an object in a room that the player
+         didn't control to get the room inventory. Reported by