From aea3c501638c1084fd905160848d3182212834f8 Mon Sep 17 00:00:00 2001 From: "nethack.allison" Date: Fri, 6 Jan 2006 22:16:46 +0000 Subject: [PATCH] mextra follow up bit 2 noticed the leftover zeromextra, this removes it. Using memset() on a possibly failed mextra allocation was inapprorpriate, so replace the newmextra() macro with a function. Prevent a crash in christen_monst() if mextra was not initialized. --- include/extern.h | 1 + include/mextra.h | 4 ---- src/do_name.c | 1 + src/makemon.c | 11 ++++++++++- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/include/extern.h b/include/extern.h index 485ef2418..1963e98c4 100644 --- a/include/extern.h +++ b/include/extern.h @@ -969,6 +969,7 @@ E boolean FDECL(is_home_elemental, (struct permonst *)); E struct monst *FDECL(clone_mon, (struct monst *,XCHAR_P,XCHAR_P)); E int FDECL(monhp_per_lvl, (struct monst *)); E void FDECL(newmonhp, (struct monst *,int)); +E struct mextra *NDECL(newmextra); E struct monst *FDECL(makemon, (struct permonst *,int,int,int)); E boolean FDECL(create_critters, (int,struct permonst *)); E struct permonst *NDECL(rndmonst); diff --git a/include/mextra.h b/include/mextra.h index e065e0ca4..93478efd1 100644 --- a/include/mextra.h +++ b/include/mextra.h @@ -110,10 +110,6 @@ struct mextra { struct edog *edog; }; -#define newmextra() \ - (struct mextra *) memset((genericptr_t)alloc(sizeof(struct mextra)), \ - 0, sizeof(struct mextra)) - #define MNAME(mon) ((mon)->mextra->mname) #define EGD(mon) ((mon)->mextra->egd) #define EPRI(mon) ((mon)->mextra->epri) diff --git a/src/do_name.c b/src/do_name.c index b9b11e064..fc98f7a5c 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -233,6 +233,7 @@ const char *name; return mtmp; } if (has_name(mtmp)) free((genericptr_t)MNAME(mtmp)); + if (!mtmp->mextra) mtmp->mextra = newmextra(); MNAME(mtmp) = (char *)alloc(lth); if (lth) Strcpy(MNAME(mtmp), name); diff --git a/src/makemon.c b/src/makemon.c index 51574c2c1..ce988d409 100644 --- a/src/makemon.c +++ b/src/makemon.c @@ -9,7 +9,6 @@ #endif STATIC_VAR NEARDATA struct monst zeromonst; -STATIC_VAR NEARDATA struct mextra zeromextra; /* this assumes that a human quest leader or nemesis is an archetype of the corresponding role; that isn't so for some roles (tourist @@ -853,6 +852,16 @@ int mndx; } } +struct mextra * +newmextra() +{ + struct mextra *mextra; + mextra = (struct mextra *)alloc(sizeof(struct mextra)); + if (mextra) + (void) memset((genericptr_t)mextra, 0, sizeof(struct mextra)); + return mextra; +} + /* * called with [x,y] = coordinates; * [0,0] means anyplace -- 2.40.0