[PENNMUSH-ANNOUNCE] 1.7.7-patch04

dunemush at tala.mede.uic.edu dunemush at tala.mede.uic.edu
Mon Jan 6 16:23:30 CST 2003


This is patch04 to PennMUSH 1.7.7. After applying this patch, you will
have version 1.7.7p4

To apply this patch, save it to a file in your top-level MUSH directory,
and do the following:
	patch -p1 < 1.7.7-patch04
	./Configure -S
	make update
	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:
  * When room_connects is on, @aconnect and @adisconnect also 
    functions on things when players (dis)connect inside them. 
    Suggested by Philip Mak. [SW]
  * Parser-enforced argument counts for user-defined @functions,
    as an option to @function.
Config:
  * New mush.cnf option max_global_fns allows increasing the number
    of @functions allowed without editing source code. If you change
    this, you should reboot the MUSH or bad things can happen.
    Suggested by hilikiradi at Dardalani.Fixes:
  * mkcmds.sh doesn't always regenerate every file, only what's
    needed. Speeds up compiles. Suggested by Philip Mak. [SW]
  * Fixes from 1.7.6p4.


Prereq: 1.7.7p3
*** 1_7_7.85/Patchlevel Wed, 25 Dec 2002 14:16:58 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.5 600)
--- 1_7_7.109(w)/Patchlevel Thu, 02 Jan 2003 23:53:28 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.6 600)
***************
*** 1,2 ****
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.7p3
--- 1,2 ----
  Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.7p4
*** 1_7_7.85/CHANGES Wed, 25 Dec 2002 14:16:58 -0600 dunemush (pennmush/g/23_CHANGES 1.26 600)
--- 1_7_7.109(w)/CHANGES Mon, 06 Jan 2003 15:37:46 -0600 dunemush (pennmush/g/23_CHANGES 1.30 600)
***************
*** 18,23 ****
--- 18,42 ----
  
  ==========================================================================
  
+ Version 1.7.7 patchlevel 4                      January 2, 2003
+ 
+ Minor Changes:
+   * When room_connects is on, @aconnect and @adisconnect also 
+     functions on things when players (dis)connect inside them. 
+     Suggested by Philip Mak. [SW]
+   * Parser-enforced argument counts for user-defined @functions,
+     as an option to @function.
+ Config:
+   * New mush.cnf option max_global_fns allows increasing the number
+     of @functions allowed without editing source code. If you change
+     this, you should reboot the MUSH or bad things can happen.
+     Suggested by hilikiradi at Dardalani.+ Fixes:
+   * mkcmds.sh doesn't always regenerate every file, only what's
+     needed. Speeds up compiles. Suggested by Philip Mak. [SW]
+   * Fixes from 1.7.6p4.
+ 
+ 
  Version 1.7.7 patchlevel 3                      December 25, 2002
  
  Commands:
*** 1_7_7.85/game/txt/hlp/pennvers.hlp Wed, 25 Dec 2002 14:16:58 -0600 dunemush (pennmush/12_pennvers.h 1.169.1.42.1.3.1.2.2.2.1.1.1.3.1.1.1.5.1.4.1.1.1.1.1.1.1.1.1.5.1.1.1.3.1.1.1.3.1.1.1.54.1.10.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.7.1.1.1.1.1.2.1.1.1.8 600)
--- 1_7_7.109(w)/game/txt/hlp/pennvers.hlp Mon, 06 Jan 2003 15:38:31 -0600 dunemush (pennmush/12_pennvers.h 1.169.1.42.1.3.1.2.2.2.1.1.1.3.1.1.1.5.1.4.1.1.1.1.1.1.1.1.1.5.1.1.1.3.1.1.1.3.1.1.1.54.1.10.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.7.1.1.1.1.1.2.1.1.1.4.1.2.1.1.1.1.1.1.1.2.1.3 600)
***************
*** 1,5 ****
  & changes
! & 1.7.7p3
  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.7p4
  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,36 ----
  A list of the patchlevels associated with each release can
  be read in 'help patchlevels'.
  
+ Version 1.7.7 patchlevel 4                      January 2, 2003
+ 
+ Minor Changes:
+   * When room_connects is on, @aconnect and @adisconnect also 
+     functions on things when players (dis)connect inside them. 
+     Suggested by Philip Mak. [SW]
+   * Parser-enforced argument counts for user-defined @functions,
+     as an option to @function.
+ Config:
+   * New mush.cnf option max_global_fns allows increasing the number
+     of @functions allowed without editing source code. If you change
+     this, you should reboot the MUSH or bad things can happen.
+     Suggested by hilikiradi at Dardalani.+ Fixes:
+   * mkcmds.sh doesn't always regenerate every file, only what's
+     needed. Speeds up compiles. Suggested by Philip Mak. [SW]
+   * Fixes from 1.7.6p4.
+ 
+ 
+ & 1.7.7p3
  Version 1.7.7 patchlevel 3                      December 25, 2002
  
  Commands:
***************
*** 1296,1301 ****
--- 1316,1346 ----
    * Indentation fixes [SW]
    * Fixes up to 1.7.4p12 merged in.
  
+ & 1.7.6p4
+ Version 1.7.6 patchlevel 4                      January 2, 2003
+ 
+ Minor Changes:
+    * English-style matching now applies to exits in the room
+      (so '1st down' can match the first 'down' exit if you're not carrying
+      anything that matches 'down'). New english-style matching adjective
+      'toward' restricts the match to exits (so: 'look toward 1st down').
+ Fixes:
+    * Code cleanup to fix several potential buffer overflows.
+    * The wildcard matcher had problems with backslash escapes in
+      some cases, making matching a : in a $command very hard.
+      Reported by Wayne at PDX.+    * @chzone could cause crashes on some systems.  Reported by Wayne at PDX.+    * When two exits match, one is no longer chosen at random.
+      Instead, the ambiguity should be reported as an error.
+      Reported by Intrevis at MS*H.
+    * The dbref returned by locate when given the X parameter is
+      no longer random, but the last one found (as per the help).
+    * Serious bug in reading locks from the db on startup corrected.
+    * The profiling timer is turned off duing dumps, as some systems
+      (FreeBSD?) appear to continue to use it and interrupt dumps
+      due to cpu limiting. Reported by Nathan Schuette.
+ 
+ 
  & 1.7.6p3
  Version 1.7.6 patchlevel 3                      December 22, 2002
  
***************
*** 5885,5892 ****
  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.7: 0, 1, 2, 3
! 1.7.6: 0, 1, 2, 3
  1.7.5: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
  1.7.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
         19, 20
--- 5930,5937 ----
  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.7: 0, 1, 2, 3, 4
! 1.7.6: 0, 1, 2, 3, 4
  1.7.5: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
  1.7.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
         19, 20
*** 1_7_7.85/game/txt/hlp/penntop.hlp Tue, 24 Dec 2002 15:20:25 -0600 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.13 600)
--- 1_7_7.109(w)/game/txt/hlp/penntop.hlp Mon, 30 Dec 2002 23:35:19 -0600 dunemush (pennmush/13_penntop.hl 1.2.1.27.1.3.1.2.1.2.1.1.1.1.1.1.1.1.1.12.1.2 600)
***************
*** 1782,1791 ****
    Adjectives include:
      * my <obj> - an object you're carrying
      * this <obj> - an object in your location (also: this here <obj>)
      * 1st, 2nd, etc. <obj> - one of a set of objects with the same names.
        Objects are ordered in the order in which they're listed in your
!       inventory or room contents.
!    You may combine some adjectives (my 1st box, this here 2nd box.
  & &HELP
  This is the AHELP index.
  & RESTRICT
--- 1782,1792 ----
    Adjectives include:
      * my <obj> - an object you're carrying
      * this <obj> - an object in your location (also: this here <obj>)
+     * toward <exit> - an exit in your location
      * 1st, 2nd, etc. <obj> - one of a set of objects with the same names.
        Objects are ordered in the order in which they're listed in your
!       inventory, room contents, and exit list (in that order).
!    You may combine some adjectives (my 1st box, this here 2nd box).
  & &HELP
  This is the AHELP index.
  & RESTRICT
*** 1_7_7.85/game/txt/hlp/pennfunc.hlp Tue, 24 Dec 2002 15:20:25 -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.2 600)
--- 1_7_7.109(w)/game/txt/hlp/pennfunc.hlp Mon, 30 Dec 2002 19:01:27 -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.2 600)
***************
*** 1824,1830 ****
      T   -   Things
      F   -   Return #-1 if what's found is of a different type than the
              preferred one.
!     X   -   Never return #-2. Use the last dbref found if the match is
              ambiguous.
    If you specify more than one type, the last one will be preferred. Unless
    you specify an F option, if an object of a different type is found and
--- 1824,1830 ----
      T   -   Things
      F   -   Return #-1 if what's found is of a different type than the
              preferred one.
!     X   -   Never return #-2. Use the last dbref found if the match is  
              ambiguous.
    If you specify more than one type, the last one will be preferred. Unless
    you specify an F option, if an object of a different type is found and
*** 1_7_7.85/game/txt/hlp/penncmd.hlp Wed, 25 Dec 2002 02:21:26 -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.3 600)
--- 1_7_7.109(w)/game/txt/hlp/penncmd.hlp Thu, 02 Jan 2003 23:38:50 -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.4 600)
***************
*** 1254,1260 ****
  See also: PUPPET, DBREF 
  & @function
    @function [<function name>]
!   @function <function name>=<object>,<attribute>
      or @function <function name>=<object>/<attribute>
    @function/<switch> <function name>
    
--- 1254,1260 ----
  See also: PUPPET, DBREF 
  & @function
    @function [<function name>]
!   @function <function name>=<object>,<attribute>[,<min args>, <max args>]
      or @function <function name>=<object>/<attribute>
    @function/<switch> <function name>
    
***************
*** 1285,1291 ****
   
    Functions defined via @function should follow the format used by
    UFUN() - %0 is the first argument passed, %1 is the second argument
!   passed, and so forth.
    
    Example:
    
--- 1285,1292 ----
   
    Functions defined via @function should follow the format used by
    UFUN() - %0 is the first argument passed, %1 is the second argument
!   passed, and so forth. Option third and fourth arguments to @function
!   can be used to set a parser-enforced number of arguments for the function.
    
    Example:
    
***************
*** 1324,1333 ****
   For example:
    @function/delete ansi
    &ansi_fun #1234=%0
!   @function ansi=#1234, ansi_fun
  
   will create a new version of ansi() that doesn't do any
!  colorization.
  
  See also: RESTRICT, FUNCTIONS, @startup
  & @grep
--- 1325,1335 ----
   For example:
    @function/delete ansi
    &ansi_fun #1234=%0
!   @function ansi=#1234, ansi_fun, 2, 2
  
   will create a new version of ansi() that doesn't do any
!  colorization, and that requires it to be called with exactly
!  2 arguments, like the built-in version.
  
  See also: RESTRICT, FUNCTIONS, @startup
  & @grep
*** 1_7_7.85/game/mushcnf.dst Sun, 22 Dec 2002 18:04:18 -0600 dunemush (pennmush/41_mushcnf.ds 1.1.1.19.1.1.1.2.1.1.1.8.1.1.1.1.1.2 600)
--- 1_7_7.109(w)/game/mushcnf.dst Mon, 06 Jan 2003 15:38:21 -0600 dunemush (pennmush/41_mushcnf.ds 1.1.1.19.1.1.1.2.1.1.1.8.1.1.1.1.1.5 600)
***************
*** 189,194 ****
--- 189,199 ----
  # What's the max chain length of indirect locks allowed?
  max_depth 10
  
+ # How many @functions can we have? If you change this without # doing a
+ # shutdown (or shutdown/reboot) immediately thereafter, you'll very likely
+ # crash your MUSH, so don't do that.
+ max_global_fns 50
+ 
  # How much does it cost a mortal to create a channel?
  chan_cost 1000
  
***************
*** 409,415 ****
  # check zones and the master room for aconnect/adisconnect?
  global_connects yes
  
! # trigger @aconnect/@adisconnect in the room?
  room_connects no
  
  ###
--- 414,421 ----
  # check zones and the master room for aconnect/adisconnect?
  global_connects yes
  
! # trigger @aconnect/@adisconnect in a connecting player's location
! # if the location is a room or thing?
  room_connects no
  
  ###
