From: nethack.rankin Date: Sun, 29 Jan 2012 03:00:17 +0000 (+0000) Subject: strdup/dupstr (trunk only) X-Git-Tag: MOVE2GIT~65 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=061d8ec947429f7d0e35816bd8f2179088e747a1;p=nethack strdup/dupstr (trunk only) Add dupstr() as a substitute for strdup() so that out-of-memory handling will be consistent with the rest of nethack, and make it aware of nethack's heap logging. It's treated like alloc() so that its caller can be logged for NH_HEAPLOG. I put it into use in a few places, but there are lots more candidates besides the existing calls to strdup() that should be replaced. --- diff --git a/include/global.h b/include/global.h index f7514f44f..3eb12b86c 100644 --- a/include/global.h +++ b/include/global.h @@ -297,6 +297,7 @@ typedef char nhptext; #ifdef MONITOR_HEAP extern long *FDECL(nhalloc, (unsigned int,const char *,int)); extern void FDECL(nhfree, (genericptr_t,const char *,int)); +extern char *FDECL(nhdupstr, (const char *,const char *,int)); # ifndef __FILE__ # define __FILE__ "" # endif @@ -305,8 +306,10 @@ extern void FDECL(nhfree, (genericptr_t,const char *,int)); # endif # define alloc(a) nhalloc(a,__FILE__,(int)__LINE__) # define free(a) nhfree(a,__FILE__,(int)__LINE__) +# define dupstr(s) nhdupstr(s,__FILE__,(int)__LINE__) #else /* !MONITOR_HEAP */ extern long *FDECL(alloc, (unsigned int)); /* alloc.c */ +extern char *FDECL(dupstr, (const char *)); /* ditto */ #endif /* Used for consistency checks of various data files; declare it here so diff --git a/src/alloc.c b/src/alloc.c index 54ad080ec..08066565b 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -1,5 +1,4 @@ /* NetHack 3.5 alloc.c $Date$ $Revision$ */ -/* SCCS Id: @(#)alloc.c 3.5 2006/07/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -135,6 +134,28 @@ int line; free(ptr); } +/* strdup() which uses our alloc() rather than libc's malloc(), + with caller tracking */ +char * +nhdupstr(string, file, line) +const char *string; +const char *file; +int line; +{ + return strcpy((char *)nhalloc(strlen(string) + 1, file, line), string); +} +#undef dupstr + #endif /* MONITOR_HEAP */ +/* strdup() which uses our alloc() rather than libc's malloc(); + not used when MONITOR_HEAP is enabled, but included unconditionally + in case utility programs get built using a different setting for that */ +char * +dupstr(string) +const char *string; +{ + return strcpy((char *)alloc(strlen(string) + 1), string); +} + /*alloc.c*/ diff --git a/src/do.c b/src/do.c index d8699db82..4681760f8 100644 --- a/src/do.c +++ b/src/do.c @@ -1444,9 +1444,9 @@ const char *pre_msg, *post_msg; assign_level(&u.utolev, tolev); if (pre_msg) - dfr_pre_msg = strcpy((char *)alloc(strlen(pre_msg) + 1), pre_msg); + dfr_pre_msg = dupstr(pre_msg); if (post_msg) - dfr_post_msg = strcpy((char *)alloc(strlen(post_msg)+1), post_msg); + dfr_post_msg = dupstr(post_msg); } /* handle something like portal ejection */ @@ -1572,7 +1572,7 @@ struct obj *corpse; void revive_mon(arg, timeout) anything *arg; -long timeout; +long timeout UNUSED; { struct obj *body = arg->a_obj; struct permonst *mptr = &mons[body->corpsenm]; diff --git a/src/do_name.c b/src/do_name.c index eb234ce94..9d19a1997 100644 --- a/src/do_name.c +++ b/src/do_name.c @@ -602,7 +602,7 @@ register struct obj *obj; undiscover_object(obj->otyp); } } else { - *str1 = strcpy((char *) alloc((unsigned)strlen(buf)+1), buf); + *str1 = dupstr(buf); discover_object(obj->otyp, FALSE, TRUE); /* possibly add to disco[] */ } } diff --git a/src/eat.c b/src/eat.c index 58eafcd2c..90efd5638 100644 --- a/src/eat.c +++ b/src/eat.c @@ -1025,7 +1025,7 @@ register int pm; "You suddenly dread being peeled and mimic %s again!" : "You now prefer mimicking %s again.", an(Upolyd ? youmonst.data->mname : urace.noun)); - eatmbuf = strcpy((char *) alloc(strlen(buf) + 1), buf); + eatmbuf = dupstr(buf); nomovemsg = eatmbuf; afternmv = eatmdone; /* ??? what if this was set before? */