[PENNMUSH-ANNOUNCE] 1.7.4-patch15
dunemush@pennmush.org
dunemush at pennmush.org
Fri, 15 Feb 2002 15:58:54 -0600
This is patch15 to PennMUSH 1.7.4. After applying this patch, you will
have version 1.7.4p15
To apply this patch, save it to a file in your top-level MUSH directory,
and do the following:
patch -p1 < 1.7.4-patch15
make install
If you use GNU patch 2.2, you probably want the above to be 'patch -b -p1',
not just 'patch -p1'.
Unix (or cygwin) users need not worry about failed hunks in src/switchinc.c,
hdrs/switches.h, hdrs/cmds.h, or hdrs/funs.h. These files are automatically
rebuilt on compile.
Then @shutdown and restart your MUSH.
- Alan/Javelin
In this patch:
Minor Changes:
* @dolist and iter(), where multiple tokens are replaced (## and #@),
now do both replacements at once. This is more efficient in several
ways and fixes a problem where if the second token gets into the
string from a replacement of the first, it gets replaced. (iter(a#@,
##) should return a#@, not a1). [SW]
* setunion no longer eats empty list elements. [SW]
* The help text for items() is now more descriptive of how it works
and differs from words(). Suggested by Zen@SW1.
* When you attempt to @chzone an object to a ZMO without a zone-lock,
a default zone-lock of "owner of the ZMO" is now set, and the
attempt succeeds. Suggested by Linda Antonsson.
* In the French message translation files, the word 'drapeau' and
'flag' were used interchangeably. I've standardized on 'flag'.
Report by Vexon@M*U*S*H.
Fixes:
* Message typo fixed by Bellemore@M*U*S*H.
* No more ansified names in logged shutdown messages. Report by
Bellemore@M*U*S*H.
* Messages when destroying players now take into account the
destroy_possessions and really_safe settings. Suggested by Wayne@PDX.
* The parser no longer strips any first layer of braces in, e.g.
@switch action clauses, but only when the first character in the
clause is a brace. This prevents @sw 1=1, @wait me={@emit 1; @emit 2}
from being misparsed and running @emit 2 immediately. Reported by
Azratax@Azmush. [TAP]
Prereq: 1.7.4p14
*** 1_7_4.200/Patchlevel Fri, 04 Jan 2002 14:28:24 -0600 dunemush (pennmush/5_Patchlevel 1.32 600)
--- 1_7_4.209(w)/Patchlevel Fri, 08 Feb 2002 10:43:53 -0600 dunemush (pennmush/5_Patchlevel 1.33 600)
***************
*** 1,2 ****
Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.4p14
--- 1,2 ----
Do not edit this file. It is maintained by the official PennMUSH patches.
! This is PennMUSH 1.7.4p15
*** 1_7_4.200/CHANGES Wed, 23 Jan 2002 10:11:06 -0600 dunemush (pennmush/8_CHANGES 1.219.1.66 600)
--- 1_7_4.209(w)/CHANGES Fri, 08 Feb 2002 10:43:37 -0600 dunemush (pennmush/8_CHANGES 1.219.1.72.1.1 600)
***************
*** 9,21 ****
[SW] is Shawn Wagner, a PennMUSH developer (aka Raevnos)
[LdW] is Luuk de Waard, a former PennMUSH developer (aka Halatir)
[RLM] is Ralph Melton, a former PennMUSH developer
! [NJG] is Nick Gammon, the Win32 porter
[DW] is Dan Williams, the MacOS porter
[2.2] refers to code which originated with the TinyMUSH 2.2 developers
[3] refers to code by (or inspired by) TinyMUSH 3.0
[Rhost] refers to code by (or inspired by) RhostMUSH
==========================================================================
Version 1.7.4 patchlevel 14 January 4, 2002
--- 9,51 ----
[SW] is Shawn Wagner, a PennMUSH developer (aka Raevnos)
[LdW] is Luuk de Waard, a former PennMUSH developer (aka Halatir)
[RLM] is Ralph Melton, a former PennMUSH developer
! [NJG] is Nick Gammon, the primary Win32 porter
! [EEH] is Ervin Hearn III, a Win32 porter (aka Noltar)
[DW] is Dan Williams, the MacOS porter
[2.2] refers to code which originated with the TinyMUSH 2.2 developers
[3] refers to code by (or inspired by) TinyMUSH 3.0
[Rhost] refers to code by (or inspired by) RhostMUSH
==========================================================================
+
+ Version 1.7.4 patchlevel 15 February 8, 2002
+
+ Minor Changes:
+ * @dolist and iter(), where multiple tokens are replaced (## and #@),
+ now do both replacements at once. This is more efficient in several
+ ways and fixes a problem where if the second token gets into the
+ string from a replacement of the first, it gets replaced. (iter(a#@,
+ ##) should return a#@, not a1). [SW]
+ * setunion no longer eats empty list elements. [SW]
+ * The help text for items() is now more descriptive of how it works
+ and differs from words(). Suggested by Zen@SW1.
+ * When you attempt to @chzone an object to a ZMO without a zone-lock,
+ a default zone-lock of "owner of the ZMO" is now set, and the
+ attempt succeeds. Suggested by Linda Antonsson.
+ * In the French message translation files, the word 'drapeau' and
+ 'flag' were used interchangeably. I've standardized on 'flag'.
+ Report by Vexon@M*U*S*H.
+ Fixes:
+ * Message typo fixed by Bellemore@M*U*S*H.
+ * No more ansified names in logged shutdown messages. Report by
+ Bellemore@M*U*S*H.
+ * Messages when destroying players now take into account the
+ destroy_possessions and really_safe settings. Suggested by Wayne@PDX.
+ * The parser no longer strips any first layer of braces in, e.g.
+ @switch action clauses, but only when the first character in the
+ clause is a brace. This prevents @sw 1=1, @wait me={@emit 1; @emit 2}
+ from being misparsed and running @emit 2 immediately. Reported by
+ Azratax@Azmush. [TAP]
Version 1.7.4 patchlevel 14 January 4, 2002
*** 1_7_4.200/game/txt/hlp/pennvers.hlp Wed, 23 Jan 2002 10:11:06 -0600 dunemush (pennmush/12_pennvers.h 1.169.1.42.1.3.1.1 600)
--- 1_7_4.209(w)/game/txt/hlp/pennvers.hlp Fri, 15 Feb 2002 08:20:47 -0600 dunemush (pennmush/12_pennvers.h 1.169.1.42.1.3.1.2.2.1 600)
***************
*** 1,5 ****
& changes
! & 1.7.4p14
This is a list of changes in this patchlevel which are probably of
interest to players. More information about new commands and functions
can probably be gotten via 'help <name of whatever>'. 'help credits'
--- 1,5 ----
& changes
! & 1.7.4p15
This is a list of changes in this patchlevel which are probably of
interest to players. More information about new commands and functions
can probably be gotten via 'help <name of whatever>'. 'help credits'
***************
*** 11,16 ****
--- 11,46 ----
A list of the patchlevels associated with each release can
be read in 'help patchlevels'.
+ Version 1.7.4 patchlevel 15 February 8, 2002
+
+ Minor Changes:
+ * @dolist and iter(), where multiple tokens are replaced (## and #@),
+ now do both replacements at once. This is more efficient in several
+ ways and fixes a problem where if the second token gets into the
+ string from a replacement of the first, it gets replaced. (iter(a#@,
+ ##) should return a#@, not a1). [SW]
+ * setunion no longer eats empty list elements. [SW]
+ * The help text for items() is now more descriptive of how it works
+ and differs from words(). Suggested by Zen@SW1.
+ * When you attempt to @chzone an object to a ZMO without a zone-lock,
+ a default zone-lock of "owner of the ZMO" is now set, and the
+ attempt succeeds. Suggested by Linda Antonsson.
+ * In the French message translation files, the word 'drapeau' and
+ 'flag' were used interchangeably. I've standardized on 'flag'.
+ Report by Vexon@M*U*S*H.
+ Fixes:
+ * Message typo fixed by Bellemore@M*U*S*H.
+ * No more ansified names in logged shutdown messages. Report by
+ Bellemore@M*U*S*H.
+ * Messages when destroying players now take into account the
+ destroy_possessions and really_safe settings. Suggested by Wayne@PDX.
+ * The parser no longer strips any first layer of braces in, e.g.
+ @switch action clauses, but only when the first character in the
+ clause is a brace. This prevents @sw 1=1, @wait me={@emit 1; @emit 2}
+ from being misparsed and running @emit 2 immediately. Reported by
+ Azratax@Azmush. [TAP]
+
+ & 1.7.4p14
Version 1.7.4 patchlevel 14 January 4, 2002
Minor Changes:
***************
*** 4948,4954 ****
For information on a specific patchlevel of one of the versions listed,
type 'help <version>p<patchlevel>'. For example, 'help 1.7.2p3'
! 1.7.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
1.7.3: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
1.7.2: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
--- 4978,4984 ----
For information on a specific patchlevel of one of the versions listed,
type 'help <version>p<patchlevel>'. For example, 'help 1.7.2p3'
! 1.7.4: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
1.7.3: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14
1.7.2: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35
*** 1_7_4.200/game/txt/hlp/pennfunc.hlp Fri, 04 Jan 2002 14:27:30 -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 600)
--- 1_7_4.209(w)/game/txt/hlp/pennfunc.hlp Thu, 24 Jan 2002 16:23:02 -0600 dunemush (pennmush/16_pennfunc.h 1.2.1.50.1.1.1.1.1.2.1.7.1.8.1.1.1.1.1.1.1.1.1.1 600)
***************
*** 1350,1363 ****
& ITEMS()
items(<list>,<single-character separator>)
!
! This counts the number of items in a list which uses some arbitrary
! separator. This is similar in function to WORDS(), but it does not
! have a default separator.
!
! Example:
! > say [items(this|is|a|short|string,|)]
! You say, "5"
& ITEMIZE()
& ELIST()
itemize(<list>[,<delim>[,<conjunction>[,<punctuation>]]])
--- 1350,1368 ----
& ITEMS()
items(<list>,<single-character separator>)
!
! items() counts the number of items in a list using an arbitrary
! (required) separator. Null items are counted, so:
!
! items(X|X,|) => 2 (2 X items)
! items(X||X,|) => 3 (2 X items and 1 null item)
! items(X X,%b) => 2 (2 X items)
! items(X%b%bX,%b) => 3 (2 X items and 1 null item)
! items(,|) => 1 (a single null item)
!
! Another way to think about this is that items() counts the number
! of delimiters in the string, and adds 1.
!
& ITEMIZE()
& ELIST()
itemize(<list>[,<delim>[,<conjunction>[,<punctuation>]]])
*** 1_7_4.200/src/strutil.c Mon, 13 Aug 2001 19:51:56 -0500 dunemush (pennmush/b/33_strutil.c 1.28.1.3.1.3.1.7 660)
--- 1_7_4.209(w)/src/strutil.c Fri, 15 Feb 2002 08:43:09 -0600 dunemush (pennmush/b/33_strutil.c 1.28.1.3.1.3.1.7.2.1.1.1 660)
***************
*** 411,478 ****
}
int
! u_strlen(s)
! const unsigned char *s;
{
return strlen((char *) s);
}
unsigned char *
! u_strcpy(target, source)
! unsigned char *target;
! const unsigned char *source;
{
return (unsigned char *) strcpy((char *) target, (char *) source);
}
char *
! replace_string(old, newbit, string)
! const char *old;
! const char *newbit;
! const char *string;
{
! /* another 2.0 function: replaces string "old" with string "newbit".
! * The result returned by this must be freed.
! */
! char *result, *r, *s;
! int len;
! if (!string)
! return NULL;
! s = (char *) string;
! len = strlen(old);
! r = result = (char *) malloc(BUFFER_LEN + 1);
! #ifdef MEM_CHECK
! add_check("replace_string.buff");
! #endif
! while (*s) {
! /* copy up to the next occurence of first char of old */
! while (*s && *s != *old) {
! safe_chr(*s, result, &r);
! s++;
! }
!
! /* if we've really found old, append newbit to the result and
! * move past the occurence of old. Else, copy the char and
! * continue.
! */
! if (*s) {
! if (!strncmp(old, s, len)) {
! safe_str((char *) newbit, result, &r);
! s += len;
! } else {
! safe_chr(*s, result, &r);
! s++;
! }
}
}
! *r = '\0';
return result;
}
#ifdef CAN_NEWSTYLE
--- 411,511 ----
}
int
! u_strlen(const unsigned char *s)
{
return strlen((char *) s);
}
unsigned char *
! u_strcpy(unsigned char *target, const unsigned char *source)
{
return (unsigned char *) strcpy((char *) target, (char *) source);
}
char *
! replace_string(const char *old, const char *newbit, const char *string)
{
! char tbuf1[BUFFER_LEN], *tbuf = tbuf1;
! char *result, *r;
! Size_t len;
!
! r = result = mush_malloc(BUFFER_LEN, "replace_string.buff");
! if (!result)
! panic(T("Couldn't allocate memory in replace_string!"));
! len = strlen(old);
! strcpy(tbuf, string);
! while (*tbuf) {
! char *s = strstr(tbuf, old);
! if (s) { /* Match found! */
! *s = '\0';
! safe_str(tbuf, result, &r);
! safe_str(newbit, result, &r);
! tbuf = s + len;
! } else {
! safe_str(tbuf, result, &r);
! break;
! }
! }
! *r = '\0';
! return result;
! }
! const char *standard_tokens[2] = { "##", "#@" };
! /* Replace two tokens in a string at once. All-around better than calling
! * replace_string() twice
! */
! char *
! replace_string2(const char *old[2], const char *newbits[2], const char *string)
! {
! char tbuf1[BUFFER_LEN], *tbuf = tbuf1;
! char *result, *rp;
! char firsts[3] = { '\0', '\0', '\0' };
! Size_t oldlens[2];
!
!
! if (!string)
! return NULL;
!
! rp = result = mush_malloc(BUFFER_LEN, "replace_string.buff");
! if (!result)
! panic(T("Couldn't allocate memory in replace_string2!"));
!
! firsts[0] = old[0][0];
! firsts[1] = old[1][0];
!
! oldlens[0] = strlen(old[0]);
! oldlens[1] = strlen(old[1]);
!
! strcpy(tbuf, string);
!
! while (*tbuf) {
! Size_t skip = strcspn(tbuf, firsts);
! if (skip) {
! char c = tbuf[skip];
! tbuf[skip] = '\0';
! safe_str(tbuf, result, &rp);
! tbuf[skip] = c;
! tbuf += skip;
! }
! if (strncmp(tbuf, old[0], oldlens[0]) == 0) { /* Copy the first */
! safe_str(newbits[0], result, &rp);
! tbuf += oldlens[0];
! } else if (strncmp(tbuf, old[1], oldlens[1]) == 0) { /* The second */
! safe_str(newbits[1], result, &rp);
! tbuf += oldlens[1];
! } else {
! safe_chr(*tbuf, result, &rp);
! tbuf++;
}
}
! *rp = '\0';
return result;
+
}
#ifdef CAN_NEWSTYLE
***************
*** 603,616 ****
/* Strlen that ignores ansi and HTML sequences */
int
! ansi_strlen(string)
! char *string;
{
int i = 0;
char *p;
if (!ANSI_JUSTIFY)
return strlen(string);
! p = string;
if (!p)
return 0;
while (*p) {
--- 636,648 ----
/* Strlen that ignores ansi and HTML sequences */
int
! ansi_strlen(const char *string)
{
int i = 0;
char *p;
if (!ANSI_JUSTIFY)
return strlen(string);
! p = (char *) string;
if (!p)
return 0;
while (*p) {
***************
*** 631,643 ****
/* Returns true length of string up to numchars visible characters.
*/
int
! ansi_strnlen(string, numchars)
! char *string;
! unsigned int numchars;
{
int i = 0;
char *p;
! p = string;
if (!p)
return 0;
while (*p && numchars > 0) {
--- 663,673 ----
/* Returns true length of string up to numchars visible characters.
*/
int
! ansi_strnlen(const char *string, Size_t numchars)
{
int i = 0;
char *p;
! p = (char *) string;
if (!p)
return 0;
while (*p && numchars > 0) {
***************
*** 732,740 ****
/* Strip all ansi and html markup from a string */
char *
! remove_markup(orig, s_len)
! const char *orig;
! Size_t *s_len;
{
static char buff[BUFFER_LEN];
char *bp = buff;
--- 762,768 ----
/* Strip all ansi and html markup from a string */
char *
! remove_markup(const char *orig, Size_t * s_len)
{
static char buff[BUFFER_LEN];
char *bp = buff;
***************
*** 999,1006 ****
void
! populate_codes(as)
! ansi_string *as;
{
int p;
char *current = NULL;
--- 1027,1033 ----
void
! populate_codes(ansi_string * as)
{
int p;
char *current = NULL;
***************
*** 1021,1028 ****
}
void
! depopulate_codes(as)
! ansi_string *as;
{
int p;
--- 1048,1054 ----
}
void
! depopulate_codes(ansi_string * as)
{
int p;
***************
*** 1045,1078 ****
}
}
! static int is_ansi_code _((const char *s));
! static int is_start_html_code _((const char *s)) __attribute__ ((__unused__));
! static int is_end_html_code _((const char *s));
static int
! is_ansi_code(s)
! const char *s;
{
return s && *s == ESC_CHAR;
}
static int
! is_start_html_code(s)
! const char *s;
{
return s && *s == TAG_START && *(s + 1) != '/';
}
static int
! is_end_html_code(s)
! const char *s;
{
return s && *s == TAG_START && *(s + 1) == '/';
}
void
! free_ansi_string(as)
! ansi_string *as;
{
int p;
--- 1071,1100 ----
}
}
! static int is_ansi_code(const char *s);
! static int is_start_html_code(const char *s) __attribute__ ((__unused__));
! static int is_end_html_code(const char *s);
static int
! is_ansi_code(const char *s)
{
return s && *s == ESC_CHAR;
}
static int
! is_start_html_code(const char *s)
{
return s && *s == TAG_START && *(s + 1) != '/';
}
static int
! is_end_html_code(const char *s)
{
return s && *s == TAG_START && *(s + 1) == '/';
}
void
! free_ansi_string(ansi_string * as)
{
int p;
***************
*** 1086,1096 ****
}
int
! safe_ansi_string(as, start, len, buff, bp)
! ansi_string *as;
! int start, len;
! char *buff;
! char **bp;
{
int p;
int in_ansi = 0;
--- 1108,1114 ----
}
int
! safe_ansi_string(ansi_string * as, int start, int len, char *buff, char **bp)
{
int p;
int in_ansi = 0;
*** 1_7_4.200/src/set.c Mon, 02 Jul 2001 10:18:36 -0500 dunemush (pennmush/b/38_set.c 1.26.1.5 660)
--- 1_7_4.209(w)/src/set.c Fri, 15 Feb 2002 08:43:09 -0600 dunemush (pennmush/b/38_set.c 1.26.1.5.1.1.2.1 660)
***************
*** 384,400 ****
return;
}
/* Don't allow chzone to objects without elocks!
* This checks for many trivial elocks (canuse/1, where &canuse=1)
*/
if (zone != NOTHING) {
struct boolexp *key = getlock(zone, Zone_Lock);
if (key == TRUE_BOOLEXP) {
! notify(player, T("ZMOs must be zone-locked before you @chzone!"));
! return;
! }
! /* Does the player's location pass it? If so, we have either
! * an inexact or trivial elock */
! if (eval_lock(Location(player), zone, Zone_Lock)) {
/* Does #0 and #2 pass it? If so, probably trivial elock */
if (eval_lock(PLAYER_START, zone, Zone_Lock) &&
eval_lock(MASTER_ROOM, zone, Zone_Lock)) {
--- 384,399 ----
return;
}
/* Don't allow chzone to objects without elocks!
+ * If no lock is set, set a default lock and warn.
* This checks for many trivial elocks (canuse/1, where &canuse=1)
*/
if (zone != NOTHING) {
struct boolexp *key = getlock(zone, Zone_Lock);
if (key == TRUE_BOOLEXP) {
! add_lock(zone, Zone_Lock, parse_boolexp(zone, "$me"));
! notify(player,
! T("Unlocked ZMO - automatically zone-locking ZMO to its owner"));
! } else if (eval_lock(Location(player), zone, Zone_Lock)) {
/* Does #0 and #2 pass it? If so, probably trivial elock */
if (eval_lock(PLAYER_START, zone, Zone_Lock) &&
eval_lock(MASTER_ROOM, zone, Zone_Lock)) {
*** 1_7_4.200/src/predicat.c Sun, 22 Jul 2001 08:59:28 -0500 dunemush (pennmush/b/44_predicat.c 1.1.1.34.1.1.1.3.1.4 660)
--- 1_7_4.209(w)/src/predicat.c Fri, 15 Feb 2002 08:43:09 -0600 dunemush (pennmush/b/44_predicat.c 1.1.1.34.1.1.1.3.1.4.2.1.1.1 660)
***************
*** 39,47 ****
#include "ansi.h"
#include "parse.h"
#include "dbdefs.h"
- #ifdef MEM_CHECK
- #include "memcheck.h"
- #endif
#include "privtab.h"
#include "mymalloc.h"
#include "confmagic.h"
--- 39,44 ----
***************
*** 734,743 ****
any = 1;
tbuf1 = replace_string("#$", expression, argv[a + 1]);
parse_que(player, tbuf1, cause);
! free(tbuf1);
! #ifdef MEM_CHECK
! del_check("replace_string.buff");
! #endif
}
}
--- 731,737 ----
any = 1;
tbuf1 = replace_string("#$", expression, argv[a + 1]);
parse_que(player, tbuf1, cause);
! mush_free(tbuf1, "replace_string.buff");
}
}
***************
*** 745,754 ****
if ((a < MAX_ARG) && !any && argv[a]) {
tbuf1 = replace_string("#$", expression, argv[a]);
parse_que(player, tbuf1, cause);
! free(tbuf1);
! #ifdef MEM_CHECK
! del_check("replace_string.buff");
! #endif
}
/* Pop on @notify me, if requested */
--- 739,745 ----
if ((a < MAX_ARG) && !any && argv[a]) {
tbuf1 = replace_string("#$", expression, argv[a]);
parse_que(player, tbuf1, cause);
! mush_free(tbuf1, "replace_string.buff");
}
/* Pop on @notify me, if requested */
*** 1_7_4.200/src/parse.c Sun, 06 Jan 2002 20:44:30 -0600 dunemush (pennmush/b/48_parse.c 1.23.1.10.1.2 660)
--- 1_7_4.209(w)/src/parse.c Fri, 15 Feb 2002 08:43:09 -0600 dunemush (pennmush/b/48_parse.c 1.23.1.10.1.2.1.1.1.1 660)
***************
*** 400,405 ****
--- 400,410 ----
pe_info->nest_depth++;
}
}
+
+ /* Only strip command braces if the first character is a brace. */
+ if (**str != '{')
+ eflags &= ~PE_COMMAND_BRACES;
+
for (;;) {
/* Find the first "interesting" character */
{
***************
*** 665,682 ****
(*str)++;
break;
}
! if (!(eflags & PE_STRIP_BRACES))
safe_chr('{', buff, bp);
(*str)++;
process_expression(buff, bp, str,
executor, caller, enactor,
! eflags & ~(PE_STRIP_BRACES | PE_FUNCTION_CHECK),
PT_BRACE, pe_info);
if (**str == '}') {
! if (!(eflags & PE_STRIP_BRACES))
safe_chr('}', buff, bp);
(*str)++;
}
break;
case '[': /* "[]" parse group; recurse with mandatory function check */
if (!pe_info && eflags != PE_NOTHING) {
--- 670,691 ----
(*str)++;
break;
}
! if (!(eflags & (PE_STRIP_BRACES | PE_COMMAND_BRACES)))
safe_chr('{', buff, bp);
(*str)++;
process_expression(buff, bp, str,
executor, caller, enactor,
! eflags & PE_COMMAND_BRACES
! ? (eflags & ~PE_COMMAND_BRACES)
! : (eflags & ~(PE_STRIP_BRACES | PE_FUNCTION_CHECK)),
PT_BRACE, pe_info);
if (**str == '}') {
! if (!(eflags & (PE_STRIP_BRACES | PE_COMMAND_BRACES)))
safe_chr('}', buff, bp);
(*str)++;
}
+ /* Only strip one set of braces for commands */
+ eflags &= ~PE_COMMAND_BRACES;
break;
case '[': /* "[]" parse group; recurse with mandatory function check */
if (!pe_info && eflags != PE_NOTHING) {
*** 1_7_4.200/src/game.c Fri, 07 Dec 2001 23:26:07 -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 660)
--- 1_7_4.209(w)/src/game.c Fri, 15 Feb 2002 08:43:08 -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.1 660)
***************
*** 119,125 ****
int loc_alias_check _((dbref loc, const char *command, const char *type));
void do_poor _((dbref player, char *arg1));
void do_writelog _((dbref player, char *str, int ltype));
! void bind_and_queue _((dbref player, dbref cause, char *action, char *arg));
void do_scan _((dbref player, char *command, int flag));
void do_list _((dbref player, char *arg, int lc));
void do_dolist _((dbref player, char *list, char *command,
--- 119,126 ----
int loc_alias_check _((dbref loc, const char *command, const char *type));
void do_poor _((dbref player, char *arg1));
void do_writelog _((dbref player, char *str, int ltype));
! void bind_and_queue(dbref player, dbref cause, char *action, const char *arg,
! const char *placestr);
void do_scan _((dbref player, char *command, int flag));
void do_list _((dbref player, char *arg, int lc));
void do_dolist _((dbref player, char *list, char *command,
***************
*** 260,267 ****
}
if (Wizard(player)) {
flag_broadcast(0, 0, T("GAME: Shutdown by %s"), Name(player));
! do_log(LT_ERR, player, NOTHING, T("SHUTDOWN by %s\n"),
! real_unparse(player, player, 0, 0));
/* This will create a file used to check if a restart should occur */
#ifdef AUTORESTART
--- 261,268 ----
}
if (Wizard(player)) {
flag_broadcast(0, 0, T("GAME: Shutdown by %s"), Name(player));
! do_log(LT_ERR, player, NOTHING, T("SHUTDOWN by %s(%s)\n"),
! Name(player), unparse_dbref(player));
/* This will create a file used to check if a restart should occur */
#ifdef AUTORESTART
***************
*** 1239,1268 ****
/* Bind occurences of '##' in "action" to "arg", then run "action" */
void
! bind_and_queue(player, cause, action, arg)
! dbref player;
! dbref cause;
! char *action;
! char *arg;
{
char *repl, *command;
- repl = replace_string("##", arg, action);
command = strip_braces(repl);
! if (repl)
! free(repl);
! #ifdef MEM_CHECK
! del_check("replace_string.buff");
! #endif
parse_que(player, command, cause);
! if (command)
! free(command);
! #ifdef MEM_CHECK
! del_check("strip_braces.buff");
! #endif
}
void
--- 1240,1263 ----
/* Bind occurences of '##' in "action" to "arg", then run "action" */
void
! bind_and_queue(dbref player, dbref cause, char *action, const char *arg,
! const char *placestr)
{
char *repl, *command;
+ const char *replace[2];
+
+ replace[0] = arg;
+ replace[1] = placestr;
+
+ repl = replace_string2(standard_tokens, replace, action);
command = strip_braces(repl);
! mush_free(repl, "replace_string.buff");
parse_que(player, command, cause);
! mush_free(command, "strip_braces.buff");
}
void
***************
*** 1393,1407 ****
#define DOL_DELIM 4
void
! do_dolist(player, list, command, cause, flags)
! dbref player;
! char *list, *command;
! dbref cause;
! unsigned int flags;
{
char *curr, *objstring;
char outbuf[BUFFER_LEN];
! char *ebuf1, *ebuf2, *bp;
int place;
char placestr[10];
int j;
--- 1388,1399 ----
#define DOL_DELIM 4
void
! do_dolist(dbref player, char *list, char *command, dbref cause,
! unsigned int flags)
{
char *curr, *objstring;
char outbuf[BUFFER_LEN];
! char *bp;
int place;
char placestr[10];
int j;
***************
*** 1416,1422 ****
if (flags & DOL_DELIM) {
if (list[1] != ' ') {
! notify(player, T("Seperator must be one character."));
if (flags & DOL_NOTIFY)
parse_que(player, "@notify me", cause);
return;
--- 1408,1414 ----
if (flags & DOL_DELIM) {
if (list[1] != ' ') {
! notify(player, T("Separator must be one character."));
if (flags & DOL_NOTIFY)
parse_que(player, "@notify me", cause);
return;
***************
*** 1453,1481 ****
if (!(flags & DOL_MAP)) {
/* @dolist, queue command */
! ebuf1 = replace_string("#@", placestr, command);
! bind_and_queue(player, cause, ebuf1, curr);
! #ifdef MEM_CHECK
! del_check("replace_string.buff");
! #endif
! free(ebuf1);
} else {
/* it's @map, add to the output list */
if (bp != outbuf)
safe_chr(delim, outbuf, &bp);
! ebuf1 = replace_string("##", curr, command);
! ebuf2 = replace_string("#@", placestr, ebuf1);
! free(ebuf1);
! #ifdef MEM_CHECK
! del_check("replace_string.buff");
! #endif
! ebuf1 = ebuf2;
! process_expression(outbuf, &bp, (char const **) &ebuf1,
player, cause, cause, PE_DEFAULT, PT_DEFAULT, NULL);
! free(ebuf2);
! #ifdef MEM_CHECK
! del_check("replace_string.buff");
! #endif
}
}
--- 1445,1464 ----
if (!(flags & DOL_MAP)) {
/* @dolist, queue command */
! bind_and_queue(player, cause, command, curr, placestr);
} else {
+ const char *replace[2];
+ char *ebuf;
+
/* it's @map, add to the output list */
if (bp != outbuf)
safe_chr(delim, outbuf, &bp);
! replace[0] = curr;
! replace[1] = placestr;
! ebuf = replace_string2(standard_tokens, replace, command);
! process_expression(outbuf, &bp, (char const **) &ebuf,
player, cause, cause, PE_DEFAULT, PT_DEFAULT, NULL);
! mush_free(ebuf, "replace_string.buff");
}
}
*** 1_7_4.200/src/funlist.c Wed, 23 Jan 2002 10:11:06 -0600 dunemush (pennmush/c/16_funlist.c 1.3.1.1.1.5.1.2.1.1.1.1.1.4.1.2.1.2.1.19.1.2.1.1.1.2.1.5.1.1.1.1.1.1.1.1 660)
--- 1_7_4.209(w)/src/funlist.c Fri, 15 Feb 2002 08:43:08 -0600 dunemush (pennmush/c/16_funlist.c 1.3.1.1.1.5.1.2.1.1.1.1.1.4.1.2.1.2.1.19.1.2.1.1.1.2.1.5.1.1.1.1.1.1.1.1.1.1.2.1.1.1 660)
***************
*** 997,1009 ****
if (!delim_check(buff, bp, nargs, args, 3, &sep))
return;
! tempbuff = (char *) mush_malloc(BUFFER_LEN * 2, "string");
a1 = (char **) mush_malloc(MAX_SORTSIZE * sizeof(char *), "ptrarray");
a2 = (char **) mush_malloc(MAX_SORTSIZE * sizeof(char *), "ptrarray");
if (!tempbuff || !a1 || !a2)
panic("Unable to allocate memory in fun_setunion");
/* Concat both lists, make array, sort */
! sprintf(tempbuff, "%s%c%s", args[0], sep, args[1]);
n1 = list2arr(a1, MAX_SORTSIZE, tempbuff, sep);
if (nargs == 4)
sort_type = get_list_type(args, nargs, 4, a1, n1);
--- 997,1014 ----
if (!delim_check(buff, bp, nargs, args, 3, &sep))
return;
! tempbuff = (char *) mush_malloc((BUFFER_LEN * 2) + 4, "string");
a1 = (char **) mush_malloc(MAX_SORTSIZE * sizeof(char *), "ptrarray");
a2 = (char **) mush_malloc(MAX_SORTSIZE * sizeof(char *), "ptrarray");
if (!tempbuff || !a1 || !a2)
panic("Unable to allocate memory in fun_setunion");
/* Concat both lists, make array, sort */
! if (!*args[0])
! strcpy(tempbuff, args[1]);
! else if (!*args[1])
! strcpy(tempbuff, args[0]);
! else
! sprintf(tempbuff, "%s%c%s", args[0], sep, args[1]);
n1 = list2arr(a1, MAX_SORTSIZE, tempbuff, sep);
if (nargs == 4)
sort_type = get_list_type(args, nargs, 4, a1, n1);
***************
*** 1013,1020 ****
/* Strip the duplicates and make a2 contain the list */
a = 0;
for (i = 0; i < n1; i++) {
! if (((a == 0) || (gencomp(a1[i], a2[a - 1], sort_type) != 0))
! && (*a1[i])) {
a2[a] = a1[i];
a++;
}
--- 1018,1024 ----
/* Strip the duplicates and make a2 contain the list */
a = 0;
for (i = 0; i < n1; i++) {
! if (((a == 0) || (gencomp(a1[i], a2[a - 1], sort_type) != 0))) {
a2[a] = a1[i];
a++;
}
***************
*** 1926,1931 ****
--- 1930,1937 ----
int *place;
int funccount;
char *oldbp;
+ const char *replace[2];
+
if (inum >= MAX_ITERS) {
safe_str(T("#-1 TOO MANY ITERS"), buff, bp);
***************
*** 1985,1997 ****
}
*place = *place + 1;
iter_rep[inum] = tbuf1 = split_token(&lp, sep);
! tbuf2 = replace_string("##", tbuf1, args[1]);
! tbuf1 = replace_string("#@", unparse_integer(*place), tbuf2);
! mush_free((Malloc_t) tbuf2, "replace_string.buff");
! sp = tbuf1;
process_expression(buff, bp, &sp, executor, caller, enactor,
PE_DEFAULT, PT_DEFAULT, pe_info);
! mush_free((Malloc_t) tbuf1, "replace_string.buff");
}
*place = 0;
iter_rep[inum] = NULL;
--- 1991,2003 ----
}
*place = *place + 1;
iter_rep[inum] = tbuf1 = split_token(&lp, sep);
! replace[0] = tbuf1;
! replace[1] = unparse_integer(*place);
! tbuf2 = replace_string2(standard_tokens, replace, args[1]);
! sp = tbuf2;
process_expression(buff, bp, &sp, executor, caller, enactor,
PE_DEFAULT, PT_DEFAULT, pe_info);
! mush_free((Malloc_t) tbuf2, "replace_string.buff");
}
*place = 0;
iter_rep[inum] = NULL;
*** 1_7_4.200/src/destroy.c Wed, 26 Sep 2001 13:44:35 -0500 dunemush (pennmush/c/24_destroy.c 1.24.2.2.1.3 660)
--- 1_7_4.209(w)/src/destroy.c Fri, 15 Feb 2002 08:43:07 -0600 dunemush (pennmush/c/24_destroy.c 1.24.2.2.1.3.1.1 660)
***************
*** 347,353 ****
case TYPE_PLAYER:
/* wait until dbck */
notify_format(player,
! T("%s and all their objects are scheduled to be destroyed."),
object_header(player, thing));
break;
case TYPE_THING:
--- 347,360 ----
case TYPE_PLAYER:
/* wait until dbck */
notify_format(player,
! (DESTROY_POSSESSIONS ?
! (REALLY_SAFE ?
! T
! ("%s and all their (non-SAFE) objects are scheduled to be destroyed.")
! :
! T
! ("%s and all their objects are scheduled to be destroyed."))
! : T("%s is scheduled to be destroyed.")),
object_header(player, thing));
break;
case TYPE_THING:
*** 1_7_4.200/src/db.c Wed, 23 Jan 2002 10:11:06 -0600 dunemush (pennmush/c/25_db.c 1.26.1.1.1.1 660)
--- 1_7_4.209(w)/src/db.c Fri, 15 Feb 2002 08:43:07 -0600 dunemush (pennmush/c/25_db.c 1.26.1.1.1.1.1.1 660)
***************
*** 147,153 ****
db_size *= 2;
if ((newdb = (struct object *)
realloc(db, db_size * sizeof(struct object))) == NULL) {
! do_rawlog(LT_ERR, "ERROR: out of memory wile extending database!");
abort();
}
db = newdb;
--- 147,153 ----
db_size *= 2;
if ((newdb = (struct object *)
realloc(db, db_size * sizeof(struct object))) == NULL) {
! do_rawlog(LT_ERR, "ERROR: out of memory while extending database!");
abort();
}
db = newdb;
*** 1_7_4.200/src/command.c Thu, 08 Nov 2001 14:56:16 -0600 dunemush (pennmush/c/36_command.c 1.56.1.1.1.1.1.1.1.2.1.1.1.1.1.5.1.2 660)
--- 1_7_4.209(w)/src/command.c Fri, 15 Feb 2002 08:43:07 -0600 dunemush (pennmush/c/36_command.c 1.56.1.1.1.1.1.1.1.2.1.1.1.1.1.5.1.2.1.1 660)
***************
*** 684,690 ****
if (parse || forcenoparse)
parse = PE_NOTHING;
else
! parse = PE_DEFAULT;
if (right_side)
split = PT_NOTHING;
--- 684,690 ----
if (parse || forcenoparse)
parse = PE_NOTHING;
else
! parse = PE_DEFAULT | PE_COMMAND_BRACES;
if (right_side)
split = PT_NOTHING;
***************
*** 704,710 ****
}
if ((parse == PE_NOTHING) && args)
! parse = PE_STRIP_BRACES;
i = 1;
done = 0;
--- 704,710 ----
}
if ((parse == PE_NOTHING) && args)
! parse = PE_COMMAND_BRACES;
i = 1;
done = 0;
***************
*** 877,884 ****
c = command;
while (*p == ' ')
p++;
! process_expression(command, &c, (const char **) &p, player, cause,
! cause, PE_DEFAULT & ~PE_FUNCTION_CHECK, PT_SPACE, NULL);
*c = '\0';
strcpy(commandraw, command);
upcasestr(command);
--- 877,885 ----
c = command;
while (*p == ' ')
p++;
! process_expression(command, &c, (const char **) &p, player, cause, cause,
! (PE_DEFAULT & ~PE_FUNCTION_CHECK) | PE_COMMAND_BRACES,
! PT_SPACE, NULL);
*c = '\0';
strcpy(commandraw, command);
upcasestr(command);
***************
*** 939,946 ****
p++;
}
process_expression(commandraw, &c, (const char **) &p, player, cause,
! cause, PE_DEFAULT & ~PE_FUNCTION_CHECK, PT_DEFAULT,
! NULL);
}
*c = '\0';
mush_free((Malloc_t) command, "string");
--- 940,948 ----
p++;
}
process_expression(commandraw, &c, (const char **) &p, player, cause,
! cause,
! (PE_DEFAULT & ~PE_FUNCTION_CHECK) | PE_COMMAND_BRACES,
! PT_DEFAULT, NULL);
}
*c = '\0';
mush_free((Malloc_t) command, "string");
*** 1_7_4.200/hdrs/version.h Fri, 04 Jan 2002 14:28:24 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.1.1.3 660)
--- 1_7_4.209(w)/hdrs/version.h Fri, 15 Feb 2002 08:43:10 -0600 dunemush (pennmush/c/47_version.h 1.32.1.2.1.7.1.9.1.1.1.1.1.4 660)
***************
*** 1,2 ****
! #define VERSION "PennMUSH version 1.7.4 patchlevel 14 [01/04/2002]"
! #define SHORTVN "PennMUSH 1.7.4p14"
--- 1,2 ----
! #define VERSION "PennMUSH version 1.7.4 patchlevel 15 [02/08/2002]"
! #define SHORTVN "PennMUSH 1.7.4p15"
*** 1_7_4.200/hdrs/parse.h Thu, 19 Jul 2001 14:15:24 -0500 dunemush (pennmush/c/51_parse.h 1.10 660)
--- 1_7_4.209(w)/hdrs/parse.h Fri, 15 Feb 2002 08:43:10 -0600 dunemush (pennmush/c/51_parse.h 1.10.1.1 660)
***************
*** 184,189 ****
--- 184,190 ----
#define PE_NOTHING 0
#define PE_COMPRESS_SPACES 0x00000001
#define PE_STRIP_BRACES 0x00000002
+ #define PE_COMMAND_BRACES 0x00000004
#define PE_EVALUATE 0x00000010
#define PE_FUNCTION_CHECK 0x00000020
#define PE_FUNCTION_MANDATORY 0x00000040
*** 1_7_4.200/hdrs/externs.h Mon, 13 Aug 2001 19:51:56 -0500 dunemush (pennmush/d/16_externs.h 1.1.1.53.1.2.1.8 660)
--- 1_7_4.209(w)/hdrs/externs.h Fri, 15 Feb 2002 08:43:10 -0600 dunemush (pennmush/d/16_externs.h 1.1.1.53.1.2.1.8.2.1.1.1 660)
***************
*** 347,364 ****
#define safe_ansi(src, copylen, buff, bp) \
safe_ansi_len((src), (copylen), (buff), (bp), BUFFER_LEN)
extern char *replace_string
! _((const char *old, const char *newbit, const char *string));
! extern char *trim_space_sep _((char *str, char sep));
! extern int do_wordcount _((char *str, char sep));
! extern int minmatch _((const char *str, const char *target, int min));
! extern char *remove_word _((char *list, char *word, char sep));
! extern char *next_in_list _((char **head));
#define safe_str(s,b,p) safe_copy_str(s,b,p,BUFFER_LEN - 1)
#define safe_short_str(s,b,p) safe_copy_str(s,b,p,SBUF_LEN - 1)
! extern int ansi_strlen _((char *string));
! extern int ansi_strnlen _((char *string, unsigned int numchars));
/* From unparse.c */
const char *real_unparse
--- 347,367 ----
#define safe_ansi(src, copylen, buff, bp) \
safe_ansi_len((src), (copylen), (buff), (bp), BUFFER_LEN)
extern char *replace_string
! (const char *old, const char *newbit, const char *string);
! extern char *replace_string2
! (const char *old[2], const char *newbits[2], const char *string);
! extern const char *standard_tokens[2]; /* ## and #@ */
! extern char *trim_space_sep(char *str, char sep);
! extern int do_wordcount(char *str, char sep);
! extern int minmatch(const char *str, const char *target, int min);
! extern char *remove_word(char *list, char *word, char sep);
! extern char *next_in_list(char **head);
#define safe_str(s,b,p) safe_copy_str(s,b,p,BUFFER_LEN - 1)
#define safe_short_str(s,b,p) safe_copy_str(s,b,p,SBUF_LEN - 1)
! extern int ansi_strlen(const char *string);
! extern int ansi_strnlen(const char *string, Size_t numchars);
/* From unparse.c */
const char *real_unparse
*** 1_7_4.200/po/Makefile Wed, 10 Jan 2001 15:58:47 -0600 dunemush (pennmush/e/47_Makefile 1.7 660)
--- 1_7_4.209(w)/po/Makefile Tue, 12 Feb 2002 14:21:41 -0600 dunemush (pennmush/e/47_Makefile 1.7 660)
***************
*** 4,17 ****
da_DK.po de_DE.po no_NO.po
.pox.po: $*.pox pennmush.pot
! msgmerge $*.pox pennmush.pot > $*.po
po-files: $(POFILES)
localized: $(LANG).po
! @msgfmt --strict $(LANG).po
-mkdir -p $(LANG)/LC_MESSAGES
! @mv messages.mo $(LANG)/LC_MESSAGES/pennmush.mo
.po:
@echo "No LANG variable set, no localization. Ignore errors."
--- 4,17 ----
da_DK.po de_DE.po no_NO.po
.pox.po: $*.pox pennmush.pot
! -msgmerge $*.pox pennmush.pot > $*.po
po-files: $(POFILES)
localized: $(LANG).po
! -msgfmt --strict $(LANG).po
-mkdir -p $(LANG)/LC_MESSAGES
! -mv messages.mo $(LANG)/LC_MESSAGES/pennmush.mo
.po:
@echo "No LANG variable set, no localization. Ignore errors."