*** 1_7_7.85/utils/mkcmds.sh.SH Sun, 22 Dec 2002 01:03:36 -0600 dunemush (pennmush/g/16_mkcmds.sh. 1.3 750)
--- 1_7_7.109(w)/utils/mkcmds.sh.SH Wed, 25 Dec 2002 16:09:28 -0600 dunemush (pennmush/g/16_mkcmds.sh. 1.4 750)
***************
*** 39,48 ****
    exit
  fi
  
! if [ -f "../hdrs/timestamp" ]; then
!     exit
! fi
! 
  if [ -d ../patches ]; then
    $echo "Rebuilding list of installed Patches"
    for bu in ../patches/*; do
--- 39,46 ----
    exit
  fi
  
! case $1 in
!  patches)
  if [ -d ../patches ]; then
    $echo "Rebuilding list of installed Patches"
    for bu in ../patches/*; do
***************
*** 68,76 ****
  
  rm -f ../hdrs/temp.h
  rm -f ../src/temp.c
- touch ../hdrs/timestamp
  
- #rm ../hdrs/patches.h
  $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../hdrs/temp.h
  $echo "#ifndef _PATCH_H" >> ../hdrs/temp.h
  $echo "#define _PATCH_H" >> ../hdrs/temp.h
--- 66,72 ----
***************
*** 88,93 ****
--- 84,92 ----
      mv -f ../hdrs/temp.h ../hdrs/patches.h
  fi
  
+ ;;
+ switches)
+ 
  $echo "Rebuilding command switch file"
  snum=1
  $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../src/temp.c
***************
*** 112,135 ****
  mv -f ../hdrs/temp.h ../hdrs/switches.h
  mv -f ../src/temp.c ../src/switchinc.c
  
  $echo "Rebuilding command prototype file"
  $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../hdrs/temp.h
  for c in `grep "^COMMAND *(" ../src/*.c | cut -f2 -d\( | cut -f1 -d\) | sort | uniq`; do
    $echo >>../hdrs/temp.h "COMMAND_PROTO($c);"
  done
! mv -f ../hdrs/temp.h ../hdrs/cmds.h
  
  $echo "Rebuilding function prototype file"
  $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../hdrs/temp.h
  for c in `grep "^FUNCTION *(" ../src/*.c | cut -f2 -d\( | cut -f1 -d\) | sort | uniq`; do
    $echo >>../hdrs/temp.h "FUNCTION_PROTO($c);"
  done
! mv -f ../hdrs/temp.h ../hdrs/funs.h
  
  if [ -d "../win32" ]; then
    cp ../hdrs/funs.h ../win32/funs.h
-   cp ../hdrs/cmds.h ../win32/cmds.h
  fi
  !NO!SUBS!
  chmod 755 mkcmds.sh
  $eunicefix mkcmds.sh
--- 111,157 ----
  mv -f ../hdrs/temp.h ../hdrs/switches.h
  mv -f ../src/temp.c ../src/switchinc.c
  
+ ;;
+ commands)
+ 
  $echo "Rebuilding command prototype file"
  $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../hdrs/temp.h
  for c in `grep "^COMMAND *(" ../src/*.c | cut -f2 -d\( | cut -f1 -d\) | sort | uniq`; do
    $echo >>../hdrs/temp.h "COMMAND_PROTO($c);"
  done
! cmp -s ../hdrs/cmds.h ../hdrs/temp.h
! cmpstat=$?
! if [ $cmpstat -eq 0 ]; then
!     rm -f ../hdrs/temp.h
! else
!     mv -f ../hdrs/temp.h ../hdrs/cmds.h
! fi
! 
! if [ -d "../win32" ]; then
!   cp ../hdrs/cmds.h ../win32/cmds.h
! fi
! 
! ;;
! functions)
  
  $echo "Rebuilding function prototype file"
  $echo "/* AUTOGENERATED FILE. DO NOT EDIT */" > ../hdrs/temp.h
  for c in `grep "^FUNCTION *(" ../src/*.c | cut -f2 -d\( | cut -f1 -d\) | sort | uniq`; do
    $echo >>../hdrs/temp.h "FUNCTION_PROTO($c);"
  done
! cmp -s ../hdrs/funs.h ../hdrs/temp.h
! cmpstat=$?
! if [ $cmpstat -eq 0 ]; then
!     rm -f ../hdrs/temp.h
! else
!     mv -f ../hdrs/temp.h ../hdrs/funs.h
! fi
  
  if [ -d "../win32" ]; then
    cp ../hdrs/funs.h ../win32/funs.h
  fi
+ ;;
+ esac
  !NO!SUBS!
  chmod 755 mkcmds.sh
  $eunicefix mkcmds.sh
*** 1_7_7.85/src/wiz.c Wed, 25 Dec 2002 02:11:42 -0600 dunemush (pennmush/b/23_wiz.c 1.44.1.1.1.1.1.2.1.7.1.1.1.1.1.1.1.1.1.1.1.8.1.2.2.2.1.2.1.1.1.1.1.1.1.2.1.3 660)
--- 1_7_7.109(w)/src/wiz.c Mon, 06 Jan 2003 16:22:22 -0600 dunemush (pennmush/b/23_wiz.c 1.44.1.1.1.1.1.2.1.7.1.1.1.1.1.1.1.1.1.1.1.8.1.2.2.2.1.2.1.1.1.1.1.1.1.2.1.1.1.2 660)
***************
*** 1914,1919 ****
--- 1914,1920 ----
      if (paranoid_checkpt < 1)
        paranoid_checkpt = 1;
    }
+   fork_and_dump(0);
  #ifndef WIN32
    /* Some broken libcs appear to retain the itimer across exec!
     * So we make sure that if we get a SIGPROF in our next incarnation,
***************
*** 1921,1927 ****
     */
    ignore_signal(SIGPROF);
  #endif
-   fork_and_dump(0);
    dump_reboot_db();
  #ifdef INFO_SLAVE
    kill_info_slave();
--- 1922,1927 ----
*** 1_7_7.85/src/wild.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/b/24_wild.c 1.11.1.1.1.9 660)
--- 1_7_7.109(w)/src/wild.c Mon, 06 Jan 2003 16:22:22 -0600 dunemush (pennmush/b/24_wild.c 1.11.1.1.1.8.1.1.1.4.1.2 660)
***************
*** 48,53 ****
--- 48,54 ----
  static int wild(const char *RESTRICT s, const char *RESTRICT d, int p, int cs);
  static int check_literals(const char *RESTRICT tstr, const char *RESTRICT dstr,
  			  int cs);
+ static char *strip_backslashes(const char *str);
  
  /* ---------------------------------------------------------------------------
   * quick_wild: do a wildcard match, without remembering the wild data.
***************
*** 500,507 ****
    char *sp, *dp;
    strncpy(dbuf1, dstr, BUFFER_LEN - 1);
    dbuf1[BUFFER_LEN - 1] = '\0';
!   strncpy(tbuf1, tstr, BUFFER_LEN - 1);
!   tbuf1[BUFFER_LEN - 1] = '\0';
    if (!cs) {
      upcasestr(tbuf1);
      upcasestr(dbuf1);
--- 501,507 ----
    char *sp, *dp;
    strncpy(dbuf1, dstr, BUFFER_LEN - 1);
    dbuf1[BUFFER_LEN - 1] = '\0';
!   strcpy(tbuf1, strip_backslashes(tstr));
    if (!cs) {
      upcasestr(tbuf1);
      upcasestr(dbuf1);
***************
*** 518,520 ****
--- 518,537 ----
    }
    return 1;
  }
+ 
+ 
+ static char *
+ strip_backslashes(const char *str)
+ {
+   /* Remove backslashes from a string, and return it in a static buffer */
+   static char buf[BUFFER_LEN];
+   int i = 0;
+ 
+   while (*str && (i < BUFFER_LEN - 1)) {
+     if (*str == '\\' && *(str + 1))
+       str++;
+     buf[i++] = *str++;
+   }
+   buf[i] = '\0';
+   return buf;
+ }
*** 1_7_7.85/src/unparse.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/b/28_unparse.c 1.16.1.8 660)
--- 1_7_7.109(w)/src/unparse.c Mon, 06 Jan 2003 16:22:19 -0600 dunemush (pennmush/b/28_unparse.c 1.16.1.7.1.2 660)
***************
*** 81,87 ****
  real_unparse(dbref player, dbref loc, int obey_myopic, int use_nameformat,
  	     int use_nameaccent)
  {
!   static char buf[BUFFER_LEN];
    static char tbuf1[BUFFER_LEN];
    char *p;
    int got_nameformat = 0;
--- 81,87 ----
  real_unparse(dbref player, dbref loc, int obey_myopic, int use_nameformat,
  	     int use_nameaccent)
  {
!   static char buf[BUFFER_LEN], *bp;
    static char tbuf1[BUFFER_LEN];
    char *p;
    int got_nameformat = 0;
***************
*** 119,134 ****
        /* show everything */
        if (SUPPORT_PUEBLO)
  	couldunparse = 1;
        if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat)
! 	sprintf(buf, "%s%s%s(#%d%s)", ANSI_HILITE, tbuf1,
! 		ANSI_NORMAL, loc, unparse_flags(loc, player));
        else
! 	sprintf(buf, "%s(#%d%s)", tbuf1, loc, unparse_flags(loc, player));
        return buf;
      } else {
        /* show only the name */
        if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat) {
! 	sprintf(buf, "%s%s%s", ANSI_HILITE, tbuf1, ANSI_NORMAL);
  	return buf;
        } else
  	return tbuf1;
--- 119,139 ----
        /* show everything */
        if (SUPPORT_PUEBLO)
  	couldunparse = 1;
+       bp = buf;
        if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat)
! 	safe_format(buf, &bp, "%s%s%s(#%d%s)", ANSI_HILITE, tbuf1,
! 		    ANSI_NORMAL, loc, unparse_flags(loc, player));
        else
! 	safe_format(buf, &bp, "%s(#%d%s)", tbuf1, loc,
! 		    unparse_flags(loc, player));
!       *bp = '\0';
        return buf;
      } else {
        /* show only the name */
        if (ANSI_NAMES && ShowAnsi(player) && !got_nameformat) {
! 	bp = buf;
! 	safe_format(buf, &bp, "%s%s%s", ANSI_HILITE, tbuf1, ANSI_NORMAL);
! 	*bp = '\0';
  	return buf;
        } else
  	return tbuf1;
*** 1_7_7.85/src/switchinc.c Wed, 25 Dec 2002 02:11:42 -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.2.1.3 660)
--- 1_7_7.109(w)/src/switchinc.c Mon, 06 Jan 2003 16:22:19 -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.2.1.6 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_7.85/src/set.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/b/38_set.c 1.26.1.5.1.1.2.1.1.1.1.1.1.12 660)
--- 1_7_7.109(w)/src/set.c Mon, 06 Jan 2003 16:22:18 -0600 dunemush (pennmush/b/38_set.c 1.26.1.5.1.1.2.1.1.1.1.1.1.11.1.2 660)
***************
*** 368,374 ****
      return 0;
    }
    /* Don't allow circular zones */
