From: nethack.rankin Date: Sat, 8 Jul 2006 03:22:40 +0000 (+0000) Subject: pointer formatting (trunk only) X-Git-Tag: MOVE2GIT~958 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=dbc3abb22637c1b710839a98b2732663dcc97987;p=nethack pointer formatting (trunk only) Hide pointer formatting in alloc.c by eliminating the need for callers to know how big a buffer is required. I generally prefer the caller to pass in its own buffer for this sort of thing, but in this case the usage is almost entirely for debugging so using static buffers results in less clutter in the rest of the code. --- diff --git a/include/extern.h b/include/extern.h index 23a0a484d..db6f401f9 100644 --- a/include/extern.h +++ b/include/extern.h @@ -12,7 +12,7 @@ #if 0 E long *FDECL(alloc, (unsigned int)); #endif -E char *FDECL(fmt_ptr, (const genericptr,char *)); +E char *FDECL(fmt_ptr, (const genericptr)); /* This next pre-processor directive covers almost the entire file, * interrupted only occasionally to pick up specific functions as needed. */ diff --git a/include/tradstdc.h b/include/tradstdc.h index 8a8874e43..ccd4e7d67 100644 --- a/include/tradstdc.h +++ b/include/tradstdc.h @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)tradstdc.h 3.5 2006/06/28 */ +/* SCCS Id: @(#)tradstdc.h 3.5 2006/07/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -195,16 +195,15 @@ typedef genericptr genericptr_t; /* (void *) or (char *) */ #endif #if defined(MICRO) || defined(WIN32) -/* 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 +/* We actually want to know which systems have an ANSI run-time library + * to know which support the %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. + * casting pointers to unsigned long int (fmt_ptr() in alloc.c). */ # define HAS_PTR_FMT #endif -#define FMT_PTR_BUFSIZ 20 /* buffer size for ptr address as text */ /* * According to ANSI, prototypes for old-style declarations must widen the diff --git a/src/alloc.c b/src/alloc.c index fc616f8cf..4394f9fdf 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)alloc.c 3.5 1995/10/04 */ +/* 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. */ @@ -10,9 +10,7 @@ #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 +char *FDECL(fmt_ptr, (const genericptr)); #ifdef MONITOR_HEAP #undef alloc @@ -61,12 +59,30 @@ register unsigned int lth; # define PTR_TYP unsigned long # endif -/* format a pointer for display purposes; caller supplies the result buffer */ +/* A small pool of static formatting buffers. + * PTRBUFSIZ: We assume that pointers will be formatted as integers in + * hexadecimal, requring at least 16+1 characters for each buffer to handle + * 64-bit systems, but the standard doesn't mandate that encoding and an + * implementation could do something different for %p, so we make some + * extra room. + * PTRBUFCNT: Number of formatted values which can be in use at the same + * time. To have more, callers need to make copies of them as they go. + */ +#define PTRBUFCNT 4 +#define PTRBUFSIZ 32 +static char ptrbuf[PTRBUFCNT][PTRBUFSIZ]; +static int ptrbufidx = 0; + +/* format a pointer for display purposes; returns a static buffer */ char * -fmt_ptr(ptr, buf) +fmt_ptr(ptr) const genericptr ptr; -char *buf; { + char *buf; + + buf = ptrbuf[ptrbufidx]; + if (++ptrbufidx >= PTRBUFCNT) ptrbufidx = 0; + Sprintf(buf, PTR_FMT, (PTR_TYP)ptr); return buf; } @@ -92,13 +108,11 @@ const char *file; int line; { long *ptr = alloc(lth); - char ptr_address[FMT_PTR_BUFSIZ]; 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); + fmt_ptr((genericptr_t)ptr), line, file); /* potential panic in alloc() was deferred til here */ if (!ptr) panic("Cannot get %u bytes, line %d of %s", lth, line, file); @@ -112,13 +126,10 @@ genericptr_t ptr; const char *file; int line; { - char ptr_address[FMT_PTR_BUFSIZ]; - if (!tried_heaplog) heapmon_init(); if (heaplog) (void) fprintf(heaplog, "- %s %4d %s\n", - fmt_ptr((genericptr_t)ptr, ptr_address), - line, file); + fmt_ptr((genericptr_t)ptr), line, file); free(ptr); } diff --git a/src/botl.c b/src/botl.c index 5262aba4a..dcf9ddf0d 100644 --- a/src/botl.c +++ b/src/botl.c @@ -479,13 +479,11 @@ compare_blstats(bl1, bl2) struct istat_s *bl1, *bl2; { int anytype, result = 0; - char bl1_address[FMT_PTR_BUFSIZ], bl2_address[FMT_PTR_BUFSIZ]; if (!bl1 || !bl2) { - char bl1_address[FMT_PTR_BUFSIZ], bl2_address[FMT_PTR_BUFSIZ]; panic("compare_blstat: bad istat pointer %s, %s", - fmt_ptr((genericptr_t)bl1, bl1_address), - fmt_ptr((genericptr_t)bl2, bl2_address)); + fmt_ptr((genericptr_t)bl1), + fmt_ptr((genericptr_t)bl2)); } anytype = bl1->anytype; @@ -493,8 +491,8 @@ struct istat_s *bl1, *bl2; (anytype == ANY_IPTR || anytype == ANY_UPTR || anytype == ANY_LPTR || anytype == ANY_ULPTR)) { panic("compare_blstat: invalid pointer %s, %s", - fmt_ptr((genericptr_t)bl1->a.a_void, bl1_address), - fmt_ptr((genericptr_t)bl2->a.a_void, bl2_address)); + fmt_ptr((genericptr_t)bl1->a.a_void), + fmt_ptr((genericptr_t)bl2->a.a_void)); } switch(anytype) { @@ -558,11 +556,11 @@ struct istat_s *bl, *maxbl; { int result = 0; int anytype; + if (!bl || !maxbl) { - char bl_address[FMT_PTR_BUFSIZ], maxbl_address[FMT_PTR_BUFSIZ]; impossible("percentage: bad istat pointer %s, %s", - fmt_ptr((genericptr_t)bl, bl_address), - fmt_ptr((genericptr_t)maxbl, maxbl_address)); + fmt_ptr((genericptr_t)bl), + fmt_ptr((genericptr_t)maxbl)); return 0; } diff --git a/src/light.c b/src/light.c index d970dd543..b63d7aba1 100644 --- a/src/light.c +++ b/src/light.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)light.c 3.5 1997/04/10 */ +/* SCCS Id: @(#)light.c 3.5 2006/07/07 */ /* Copyright (c) Dean Luick, 1994 */ /* NetHack may be freely redistributed. See license for details. */ @@ -91,7 +91,6 @@ del_light_source(type, id) { light_source *curr, *prev; genericptr_t tmp_id; - char id_address[FMT_PTR_BUFSIZ]; /* need to be prepared for dealing a with light source which has only been partially restored during a level change @@ -119,7 +118,7 @@ del_light_source(type, id) } } impossible("del_light_source: not found type=%d, id=%s", - type, fmt_ptr((genericptr_t)id, id_address)); + type, fmt_ptr((genericptr_t)id)); } /* Mark locations that are temporarily lit via mobile light sources. */ @@ -583,7 +582,7 @@ int wiz_light_sources() { winid win; - char buf[BUFSZ], arg_address[FMT_PTR_BUFSIZ]; + char buf[BUFSZ]; light_source *ls; win = create_nhwindow(NHW_MENU); /* corner text window */ @@ -598,14 +597,14 @@ wiz_light_sources() putstr(win, 0, "-------- ----- ------ ---- -------"); for (ls = light_base; ls; ls = ls->next) { Sprintf(buf, " %2d,%2d %2d 0x%04x %s %s", - ls->x, ls->y, ls->range, ls->flags, - (ls->type == LS_OBJECT ? "obj" : - ls->type == LS_MONSTER ? - (mon_is_local((struct monst *)ls->id) ? "mon" : - ((struct monst *)ls->id == &youmonst) ? "you" : - "") : /* migrating monster */ - "???"), - fmt_ptr(ls->id, arg_address)); + ls->x, ls->y, ls->range, ls->flags, + (ls->type == LS_OBJECT ? "obj" : + ls->type == LS_MONSTER ? + (mon_is_local((struct monst *)ls->id) ? "mon" : + ((struct monst *)ls->id == &youmonst) ? "you" : + "") : /* migrating monster */ + "???"), + fmt_ptr(ls->id)); putstr(win, 0, buf); } } else diff --git a/src/mkobj.c b/src/mkobj.c index 74ecd25cb..6920b374c 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)mkobj.c 3.5 2006/06/17 */ +/* SCCS Id: @(#)mkobj.c 3.5 2006/07/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1840,16 +1840,14 @@ obj_sanity_check() struct obj *obj; struct monst *mon; const char *mesg; - char obj_address[FMT_PTR_BUFSIZ], - mon_address[FMT_PTR_BUFSIZ]; /* room for formatted pointers */ mesg = "fobj sanity"; for (obj = fobj; obj; obj = obj->nobj) { if (obj->where != OBJ_FLOOR) { pline("%s obj %s %s@(%d,%d): %s\n", mesg, - fmt_ptr((genericptr_t)obj, obj_address), - where_name(obj->where), - obj->ox, obj->oy, doname(obj)); + fmt_ptr((genericptr_t)obj), + where_name(obj->where), + obj->ox, obj->oy, doname(obj)); } check_contained(obj, mesg); } @@ -1860,17 +1858,17 @@ obj_sanity_check() for (obj = level.objects[x][y]; obj; obj = obj->nexthere) if (obj->where != OBJ_FLOOR) { pline("%s obj %s %s@(%d,%d): %s\n", mesg, - fmt_ptr((genericptr_t)obj, obj_address), - where_name(obj->where), - obj->ox, obj->oy, doname(obj)); + fmt_ptr((genericptr_t)obj), + where_name(obj->where), + obj->ox, obj->oy, doname(obj)); } mesg = "invent sanity"; for (obj = invent; obj; obj = obj->nobj) { if (obj->where != OBJ_INVENT) { pline("%s obj %s %s: %s\n", mesg, - fmt_ptr((genericptr_t)obj, obj_address), - where_name(obj->where), doname(obj)); + fmt_ptr((genericptr_t)obj), + where_name(obj->where), doname(obj)); } check_contained(obj, mesg); } @@ -1879,8 +1877,8 @@ obj_sanity_check() for (obj = migrating_objs; obj; obj = obj->nobj) { if (obj->where != OBJ_MIGRATING) { pline("%s obj %s %s: %s\n", mesg, - fmt_ptr((genericptr_t)obj, obj_address), - where_name(obj->where), doname(obj)); + fmt_ptr((genericptr_t)obj), + where_name(obj->where), doname(obj)); } check_contained(obj, mesg); } @@ -1889,8 +1887,8 @@ obj_sanity_check() for (obj = level.buriedobjlist; obj; obj = obj->nobj) { if (obj->where != OBJ_BURIED) { pline("%s obj %s %s: %s\n", mesg, - fmt_ptr((genericptr_t)obj, obj_address), - where_name(obj->where), doname(obj)); + fmt_ptr((genericptr_t)obj), + where_name(obj->where), doname(obj)); } check_contained(obj, mesg); } @@ -1899,14 +1897,14 @@ obj_sanity_check() for (obj = billobjs; obj; obj = obj->nobj) { if (obj->where != OBJ_ONBILL) { pline("%s obj %s %s: %s\n", mesg, - fmt_ptr((genericptr_t)obj, obj_address), - where_name(obj->where), doname(obj)); + fmt_ptr((genericptr_t)obj), + where_name(obj->where), doname(obj)); } /* shouldn't be a full container on the bill */ if (obj->cobj) { pline("%s obj %s contains %s! %s\n", mesg, - fmt_ptr((genericptr_t)obj, obj_address), - something, doname(obj)); + fmt_ptr((genericptr_t)obj), + something, doname(obj)); } } @@ -1915,15 +1913,13 @@ obj_sanity_check() for (obj = mon->minvent; obj; obj = obj->nobj) { if (obj->where != OBJ_MINVENT) { pline("%s obj %s %s: %s\n", mesg, - fmt_ptr((genericptr_t)obj, obj_address), - where_name(obj->where), doname(obj)); + fmt_ptr((genericptr_t)obj), + where_name(obj->where), doname(obj)); } if (obj->ocarry != mon) { pline("%s obj %s (%s) not held by mon %s (%s)\n", mesg, - fmt_ptr((genericptr_t)obj, obj_address), - doname(obj), - fmt_ptr((genericptr_t)mon, mon_address), - mon_nam(mon)); + fmt_ptr((genericptr_t)obj), doname(obj), + fmt_ptr((genericptr_t)mon), mon_nam(mon)); } check_contained(obj, mesg); } @@ -1949,17 +1945,16 @@ check_contained(container, mesg) const char *mesg; { struct obj *obj; - char obj1_address[FMT_PTR_BUFSIZ], obj2_address[FMT_PTR_BUFSIZ]; for (obj = container->cobj; obj; obj = obj->nobj) { if (obj->where != OBJ_CONTAINED) pline("contained %s obj %s: %s\n", mesg, - fmt_ptr((genericptr_t)obj, obj1_address), - where_name(obj->where)); + fmt_ptr((genericptr_t)obj), + where_name(obj->where)); else if (obj->ocontainer != container) pline("%s obj %s not in container %s\n", mesg, - fmt_ptr((genericptr_t)obj, obj1_address), - fmt_ptr((genericptr_t)container, obj2_address)); + fmt_ptr((genericptr_t)obj), + fmt_ptr((genericptr_t)container)); } } #endif /* WIZARD */ diff --git a/src/mondata.c b/src/mondata.c index a453e9349..c651b36c8 100644 --- a/src/mondata.c +++ b/src/mondata.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)mondata.c 3.5 2005/10/05 */ +/* SCCS Id: @(#)mondata.c 3.5 2006/07/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -482,9 +482,8 @@ monsndx(ptr) /* return an index into the mons array */ i = (int)(ptr - &mons[0]); if (i < LOW_PM || i >= NUMMONS) { - char ptr_address[FMT_PTR_BUFSIZ]; panic("monsndx - could not index monster (%s)", - fmt_ptr((genericptr_t)ptr, ptr_address)); + fmt_ptr((genericptr_t)ptr)); return NON_PM; /* will not get here */ } diff --git a/src/timeout.c b/src/timeout.c index 1616e90fb..b40959078 100644 --- a/src/timeout.c +++ b/src/timeout.c @@ -1,4 +1,4 @@ -/* SCCS Id: @(#)timeout.c 3.5 2006/04/14 */ +/* SCCS Id: @(#)timeout.c 3.5 2006/07/07 */ /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ /* NetHack may be freely redistributed. See license for details. */ @@ -1368,7 +1368,7 @@ print_queue(win, base) timer_element *base; { timer_element *curr; - char buf[BUFSZ], arg_address[FMT_PTR_BUFSIZ]; + char buf[BUFSZ]; if (!base) { putstr(win, 0, ""); @@ -1377,14 +1377,14 @@ print_queue(win, base) for (curr = base; curr; curr = curr->next) { #ifdef VERBOSE_TIMER Sprintf(buf, " %4ld %4ld %-6s %s(%s)", - curr->timeout, curr->tid, kind_name(curr->kind), - timeout_funcs[curr->func_index].name, - fmt_ptr((genericptr_t)curr->arg, arg_address)); + curr->timeout, curr->tid, kind_name(curr->kind), + timeout_funcs[curr->func_index].name, + fmt_ptr((genericptr_t)curr->arg)); #else Sprintf(buf, " %4ld %4ld %-6s #%d(%s)", - curr->timeout, curr->tid, kind_name(curr->kind), - curr->func_index, - fmt_ptr((genericptr_t)curr->arg, arg_address)); + curr->timeout, curr->tid, kind_name(curr->kind), + curr->func_index, + fmt_ptr((genericptr_t)curr->arg)); #endif putstr(win, 0, buf); } @@ -1417,7 +1417,6 @@ void timer_sanity_check() { timer_element *curr; - char obj_address[FMT_PTR_BUFSIZ]; /* this should be much more complete */ for (curr = timer_base; curr; curr = curr->next) @@ -1425,7 +1424,7 @@ timer_sanity_check() struct obj *obj = (struct obj *) curr->arg; if (obj->timed == 0) { pline("timer sanity: untimed obj %s, timer %ld", - fmt_ptr((genericptr_t)obj, obj_address), curr->tid); + fmt_ptr((genericptr_t)obj), curr->tid); } } }