From b339e0aa18fe120c310f0006070e72a1bce6b3d0 Mon Sep 17 00:00:00 2001 From: jwalz Date: Sat, 5 Jan 2002 21:05:48 +0000 Subject: [PATCH] *** empty log message *** --- src/alloc.c | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 src/alloc.c diff --git a/src/alloc.c b/src/alloc.c new file mode 100644 index 000000000..a254dd8d4 --- /dev/null +++ b/src/alloc.c @@ -0,0 +1,144 @@ +/* SCCS Id: @(#)alloc.c 3.3 95/10/04 */ +/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ +/* NetHack may be freely redistributed. See license for details. */ + +/* to get the malloc() prototype from system.h */ +#define ALLOC_C /* comment line for pre-compiled headers */ +/* since this file is also used in auxiliary programs, don't include all the + * function declarations for all of nethack + */ +#define EXTERN_H /* comment line for pre-compiled headers */ +#include "config.h" + +#if defined(MONITOR_HEAP) || defined(WIZARD) +char *FDECL(fmt_ptr, (const genericptr,char *)); +#endif + +#ifdef MONITOR_HEAP +#undef alloc +#undef free +extern void FDECL(free,(genericptr_t)); +static void NDECL(heapmon_init); + +static FILE *heaplog = 0; +static boolean tried_heaplog = FALSE; +#endif + +long *FDECL(alloc,(unsigned int)); +extern void VDECL(panic, (const char *,...)) PRINTF_F(1,2); + + +long * +alloc(lth) +register unsigned int lth; +{ +#ifdef LINT +/* + * a ridiculous definition, suppressing + * "possible pointer alignment problem" for (long *) malloc() + * from lint + */ + long dummy = ftell(stderr); + + if(lth) dummy = 0; /* make sure arg is used */ + return(&dummy); +#else + register genericptr_t ptr; + + ptr = malloc(lth); +#ifndef MONITOR_HEAP + if (!ptr) panic("Memory allocation failure; cannot get %u bytes", lth); +#endif + return((long *) ptr); +#endif +} + + +#if defined(MONITOR_HEAP) || defined(WIZARD) + +# ifdef MICRO +/* we actually want to know which systems have an ANSI run-time library + * to know which support the new %p format for printing pointers. + * due to the presence of things like gcc, NHSTDC is not a good test. + * so we assume microcomputers have all converted to ANSI and bigger + * computers which may have older libraries give reasonable results with + * the cast. + */ +# define MONITOR_PTR_FMT +# endif + +# ifdef MONITOR_PTR_FMT +# define PTR_FMT "%p" +# define PTR_TYP genericptr_t +# else +# define PTR_FMT "%06lx" +# define PTR_TYP unsigned long +# endif + +/* format a pointer for display purposes; caller supplies the result buffer */ +char * +fmt_ptr(ptr, buf) +const genericptr ptr; +char *buf; +{ + Sprintf(buf, PTR_FMT, (PTR_TYP)ptr); + return buf; +} + +#endif + +#ifdef MONITOR_HEAP + +/* If ${NH_HEAPLOG} is defined and we can create a file by that name, + then we'll log the allocation and release information to that file. */ +static void +heapmon_init() +{ + char *logname = getenv("NH_HEAPLOG"); + + if (logname && *logname) + heaplog = fopen(logname, "w"); + tried_heaplog = TRUE; +} + +long * +nhalloc(lth, file, line) +unsigned int lth; +const char *file; +int line; +{ + long *ptr = alloc(lth); + char ptr_address[20]; + + if (!tried_heaplog) heapmon_init(); + if (heaplog) + (void) fprintf(heaplog, "+%5u %s %4d %s\n", lth, + fmt_ptr((genericptr_t)ptr, ptr_address), + line, file); + /* potential panic in alloc() was deferred til here */ + if (!ptr) panic("Cannot get %u bytes, line %d of %s", + lth, line, file); + + return ptr; +} + +void +nhfree(ptr, file, line) +genericptr_t ptr; +const char *file; +int line; +{ + char ptr_address[20]; + + if (!tried_heaplog) heapmon_init(); + if (heaplog) + (void) fprintf(heaplog, "- %s %4d %s\n", + fmt_ptr((genericptr_t)ptr, ptr_address), + line, file); + + free(ptr); +} + +#endif /* MONITOR_HEAP */ + +/*alloc.c*/