!   {
      dbref tmp;
      for (tmp = Zone(zone); GoodObject(tmp); tmp = Zone(tmp)) {
        if (tmp == thing) {
--- 368,374 ----
      return 0;
    }
    /* Don't allow circular zones */
!   if (GoodObject(zone)) {
      dbref tmp;
      for (tmp = Zone(zone); GoodObject(tmp); tmp = Zone(tmp)) {
        if (tmp == thing) {
*** 1_7_7.85/src/rob.c Sat, 30 Nov 2002 15:49:22 -0600 dunemush (pennmush/b/42_rob.c 1.18.1.2.1.3.1.3.1.6 660)
--- 1_7_7.109(w)/src/rob.c Mon, 06 Jan 2003 16:22:18 -0600 dunemush (pennmush/b/42_rob.c 1.18.1.2.1.3.1.3.1.7 660)
***************
*** 23,29 ****
  do_kill(dbref player, const char *what, int cost, int slay)
  {
    dbref victim;
!   char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN];
  
    if (slay && !Wizard(player)) {
      notify(player, T("You do not have such power."));
--- 23,29 ----
  do_kill(dbref player, const char *what, int cost, int slay)
  {
    dbref victim;
!   char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN], *tp;
  
    if (slay && !Wizard(player)) {
      notify(player, T("You do not have such power."));
***************
*** 76,83 ****
        if (((get_random_long(0, KILL_BASE_COST) < cost) || slay) &&
  	  !Wizard(victim)) {
  	/* you killed him */
! 	sprintf(tbuf1, T("You killed %s!"), Name(victim));
! 	sprintf(tbuf2, "killed %s!", Name(victim));
  	do_halt(victim, "", victim);
  	did_it(player, victim, "DEATH", tbuf1, "ODEATH", tbuf2, "ADEATH",
  	       NOTHING);
--- 76,87 ----
        if (((get_random_long(0, KILL_BASE_COST) < cost) || slay) &&
  	  !Wizard(victim)) {
  	/* you killed him */
! 	tp = tbuf1;
! 	safe_format(tbuf1, &tp, T("You killed %s!"), Name(victim));
! 	*tp = '\0';
! 	tp = tbuf2;
! 	safe_format(tbuf2, &tp, "killed %s!", Name(victim));
! 	*tp = '\0';
  	do_halt(victim, "", victim);
  	did_it(player, victim, "DEATH", tbuf1, "ODEATH", tbuf2, "ADEATH",
  	       NOTHING);
*** 1_7_7.85/src/player.c Sun, 22 Dec 2002 01:05:36 -0600 dunemush (pennmush/b/47_player.c 1.15.1.1.1.1.1.4.1.10 660)
--- 1_7_7.109(w)/src/player.c Mon, 06 Jan 2003 16:22:18 -0600 dunemush (pennmush/b/47_player.c 1.15.1.1.1.1.1.4.1.6.1.2 660)
***************
*** 488,497 ****
      const char *host;
  {
    char *s;
!   char last_place[MAX_COMMAND_LEN];
  
    s = ctime(&mudtime);
!   s[strlen(s) - 1] = 0;
!   sprintf(last_place, T("%s on %s"), host, s);
    (void) atr_add(player, "LASTFAILED", last_place, GOD, NOTHING);
  }
--- 488,499 ----
      const char *host;
  {
    char *s;
!   char last_place[BUFFER_LEN], *bp;
  
    s = ctime(&mudtime);
!   s[strlen(s) - 1] = '\0';
!   bp = last_place;
!   safe_format(last_place, &bp, T("%s on %s"), host, s);
!   *bp = '\0';
    (void) atr_add(player, "LASTFAILED", last_place, GOD, NOTHING);
  }
*** 1_7_7.85/src/move.c Mon, 07 Oct 2002 22:44:39 -0500 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.9.1.1.1.1.1.2.1.1.1.1.1.5 660)
--- 1_7_7.109(w)/src/move.c Mon, 06 Jan 2003 16:22:17 -0600 dunemush (pennmush/b/51_move.c 1.1.1.18.1.5.1.13.1.3.1.9.1.1.1.1.1.2.1.1.1.1.1.9 660)
***************
*** 292,299 ****
    if (!strcasecmp(direction, "home") && !Fixed(player))
      return 1;
  
!   /* otherwise match on exits */
!   return (last_match_result(player, direction, TYPE_EXIT, MAT_EXIT) != NOTHING);
  }
  
  static dbref
--- 292,300 ----
    if (!strcasecmp(direction, "home") && !Fixed(player))
      return 1;
  
!   /* otherwise match on exits - don't use GoodObject here! */
!   return (match_result(player, direction, TYPE_EXIT, MAT_ENGLISH | MAT_EXIT) !=
! 	  NOTHING);
  }
  
  static dbref
***************
*** 309,315 ****
    char buff[BUFFER_LEN], *bp;
    ATTR *a;
    dbref dest_room;
- 
    /* We'd like a DESTINATION attribute, but we'll settle for EXITTO,
     * for portability
     */
--- 310,315 ----
***************
*** 318,324 ****
      a = atr_get(exit_obj, "EXITTO");
    if (!a)
      return NOTHING;
- 
    abuf = safe_uncompress(a->value);
    if (!abuf)
      return NOTHING;
--- 318,323 ----
***************
*** 332,338 ****
  		     PE_DEFAULT, PT_DEFAULT, NULL);
    *bp = '\0';
    dest_room = parse_dbref(buff);
- 
    free((Malloc_t) abuf);
    return (dest_room);
  }
--- 331,336 ----
***************
*** 345,351 ****
      int type;			/* type 0 is normal, type 1 is global, type 2 is zone */
  {
    dbref exit_m, loc, var_dest;
- 
    if (!strcasecmp(direction, "home")) {
      /* send him home */
      /* but steal all his possessions */
--- 343,348 ----
***************
*** 370,383 ****
      if (DO_GLOBALS && (type == 1))
        exit_m =
  	match_result(player, direction, TYPE_EXIT,
! 		     MAT_EXIT | MAT_GLOBAL | MAT_CHECK_KEYS);
      else if (DO_GLOBALS && (type == 2))
        exit_m =
  	match_result(player, direction, TYPE_EXIT,
! 		     MAT_EXIT | MAT_REMOTES | MAT_CHECK_KEYS);
      else
        exit_m =
! 	match_result(player, direction, TYPE_EXIT, MAT_EXIT | MAT_CHECK_KEYS);
      switch (exit_m) {
      case NOTHING:
        /* try to force the object */
--- 367,381 ----
      if (DO_GLOBALS && (type == 1))
        exit_m =
  	match_result(player, direction, TYPE_EXIT,
! 		     MAT_ENGLISH | MAT_EXIT | MAT_GLOBAL | MAT_CHECK_KEYS);
      else if (DO_GLOBALS && (type == 2))
        exit_m =
  	match_result(player, direction, TYPE_EXIT,
! 		     MAT_ENGLISH | MAT_EXIT | MAT_REMOTES | MAT_CHECK_KEYS);
      else
        exit_m =
! 	match_result(player, direction, TYPE_EXIT,
! 		     MAT_ENGLISH | MAT_EXIT | MAT_CHECK_KEYS);
      switch (exit_m) {
      case NOTHING:
        /* try to force the object */
***************
*** 418,424 ****
  	did_it(player, exit_m, "SUCCESS", NULL, "OSUCCESS", NULL,
  	       "ASUCCESS", NOTHING);
  	did_it(player, exit_m, "DROP", NULL, "ODROP", NULL, "ADROP", var_dest);
- 
  	switch (Typeof(var_dest)) {
  
  	case TYPE_ROOM:
--- 416,421 ----
***************
*** 430,436 ****
  	  if (Location(player) != loc)
  	    follower_command(player, loc, tprintf("%s #%d", "move", exit_m));
  	  break;
- 
  	case TYPE_PLAYER:
  	case TYPE_THING:
  	  if (IsGarbage(var_dest)) {
--- 427,432 ----
***************
*** 466,476 ****
  {
    dbref thing;
    dbref loc;
! 
!   if ((thing = noisy_match_result(player, what, TYPE_EXIT, MAT_EXIT)) ==
!       NOTHING)
      return;
- 
    loc = Home(thing);
    if (!controls(player, loc)) {
      notify(player, T("You cannot modify exits in that room."));
--- 462,471 ----
  {
    dbref thing;
    dbref loc;
!   if ((thing =
!        noisy_match_result(player, what, TYPE_EXIT,
! 			  MAT_ENGLISH | MAT_EXIT)) == NOTHING)
      return;
    loc = Home(thing);
    if (!controls(player, loc)) {
      notify(player, T("You cannot modify exits in that room."));
***************
*** 490,508 ****
  {
    dbref loc = Location(player);
    dbref thing;
!   char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN];
    long match_flags =
      MAT_NEIGHBOR | MAT_ABSOLUTE | MAT_CHECK_KEYS | MAT_NEAR | MAT_ENGLISH;
    char *myenv[10];
    int i;
- 
    if (!IsRoom(loc) && !EnterOk(loc) && !controls(player, loc)) {
      notify(player, T("Permission denied."));
      return;
    }
    if (!Long_Fingers(player))
      match_flags |= MAT_CONTROL;
- 
    if (match_result(player, what, TYPE_THING, match_flags) == NOTHING) {
      if (POSSESSIVE_GET) {
        /* take care of possessive get (stealing) */
--- 485,501 ----
  {
    dbref loc = Location(player);
    dbref thing;
!   char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN], *tp;
    long match_flags =
      MAT_NEIGHBOR | MAT_ABSOLUTE | MAT_CHECK_KEYS | MAT_NEAR | MAT_ENGLISH;
    char *myenv[10];
    int i;
    if (!IsRoom(loc) && !EnterOk(loc) && !controls(player, loc)) {
      notify(player, T("Permission denied."));
      return;
    }
    if (!Long_Fingers(player))
      match_flags |= MAT_CONTROL;
    if (match_result(player, what, TYPE_THING, match_flags) == NOTHING) {
      if (POSSESSIVE_GET) {
        /* take care of possessive get (stealing) */
***************
*** 524,533 ****
  	notify_format(Location(thing),
  		      T("%s was taken from you."), Name(thing));
  	notify_format(thing, T("%s took you."), Name(player));
! 	sprintf(tbuf1, T("You take %s from %s."), Name(thing),
! 		Name(Location(thing)));
! 	sprintf(tbuf2, T("takes %s from %s."), Name(thing),
! 		Name(Location(thing)));
  	moveto(thing, player);
  	did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2, "ASUCCESS",
  	       NOTHING);
--- 517,530 ----
  	notify_format(Location(thing),
  		      T("%s was taken from you."), Name(thing));
  	notify_format(thing, T("%s took you."), Name(player));
! 	tp = tbuf1;
! 	safe_format(tbuf1, &tp, T("You take %s from %s."), Name(thing),
! 		    Name(Location(thing)));
! 	*tp = '\0';
! 	tp = tbuf2;
! 	safe_format(tbuf2, &tp, T("takes %s from %s."), Name(thing),
! 		    Name(Location(thing)));
! 	*tp = '\0';
  	moveto(thing, player);
  	did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2, "ASUCCESS",
  	       NOTHING);
***************
*** 570,577 ****
  	if (could_doit(player, thing)) {
  	  moveto(thing, player);
  	  notify_format(thing, T("%s took you."), Name(player));
! 	  sprintf(tbuf1, T("You take %s."), Name(thing));
! 	  sprintf(tbuf2, T("takes %s."), Name(thing));
  	  did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2,
  		 "ASUCCESS", NOTHING);
  	  myenv[0] = (char *) mush_malloc(BUFFER_LEN, "dbref");
--- 567,578 ----
  	if (could_doit(player, thing)) {
  	  moveto(thing, player);
  	  notify_format(thing, T("%s took you."), Name(player));
! 	  tp = tbuf1;
! 	  safe_format(tbuf1, &tp, T("You take %s."), Name(thing));
! 	  *tp = '\0';
! 	  tp = tbuf2;
! 	  safe_format(tbuf2, &tp, T("takes %s."), Name(thing));
! 	  *tp = '\0';
  	  did_it(player, thing, "SUCCESS", tbuf1, "OSUCCESS", tbuf2,
  		 "ASUCCESS", NOTHING);
  	  myenv[0] = (char *) mush_malloc(BUFFER_LEN, "dbref");
***************
*** 604,614 ****
  {
    dbref loc;
    dbref thing;
!   char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN];
! 
    if ((loc = Location(player)) == NOTHING)
      return;
- 
    switch (thing =
  	  match_result(player, name, TYPE_THING,
  		       MAT_POSSESSION | MAT_ABSOLUTE | MAT_CONTROL |
--- 605,613 ----
  {
    dbref loc;
    dbref thing;
!   char tbuf1[BUFFER_LEN], tbuf2[BUFFER_LEN], *tp;
    if ((loc = Location(player)) == NOTHING)
      return;
    switch (thing =
  	  match_result(player, name, TYPE_THING,
  		       MAT_POSSESSION | MAT_ABSOLUTE | MAT_CONTROL |
***************
*** 647,654 ****
      }
      break;
    }
!   sprintf(tbuf1, T("You drop %s."), Name(thing));
!   sprintf(tbuf2, T("drops %s."), Name(thing));
    did_it(player, thing, "DROP", tbuf1, "ODROP", tbuf2, "ADROP", NOTHING);
  }
  
--- 646,657 ----
      }
      break;
    }
!   tp = tbuf1;
!   safe_format(tbuf1, &tp, T("You drop %s."), Name(thing));
!   *tp = '\0';
!   tp = tbuf2;
!   safe_format(tbuf2, &tp, T("drops %s."), Name(thing));
!   *tp = '\0';
    did_it(player, thing, "DROP", tbuf1, "ODROP", tbuf2, "ADROP", NOTHING);
  }
  
***************
*** 661,671 ****
    dbref thing;
    dbref loc;
    long match_flags = MAT_CHECK_KEYS | MAT_NEIGHBOR | MAT_ENGLISH | MAT_ABSOLUTE;
- 
    if ((thing = noisy_match_result(player, what, TYPE_THING, match_flags))
        == NOTHING)
      return;
- 
    switch (Typeof(thing)) {
    case TYPE_ROOM:
    case TYPE_EXIT:
--- 664,672 ----
***************
*** 707,713 ****
  {
    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",
--- 708,715 ----
  {
    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",
***************
*** 719,740 ****
      follower_command(player, loc, "leave");
  }
  
! dbref
  global_exit(player, direction)
      dbref player;
      const char *direction;
  {
!   return (last_match_result
! 	  (player, direction, TYPE_EXIT, MAT_GLOBAL | MAT_EXIT) != NOTHING);
  }
  
! dbref
  remote_exit(player, direction)
      dbref player;
      const char *direction;
  {
!   return (last_match_result
! 	  (player, direction, TYPE_EXIT, MAT_REMOTES | MAT_EXIT) != NOTHING);
  }
  
  void
--- 721,742 ----
      follower_command(player, loc, "leave");
  }
  
! int
  global_exit(player, direction)
      dbref player;
      const char *direction;
  {
!   return (GoodObject
! 	  (match_result(player, direction, TYPE_EXIT, MAT_GLOBAL | MAT_EXIT)));
  }
  
! int
  remote_exit(player, direction)
      dbref player;
      const char *direction;
  {
!   return (GoodObject
! 	  (match_result(player, direction, TYPE_EXIT, MAT_REMOTES | MAT_EXIT)));
  }
  
  void
***************
*** 748,754 ****
  
    if (!Mobile(player))
      return;
- 
    if (!strcasecmp(command, "home") && Fixed(player)) {
      notify(player, T("You can't do that IC!"));
      return;
--- 750,755 ----
***************
*** 756,765 ****
    if (DO_GLOBALS) {
      if (can_move(player, command))
        do_move(player, command, 0);
!     else if ((Zone(Location(player)) != NOTHING) &&
! 	     remote_exit(player, command))
        do_move(player, command, 2);
!     else if ((Location(player) != MASTER_ROOM) && global_exit(player, command))
        do_move(player, command, 1);
      else
        do_move(player, command, 0);
--- 757,767 ----
    if (DO_GLOBALS) {
      if (can_move(player, command))
        do_move(player, command, 0);
!     else
!       if ((Zone(Location(player)) != NOTHING) && remote_exit(player, command))
        do_move(player, command, 2);
!     else if ((Location(player) != MASTER_ROOM)
! 	     && global_exit(player, command))
        do_move(player, command, 1);
      else
        do_move(player, command, 0);
***************
*** 786,795 ****
        notify(player, T("I can't tell which one to follow."));
        return;
      }
!     if (!GoodObject(leader) || !GoodObject(Location(player)) ||
! 	(IsPlayer(leader) && !Connected(leader)) ||
! 	((DarkLegal(leader) || (Dark(Location(player)) && !Light(leader))) &&
! 	 !See_All(player))) {
        notify(player, T("You don't see that here."));
        return;
      }
--- 788,798 ----
        notify(player, T("I can't tell which one to follow."));
        return;
      }
!     if (!GoodObject(leader) || !GoodObject(Location(player))
! 	|| (IsPlayer(leader) && !Connected(leader))
! 	|| ((DarkLegal(leader)
! 	     || (Dark(Location(player)) && !Light(leader)))
! 	    && !See_All(player))) {
        notify(player, T("You don't see that here."));
        return;
      }
***************
*** 808,815 ****
      }
      /* Ok, are we allowed to follow them? */
      if (!eval_lock(player, leader, Follow_Lock)) {
!       notify_format(player, T("You're not allowed to follow %s."),
! 		    Name(leader));
        return;
      }
      /* Ok, looks good */
--- 811,818 ----
      }
      /* Ok, are we allowed to follow them? */
      if (!eval_lock(player, leader, Follow_Lock)) {
!       notify_format(player,
! 		    T("You're not allowed to follow %s."), Name(leader));
        return;
      }
      /* Ok, looks good */
***************
*** 903,911 ****
        return;
      }
      /* Are we following or leading them? */
!     if (!is_following(who, player) && !is_following(player, who)) {
!       notify_format(player, T("%s isn't following you, nor vice versa."),
! 		    Name(who));
        return;
      }
      /* Ok, looks good */
--- 906,915 ----
        return;
      }
      /* Are we following or leading them? */
!     if (!is_following(who, player)
! 	&& !is_following(player, who)) {
!       notify_format(player,
! 		    T("%s isn't following you, nor vice versa."), Name(who));
        return;
      }
      /* Ok, looks good */
***************
*** 928,934 ****
    ATTR *a;
    char tbuf1[BUFFER_LEN];
    char *bp;
- 
    a = atr_get_noparent(leader, "FOLLOWERS");
    if (!a) {
      (void) atr_add(leader, "FOLLOWERS", unparse_dbref(follower), GOD, NOTHING);
--- 932,937 ----
***************
*** 951,957 ****
    ATTR *a;
    char tbuf1[BUFFER_LEN];
    char *bp;
- 
    a = atr_get_noparent(follower, "FOLLOWING");
    if (!a) {
      (void) atr_add(follower, "FOLLOWING", unparse_dbref(leader), GOD, NOTHING);
--- 954,959 ----
***************
*** 992,1006 ****
    ATTR *a;
    char tbuf1[BUFFER_LEN];
    char flwr[BUFFER_LEN];
- 
    a = atr_get_noparent(leader, "FOLLOWERS");
    if (!a)
      return;			/* No followers, so no deletion */
    /* Let's take it apart and put it back together w/o follower */
    strcpy(flwr, unparse_dbref(follower));
    strcpy(tbuf1, uncompress(AL_STR(a)));
!   (void) atr_add(leader, "FOLLOWERS", remove_word(tbuf1, flwr, ' '), GOD,
! 		 NOTHING);
  }
  
  /* Delete someone from a player's FOLLOWING attribute */
--- 994,1007 ----
    ATTR *a;
    char tbuf1[BUFFER_LEN];
    char flwr[BUFFER_LEN];
    a = atr_get_noparent(leader, "FOLLOWERS");
    if (!a)
      return;			/* No followers, so no deletion */
    /* Let's take it apart and put it back together w/o follower */
    strcpy(flwr, unparse_dbref(follower));
    strcpy(tbuf1, uncompress(AL_STR(a)));
!   (void) atr_add(leader, "FOLLOWERS",
! 		 remove_word(tbuf1, flwr, ' '), GOD, NOTHING);
  }
  
  /* Delete someone from a player's FOLLOWING attribute */
***************
*** 1012,1026 ****
    ATTR *a;
    char tbuf1[BUFFER_LEN];
    char ldr[BUFFER_LEN];
- 
    a = atr_get_noparent(follower, "FOLLOWING");
    if (!a)
      return;			/* Not following, so no deletion */
    /* Let's take it apart and put it back together w/o leader */
    strcpy(ldr, unparse_dbref(leader));
    strcpy(tbuf1, uncompress(AL_STR(a)));
!   (void) atr_add(follower, "FOLLOWING", remove_word(tbuf1, ldr, ' '), GOD,
! 		 NOTHING);
  }
  
  static void
--- 1013,1026 ----
    ATTR *a;
    char tbuf1[BUFFER_LEN];
    char ldr[BUFFER_LEN];
    a = atr_get_noparent(follower, "FOLLOWING");
    if (!a)
      return;			/* Not following, so no deletion */
    /* Let's take it apart and put it back together w/o leader */
    strcpy(ldr, unparse_dbref(leader));
    strcpy(tbuf1, uncompress(AL_STR(a)));
!   (void) atr_add(follower, "FOLLOWING",
! 		 remove_word(tbuf1, ldr, ' '), GOD, NOTHING);
  }
  
  static void
***************
*** 1035,1042 ****
    if (noisy) {
      strcpy(msg, tprintf(T("You stop following %s."), Name(leader)));
      notify_format(leader, T("%s stops following you."), Name(follower));
!     did_it(follower, leader, "UNFOLLOW", msg, "OUNFOLLOW", NULL,
! 	   "AUNFOLLOW", NOTHING);
    }
  }
  
--- 1035,1042 ----
    if (noisy) {
      strcpy(msg, tprintf(T("You stop following %s."), Name(leader)));
      notify_format(leader, T("%s stops following you."), Name(follower));
!     did_it(follower, leader, "UNFOLLOW", msg, "OUNFOLLOW",
! 	   NULL, "AUNFOLLOW", NOTHING);
    }
  }
  
***************
*** 1052,1058 ****
    char *bp;
    dbref who;
    int first = 1;
- 
    a = atr_get_noparent(player, "FOLLOWERS");
    if (!a)
      return (char *) "";
--- 1052,1057 ----
***************
*** 1085,1091 ****
    char *bp;
    dbref who;
    int first = 1;
- 
    a = atr_get_noparent(player, "FOLLOWING");
    if (!a)
      return (char *) "";
--- 1084,1089 ----
***************
*** 1140,1146 ****
    char *s, *sp;
    char tbuf1[BUFFER_LEN];
    dbref flwr;
- 
    a = atr_get_noparent(leader, "FOLLOWERS");
    if (!a)
      return;			/* No one's following me */
--- 1138,1143 ----
***************
*** 1167,1173 ****
    char *s, *sp;
    char tbuf1[BUFFER_LEN];
    dbref ldr;
- 
    a = atr_get_noparent(follower, "FOLLOWING");
    if (!a)
      return;			/* I'm not following anyone */
--- 1164,1169 ----
***************
*** 1196,1202 ****
    char *s, *sp;
    char tbuf1[BUFFER_LEN];
    char combuf[BUFFER_LEN];
- 
    if (!com || !*com)
      return;
    strcpy(combuf, com);
--- 1192,1197 ----
***************
*** 1208,1217 ****
    while (s) {
      sp = split_token(&s, ' ');
      follower = parse_dbref(sp);
!     if (GoodObject(follower) && (Location(follower) == loc) &&
! 	(Connected(follower) || IsThing(follower)) &&
! 	(!(DarkLegal(leader) || (Dark(Location(follower)) && !Light(leader))) ||
! 	 See_All(follower))) {
        /* This is a follower who was in the room with the leader. Follow. */
        notify_format(follower, T("You follow %s."), Name(leader));
        process_command(follower, combuf, follower, 0);
--- 1203,1213 ----
    while (s) {
      sp = split_token(&s, ' ');
      follower = parse_dbref(sp);
!     if (GoodObject(follower) && (Location(follower) == loc)
! 	&& (Connected(follower) || IsThing(follower))
! 	&& (!(DarkLegal(leader)
! 	      || (Dark(Location(follower)) && !Light(leader)))
! 	    || See_All(follower))) {
        /* This is a follower who was in the room with the leader. Follow. */
        notify_format(follower, T("You follow %s."), Name(leader));
        process_command(follower, combuf, follower, 0);
*** 1_7_7.85/src/match.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/c/2_match.c 1.24.1.1.1.5 660)
--- 1_7_7.109(w)/src/match.c Mon, 06 Jan 2003 16:22:17 -0600 dunemush (pennmush/c/2_match.c 1.24.1.1.1.4.1.1.1.1.1.1.1.1.1.2 660)
***************
*** 76,82 ****
  			      const int type, const long int flags,
  			      dbref *last_match, int *match_count);
  static dbref match_exit(const dbref who, const char *name,
! 			const int type, const long int flags);
  static dbref match_exit_internal(const dbref match_who,
  				 const char *match_name, const int type,
  				 const long int flags, const dbref loc,
--- 76,82 ----
  			      const int type, const long int flags,
  			      dbref *last_match, int *match_count);
  static dbref match_exit(const dbref who, const char *name,
! 			const int type, const long int flags, int *match_count);
  static dbref match_exit_internal(const dbref match_who,
  				 const char *match_name, const int type,
  				 const long int flags, const dbref loc,
***************
*** 92,97 ****
--- 92,98 ----
  static dbref choose_thing(const dbref match_who, const int preferred_type,
  			  long int flags, dbref thing1, dbref thing2,
  			  int *match_count);
+ extern int check_alias(const char *command, const char *list);	/* game.c */
  
  
  /* A wrapper for returning a match, AMBIGUOUS, or NOTHING
***************
*** 204,250 ****
      match =
        match_remote_contents(who, name, type, flags, &last_match, &match_count);
      if (GoodObject(match)) {
!       exact_match_count++;
        exact_match = match;
      }
    }
    if (flags & MAT_NEIGHBOR) {
      match = match_neighbor(who, name, type, flags, &last_match, &match_count);
      if (GoodObject(match)) {
!       exact_match_count++;
        exact_match = match;
      }
    }
    if (flags & MAT_POSSESSION) {
      match = match_possession(who, name, type, flags, &last_match, &match_count);
      if (GoodObject(match)) {
!       exact_match_count++;
        exact_match = match;
      }
    }
    if (flags & MAT_EXIT) {
!     match = match_exit(who, name, type, flags);
      if (GoodObject(match)) {
!       exact_match_count++;
        exact_match = match;
      }
    }
    if (flags & MAT_CONTAINER) {
      match = match_container(who, name, type, flags, &last_match, &match_count);
      if (GoodObject(match)) {
!       exact_match_count++;
        exact_match = match;
      }
    }
    if (flags & MAT_CARRIED_EXIT) {
      match = match_exit_internal(who, name, type, flags, who, &match_count);
      if (GoodObject(match)) {
!       exact_match_count++;
        exact_match = match;
      }
    }
!   if ((flags & MAT_ENGLISH) && !GoodObject(last_match)
!       && !GoodObject(exact_match)) {
      match = match_english(who, name, flags);
      if (GoodObject(match)) {
        exact_match_count++;
--- 205,251 ----
      match =
        match_remote_contents(who, name, type, flags, &last_match, &match_count);
      if (GoodObject(match)) {
!       exact_match_count += match_count;
        exact_match = match;
      }
    }
    if (flags & MAT_NEIGHBOR) {
      match = match_neighbor(who, name, type, flags, &last_match, &match_count);
      if (GoodObject(match)) {
!       exact_match_count += match_count;
        exact_match = match;
      }
    }
    if (flags & MAT_POSSESSION) {
      match = match_possession(who, name, type, flags, &last_match, &match_count);
      if (GoodObject(match)) {
!       exact_match_count += match_count;
        exact_match = match;
      }
    }
    if (flags & MAT_EXIT) {
!     match = match_exit(who, name, type, flags, &match_count);
      if (GoodObject(match)) {
!       exact_match_count += match_count;
        exact_match = match;
      }
    }
    if (flags & MAT_CONTAINER) {
      match = match_container(who, name, type, flags, &last_match, &match_count);
      if (GoodObject(match)) {
!       exact_match_count += match_count;
        exact_match = match;
      }
    }
    if (flags & MAT_CARRIED_EXIT) {
      match = match_exit_internal(who, name, type, flags, who, &match_count);
      if (GoodObject(match)) {
!       exact_match_count += match_count;
        exact_match = match;
      }
    }
!   if ((flags & MAT_ENGLISH) && !GoodObject(exact_match)
!       && !((flags & MAT_LAST) && GoodObject(last_match))) {
      match = match_english(who, name, flags);
      if (GoodObject(match)) {
        exact_match_count++;
***************
*** 359,364 ****
--- 360,366 ----
    alias_match = lookup_player(match_name);
    DOLIST(first, first) {
      if (first == absolute) {
+       (*match_count)++;
        return first;
      } else if (!strcasecmp(Name(first), match_name) ||
  	       (GoodObject(alias_match) && (alias_match == first))) {
***************
*** 366,377 ****
  	/* if there are multiple exact matches, don't match any but 
  	 * make sure match_count is high enough that we report ambiguity
  	 */
- 	*match_count += 2;
  	*last_match =
  	  choose_thing(match_who, type, flags, the_match, first, match_count);
  	return NOTHING;
!       } else
  	the_match = first;
      } else if (string_match(Name(first), match_name)) {
        *last_match =
  	choose_thing(match_who, type, flags, *last_match, first, match_count);
--- 368,380 ----
  	/* if there are multiple exact matches, don't match any but 
  	 * make sure match_count is high enough that we report ambiguity
  	 */
  	*last_match =
  	  choose_thing(match_who, type, flags, the_match, first, match_count);
  	return NOTHING;
!       } else {
  	the_match = first;
+ 	(*match_count)++;
+       }
      } else if (string_match(Name(first), match_name)) {
        *last_match =
  	choose_thing(match_who, type, flags, *last_match, first, match_count);
***************
*** 412,435 ****
  }
  
  static dbref
! match_exit(who, name, type, flags)
      const dbref who;
      const char *name;
      const int type;
      const long flags;
  {
    dbref loc;
    loc = (IsRoom(who)) ? who : Location(who);
    if (DO_GLOBALS) {
      if (flags & MAT_REMOTES) {
        if (GoodObject(loc))
! 	return match_exit_internal(who, name, type, flags, Zone(loc), NULL);
        else
  	return NOTHING;
      } else if (flags & MAT_GLOBAL)
!       return match_exit_internal(who, name, type, flags, MASTER_ROOM, NULL);
    }
!   return match_exit_internal(who, name, type, flags, loc, NULL);
  }
  
  static dbref
--- 415,441 ----
  }
  
  static dbref
! match_exit(who, name, type, flags, match_count)
      const dbref who;
      const char *name;
      const int type;
      const long flags;
+     int *match_count;
  {
    dbref loc;
    loc = (IsRoom(who)) ? who : Location(who);
    if (DO_GLOBALS) {
      if (flags & MAT_REMOTES) {
        if (GoodObject(loc))
! 	return match_exit_internal(who, name, type, flags, Zone(loc),
! 				   match_count);
        else
  	return NOTHING;
      } else if (flags & MAT_GLOBAL)
!       return match_exit_internal(who, name, type, flags, MASTER_ROOM,
! 				 match_count);
    }
!   return match_exit_internal(who, name, type, flags, loc, match_count);
  }
  
  static dbref
***************
*** 443,450 ****
  {
    dbref exit_tmp;
    dbref absolute;
-   const char *match;
-   const char *p;
    dbref the_match = NOTHING;
  
    if (!GoodObject(loc) || !match_name || !*match_name)
--- 449,454 ----
***************
*** 453,491 ****
      return NOTHING;
    absolute = match_absolute(match_name);
    DOLIST(exit_tmp, Exits(loc)) {
!     if (exit_tmp == absolute) {
        the_match = exit_tmp;
!     } else {
!       match = Name(exit_tmp);
!       while (*match) {
! 	/* check out this one */
! 	for (p = match_name; (*p && DOWNCASE(*p) == DOWNCASE(*match)
! 			      && *match != EXIT_DELIMITER); p++, match++) ;
! 	/* did we get it? */
! 	if (*p == '\0') {
! 	  /* make sure there's nothing afterwards */
! 	  while (isspace((unsigned char) *match))
! 	    match++;
! 	  if (*match == '\0' || *match == EXIT_DELIMITER) {
! 	    /* we got it */
! 	    the_match =
! 	      choose_thing(match_who, type, flags, the_match, exit_tmp,
! 			   match_count);
! 	    goto next_exit;
! 	  }
! 	}
! 	/* we didn't get it, find next match */
! 	while (*match && *match++ != EXIT_DELIMITER) ;
! 	while (isspace((unsigned char) *match))
! 	  match++;
!       }
!     }
!   next_exit:
!     ;
    }
    return the_match;
  }
  
  static dbref
  match_remote_contents(who, name, type, flags, last_match, match_count)
      const dbref who;
--- 457,472 ----
      return NOTHING;
    absolute = match_absolute(match_name);
    DOLIST(exit_tmp, Exits(loc)) {
!     if (exit_tmp == absolute)
        the_match = exit_tmp;
!     else if (check_alias(match_name, Name(exit_tmp)))
!       the_match =
! 	choose_thing(match_who, type, flags, the_match, exit_tmp, match_count);
    }
    return the_match;
  }
  
+ 
  static dbref
  match_remote_contents(who, name, type, flags, last_match, match_count)
      const dbref who;
***************
*** 525,530 ****
--- 506,512 ----
  {
    int do_loc;
    int do_cont;
+   int do_exits, doing_exits;
    int num, matchnum;
    char *dupname, *p;
    char *mname;
***************
*** 543,560 ****
      do_cont = 1;
    else
      do_cont = 0;
  
    if (do_loc && (!strncasecmp(dupname, "this here ", 10))) {
      dupname += 10;
!     do_cont = 0;
    } else if (do_loc && (!strncasecmp(dupname, "here ", 5)
  			|| !strncasecmp(dupname, "this ", 5))) {
      dupname += 5;
!     do_cont = 0;
    } else if (do_cont && (!strncasecmp(dupname, "my ", 3)
  			 || !strncasecmp(dupname, "me ", 3))) {
      dupname += 3;
!     do_loc = 0;
    }
  
    while (*dupname == ' ')
--- 525,549 ----
      do_cont = 1;
    else
      do_cont = 0;
+   if (flags & MAT_EXIT)
+     do_exits = 1;
+   else
+     do_exits = 0;
  
    if (do_loc && (!strncasecmp(dupname, "this here ", 10))) {
      dupname += 10;
!     do_cont = do_exits = 0;
    } else if (do_loc && (!strncasecmp(dupname, "here ", 5)
  			|| !strncasecmp(dupname, "this ", 5))) {
      dupname += 5;
!     do_cont = do_exits = 0;
    } else if (do_cont && (!strncasecmp(dupname, "my ", 3)
  			 || !strncasecmp(dupname, "me ", 3))) {
      dupname += 3;
!     do_loc = do_exits = 0;
!   } else if (do_exits && (!strncasecmp(dupname, "toward ", 7))) {
!     dupname += 7;
!     do_loc = do_cont = 0;
    }
  
    while (*dupname == ' ')
***************
*** 601,618 ****
      num = 1;
    }
  
!   while (do_cont || do_loc) {
      if (do_cont) {
        item = Contents(who);
        do_cont = 0;
!     } else {
        item = Contents(Location(who));
        do_loc = 0;
      }
      matchnum = 0;
      DOLIST(item, item) {
!       if (!strcasecmp(Name(item), dupname)
! 	  || string_match(Name(item), dupname)) {
  	matchnum++;
  	if (matchnum == num) {
  	  mush_free(p, "string");
--- 590,613 ----
      num = 1;
    }
  
!   doing_exits = 0;
!   while (do_cont || do_loc || do_exits) {
      if (do_cont) {
        item = Contents(who);
        do_cont = 0;
!     } else if (do_loc) {
        item = Contents(Location(who));
        do_loc = 0;
+     } else {
+       item = Exits(Location(who));
+       doing_exits = 1;
+       do_exits = 0;
      }
      matchnum = 0;
      DOLIST(item, item) {
!       if (doing_exits ? (check_alias(dupname, Name(item)))
! 	  : (!strcasecmp(Name(item), dupname)
! 	     || string_match(Name(item), dupname))) {
  	matchnum++;
  	if (matchnum == num) {
  	  mush_free(p, "string");
***************
*** 625,630 ****
--- 620,626 ----
    return NOTHING;
  }
  
+ 
  static dbref
  choose_thing(match_who, preferred_type, flags, thing1, thing2, match_count)
      const dbref match_who;
***************
*** 665,669 ****
    }
    if (match_count)
      (*match_count)++;
!   return (get_random_long(0, 1) ? thing1 : thing2);
  }
--- 661,665 ----
    }
    if (match_count)
      (*match_count)++;
!   return (thing1 > thing2 ? thing1 : thing2);
  }
*** 1_7_7.85/src/look.c Sun, 22 Dec 2002 01:19:31 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.2 660)
--- 1_7_7.109(w)/src/look.c Mon, 06 Jan 2003 16:22:17 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.1.1.3 660)
***************
*** 654,665 ****
      dbref player;
  {
    static char buf[BUFFER_LEN];
    CHANLIST *c;
  
    if ((c = Chanlist(player))) {
!     strcpy(buf, T("Channels:"));
!     for (; c; c = c->next)
!       sprintf(buf, "%s %s", buf, ChanName(c->chan));
    } else
      strcpy(buf, T("Channels: *NONE*"));
    return buf;
--- 654,670 ----
      dbref player;
  {
    static char buf[BUFFER_LEN];
+   char *bp;
    CHANLIST *c;
  
    if ((c = Chanlist(player))) {
!     bp = buf;
!     safe_str(T("Channels:"), buf, &bp);
!     for (; c; c = c->next) {
!       safe_chr(' ', buf, &bp);
!       safe_str(ChanName(c->chan), buf, &bp);
!     }
!     *bp = '\0';
    } else
      strcpy(buf, T("Channels: *NONE*"));
    return buf;
*** 1_7_7.85/src/log.c Sat, 30 Nov 2002 17:42:23 -0600 dunemush (pennmush/c/5_log.c 1.10.1.2.2.4.1.1.2.1 660)
--- 1_7_7.109(w)/src/log.c Mon, 06 Jan 2003 16:22:17 -0600 dunemush (pennmush/c/5_log.c 1.10.1.2.2.4.1.1.2.2 660)
***************
*** 44,64 ****
  quick_unparse(object)
      dbref object;
  {
!   static char buff[BUFFER_LEN];
  
    switch (object) {
    case NOTHING:
!     sprintf(buff, T("*NOTHING*"));
      break;
    case AMBIGUOUS:
!     sprintf(buff, T("*VARIABLE*"));
      break;
    case HOME:
!     sprintf(buff, T("*HOME*"));
      break;
    default:
!     sprintf(buff, "%s(#%d%s)",
! 	    Name(object), object, unparse_flags(object, GOD));
    }
  
    return buff;
--- 44,66 ----
  quick_unparse(object)
      dbref object;
  {
!   static char buff[BUFFER_LEN], *bp;
  
    switch (object) {
    case NOTHING:
!     strcpy(buff, T("*NOTHING*"));
      break;
    case AMBIGUOUS:
!     strcpy(buff, T("*VARIABLE*"));
      break;
    case HOME:
!     strcpy(buff, T("*HOME*"));
      break;
    default:
!     bp = buff;
!     safe_format(buff, &bp, "%s(#%d%s)",
! 		Name(object), object, unparse_flags(object, GOD));
!     *bp = '\0';
    }
  
    return buff;
*** 1_7_7.85/src/lock.c Tue, 17 Dec 2002 16:03:37 -0600 dunemush (pennmush/c/6_lock.c 1.17.1.13.1.2 660)
--- 1_7_7.109(w)/src/lock.c Mon, 06 Jan 2003 16:22:17 -0600 dunemush (pennmush/c/6_lock.c 1.17.1.13.1.1.1.2 660)
***************
*** 382,387 ****
--- 382,429 ----
    return 1;
  }
  
+ /* Set the lock type on thing to boolexp.
+  * Used only on db load, when we can't safely test the player's
+  * permissions because they're not loaded yet.
+  */
+ int
+ add_lock_raw(dbref player, dbref thing, lock_type type, struct boolexp *key,
+ 	     int flags)
+ {
+   lock_list *ll, **t;
+   lock_type real_type = type;
+ 
+   if (!GoodObject(thing)) {
+     return 0;
+   }
+ 
+   ll = next_free_lock();
+   if (!ll) {
+     /* Oh, this sucks */
+     do_log(LT_ERR, 0, 0, "Unable to malloc memory for lock_list!");
+   } else {
+     real_type = st_insert(type, &lock_names);
+     ll->type = real_type;
+     ll->key = key;
+     ll->creator = player;
+     if (flags == -1) {
+       const lock_list *l2 = get_lockproto(real_type);
+       if (l2)
+ 	ll->flags = l2->flags;
+       else
+ 	ll->flags = 0;
+     } else {
+       ll->flags = flags;
+     }
+     t = &Locks(thing);
+     while (*t && strcmp(L_TYPE(*t), L_TYPE(ll)) < 0)
+       t = &L_NEXT(*t);
+     L_NEXT(ll) = *t;
+     *t = ll;
+   }
+   return 1;
+ }
+ 
  /* Very primitive. */
  static void
  free_one_lock_list(lock_list *ll)
*** 1_7_7.85/src/game.c Sun, 22 Dec 2002 01:18:53 -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.3 660)
--- 1_7_7.109(w)/src/game.c Mon, 06 Jan 2003 16:22:16 -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.2 660)
***************
*** 323,334 ****
--- 323,341 ----
    char tmpfl[2048];
    FILE *f = NULL;
  
+ #ifndef WIN32
+   ignore_signal(SIGPROF);
+ #endif
+ #ifdef I_SETJMP
    if (setjmp(db_err)) {
      /* The dump failed. Disk might be full or something went bad with the
         compression slave. Boo! */
      do_rawlog(LT_ERR, T("ERROR! Database save failed."));
      flag_broadcast(WIZARD | ROYALTY, 0,
  		   T("GAME: ERROR! Database save failed!"));
+ #ifdef HAS_ITIMER
+     install_sig_handler(SIGPROF, signal_cpu_limit);
+ #endif
    } else {
      local_dump_database();
  
***************
*** 401,406 ****
--- 408,417 ----
  #endif				/* CHAT_SYSTEM */
    }
  
+ #endif
+ #ifdef HAS_ITIMER
+   install_sig_handler(SIGPROF, signal_cpu_limit);
+ #endif
  }
  
  void
***************
*** 617,622 ****
--- 628,634 ----
    command_init_preconfig();
    config_file_startup(conf);
    command_init_postconfig();
+   function_init_postconfig();
  }
  
  int
*** 1_7_7.85/src/function.c Mon, 23 Dec 2002 18:31:54 -0600 dunemush (pennmush/c/18_function.c 1.29.1.14.1.3.1.6.1.1.1.1.1.14.1.2.1.1.1.2 660)
--- 1_7_7.109(w)/src/function.c Mon, 06 Jan 2003 16:22:14 -0600 dunemush (pennmush/c/18_function.c 1.29.1.14.1.3.1.6.1.1.1.1.1.14.1.2.1.1.1.4 660)
***************
*** 4,9 ****
--- 4,10 ----
  #include <limits.h>
  #include <string.h>
  #include <ctype.h>
+ #include <stdlib.h>
  #include "conf.h"
  #include "attrib.h"
  #include "dbdefs.h"
***************
*** 26,31 ****
--- 27,33 ----
  void func_hash_insert(const char *name, FUN *func);
  extern void local_functions(void);
  
+ USERFN_ENTRY *userfn_tab;
  HASHTAB htab_function;
  HASHTAB htab_user_function;
  
***************
*** 566,572 ****
  }
  
  void
! init_func_hashtab()
  {
    FUNTAB *ftp;
  
--- 568,574 ----
  }
  
  void
! init_func_hashtab(void)
  {
    FUNTAB *ftp;
  
***************
*** 578,583 ****
--- 580,593 ----
    local_functions();
  }
  
+ void
+ function_init_postconfig(void)
+ {
+   userfn_tab =
+     (USERFN_ENTRY *) mush_malloc(MAX_GLOBAL_FNS * sizeof(USERFN_ENTRY),
+ 				 "userfn_tab");
+ }
+ 
  int
  check_func(player, fp)
      dbref player;
***************
*** 680,686 ****
   * User-defined global function handlers 
   */
  
- USERFN_ENTRY userfn_tab[MAX_GLOBAL_FNS];
  
  static Size_t userfn_count = 0;
  
--- 690,695 ----
***************
*** 759,765 ****
  void
  do_function(dbref player, char *name, char *argv[])
  {
!   /* Command of format: @function <function name>=<thing>,<attribute>
     * or @function <function name>=<thing>/<attribute>
     * Adds a new user-defined function.
     */
--- 768,774 ----
  void
  do_function(dbref player, char *name, char *argv[])
  {
!   /* Command of format: @function <function name>=<thing>,<attribute>[,<minargs>,<maxargs>]
     * or @function <function name>=<thing>/<attribute>
     * Adds a new user-defined function.
     */
***************
*** 843,849 ****
  
    fp = func_hash_lookup(upcasestr(name));
    if (!fp) {
!     if (userfn_count >= MAX_GLOBAL_FNS) {
        notify(player, T("Function table full."));
        return;
      }
--- 852,858 ----
  
    fp = func_hash_lookup(upcasestr(name));
    if (!fp) {
!     if (userfn_count >= (Size_t) MAX_GLOBAL_FNS) {
        notify(player, T("Function table full."));
        return;
      }
***************
*** 851,858 ****
      fp = (FUN *) mush_malloc(sizeof(FUN), "func_hash.FUN");
      fp->name = mush_strdup(name, "func_hash.name");
      fp->where.offset = userfn_count;
!     fp->minargs = 0;
!     fp->maxargs = 10;
      fp->flags = 0;
      hashadd(name, fp, &htab_user_function);
  
--- 860,882 ----
      fp = (FUN *) mush_malloc(sizeof(FUN), "func_hash.FUN");
      fp->name = mush_strdup(name, "func_hash.name");
      fp->where.offset = userfn_count;
!     if (argv[3] && *argv[3]) {
!       fp->minargs = parse_integer(argv[3]);
!       if (fp->minargs < 0)
! 	fp->minargs = 0;
!       else if (fp->minargs > 10)
! 	fp->minargs = 10;
!     } else
!       fp->minargs = 0;
! 
!     if (argv[4] && *argv[4]) {
!       fp->maxargs = parse_integer(argv[4]);
!       if (fp->maxargs < -10)
! 	fp->maxargs = -10;
!       else if (fp->maxargs > 10)
! 	fp->maxargs = 10;
!     } else
!       fp->maxargs = 10;
      fp->flags = 0;
      hashadd(name, fp, &htab_user_function);
  
***************
*** 873,887 ****
        return;
      }
      if (fp->flags & FN_BUILTIN) {	/* Overriding a built in function */
!       if (userfn_count >= MAX_GLOBAL_FNS) {
  	notify(player, T("Function table full."));
  	return;
        }
        fp = (FUN *) mush_malloc(sizeof(FUN), "func_hash.FUN");
        fp->name = mush_strdup(name, "func_hash.name");
        fp->where.offset = userfn_count;
-       fp->minargs = 0;
-       fp->maxargs = 10;
        fp->flags = 0;
        userfn_count++;
        hashadd(name, fp, &htab_user_function);
--- 897,909 ----
        return;
      }
      if (fp->flags & FN_BUILTIN) {	/* Overriding a built in function */
!       if (userfn_count >= (Size_t) MAX_GLOBAL_FNS) {
  	notify(player, T("Function table full."));
  	return;
        }
        fp = (FUN *) mush_malloc(sizeof(FUN), "func_hash.FUN");
        fp->name = mush_strdup(name, "func_hash.name");
        fp->where.offset = userfn_count;
        fp->flags = 0;
        userfn_count++;
        hashadd(name, fp, &htab_user_function);
***************
*** 892,897 ****
--- 914,936 ----
  		"userfn_tab.name");
      userfn_tab[fp->where.offset].name =
        mush_strdup(upcasestr(argv[2]), "userfn_tab.name");
+     if (argv[3] && *argv[3]) {
+       fp->minargs = parse_integer(argv[3]);
+       if (fp->minargs < 0)
+ 	fp->minargs = 0;
+       else if (fp->minargs > 10)
+ 	fp->minargs = 10;
+     } else
+       fp->minargs = 0;
+ 
+     if (argv[4] && *argv[4]) {
+       fp->maxargs = parse_integer(argv[4]);
+       if (fp->maxargs < -10)
+ 	fp->maxargs = -10;
+       else if (fp->maxargs > 10)
+ 	fp->maxargs = 10;
+     } else
+       fp->maxargs = 10;
      notify(player, T("Function updated."));
    }
  }
***************
*** 1139,1176 ****
      first = 0;
    }
  
  
  
  
  
  
!   *tp = '\0';
!   notify_format(player, T("Flags     : %s"), tbuf);
! 
!   if (fp->flags & FN_BUILTIN) {
!     maxargs = fp->maxargs;
!     if (maxargs < 0)
!       maxargs = -maxargs;
!     tp = tbuf;
! 
!     if (fp->maxargs < 0) {
!       safe_str(T("(Commas okay in last argument)"), tbuf, &tp);
!       *tp = '\0';
!     } else
!       tbuf[0] = '\0';
! 
!     if (fp->minargs == maxargs)
!       notify_format(player, T("Arguments : %d %s"), fp->minargs, tbuf);
!     else if (fp->maxargs == INT_MAX)
!       notify_format(player, T("Arguments : At least %d %s"), fp->minargs, tbuf);
!     else
!       notify_format(player,
! 		    T("Arguments : %d to %d %s"), fp->minargs, maxargs, tbuf);
!   } else {
!     if (Global_Funcs(player))
!       notify_format(player, T("Location  : #%d/%s"),
! 		    userfn_tab[fp->where.offset].thing,
! 		    userfn_tab[fp->where.offset].name);
!     notify(player, T("Arguments : 0 to 10"));
!   }
  }
--- 1178,1207 ----
      first = 0;
    }
  
+   *tp = '\0';
+   notify_format(player, T("Flags     : %s"), tbuf);
  
+   if (!(fp->flags & FN_BUILTIN) && Global_Funcs(player)) {
+     notify_format(player, T("Location  : #%d/%s"),
+ 		  userfn_tab[fp->where.offset].thing,
+ 		  userfn_tab[fp->where.offset].name);
+   }
  
+   maxargs = abs(fp->maxargs);
  
+   tp = tbuf;
  
+   if (fp->maxargs < 0) {
+     safe_str(T("(Commas okay in last argument)"), tbuf, &tp);
+     *tp = '\0';
+   } else
+     tbuf[0] = '\0';
  
!   if (fp->minargs == maxargs)
!     notify_format(player, T("Arguments : %d %s"), fp->minargs, tbuf);
!   else if (fp->maxargs == INT_MAX)
!     notify_format(player, T("Arguments : At least %d %s"), fp->minargs, tbuf);
!   else
!     notify_format(player,
! 		  T("Arguments : %d to %d %s"), fp->minargs, maxargs, tbuf);
  }
*** 1_7_7.85/src/flags.c Tue, 24 Dec 2002 15:20:25 -0600 dunemush (pennmush/c/20_flags.c 1.1.1.1.1.1.1.1.1.1.1.1.1.6.1.2.1.1.1.1.1.2.2.2.2.1.2.1.1.3.1.2.1.1.1.1.1.1.1.1.1.3.1.9.1.2.2.1.1.5 660)
--- 1_7_7.109(w)/src/flags.c Mon, 06 Jan 2003 16:22:14 -0600 dunemush (pennmush/c/20_flags.c 1.1.1.1.1.1.1.1.1.1.1.1.1.6.1.2.1.1.1.1.1.2.2.2.2.1.2.1.1.3.1.2.1.1.1.1.1.1.1.1.1.3.1.9.1.2.2.1.1.2.1.1.1.2 660)
***************
*** 690,709 ****
      if (IsThing(thing) && (f->type == TYPE_THING) &&
  	GoodObject(Location(thing)) && (hear || listener) &&
  	!Hearer(thing) && !Listener(thing)) {
!       sprintf(tbuf1, T("%s is no longer listening."), Name(thing));
        notify_except(Contents(Location(thing)), NOTHING, tbuf1);
        notify_except(Contents(thing), NOTHING, tbuf1);
      }
      if (IsRoom(thing) && (f->type == TYPE_ROOM) &&
  	(f->flag == ROOM_LISTEN) && !hear && !Listener(thing)) {
!       sprintf(tbuf1, T("%s is no longer listening."), Name(thing));
        notify_except(Contents(thing), NOTHING, tbuf1);
      }
      if ((f->flag == AUDIBLE) && (f->type == NOTYPE)) {
        switch (Typeof(thing)) {
        case TYPE_EXIT:
  	if (Audible(Source(thing))) {
! 	  sprintf(tbuf1, T("Exit %s is no longer broadcasting."), Name(thing));
  	  notify_except(Contents(Source(thing)), NOTHING, tbuf1);
  	}
  	break;
--- 690,716 ----
      if (IsThing(thing) && (f->type == TYPE_THING) &&
  	GoodObject(Location(thing)) && (hear || listener) &&
  	!Hearer(thing) && !Listener(thing)) {
!       tp = tbuf1;
!       safe_format(tbuf1, &tp, T("%s is no longer listening."), Name(thing));
!       *tp = '\0';
        notify_except(Contents(Location(thing)), NOTHING, tbuf1);
        notify_except(Contents(thing), NOTHING, tbuf1);
      }
      if (IsRoom(thing) && (f->type == TYPE_ROOM) &&
  	(f->flag == ROOM_LISTEN) && !hear && !Listener(thing)) {
!       tp = tbuf1;
!       safe_format(tbuf1, &tp, T("%s is no longer listening."), Name(thing));
!       *tp = '\0';
        notify_except(Contents(thing), NOTHING, tbuf1);
      }
      if ((f->flag == AUDIBLE) && (f->type == NOTYPE)) {
        switch (Typeof(thing)) {
        case TYPE_EXIT:
  	if (Audible(Source(thing))) {
! 	  tp = tbuf1;
! 	  safe_format(tbuf1, &tp, T("Exit %s is no longer broadcasting."),
! 		      Name(thing));
! 	  *tp = '\0';
  	  notify_except(Contents(Source(thing)), NOTHING, tbuf1);
  	}
  	break;
***************
*** 754,766 ****
  	GoodObject(Location(thing)) &&
  	((f->flag == THING_PUPPET) || (f->flag == THING_LISTEN)) &&
  	!hear && !listener) {
!       sprintf(tbuf1, T("%s is now listening."), Name(thing));
        notify_except(Contents(Location(thing)), NOTHING, tbuf1);
        notify_except(Contents(thing), NOTHING, tbuf1);
      }
      if (IsRoom(thing) && (f->type == TYPE_ROOM) &&
  	(f->flag == ROOM_LISTEN) && !hear && !listener) {
!       sprintf(tbuf1, T("%s is now listening."), Name(thing));
        notify_except(Contents(thing), NOTHING, tbuf1);
      }
      /* notify for audible exits */
--- 761,777 ----
  	GoodObject(Location(thing)) &&
  	((f->flag == THING_PUPPET) || (f->flag == THING_LISTEN)) &&
  	!hear && !listener) {
!       tp = tbuf1;
!       safe_format(tbuf1, &tp, T("%s is now listening."), Name(thing));
!       *tp = '\0';
        notify_except(Contents(Location(thing)), NOTHING, tbuf1);
        notify_except(Contents(thing), NOTHING, tbuf1);
      }
      if (IsRoom(thing) && (f->type == TYPE_ROOM) &&
  	(f->flag == ROOM_LISTEN) && !hear && !listener) {
!       tp = tbuf1;
!       safe_format(tbuf1, &tp, T("%s is now listening."), Name(thing));
!       *tp = '\0';
        notify_except(Contents(thing), NOTHING, tbuf1);
      }
      /* notify for audible exits */
***************
*** 768,774 ****
        switch (Typeof(thing)) {
        case TYPE_EXIT:
  	if (Audible(Source(thing))) {
! 	  sprintf(tbuf1, T("Exit %s is now broadcasting."), Name(thing));
  	  notify_except(Contents(Source(thing)), NOTHING, tbuf1);
  	}
  	break;
--- 779,788 ----
        switch (Typeof(thing)) {
        case TYPE_EXIT:
  	if (Audible(Source(thing))) {
! 	  tp = tbuf1;
! 	  safe_format(tbuf1, &tp, T("Exit %s is now broadcasting."),
! 		      Name(thing));
! 	  *tp = '\0';
  	  notify_except(Contents(Source(thing)), NOTHING, tbuf1);
  	}
  	break;
*** 1_7_7.85/src/extmail.c Sun, 22 Dec 2002 01:54:24 -0600 dunemush (pennmush/c/22_extmail.c 1.44.1.7.1.5.1.9.1.2 660)
--- 1_7_7.109(w)/src/extmail.c Mon, 06 Jan 2003 16:22:14 -0600 dunemush (pennmush/c/22_extmail.c 1.44.1.7.1.5.1.9.1.1.1.2 660)
***************
*** 415,421 ****
    /* print a mail message(s) */
  
    struct mail *mp;
!   char tbuf1[BUFFER_LEN];
    char folderheader[BUFFER_LEN];
    struct mail_selector ms;
    int j, folder;
--- 415,421 ----
    /* print a mail message(s) */
  
    struct mail *mp;
!   char tbuf1[BUFFER_LEN], *bp;
    char folderheader[BUFFER_LEN];
    struct mail_selector ms;
    int j, folder;
***************
*** 443,453 ****
  	} else
  	  strcpy(folderheader, T("Folder:"));
  	notify(player, DASH_LINE);
  	if (IsPlayer(mp->from))
! 	  sprintf(tbuf1, "%s", Name(mp->from));
  	else
! 	  sprintf(tbuf1, "%s (owner: %s)", Name(mp->from),
! 		  Name(Owner(mp->from)));
  	notify_format(player,
  		      T
  		      ("From: %-55s %s\nDate: %-25s   %s %2d   Message: %d\nStatus: %s"),
--- 443,455 ----
  	} else
  	  strcpy(folderheader, T("Folder:"));
  	notify(player, DASH_LINE);
+ 	bp = tbuf1;
  	if (IsPlayer(mp->from))
! 	  safe_str(Name(mp->from), tbuf1, &bp);
  	else
! 	  safe_format(tbuf1, &bp, "%s (owner: %s)", Name(mp->from),
! 		      Name(Owner(mp->from)));
! 	*bp = '\0';
  	notify_format(player,
  		      T
  		      ("From: %-55s %s\nDate: %-25s   %s %2d   Message: %d\nStatus: %s"),
*** 1_7_7.85/src/db.c Wed, 25 Dec 2002 14:16:58 -0600 dunemush (pennmush/c/25_db.c 1.26.1.1.1.1.1.11 660)
--- 1_7_7.109(w)/src/db.c Mon, 06 Jan 2003 16:22:13 -0600 dunemush (pennmush/c/25_db.c 1.26.1.1.1.1.1.6.1.2 660)
***************
*** 1021,1027 ****
      flags = parse_integer(val);
      /* boolexp */
      b = getboolexp(f, type);
!     add_lock(creator, i, type, b, flags);
    }
  }
  
--- 1021,1027 ----
      flags = parse_integer(val);
      /* boolexp */
      b = getboolexp(f, type);
!     add_lock_raw(creator, i, type, b, flags);
    }
  }
  
***************
*** 1049,1055 ****
        /* getboolexp() would already have complained. */
        return;
      } else {
!       add_lock(Owner(i), i, buf, b, -1);
      }
    }
    ungetc(c, f);
--- 1049,1055 ----
        /* getboolexp() would already have complained. */
        return;
      } else {
!       add_lock_raw(Owner(i), i, buf, b, -1);
      }
    }
    ungetc(c, f);
