[PENNMUSH-ANNOUNCE] 1.7.7-patch12
dunemush at tala.mede.uic.edu
dunemush at tala.mede.uic.edu
Tue Mar 25 16:49:10 CST 2003
This is patch12 to PennMUSH 1.7.7. After applying this patch, you will
have version 1.7.7p12
To apply this patch, save it to a file in your top-level MUSH directory,
and do the following:
patch -p1 < 1.7.7-patch12
mv CHANGES CHANGES.177
./Configure -S
make versions
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:
Commands:
* @channel/buffer creates a buffer for a channel to store the most
recent messages broadcast on the channel. @channel/recall can be
used to recall them. These are not stored across reboots and should
be set up by #1's @startup.
Functions/Substitutions:
* accname() gives the accented name of an object (applying @nameaccent).
* %~ gives the accented name of the enactor.
Minor Changes:
* The chat-related commands and functions have been moved out
of bsd.c and funmisc.c and into extchat.c. Patch by Vadiv at M*U*S*H.
* The notification stuff has been moved out of bsd.c and into a new
notify.c file.
* @name no longer requires a password for changing player names,
and ignores one if given. Suggested by Ambrosia at M*U*S*H (and others).
* @hook can not be used on the @password or @newpassword commands.
* The dump_complete message is also shown after a forking dump,
if one is defined. Suggested by Nathan Schuette.
* @lock/leave on a room now prevents people within it from leaving
via exits or via @tel. Suggested by Peter Bengtson, patch by
BlaZe at M*U*S*H.
Fixes:
* Fixes from 1.7.6p8
* Cleanup of a few new db[x] mentions in the source to use dbdefs.h
macros. Inspired by Vadiv at M*U*S*H.
* @command/restrict didn't work properly for most flags, especially
new ones. Reported by Caesar and Sholevi at M*U*S*H.
* @pemit/list didn't honor NOSPOOF. Patch by Cheetah at M*U*S*H.
Prereq: 1.7.7p11
rm -rf CHANGES*~ CHANGES*bak
utils/mkvershlp.pl game/txt/hlp CHANGES*
*** 1_7_7.231/Patchlevel Sat, 22 Feb 2003 15:29:30 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.13 600)
--- 1_7_7.308(w)/Patchlevel Sat, 22 Mar 2003 10:44:14 -0600 dunemush (pennmush/5_Patchlevel 1.17.1.11.1.14 600)
***************
*** 1,2 ****
Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.7p11
--- 1,2 ----
Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.7p12
*** 1_7_7.231/CHANGES Sat, 22 Feb 2003 15:29:30 -0600 dunemush (pennmush/g/23_CHANGES 1.48.1.23 600)
--- 1_7_7.308(w)/CHANGES.177 Mon, 24 Mar 2003 12:09:06 -0600 dunemush (pennmush/g/23_CHANGES 1.48.1.41 600)
***************
*** 18,23 ****
--- 18,55 ----
==========================================================================
+ Version 1.7.7 patchlevel 12 March 21, 2003
+
+ Commands:
+ * @channel/buffer creates a buffer for a channel to store the most
+ recent messages broadcast on the channel. @channel/recall can be
+ used to recall them. These are not stored across reboots and should
+ be set up by #1's @startup.
+ Functions/Substitutions:
+ * accname() gives the accented name of an object (applying @nameaccent).
+ * %~ gives the accented name of the enactor.
+ Minor Changes:
+ * The chat-related commands and functions have been moved out
+ of bsd.c and funmisc.c and into extchat.c. Patch by Vadiv at M*U*S*H.
+ * The notification stuff has been moved out of bsd.c and into a new
+ notify.c file.
+ * @name no longer requires a password for changing player names,
+ and ignores one if given. Suggested by Ambrosia at M*U*S*H (and others).
+ * @hook can not be used on the @password or @newpassword commands.
+ * The dump_complete message is also shown after a forking dump,
+ if one is defined. Suggested by Nathan Schuette.
+ * @lock/leave on a room now prevents people within it from leaving
+ via exits or via @tel. Suggested by Peter Bengtson, patch by
+ BlaZe at M*U*S*H.
+ Fixes:
+ * Fixes from 1.7.6p8
+ * Cleanup of a few new db[x] mentions in the source to use dbdefs.h
+ macros. Inspired by Vadiv at M*U*S*H.
+ * @command/restrict didn't work properly for most flags, especially
+ new ones. Reported by Caesar and Sholevi at M*U*S*H.
+ * @pemit/list didn't honor NOSPOOF. Patch by Cheetah at M*U*S*H.
+
+
Version 1.7.7 patchlevel 11 February 22, 2003
Commands:
*** 1_7_7.231/game/txt/hlp/penntop.hlp Tue, 04 Feb 2003 22:13:06 -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.5 600)
--- 1_7_7.308(w)/game/txt/hlp/penntop.hlp Thu, 06 Mar 2003 10:50:57 -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.6 600)
***************
*** 1699,1709 ****
Zone master rooms are a subset of zones. If a room is used as a zone
master, it is a zone master room (ZMR). ZMRs are like local "master"
rooms. Exits in the ZMR are global to that zone, and $commands on
! objects in the ZMR are global to that zone. Zone master rooms are
! only defined if globals are used. Zone master rooms are best used for
! very large zones which have a lot of global exits, or for zones with
! restricted commands that can go on a separate use-locked object from
! general ones.
See also: ZONES, MASTER ROOM, EVALUATION
& ZONE MASTERS
--- 1699,1714 ----
Zone master rooms are a subset of zones. If a room is used as a zone
master, it is a zone master room (ZMR). ZMRs are like local "master"
rooms. Exits in the ZMR are global to that zone, and $commands on
! objects in the ZMR are global to that zone ($commands on the ZMR itself,
! like $commands on the master room, are ignored). If a ZMR is a player's
! personal zone, objects in the ZMR are checked for commands that the
! player can use anywhere (but exits are not checked unless the player
! is in a zoned room).
!
! Zone master rooms are only defined if globals are used. Zone master
! rooms are best used for very large zones which have a lot of global
! exits, or for zones with restricted commands that can go on a separate
! use-locked object from general ones.
See also: ZONES, MASTER ROOM, EVALUATION
& ZONE MASTERS
*** 1_7_7.231/game/txt/hlp/pennfunc.hlp Wed, 12 Feb 2003 15:05:43 -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.8 600)
--- 1_7_7.308(w)/game/txt/hlp/pennfunc.hlp Tue, 18 Mar 2003 15:58:45 -0600 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.1.1.1.1.9.1.1.1.1.1.3.1.1.1.1.1.1.1.1.1.2 600)
***************
*** 1263,1268 ****
--- 1263,1275 ----
> say [foreach(is_alphanum,jt1o+)]
You say, "1 1 1 1 0 "
+ & ACCNAME()
+ accname(<object>)
+
+ accname() returns the name of object <object>, applying the object's
+ @nameaccent, if any.
+
+ Related functions: NAME(), ACCNAME(), INAME()
& FULLNAME()
fullname(<object>)
***************
*** 1273,1279 ****
>"[fullname(south)]
You say, "South;sout;sou;so;s"
! Related functions: NAME(), INAME()
& FUNCTIONS()
functions()
--- 1280,1286 ----
>"[fullname(south)]
You say, "South;sout;sou;so;s"
! Related functions: NAME(), ACCNAME(), INAME()
& FUNCTIONS()
functions()
***************
*** 2342,2348 ****
error, but enough old code has been written that expects this behavior
that it will continue to do this for the time being. Don't rely on it.
! Related functions: FULLNAME(), INAME()
& NAND()
nand(<boolean>, <boolean>,...)
--- 2349,2355 ----
error, but enough old code has been written that expects this behavior
that it will continue to do this for the time being. Don't rely on it.
! Related functions: FULLNAME(), ACCNAME(), INAME()
& NAND()
nand(<boolean>, <boolean>,...)
***************
*** 3535,3546 ****
attribute, %# refers to the original enactor and not the 'calling' object;
'me' refers to the object that supplied the attribute.
! However, unlike the u() function, the global registers r(0) through r(9)
! (%q0 - %q9) are preserved in their initial state. This means that functions
! "below" the level of the u() can reset global registers for temporary
! calculations, without needing to worry about "clobbering" the original
! values.
!
This makes ulocal() particularly useful for global or shared code which
calls arbitrary u() functions, where global register values need to be
preserved from accidental user clobbering.
--- 3542,3553 ----
attribute, %# refers to the original enactor and not the 'calling' object;
'me' refers to the object that supplied the attribute.
! However, unlike the u() function, the global registers r(0)-r(9) and
! r(A)-r(Z) (%q0-%q9, %qa-%qz) are preserved in their initial state. This
! means that functions "below" the level of the u() can reset global
! registers for temporary calculations, without needing to worry about
! "clobbering" the original values.
!
This makes ulocal() particularly useful for global or shared code which
calls arbitrary u() functions, where global register values need to be
preserved from accidental user clobbering.
*** 1_7_7.231/game/txt/hlp/pennflag.hlp Tue, 04 Feb 2003 22:25:42 -0600 dunemush (pennmush/17_pennflag.h 1.1.1.1.1.2.1.1.1.2.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.4.1.2.1.4 600)
--- 1_7_7.308(w)/game/txt/hlp/pennflag.hlp Sat, 15 Mar 2003 20:28:51 -0600 dunemush (pennmush/17_pennflag.h 1.1.1.1.1.2.1.1.1.2.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.4.1.2.2.2 600)
***************
*** 47,59 ****
V - Visual W - Wizard X - Safe
Z - Shared, Z_Tel
! a - Audible b - Debug c - Connected, Cloudy
d - Destroy_Ok e - Enter_Ok g - Gagged
h - Halt j - Jury_Ok l - Light
m - Myopic, Mistrust n - No_Command o - On-Vacation
p - Puppet, Paranoid r - Royalty s - Suspect
t - Transparent u - Uninspected v - Verbose
! w - No_Warn x - Terse ? - Unregistered
^ - Listen_Parent ~ - Noaccents
---------------------------------------------------------------------
Some flags may not be enabled on some MUSHes. @flag/list will show
--- 47,59 ----
V - Visual W - Wizard X - Safe
Z - Shared, Z_Tel
! a - Audible b - Debug c - Connected
d - Destroy_Ok e - Enter_Ok g - Gagged
h - Halt j - Jury_Ok l - Light
m - Myopic, Mistrust n - No_Command o - On-Vacation
p - Puppet, Paranoid r - Royalty s - Suspect
t - Transparent u - Uninspected v - Verbose
! w - No_Warn x - Terse, Cloudy ? - Unregistered
^ - Listen_Parent ~ - Noaccents
---------------------------------------------------------------------
Some flags may not be enabled on some MUSHes. @flag/list will show
*** 1_7_7.231/game/txt/hlp/penncmd.hlp Sat, 22 Feb 2003 14:01:23 -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.1.6 600)
--- 1_7_7.308(w)/game/txt/hlp/penncmd.hlp Wed, 12 Mar 2003 12:25:37 -0600 dunemush (pennmush/18_penncmd.hl 1.2.1.1.1.47.1.1.1.1.1.3.1.4.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.2.1.10.1.1.1.1.1.1.1.4 600)
***************
*** 1936,1942 ****
@lock/speech Who can speak/pose/emit in this room
@lock/listen Who can trigger my @ahear/^-pattern actions
@lock/command Who can trigger my $-pattern commands
! @lock/leave Who can leave this object
@lock/drop Who can drop this object or in this room
@lock/give Who can give this object
@lock/follow Who can follow this object
--- 1936,1942 ----
@lock/speech Who can speak/pose/emit in this room
@lock/listen Who can trigger my @ahear/^-pattern actions
@lock/command Who can trigger my $-pattern commands
! @lock/leave Who can leave this object (or room, via exits/@tel)
@lock/drop Who can drop this object or in this room
@lock/give Who can give this object
@lock/follow Who can follow this object
***************
*** 2043,2053 ****
See also: go, @omove, @oxmove, @amove
& @name
! @name <object>=<new name> [<password>]
Changes the name of <object>, which can be a thing, player, exit,
or room. You can refer to object by name, DBREF number, or as "me"
! or "here". For a player, it requires the player's password.
& @newpassword
@newpassword <player> = <password>
--- 2043,2057 ----
See also: go, @omove, @oxmove, @amove
& @name
! @name <object>=<new name>
Changes the name of <object>, which can be a thing, player, exit,
or room. You can refer to object by name, DBREF number, or as "me"
! or "here".
!
! When changing a player's name on games that support multi-word player
! names, the name should be enclosed in quotes:
! @name me = "James Bond"
& @newpassword
@newpassword <player> = <password>
***************
*** 2541,2547 ****
@remit[/switches] <object> = <message>.
Sends the message to all contents of <object>, which can be a room,
! thing, or player. (The TinyMUSH equivalent is @pemit/contents).
The /silent switch stops the remitter from getting feedback if they're
in a different location than the target.
--- 2545,2552 ----
@remit[/switches] <object> = <message>.
Sends the message to all contents of <object>, which can be a room,
! thing, or player. The message is also sent to the <object> itself.
! (The TinyMUSH equivalent is @pemit/contents).
The /silent switch stops the remitter from getting feedback if they're
in a different location than the target.
*** 1_7_7.231/game/txt/hlp/pennchat.hlp Sun, 15 Sep 2002 15:53:06 -0500 dunemush (pennmush/19_pennchat.h 1.2.1.4.1.4 600)
--- 1_7_7.308(w)/game/txt/hlp/pennchat.hlp Sun, 16 Mar 2003 16:54:10 -0600 dunemush (pennmush/19_pennchat.h 1.2.1.4.1.5 600)
***************
*** 58,72 ****
Wizards may add and remove other players from channels by providing
a player name as a second argument.
! Some channels may be restricted in who can join them and/or speak
! on them. If the Extended Chat System is enabled, @channel/list will
! show you the channel's name, number of users, number of message
! since last restart, access information, and your status. See
! "help channel-list" for an explanation of how to read the listing.
@channel/what will show you the channel's name, access information,
and a description of the channel's purpose.
! More details are provided in "help @channel2". See also: chat
& @channel2
@channel/who <channel>
@channel/hide <channel> = <yes|no>
--- 58,73 ----
Wizards may add and remove other players from channels by providing
a player name as a second argument.
! Channels may be restricted in who can join them and/or speak on
! them. @channel/list will show you the channel's name, number of users,
! number of message since last restart, access information, and your
! status. See "help channel-list" for an explanation of how to read
! the listing.
!
@channel/what will show you the channel's name, access information,
and a description of the channel's purpose.
! More commands are provided in "help @channel2". See also: chat
& @channel2
@channel/who <channel>
@channel/hide <channel> = <yes|no>
***************
*** 88,109 ****
& @channel3
@channel/mute <channel> = <yes|no>
@channel/gag <channel> = <yes|no>
! Some channels broadcast messages when players connect or disconnect
! from the MUSH. If you're on such a channel and don't want to hear
! those messages, use @channel/mute <channel>=yes. To resume hearing
! the messages, use @channel/mute <channel>=no. You can also use
! @channel/unmute <channel>.
If you want to remain on a channel but not receive any messages
on the channel, use @channel/gag <channel>=yes. To resume hearing,
! use @channel/gag <channel>=no (or @channel/ungag <channel>). If you
! disconnect, the channel will be automatically ungagged for you. If the
! channel does not have the "open" priv, you can not speak on it while
! you are gagged.
!
! If you do not specify a channel with these commands, you mute or
! gag (or unmute or ungag) all channels at once.
See "help @channel4" for more.
& @channel4
--- 89,113 ----
& @channel3
@channel/mute <channel> = <yes|no>
@channel/gag <channel> = <yes|no>
+ @channel/recall <channel> [ = <lines> ]
! Some channels broadcast messages when players connect or disconnect from
! the MUSH. If you don't want to hear those messages, use @channel/mute
! <channel>=yes. To resume hearing the messages, use @channel/mute
! <channel>=no or @channel/unmute <channel>. Leave out <channel>
! to mute or unmute all channels.
If you want to remain on a channel but not receive any messages
on the channel, use @channel/gag <channel>=yes. To resume hearing,
! use @channel/gag <channel>=no (or @channel/ungag <channel>). When
! you disconnect, the channel will be automatically ungagged for you.
! Leave out <channel> to gag or ungag all channels. If the channel does
! not have the "open" priv, you can not speak on it while you are gagged.
!
! @channel/recall shows you the most recent messages on the channel;
! the number of messages depends on how the channel is configured, but
! can be limited by specifying <lines>. You must be on a channel to
! recall from it.
See "help @channel4" for more.
& @channel4
***************
*** 134,145 ****
--- 138,153 ----
@channel/priv <channel> = <new priv level>
@channel/quiet <channel> = <yes | no>
@channel/wipe <channel>
+ @channel/buffer <channel> = <lines>
@channel/decompile[/brief] <channel>
@channel/chown <channel> = <new owner>
The "priv" switch changes the channel's access privileges.
The "quiet" switch turns the quiet status of a channel on and off.
The "wipe" switch clears a channel of players without deleting it.
+ The "buffer" switch sets the maximum number of full-length lines that
+ the channel will buffer for @chan/recall. Many more shorter lines may
+ actually be buffered. Setting it to 0 turns off buffering.
The "decompile" and "chown" switches can only be used by Wizards.
@channel/decompile produces a decompile of matching channels. If the
***************
*** 149,174 ****
& channel-list
Here's the legend for reading the @channel/list output:
! Channel Name Num Users Num Msgs Access Locks Status
! Sample 1 0 [DPOWQHo jsmvh*] [On QH]
! ||||||| |||||| | ||
! Channel is DISABLED----------------------------/|||||| |||||| | ||
! Channel allows PLAYERS--------------------------/||||| |||||| | ||
! Channel allows OBJECTS---------------------------/|||| |||||| | ||
! Channel is Wizard-only (W) or Admin-only (A)------/||| |||||| | ||
! Channel is QUIET-----------------------------------/|| |||||| | ||
! Channel is HIDE_OK----------------------------------/| |||||| | ||
! Channel is OPEN (non-members can speak on it)--------/ |||||| | ||
! Channel has @clock/join set----------------------------|||||| | ||
! Channel has @clock/speak set----------------------------/|||| | ||
! Channel has @clock/mod set-------------------------------/||| | ||
! Channel has @clock/see set--------------------------------/|| | ||
! Channel has @clock/hide set--------------------------------/| | ||
! Player is the owner of the channel--------------------------/ | ||
! Player is currently on/off/gagging the channel------------------/ ||
! If on, player has the channel muted---------------------------------/|
! If on, player is hiding on the channel-------------------------------/
!
& @clock
@clock/join <channel> [= <key>]
@clock/speak <channel> [= <key>]
--- 157,182 ----
& channel-list
Here's the legend for reading the @channel/list output:
! Channel Name Num Users Num Msgs Access Locks Status Buf
! Sample 1 0 [DPOWQHo jsmvh*] [On QH] 4
! ||||||| |||||| | || |
! Channel is DISABLED----------------------------/|||||| |||||| | || |
! Channel allows PLAYERS--------------------------/||||| |||||| | || |
! Channel allows OBJECTS---------------------------/|||| |||||| | || |
! Channel is Wizard-only (W) or Admin-only (A)------/||| |||||| | || |
! Channel is QUIET-----------------------------------/|| |||||| | || |
! Channel is HIDE_OK----------------------------------/| |||||| | || |
! Channel is OPEN (non-members can speak on it)--------/ |||||| | || |
! Channel has @clock/join set----------------------------|||||| | || |
! Channel has @clock/speak set----------------------------/|||| | || |
! Channel has @clock/mod set-------------------------------/||| | || |
! Channel has @clock/see set--------------------------------/|| | || |
! Channel has @clock/hide set--------------------------------/| | || |
! Player is the owner of the channel--------------------------/ | || |
! Player is currently on/off/gagging the channel------------------/ || |
! If on, player has the channel muted---------------------------------/| |
! If on, player is hiding on the channel-------------------------------/ |
! Size of the channel buffer in full-length lines---------------------------/
& @clock
@clock/join <channel> [= <key>]
@clock/speak <channel> [= <key>]
*** 1_7_7.231/src/SWITCHES Tue, 14 Jan 2003 22:56:21 -0600 dunemush (pennmush/b/22_SWITCHES 1.12.1.3.1.2 600)
--- 1_7_7.308(w)/src/SWITCHES Sun, 16 Mar 2003 16:02:11 -0600 dunemush (pennmush/b/22_SWITCHES 1.12.1.3.1.4 600)
***************
*** 9,14 ****
--- 9,15 ----
BEFORE
BLIND
BRIEF
+ BUFFER
CHECK
CHOWN
CLEAR
***************
*** 88,93 ****
--- 89,95 ----
QUIET
READ
REBOOT
+ RECALL
REMOVE
RENAME
REGISTER
*** 1_7_7.231/src/wiz.c Thu, 06 Feb 2003 11:14:31 -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.2.3 660)
--- 1_7_7.308(w)/src/wiz.c Tue, 25 Mar 2003 16:22:38 -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.2.4 660)
***************
*** 470,476 ****
* player. */
/* now check to see if the absolute room is set NO_TEL */
! if (NoTel(absroom)
&& !controls(player, absroom)
&& !Tel_Anywhere(player)) {
notify(player, T("Teleports are not allowed in this room."));
--- 470,476 ----
* player. */
/* now check to see if the absolute room is set NO_TEL */
! if ((NoTel(absroom) || !eval_lock(player, absroom, Leave_Lock))
&& !controls(player, absroom)
&& !Tel_Anywhere(player)) {
notify(player, T("Teleports are not allowed in this room."));
*** 1_7_7.231/src/help.c Mon, 27 Jan 2003 09:40:07 -0600 dunemush (pennmush/f/32_help.c 1.4.1.2.1.1.1.3.2.2.1.1.2.1.1.2.1.2.1.2.1.3.1.9 660)
--- 1_7_7.308(w)/src/help.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/f/32_help.c 1.4.1.2.1.1.1.3.2.2.1.1.2.1.1.2.1.2.1.2.1.3.1.10 660)
***************
*** 1,3 ****
--- 1,10 ----
+ /**
+ * \file help.c
+ *
+ * \brief The PennMUSH help system.
+ *
+ *
+ */
#include "config.h"
#include <stdlib.h>
#include <string.h>
***************
*** 31,39 ****
static void help_build_index(help_file *h, int restricted);
typedef struct TLIST {
! char topic[TOPIC_NAME_LEN + 1];
! struct TLIST *next;
} tlist;
tlist *top = NULL;
--- 38,47 ----
static void help_build_index(help_file *h, int restricted);
+ /** Linked list of help topic names. */
typedef struct TLIST {
! char topic[TOPIC_NAME_LEN + 1]; /**< Name of topic */
! struct TLIST *next; /**< Pointer to next list entry */
} tlist;
tlist *top = NULL;
***************
*** 41,47 ****
unsigned num_topics = 0;
unsigned top_topics = 0;
! void write_topic(long int p);
#define TRUE 1
#define FALSE 0
--- 49,55 ----
unsigned num_topics = 0;
unsigned top_topics = 0;
! static void write_topic(long int p);
#define TRUE 1
#define FALSE 0
***************
*** 59,76 ****
do_new_spitfile(player, arg_left, h, h->admin);
}
void
! init_help_files()
{
hash_init(&help_files, 8, sizeof(help_file));
help_init = 1;
}
void
! add_help_file(command_name, filename, admin)
! const char *command_name;
! const char *filename;
! int admin;
{
help_file *h;
char newfilename[256] = "\0";
--- 67,92 ----
do_new_spitfile(player, arg_left, h, h->admin);
}
+ /** Initialize the helpfile hashtable, which contains the names of the
+ * help files.
+ */
void
! init_help_files(void)
{
hash_init(&help_files, 8, sizeof(help_file));
help_init = 1;
}
+ /** Add new help command. This function is
+ * the basis for the help_command directive in mush.cnf. It creates
+ * a new help entry for the hash table, builds a help index,
+ * and adds the new command to the command table.
+ * \param command_name name of help command to add.
+ * \param filename name of the help file to use for this command.
+ * \param admin if 1, this command reads admin topics, rather than standard.
+ */
void
! add_help_file(const char *command_name, const char *filename, int admin)
{
help_file *h;
char newfilename[256] = "\0";
***************
*** 113,121 ****
hashadd(h->command, h, &help_files);
}
void
! help_reindex(player)
! dbref player;
{
help_file *curr;
--- 129,142 ----
hashadd(h->command, h, &help_files);
}
+ /** Rebuild a help file index.
+ * \verbatim
+ * This command implements @readcache.
+ * \endverbatim
+ * \param player the enactor.
+ */
void
! help_reindex(dbref player)
{
help_file *curr;
***************
*** 136,146 ****
}
static void
! do_new_spitfile(player, arg1, help_dat, restricted)
! dbref player;
! char *arg1;
! help_file *help_dat;
! int restricted; /* 1 = admin help, 0 = regular help */
{
help_indx *entry = NULL;
FILE *fp;
--- 157,163 ----
}
static void
! do_new_spitfile(dbref player, char *arg1, help_file *help_dat, int restricted)
{
help_indx *entry = NULL;
FILE *fp;
***************
*** 265,273 ****
notify_format(player, T("%s output truncated."), help_dat->command);
}
! void
! write_topic(p)
! long int p;
{
tlist *cur, *nextptr;
help_indx *temp;
--- 282,289 ----
notify_format(player, T("%s output truncated."), help_dat->command);
}
! static void
! write_topic(long int p)
{
tlist *cur, *nextptr;
help_indx *temp;
***************
*** 303,311 ****
}
static void
! help_build_index(h, restricted)
! help_file *h;
! int restricted;
{
long bigpos, pos = 0;
int in_topic;
--- 319,325 ----
}
static void
! help_build_index(help_file *h, int restricted)
{
long bigpos, pos = 0;
int in_topic;
*** 1_7_7.231/src/htab.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/b/30_htab.c 1.8.1.6 660)
--- 1_7_7.308(w)/src/htab.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/b/30_htab.c 1.8.1.10 660)
***************
*** 1,8 ****
! /* htab.c - table hashing routines */
!
! /* This code is ripped out of TinyMUSH 2.2. */
! /* Minor tweaking to make in Penn-compatible by Trivian (xeno at mix.hive.no) */
!
#include "config.h"
#include "copyrite.h"
--- 1,12 ----
! /**
! * \file htab.c
! *
! * \brief Hashtable routines.
! * This code is largely ripped out of TinyMUSH 2.2.5, with tweaks
! * to make it Penn-compatible by Trivian.
! *
! *
! */
#include "config.h"
#include "copyrite.h"
***************
*** 15,20 ****
--- 19,26 ----
#include "mymalloc.h"
#include "confmagic.h"
+ static HASHENT *hash_new(HASHTAB *htab, const char *key);
+
/* ---------------------------------------------------------------------------
* hash_val: Compute hash value of a string for a hash table.
*/
***************
*** 42,50 ****
/* The whole new hash function */
int
! hash_val(k, mask)
! register const char *k; /* the key */
! int mask;
{
register u4 a, b, c; /* the internal state */
u4 len, length; /* how many key bytes still need mixing */
--- 48,54 ----
/* The whole new hash function */
int
! hash_val(register const char *k, int mask)
{
register u4 a, b, c; /* the internal state */
u4 len, length; /* how many key bytes still need mixing */
***************
*** 100,119 ****
#else /* NEW_HASH_FUN */
int
! hash_val(key, hashmask)
! const char *key;
! int hashmask;
{
int hash = 0;
const char *sp;
- /*
- * If the string pointer is null, return 0. If not, add up the
- * numeric value of all the characters and return the sum,
- * modulo the size of the hash table.
- */
-
if (!key || !*key)
return 0;
for (sp = key; *sp; sp++)
--- 104,123 ----
#else /* NEW_HASH_FUN */
+ /** Compute a hash value for mask-style hashing.
+ * Given a null key, return 0. Otherwise, add up the numeric value
+ * of all the characters and return the sum modulo the size of the
+ * hash table.
+ * \param key key to hash.
+ * \param hashmask hash table size to use as modulus.
+ * \return hash value.
+ */
int
! hash_val(const char *key, int hashmask)
{
int hash = 0;
const char *sp;
if (!key || !*key)
return 0;
for (sp = key; *sp; sp++)
***************
*** 126,154 ****
* hash_getmask: Get hash mask for mask-style hashing.
*/
int
! hash_getmask(size)
! int *size;
{
int tsize;
if (!size || !*size)
return 0;
- /* Get next power-of-two >= size, return power-1 as the mask
- * for ANDing
- */
-
for (tsize = 1; tsize < *size; tsize = tsize << 1) ;
*size = tsize;
return tsize - 1;
}
void
! hash_init(htab, size, data_size)
! HASHTAB *htab;
! int size;
! int data_size;
{
int i;
--- 130,160 ----
* hash_getmask: Get hash mask for mask-style hashing.
*/
+ /** Get the hash mask for mask-style hashing.
+ * Given the data size, return closest power-of-two less than that size.
+ * \param size data size.
+ * \return hash mask.
+ */
int
! hash_getmask(int *size)
{
int tsize;
if (!size || !*size)
return 0;
for (tsize = 1; tsize < *size; tsize = tsize << 1) ;
*size = tsize;
return tsize - 1;
}
+ /** Initialize a hashtable.
+ * \param htab pointer to hash table to initialize.
+ * \param size size of hashtable.
+ * \param data_size size of an individual datum to store in the table.
+ */
void
! hash_init(HASHTAB *htab, int size, int data_size)
{
int i;
***************
*** 162,171 ****
htab->entry_size = data_size;
}
HASHENT *
! hash_find(htab, key)
! HASHTAB *htab;
! const char *key;
{
int hval, cmp;
HASHENT *hptr;
--- 168,180 ----
htab->entry_size = data_size;
}
+ /** Return a hashtable entry given a key.
+ * \param htab pointer to hash table to search.
+ * \param key key to look up in the table.
+ * \return pointer to hash table entry for given key.
+ */
HASHENT *
! hash_find(HASHTAB *htab, const char *key)
{
int hval, cmp;
HASHENT *hptr;
***************
*** 184,192 ****
return NULL;
}
void *
! hash_value(entry)
! HASHENT *entry;
{
if (entry)
return entry->data;
--- 193,204 ----
return NULL;
}
+ /** Return the value stored in a hash entry.
+ * \param entry pointer to a hash table entry.
+ * \return generic pointer to the stored value.
+ */
void *
! hash_value(HASHENT *entry)
{
if (entry)
return entry->data;
***************
*** 194,202 ****
return NULL;
}
char *
! hash_key(entry)
! HASHENT *entry;
{
if (entry)
return entry->key;
--- 206,217 ----
return NULL;
}
+ /** Return the key stored in a hash entry.
+ * \param entry pointer to a hash table entry.
+ * \return pointer to the stored key.
+ */
char *
! hash_key(HASHENT *entry)
{
if (entry)
return entry->key;
***************
*** 204,213 ****
return NULL;
}
void
! hash_resize(htab, size)
! HASHTAB *htab;
! int size;
{
int i;
HASHENT **oldarr;
--- 219,230 ----
return NULL;
}
+ /** Resize a hash table.
+ * \param htab pointer to hashtable.
+ * \param size new size.
+ */
void
! hash_resize(HASHTAB *htab, int size)
{
int i;
HASHENT **oldarr;
***************
*** 261,267 ****
return;
}
! HASHENT *
hash_new(HASHTAB *htab, const char *key)
{
int hval;
--- 278,284 ----
return;
}
! static HASHENT *
hash_new(HASHTAB *htab, const char *key)
{
int hval;
***************
*** 308,319 ****
return hptr;
}
int
! hash_add(htab, key, hashdata, extra_size)
! HASHTAB *htab;
! const char *key;
! void *hashdata;
! int extra_size __attribute__ ((__unused__));
{
HASHENT *hptr;
--- 325,341 ----
return hptr;
}
+ /** Add an entry to a hash table.
+ * \param htab pointer to hash table.
+ * \param key key string to store data under.
+ * \param hashdata void pointer to data to be stored.
+ * \param extra_size unused.
+ * \retval -1 failure.
+ * \retval 0 success.
+ */
int
! hash_add(HASHTAB *htab, const char *key, void *hashdata,
! int extra_size __attribute__ ((__unused__)))
{
HASHENT *hptr;
***************
*** 331,340 ****
return 0;
}
void
! hash_delete(htab, entry)
! HASHTAB *htab;
! HASHENT *entry;
{
int hval;
HASHENT *hptr, *last;
--- 353,364 ----
return 0;
}
+ /** Delete an entry in a hash table.
+ * \param htab pointer to hash table.
+ * \param entry pointer to hash entry to delete (and free).
+ */
void
! hash_delete(HASHTAB *htab, HASHENT *entry)
{
int hval;
HASHENT *hptr, *last;
***************
*** 360,369 ****
hash_resize(htab, htab->hashsize >> 1);
}
void
! hash_flush(htab, size)
! HASHTAB *htab;
! int size;
{
HASHENT *hent, *thent;
int i;
--- 384,395 ----
hash_resize(htab, htab->hashsize >> 1);
}
+ /** Flush a hash table, freeing all entries.
+ * \param htab pointer to a hash table.
+ * \param size size of hash table.
+ */
void
! hash_flush(HASHTAB *htab, int size)
{
HASHENT *hent, *thent;
int i;
***************
*** 391,399 ****
}
}
void *
! hash_firstentry(htab)
! HASHTAB *htab;
{
int hval;
--- 417,430 ----
}
}
+ /** Return the first entry of a hash table.
+ * This function is used with hash_nextentry() to iterate through a
+ * hash table.
+ * \param htab pointer to hash table.
+ * \return first hash table entry.
+ */
void *
! hash_firstentry(HASHTAB *htab)
{
int hval;
***************
*** 406,414 ****
return NULL;
}
void *
! hash_nextentry(htab)
! HASHTAB *htab;
{
int hval;
HASHENT *hptr;
--- 437,451 ----
return NULL;
}
+ /** Return the next entry of a hash table.
+ * This function is used with hash_firstentry() to iterate through a
+ * hash table. hash_firstentry() must be called before calling
+ * this function.
+ * \param htab pointer to hash table.
+ * \return next hash table entry.
+ */
void *
! hash_nextentry(HASHTAB *htab)
{
int hval;
HASHENT *hptr;
***************
*** 431,451 ****
return NULL;
}
void
! hash_stats_header(player)
! dbref player;
{
notify_format(player,
"Table Buckets Entries LChain ECh 1Ch 2Ch 3Ch 4+Ch AvgCh ~Memory");
}
void
! hash_stats(player, htab, hname)
! dbref player;
! HASHTAB *htab;
! const char *hname;
{
- /* Report some statistics on the hash table */
int longest = 0, n;
int lengths[5];
double chainlens = 0.0;
--- 468,491 ----
return NULL;
}
+ /** Display a header for a stats listing.
+ * \param player player to notify with header.
+ */
void
! hash_stats_header(dbref player)
{
notify_format(player,
"Table Buckets Entries LChain ECh 1Ch 2Ch 3Ch 4+Ch AvgCh ~Memory");
}
+ /** Display stats on a hashtable.
+ * \param player player to notify with stats.
+ * \param htab pointer to the hash table.
+ * \param hname name of the hash table.
+ */
void
! hash_stats(dbref player, HASHTAB *htab, const char *hname)
{
int longest = 0, n;
int lengths[5];
double chainlens = 0.0;
*** 1_7_7.231/src/switchinc.c Thu, 09 Jan 2003 21:37:52 -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.4.1.2 660)
--- 1_7_7.308(w)/src/switchinc.c Tue, 25 Mar 2003 16:22:38 -0600 dunemush (pennmush/b/32_switchinc. 1.3.1.2.1.6.1.18.1.2.1.2.2.5.1.4.2.4.1.1.1.2.1.5.1.2.1.5.2.1.1.31.3.4.1.5.1.4 660)
***************
*** 11,16 ****
--- 11,17 ----
{"BEFORE", SWITCH_BEFORE},
{"BLIND", SWITCH_BLIND},
{"BRIEF", SWITCH_BRIEF},
+ {"BUFFER", SWITCH_BUFFER},
{"CHECK", SWITCH_CHECK},
{"CHOWN", SWITCH_CHOWN},
{"CLEAR", SWITCH_CLEAR},
***************
*** 82,88 ****
{"PARANOID", SWITCH_PARANOID},
{"PLAYERS", SWITCH_PLAYERS},
{"PORT", SWITCH_PORT},
- {"POSE", SWITCH_POSE},
{"PRESERVE", SWITCH_PRESERVE},
{"PRINT", SWITCH_PRINT},
{"PRIVS", SWITCH_PRIVS},
--- 83,88 ----
***************
*** 91,96 ****
--- 91,97 ----
{"QUIET", SWITCH_QUIET},
{"READ", SWITCH_READ},
{"REBOOT", SWITCH_REBOOT},
+ {"RECALL", SWITCH_RECALL},
{"REGISTER", SWITCH_REGISTER},
{"REMOVE", SWITCH_REMOVE},
{"RENAME", SWITCH_RENAME},
***************
*** 99,105 ****
{"RETROACTIVE", SWITCH_RETROACTIVE},
{"ROOM", SWITCH_ROOM},
{"ROOMS", SWITCH_ROOMS},
- {"ROYALTY", SWITCH_ROYALTY},
{"SEE", SWITCH_SEE},
{"SEEFLAG", SWITCH_SEEFLAG},
{"SELF", SWITCH_SELF},
--- 100,105 ----
*** 1_7_7.231/src/speech.c Mon, 03 Feb 2003 11:05:37 -0600 dunemush (pennmush/b/35_speech.c 1.21.1.2.1.3.1.5.1.1.1.7.1.3.1.1.1.8.1.1.1.1.1.1.1.10.1.2.1.13.2.4.1.1.2.3 660)
--- 1_7_7.308(w)/src/speech.c Tue, 25 Mar 2003 16:22:38 -0600 dunemush (pennmush/b/35_speech.c 1.21.1.2.1.3.1.5.1.1.1.7.1.3.1.1.1.8.1.1.1.1.1.1.1.10.1.2.1.13.2.4.1.1.3.2 660)
***************
*** 847,853 ****
/* Figure out the 'name' of the player */
if (PAGE_ALIASES && (a = atr_get_noparent(player, "ALIAS")))
! current = tprintf("%s(%s)", Name(player), uncompress(a->value));
else
current = (char *) Name(player);
--- 847,853 ----
/* Figure out the 'name' of the player */
if (PAGE_ALIASES && (a = atr_get_noparent(player, "ALIAS")))
! current = tprintf("%s (%s)", Name(player), uncompress(a->value));
else
current = (char *) Name(player);
*** 1_7_7.231/src/set.c Tue, 14 Jan 2003 22:56:21 -0600 dunemush (pennmush/b/38_set.c 1.26.1.5.1.1.2.1.1.1.1.1.1.11.1.1.1.3 660)
--- 1_7_7.308(w)/src/set.c Tue, 25 Mar 2003 16:22:38 -0600 dunemush (pennmush/b/38_set.c 1.26.1.5.1.1.2.1.1.1.1.1.1.11.1.1.1.5 660)
***************
*** 110,126 ****
password++;
}
}
! /* check for null password */
! if (!God(player) && !*password) {
! notify(player,
! T("You must specify a password to change a player name."));
! notify(player, T("E.g.: @name player = newname password"));
! return;
! } else if (!God(player) && !password_check(thing, password)) {
! notify(player, T("Incorrect password."));
! return;
! } else if (strcasecmp(newname, Name(thing))
! && !ok_player_name(newname)) {
/* strcasecmp allows changing foo to Foo, etc. */
notify(player, T("You can't give a player that name."));
return;
--- 110,117 ----
password++;
}
}
! if (strcasecmp(newname, Name(thing))
! && !ok_player_name(newname)) {
/* strcasecmp allows changing foo to Foo, etc. */
notify(player, T("You can't give a player that name."));
return;
*** 1_7_7.231/src/player.c Sun, 16 Feb 2003 22:20:24 -0600 dunemush (pennmush/b/47_player.c 1.15.1.1.1.1.1.4.1.6.1.8 660)
--- 1_7_7.308(w)/src/player.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/b/47_player.c 1.15.1.1.1.1.1.4.1.6.1.9 660)
***************
*** 366,372 ****
Home(player) = PLAYER_START;
Owner(player) = player;
Parent(player) = NOTHING;
! db[player].type = TYPE_PLAYER;
flags = string_to_bits(options.player_flags);
copy_flag_bitmask(Flags(player), flags);
destroy_flag_bitmask(flags);
--- 366,372 ----
Home(player) = PLAYER_START;
Owner(player) = player;
Parent(player) = NOTHING;
! Type(player) = TYPE_PLAYER;
flags = string_to_bits(options.player_flags);
copy_flag_bitmask(Flags(player), flags);
destroy_flag_bitmask(flags);
*** 1_7_7.231/src/parse.c Sun, 22 Dec 2002 18:01:26 -0600 dunemush (pennmush/b/48_parse.c 1.23.1.10.1.2.1.1.1.1.1.2.1.2.1.9 660)
--- 1_7_7.308(w)/src/parse.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/b/48_parse.c 1.23.1.10.1.2.1.1.1.1.1.2.1.2.1.10 660)
***************
*** 547,552 ****
--- 547,555 ----
safe_str("0 0", buff, bp);
}
break;
+ case '~': /* enactor accented name */
+ safe_str(accented_name(enactor), buff, bp);
+ break;
case '0':
case '1':
case '2':
*** 1_7_7.231/src/mymalloc.c Wed, 24 Jan 2001 16:56:43 -0600 dunemush (pennmush/b/49_mymalloc.c 1.2 660)
--- 1_7_7.308(w)/src/mymalloc.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/b/49_mymalloc.c 1.3 660)
***************
*** 1,4 ****
! /* A wrapper for the various malloc package options. See options.h
* for descriptions of each.
* Each package's source code must include config.h, mymalloc.h,
* and confmagic.h.
--- 1,9 ----
! /**
! * \file mymalloc.c
! *
! * \brief Malloc wrapper file.
! *
! * A wrapper for the various malloc package options. See options.h
* for descriptions of each.
* Each package's source code must include config.h, mymalloc.h,
* and confmagic.h.
*** 1_7_7.231/src/mycrypt.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/b/50_mycrypt.c 1.9 660)
--- 1_7_7.308(w)/src/mycrypt.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/b/50_mycrypt.c 1.10 660)
***************
*** 1,5 ****
! /* This file defines the function mush_crypt(key) used for password
! * encryption, depending on the system.
*/
#include "config.h"
--- 1,11 ----
! /**
! * \file mycrypt.c
! *
! * \brief Password encryption for PennMUSH
! *
! * This file defines the function mush_crypt(key) used for password
! * encryption, depending on the system. Actually, we pretty much
! * expect to use SHS.
*/
#include "config.h"
***************
*** 12,17 ****
--- 18,28 ----
#include "confmagic.h"
char *mush_crypt(const char *key);
+
+ /** Encrypt a password and return ciphertext.
+ * \param key plaintext to encrypt.
+ * \return encrypted password.
+ */
char *
mush_crypt(const char *key)
{
*** 1_7_7.231/src/move.c Wed, 12 Feb 2003 17:02:38 -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.12 660)
--- 1_7_7.308(w)/src/move.c Tue, 25 Mar 2003 16:22:37 -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.14 660)
***************
*** 1,4 ****
! /* move.c */
#include "copyrite.h"
#include "config.h"
--- 1,10 ----
! /**
! * \file move.c
! *
! * \brief Movement commands for PennMUSH.
! *
! *
! */
#include "copyrite.h"
#include "config.h"
***************
*** 38,57 ****
static int is_following(dbref follower, dbref leader);
static void follower_command(dbref leader, dbref loc, const char *com);
void
! moveto(what, where)
! dbref what;
! dbref where;
{
enter_room(what, where, 0);
}
void
! moveit(what, where, nomovemsgs)
! dbref what;
! dbref where;
! int nomovemsgs;
{
dbref loc, old;
dbref absloc, absold;
--- 44,67 ----
static int is_following(dbref follower, dbref leader);
static void follower_command(dbref leader, dbref loc, const char *com);
+ /** A convenience wrapper for enter_room().
+ * \param what object to move.
+ * \param where location to move it to.
+ */
void
! moveto(dbref what, dbref where)
{
enter_room(what, where, 0);
}
+ /** Send an object somewhere.
+ * \param what object to move.
+ * \param where location to move it to.
+ * \param nomovemsgs if 1, don't show movement messages.
+ */
void
! moveit(dbref what, dbref where, int nomovemsgs)
{
dbref loc, old;
dbref absloc, absold;
***************
*** 126,134 ****
#define Dropper(thing) (Hearer(thing) && Connected(Owner(thing)))
static void
! send_contents(loc, dest)
! dbref loc;
! dbref dest;
{
dbref first;
dbref rest;
--- 136,142 ----
#define Dropper(thing) (Hearer(thing) && Connected(Owner(thing)))
static void
! send_contents(dbref loc, dbref dest)
{
dbref first;
dbref rest;
***************
*** 154,162 ****
}
static void
! maybe_dropto(loc, dropto)
! dbref loc;
! dbref dropto;
{
dbref thing;
if (loc == dropto)
--- 162,168 ----
}
static void
! maybe_dropto(dbref loc, dbref dropto)
{
dbref thing;
if (loc == dropto)
***************
*** 173,183 ****
send_contents(loc, dropto);
}
void
! enter_room(player, loc, nomovemsgs)
! dbref player;
! dbref loc;
! int nomovemsgs;
{
dbref old;
dbref dropto;
--- 179,191 ----
send_contents(loc, dropto);
}
+ /** Enter a container.
+ * \param player object entering the container.
+ * \param loc container to enter.
+ * \param nomovemsgs if 1, don't give movement messages.
+ */
void
! enter_room(dbref player, dbref loc, int nomovemsgs)
{
dbref old;
dbref dropto;
***************
*** 237,248 ****
}
! /* teleports player to location while removing items they shouldnt take */
void
! safe_tel(player, dest, nomovemsgs)
! dbref player;
! dbref dest;
! int nomovemsgs;
{
dbref first;
dbref rest;
--- 245,257 ----
}
! /** Teleport player to location while removing items they shouldn't take.
! * \param player player to teleport.
! * \param dest location to teleport player to.
! * \param nomovemsgs if 1, don't show movement messages
! */
void
! safe_tel(dbref player, dbref dest, int nomovemsgs)
{
dbref first;
dbref rest;
***************
*** 280,293 ****
enter_room(player, dest, nomovemsgs);
}
! /* This checks to see if there's a go-able direction. It doesn't
* check whether the GOTO command is restricted. That should be
* done by the command parser.
*/
int
! can_move(player, direction)
! dbref player;
! const char *direction;
{
if (!strcasecmp(direction, "home") && !Fixed(player))
return 1;
--- 289,303 ----
enter_room(player, dest, nomovemsgs);
}
! /** Can a player go in a given direction?
! * This checks to see if there's a go-able direction. It doesn't
* check whether the GOTO command is restricted. That should be
* done by the command parser.
+ * \param player dbref of mover.
+ * \param direction name of direction to move.
*/
int
! can_move(dbref player, const char *direction)
{
if (!strcasecmp(direction, "home") && !Fixed(player))
return 1;
***************
*** 298,306 ****
}
static dbref
! find_var_dest(player, exit_obj)
! dbref player;
! dbref exit_obj;
{
/* This is used to evaluate the u-function DESTINATION on an exit with
* a VARIABLE (ambiguous) link.
--- 308,314 ----
}
static dbref
! find_var_dest(dbref player, dbref exit_obj)
{
/* This is used to evaluate the u-function DESTINATION on an exit with
* a VARIABLE (ambiguous) link.
***************
*** 336,341 ****
--- 344,354 ----
}
+ /** The move command.
+ * \param player the enactor.
+ * \param direction name of direction to move.
+ * \param type type of motion to check (global, zone, neither).
+ */
void
do_move(dbref player, const char *direction, enum move_type type)
{
***************
*** 384,389 ****
--- 397,407 ----
default:
/* we got one */
/* check to see if we're allowed to pass */
+ if (!eval_lock(player, Location(player), Leave_Lock)) {
+ notify(player, T("You can't go that way."));
+ return;
+ }
+
if (could_doit(player, exit_m)) {
switch (Location(exit_m)) {
case HOME:
***************
*** 452,461 ****
}
}
void
! do_firstexit(player, what)
! dbref player;
! const char *what;
{
dbref thing;
dbref loc;
--- 470,484 ----
}
}
+ /** Move an exit to the first position in the room's exit list.
+ * \verbatim
+ * This implements @firstexit.
+ * \endverbatim
+ * \param player the enactor.
+ * \param what name of exit to promote.
+ */
void
! do_firstexit(dbref player, const char *what)
{
dbref thing;
dbref loc;
***************
*** 475,484 ****
}
void
! do_get(player, what)
! dbref player;
! const char *what;
{
dbref loc = Location(player);
dbref thing;
--- 498,509 ----
}
+ /** The get command.
+ * \param player the enactor.
+ * \param what name of object to get.
+ */
void
! do_get(dbref player, const char *what)
{
dbref loc = Location(player);
dbref thing;
***************
*** 595,604 ****
}
void
! do_drop(player, name)
! dbref player;
! const char *name;
{
dbref loc;
dbref thing;
--- 620,631 ----
}
+ /** Drop an object.
+ * \param player the enactor.
+ * \param name name of object to drop.
+ */
void
! do_drop(dbref player, const char *name)
{
dbref loc;
dbref thing;
***************
*** 653,662 ****
}
void
! do_enter(player, what)
! dbref player;
! const char *what;
{
dbref thing;
dbref loc;
--- 680,691 ----
}
+ /** The enter command.
+ * \param player the enactor.
+ * \param what name of object to enter.
+ */
void
! do_enter(dbref player, const char *what)
{
dbref thing;
dbref loc;
***************
*** 699,707 ****
}
}
void
! do_leave(player)
! dbref player;
{
dbref loc;
loc = Location(player);
--- 728,738 ----
}
}
+ /** The leave command.
+ * \param player the enactor.
+ */
void
! do_leave(dbref player)
{
dbref loc;
loc = Location(player);
***************
*** 718,750 ****
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
! move_wrapper(player, command)
! dbref player;
! const char *command;
{
- /* check local exit, then zone exit, then global. If nothing is
- * matched, treat it as local so player will get an error message.
- */
-
if (!Mobile(player))
return;
if (!strcasecmp(command, "home") && Fixed(player)) {
--- 749,789 ----
follower_command(player, loc, "leave");
}
+ /** Is direction a global exit?
+ * \param player looker.
+ * \param direction name of exit.
+ * \retval 1 direction is a global exit.
+ * \retval 0 direction is not a global exit.
+ */
int
! global_exit(dbref player, const char *direction)
{
return (GoodObject
(match_result(player, direction, TYPE_EXIT, MAT_GLOBAL | MAT_EXIT)));
}
+ /** Is direction a remote exit?
+ * \param player looker.
+ * \param direction name of exit.
+ * \retval 1 direction is a remote exit.
+ * \retval 0 direction is not a remote exit.
+ */
int
! remote_exit(dbref player, const char *direction)
{
return (GoodObject
(match_result(player, direction, TYPE_EXIT, MAT_REMOTES | MAT_EXIT)));
}
+ /** Wrapper for exit movement.
+ * We check local exit, then zone exit, then global. If nothing is
+ * matched, treat it as local so player will get an error message.
+ * \param player the mover.
+ * \param command direction to move.
+ */
void
! move_wrapper(dbref player, const char *command)
{
if (!Mobile(player))
return;
if (!strcasecmp(command, "home") && Fixed(player)) {
***************
*** 764,776 ****
/* Routines for dealing with the follow commands */
! /* follow <arg> tries to start following
* follow alone lists who you're following
*/
void
! do_follow(player, arg)
! dbref player;
! const char *arg;
{
dbref leader;
if (arg && *arg) {
--- 803,816 ----
/* Routines for dealing with the follow commands */
! /** The follow command.
! * follow <arg> tries to start following
* follow alone lists who you're following
+ * \param the enactor.
+ * \param arg name of object to follow.
*/
void
! do_follow(dbref player, const char *arg)
{
dbref leader;
if (arg && *arg) {
***************
*** 816,828 ****
}
}
! /* unfollow <arg> removes someone from your following list
! * unfollow alone removes everyone from your following list. (1.7.4p3)
*/
void
! do_unfollow(player, arg)
! dbref player;
! const char *arg;
{
dbref leader;
if (arg && *arg) {
--- 856,869 ----
}
}
! /** The unfollow command.
! * unfollow <arg> removes someone from your following list
! * unfollow alone removes everyone from your following list.
! * \param player the enactor.
! * \parma arg object to stop following.
*/
void
! do_unfollow(dbref player, const char *arg)
{
dbref leader;
if (arg && *arg) {
***************
*** 851,863 ****
}
! /* dismiss <arg> removes someone from your followers list
* dismiss alone removes everyone from your followers list.
*/
void
! do_dismiss(player, arg)
! dbref player;
! const char *arg;
{
dbref follower;
if (arg && *arg) {
--- 892,905 ----
}
! /** The dismiss command.
! * dismiss <arg> removes someone from your followers list
* dismiss alone removes everyone from your followers list.
+ * \param player the enactor.
+ * \param arg name of object to dismiss.
*/
void
! do_dismiss(dbref player, const char *arg)
{
dbref follower;
if (arg && *arg) {
***************
*** 881,893 ****
}
}
! /* desert <arg> removes someone from your followers and following list
* desert alone removes everyone from both lists
*/
void
! do_desert(player, arg)
! dbref player;
! const char *arg;
{
dbref who;
if (arg && *arg) {
--- 923,936 ----
}
}
! /** The desert command.
! * desert <arg> removes someone from your followers and following list
* desert alone removes everyone from both lists
+ * \param player the enactor.
+ * \param arg name of object to desert.
*/
void
! do_desert(dbref player, const char *arg)
{
dbref who;
if (arg && *arg) {
***************
*** 917,925 ****
/* Add someone to a player's FOLLOWERS attribute */
static void
! add_follower(leader, follower)
! dbref leader;
! dbref follower;
{
ATTR *a;
char tbuf1[BUFFER_LEN];
--- 960,966 ----
/* Add someone to a player's FOLLOWERS attribute */
static void
! add_follower(dbref leader, dbref follower)
{
ATTR *a;
char tbuf1[BUFFER_LEN];
***************
*** 939,947 ****
/* Add someone to a player's FOLLOWING attribute */
static void
! add_following(follower, leader)
! dbref follower;
! dbref leader;
{
ATTR *a;
char tbuf1[BUFFER_LEN];
--- 980,986 ----
/* Add someone to a player's FOLLOWING attribute */
static void
! add_following(dbref follower, dbref leader)
{
ATTR *a;
char tbuf1[BUFFER_LEN];
***************
*** 960,969 ****
}
static void
! add_follow(leader, follower, noisy)
! dbref leader;
! dbref follower;
! int noisy;
{
char msg[BUFFER_LEN];
add_follower(leader, follower);
--- 999,1005 ----
}
static void
! add_follow(dbref leader, dbref follower, int noisy)
{
char msg[BUFFER_LEN];
add_follower(leader, follower);
***************
*** 979,987 ****
/* Delete someone from a player's FOLLOWERS attribute */
static void
! del_follower(leader, follower)
! dbref leader;
! dbref follower;
{
ATTR *a;
char tbuf1[BUFFER_LEN];
--- 1015,1021 ----
/* Delete someone from a player's FOLLOWERS attribute */
static void
! del_follower(dbref leader, dbref follower)
{
ATTR *a;
char tbuf1[BUFFER_LEN];
***************
*** 998,1006 ****
/* Delete someone from a player's FOLLOWING attribute */
static void
! del_following(follower, leader)
! dbref follower;
! dbref leader;
{
ATTR *a;
char tbuf1[BUFFER_LEN];
--- 1032,1038 ----
/* Delete someone from a player's FOLLOWING attribute */
static void
! del_following(dbref follower, dbref leader)
{
ATTR *a;
char tbuf1[BUFFER_LEN];
***************
*** 1016,1025 ****
}
static void
! del_follow(leader, follower, noisy)
! dbref leader;
! dbref follower;
! int noisy;
{
char msg[BUFFER_LEN];
del_follower(leader, follower);
--- 1048,1054 ----
}
static void
! del_follow(dbref leader, dbref follower, int noisy)
{
char msg[BUFFER_LEN];
del_follower(leader, follower);
***************
*** 1034,1041 ****
/* Return a list of names of players who are my followers, comma-separated */
static char *
! list_followers(player)
! dbref player;
{
ATTR *a;
char tbuf1[BUFFER_LEN];
--- 1063,1069 ----
/* Return a list of names of players who are my followers, comma-separated */
static char *
! list_followers(dbref player)
{
ATTR *a;
char tbuf1[BUFFER_LEN];
***************
*** 1066,1073 ****
/* Return a list of names of players who I'm following, comma-separated */
static char *
! list_following(player)
! dbref player;
{
ATTR *a;
char tbuf1[BUFFER_LEN];
--- 1094,1100 ----
/* Return a list of names of players who I'm following, comma-separated */
static char *
! list_following(dbref player)
{
ATTR *a;
char tbuf1[BUFFER_LEN];
***************
*** 1098,1106 ****
/* Is follower following leader? */
static int
! is_following(follower, leader)
! dbref follower;
! dbref leader;
{
ATTR *a;
char *s, *sp;
--- 1125,1131 ----
/* Is follower following leader? */
static int
! is_following(dbref follower, dbref leader)
{
ATTR *a;
char *s, *sp;
***************
*** 1121,1130 ****
return 0;
}
void
! clear_followers(leader, noisy)
! dbref leader;
! int noisy;
{
ATTR *a;
char *s, *sp;
--- 1146,1157 ----
return 0;
}
+ /** Clear a player's followers list.
+ * \param leader dbref of player whose list is to be cleared.
+ * \param noisy if 1, notify the player.
+ */
void
! clear_followers(dbref leader, int noisy)
{
ATTR *a;
char *s, *sp;
***************
*** 1147,1156 ****
(void) atr_clr(leader, "FOLLOWERS", GOD);
}
void
! clear_following(follower, noisy)
! dbref follower;
! int noisy;
{
ATTR *a;
char *s, *sp;
--- 1174,1185 ----
(void) atr_clr(leader, "FOLLOWERS", GOD);
}
+ /** Clear a player's following list.
+ * \param follower dbref of player whose list is to be cleared.
+ * \param noisy if 1, notify the player.
+ */
void
! clear_following(dbref follower, int noisy)
{
ATTR *a;
char *s, *sp;
*** 1_7_7.231/src/memcheck.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/c/1_memcheck.c 1.8.1.4 660)
--- 1_7_7.308(w)/src/memcheck.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/c/1_memcheck.c 1.8.1.5 660)
***************
*** 1,3 ****
--- 1,13 ----
+ /**
+ * \file memcheck.c
+ *
+ * \brief A simple memory allocation tracker for PennMUSH.
+ *
+ * This code isn't usually compiled in, but it's handy to debug
+ * memory leaks sometimes.
+ *
+ *
+ */
#include "config.h"
#include "conf.h"
#include "copyrite.h"
***************
*** 16,25 ****
typedef struct mem_check MEM;
struct mem_check {
! int ref_count;
! MEM *next;
! char ref_name[BUFFER_LEN];
};
static MEM *my_check = NULL;
--- 26,36 ----
typedef struct mem_check MEM;
+ /** A linked list for storing memory allocation counts */
struct mem_check {
! int ref_count; /**< Number of allocations of this type. */
! MEM *next; /**< Pointer to next in linked list. */
! char ref_name[BUFFER_LEN]; /**< Name of this allocation type. */
};
static MEM *my_check = NULL;
***************
*** 28,36 ****
*** AN INFINITE LOOP. DANGER, WILL ROBINSON!
***/
void
! add_check(ref)
! const char *ref;
{
MEM *loop, *newcheck, *prev = NULL;
size_t reflen;
--- 39,49 ----
*** AN INFINITE LOOP. DANGER, WILL ROBINSON!
***/
+ /** Add an allocation check.
+ * \param ref type of allocation.
+ */
void
! add_check(const char *ref)
{
MEM *loop, *newcheck, *prev = NULL;
size_t reflen;
***************
*** 57,65 ****
return;
}
void
! del_check(ref)
! const char *ref;
{
MEM *loop, *prev = NULL;
int cmp;
--- 70,80 ----
return;
}
+ /** Remove an allocation check.
+ * \param ref type of allocation to remove.
+ */
void
! del_check(const char *ref)
{
MEM *loop, *prev = NULL;
int cmp;
***************
*** 85,95 ****
ref);
}
void
! list_mem_check(player)
! dbref player;
{
-
MEM *loop;
for (loop = my_check; loop; loop = loop->next) {
--- 100,111 ----
ref);
}
+ /** List allocations.
+ * \param player the enactor.
+ */
void
! list_mem_check(dbref player)
{
MEM *loop;
for (loop = my_check; loop; loop = loop->next) {
***************
*** 97,106 ****
}
}
void
! log_mem_check()
{
-
MEM *loop;
for (loop = my_check; loop; loop = loop->next) {
--- 113,123 ----
}
}
+ /** Log all allocations.
+ */
void
! log_mem_check(void)
{
MEM *loop;
for (loop = my_check; loop; loop = loop->next) {
*** 1_7_7.231/src/match.c Wed, 12 Feb 2003 17:02:38 -0600 dunemush (pennmush/c/2_match.c 1.24.1.1.1.4.1.1.1.1.1.1.1.1.1.1.1.16 660)
--- 1_7_7.308(w)/src/match.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/c/2_match.c 1.24.1.1.1.4.1.1.1.1.1.1.1.1.1.1.1.18 660)
***************
*** 1,7 ****
! /* match.c */
! /* Routines for parsing arguments */
!
! /***********************************************************************
* These are the PennMUSH name-matching routines, fully re-entrant.
* match_result(who,name,type,flags) - return match, AMBIGUOUS, or NOTHING
* noisy_match_result(who,name,type,flags) - return match or NOTHING,
--- 1,8 ----
! /**
! * \file match.c
! *
! * \brief Matching of object names.
! *
* These are the PennMUSH name-matching routines, fully re-entrant.
* match_result(who,name,type,flags) - return match, AMBIGUOUS, or NOTHING
* noisy_match_result(who,name,type,flags) - return match or NOTHING,
***************
*** 67,73 ****
extern int check_alias(const char *command, const char *list); /* game.c */
! /* A wrapper for returning a match, AMBIGUOUS, or NOTHING
*/
dbref
match_result(const dbref who, const char *name, const int type,
--- 68,81 ----
extern int check_alias(const char *command, const char *list); /* game.c */
! /** A wrapper for returning a match, AMBIGUOUS, or NOTHING.
! * This function attempts to match a name for who, and
! * can return the matched dbref, AMBIGUOUS, or NOTHING.
! * \param who the looker.
! * \param name name to try to match.
! * \param type type of object to match.
! * \param flags match flags.
! * \return dbref of matched object, or AMBIGUOUS, or NOTHING.
*/
dbref
match_result(const dbref who, const char *name, const int type,
***************
*** 76,84 ****
return match_result_internal(who, name, type, flags);
}
! /* A wrapper for returning a match or NOTHING
! * Ambiguous matches return NOTHING
! * It will also notify the player of non-matches or ambiguous matches
*/
dbref
noisy_match_result(const dbref who, const char *name, const int type,
--- 84,99 ----
return match_result_internal(who, name, type, flags);
}
! /** A noisy wrapper for returning a match or NOTHING.
! * This function attempts to match a name for who, and
! * can return the matched dbref or NOTHING (in ambiguous cases,
! * NOTHING is returned). If no match is made, the looker is notified
! * of the failure to match or ambiguity.
! * \param who the looker.
! * \param name name to try to match.
! * \param type type of object to match.
! * \param flags match flags.
! * \return dbref of matched object, or NOTHING.
*/
dbref
noisy_match_result(const dbref who, const char *name, const int type,
***************
*** 87,94 ****
return match_result_internal(who, name, type, flags | MAT_NOISY);
}
! /* A wrapper for returning a match or NOTHING
! * Ambiguous matches return the last matched thing
*/
dbref
last_match_result(const dbref who, const char *name, const int type,
--- 102,116 ----
return match_result_internal(who, name, type, flags | MAT_NOISY);
}
! /** A noisy wrapper for returning a match or NOTHING.
! * This function attempts to match a name for who, and
! * can return the matched dbref or NOTHING. In ambiguous cases,
! * the last matched thing is returned.
! * \param who the looker.
! * \param name name to try to match.
! * \param type type of object to match.
! * \param flags match flags.
! * \return dbref of matched object, or NOTHING.
*/
dbref
last_match_result(const dbref who, const char *name, const int type,
***************
*** 97,103 ****
return match_result_internal(who, name, type, flags | MAT_LAST);
}
! /* Wrapper for a noisy match with control checks */
dbref
match_controlled(dbref player, const char *name)
{
--- 119,133 ----
return match_result_internal(who, name, type, flags | MAT_LAST);
}
! /** Wrapper for a noisy match with control checks.
! * This function performs a noisy_match_result() and then checks that
! * the looker controls the matched object before returning it.
! * If the control check fails, the looker is notified and NOTHING
! * is returned.
! * \param player the looker.
! * \param name name to try to match.
! * \return dbref of matched controlled object, or NOTHING.
! */
dbref
match_controlled(dbref player, const char *name)
{
*** 1_7_7.231/src/malias.c Sun, 08 Dec 2002 22:10:45 -0600 dunemush (pennmush/c/3_malias.c 1.36.1.2 660)
--- 1_7_7.308(w)/src/malias.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/c/3_malias.c 1.36.1.5 660)
***************
*** 1,5 ****
! /*-------------------------------------------------------------------*
! * malias.c - Global @mail aliases/lists
*
* This code implements an extension to extended @mail which allows
* admin (and others who are so em at powered) to create mail aliases
--- 1,9 ----
! /**
! * \file malias.c
! *
! * \brief Global mail aliases/lists
! *
! * \verbatim
*
* This code implements an extension to extended @mail which allows
* admin (and others who are so em at powered) to create mail aliases
***************
*** 25,31 ****
* @malias/stat
* @malias/chown !name=owner (Admin only)
* @malias/nuke (Admin only)
! *-------------------------------------------------------------------*/
#define MA_INC 3
#include "config.h"
--- 29,37 ----
* @malias/stat
* @malias/chown !name=owner (Admin only)
* @malias/nuke (Admin only)
! *
! * \endverbatim
! */
#define MA_INC 3
#include "config.h"
***************
*** 66,71 ****
--- 72,78 ----
int ma_top = 0;
struct mail_alias *malias;
+ /** Privilege table for maliases. */
static PRIV malias_priv_table[] = {
{"Admin", 'A', ALIAS_ADMIN, ALIAS_ADMIN},
{"Members", 'M', ALIAS_MEMBERS, ALIAS_MEMBERS},
***************
*** 73,79 ****
{NULL, '\0', 0, 0}
};
- static const char *get_privs(int flags);
static const char *get_shortprivs(struct mail_alias *m);
--- 80,85 ----
***************
*** 82,92 ****
***********************************************************/
void
! do_malias(player, arg1, arg2)
! dbref player;
! char *arg1;
! char *arg2;
{
if (!arg1 || !*arg1) {
if (arg2 && *arg2) {
--- 88,103 ----
***********************************************************/
+ /** List or create a malias.
+ * \verbatim
+ * This implements the @malias command (with no switches).
+ * \endverbatim
+ * \param player the enactor.
+ * \param arg1 name of malias to create or list, or NULL to list all.
+ * \param arg2 parameters for creation, or NULL to list.
+ */
void
! do_malias(dbref player, char *arg1, char *arg2)
{
if (!arg1 || !*arg1) {
if (arg2 && *arg2) {
***************
*** 107,117 ****
}
void
! do_malias_create(player, alias, tolist)
! dbref player;
! char *alias;
! char *tolist;
{
char *head, *tail, spot;
struct mail_alias *m;
--- 118,133 ----
}
+ /** Create a malias.
+ * \verbatim
+ * This implements the @malias/create command.
+ * \endverbatim
+ * \param player the enactor.
+ * \param arg1 name of malias to create.
+ * \param arg2 parameters for creation.
+ */
void
! do_malias_create(dbref player, char *alias, char *tolist)
{
char *head, *tail, spot;
struct mail_alias *m;
***************
*** 245,254 ****
}
!
void
! do_malias_list(player)
! dbref player;
{
struct mail_alias *m;
int i = 0;
--- 261,274 ----
}
! /** List maliases.
! * \verbatim
! * This function implements @malias/list.
! * \endverbatim
! * \param player the enactor.
! */
void
! do_malias_list(dbref player)
{
struct mail_alias *m;
int i = 0;
***************
*** 275,284 ****
notify(player, T("***** End of Mail Aliases *****"));
}
void
! do_malias_members(player, alias)
! dbref player;
! char *alias;
{
struct mail_alias *m;
int i = 0;
--- 295,309 ----
notify(player, T("***** End of Mail Aliases *****"));
}
+ /** List malias members.
+ * \verbatim
+ * This function implements @malias/members.
+ * \endverbatim
+ * \param player the enactor.
+ * \param alias name of the alias to list members of.
+ */
void
! do_malias_members(dbref player, char *alias)
{
struct mail_alias *m;
int i = 0;
***************
*** 311,322 ****
}
!
void
! do_malias_desc(player, alias, desc)
! dbref player;
! char *alias;
! char *desc;
{
struct mail_alias *m;
--- 336,351 ----
}
! /** Describe a malias.
! * \verbatim
! * This implements the @malias/desc command.
! * \endverbatim
! * \param player the enactor.
! * \param alias name of the malias to describe.
! * \param desc description to set.
! */
void
! do_malias_desc(dbref player, char *alias, char *desc)
{
struct mail_alias *m;
***************
*** 334,344 ****
}
void
! do_malias_chown(player, alias, owner)
! dbref player;
! char *alias;
! char *owner;
{
struct mail_alias *m;
dbref no = NOTHING;
--- 363,378 ----
}
+ /** Change ownership of a malias.
+ * \verbatim
+ * This implements the @malias/chown command.
+ * \endverbatim
+ * \param player the enactor.
+ * \param alias name of the malias to chown.
+ * \param owner name of the new owner.
+ */
void
! do_malias_chown(dbref player, char *alias, char *owner)
{
struct mail_alias *m;
dbref no = NOTHING;
***************
*** 363,373 ****
void
! do_malias_rename(player, alias, newname)
! dbref player;
! char *alias;
! char *newname;
{
struct mail_alias *m;
--- 397,412 ----
+ /** Change name of a malias.
+ * \verbatim
+ * This implements the @malias/rename command.
+ * \endverbatim
+ * \param player the enactor.
+ * \param alias name of the malias to rename.
+ * \param newname new name for the malias.
+ */
void
! do_malias_rename(dbref player, char *alias, char *newname)
{
struct mail_alias *m;
***************
*** 398,407 ****
void
! do_malias_destroy(player, alias)
! dbref player;
! char *alias;
{
struct mail_alias *m;
m = get_malias(player, alias);
--- 437,451 ----
+ /** Delete a malias.
+ * \verbatim
+ * This implements the @malias/destroy command.
+ * \endverbatim
+ * \param player the enactor.
+ * \param alias name of the malias to destroy.
+ */
void
! do_malias_destroy(dbref player, char *alias)
{
struct mail_alias *m;
m = get_malias(player, alias);
***************
*** 426,436 ****
}
void
! do_malias_set(player, alias, tolist)
! dbref player;
! char *alias;
! char *tolist;
{
struct mail_alias *m;
int i = 0;
--- 470,485 ----
}
+ /** Set the membership list for a malias.
+ * \verbatim
+ * This implements the @malias/set command.
+ * \endverbatim
+ * \param player the enactor.
+ * \param alias name of the malias to set members for.
+ * \param tolist space-separated list of players to set as members.
+ */
void
! do_malias_set(dbref player, char *alias, char *tolist)
{
struct mail_alias *m;
int i = 0;
***************
*** 524,532 ****
void
! do_malias_all(player)
! dbref player;
{
struct mail_alias *m;
int i;
--- 573,586 ----
+ /** List all maliases.
+ * \verbatim
+ * This implements the @malias/list command.
+ * \endverbatim
+ * \param player the enactor.
+ */
void
! do_malias_all(dbref player)
{
struct mail_alias *m;
int i;
***************
*** 552,560 ****
void
! do_malias_stats(player)
! dbref player;
{
if (!Hasprivs(player))
notify(player, T("MAIL: Permission denied."));
--- 606,619 ----
+ /** Statistics on maliases.
+ * \verbatim
+ * This implements the @malias/stat command.
+ * \endverbatim
+ * \param player the enactor.
+ */
void
! do_malias_stats(dbref player)
{
if (!Hasprivs(player))
notify(player, T("MAIL: Permission denied."));
***************
*** 565,573 ****
}
}
void
! do_malias_nuke(player)
! dbref player;
{
struct mail_alias *m;
int i;
--- 624,637 ----
}
}
+ /** Remove all maliases.
+ * \verbatim
+ * This implements the @malias/nuke command.
+ * \endverbatim
+ * \param player the enactor.
+ */
void
! do_malias_nuke(dbref player)
{
struct mail_alias *m;
int i;
***************
*** 593,605 ****
}
!
void
! do_malias_privs(player, alias, privs, type)
! dbref player;
! char *alias;
! char *privs;
! int type; /* 0 = nprivs, 1 = mprivs */
{
struct mail_alias *m;
int *p;
--- 657,673 ----
}
! /** Set permisions on maliases.
! * \verbatim
! * This implements @malias/use and @malias/see
! * \endverbatim
! * \param player the enactor.
! * \param alias name of the malias.
! * \param privs string of privs to set.
! * \param type if 1, setting nprivs, if 0, mprivs.
! */
void
! do_malias_privs(dbref player, char *alias, char *privs, int type)
{
struct mail_alias *m;
int *p;
***************
*** 620,701 ****
}
void
! do_malias_mprivs(player, alias, privs)
! dbref player;
! char *alias;
! char *privs;
! {
! const char TYPES[] = " everyone admin members owner";
! struct mail_alias *m;
! char *ch;
!
! if (!(m = get_malias(player, alias))) {
! notify(player, T("MAIL: I cannot find that alias!"));
! return;
! }
! if (!Wizard(player) && (m->owner != player)) {
! notify(player, T("MAIL: Permission denied."));
! return;
! }
! if (!strchr("=+-", *privs)) {
! notify(player,
! T
! ("MAIL: First character of permisisons must be one of '=', '+', '-',"));
! notify(player, T(" to set, add, remove permissions, respectively."));
! return;
! }
! ch = strstr(TYPES, tprintf(" %s", privs + 1));
! if (!ch) {
! notify_format(player, T("MAIL: Unknown permission type '%s'."), privs + 1);
! notify(player,
! T
! ("Must be one of 'everyone', 'members', 'admin', 'owner' (can be abbreviated)."));
! return;
! }
! if (*privs == '=') { /* setting permissions */
! if (*ch == 'e')
! m->mflags = 0;
! else if (*ch == 'm')
! m->mflags = ALIAS_MEMBERS;
! else if (*ch == 'a')
! m->mflags = ALIAS_ADMIN;
! else if (*ch == 'o')
! m->mflags = ALIAS_OWNER;
! } else if ((*privs == '+') && m->mflags) { /* adding permissions */
! if (*ch == 'm')
! m->mflags |= ALIAS_MEMBERS;
! else if (*ch == 'a')
! m->mflags |= ALIAS_ADMIN;
! else if (*ch == 'e') { /* DUMMY */
! } else if (*ch == 'o') { /* DUMMY */
! }
! } else if (*privs == '-') { /* removing permissions */
! if (!m->mflags)
! m->mflags = ALIAS_ADMIN | ALIAS_MEMBERS;
! if (*ch == 'm')
! m->mflags &= ~ALIAS_MEMBERS;
! else if (*ch == 'a')
! m->mflags &= ~ALIAS_ADMIN;
! else if (*ch == 'e') { /* DUMMY */
! } else if (*ch == 'o') { /* DUMMY */
! }
! if (!m->mflags)
! m->mflags = ALIAS_OWNER;
! }
! notify_format(player,
! T("MAIL: Permission to list alias '%s' changed to %s"),
! alias, get_privs(m->mflags));
! }
!
!
!
!
! void
! do_malias_add(player, alias, tolist)
! dbref player;
! char *alias;
! char *tolist;
{
char *head, *tail, spot;
struct mail_alias *m;
--- 688,700 ----
}
+ /** Add players to a malias.
+ * \param player dbref of enactor.
+ * \param alias name of malias.
+ * \param tolist string with list of players to add.
+ */
void
! do_malias_add(dbref player, char *alias, char *tolist)
{
char *head, *tail, spot;
struct mail_alias *m;
***************
*** 797,807 ****
void
! do_malias_remove(player, alias, tolist)
! dbref player;
! char *alias;
! char *tolist;
{
char *head, *tail, spot;
struct mail_alias *m;
--- 796,808 ----
+ /** Remove players from a malias.
+ * \param player dbref of enactor.
+ * \param alias name of malias.
+ * \param tolist string with list of players to remove.
+ */
void
! do_malias_remove(dbref player, char *alias, char *tolist)
{
char *head, *tail, spot;
struct mail_alias *m;
***************
*** 886,917 ****
***********************************************************/
static const char *
! get_privs(flags)
! int flags;
! {
! static char privs[20];
! privs[0] = '\0';
! if (!flags)
! strcpy(privs, "EVERYONE");
! else {
! if (flags & ALIAS_MEMBERS)
! strcpy(privs, "MEMBERS");
! if (flags & ALIAS_ADMIN) {
! if (*privs)
! strcat(privs, " | ");
! strcat(privs, "ADMIN");
! }
! if (!(*privs))
! strcpy(privs, "OWNER");
! }
!
! return privs;
! }
!
!
! static const char *
! get_shortprivs(m)
! struct mail_alias *m;
{
static char privs[10];
strcpy(privs, "-- -- ");
--- 887,893 ----
***********************************************************/
static const char *
! get_shortprivs(struct mail_alias *m)
{
static char privs[10];
strcpy(privs, "-- -- ");
***************
*** 942,951 ****
}
int
! ismember(m, player)
! struct mail_alias *m;
! dbref player;
{
int i;
for (i = 0; i < m->size; i++) {
--- 918,931 ----
}
+ /** Is a player a member of a malias?
+ * \param m pointer to malias.
+ * \param player dbref of player.
+ * \retval 1 player is a member of the malias.
+ * \retval 0 player is not a member of the malias.
+ */
int
! ismember(struct mail_alias *m, dbref player)
{
int i;
for (i = 0; i < m->size; i++) {
***************
*** 955,964 ****
return 0;
}
! /* Remove a destroyed player from all maliases */
void
! malias_cleanup(player)
! dbref player;
{
struct mail_alias *m;
int n, i = 0;
--- 935,945 ----
return 0;
}
! /** Remove a destroyed player from all maliases.
! * \param player player to remove from maliases.
! */
void
! malias_cleanup(dbref player)
{
struct mail_alias *m;
int n, i = 0;
***************
*** 972,1013 ****
}
}
struct mail_alias *
! get_malias(player, alias)
! dbref player;
! char *alias;
{
const char *mal;
struct mail_alias *m;
int i = 0;
- int x = 0;
! if ((*alias == '#') && Hasprivs(player)) {
! x = atoi(alias + 1);
! if (x < 0 || x > (ma_top - 1))
! return NULL;
! else
! return &malias[x];
! } else {
! if (*alias != MALIAS_TOKEN)
! return NULL;
! mal = alias + 1;
! for (i = 0; i < ma_top; i++) {
! m = &malias[i];
! if ((m->owner == player) || (m->nflags == 0) ||
! /* ((m->nflags & ALIAS_ADMIN) && Hasprivs(player)) || */
! Hasprivs(player) ||
! ((m->nflags & ALIAS_MEMBERS) && ismember(m, player))) {
#ifdef macintosh
! if (!strcasecmp(mal, (char *) (m->name)))
#else
! if (!strcasecmp(mal, m->name))
#endif
! return m;
! }
}
}
return NULL;
--- 953,988 ----
}
}
+ /** Get a malias pointer with permission checking.
+ * \param player player dbref, for permission check.
+ * \param alias name of malias to retrieve.
+ * \return pointer to malias structure, or NULL if player can't see it.
+ */
struct mail_alias *
! get_malias(dbref player, char *alias)
{
const char *mal;
struct mail_alias *m;
int i = 0;
! if (*alias != MALIAS_TOKEN)
! return NULL;
! mal = alias + 1;
! for (i = 0; i < ma_top; i++) {
! m = &malias[i];
! if ((m->owner == player) || (m->nflags == 0) ||
! /* ((m->nflags & ALIAS_ADMIN) && Hasprivs(player)) || */
! Hasprivs(player) ||
! ((m->nflags & ALIAS_MEMBERS) && ismember(m, player))) {
#ifdef macintosh
! if (!strcasecmp(mal, (char *) (m->name)))
#else
! if (!strcasecmp(mal, m->name))
#endif
! return m;
}
}
return NULL;
***************
*** 1017,1033 ****
-
-
-
/***********************************************************
***** Loading and saving of mail-aliases *****
***********************************************************/
!
void
! load_malias(fp)
! FILE *fp;
{
int i, j;
char buffer[BUFFER_LEN];
--- 992,1006 ----
/***********************************************************
***** Loading and saving of mail-aliases *****
***********************************************************/
! /** Load maliases from the mail db.
! * \param fp file pointer to read from.
! */
void
! load_malias(FILE * fp)
{
int i, j;
char buffer[BUFFER_LEN];
***************
*** 1076,1085 ****
}
}
!
void
! save_malias(fp)
! FILE *fp;
{
int i, j;
struct mail_alias *m;
--- 1049,1059 ----
}
}
! /** Write maliases to the maildb
! * \param fp file pointer to write to.
! */
void
! save_malias(FILE * fp)
{
int i, j;
struct mail_alias *m;
***************
*** 1110,1119 ****
#else /* MAIL_ALIASES */
void
! load_malias(fp) /* Skip mail aliases, */
! FILE *fp; /* when they shall not be used, */
! {
char buffer[BUFFER_LEN];
char *s;
--- 1084,1096 ----
#else /* MAIL_ALIASES */
+ /** Dummy function to read and discard malias data in a maildb.
+ * When MAIL_ALIASES isn't defined, we use this.
+ * \param fp file pointer to read from.
+ */
void
! load_malias(FILE * fp)
! { /* Skip mail aliases, */
char buffer[BUFFER_LEN];
char *s;
*** 1_7_7.231/src/look.c Sat, 22 Feb 2003 13:33:43 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.1.1.1.1.2 660)
--- 1_7_7.308(w)/src/look.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/c/4_look.c 1.21.1.2.1.9.1.1.1.1.1.4 660)
***************
*** 1,9 ****
! /* look.c */
#include "config.h"
#include "copyrite.h"
- /* commands which look at things */
#include <string.h>
#include "conf.h"
--- 1,14 ----
! /**
! * \file look.c
! *
! * \brief Commands that look at things.
! *
! *
! */
#include "config.h"
#include "copyrite.h"
#include <string.h>
#include "conf.h"
***************
*** 28,33 ****
--- 33,39 ----
extern void decompile_flags(dbref player, dbref thing, const char *name); /* from flags.c */
extern void decompile_powers(dbref player, dbref thing, const char *name); /* from flags.c */
+ extern const char *channel_description(dbref player);
extern PRIV attr_privs[];
static void look_exits(dbref player, dbref loc, const char *exit_name);
***************
*** 42,50 ****
(dbref player, dbref thing, char const *pattern, ATTR *atr, void *args);
static int look_helper_veiled
(dbref player, dbref thing, char const *pattern, ATTR *atr, void *args);
- #ifdef CHAT_SYSTEM
- static const char *channel_description(dbref player);
- #endif
void decompile_atrs(dbref player, dbref thing, const char *name,
const char *pattern, const char *prefix, int skipdef);
void decompile_locks(dbref player, dbref thing, const char *name, int skipdef);
--- 48,53 ----
***************
*** 393,408 ****
}
}
void
look_room(dbref player, dbref loc, enum look_type style)
{
- /* look at a room. Flag value of this function:
- * 0 -- normal look, caused by "look" command.
- * 1 -- remote look, done through a TRANSPARENTED exit.
- * 2 -- auto-look, caused by moving. Obey TERSE.
- * 3 -- remote look, through a CLOUDY TRANSPARENTED exit: desc only
- * 4 -- remote look, though a CLOUDY (!TRANS) exit: contents only
- */
PUEBLOBUFF;
ATTR *a;
--- 396,414 ----
}
}
+ /** Look at a room.
+ * The style parameter tells you what kind of look it is:
+ * LOOK_NORMAL (caused by "look"), LOOK_TRANS (look through a transparent
+ * exit), LOOK_AUTO (automatic look, by moving),
+ * LOOK_CLOUDY (look through a cloudy exit - contents only), LOOK_CLOUDYTRANS
+ * (look through a cloudy transparent exit - desc only).
+ * \param player the looker.
+ * \param loc room being looked at.
+ * \param style how the room is being looked at.
+ */
void
look_room(dbref player, dbref loc, enum look_type style)
{
PUEBLOBUFF;
ATTR *a;
***************
*** 523,528 ****
--- 529,537 ----
restore_global_env("look_desc_save", preserves);
}
+ /** An automatic look (due to motion).
+ * \param player the looker.
+ */
void
do_look_around(dbref player)
{
***************
*** 532,540 ****
look_room(player, loc, LOOK_AUTO); /* auto-look. Obey TERSE. */
}
void
do_look_at(dbref player, const char *name, int key)
- /* 0 is normal, 1 is "outside" */
{
dbref thing;
dbref loc;
--- 541,553 ----
look_room(player, loc, LOOK_AUTO); /* auto-look. Obey TERSE. */
}
+ /** Look at something.
+ * \param player the looker.
+ * \param name name of object to look at.
+ * \param key 0 for normal look, 1 for look/outside.
+ */
void
do_look_at(dbref player, const char *name, int key)
{
dbref thing;
dbref loc;
***************
*** 620,647 ****
}
! #ifdef CHAT_SYSTEM
! static const char *
! channel_description(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;
! }
! #endif
!
void
do_examine(dbref player, const char *name, int brief, int all)
{
--- 633,644 ----
}
! /** Examine an object.
! * \param player the enactor doing the examining.
! * \param name name of object to examine.
! * \param brief if 1, a brief examination.
! * \param all if 1, include veiled attributes.
! */
void
do_examine(dbref player, const char *name, int brief, int all)
{
***************
*** 739,746 ****
notify_format(player, T("Powers: %s"), power_description(thing));
#ifdef CHAT_SYSTEM
! if (IsPlayer(thing) || Chanlist(thing))
! notify(player, channel_description(thing));
#endif /* CHAT_SYSTEM */
notify_format(player, T("Warnings checked: %s"), unparse_warnings(thing));
--- 736,742 ----
notify_format(player, T("Powers: %s"), power_description(thing));
#ifdef CHAT_SYSTEM
! notify(player, channel_description(thing));
#endif /* CHAT_SYSTEM */
notify_format(player, T("Warnings checked: %s"), unparse_warnings(thing));
***************
*** 855,860 ****
--- 851,859 ----
mush_free((Malloc_t) tbuf, "string");
}
+ /** The score command: check a player's money.
+ * \param player the enactor.
+ */
void
do_score(dbref player)
{
***************
*** 864,869 ****
--- 863,871 ----
Pennies(player), Pennies(player) == 1 ? MONEY : MONIES);
}
+ /** The inventory command.
+ * \param player the enactor.
+ */
void
do_inventory(dbref player)
{
***************
*** 880,885 ****
--- 882,892 ----
do_score(player);
}
+ /** The find command.
+ * \param player the enactor.
+ * \param name name pattern to search for.
+ * \param argv array of additional arguments (for dbref ranges)
+ */
void
do_find(dbref player, const char *name, char *argv[])
{
***************
*** 925,931 ****
notify_format(player, T("*** %d objects found ***"), count);
}
! /* check the current location for bugs */
void
do_sweep(dbref player, const char *arg1)
{
--- 932,944 ----
notify_format(player, T("*** %d objects found ***"), count);
}
! /** Sweep the current location for bugs.
! * \verbatim
! * This implements @sweep.
! * \endverbatim
! * \param player the enactor.
! * \param arg1 optional area to sweep.
! */
void
do_sweep(dbref player, const char *arg1)
{
***************
*** 1046,1051 ****
--- 1059,1071 ----
}
}
+ /** Locate a player.
+ * \verbatim
+ * This implements @whereis.
+ * \endverbatim
+ * \param player the enactor.
+ * \param name name of player to locate.
+ */
void
do_whereis(dbref player, const char *name)
{
***************
*** 1072,1077 ****
--- 1092,1107 ----
}
+ /** Find the entrances to a room.
+ * \verbatim
+ * This implements @entrances, which finds things linked to an object
+ * (typically exits, but can be any type).
+ * \endverbatim
+ * \param player the enactor.
+ * \param where name of object to find entrances on.
+ * \param argv array of arguments for dbref range limitation.
+ * \param val what type of 'entrances' to find.
+ */
void
do_entrances(dbref player, const char *where, char *argv[], enum ent_type val)
{
***************
*** 1187,1196 ****
}
}
struct dh_args {
! char const *prefix;
! char const *name;
! int skipdef;
};
static int
--- 1217,1227 ----
}
}
+ /** Store arguments for decompile_helper() */
struct dh_args {
! char const *prefix; /**< Decompile/tf prefix */
! char const *name; /**< Decompile object name */
! int skipdef; /**< Skip default flags on attributes if true */
};
static int
***************
*** 1241,1246 ****
--- 1272,1285 ----
return 1;
}
+ /** Decompile attributes on an object.
+ * \param player the enactor.
+ * \param thing object with attributes to decompile.
+ * \param name name to refer to object by in decompile.
+ * \param pattern pattern to match attributes to decompile.
+ * \param prefix prefix to use for decompile/tf.
+ * \param skipdef if true, skip showing default attribute flags.
+ */
void
decompile_atrs(dbref player, dbref thing, const char *name, const char *pattern,
const char *prefix, int skipdef)
***************
*** 1254,1259 ****
--- 1293,1304 ----
notify(player, T("@@ No attributes found. @@"));
}
+ /** Decompile locks on an object.
+ * \param player the enactor.
+ * \param thing object with attributes to decompile.
+ * \param name name to refer to object by in decompile.
+ * \param skipdef if true, skip showing default lock flags.
+ */
void
decompile_locks(dbref player, dbref thing, const char *name, int skipdef)
{
***************
*** 1283,1288 ****
--- 1328,1342 ----
}
}
+ /** Decompile.
+ * \verbatim
+ * This implements @decompile.
+ * \endverbatim
+ * \param player the enactor.
+ * \param name name of object to decompile.
+ * \param dbflag flag for type of decompile to perform.
+ * \param skipdef if true, skip showing default flags on attributes/locks.
+ */
void
do_decompile(dbref player, const char *name, enum dec_type dbflag, int skipdef)
{
*** 1_7_7.231/src/log.c Thu, 26 Dec 2002 14:20:42 -0600 dunemush (pennmush/c/5_log.c 1.10.1.2.2.4.1.1.2.2 660)
--- 1_7_7.308(w)/src/log.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/c/5_log.c 1.10.1.2.2.4.1.1.2.2.1.3 660)
***************
*** 1,4 ****
! /* log.c */
#include "copyrite.h"
#include "config.h"
--- 1,10 ----
! /**
! * \file log.c
! *
! * \brief Logging for PennMUSH.
! *
! *
! */
#include "copyrite.h"
#include "config.h"
***************
*** 24,32 ****
#include "log.h"
#include "confmagic.h"
! char *quick_unparse(dbref object);
! void start_log(FILE ** fp, const char *filename);
! void end_log(FILE * fp);
#ifdef macintosh
#include "PMInit.h"
--- 30,38 ----
#include "log.h"
#include "confmagic.h"
! static char *quick_unparse(dbref object);
! static void start_log(FILE ** fp, const char *filename);
! static void end_log(FILE * fp);
#ifdef macintosh
#include "PMInit.h"
***************
*** 40,48 ****
FILE *cmdlog_fp;
! char *
! quick_unparse(object)
! dbref object;
{
static char buff[BUFFER_LEN], *bp;
--- 46,53 ----
FILE *cmdlog_fp;
! static char *
! quick_unparse(dbref object)
{
static char buff[BUFFER_LEN], *bp;
***************
*** 66,75 ****
return buff;
}
! void
! start_log(fp, filename)
! FILE **fp;
! const char *filename;
{
char newfilename[256] = "\0";
--- 71,78 ----
return buff;
}
! static void
! start_log(FILE ** fp, const char *filename)
{
char newfilename[256] = "\0";
***************
*** 91,98 ****
fflush(*fp);
}
void
! start_all_logs()
{
#ifndef SINGLE_LOGFILE
start_log(&connlog_fp, CONNLOG);
--- 94,103 ----
fflush(*fp);
}
+ /** Open all logfiles.
+ */
void
! start_all_logs(void)
{
#ifndef SINGLE_LOGFILE
start_log(&connlog_fp, CONNLOG);
***************
*** 105,113 ****
#endif /* SINGLE_LOGFILE */
}
! void
! end_log(fp)
! FILE *fp;
{
if (fp != stderr) {
fprintf(fp, "END OF LOG.\n");
--- 110,117 ----
#endif /* SINGLE_LOGFILE */
}
! static void
! end_log(FILE * fp)
{
if (fp != stderr) {
fprintf(fp, "END OF LOG.\n");
***************
*** 116,123 ****
}
}
void
! end_all_logs()
{
#ifndef SINGLE_LOGFILE
/* close up the log files */
--- 120,129 ----
}
}
+ /** Close all logfiles.
+ */
void
! end_all_logs(void)
{
#ifndef SINGLE_LOGFILE
/* close up the log files */
***************
*** 130,141 ****
}
void WIN32_CDECL
do_rawlog(int logtype, const char *fmt, ...)
{
- /* take a log type and format list and args, write to appropriate logfile.
- * log types are defined in log.h
- */
struct tm *ttm;
char timebuf[18];
char tbuf1[BUFFER_LEN + 50];
--- 136,150 ----
}
+ /** Log a raw message.
+ * take a log type and format list and args, write to appropriate logfile.
+ * log types are defined in log.h
+ * \param logtype type of log to print message to.
+ * \param fmt format string for message.
+ */
void WIN32_CDECL
do_rawlog(int logtype, const char *fmt, ...)
{
struct tm *ttm;
char timebuf[18];
char tbuf1[BUFFER_LEN + 50];
***************
*** 185,197 ****
fflush(f);
}
void WIN32_CDECL
do_log(int logtype, dbref player, dbref object, const char *fmt, ...)
{
- /* take a log type and format list and args, write to appropriate logfile.
- * log types are defined in mushdb.h
- */
-
/* tbuf1 had 50 extra chars because we might pass this function
* both a label string and a command which could be up to BUFFER_LEN
* in length - for example, when logging @forces
--- 194,211 ----
fflush(f);
}
+ /** Log a message, with useful information.
+ * take a log type and format list and args, write to appropriate logfile.
+ * log types are defined in log.h. Unlike do_rawlog, this version
+ * tags messages with prefixes, and uses dbref information passed to it.
+ * \param logtype type of log to print message to.
+ * \param player dbref that generated the log message.
+ * \param object second dbref involved in log message (e.g. force logs)
+ * \param fmt mesage format string.
+ */
void WIN32_CDECL
do_log(int logtype, dbref player, dbref object, const char *fmt, ...)
{
/* tbuf1 had 50 extra chars because we might pass this function
* both a label string and a command which could be up to BUFFER_LEN
* in length - for example, when logging @forces
***************
*** 262,280 ****
}
}
void
! do_logwipe(player, logtype, str)
! dbref player;
! int logtype;
! char *str;
{
- /* Wipe out a game log. This is intended for those emergencies where
- * the log has grown out of bounds, overflowing the disk quota, etc.
- * Because someone with the god password can use this command to wipe
- * out 'intrusion' traces, we also require the log_wipe_passwd given
- * in mush.cnf
- */
-
if (strcmp(str, LOG_WIPE_PASSWD)) {
const char *lname;
switch (logtype) {
--- 276,293 ----
}
}
+ /** Wipe out a game log. This is intended for those emergencies where
+ * the log has grown out of bounds, overflowing the disk quota, etc.
+ * Because someone with the god password can use this command to wipe
+ * out 'intrusion' traces, we also require the log_wipe_passwd given
+ * in mush.cnf
+ * \param player the enactor.
+ * \param logtype type of log to wipe.
+ * \param str password for wiping logs.
+ */
void
! do_logwipe(dbref player, int logtype, char *str)
{
if (strcmp(str, LOG_WIPE_PASSWD)) {
const char *lname;
switch (logtype) {
*** 1_7_7.231/src/lock.c Thu, 23 Jan 2003 10:24:07 -0600 dunemush (pennmush/c/6_lock.c 1.17.1.13.1.1.1.4 660)
--- 1_7_7.308(w)/src/lock.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/c/6_lock.c 1.17.1.13.1.1.1.8 660)
***************
*** 1,8 ****
! /* lock.c */
!
! /*
* This is the core of Ralph Melton's rewrite of the @lock system.
! * These are some of my underlying assumptions:
*
* 1) Locks are checked many more times than they are set, so it is
* quite worthwhile to spend time when setting locks if it expedites
--- 1,12 ----
! /**
! * \file lock.c
! *
! * \brief Locks for PennMUSH.
! *
! * \verbatim
! *
* This is the core of Ralph Melton's rewrite of the @lock system.
! * These are some of the underlying assumptions:
*
* 1) Locks are checked many more times than they are set, so it is
* quite worthwhile to spend time when setting locks if it expedites
***************
*** 19,24 ****
--- 23,30 ----
* than for people to check for locks in MUSHcode. Therefore, it is
* reasonable to incur a minor slowdown for checking locks in MUSHcode
* in order to speed up the server's checking.
+ *
+ * \endverbatim
*/
#include "copyrite.h"
***************
*** 118,123 ****
--- 124,131 ----
static lock_type check_lock_type(dbref player, dbref thing, lock_type name);
static int delete_lock(dbref player, dbref thing, lock_type type);
static int can_write_lock(dbref player, dbref thing, lock_list *lock);
+ static lock_list *getlockstruct(dbref thing, lock_type type);
+ static lock_list *getlockstruct_noparent(dbref thing, lock_type type);
/* Assuming 4096 byte pages */
#define LOCKS_PER_PAGE 200
***************
*** 126,137 ****
--- 134,154 ----
static lock_list *next_free_lock(void);
static void free_lock(lock_list *ll);
+
+ /** Return a list of lock flag characters.
+ * \param ll pointer to a lock.
+ * \return string of lock flag characters.
+ */
const char *
lock_flags(lock_list *ll)
{
return privs_to_letters(lock_privs, L_FLAGS(ll));
}
+ /** Return a list of lock flag names.
+ * \param ll pointer to a lock.
+ * \return string of lock flag names, space-separated.
+ */
const char *
lock_flags_long(lock_list *ll)
{
***************
*** 151,156 ****
--- 168,174 ----
return f;
}
+ /** Initialize the lock strtree. */
void
init_locks(void)
{
***************
*** 226,233 ****
free_list = ll;
}
! /* Given a lock type, find a lock.
! * This depends on the implementation of lock_type as a string.
*/
struct boolexp *
getlock(dbref thing, lock_type type)
--- 244,253 ----
free_list = ll;
}
! /** Given a lock type, find a lock, possibly checking parents.
! * \param thing object on which lock is to be found.
! * \param type type of lock to find.
! * \return pointer to boolexp of lock.
*/
struct boolexp *
getlock(dbref thing, lock_type type)
***************
*** 239,244 ****
--- 259,269 ----
return L_KEY(ll);
}
+ /** Given a lock type, find a lock without checking parents.
+ * \param thing object on which lock is to be found.
+ * \param type type of lock to find.
+ * \return pointer to boolexp of lock.
+ */
struct boolexp *
getlock_noparent(dbref thing, lock_type type)
{
***************
*** 249,255 ****
return L_KEY(ll);
}
! lock_list *
getlockstruct(dbref thing, lock_type type)
{
lock_list *ll;
--- 274,280 ----
return L_KEY(ll);
}
! static lock_list *
getlockstruct(dbref thing, lock_type type)
{
lock_list *ll;
***************
*** 273,279 ****
return NULL;
}
! lock_list *
getlockstruct_noparent(dbref thing, lock_type type)
{
lock_list *ll = Locks(thing);
--- 298,304 ----
return NULL;
}
! static lock_list *
getlockstruct_noparent(dbref thing, lock_type type)
{
lock_list *ll = Locks(thing);
***************
*** 291,297 ****
}
! /* Is this lock in our set of canonical locks? */
lock_type
match_lock(lock_type type)
{
--- 316,325 ----
}
! /** Determine if a lock type is one of the standard types or not.
! * \param type type of lock to check.
! * \return canonical lock type or NULL
! */
lock_type
match_lock(lock_type type)
{
***************
*** 304,310 ****
return NULL;
}
! /* Return the proper entry from lock_types, or NULL */
const lock_list *
get_lockproto(lock_type type)
{
--- 332,341 ----
return NULL;
}
! /** Return the proper entry from lock_types, or NULL.
! * \param type of lock to look up.
! * \return lock_types entry for lock.
! */
const lock_list *
get_lockproto(lock_type type)
{
***************
*** 318,328 ****
}
! /* Set the lock type on thing to boolexp.
* This is a primitive routine, to be called by other routines.
* It will go somewhat wonky if given a NULL boolexp.
* It will allocate memory if called with a string that is not already
* in the lock table.
*/
int
add_lock(dbref player, dbref thing, lock_type type, struct boolexp *key,
--- 349,367 ----
}
! /** Add a lock to an object (primitive).
! * Set the lock type on thing to boolexp.
* This is a primitive routine, to be called by other routines.
* It will go somewhat wonky if given a NULL boolexp.
* It will allocate memory if called with a string that is not already
* in the lock table.
+ * \param player the enactor, for permission checking.
+ * \param thing object on which to set the lock.
+ * \param type type of lock to set.
+ * \param key lock boolexp pointer (should not be NULL!).
+ * \param flags lock flags.
+ * \retval 0 failure.
+ * \retval 1 success.
*/
int
add_lock(dbref player, dbref thing, lock_type type, struct boolexp *key,
***************
*** 382,390 ****
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,
--- 421,440 ----
return 1;
}
! /** Add a lock to an object on db load.
! * 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.
+ * This is a primitive routine, to be called by other routines.
+ * It will go somewhat wonky if given a NULL boolexp.
+ * It will allocate memory if called with a string that is not already
+ * in the lock table.
+ * \param player lock creator.
+ * \param thing object on which to set the lock.
+ * \param type type of lock to set.
+ * \param key lock boolexp pointer (should not be NULL!).
+ * \param flags lock flags.
+ * \retval 0 failure.
*/
int
add_lock_raw(dbref player, dbref thing, lock_type type, struct boolexp *key,
***************
*** 435,441 ****
free_lock(ll);
}
! /* Another primitive routine. */
int
delete_lock(dbref player, dbref thing, lock_type type)
{
--- 485,496 ----
free_lock(ll);
}
! /** Delete a lock from an object (primitive).
! * Another primitive routine.
! * \param player the enactor, for permission checking.
! * \param thing object on which to remove the lock.
! * \param type type of lock to remove.
! */
int
delete_lock(dbref player, dbref thing, lock_type type)
{
***************
*** 459,467 ****
return 1;
}
void
! free_locks(ll)
! lock_list *ll;
{
lock_list *ll2;
while (ll) {
--- 514,525 ----
return 1;
}
+ /** Free all locks in a list.
+ * Used by the object destruction routines.
+ * \param ll pointer to list of locks.
+ */
void
! free_locks(lock_list *ll)
{
lock_list *ll2;
while (ll) {
***************
*** 472,478 ****
}
! /* Check to see that the lock type is a valid type.
* If it's not in our lock table, it's not valid,
* unless it begins with 'user:' or an abbreviation thereof,
* in which case the lock type is the part after the :.
--- 530,536 ----
}
! /** Check to see that the lock type is a valid type.
* If it's not in our lock table, it's not valid,
* unless it begins with 'user:' or an abbreviation thereof,
* in which case the lock type is the part after the :.
***************
*** 480,485 ****
--- 538,548 ----
* will confuse our db-reading routines.
*
* Might destructively modify name.
+ *
+ * \param player the enactor, for notification.
+ * \param thing object on which to check the lock.
+ * \param name name of lock type.
+ * \return lock type, or NULL.
*/
static lock_type
check_lock_type(dbref player, dbref thing, lock_type name)
***************
*** 522,527 ****
--- 585,598 ----
return sp;
}
+ /** Unlock a lock (user interface).
+ * \verbatim
+ * This implements @unlock.
+ * \endverbatim
+ * \param player the enactor.
+ * \param name name of object to unlock.
+ * \param type type of lock to unlock.
+ */
void
do_unlock(dbref player, const char *name, lock_type type)
{
***************
*** 550,561 ****
}
}
void
! do_lock(player, name, keyname, type)
! dbref player;
! const char *name;
! const char *keyname;
! lock_type type;
{
lock_type real_type;
dbref thing;
--- 621,637 ----
}
}
+ /** Set/lock a lock (user interface).
+ * \verbatim
+ * This implements @lock.
+ * \endverbatim
+ * \param player the enactor.
+ * \param name name of object to lock.
+ * \param keyname key to lock the lock to, as a string.
+ * \param type type of lock to lock.
+ */
void
! do_lock(dbref player, const char *name, const char *keyname, lock_type type)
{
lock_type real_type;
dbref thing;
***************
*** 609,614 ****
--- 685,695 ----
}
}
+ /** Copy the locks from one object to another.
+ * \param player the enactor.
+ * \param orig the source object.
+ * \param clone the destination object.
+ */
void
clone_locks(dbref player, dbref orig, dbref clone)
{
***************
*** 620,632 ****
}
! /* Evaluate lock ltype on thing for player */
int
eval_lock(dbref player, dbref thing, lock_type ltype)
{
return eval_boolexp(player, getlock(thing, ltype), thing);
}
int
lock_visual(dbref thing, lock_type ltype)
{
--- 701,726 ----
}
! /** Evaluate a lock.
! * Evaluate lock ltype on thing for player.
! * \param player dbref attempting to pass the lock.
! * \param thing object containing the lock.
! * \param ltype type of lock to check.
! * \retval 1 player passes the lock.
! * \retval 0 player does not pass the lock.
! */
int
eval_lock(dbref player, dbref thing, lock_type ltype)
{
return eval_boolexp(player, getlock(thing, ltype), thing);
}
+ /** Determine if a lock is visual.
+ * \param thing object containing the lock.
+ * \param ltype type of lock to check.
+ * \retval (non-zero) lock is visual.
+ * \retval 0 lock is not visual.
+ */
int
lock_visual(dbref thing, lock_type ltype)
{
***************
*** 637,642 ****
--- 731,744 ----
return 0;
}
+ /** Set flags on a lock (user interface).
+ * \verbatim
+ * This implements @lset.
+ * \endverbatim
+ * \param player the enactor.
+ * \param what string in the form obj/lock.
+ * \param flags list of flags to set.
+ */
void
do_lset(dbref player, char *what, char *flags)
{
*** 1_7_7.231/src/info_slave.c Sun, 09 Feb 2003 14:38:28 -0600 dunemush (pennmush/c/7_info_slave 1.9.1.4.1.3 660)
--- 1_7_7.308(w)/src/info_slave.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/c/7_info_slave 1.9.1.4.1.4 660)
***************
*** 1,4 ****
! /* info_slave.c */
#include "copyrite.h"
#include "config.h"
--- 1,14 ----
! /**
! * \file info_slave.c
! *
! * \brief The information slave process.
! *
! * When running PennMUSH under Unix, a second process (info_slave) is
! * started and the server farms out DNS and ident lookups to the
! * info_slave, and reads responses from the info_slave asynchronously.
! * Communication between server and slave is by means of a local socket.
! *
! */
#include "copyrite.h"
#include "config.h"
*** 1_7_7.231/src/ident.c Sun, 01 Dec 2002 21:14:41 -0600 dunemush (pennmush/c/8_ident.c 1.19.1.4.1.12 660)
--- 1_7_7.308(w)/src/ident.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/c/8_ident.c 1.19.1.4.1.13 660)
***************
*** 1,11 ****
! /*
! ** ident.c High-level calls to the ident lib
! **
! ** Author: Pär Emanuelsson <pell at lysator.liu.se>
! ** Hacked by: Peter Eriksson <pen at lysator.liu.se>
!
! ** Many changes by Shawn Wagner to be protocol independent
! ** for PennMUSH
*/
#include "config.h"
--- 1,13 ----
! /**
! * \file ident.c
! *
! * \brief High-level calls to the ident library.
! *
! * Author: Pär Emanuelsson <pell at lysator.liu.se>
! * Hacked by: Peter Eriksson <pen at lysator.liu.se>
! *
! * Many changes by Shawn Wagner to be protocol independent
! * for PennMUSH
*/
#include "config.h"
***************
*** 64,72 ****
/* Low-level calls and macros */
typedef struct {
! int fd;
! char buf[IDBUFSIZE];
} ident_t;
--- 66,75 ----
/* Low-level calls and macros */
+ /** Structure to track an ident connection. */
typedef struct {
! int fd; /**< file descriptor to read from. */
! char buf[IDBUFSIZE]; /**< buffer to hold ident data. */
} ident_t;
***************
*** 105,110 ****
--- 108,121 ----
return ident_query(&localaddr.addr, llen, &remoteaddr.addr, rlen, timeout);
}
+ /** Perform an ident query and return the result.
+ * \param laddr local socket address data.
+ * \param llen local socket address data length.
+ * \param raddr remote socket address data.
+ * \param rlen remote socket address data length.
+ * \param timeout pointer to timeout value for query.
+ * \return ident responses in IDENT pointer, or NULL.
+ */
IDENT *
ident_query(struct sockaddr *laddr, socklen_t llen,
struct sockaddr *raddr, socklen_t rlen, int *timeout)
***************
*** 152,157 ****
--- 163,175 ----
return ident; /* At last! */
}
+ /** Perform an ident lookup and return the remote identifier as a
+ * newly allocated string. This function allocates memory that
+ * should be freed by the caller.
+ * \param fd socket to use for ident lookup.
+ * \param timeout pointer to timeout value for lookup.
+ * \return allocated string containing identifier, or NULL.
+ */
char *
ident_id(int fd, int *timeout)
{
***************
*** 166,171 ****
--- 184,192 ----
return id;
}
+ /** Free an IDENT structure and all elements.
+ * \param id pointer to IDENT structure to free.
+ */
void
ident_free(IDENT *id)
{
*** 1_7_7.231/src/game.c Wed, 19 Feb 2003 10:08:06 -0600 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.4.1.1.1.1.1.1.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.5.1.3.1.2.1.2.1.1.1.2.1.16 660)
--- 1_7_7.308(w)/src/game.c Tue, 25 Mar 2003 16:22:37 -0600 dunemush (pennmush/c/10_game.c 1.50.1.8.1.1.1.1.2.1.1.1.2.1.1.4.1.1.1.1.1.1.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.2.1.1.1.2.1.1.1.1.1.1.1.1.1.5.1.3.1.2.1.2.1.1.1.1.1.2 660)
***************
*** 1,4 ****
! /* game.c */
#include "copyrite.h"
#include "config.h"
--- 1,10 ----
! /**
! * \file game.c
! *
! * \brief The main game driver.
! *
! *
! */
#include "copyrite.h"
#include "config.h"
***************
*** 124,130 ****
void do_dolist(dbref player, char *list, char *command,
dbref cause, unsigned int flags);
void do_uptime(dbref player, int mortal);
! char *make_new_epoch_file(const char *basename, int the_epoch);
void dest_info(dbref thing, dbref tt);
#ifdef HAS_GETRUSAGE
void rusage_stats(void);
--- 130,136 ----
void do_dolist(dbref player, char *list, char *command,
dbref cause, unsigned int flags);
void do_uptime(dbref player, int mortal);
! static char *make_new_epoch_file(const char *basename, int the_epoch);
void dest_info(dbref thing, dbref tt);
#ifdef HAS_GETRUSAGE
void rusage_stats(void);
***************
*** 148,158 ****
Pid_t forked_dump_pid = -1;
! /*
! * used to allocate storage for temporary stuff, cleared before command
! * execution
*/
-
void
do_dump(dbref player, char *num, enum dump_type flag)
{
--- 154,167 ----
Pid_t forked_dump_pid = -1;
! /** User command to dump the database.
! * \verbatim
! * This implements the @dump command.
! * \endverbatim
! * \param player the enactor, for permission checking.
! * \param num checkpoint interval, as a string.
! * \param flag type of dump.
*/
void
do_dump(dbref player, char *num, enum dump_type flag)
{
***************
*** 208,216 ****
}
! /* print out stuff into error file */
void
! report()
{
if (GoodObject(cplr))
do_rawlog(LT_TRACE, T("TRACE: Cmd:%s\tdepth:%d\tby #%d at #%d"), ccom,
--- 217,227 ----
}
! /** Print global variables to the trace log.
! * This function is used for error reporting.
! */
void
! report(void)
{
if (GoodObject(cplr))
do_rawlog(LT_TRACE, T("TRACE: Cmd:%s\tdepth:%d\tby #%d at #%d"), ccom,
***************
*** 220,227 ****
}
#ifdef HAS_GETRUSAGE
void
! rusage_stats()
{
struct rusage usage;
int pid;
--- 231,240 ----
}
#ifdef HAS_GETRUSAGE
+ /** Log process statistics to the error log.
+ */
void
! rusage_stats(void)
{
struct rusage usage;
int pid;
***************
*** 252,257 ****
--- 265,277 ----
#endif /* HAS_GETRUSAGE */
+ /** User interface to shut down the MUSH.
+ * \verbatim
+ * This implements the @shutdown command.
+ * \endverbatim
+ * \param player the enactor, for permission checking.
+ * \param flag type of shutdown to perform.
+ */
void
do_shutdown(dbref player, enum shutdown_type flag)
{
***************
*** 288,294 ****
jmp_buf db_err;
static int
! dump_database_internal()
{
char realdumpfile[2048];
char realtmpfl[2048];
--- 308,314 ----
jmp_buf db_err;
static int
! dump_database_internal(void)
{
char realdumpfile[2048];
char realtmpfl[2048];
***************
*** 402,407 ****
--- 422,434 ----
return 0;
}
+ /** Crash gracefully.
+ * This function is called when something disastrous happens - typically
+ * a failure to malloc memory or a signal like segfault.
+ * It logs the fault, does its best to dump a panic database, and
+ * exits abruptly. This function does not return.
+ * \param message message to log to the error log.
+ */
void
panic(const char *message)
{
***************
*** 447,454 ****
}
}
void
! dump_database()
{
epoch++;
--- 474,485 ----
}
}
+ /** Dump the database.
+ * This function is a wrapper for dump_database_internal() that does
+ * a little logging before and after the dump.
+ */
void
! dump_database(void)
{
epoch++;
***************
*** 457,462 ****
--- 488,502 ----
do_rawlog(LT_ERR, "DUMPING: %s.#%d# (done)", dumpfile, epoch);
}
+ /** Dump a database, possibly by forking the process.
+ * This function calls dump_database_internal() to dump the MUSH
+ * databases. If we're configured to do so, it forks first, so that
+ * the child process can perform the dump while the parent continues
+ * to run the MUSH for the players. If we can't fork, this function
+ * warns players online that a dump is taking place and the game
+ * may pause.
+ * \param forking if 1, attempt a forking dump.
+ */
void
fork_and_dump(int forking)
{
***************
*** 524,531 ****
}
}
void
! do_restart()
{
dbref thing;
ATTR *s;
--- 564,576 ----
}
}
+ /** Start up the MUSH.
+ * This function does all of the work that's necessary to start up
+ * MUSH objects and code for the game. It sets up player aliases,
+ * fixes null object names, and triggers all object startups.
+ */
void
! do_restart(void)
{
dbref thing;
ATTR *s;
***************
*** 573,578 ****
--- 618,630 ----
extern void init_names(void);
extern struct db_stat_info current_state;
+ /** Initialize game structures and read the most of the configuration file.
+ * This function runs before we read in the databases. It is responsible
+ * for recording the MUSH start time, setting up all the hash and
+ * prefix tables and similar structures, and reading the portions of the
+ * config file that don't require database load.
+ * \param conf file name of the configuration file.
+ */
void
init_game_config(const char *conf)
{
***************
*** 615,626 ****
config_file_startup(conf, 0);
}
! /* Code that should be run after dbs are loaded (usually because we
! * need to have the flag table loaded, or because they run last.
*/
void
init_game_postdb(const char *conf)
{
/* Commands and functions require the flag table for restrictions */
command_init_preconfig();
command_init_postconfig();
--- 667,688 ----
config_file_startup(conf, 0);
}
! /** Post-db-load configuration.
! * This function contains code that should be run after dbs are loaded
! * (usually because we need to have the flag table loaded, or because they
! * run last). It reads in the portions of the config file that rely
! * on flags being defined.
! * \param conf file name of the configuration file.
*/
void
init_game_postdb(const char *conf)
{
+ /* access file stuff */
+ read_access_file();
+ /* initialize random number generator */
+ initialize_mt();
+ /* set up signal handlers for the timer */
+ init_timer();
/* Commands and functions require the flag table for restrictions */
command_init_preconfig();
command_init_postconfig();
***************
*** 634,641 ****
}
int
! init_game_dbs()
{
FILE *f;
--- 696,708 ----
}
+ /** Read the game databases.
+ * This function reads in the object, mail, and chat databases.
+ * \retval -1 error.
+ * \retval 0 success.
+ */
int
! init_game_dbs(void)
{
FILE *f;
***************
*** 764,782 ****
if (panicdb)
db_close(f);
- /* now do access file stuff */
- read_access_file();
-
- /* initialize random number generator */
- initialize_mt();
-
/* set up dumper */
strcpy(dumpfile, outfile);
- init_timer();
return 0;
}
void
do_readcache(dbref player)
{
--- 831,848 ----
if (panicdb)
db_close(f);
/* set up dumper */
strcpy(dumpfile, outfile);
return 0;
}
+ /** Read cached text files.
+ * \verbatim
+ * This implements the @readcache function.
+ * \endverbatim
+ * \param player the enactor, for permission checking.
+ */
void
do_readcache(dbref player)
{
***************
*** 791,802 ****
#define list_match(x) list_check(x, player, '$', ':', cptr, 0)
#define cmd_match(x) atr_comm_match(x, player, '$', ':', cptr, 0, NULL, NULL);
void
process_command(dbref player, char *command, dbref cause, int from_port)
- /* from_port = 1 if this is direct input from a port (i.e. typed
- * directly by a player). attrib sets
- * don't get parsed then.
- */
{
int a;
char *p; /* utility */
--- 857,881 ----
#define list_match(x) list_check(x, player, '$', ':', cptr, 0)
#define cmd_match(x) atr_comm_match(x, player, '$', ':', cptr, 0, NULL, NULL);
+ /** Attempt to match and execute a command.
+ * This function performs some sanity checks and then attempts to
+ * run a command. It checks, in order: home, built-in commands,
+ * enter aliases, leave aliases, $commands on neighboring objects or
+ * the player, $commands on the container, $commands on inventory,
+ * exits in the zone master room, $commands on objects in the ZMR,
+ * $commands on the ZMO, $commands on the player's zone, exits in the
+ * master room, and $commands on objectrs in the master room.
+ *
+ * When a command is directly input from a socket, we don't parse
+ * the value in attribute sets.
+ *
+ * \param player the enactor.
+ * \param command command to match and execute.
+ * \param cause object which caused the command to be executed.
+ * \param from_port if 1, the command was direct input from a socket.
+ */
void
process_command(dbref player, char *command, dbref cause, int from_port)
{
int a;
char *p; /* utility */
***************
*** 916,954 ****
/* now do check on zones */
if ((!a) && (Zone(Location(player)) != NOTHING)) {
if (IsRoom(Zone(Location(player)))) {
!
! /* zone of player's location is a zone master room */
!
! if (Location(player) != Zone(player)) {
!
! /* check zone master room exits */
! if (remote_exit(player, cptr)) {
! if (!Mobile(player))
! goto done;
! else {
! do_move(player, cptr, 2);
! goto done;
! }
! } else
! /* check commands in the zone master room if no exits
! * can match more than one $command in zone master room
! */
! a += list_match(Contents(Zone(Location(player))));
! } /* end of zone master room check */
! } else
! /* try matching commands on area zone object if GLOBALS
! * aren't in use or zone object isn't a room
*/
! if ((!a) && (Zone(Location(player)) != NOTHING))
a += cmd_match(Zone(Location(player)));
}
- /* end of matching on zone of player's location */
/* if nothing matched with zone master room/zone object, try
* matching zone commands on the player's personal zone
*/