[PENNMUSH-ANNOUNCE] 1.7.4-patch06

dunemush@pennmush.org dunemush at pennmush.org
Mon, 11 Jun 2001 16:07:14 -0500


This is patch06 to PennMUSH 1.7.4. After applying this patch, you will
have version 1.7.4p6

To apply this patch, save it to a file in your top-level MUSH directory,
and do the following:
	patch -p1 < 1.7.4-patch06
	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:
  * English-style matching has been added to some more commands, 
    to help with the stricter ambiguity checking (@teleport my 3rd foo=box, 
    etc.). [SW]
  * @pemit/list no longer does its useless ## substitution. [SW] 
  * capstr() and art() skip leading ansi and html. [SW]
  * table(), alphamin(), alphamax(), comp(), lcstr(), ucstr(), strinsert(), 
    and delete() are all ansi and html aware. Mixing html and ansi in their 
    arguments is probably a bad idea, though. [SW]
  * reverse() and scramble() are ansi-aware, and still will break html, but 
    in a different way than before. [SW]
  * foreach() strips ansi and html from the string before doing its things. [SW]
  * Complete Norwegian translation by Kenneth Aalberg.
Fixes:
  * Bug in growing hash tables fixed. [SW] 
  * Typo in copyright fixed. Reported by Cheetah@M*U*S*H.
  * Unused variable removed from fun_ansi. Reported by Sidney@M*U*S*H.
  * Mac portability stuff. [DW]
  * Wizards could @chown garbage objects. [SW]
  * Wizards could give to garbage objects. [SW]
  * Wizards could read God's @mail. [SW]
  * Eliminated some compiler warnings. [SW]
  * mid() was quite broken with ansi. right() was less broken. 
    Both hopefully fixed for good. [SW]
  * Fixed a problem with the attribute used with foreach() evaluating from 
    the perspective of the wrong object. [SW]
  * before(), after(), and wrap() are now classified as string functions
    in the help. [TAP]
  * help wildcards now mentions ?. Suggested by cmintrnt@M*U*S*H.
  * help fixes by Jeff Ferrell.
  * Problems with wrap() when the text included %r%r (or started with %r)
    reported by Noltar@Korongil.
  * If you somehow managed to load a corrupt db with a parent loop,
    lparent could infinite-loop. Reported by Ashen-Shugar. [TAP]


Prereq: 1.7.4p5
*** 1_7_4.95/Patchlevel Fri, 25 May 2001 11:53:48 -0500 dunemush (pennmush/5_Patchlevel 1.23 600)
--- 1_7_4.100(w)/Patchlevel Thu, 31 May 2001 11:25:44 -0500 dunemush (pennmush/5_Patchlevel 1.24 600)
***************
*** 1,2 ****
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.4p5
--- 1,2 ----
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.4p6
*** 1_7_4.95/CHANGES Fri, 25 May 2001 11:53:48 -0500 dunemush (pennmush/8_CHANGES 1.213 600)
--- 1_7_4.100(w)/CHANGES Mon, 11 Jun 2001 10:49:17 -0500 dunemush (pennmush/8_CHANGES 1.216 600)
***************
*** 17,22 ****
--- 17,60 ----
  
  ==========================================================================
  
+ Version 1.7.4 patchlevel 6		       June 11, 2001
+ 
+ Minor changes:
+   * English-style matching has been added to some more commands, 
+     to help with the stricter ambiguity checking (@teleport my 3rd foo=box, 
+     etc.). [SW]
+   * @pemit/list no longer does its useless ## substitution. [SW] 
+   * capstr() and art() skip leading ansi and html. [SW]
+   * table(), alphamin(), alphamax(), comp(), lcstr(), ucstr(), strinsert(), 
+     and delete() are all ansi and html aware. Mixing html and ansi in their 
+     arguments is probably a bad idea, though. [SW]
+   * reverse() and scramble() are ansi-aware, and still will break html, but 
+     in a different way than before. [SW]
+   * foreach() strips ansi and html from the string before doing its things. [SW]
+   * Complete Norwegian translation by Kenneth Aalberg.
+ Fixes:
+   * Bug in growing hash tables fixed. [SW] 
+   * Typo in copyright fixed. Reported by Cheetah@M*U*S*H.
+   * Unused variable removed from fun_ansi. Reported by Sidney@M*U*S*H.
+   * Mac portability stuff. [DW]
+   * Wizards could @chown garbage objects. [SW]
+   * Wizards could give to garbage objects. [SW]
+   * Wizards could read God's @mail. [SW]
+   * Eliminated some compiler warnings. [SW]
+   * mid() was quite broken with ansi. right() was less broken. 
+     Both hopefully fixed for good. [SW]
+   * Fixed a problem with the attribute used with foreach() evaluating from 
+     the perspective of the wrong object. [SW]
+   * before(), after(), and wrap() are now classified as string functions
+     in the help. [TAP]
+   * help wildcards now mentions ?. Suggested by cmintrnt@M*U*S*H.
+   * help fixes by Jeff Ferrell.
+   * Problems with wrap() when the text included %r%r (or started with %r)
+     reported by Noltar@Korongil.
+   * If you somehow managed to load a corrupt db with a parent loop,
+     lparent could infinite-loop. Reported by Ashen-Shugar. [TAP]
+ 
+ 
  Version 1.7.4 patchlevel 5		       May 25, 2001
  
  Fixes:
*** 1_7_4.95/game/txt/hlp/pennvers.hlp Fri, 25 May 2001 11:53:48 -0500 dunemush (pennmush/12_pennvers.h 1.163 600)
--- 1_7_4.100(w)/game/txt/hlp/pennvers.hlp Mon, 11 Jun 2001 10:49:41 -0500 dunemush (pennmush/12_pennvers.h 1.166 600)
***************
*** 1,5 ****
  & changes
! & 1.7.4p5
  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'
--- 1,5 ----
  & changes
! & 1.7.4p6
  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'
***************
*** 11,16 ****
--- 11,55 ----
  A list of the patchlevels associated with each release can
  be read in 'help patchlevels'.
  
+ Version 1.7.4 patchlevel 6		       June 11, 2001
+ 
+ Minor changes:
+   * English-style matching has been added to some more commands, 
+     to help with the stricter ambiguity checking (@teleport my 3rd foo=box, 
+     etc.). [SW]
+   * @pemit/list no longer does its useless ## substitution. [SW] 
+   * capstr() and art() skip leading ansi and html. [SW]
+   * table(), alphamin(), alphamax(), comp(), lcstr(), ucstr(), strinsert(), 
+     and delete() are all ansi and html aware. Mixing html and ansi in their 
+     arguments is probably a bad idea, though. [SW]
+   * reverse() and scramble() are ansi-aware, and still will break html, but 
+     in a different way than before. [SW]
+   * foreach() strips ansi and html from the string before doing its things. [SW]
+   * Complete Norwegian translation by Kenneth Aalberg.
+ Fixes:
+   * Bug in growing hash tables fixed. [SW] 
+   * Typo in copyright fixed. Reported by Cheetah@M*U*S*H.
+   * Unused variable removed from fun_ansi. Reported by Sidney@M*U*S*H.
+   * Mac portability stuff. [DW]
+   * Wizards could @chown garbage objects. [SW]
+   * Wizards could give to garbage objects. [SW]
+   * Wizards could read God's @mail. [SW]
+   * Eliminated some compiler warnings. [SW]
+   * mid() was quite broken with ansi. right() was less broken. 
+     Both hopefully fixed for good. [SW]
+   * Fixed a problem with the attribute used with foreach() evaluating from 
+     the perspective of the wrong object. [SW]
+   * before(), after(), and wrap() are now classified as string functions
+     in the help. [TAP]
+   * help wildcards now mentions ?. Suggested by cmintrnt@M*U*S*H.
+   * help fixes by Jeff Ferrell.
+   * Problems with wrap() when the text included %r%r (or started with %r)
+     reported by Noltar@Korongil.
+   * If you somehow managed to load a corrupt db with a parent loop,
+     lparent could infinite-loop. Reported by Ashen-Shugar. [TAP]
+ 
+ 
+ & 1.7.4p5
  Version 1.7.4 patchlevel 5		       May 25, 2001
  
  Fixes:
***************
*** 4661,4667 ****
  For information on a specific patchlevel of one of the versions listed,
  type 'help <version>p<patchlevel>'. For example, 'help 1.7.2p3'
  
! 1.7.4: 0, 1, 2, 3, 4, 5
  1.7.3: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
  1.7.2: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
         19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
--- 4700,4706 ----
  For information on a specific patchlevel of one of the versions listed,
  type 'help <version>p<patchlevel>'. For example, 'help 1.7.2p3'
  
! 1.7.4: 0, 1, 2, 3, 4, 5, 6
  1.7.3: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
  1.7.2: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
         19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
*** 1_7_4.95/game/txt/hlp/penntop.hlp Wed, 14 Mar 2001 14:29:38 -0600 dunemush (pennmush/13_penntop.hl 1.2.1.27 600)
--- 1_7_4.100(w)/game/txt/hlp/penntop.hlp Sat, 02 Jun 2001 12:41:26 -0500 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.1 600)
***************
*** 1635,1642 ****
    You can exclude warnings from a larger list by using !<warning>
    after the larger list. For example: @warnings me=all !exit-oneway
  & WILDCARDS
!   A wildcard is represented as an asterisk (*) in user-defined commands
!   and matches any string.  For example, let's say that you want a command
    called "supercalifragalisticexpealidocious" (don't ask me why), but you
    don't want to force people to type the whole thing to trigger the command.
    You could use a wildcard in the command trigger to match substrings of it:
--- 1635,1643 ----
    You can exclude warnings from a larger list by using !<warning>
    after the larger list. For example: @warnings me=all !exit-oneway
  & WILDCARDS
!   PennMUSH has two standard wildcards in user-defined commands:
!   an asterisk (*) matches any string, and a question mark (?) matches
!   a single character.  For example, let's say that you want a command
    called "supercalifragalisticexpealidocious" (don't ask me why), but you
    don't want to force people to type the whole thing to trigger the command.
    You could use a wildcard in the command trigger to match substrings of it:
***************
*** 1653,1659 ****
    supercalifoobert
    > whee
  
! See also: USER-DEFINED COMMANDS
  & ZONE MASTER ROOMS
  & ZMR
    
--- 1654,1660 ----
    supercalifoobert
    > whee
  
! See also: USER-DEFINED COMMANDS, REGEXP
  & ZONE MASTER ROOMS
  & ZMR
    
*** 1_7_4.95/game/txt/hlp/pennfunc.hlp Wed, 25 Apr 2001 14:22:52 -0500 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7 600)
--- 1_7_4.100(w)/game/txt/hlp/pennfunc.hlp Thu, 07 Jun 2001 11:01:14 -0500 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.1 600)
***************
*** 135,147 ****
    can take an arbitrary <delimiter> argument to specify what delimits
    list elements; if none is provided, a space is used by default.
  
!   after()       before()      element()     elements()    extract()
!   first()       grab()        graball()     index()       insert()
!   itemize()     items()       iter()        last()        ldelete()     
!   map()         match()       matchall()    member()      mix()         
!   munge()       remove()      replace()     rest()        revwords()    
!   setdiff()     setinter()    setunion()    shuffle()     sort()        
!   sortby()      splice()      wordpos()     words()       wrap()
      
  See also: LISTS
  & Math functions
--- 135,147 ----
    can take an arbitrary <delimiter> argument to specify what delimits
    list elements; if none is provided, a space is used by default.
  
!   element()     elements()    extract()     first()       grab()
!   graball()     index()       insert()      itemize()     items()
!   iter()        last()        ldelete()     map()         match()
!   matchall()    member()      mix()         munge()       remove()
!   replace()     rest()        revwords()    setdiff()     setinter()
!   setunion()    shuffle()     sort()        sortby()      splice()
!   wordpos()     words()
      
  See also: LISTS
  & Math functions
***************
*** 179,193 ****
    String functions take at least one string and return a transformed
    string, parts of a string, or a value related to the string(s).
    