*** 1_7_7.85/src/conf.c Tue, 17 Dec 2002 16:03:37 -0600 dunemush (pennmush/c/31_conf.c 1.41.2.3.1.3.1.2.1.15.1.1.1.2 660)
--- 1_7_7.109(w)/src/conf.c Mon, 06 Jan 2003 16:22:13 -0600 dunemush (pennmush/c/31_conf.c 1.41.2.3.1.3.1.2.1.15.1.1.1.2.1.2.1.1 660)
***************
*** 327,332 ****
--- 327,334 ----
    {"queue_entry_cpu_time", cf_int, &options.queue_entry_cpu_time, 100000, 0,
     "limits"}
    ,
+   {"max_global_fns", cf_int, &options.max_global_fns, 2000, 0, 0}
+   ,
  
  #ifdef CHAT_SYSTEM
    {"max_channels", cf_int, &options.max_channels, 1000, 0, "chat"}
***************
*** 924,929 ****
--- 926,932 ----
    options.max_guest_pennies = 100000;
    options.max_depth = 10;
    options.max_parents = 10;
+   options.max_global_fns = 50;
    options.purge_interval = 601;
    options.dbck_interval = 599;
    options.max_attrcount = 2048;
*** 1_7_7.85/src/bsd.c Tue, 24 Dec 2002 15:20:25 -0600 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.1.1.1.13.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.1.1.3.1.8.2.1.1.1.1.1.1.1.1.2.1.1.1.6 660)
--- 1_7_7.109(w)/src/bsd.c Mon, 06 Jan 2003 16:22:13 -0600 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.1.1.1.13.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.1.1.3.1.8.2.1.1.1.1.1.1.1.1.2.1.1.1.7 660)
***************
*** 4558,4564 ****
    (void) queue_attribute(player, "ACONNECT", player);
    if (ROOM_CONNECTS) {
      /* Do the room the player connected into */
!     if (IsRoom(loc)) {
        (void) queue_attribute(loc, "ACONNECT", player);
      }
    }
