#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
# 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
/* 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. */
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*/
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 */
void
revive_mon(arg, timeout)
anything *arg;
-long timeout;
+long timeout UNUSED;
{
struct obj *body = arg->a_obj;
struct permonst *mptr = &mons[body->corpsenm];
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[] */
}
}
"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? */