!   alphamin()    alphamax()    art()         brackets()    capstr()      
!   case()        caseall()     cat()         center()      comp()
!   decrypt()     delete()      edit()        encrypt()     escape()
!   if()          ifelse()      lcstr()       left()        lit()
!   ljust()       merge()       mid()         pos()         regedit()
!   regmatch()    repeat()      reverse()     right()       rjust()
!   scramble()    secure()      space()       spellnum()    squish()
!   strcat()      strinsert()   stripansi()   strlen()      switch()
!   trim()        ucstr()
   
  See also: STRINGS
  & Time functions
--- 179,193 ----
    String functions take at least one string and return a transformed
    string, parts of a string, or a value related to the string(s).
    
!   after()       alphamin()    alphamax()    art()         before()
!   brackets()    capstr()      case()        caseall()     cat()
!   center()      comp()        decrypt()     delete()      edit()
!   encrypt()     escape()      if()          ifelse()      lcstr()
!   left()        lit()         ljust()       merge()       mid()
!   pos()         regedit()     regmatch()    repeat()      reverse()
!   right()       rjust()       scramble()    secure()      space()
!   spellnum()    squish()      strcat()      strinsert()   stripansi()
!   strlen()      switch()      trim()        ucstr()       wrap()
   
  See also: STRINGS
  & Time functions
***************
*** 665,671 ****
    This function simulates rolling dice. It "rolls" a die with a given
    number of sides, a certain number of times, and sums the results.
    For example, DIE(2, 6) would roll "2d6" - two six-sided dice,
!   generating a result in the range 2-12.
  & DIG()
    dig(<name> [, <exit to> [, <exit from>]])
   
--- 665,672 ----
    This function simulates rolling dice. It "rolls" a die with a given
    number of sides, a certain number of times, and sums the results.
    For example, DIE(2, 6) would roll "2d6" - two six-sided dice,
!   generating a result in the range 2-12. The maximum number of
!   dice this function will roll in a single call is 20.
  & DIG()
    dig(<name> [, <exit to> [, <exit from>]])
   
*** 1_7_4.95/game/txt/hlp/penncmd.hlp Fri, 11 May 2001 15:40:56 -0500 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3 600)
--- 1_7_4.100(w)/game/txt/hlp/penncmd.hlp Mon, 11 Jun 2001 10:48:00 -0500 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.2 600)
***************
*** 2189,2197 ****
    a list:  @pemit/list <object 1> [<object 2> <object N>] = <message>
    There can be any number of objects in the list. The objects must be
    specified by dbref number. You will not get back a "confirmation"
!   message for the /list form of this command. You can use ## in the
!   <message>, which will be replaced with the db#'s of each object in
!   the message sent to that object.
    
  (continued in help @pemit2)
  & @pemit2
--- 2189,2195 ----
    a list:  @pemit/list <object 1> [<object 2> <object N>] = <message>
    There can be any number of objects in the list. The objects must be
    specified by dbref number. You will not get back a "confirmation"
!   message for the /list form of this command. 
    
  (continued in help @pemit2)
  & @pemit2
***************
*** 2559,2565 ****
     regexp      -- Treat the hostname pattern as a regular expression
                    instead of a wildcard pattern.
  & @sitelock3
!  If you specific a character name after the options, the options
   are only checked if the host pattern matches, AND the character
   being checked for connect support matches the one you gave.
   Use it only with connect and !connect options, since they're
--- 2557,2563 ----
     regexp      -- Treat the hostname pattern as a regular expression
                    instead of a wildcard pattern.
  & @sitelock3
!  If you specify a character name after the options, the options
   are only checked if the host pattern matches, AND the character
   being checked for connect support matches the one you gave.
   Use it only with connect and !connect options, since they're
*** 1_7_4.95/game/names.cnf Fri, 02 Mar 2001 10:50:52 -0600 dunemush (pennmush/40_names.cnf 1.1.2.1.1.1.1.1 600)
--- 1_7_4.100(w)/game/names.cnf Thu, 31 May 2001 15:40:27 -0500 dunemush (pennmush/40_names.cnf 1.1.2.1.1.1.1.1.1.1 600)
***************
*** 33,38 ****
--- 33,39 ----
  me
  name
  nigger
+ nigga
  nipple
  nutsack
  ovaries
*** 1_7_4.95/hints/win32-gcc.sh Sat, 15 Apr 2000 10:56:00 -0500 dunemush (pennmush/b/0_win32-gcc. 1.1 600)
--- 1_7_4.100(w)/hints/win32-gcc.sh Thu, 07 Jun 2001 11:05:39 -0500 dunemush (pennmush/b/0_win32-gcc. 1.2 600)
***************
*** 2,4 ****
--- 2,5 ----
  cc='gcc'
  usenm='n'
  h_fcntl='false'