--- 4558,4564 ----
    (void) queue_attribute(player, "ACONNECT", player);
    if (ROOM_CONNECTS) {
      /* Do the room the player connected into */
!     if (IsRoom(loc) || IsThing(loc)) {
        (void) queue_attribute(loc, "ACONNECT", player);
      }
    }
***************
*** 4636,4642 ****
  
      (void) queue_attribute(player, "ADISCONNECT", player);
      if (ROOM_CONNECTS)
!       if (IsRoom(loc)) {
  	(void) queue_attribute(loc, "ADISCONNECT", player);
        }
      if (GLOBAL_CONNECTS) {
--- 4636,4642 ----
  
      (void) queue_attribute(player, "ADISCONNECT", player);
      if (ROOM_CONNECTS)
!       if (IsRoom(loc) || IsThing(loc)) {
  	(void) queue_attribute(loc, "ADISCONNECT", player);
        }
      if (GLOBAL_CONNECTS) {
*** 1_7_7.85/src/Makefile Mon, 18 Nov 2002 21:08:25 -0600 dunemush (pennmush/c/44_Makefile 1.21.1.11 700)
--- 1_7_7.109(w)/src/Makefile Wed, 25 Dec 2002 16:09:28 -0600 dunemush (pennmush/c/44_Makefile 1.21.1.12 700)
***************
*** 192,198 ****
  
  ../hdrs/patches.h:
  	if [ ! -f ../hdrs/patches.h ]; then \
! 	  (cd ../utils; sh mkcmds.sh); \
  	fi
  
  ../po/pennmush.pot: $(C_FILES) $(H_FILES)
--- 192,198 ----
  
  ../hdrs/patches.h:
  	if [ ! -f ../hdrs/patches.h ]; then \
! 	  (cd ../utils; sh mkcmds.sh patches); \
  	fi
  
  ../po/pennmush.pot: $(C_FILES) $(H_FILES)
*** 1_7_7.85/hdrs/version.h Wed, 25 Dec 2002 14:16:58 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.17.1.6 660)
--- 1_7_7.109(w)/hdrs/version.h Mon, 06 Jan 2003 16:22:24 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.17.1.7 660)
***************
*** 1,2 ****
! #define VERSION "PennMUSH version 1.7.7 patchlevel 3 [12/25/2002]"
! #define SHORTVN "PennMUSH 1.7.7p3"
--- 1,2 ----
! #define VERSION "PennMUSH version 1.7.7 patchlevel 4 [01/02/2003]"
! #define SHORTVN "PennMUSH 1.7.7p4"
*** 1_7_7.85/hdrs/lock.h Wed, 20 Nov 2002 09:43:49 -0600 dunemush (pennmush/d/6_lock.h 1.13 660)
--- 1_7_7.109(w)/hdrs/lock.h Mon, 06 Jan 2003 16:22:23 -0600 dunemush (pennmush/d/6_lock.h 1.15 660)
***************
*** 54,59 ****
--- 54,61 ----
  const lock_list *get_lockproto(lock_type type);
  int add_lock(dbref player, dbref thing, lock_type type, struct boolexp *key,
  	     int flags);
+ int add_lock_raw(dbref player, dbref thing, lock_type type,
+ 		 struct boolexp *key, int flags);
  void free_locks(lock_list *ll);
  int eval_lock(dbref player, dbref thing, lock_type ltype);
  void do_unlock(dbref player, const char *name, lock_type type);
***************
*** 64,82 ****
  void do_lset(dbref player, char *what, char *flags);
  const char *lock_flags(lock_list *ll);
  const char *lock_flags_long(lock_list *ll);
- 
  #define L_FLAGS(lock) ((lock)->flags)
  #define L_CREATOR(lock) ((lock)->creator)
  #define L_TYPE(lock) ((lock)->type)
  #define L_KEY(lock) ((lock)->key)
  #define L_NEXT(lock) ((lock)->next)
- 
  /* can p read/evaluate lock l on object x? */
  int lock_visual(dbref, lock_type);
  #define Can_Read_Lock(p,x,l)   \
      (See_All(p) || controls(p,x) || ((Visual(x) || lock_visual(x, l)) && \
       eval_lock(p,x,Examine_Lock)))
- 
  /* The actual magic cookies. */
  extern const lock_type Basic_Lock;
  extern const lock_type Enter_Lock;
--- 66,81 ----
***************
*** 101,107 ****
  extern const lock_type Dropto_Lock;	/* Who follows the dropto of this room? */
  extern const lock_type Destroy_Lock;	/* Who can @dest me if I'm dest_ok? */
  /* Declare new lock types here! */