+ d_ipv6='undef'
*** 1_7_4.95/src/wiz.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/b/23_wiz.c 1.44.1.1.1.1 660)
--- 1_7_4.100(w)/src/wiz.c Mon, 11 Jun 2001 10:48:00 -0500 dunemush (pennmush/b/23_wiz.c 1.44.1.1.1.1.1.2 660)
***************
*** 336,342 ****
      victim = player;
      to = arg1;
    } else {
!     if ((victim = noisy_match_result(player, arg1, NOTYPE, MAT_OBJECTS)) ==
  	NOTHING) {
        return;
      }
--- 336,342 ----
      victim = player;
      to = arg1;
    } else {
!     if ((victim = noisy_match_result(player, arg1, NOTYPE, MAT_OBJECTS | MAT_ENGLISH)) ==
  	NOTHING) {
        return;
      }
***************
*** 1782,1788 ****
--- 1782,1792 ----
  #ifndef WIN32
  	close(reserved);
  #endif
+ #ifdef macintosh
+ 	if ((fp = fopen(NAMES_FILE, "rb")) == NULL) {
+ #else
  	if ((fp = fopen(NAMES_FILE, "r")) == NULL) {
+ #endif
  	  notify(player, T("Unable to open names file."));
  	} else {
  	  while (fgets(buffer, 79, fp)) {
***************
*** 1801,1808 ****
--- 1805,1817 ----
  #ifndef WIN32
  	close(reserved);
  #endif
+ #ifdef macintosh
+ 	if ((fp = fopen(NAMES_FILE, "rb")) != NULL) {
+ 	  if ((fptmp = fopen("tmp.tmp", "wb")) == NULL) {
+ #else
  	if ((fp = fopen(NAMES_FILE, "r")) != NULL) {
  	  if ((fptmp = fopen("tmp.tmp", "w")) == NULL) {
+ #endif
  	    notify(player, T("Unable to open names file."));
  	    fclose(fp);
  	  } else {
***************
*** 1837,1843 ****
--- 1846,1856 ----
  #ifndef WIN32
        close(reserved);
  #endif
+ #ifdef macintosh
+       if ((fp = fopen(NAMES_FILE, "ab")) != NULL) {
+ #else
        if ((fp = fopen(NAMES_FILE, "a")) != NULL) {
+ #endif
  	/* Put a newline at the end of the site */
  	fprintf(fp, "%s\n", site);
  	fclose(fp);
*** 1_7_4.95/src/help.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/f/32_help.c 1.4.1.2.1.1.1.3.2.2.1.1.2.1 660)
--- 1_7_4.100(w)/src/help.c Thu, 07 Jun 2001 11:35:44 -0500 dunemush (pennmush/f/32_help.c 1.4.1.2.1.1.1.3.2.2.1.1.2.1.1.2 660)
***************
*** 22,27 ****
--- 22,31 ----
  #include "memcheck.h"
  #include "confmagic.h"
  
+ #ifdef macintosh
+ extern void PMConvertPath(char *path);
+ #endif
+ 
  HASHTAB help_files;
  
  static int help_init = 0;
***************
*** 86,91 ****
--- 90,98 ----
      do_rawlog(LT_ERR, T("Duplicate help_command %s ignored."), command_name);
      return;
    }
+ #ifdef macintosh
+   PMConvertPath((char *) filename);
+ #endif
  
    h = mush_malloc(sizeof *h, "help_file.entry");
    h->command = mush_strdup(strupper(command_name), "help_file.command");
*** 1_7_4.95/src/htab.c Fri, 08 Dec 2000 15:18:14 -0600 dunemush (pennmush/b/30_htab.c 1.8 660)
--- 1_7_4.100(w)/src/htab.c Mon, 11 Jun 2001 10:48:00 -0500 dunemush (pennmush/b/30_htab.c 1.8.1.1 660)
***************
*** 220,226 ****
    int i;
    HASHENT **oldarr;
    HASHENT **newarr;
!   HASHENT *hent, *nent;
    int hval;
    int osize;
    int mask;
--- 220,226 ----
    int i;
    HASHENT **oldarr;
    HASHENT **newarr;
!   HASHENT *hent, *nent, *curr, *old;
    int hval;
    int osize;
    int mask;
***************
*** 250,257 ****
      while (hent) {
        nent = hent->next;
        hval = hash_val(hent->key, mask);
!       hent->next = newarr[hval];
!       newarr[hval] = hent;
        hent = nent;
      }
    }
--- 250,268 ----
      while (hent) {
        nent = hent->next;
        hval = hash_val(hent->key, mask);
!       for (curr = newarr[hval], old = NULL;
!            curr;
!            old = curr, curr = curr->next) {
!         if (strcmp(curr->key, hent->key) > 0)
!           break;
!       }
!       if (old) {
!         old->next = hent;
!         hent->next = curr;
!       } else {
!         hent->next = newarr[hval];
!         newarr[hval] = hent;
!       }
        hent = nent;
      }
    }
*** 1_7_4.95/src/switchinc.c Fri, 25 May 2001 11:53:48 -0500 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.1 660)
--- 1_7_4.100(w)/src/switchinc.c Thu, 07 Jun 2001 11:35:46 -0500 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 660)
***************
*** 1,512 ****
  {
!   "ACCESS", SWITCH_ACCESS
! }
! ,
! {
!   "ADD", SWITCH_ADD
! }
! ,
! {
!   "ALL", SWITCH_ALL
! }
! ,
! {
!   "ATTRIBS", SWITCH_ATTRIBS
! }
! ,
! {
!   "BAN", SWITCH_BAN
! }
! ,
! {
!   "BLIND", SWITCH_BLIND
! }
! ,
! {
!   "BRIEF", SWITCH_BRIEF
! }
! ,
! {
!   "CHECK", SWITCH_CHECK
! }
! ,
! {
!   "CHOWN", SWITCH_CHOWN
! }
! ,
! {
!   "CLEAR", SWITCH_CLEAR
! }
! ,
! {
!   "CMD", SWITCH_CMD
! }
! ,
! {
!   "COMMANDS", SWITCH_COMMANDS
! }
! ,
! {
!   "CONN", SWITCH_CONN
! }
! ,
! {
!   "CONNECT", SWITCH_CONNECT
! }
! ,
! {
!   "CONNECTED", SWITCH_CONNECTED
! }
! ,
! {
!   "CONTENTS", SWITCH_CONTENTS
! }
! ,
! {
!   "COSTS", SWITCH_COSTS
! }
! ,
! {
!   "COUNT", SWITCH_COUNT
! }
! ,
! {
!   "CREATE", SWITCH_CREATE
! }
! ,
! {
!   "DATABASE", SWITCH_DATABASE
! }
! ,
! {
!   "DB", SWITCH_DB
! }
! ,
! {
!   "DEBUG", SWITCH_DEBUG
! }
! ,
! {
!   "DECOMPILE", SWITCH_DECOMPILE
! }
! ,
! {
!   "DEFAULTS", SWITCH_DEFAULTS
! }
! ,
! {
!   "DELETE", SWITCH_DELETE
! }
! ,
! {
!   "DELIM", SWITCH_DELIM
! }
! ,
! {
!   "DESC", SWITCH_DESC
! }
! ,
! {
!   "DESTROY", SWITCH_DESTROY
! }
! ,
! {
!   "DISABLE", SWITCH_DISABLE
! }
! ,
! {
!   "DOWN", SWITCH_DOWN
! }
! ,
! {
!   "DSTATS", SWITCH_DSTATS
! }
! ,
! {
!   "EMIT", SWITCH_EMIT
! }
! ,
! {
!   "ENABLE", SWITCH_ENABLE
! }
! ,
! {
!   "ERR", SWITCH_ERR
! }
! ,
! {
!   "EXITS", SWITCH_EXITS
! }
! ,
! {
!   "FILE", SWITCH_FILE
! }
! ,
! {
!   "FIRST", SWITCH_FIRST
! }
! ,
! {
!   "FLAGS", SWITCH_FLAGS
! }
! ,
! {
!   "FOLDERS", SWITCH_FOLDERS
! }
! ,
! {
!   "FORWARD", SWITCH_FORWARD
! }
! ,
! {
!   "FSTATS", SWITCH_FSTATS
! }
! ,
! {
!   "FULL", SWITCH_FULL
! }
! ,
! {
!   "FUNCTIONS", SWITCH_FUNCTIONS
! }
! ,
! {
!   "FWD", SWITCH_FWD
! }
! ,
! {
!   "GAG", SWITCH_GAG
! }
! ,
! {
!   "GLOBALS", SWITCH_GLOBALS
! }
! ,
! {
!   "HEADER", SWITCH_HEADER
! }
! ,
! {
!   "HERE", SWITCH_HERE
! }
! ,
! {
!   "HIDE", SWITCH_HIDE
! }
! ,
! {
!   "ILIST", SWITCH_ILIST
! }
! ,
! {
!   "INVENTORY", SWITCH_INVENTORY
! }
! ,
! {
!   "IPRINT", SWITCH_IPRINT
! }
! ,
! {
!   "JOIN", SWITCH_JOIN
! }
! ,
! {
!   "LIST", SWITCH_LIST
! }
! ,
! {
!   "LOWERCASE", SWITCH_LOWERCASE
! }
! ,
! {
!   "ME", SWITCH_ME
! }
! ,
! {
!   "MEMBERS", SWITCH_MEMBERS
! }
! ,
! {
!   "MOD", SWITCH_MOD
! }
! ,
! {
!   "MORTAL", SWITCH_MORTAL
! }
! ,
! {
!   "MOTD", SWITCH_MOTD
! }
! ,
! {
!   "MUTE", SWITCH_MUTE
! }
! ,
! {
!   "NAME", SWITCH_NAME
! }
! ,
! {
!   "NO", SWITCH_NO
! }
! ,
! {
!   "NOEVAL", SWITCH_NOEVAL
! }
! ,
! {
!   "NOFLAGCOPY", SWITCH_NOFLAGCOPY
! }
! ,
! {
!   "NOISY", SWITCH_NOISY
! }
! ,
! {
!   "NOSIG", SWITCH_NOSIG
! }
! ,
! {
!   "NOSPACE", SWITCH_NOSPACE
! }
! ,
! {
!   "NOTIFY", SWITCH_NOTIFY
! }
! ,
! {
!   "NUKE", SWITCH_NUKE
! }
! ,
! {
!   "OFF", SWITCH_OFF
! }
! ,
! {
!   "ON", SWITCH_ON
! }
! ,
! {
!   "OUTSIDE", SWITCH_OUTSIDE
! }
! ,
! {
!   "OVERRIDE", SWITCH_OVERRIDE
! }
! ,
! {
!   "PANIC", SWITCH_PANIC
! }
! ,
! {
!   "PARANOID", SWITCH_PARANOID
! }
! ,
! {
!   "PLAYERS", SWITCH_PLAYERS
! }
! ,
! {
!   "PORT", SWITCH_PORT
! }
! ,
! {
!   "POSE", SWITCH_POSE
! }
! ,
! {
!   "PRESERVE", SWITCH_PRESERVE
! }
! ,
! {
!   "PRINT", SWITCH_PRINT
! }
! ,
! {
!   "PRIVS", SWITCH_PRIVS
! }
! ,
! {
!   "PURGE", SWITCH_PURGE
! }
! ,
! {
!   "QUICK", SWITCH_QUICK
! }
! ,
! {
!   "QUIET", SWITCH_QUIET
! }
! ,
! {
!   "READ", SWITCH_READ
! }
! ,
! {
!   "REBOOT", SWITCH_REBOOT
! }
! ,
! {
!   "REGISTER", SWITCH_REGISTER
! }
! ,
! {
!   "REMOVE", SWITCH_REMOVE
! }
! ,
! {
!   "RENAME", SWITCH_RENAME
! }
! ,
! {
!   "RESTORE", SWITCH_RESTORE
! }
! ,
! {
!   "RESTRICT", SWITCH_RESTRICT
! }
! ,
! {
!   "RETROACTIVE", SWITCH_RETROACTIVE
! }
! ,
! {
!   "ROOM", SWITCH_ROOM
! }
! ,
! {
!   "ROOMS", SWITCH_ROOMS
! }
! ,
! {
!   "ROYALTY", SWITCH_ROYALTY
! }
! ,
! {
!   "SEE", SWITCH_SEE
! }
! ,
! {
!   "SEEFLAG", SWITCH_SEEFLAG
! }
! ,
! {
!   "SELF", SWITCH_SELF
! }
! ,
! {
!   "SEND", SWITCH_SEND
! }
! ,
! {
!   "SET", SWITCH_SET
! }
! ,
! {
!   "SILENT", SWITCH_SILENT
! }
! ,
! {
!   "SKIPDEFAULTS", SWITCH_SKIPDEFAULTS
! }
! ,
! {
!   "SPEAK", SWITCH_SPEAK
! }
! ,
! {
!   "STATS", SWITCH_STATS
! }
! ,
! {
!   "SUMMARY", SWITCH_SUMMARY
! }
! ,
! {
!   "TABLES", SWITCH_TABLES
! }
! ,
! {
!   "TAG", SWITCH_TAG
! }
! ,
! {
!   "TELEPORT", SWITCH_TELEPORT
! }
! ,
! {
!   "TF", SWITCH_TF
! }
! ,
! {
!   "THINGS", SWITCH_THINGS
! }
! ,
! {
!   "TITLE", SWITCH_TITLE
! }
! ,
! {
!   "TRACE", SWITCH_TRACE
! }
! ,
! {
!   "UNCLEAR", SWITCH_UNCLEAR
! }
! ,
! {
!   "UNFOLDER", SWITCH_UNFOLDER
! }
! ,
! {
!   "UNGAG", SWITCH_UNGAG
! }
! ,
! {
!   "UNHIDE", SWITCH_UNHIDE
! }
! ,
! {
!   "UNMUTE", SWITCH_UNMUTE
! }
! ,
! {
!   "UNTAG", SWITCH_UNTAG
! }
! ,
! {
!   "UNTIL", SWITCH_UNTIL
! }
! ,
! {
!   "URGENT", SWITCH_URGENT
! }
! ,
! {
!   "USEFLAG", SWITCH_USEFLAG
! }
! ,
! {
!   "WHAT", SWITCH_WHAT
! }
! ,
! {
!   "WIPE", SWITCH_WIPE
! }
! ,
! {
!   "WIZ", SWITCH_WIZ
! }
! ,
! {
!   "WIZARD", SWITCH_WIZARD
! }
! ,
! {
!   "YES", SWITCH_YES
! }
! ,
! {
!   "ZONE", SWITCH_ZONE
! }
  ,
--- 1,385 ----
  {
! "ACCESS", SWITCH_ACCESS}
! 
! , {
! "ADD", SWITCH_ADD}
! 
! , {
! "ALL", SWITCH_ALL}
! 
! , {
! "ATTRIBS", SWITCH_ATTRIBS}
! 
! , {
! "BAN", SWITCH_BAN}
! 
! , {
! "BLIND", SWITCH_BLIND}
! 
! , {
! "BRIEF", SWITCH_BRIEF}
! 
! , {
! "CHECK", SWITCH_CHECK}
! 
! , {
! "CHOWN", SWITCH_CHOWN}
! 
! , {
! "CLEAR", SWITCH_CLEAR}
! 
! , {
! "CMD", SWITCH_CMD}
! 
! , {
! "COMMANDS", SWITCH_COMMANDS}
! 
! , {
! "CONN", SWITCH_CONN}
! 
! , {
! "CONNECT", SWITCH_CONNECT}
! 
! , {
! "CONNECTED", SWITCH_CONNECTED}
! 
! , {
! "CONTENTS", SWITCH_CONTENTS}
! 
! , {
! "COSTS", SWITCH_COSTS}
! 
! , {
! "COUNT", SWITCH_COUNT}
! 
! , {
! "CREATE", SWITCH_CREATE}
! 
! , {
! "DATABASE", SWITCH_DATABASE}
! 
! , {
! "DB", SWITCH_DB}
! 
! , {
! "DEBUG", SWITCH_DEBUG}
! 
! , {
! "DECOMPILE", SWITCH_DECOMPILE}
! 
! , {
! "DEFAULTS", SWITCH_DEFAULTS}
! 
! , {
! "DELETE", SWITCH_DELETE}
! 
! , {
! "DELIM", SWITCH_DELIM}
! 
! , {
! "DESC", SWITCH_DESC}
! 
! , {
! "DESTROY", SWITCH_DESTROY}
! 
! , {
! "DISABLE", SWITCH_DISABLE}
! 
! , {
! "DOWN", SWITCH_DOWN}
! 
! , {
! "DSTATS", SWITCH_DSTATS}
! 
! , {
! "EMIT", SWITCH_EMIT}
! 
! , {
! "ENABLE", SWITCH_ENABLE}
! 
! , {
! "ERR", SWITCH_ERR}
! 
! , {
! "EXITS", SWITCH_EXITS}
! 
! , {
! "FILE", SWITCH_FILE}
! 
! , {
! "FIRST", SWITCH_FIRST}
! 
! , {
! "FLAGS", SWITCH_FLAGS}
! 
! , {
! "FOLDERS", SWITCH_FOLDERS}
! 
! , {
! "FORWARD", SWITCH_FORWARD}
! 
! , {
! "FSTATS", SWITCH_FSTATS}
! 
! , {
! "FULL", SWITCH_FULL}
! 
! , {
! "FUNCTIONS", SWITCH_FUNCTIONS}
! 
! , {
! "FWD", SWITCH_FWD}
! 
! , {
! "GAG", SWITCH_GAG}
! 
! , {
! "GLOBALS", SWITCH_GLOBALS}
! 
! , {
! "HEADER", SWITCH_HEADER}
! 
! , {
! "HERE", SWITCH_HERE}
! 
! , {
! "HIDE", SWITCH_HIDE}
! 
! , {
! "ILIST", SWITCH_ILIST}
! 
! , {
! "INVENTORY", SWITCH_INVENTORY}
! 
! , {
! "IPRINT", SWITCH_IPRINT}
! 
! , {
! "JOIN", SWITCH_JOIN}
! 
! , {
! "LIST", SWITCH_LIST}
! 
! , {
! "LOWERCASE", SWITCH_LOWERCASE}
! 
! , {
! "ME", SWITCH_ME}
! 
! , {
! "MEMBERS", SWITCH_MEMBERS}
! 
! , {
! "MOD", SWITCH_MOD}
! 
! , {
! "MORTAL", SWITCH_MORTAL}
! 
! , {
! "MOTD", SWITCH_MOTD}
! 
! , {
! "MUTE", SWITCH_MUTE}
! 
! , {
! "NAME", SWITCH_NAME}
! 
! , {
! "NO", SWITCH_NO}
! 
! , {
! "NOEVAL", SWITCH_NOEVAL}
! 
! , {
! "NOFLAGCOPY", SWITCH_NOFLAGCOPY}
! 
! , {
! "NOISY", SWITCH_NOISY}
! 
! , {
! "NOSIG", SWITCH_NOSIG}
! 
! , {
! "NOSPACE", SWITCH_NOSPACE}
! 
! , {
! "NOTIFY", SWITCH_NOTIFY}
! 
! , {
! "NUKE", SWITCH_NUKE}
! 
! , {
! "OFF", SWITCH_OFF}
! 
! , {
! "ON", SWITCH_ON}
! 
! , {
! "OUTSIDE", SWITCH_OUTSIDE}
! 
! , {
! "OVERRIDE", SWITCH_OVERRIDE}
! 
! , {
! "PANIC", SWITCH_PANIC}
! 
! , {
! "PARANOID", SWITCH_PARANOID}
! 
! , {
! "PLAYERS", SWITCH_PLAYERS}
! 
! , {
! "PORT", SWITCH_PORT}
! 
! , {
! "POSE", SWITCH_POSE}
! 
! , {
! "PRESERVE", SWITCH_PRESERVE}
! 
! , {
! "PRINT", SWITCH_PRINT}
! 
! , {
! "PRIVS", SWITCH_PRIVS}
! 
! , {
! "PURGE", SWITCH_PURGE}
! 
! , {
! "QUICK", SWITCH_QUICK}
! 
! , {
! "QUIET", SWITCH_QUIET}
! 
! , {
! "READ", SWITCH_READ}
! 
! , {
! "REBOOT", SWITCH_REBOOT}
! 
! , {
! "REGISTER", SWITCH_REGISTER}
! 
! , {
! "REMOVE", SWITCH_REMOVE}
! 
! , {
! "RENAME", SWITCH_RENAME}
! 
! , {
! "RESTORE", SWITCH_RESTORE}
! 
! , {
! "RESTRICT", SWITCH_RESTRICT}
! 
! , {
! "RETROACTIVE", SWITCH_RETROACTIVE}
! 
! , {
! "ROOM", SWITCH_ROOM}
! 
! , {
! "ROOMS", SWITCH_ROOMS}
! 
! , {
! "ROYALTY", SWITCH_ROYALTY}
! 
! , {
! "SEE", SWITCH_SEE}
! 
! , {
! "SEEFLAG", SWITCH_SEEFLAG}
! 
! , {
! "SELF", SWITCH_SELF}
! 
! , {
! "SEND", SWITCH_SEND}
! 
! , {
! "SET", SWITCH_SET}
! 
! , {
! "SILENT", SWITCH_SILENT}
! 
! , {
! "SKIPDEFAULTS", SWITCH_SKIPDEFAULTS}
! 
! , {
! "SPEAK", SWITCH_SPEAK}
! 
! , {
! "STATS", SWITCH_STATS}
! 
! , {
! "SUMMARY", SWITCH_SUMMARY}
! 
! , {
! "TABLES", SWITCH_TABLES}
! 
! , {
! "TAG", SWITCH_TAG}
! 
! , {
! "TELEPORT", SWITCH_TELEPORT}
! 
! , {
! "TF", SWITCH_TF}
! 
! , {
! "THINGS", SWITCH_THINGS}
! 
! , {
! "TITLE", SWITCH_TITLE}
! 
! , {
! "TRACE", SWITCH_TRACE}
! 
! , {
! "UNCLEAR", SWITCH_UNCLEAR}
! 
! , {
! "UNFOLDER", SWITCH_UNFOLDER}
! 
! , {
! "UNGAG", SWITCH_UNGAG}
! 
! , {
! "UNHIDE", SWITCH_UNHIDE}
! 
! , {
! "UNMUTE", SWITCH_UNMUTE}
! 
! , {
! "UNTAG", SWITCH_UNTAG}
! 
! , {
! "UNTIL", SWITCH_UNTIL}
! 
! , {
! "URGENT", SWITCH_URGENT}
! 
! , {
! "USEFLAG", SWITCH_USEFLAG}
! 
! , {
! "WHAT", SWITCH_WHAT}
! 
! , {
! "WIPE", SWITCH_WIPE}
! 
! , {
! "WIZ", SWITCH_WIZ}
! 
! , {
! "WIZARD", SWITCH_WIZARD}
! 
! , {
! "YES", SWITCH_YES}
! 
! , {
! "ZONE", SWITCH_ZONE}
! 
  ,
*** 1_7_4.95/src/strutil.c Fri, 25 May 2001 11:53:48 -0500 dunemush (pennmush/b/33_strutil.c 1.28.1.3.1.3.1.2 660)
--- 1_7_4.100(w)/src/strutil.c Thu, 07 Jun 2001 11:35:46 -0500 dunemush (pennmush/b/33_strutil.c 1.28.1.3.1.3.1.5 660)
***************
*** 42,48 ****
  char *
  mush_strdup(s, check)
      const char *s;
!     const char *check;
  {
    char *x;
  
--- 42,48 ----
  char *
  mush_strdup(s, check)
      const char *s;
!     const char *check __attribute__ ((__unused__));
  {
    char *x;
  
***************
*** 347,352 ****
--- 347,376 ----
    APPEND_TO_BUF(maxlen);
  }
  
+ 
+ int
+ safe_ansi_len(src, copylen, buff, bp, maxlen)
+     const char *src;
+     int copylen;
+     char *buff;
+     char **bp;
+     int maxlen;
+ {
+   char tbuf[BUFFER_LEN];
+   char ansibuf[BUFFER_LEN], *ap = ansibuf;
+   int len;
+ 
+   strncpy(tbuf, src, sizeof tbuf);
+   len = ansi_strnlen(tbuf, copylen);
+   ansi_save(tbuf + len - 1, -1, ansibuf, &ap);
+   len = ansi_align(tbuf, len);
+   if (len < BUFFER_LEN)
+     tbuf[len] = '\0';
+   if (safe_copy_str(tbuf, buff, bp, maxlen))
+     return 1;
+   return safe_copy_str(ansibuf, buff, bp, maxlen);
+ }
+ 
  #undef APPEND_ARGS
  #undef APPEND_TO_BUF
  
***************
*** 893,896 ****
--- 917,1144 ----
      else
        break;
    return length;
+ }
+ 
+ char *
+ skip_leading_ansi(s)
+     const char *s;
+ {
+   char *p = (char *) s;
+   if (!p)
+     return NULL;
+   while (*p == ESC_CHAR || *p == TAG_START) {
+     if (*p == ESC_CHAR) {
+       while (*p && *p != 'm')
+ 	p++;
+     } else {			/* TAG_START */
+       while (*p && *p != TAG_END)
+ 	p++;
+     }
+     if (*p)
+       p++;
+   }
+   return p;
+ 
+ }
+ 
+ ansi_string *
+ parse_ansi_string(src)
+     const char *src;
+ {
+   ansi_string *data;
+   char *y, *current = NULL;
+   int p = 0;
+ 
+   if (!src)
+     return NULL;
+ 
+ 
+   data = mush_malloc(sizeof *data, "ansi_string");
+   if (!data)
+     return NULL;
+ 
+   data->len = ansi_strlen((char *) src);
+ 
+   while (*src) {
+     y = skip_leading_ansi(src);
+     if (y != src) {
+       char t = *y;
+       *y = '\0';
+       if (current)
+ 	free(current);
+       current = strdup(src);
+       *y = t;
+       src = y;
+     }
+     if (current)
+       data->codes[p] = strdup(current);
+     else
+       data->codes[p] = NULL;
+     data->text[p] = *src;
+     if (*src)
+       src++;
+     p++;
+   }
+ 
+   while (p <= data->len) {
+     data->codes[p] = NULL;
+     p++;
+   }
+ 
+   if (current)
+     free(current);
+   current = NULL;
+ 
+   return data;
+ }
+ 
+ 
+ void
+ populate_codes(as)
+     ansi_string *as;
+ {
+   int p;
+   char *current = NULL;
+ 
+   if (!as)
+     return;
+ 
+   for (p = 0; p < as->len; p++)
+     if (as->codes[p]) {
+       if (current)
+ 	free(current);
+       current = strdup(as->codes[p]);
+     } else {
+       if (!current)
+ 	current = strdup(ANSI_NORMAL);
+       as->codes[p] = strdup(current);
+     }
+ }
+ 
+ void
+ depopulate_codes(as)
+     ansi_string *as;
+ {
+   int p;
+ 
+   if (!as)
+     return;
+ 
+   for (p = 0; p <= as->len; p++) {
+     if (as->codes[p]) {
+       int m = p;
+       for (p++; p < as->len; p++) {
+ 	if (as->codes[p] && strcmp(as->codes[p], as->codes[m]) == 0) {
+ 	  free(as->codes[p]);
+ 	  as->codes[p] = NULL;
+ 	} else {
+ 	  p--;
+ 	  break;
+ 	}
+       }
+     }
+   }
+ }
+ 
+ static int is_ansi_code _((const char *s));
+ static int is_start_html_code _((const char *s)) __attribute__ ((__unused__));
+ static int is_end_html_code _((const char *s));
+ 
+ static int
+ is_ansi_code(s)
+     const char *s;
+ {
+   return s && *s == ESC_CHAR;
+ }
+ 
+ static int
+ is_start_html_code(s)
+     const char *s;
+ {
+   return s && *s == TAG_START && *(s + 1) != '/';
+ }
+ 
+ static int
+ is_end_html_code(s)
+     const char *s;
+ {
+   return s && *s == TAG_START && *(s + 1) == '/';
+ }
+ 
+ void
+ free_ansi_string(as)
+     ansi_string *as;
+ {
+   int p;
+ 
+   if (!as)
+     return;
+   for (p = as->len; p >= 0; p--) {
+     if (as->codes[p])
+       free(as->codes[p]);
+   }
+   mush_free(as, "ansi_string");
+ }
+ 
+ int
+ safe_ansi_string(as, start, len, buff, bp)
+     ansi_string *as;
+     int start, len;
+     char *buff;
+     char **bp;
+ {
+   int p;
+   int in_ansi = 0;
+ 
+   if (!as)
+     return 1;
+ 
+   depopulate_codes(as);
+ 
+   if (start > as->len)
+     return safe_str("", buff, bp);
+ 
+   /* Find the starting codes */
+   if (as->codes[start] == NULL) {
+     for (p = start - 1; p >= 0; p--) {
+       if (as->codes[p]) {
+ 	if (!is_end_html_code(as->codes[p])) {
+ 	  if (safe_str(as->codes[p], buff, bp))
+ 	    return 1;
+ 	  in_ansi = 1;
+ 	}
+ 	break;
+       }
+     }
+   }
+ 
+   /* Copy the text */
+   for (p = start; p < (start + len) && p < as->len; p++) {
+     if (as->codes[p]) {
+       if (safe_str(as->codes[p], buff, bp))
+ 	return 1;
+       if (strcmp(ANSI_NORMAL, as->codes[p]) == 0)
+ 	in_ansi = 0;
+       else
+ 	in_ansi = 1;
+     }
+     if (safe_chr(as->text[p], buff, bp))
+       return 1;
+   }
+ 
+   /* Ooutput closing codes if needed. */
+   if (in_ansi) {
+     for (; p <= as->len; p++) {
+       if (as->codes[p]) {
+ 	if ((is_ansi_code(as->codes[p])
+ 	     && strcmp(ANSI_NORMAL, as->codes[p]) == 0)
+ 	    || is_end_html_code(as->codes[p])) {
+ 	  if (safe_str(as->codes[p], buff, bp))
+ 	    return 1;
+ 	}
+ 	break;
+       }
+     }
+   }
+   return 0;
  }
*** 1_7_4.95/src/speech.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/b/35_speech.c 1.21.1.2.1.3.1.5.1.1.1.7.1.3 660)
--- 1_7_4.100(w)/src/speech.c Mon, 11 Jun 2001 10:48:00 -0500 dunemush (pennmush/b/35_speech.c 1.21.1.2.1.3.1.5.1.1.1.7.1.3.1.1 660)
***************
*** 520,526 ****
    char tbuf[BUFFER_LEN], *bp, *p;
    char listbuff[BUFFER_LEN], *l;
    dbref who;
-   char *msg;
  
    /* If no list or no message, further processing is pointless. */
    if (!message || !*message || !list || !*list)
--- 520,525 ----
***************
*** 535,556 ****
    while ((p = split_token(&l, ' '))) {
      who = noisy_match_result(player, p, NOTYPE, MAT_ABSOLUTE);
      if (GoodObject(who) && okay_pemit(player, who)) {
-       msg = replace_string("##", tprintf("#%d", who), message);
        if (Nospoof(who)) {
- 	if ((*tbuf == '\0') || strstr(message, "##")) {
  	  bp = tbuf;
  	  if (Paranoid(who))
  	    safe_format(tbuf, &bp, "[%s(#%d)->] ", Name(player), player);
  	  else
  	    safe_format(tbuf, &bp, "[%s->] ", Name(player));
! 	  safe_str(msg, tbuf, &bp);
  	  *bp = '\0';
- 	}
  	notify(who, tbuf);
        } else {
! 	notify(who, msg);
        }
-       mush_free((Malloc_t) msg, "replace_string.buff");
      }
    }
  }
--- 534,551 ----
    while ((p = split_token(&l, ' '))) {
      who = noisy_match_result(player, p, NOTYPE, MAT_ABSOLUTE);
      if (GoodObject(who) && okay_pemit(player, who)) {
        if (Nospoof(who)) {
  	  bp = tbuf;
  	  if (Paranoid(who))
  	    safe_format(tbuf, &bp, "[%s(#%d)->] ", Name(player), player);
  	  else
  	    safe_format(tbuf, &bp, "[%s->] ", Name(player));
! 	  safe_str(message, tbuf, &bp);
  	  *bp = '\0';
  	notify(who, tbuf);
        } else {
! 	notify(who, message);
        }
      }
    }
  }
*** 1_7_4.95/src/set.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/b/38_set.c 1.26.1.1 660)
--- 1_7_4.100(w)/src/set.c Mon, 11 Jun 2001 07:35:33 -0500 dunemush (pennmush/b/38_set.c 1.26.1.3 660)
***************
*** 233,238 ****
--- 233,243 ----
      dbref thing;
      dbref newowner;
  {
+ 
+   /* Cant' touch garbage */
+   if (IsGarbage(thing))
+     return 0;
+ 
    /* Wizards can do it all */
    if (Wizard(player))
      return 1;
***************
*** 315,321 ****
  	Inherit(thing))
        notify(player,
  	     T
! 	     ("Warning: @CHOWN/PRESERVE on a target with WIZ, ROY, INHERIT, or @power priveleges."));
    }
  }
  