- 
  #include "boolexp.h"
- 
  #endif				/* __LOCK_H */
--- 100,104 ----
*** 1_7_7.85/hdrs/game.h Tue, 17 Dec 2002 15:42:31 -0600 dunemush (pennmush/d/12_game.h 1.28.1.2.1.1.1.1.1.1.1.11 660)
--- 1_7_7.109(w)/hdrs/game.h Mon, 06 Jan 2003 16:22:23 -0600 dunemush (pennmush/d/12_game.h 1.28.1.2.1.1.1.1.1.1.1.7.1.2 660)
***************
*** 159,164 ****
--- 159,165 ----
  
  /* From timer.c */
  extern void init_timer(void);
+ extern void signal_cpu_limit(int signo);
  
  /* From version.c */
  extern void do_version(dbref player);
*** 1_7_7.85/hdrs/function.h Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/d/13_function.h 1.18 660)
--- 1_7_7.109(w)/hdrs/function.h Mon, 06 Jan 2003 16:22:23 -0600 dunemush (pennmush/d/13_function.h 1.20 660)
***************
*** 30,38 ****
  #define FN_NOSIDEFX 0x800
  
  
- /* Number of user @functions */
- #define MAX_GLOBAL_FNS 50
- 
  #ifndef HAVE_FUN_DEFINED
  typedef struct fun FUN;
  #define HAVE_FUN_DEFINED
--- 30,35 ----
***************
*** 64,70 ****
    unsigned int flags;
  };
  
! extern USERFN_ENTRY userfn_tab[MAX_GLOBAL_FNS];
  
  extern void do_userfn(char *buff, char **bp,
  		      dbref obj, ATTR *attrib,
--- 61,67 ----
    unsigned int flags;
  };
  
! extern USERFN_ENTRY *userfn_tab;
  
  extern void do_userfn(char *buff, char **bp,
  		      dbref obj, ATTR *attrib,
***************
*** 85,91 ****
  extern void do_function_toggle(dbref player, char *name, int toggle);
  extern void do_function_report(dbref player, char *name);
  extern void do_function_delete(dbref player, char *name);
! 
  
  
  #define FUNCTION_PROTO(fun_name) \
--- 82,88 ----
  extern void do_function_toggle(dbref player, char *name, int toggle);
  extern void do_function_report(dbref player, char *name);
  extern void do_function_delete(dbref player, char *name);
! extern void function_init_postconfig(void);
  
  
  #define FUNCTION_PROTO(fun_name) \
*** 1_7_7.85/hdrs/externs.h Tue, 24 Dec 2002 15:20:25 -0600 dunemush (pennmush/d/16_externs.h 1.1.1.53.1.2.1.8.2.1.1.2.1.1.1.1.1.2.1.6.1.3.1.4.2.6 660)
--- 1_7_7.109(w)/hdrs/externs.h Mon, 06 Jan 2003 16:22:23 -0600 dunemush (pennmush/d/16_externs.h 1.1.1.53.1.2.1.8.2.1.1.2.1.1.1.1.1.2.1.6.1.3.1.4.3.2 660)
***************
*** 178,185 ****
  extern void do_move(dbref player, const char *direction, int type);
  extern void moveto(dbref what, dbref where);
  extern void safe_tel(dbref player, dbref dest, int nomovemsgs);
! extern dbref global_exit(dbref player, const char *direction);
! extern dbref remote_exit(dbref loc, const char *direction);
  extern void move_wrapper(dbref player, const char *command);
  extern void do_follow(dbref player, const char *arg);
  extern void do_unfollow(dbref player, const char *arg);
--- 178,185 ----
  extern void do_move(dbref player, const char *direction, int type);
  extern void moveto(dbref what, dbref where);
  extern void safe_tel(dbref player, dbref dest, int nomovemsgs);
! extern int global_exit(dbref player, const char *direction);
! extern int remote_exit(dbref loc, const char *direction);
  extern void move_wrapper(dbref player, const char *command);
  extern void do_follow(dbref player, const char *arg);
  extern void do_unfollow(dbref player, const char *arg);
*** 1_7_7.85/hdrs/conf.h Sun, 22 Dec 2002 18:12:18 -0600 dunemush (pennmush/d/20_conf.h 1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.5.1.1.1.1.1.1.1.1.1.2.1.1.2.1.2.13.1.4 660)
--- 1_7_7.109(w)/hdrs/conf.h Mon, 06 Jan 2003 16:22:23 -0600 dunemush (pennmush/d/20_conf.h 1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.5.1.1.1.1.1.1.1.1.1.2.1.1.2.1.2.13.1.4.1.1 660)
***************
*** 220,225 ****
--- 220,226 ----
    int player_name_len;
    int queue_entry_cpu_time;
    int ascii_names;
+   int max_global_fns;
  };
  
  extern OPTTAB options;
***************
*** 346,352 ****
  #define TINY_MATH (options.tiny_math)
  #define NEWLINE_ONE_CHAR (options.newline_one_char)
  #define ONLY_ASCII_NAMES (options.ascii_names)
! 
  
  /* Compiler-specific stuff. */
  
--- 347,353 ----
  #define TINY_MATH (options.tiny_math)
  #define NEWLINE_ONE_CHAR (options.newline_one_char)
  #define ONLY_ASCII_NAMES (options.ascii_names)
! #define MAX_GLOBAL_FNS (options.max_global_fns)
  
  /* Compiler-specific stuff. */
  
*** 1_7_7.85/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_7.109(w)/Makefile.SH Wed, 25 Dec 2002 16:09:28 -0600 dunemush (pennmush/d/30_Makefile.S 1.14.1.1.1.8 700)
***************
*** 60,66 ****
  	@echo "Making all in src."
  	(cd src; make all "CC=$(CC)" "CCFLAGS=$(CCFLAGS)" \
  	"LDFLAGS=$(LDFLAGS)" "CLIBS=$(CLIBS)" "MAKE=$(MAKE)" \
! 	"MAKEFLAGS=$(MAKEFLAGS)"; rm -f ../hdrs/timestamp)
  	@echo "If the make was successful, use 'make install' to install links."
  
  config.h: Configure
--- 60,66 ----
  	@echo "Making all in src."
  	(cd src; make all "CC=$(CC)" "CCFLAGS=$(CCFLAGS)" \
  	"LDFLAGS=$(LDFLAGS)" "CLIBS=$(CLIBS)" "MAKE=$(MAKE)" \
! 	"MAKEFLAGS=$(MAKEFLAGS)")
  	@echo "If the make was successful, use 'make install' to install links."
  
  config.h: Configure
***************
*** 74,92 ****
  	exit 1
  
  hdrs/cmds.h: src/cmds.c src/command.c src/cque.c src/help.c src/set.c
! 	(cd utils; sh mkcmds.sh)
  
  hdrs/switches.h: src/SWITCHES
! 	(cd utils; sh mkcmds.sh)
  
! src/switchinc.c: src/SWITCHES
! 	(cd utils; sh mkcmds.sh)
  
! hdrs/funs.h: src/fun*.c
! 	(cd utils; sh mkcmds.sh)
  
  hdrs/patches.h: patches/*
! 	(cd utils; sh mkcmds.sh)
  
  install: localized all
  	-rm -f game/netmush
--- 74,92 ----
  	exit 1
  
  hdrs/cmds.h: src/cmds.c src/command.c src/cque.c src/help.c src/set.c
! 	(cd utils; sh mkcmds.sh commands)
  
  hdrs/switches.h: src/SWITCHES
! 	(cd utils; sh mkcmds.sh switches)
  
! #src/switchinc.c: hdrs/switches.h
! #	(cd utils; sh mkcmds.sh switches)
  
! hdrs/funs.h: src/fun*.c src/bsd.c src/conf.c src/extmail.c src/help.c src/wiz.c
! 	(cd utils; sh mkcmds.sh functions)
  
  hdrs/patches.h: patches/*
! 	(cd utils; sh mkcmds.sh patches)
  
  install: localized all
  	-rm -f game/netmush
***************
*** 222,228 ****
  	gzip /tmp/dist.tar
  
  dist.tar: distclean versions
- 	-rm -f hdrs/timestamp
  	(cd utils; sh mkcmds.sh)
  	makedist -c pennmush
  	tar -cvf /tmp/dist.tar pennmush
--- 222,227 ----


More information about the Pennmush-announce mailing list