--- 320,326 ----
  	Inherit(thing))
        notify(player,
  	     T
! 	     ("Warning: @CHOWN/PRESERVE on a target with WIZ, ROY, INHERIT, or @power privileges."));
    }
  }
  
*** 1_7_4.95/src/rob.c Fri, 11 May 2001 15:40:56 -0500 dunemush (pennmush/b/42_rob.c 1.18.1.2 660)
--- 1_7_4.100(w)/src/rob.c Mon, 11 Jun 2001 10:48:00 -0500 dunemush (pennmush/b/42_rob.c 1.18.1.2.1.2 660)
***************
*** 137,143 ****
    int i;
  
    /* check recipient */
!   switch (who = match_result(player, recipient, TYPE_PLAYER, MAT_NEAR_THINGS)) {
    case NOTHING:
      notify(player, T("Give to whom?"));
      return;
--- 137,143 ----
    int i;
  
    /* check recipient */
!   switch (who = match_result(player, recipient, TYPE_PLAYER, MAT_NEAR_THINGS | MAT_ENGLISH)) {
    case NOTHING:
      notify(player, T("Give to whom?"));
      return;
***************
*** 146,157 ****
      return;
    }
  
    /* make sure amount is all digits */
    for (s = amnt; *s && ((isdigit(*s)) || (*s == '-')); s++) ;
    /* must be giving object */
    if (*s) {
      dbref thing;
!     switch (thing = match_result(player, amnt, TYPE_THING, MAT_POSSESSION)) {
      case NOTHING:
        notify(player, T("You don't have that!"));
        return;
--- 146,163 ----
      return;
    }
  
+   /* Can't give to garbage... */
+   if (IsGarbage(who)) {
+     notify(player, T("Give to whome?"));
+     return;
+   }
+ 
    /* make sure amount is all digits */
    for (s = amnt; *s && ((isdigit(*s)) || (*s == '-')); s++) ;
    /* must be giving object */
    if (*s) {
      dbref thing;
!     switch (thing = match_result(player, amnt, TYPE_THING, MAT_POSSESSION | MAT_ENGLISH)) {
      case NOTHING:
        notify(player, T("You don't have that!"));
        return;
*** 1_7_4.95/src/predicat.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/b/44_predicat.c 1.1.1.34.1.1.1.3.1.1 660)
--- 1_7_4.100(w)/src/predicat.c Thu, 07 Jun 2001 11:35:45 -0500 dunemush (pennmush/b/44_predicat.c 1.1.1.34.1.1.1.3.1.2 660)
***************
*** 565,571 ****
--- 565,575 ----
    char *upname;
  
    upname = strupper(name);
+ #ifdef macintosh
+   fp = fopen(NAMES_FILE, "rb");
+ #else
    fp = fopen(NAMES_FILE, "r");
+ #endif
    if (!fp)
      return 0;
    while (!feof(fp)) {
*** 1_7_4.95/src/move.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.1 660)
--- 1_7_4.100(w)/src/move.c Mon, 11 Jun 2001 10:48:00 -0500 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.3 660)
***************
*** 484,490 ****
    dbref loc = Location(player);
    dbref thing;
    char tbuf1[BUFFER_LEN];
!   long match_flags = MAT_NEIGHBOR | MAT_ABSOLUTE | MAT_CHECK_KEYS | MAT_NEAR;
    char *myenv[10];
    int i;
  
--- 484,490 ----
    dbref loc = Location(player);
    dbref thing;
    char tbuf1[BUFFER_LEN];
!   long match_flags = MAT_NEIGHBOR | MAT_ABSOLUTE | MAT_CHECK_KEYS | MAT_NEAR | MAT_ENGLISH;
    char *myenv[10];
    int i;
  
***************
*** 599,605 ****
  
    switch (thing =
  	  match_result(player, name, TYPE_THING,
! 		       MAT_POSSESSION | MAT_ABSOLUTE | MAT_CONTROL)) {
    case NOTHING:
      notify(player, T("You don't have that!"));
      return;
--- 599,605 ----
  
    switch (thing =
  	  match_result(player, name, TYPE_THING,
! 		       MAT_POSSESSION | MAT_ABSOLUTE | MAT_CONTROL | MAT_ENGLISH)) {
    case NOTHING:
      notify(player, T("You don't have that!"));
      return;
***************
*** 650,656 ****
  {
    dbref thing;
    dbref loc;
!   long match_flags = MAT_CHECK_KEYS | MAT_NEIGHBOR | MAT_EXIT;
    if (is_alias || Hasprivs(player))
      match_flags |= MAT_ABSOLUTE;	/* necessary for enter aliases to work */
  
--- 650,656 ----
  {
    dbref thing;
    dbref loc;
!   long match_flags = MAT_CHECK_KEYS | MAT_NEIGHBOR | MAT_EXIT | MAT_ENGLISH;
    if (is_alias || Hasprivs(player))
      match_flags |= MAT_ABSOLUTE;	/* necessary for enter aliases to work */
  
***************
*** 695,701 ****
  {
    dbref loc;
    loc = Location(player);
!   if (IsRoom(loc) || NoLeave(loc)
        || !eval_lock(player, loc, Leave_Lock)
      ) {
      did_it(player, loc, "LFAIL", T("You can't leave."), "OLFAIL",
--- 695,701 ----
  {
    dbref loc;
    loc = Location(player);
!   if (IsRoom(loc) || IsGarbage(loc) || IsGarbage(Location(loc)) || NoLeave(loc)
        || !eval_lock(player, loc, Leave_Lock)
      ) {
      did_it(player, loc, "LFAIL", T("You can't leave."), "OLFAIL",
*** 1_7_4.95/src/log.c Mon, 29 Jan 2001 09:51:40 -0600 dunemush (pennmush/c/5_log.c 1.10 660)
--- 1_7_4.100(w)/src/log.c Thu, 07 Jun 2001 11:35:44 -0500 dunemush (pennmush/c/5_log.c 1.10.1.2 660)
***************
*** 37,42 ****
--- 37,46 ----
  void start_log _((FILE ** fp, const char *filename));
  void end_log _((FILE * fp));
  
+ #ifdef macintosh
+ extern void PMConvertPath(char *path);
+ #endif
+ 
  /* log file pointers */
  FILE *connlog_fp;
  FILE *checklog_fp;
***************
*** 74,80 ****
--- 78,89 ----
      FILE **fp;
      const char *filename;
  {
+ #ifdef macintosh
+   PMConvertPath((char *) filename);
+   *fp = fopen(filename, "ab");
+ #else
    *fp = fopen(filename, "a");
+ #endif
    if (*fp == NULL) {
      fprintf(stderr, T("WARNING: cannot open log %s\n"), filename);
      *fp = stderr;
*** 1_7_4.95/src/game.c Fri, 11 May 2001 15:40:56 -0500 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1 660)
--- 1_7_4.100(w)/src/game.c Thu, 07 Jun 2001 11:35:44 -0500 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1 660)
***************
*** 421,427 ****
--- 421,431 ----
      _exit(134);
    } else {
  #endif
+ #ifdef macintosh
+     if ((f = fopen(panicfile, "wb")) == NULL) {
+ #else
      if ((f = fopen(panicfile, "w")) == NULL) {
+ #endif
        do_rawlog(LT_ERR, T("CANNOT OPEN PANIC FILE, YOU LOSE"));
        _exit(135);
      } else {
***************
*** 1802,1808 ****
--- 1806,1816 ----
  #endif				/* WIN32 */
  #endif				/* macintosh */
    {
+ #ifdef macintosh
+     f = fopen(filename, "rb");
+ #else
      f = fopen(filename, "r");
+ #endif
    }
    return f;
  }
***************
*** 1827,1833 ****
--- 1835,1845 ----
  #endif				/* WIN32 */
  #endif				/* macintosh */
    {
+ #ifdef macintosh
+     f = fopen(filename, "wb");
+ #else
      f = fopen(filename, "w");
+ #endif
    }
  #ifdef I_SETJMP
    if (!f)
*** 1_7_4.95/src/funstr.c Fri, 25 May 2001 11:53:48 -0500 dunemush (pennmush/c/13_funstr.c 1.28.1.1.1.2.1.4.1.1 660)
--- 1_7_4.100(w)/src/funstr.c Thu, 07 Jun 2001 11:35:44 -0500 dunemush (pennmush/c/13_funstr.c 1.28.1.1.1.2.1.4.1.4 660)
***************
*** 86,102 ****
  FUNCTION(fun_capstr)
  {
    char *p;
!   p = args[0];
!   /* Skip any starting ANSI */
!   while (*p == ESC_CHAR) {
!     while (*p && *p != 'm') {
!       safe_chr(*p, buff, bp);
!       p++;
!     }
!     if (*p) {
!       safe_chr(*p, buff, bp);	/* Tack on 'm' */
!       p++;
!     }
    }
    if (*p) {
      safe_chr(UPCASE(*p), buff, bp);
--- 86,100 ----
  FUNCTION(fun_capstr)
  {
    char *p;
!   p = skip_leading_ansi(args[0]);
!   if (!p) {
!     safe_str(args[0], buff, bp);
!     return;
!   } else if (p != args[0]) {
!     char x = *p;
!     *p = '\0';
!     safe_str(args[0], buff, bp);
!     *p = x;
    }
    if (*p) {
      safe_chr(UPCASE(*p), buff, bp);
***************
*** 110,121 ****
  FUNCTION(fun_art)
  {
    /* checks a word and returns the appropriate article, "a" or "an" */
  
!   char c = tolower(*args[0]);
    if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
      safe_str("an", buff, bp);
    else
!     safe_str("a", buff, bp);
  }
  
  /* ARGSUSED */
--- 108,125 ----
  FUNCTION(fun_art)
  {
    /* checks a word and returns the appropriate article, "a" or "an" */
+   char c;
+   char *p = skip_leading_ansi(args[0]);
  
!   if (!p) {
!     safe_chr('a', buff, bp);
!     return;
!   }
!   c = tolower(*p);
    if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u')
      safe_str("an", buff, bp);
    else
!     safe_chr('a', buff, bp);
  }
  
  /* ARGSUSED */
***************
*** 173,198 ****
  /* ARGSUSED */
  FUNCTION(fun_alphamax)
  {
!   char *amax;
    int j;
  
!   amax = args[0];
!   for (j = 1; j < nargs; j++)
!     if (strcmp(amax, args[j]) < 0)
!       amax = args[j];
    safe_str(amax, buff, bp);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_alphamin)
  {
!   char *amin;
    int j;
  
!   amin = args[0];
!   for (j = 1; j < nargs; j++)
!     if (strcmp(amin, args[j]) > 0)
!       amin = args[j];
    safe_str(amin, buff, bp);
  }
  
--- 177,209 ----
  /* ARGSUSED */
  FUNCTION(fun_alphamax)
  {
!   char amax[BUFFER_LEN];
!   char *c;
    int j;
  
! 
!   strcpy(amax, remove_markup(args[0]));
!   for (j = 1; j < nargs; j++) {
!     c = remove_markup(args[j]);
!     if (strcmp(amax, c) < 0)
!       strcpy(amax, c);
!   }
    safe_str(amax, buff, bp);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_alphamin)
  {
!   char amin[BUFFER_LEN];
!   char *c;
    int j;
  
!   strcpy(amin, remove_markup(args[0]));
!   for (j = 1; j < nargs; j++) {
!     c = remove_markup(args[j]);
!     if (strcmp(amin, c) > 0)
!       strcpy(amin, c);
!   }
    safe_str(amin, buff, bp);
  }
  
***************
*** 205,255 ****
  /* ARGSUSED */
  FUNCTION(fun_mid)
  {
!   char ansi_buff[BUFFER_LEN], *ansi_bp = ansi_buff;
    int pos, len;
  
    if (!is_integer(args[1]) || !is_integer(args[2])) {
      safe_str(T(e_ints), buff, bp);
      return;
    }
    pos = parse_integer(args[1]);
!   len =
!     ansi_align(args[0], ansi_strnlen(args[0], pos + parse_integer(args[2])));
  
-   /* There was an error for pos + len > BUFFER_LEN, but I removed it.
-    * After all, why should the behavior for past-end-of-string
-    * change suddenly at BUFFER_LEN?
-    */
    if ((pos < 0) || (len < 0)) {
      safe_str(T(e_range), buff, bp);
      return;
    }
  
!   /* Write the initial ANSI/Pueblo bits */
!   ansi_save(args[0], pos, ansi_buff, &ansi_bp);
!   safe_str(ansi_buff, buff, bp);
!   pos = ansi_align(args[0], ansi_strnlen(args[0], pos));
!   ansi_bp = ansi_buff;
! 
!   if ((((Size_t) len) < strlen(args[0])) && ((len) >= 0)) {
!     /* Save the ending ANSI/Pueblo bits */
!     ansi_save(args[0] + len, -1, ansi_buff, &ansi_bp);
!   }
!   if (((len) < BUFFER_LEN) && ((len) >= 0)) {
!     args[0][len] = '\0';
!   }
!   if ((Size_t) pos < strlen(args[0])) {
!     safe_str(args[0] + pos, buff, bp);
!   }
!   if (ansi_bp != ansi_buff)
!     safe_str(ansi_buff, buff, bp);
  }
  
- 
  /* ARGSUSED */
  FUNCTION(fun_left)
  {
-   char ansi_buff[BUFFER_LEN], *ansi_bp = ansi_buff;
    int len;
  
    if (!is_integer(args[1])) {
--- 216,246 ----
  /* ARGSUSED */
  FUNCTION(fun_mid)
  {
!   ansi_string *as;
    int pos, len;
  
    if (!is_integer(args[1]) || !is_integer(args[2])) {
      safe_str(T(e_ints), buff, bp);
      return;
    }
+ 
+   as = parse_ansi_string(args[0]);
    pos = parse_integer(args[1]);
!   len = parse_integer(args[2]);
  
    if ((pos < 0) || (len < 0)) {
      safe_str(T(e_range), buff, bp);
+     free_ansi_string(as);
      return;
    }
  
!   safe_ansi_string(as, pos, len, buff, bp);
!   free_ansi_string(as);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_left)
  {
    int len;
  
    if (!is_integer(args[1])) {
***************
*** 263,282 ****
      return;
    }
  
!   len = ansi_strnlen(args[0], len);
!   ansi_save(args[0] + len - 1, -1, ansi_buff, &ansi_bp);
!   len = ansi_align(args[0], len);
!   if (len < BUFFER_LEN)
!     args[0][len] = '\0';
!   safe_str(args[0], buff, bp);
!   safe_str(ansi_buff, buff, bp);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_right)
  {
-   char ansi_buff[BUFFER_LEN], *ansi_bp = ansi_buff;
    int len;
  
    if (!is_integer(args[1])) {
      safe_str(T(e_int), buff, bp);
--- 254,267 ----
      return;
    }
  
!   safe_ansi(args[0], len, buff, bp);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_right)
  {
    int len;
+   ansi_string *as;
  
    if (!is_integer(args[1])) {
      safe_str(T(e_int), buff, bp);
***************
*** 288,314 ****
      safe_str(T(e_range), buff, bp);
      return;
    }
!   len = ansi_strlen(args[0]) - len;
!   if (len <= 0) {
      safe_str(args[0], buff, bp);
!     return;
!   }
!   ansi_save(args[0], len, ansi_buff, &ansi_bp);
!   len = ansi_strnlen(args[0], len);
!   len = ansi_align(args[0], len);
!   safe_str(ansi_buff, buff, bp);
!   safe_str(args[0] + len, buff, bp);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_strinsert)
  {
    /* Insert a string into another */
! 
!   int pos, len;
!   char letter;
!   int i;
!   char *p;
  
    if (!is_integer(args[1])) {
      safe_str(e_int, buff, bp);
--- 273,293 ----
      safe_str(T(e_range), buff, bp);
      return;
    }
! 
!   as = parse_ansi_string(args[0]);
!   if (len > as->len)
      safe_str(args[0], buff, bp);
!   else
!     safe_ansi_string(as, as->len - len, as->len, buff, bp);
!   free_ansi_string(as);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_strinsert)
  {
    /* Insert a string into another */
!   ansi_string *as;
!   int pos;
  
    if (!is_integer(args[1])) {
      safe_str(e_int, buff, bp);
***************
*** 316,399 ****
    }
  
    pos = parse_integer(args[1]);
- 
-   len = strlen(args[0]);
- 
    if (pos < 0) {
      safe_str(T(e_range), buff, bp);
      return;
-   } else if (pos > len) {
-     /* Fast special case - concatenate args[2] to args[0] */
-     safe_str(args[0], buff, bp);
-     safe_str(args[2], buff, bp);
-     return;
    }
!   /* Now, thanks to ansi, we have to actually count our way
!    * to the right position, and we'll give ansi strings zero 
!    * width
!    */
!   i = 0;
!   p = args[0];
!   while (*p) {
!     if (i == pos)
!       break;
!     if (*p == ESC_CHAR) {
!       /* Beginning an ansi sequence. Copy to end, but don't count */
!       while (*p && *p != 'm')
! 	p++;
!       if (*p)
! 	p++;
!     } else {
!       i++;
!       p++;
!     }
!   }
!   if (!*p) {
!     /* Ran to the end */
      safe_str(args[0], buff, bp);
      safe_str(args[2], buff, bp);
      return;
    }
!   letter = *p;
!   *p++ = '\0';
!   safe_str(args[0], buff, bp);
    safe_str(args[2], buff, bp);
!   if (letter)
!     safe_chr(letter, buff, bp);
!   safe_str(p, buff, bp);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_delete)
  {
!   /* delete a range of characters */
  
-   int pos, num, len;
  
    if (!is_integer(args[1]) || !is_integer(args[2])) {
      safe_str(T(e_ints), buff, bp);
      return;
    }
    pos = parse_integer(args[1]);
    num = parse_integer(args[2]);
-   len = strlen(args[0]);
  
    if (pos < 0) {
      safe_str(T(e_range), buff, bp);
      return;
    }
!   if ((num > 0) && (pos < BUFFER_LEN))
!     args[0][pos] = '\0';
!   safe_str(args[0], buff, bp);
!   if ((num > 0) && ((pos + num) < len))
!     safe_str(args[0] + pos + num, buff, bp);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_comp)
  {
    int x;
!   x = strcmp(args[0], args[1]);
    if (x > 0)
      safe_chr('1', buff, bp);
    else if (x < 0)
--- 295,363 ----
    }
  
    pos = parse_integer(args[1]);
    if (pos < 0) {
      safe_str(T(e_range), buff, bp);
      return;
    }
! 
!   as = parse_ansi_string(args[0]);
! 
!   if (pos > as->len) {
!     /* Fast special case - concatenate args[2] to args[0] */
      safe_str(args[0], buff, bp);
      safe_str(args[2], buff, bp);
+     free_ansi_string(as);
      return;
    }
! 
!   safe_ansi_string(as, 0, pos, buff, bp);
    safe_str(args[2], buff, bp);
!   safe_ansi_string(as, pos, as->len, buff, bp);
!   free_ansi_string(as);
! 
  }
  
  /* ARGSUSED */
  FUNCTION(fun_delete)
  {
!   ansi_string *as;
!   int pos, num;
  
  
    if (!is_integer(args[1]) || !is_integer(args[2])) {
      safe_str(T(e_ints), buff, bp);
      return;
    }
+ 
    pos = parse_integer(args[1]);
    num = parse_integer(args[2]);
  
    if (pos < 0) {
      safe_str(T(e_range), buff, bp);
      return;
    }
! 
!   as = parse_ansi_string(args[0]);
! 
!   if (pos > as->len || num <= 0) {
!     safe_str(args[0], buff, bp);
!     free_ansi_string(as);
!     return;
!   }
! 
!   safe_ansi_string(as, 0, pos, buff, bp);
!   safe_ansi_string(as, pos + num, as->len, buff, bp);
!   free_ansi_string(as);
  }
  
  /* ARGSUSED */
  FUNCTION(fun_comp)
  {
    int x;
!   char left[BUFFER_LEN];
! 
!   strcpy(left, remove_markup(args[0]));
!   x = strcmp(left, remove_markup(args[1]));
    if (x > 0)
      safe_chr('1', buff, bp);
    else if (x < 0)
***************
*** 432,443 ****
  /* ARGSUSED */
  FUNCTION(fun_flip)
  {
!   char *p;
!   p = args[0] + strlen(args[0]);
!   while (p > args[0]) {
!     --p;
!     safe_chr(*p, buff, bp);
    }
  }
  
  /* ARGSUSED */
--- 396,421 ----
  /* ARGSUSED */
  FUNCTION(fun_flip)
  {
!   ansi_string *as;
!   int p, n;
! 
!   as = parse_ansi_string(args[0]);
! 
!   for (p = 0, n = as->len - 1; p < n; p++, n--) {
!     char *tcode;
!     char t;
! 
!     tcode = as->codes[p];
!     t = as->text[p];
!     as->codes[p] = as->codes[n];
!     as->text[p] = as->text[n];
!     as->codes[n] = tcode;
!     as->text[n] = t;
    }
+ 
+   safe_ansi_string(as, 0, as->len, buff, bp);
+ 
+   free_ansi_string(as);
  }
  
  /* ARGSUSED */
***************
*** 475,494 ****
  /* ARGSUSED */
  FUNCTION(fun_lcstr)
  {
!   char *p;
    p = args[0];
    while (*p) {
!     if (*p == ESC_CHAR) {
!       /* Don't uppercase ANSI codes! */
!       while (*p && *p != 'm') {
! 	safe_chr(*p, buff, bp);
! 	p++;
!       }
!       if (*p) {
! 	safe_chr(*p, buff, bp);	/* Tack on 'm' */
! 	p++;
!       }
!     } else {
        safe_chr(DOWNCASE(*p), buff, bp);
        p++;
      }
--- 453,471 ----
  /* ARGSUSED */
  FUNCTION(fun_lcstr)
  {
!   char *p, *y;
    p = args[0];
    while (*p) {
!     y = skip_leading_ansi(p);
!     if (y != p) {
!       char t;
!       t = *y;
!       *y = '\0';
!       safe_str(p, buff, bp);
!       *y = t;
!       p = y;
!     }
!     if (*p) {
        safe_chr(DOWNCASE(*p), buff, bp);
        p++;
      }
***************
*** 498,517 ****
  /* ARGSUSED */
  FUNCTION(fun_ucstr)
  {
!   char *p;
    p = args[0];
    while (*p) {
!     if (*p == ESC_CHAR) {
!       /* Don't uppercase ANSI codes! */
!       while (*p && *p != 'm') {
! 	safe_chr(*p, buff, bp);
! 	p++;
!       }
!       if (*p) {
! 	safe_chr(*p, buff, bp);	/* Tack on 'm' */
! 	p++;
!       }
!     } else {
        safe_chr(UPCASE(*p), buff, bp);
        p++;
      }
--- 475,493 ----
  /* ARGSUSED */
  FUNCTION(fun_ucstr)
  {
!   char *p, *y;
    p = args[0];
    while (*p) {
!     y = skip_leading_ansi(p);
!     if (y != p) {
!       char t;
!       t = *y;
!       *y = '\0';
!       safe_str(p, buff, bp);
!       *y = t;
!       p = y;
!     }
!     if (*p) {
        safe_chr(UPCASE(*p), buff, bp);
        p++;
      }
***************
*** 555,570 ****
  FUNCTION(fun_scramble)
  {
    int n, i, j;
  
    if (!*args[0])
      return;
  
!   n = strlen(args[0]);
    for (i = 0; i < n; i++) {
      j = get_random_long(i, n - 1);
!     safe_chr(args[0][j], buff, bp);
!     args[0][j] = args[0][i];
    }
  }
  
  /* ARGSUSED */
--- 531,559 ----
  FUNCTION(fun_scramble)
  {
    int n, i, j;
+   ansi_string *as;
  
    if (!*args[0])
      return;
  
!   as = parse_ansi_string(args[0]);
!   n = as->len;
    for (i = 0; i < n; i++) {
+     char t, *tcode;
      j = get_random_long(i, n - 1);
!     t = as->text[j];
!     as->text[j] = as->text[i];
!     as->text[i] = t;
!     if (!as->codes[i])
!       as->codes[i] = strdup(ANSI_NORMAL);
!     if (!as->codes[j])
!       as->codes[j] = strdup(ANSI_NORMAL);
!     tcode = as->codes[j];
!     as->codes[j] = as->codes[i];
!     as->codes[i] = tcode;
    }
+   safe_ansi_string(as, 0, as->len, buff, bp);
+   free_ansi_string(as);
  }
  
  /* ARGSUSED */
***************
*** 663,668 ****
--- 652,658 ----
    int funccount;
    char *oldbp;
    char start, end;
+   char letters[BUFFER_LEN];
  
    if (nargs >= 3) {
      if (!delim_check(buff, bp, nargs, args, 3, &start))
***************
*** 689,695 ****
    tptr[1] = wenv[1];
    wenv[1] = place;
  
!   lp = trim_space_sep(args[1], ' ');
    if (nargs >= 3) {
      char *tmp = strchr(lp, start);
  
--- 679,687 ----
    tptr[1] = wenv[1];
    wenv[1] = place;
  
!   strcpy(letters, remove_markup(args[1]));
! 
!   lp = trim_space_sep(letters, ' ');
    if (nargs >= 3) {
      char *tmp = strchr(lp, start);
  
***************
*** 716,722 ****
    while (*lp && *lp != end) {
      *cbuf = *lp++;
      ap = asave;
!     process_expression(buff, bp, &ap, executor, caller, enactor,
  		       PE_DEFAULT, PT_DEFAULT, pe_info);
      if (*bp == oldbp && pe_info->fun_invocations == funccount)
        break;
--- 708,714 ----
    while (*lp && *lp != end) {
      *cbuf = *lp++;
      ap = asave;
!     process_expression(buff, bp, &ap, thing, executor, enactor,
  		       PE_DEFAULT, PT_DEFAULT, pe_info);
      if (*bp == oldbp && pe_info->fun_invocations == funccount)
        break;
***************
*** 1003,1008 ****
--- 995,1002 ----
    char back;
  } ansi_data;
  
+ static void dump_ansi_codes _((ansi_data * ad, char *buff, char **bp));
+ 
  #define EDGE_UP(x,y,z)  (((y) & (z)) && !((x) & (z)))
  
  static void
***************
*** 1082,1088 ****
    static ansi_data stack[1024] = { {0, 0, 0} }, *sp = stack;
    char const *arg0, *arg1;
    char *tbp;
-   int j;
  
    tbp = tbuff;
    arg0 = args[0];
--- 1076,1081 ----
***************
*** 1330,1336 ****
    while (str[maxlen] != ' ' && maxlen > 0)
      maxlen--;
  
!   return maxlen;		/* 0 if no space was found either */
  }
  
  /* The integer in string a will be stored in v, 
--- 1323,1329 ----
    while (str[maxlen] != ' ' && maxlen > 0)
      maxlen--;
  
!   return (maxlen ? maxlen : -1);
  }
  
  /* The integer in string a will be stored in v, 
***************
*** 1396,1402 ****
        ansiwidth = ansi_strnlen(pstr, linewidth);
        ansilen = wraplen(pstr, ansiwidth);
  
!       if (ansilen == 0) {
  	/* word doesn't fit on one line, so cut it */
  	strncpy(strbuff, pstr, ansiwidth);
  	strbuff[ansiwidth - 1] = '\0';
--- 1389,1395 ----
        ansiwidth = ansi_strnlen(pstr, linewidth);
        ansilen = wraplen(pstr, ansiwidth);
  
!       if (ansilen < 0) {
  	/* word doesn't fit on one line, so cut it */
  	strncpy(strbuff, pstr, ansiwidth);
  	strbuff[ansiwidth - 1] = '\0';
*** 1_7_4.95/src/funlist.c Mon, 23 Apr 2001 18:05:56 -0500 dunemush (pennmush/c/16_funlist.c 1.3.1.1.1.5.1.2.1.1.1.1.1.4.1.2.1.2.1.19.1.2.1.1.1.2 660)
--- 1_7_4.100(w)/src/funlist.c Thu, 07 Jun 2001 11:35:44 -0500 dunemush (pennmush/c/16_funlist.c 1.3.1.1.1.5.1.2.1.1.1.1.1.4.1.2.1.2.1.19.1.2.1.1.1.2.1.1 660)
***************
*** 2281,2287 ****
    int col = 0;
    int spaces;
    char sep, osep, *cp, *t;
-   char tbuf1[BUFFER_LEN];
  
    if (!delim_check(buff, bp, nargs, args, 5, &osep))
      return;
--- 2281,2286 ----
***************
*** 2325,2333 ****
  
    col = field_width + !!osep;
    t = split_token(&cp, sep);
!   strcpy(tbuf1, t);
!   tbuf1[field_width] = '\0';
    safe_str(tbuf1, buff, bp);
    for (spaces = field_width - ansi_strlen(t); spaces > 0; spaces--)
      if (safe_chr(' ', buff, bp))
        return;
--- 2324,2340 ----
  
    col = field_width + !!osep;
    t = split_token(&cp, sep);
! /*
!   tp = tbuf1;
!   len = ansi_strnlen(t, field_width);
!   ansi_save(t + field_width - 1, -1, tbuf1, &tp);
!   len = ansi_align(t, len);
!   if (len < BUFFER_LEN)
!     t[len] = '\0';
!   safe_str(t, buff, bp);
    safe_str(tbuf1, buff, bp);
+ */
+   safe_ansi(t, field_width, buff, bp);
    for (spaces = field_width - ansi_strlen(t); spaces > 0; spaces--)
      if (safe_chr(' ', buff, bp))
        return;
***************
*** 2341,2349 ****
  	safe_chr(osep, buff, bp);
      }
      t = split_token(&cp, sep);
!     strcpy(tbuf1, t);
!     tbuf1[field_width] = '\0';
      safe_str(tbuf1, buff, bp);
      for (spaces = field_width - ansi_strlen(t); spaces > 0; spaces--)
        if (safe_chr(' ', buff, bp))
  	return;
--- 2348,2364 ----
  	safe_chr(osep, buff, bp);
      }
      t = split_token(&cp, sep);
! /*
!     tp = tbuf1;
!     len = ansi_strnlen(t, field_width);
!     ansi_save(t + field_width - 1, -1, tbuf1, &tp);
!     len = ansi_align(t, len);
!     if (len < BUFFER_LEN)
!       t[len] = '\0';
!     safe_str(t, buff, bp);
      safe_str(tbuf1, buff, bp);
+ */
+     safe_ansi(t, field_width, buff, bp);
      for (spaces = field_width - ansi_strlen(t); spaces > 0; spaces--)
        if (safe_chr(' ', buff, bp))
  	return;
*** 1_7_4.95/src/fundb.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/c/17_fundb.c 1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.7.1.3.1.3.1.3.1.2.1.2.1.3.2.1.2.1.2.1 660)
--- 1_7_4.100(w)/src/fundb.c Fri, 08 Jun 2001 12:12:26 -0500 dunemush (pennmush/c/17_fundb.c 1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.7.1.3.1.3.1.3.1.2.1.2.1.3.2.1.2.1.2.1.1.1 660)
***************
*** 1163,1169 ****
    safe_dbref(it, buff, bp);
    par = Parent(it);
    while (GoodObject(par) && Can_Examine(executor, it)) {
!     safe_chr(' ', buff, bp);
      safe_dbref(par, buff, bp);
      it = par;
      par = Parent(par);
--- 1163,1170 ----
    safe_dbref(it, buff, bp);
    par = Parent(it);
    while (GoodObject(par) && Can_Examine(executor, it)) {
!     if (safe_chr(' ', buff, bp))
!       break;
      safe_dbref(par, buff, bp);
      it = par;
      par = Parent(par);
*** 1_7_4.95/src/extmail.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/c/22_extmail.c 1.44.1.1 660)
--- 1_7_4.100(w)/src/extmail.c Thu, 07 Jun 2001 11:35:43 -0500 dunemush (pennmush/c/22_extmail.c 1.44.1.2 660)
***************
*** 1525,1531 ****
    if (nargs == 1) {
      player = match_result(executor, args[0], TYPE_PLAYER, MAT_OBJECTS);
      if (GoodObject(player)) {
!       if ((executor != player) && !Wizard(executor)) {
  	safe_str(T(e_perm), buff, bp);
        } else {
  	count_mail(player, -1, &rc, &uc, &cc);
--- 1525,1531 ----
    if (nargs == 1) {
      player = match_result(executor, args[0], TYPE_PLAYER, MAT_OBJECTS);
      if (GoodObject(player)) {
!       if ((executor != player) && (!Wizard(executor) || God(player))) {
  	safe_str(T(e_perm), buff, bp);
        } else {
  	count_mail(player, -1, &rc, &uc, &cc);
***************
*** 1577,1583 ****
  	 noisy_match_result(player, arg1, TYPE_PLAYER,
  			    MAT_OBJECTS)) == NOTHING) {
        return NULL;
!     } else if ((player != target) && !Wizard(player)) {
        notify(player, T("Permission denied"));
        return NULL;
      }
--- 1577,1583 ----
  	 noisy_match_result(player, arg1, TYPE_PLAYER,
  			    MAT_OBJECTS)) == NOTHING) {
        return NULL;
!     } else if ((player != target) && (!Wizard(player) || God(target))) {
        notify(player, T("Permission denied"));
        return NULL;
      }
*** 1_7_4.95/src/conf.c Thu, 08 Feb 2001 23:01:41 -0600 dunemush (pennmush/c/31_conf.c 1.41 660)
--- 1_7_4.100(w)/src/conf.c Mon, 11 Jun 2001 07:35:45 -0500 dunemush (pennmush/c/31_conf.c 1.41.2.3 660)
***************
*** 37,42 ****
--- 37,46 ----
  #include "function.h"
  #include "confmagic.h"
  
+ #ifdef macintosh
+ extern void PMConvertPath(char *path);
+ #endif
+ 
  time_t mudtime;			/* game time, in seconds */
  
  static void show_compile_options _((dbref player));
***************
*** 760,766 ****
--- 764,774 ----
    if (conf_recursion == 0) {
      if (conf && *conf)
        strcpy(cfile, conf);
+ #ifdef macintosh
+     fp = fopen(cfile, "rb");
+ #else
      fp = fopen(cfile, "r");
+ #endif
      if (fp == NULL) {
        do_rawlog(LT_ERR, T("ERROR: Cannot open configuration file %s."), cfile);
        return 0;
***************
*** 769,775 ****
--- 777,787 ----
      conf_default_set();		/* initialize defaults the first time */
    } else {
      if (conf && *conf)
+ #ifdef macintosh
+       fp = fopen(conf, "rb");
+ #else
        fp = fopen(conf, "r");
+ #endif
      if (fp == NULL) {
        do_rawlog(LT_ERR, T("ERROR: Cannot open configuration file %s."),
  		(conf && *conf) ? conf : "Unknown");
***************
*** 879,884 ****
--- 891,937 ----
      *options.compresssuff = 0;
  
  #endif
+ #ifdef macintosh
+     /* Copy Nick's Win32 code because we do the same thing */
+     if ((options.compressprog && *options.compressprog)) {
+       do_rawlog(LT_ERR,
+ 		T
+ 		("CONFIG: compression program is specified but not used in MacOS, ignoring"),
+ 		options.compressprog);
+     }
+ 
+     if (((options.compresssuff && *options.compresssuff))) {
+       do_rawlog(LT_ERR,
+ 		T
+ 		("CONFIG: compression suffix is specified but not used in MacOS, ignoring"),
+ 		options.compresssuff);
+     }
+ 
+     /* Also remove the compression options */
+     *options.uncompressprog = 0;
+     *options.compressprog = 0;
+     *options.compresssuff = 0;
+ 
+     /* Now convert the UNIX paths specified to MacOS ones */
+     PMConvertPath(options.input_db);
+     PMConvertPath(options.output_db);
+     PMConvertPath(options.crash_db);
+ #ifdef CHAT_SYSTEM
+     PMConvertPath(options.chatdb);
+ #endif
+     PMConvertPath(options.mail_db);
+     PMConvertPath(options.connect_file[0]);
+     PMConvertPath(options.motd_file[0]);
+     PMConvertPath(options.wizmotd_file[0]);
+     PMConvertPath(options.newuser_file[0]);
+     PMConvertPath(options.register_file[0]);
+     PMConvertPath(options.quit_file[0]);
+     PMConvertPath(options.down_file[0]);
+     PMConvertPath(options.full_file[0]);
+     PMConvertPath(options.guest_file[0]);
+     PMConvertPath(options.access_file);
+     PMConvertPath(options.names_file);
+ #endif
  
    }
    fclose(fp);
***************
*** 1123,1129 ****
    notify(player, T(" Passwords are converted from system crypt to SHS"));
  #endif
  #if (CRYPT_SYSTEM == 4)
!   notify(player, T(" Passwords are convereted from plaintext to SHS"));
  #endif
  #if (COMPRESSION_TYPE == 0)
    notify(player, T(" Attributes are not compressed in memory."));
--- 1176,1182 ----
    notify(player, T(" Passwords are converted from system crypt to SHS"));
  #endif
  #if (CRYPT_SYSTEM == 4)
!   notify(player, T(" Passwords are converted from plaintext to SHS"));
  #endif
  #if (COMPRESSION_TYPE == 0)
    notify(player, T(" Attributes are not compressed in memory."));
*** 1_7_4.95/src/bsd.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/c/38_bsd.c 1.58.1.11.1.2.1.5.1.7.1.14.1.13.1.9.1.4.1.2.1.12.1.1.1.1 660)
--- 1_7_4.100(w)/src/bsd.c Thu, 07 Jun 2001 11:35:43 -0500 dunemush (pennmush/c/38_bsd.c 1.58.1.11.1.2.1.5.1.7.1.14.1.13.1.9.1.4.1.2.1.12.1.1.1.1.1.2 660)
***************
*** 88,96 ****
  #include <locale.h>
  #endif
  #ifdef __APPLE__
- #ifdef __APPLE_CC__
  #define LC_MESSAGES     6
! #endif
  #endif
  #ifdef I_SETJMP
  #include <setjmp.h>
--- 88,95 ----
  #include <locale.h>
  #endif
  #ifdef __APPLE__
  #define LC_MESSAGES     6
! #define AUTORESTART
  #endif
  #ifdef I_SETJMP
  #include <setjmp.h>
***************
*** 774,779 ****
--- 773,781 ----
    shutdown_checkpoint();
    WSACleanup();			/* clean up */
  #else
+ #ifdef __APPLE__
+   unlink("runid");
+ #endif
    exit(0);
  #endif
  }
***************
*** 786,792 ****
--- 788,798 ----
    FILE *newerr;
    /* close up the log files */
    end_all_logs();
+ #ifdef macintosh
+   newerr = fopen(errlog, "ab");
+ #else
    newerr = fopen(errlog, "a");
+ #endif
    if (!newerr) {
      fprintf(stderr,
  	    T("Unable to open %s. Error output continues to stderr.\n"),
*** 1_7_4.95/src/access.c Tue, 15 May 2001 15:59:50 -0500 dunemush (pennmush/c/43_access.c 1.11.1.1 660)
--- 1_7_4.100(w)/src/access.c Thu, 07 Jun 2001 11:35:42 -0500 dunemush (pennmush/c/43_access.c 1.11.1.2 660)
***************
*** 188,194 ****
--- 188,198 ----
  #ifndef WIN32
    close(reserved);
  #endif
+ #ifdef macintosh
+   fp = fopen(ACCESS_FILE, "rb");
+ #else
    fp = fopen(ACCESS_FILE, "r");
+ #endif
    if (!fp) {
      do_log(LT_ERR, GOD, GOD, T("No %s file found."), ACCESS_FILE);
      retval = 0;
***************
*** 257,263 ****
--- 261,271 ----
  #ifndef WIN32
    close(reserved);
  #endif
+ #ifdef macintosh
+   fp = fopen(tmpf, "wb");
+ #else
    fp = fopen(tmpf, "w");
+ #endif
    if (!fp) {
      do_log(LT_ERR, GOD, GOD, T("Unable to open %s."), tmpf);
    } else {
*** 1_7_4.95/hdrs/version.h Fri, 25 May 2001 11:53:48 -0500 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.2 660)
--- 1_7_4.100(w)/hdrs/version.h Mon, 11 Jun 2001 10:49:22 -0500 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.5 660)
***************
*** 1,2 ****
! #define VERSION "PennMUSH version 1.7.4 patchlevel 5 [05/25/2001]"
! #define SHORTVN "PennMUSH 1.7.4p5"
--- 1,2 ----
! #define VERSION "PennMUSH version 1.7.4 patchlevel 6 [06/11/2001]"
! #define SHORTVN "PennMUSH 1.7.4p6"
*** 1_7_4.95/hdrs/externs.h Fri, 25 May 2001 11:53:48 -0500 dunemush (pennmush/d/16_externs.h 1.1.1.53.1.2.1.2 660)
--- 1_7_4.100(w)/hdrs/externs.h Thu, 07 Jun 2001 11:35:46 -0500 dunemush (pennmush/d/16_externs.h 1.1.1.53.1.2.1.4 660)
***************
*** 289,294 ****
--- 289,308 ----
  #endif
  #endif
  extern char *remove_markup _((const char *orig));
+ extern char *skip_leading_ansi _((const char *s));
+ typedef struct {
+   char text[BUFFER_LEN];
+   char *codes[BUFFER_LEN];
+   int len;
+ } ansi_string;
+ 
+ 
+ extern ansi_string *parse_ansi_string _((const char *src));
+ extern void free_ansi_string _((ansi_string * as));
+ extern int safe_ansi_string _((ansi_string * as, int start, int len, char *buff,
+ 			       char **bp));
+ extern void populate_codes _((ansi_string * as));
+ extern void depopulate_codes _((ansi_string * as));
  extern int ansi_save _((const char *string, int length, char *buff, char **bp));
  extern int ansi_align _((const char *string, int length));
  
***************
*** 324,329 ****
--- 338,349 ----
  /* Append a boolean to the end of a string */
  #define safe_boolean(x, buf, bufp) \
                  safe_chr((x) ? '1' : '0', (buf), (bufp))
+ /* Append X characters to the end of a string, taking ansi and html codes into
+    account. */
+ extern int safe_ansi_len
+ _((const char *src, int copylen, char *buff, char **bp, int maxlen));
+ #define safe_ansi(src, copylen, buff, bp) \
+                 safe_ansi_len((src), (copylen), (buff), (bp), BUFFER_LEN)
  extern char *replace_string
  _((const char *old, const char *newbit, const char *string));
  extern char *trim_space_sep _((char *str, char sep));
*** 1_7_4.95/COPYRITE Thu, 23 Nov 2000 09:11:27 -0600 dunemush (pennmush/d/29_COPYRITE 1.2 600)
--- 1_7_4.100(w)/COPYRITE Fri, 25 May 2001 13:41:56 -0500 dunemush (pennmush/d/29_COPYRITE 1.3 600)
***************
*** 63,69 ****
   *     notice) about any improvements or extensions they make,
   *     and provide the source code for these improvements or extensions,
   *     so that these may be included in future releases
!  * (b) inform the copyright-holder of noteworthy users of this software.
   *
   * All users of PennMUSH must acknowledge the origin of the software,
   * retaining this copyright notice in some prominent place (such as
--- 63,69 ----
   *     notice) about any improvements or extensions they make,
   *     and provide the source code for these improvements or extensions,
   *     so that these may be included in future releases
!  * (b) inform the copyright-holder of noteworthy uses of this software.
   *
   * All users of PennMUSH must acknowledge the origin of the software,
   * retaining this copyright notice in some prominent place (such as
*** 1_7_4.95/game/txt/hlp/penncode.hlp Fri, 23 Mar 2001 14:12:35 -0600 dunemush (pennmush/d/40_penncode.h 1.4 600)
--- 1_7_4.100(w)/game/txt/hlp/penncode.hlp Fri, 25 May 2001 13:42:14 -0500 dunemush (pennmush/d/40_penncode.h 1.5 600)
***************
*** 111,117 ****
       notice) about any improvements or extensions they make,
       and provide the source code for these improvements or extensions,
       so that these may be included in future releases
!  (b) inform the copyright-holder of noteworthy users of this software.
  
   All users of PennMUSH must acknowledge the origin of the software,
   retaining this copyright notice in some prominent place (such as
--- 111,117 ----
       notice) about any improvements or extensions they make,
       and provide the source code for these improvements or extensions,
       so that these may be included in future releases
!  (b) inform the copyright-holder of noteworthy uses of this software.
  
   All users of PennMUSH must acknowledge the origin of the software,
   retaining this copyright notice in some prominent place (such as
*** 1_7_4.95/win32/funs.h Mon, 26 Mar 2001 15:33:20 -0600 dunemush (pennmush/f/12_funs.h 1.11.1.9.2.8.2.1 660)
--- 1_7_4.100(w)/win32/funs.h Thu, 31 May 2001 11:20:04 -0500 dunemush (pennmush/f/12_funs.h 1.11.1.9.2.8.2.1.1.1 660)
***************
*** 293,296 ****
  FUNCTION_PROTO(fun_zemit);
  FUNCTION_PROTO(fun_zfun);
  FUNCTION_PROTO(fun_zone);
- FUNCTION_PROTO(local_fun_silly);
--- 293,295 ----
*** 1_7_4.95/win32/cmds.h Wed, 25 Apr 2001 13:37:29 -0500 dunemush (pennmush/f/15_cmds.h 1.9.1.4.1.1.1.1.1.1.1.1.2.1.1.1 660)
--- 1_7_4.100(w)/win32/cmds.h Thu, 31 May 2001 11:20:04 -0500 dunemush (pennmush/f/15_cmds.h 1.9.1.4.1.1.1.1.1.1.1.1.2.1.1.1.2.1 660)
***************
*** 60,66 ****
  COMMAND_PROTO(cmd_link);
  COMMAND_PROTO(cmd_list);
  COMMAND_PROTO(cmd_listmotd);
- COMMAND_PROTO(cmd_local_silly);
  COMMAND_PROTO(cmd_lock);
  COMMAND_PROTO(cmd_log);
  COMMAND_PROTO(cmd_logwipe);
--- 60,65 ----