From: Ray Chason Date: Thu, 3 Nov 2022 23:33:30 +0000 (-0400) Subject: Define and use PRINTF_F_PTR X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5eaa162c824003bf2ccdd969c08dc6a0629ebb87;p=nethack Define and use PRINTF_F_PTR GCCs older than 3.1 understand __attribute__(printf(...)), but only with functions; it doesn't work with function pointers. This change uses PRINTF_F_PTR to remove the attribute from two function pointers. This change establishes GCC 3.0 as the minimum version to build NetHack. Older versions have trouble with the variadic macros and variable declarations in mid-block. --- diff --git a/include/tradstdc.h b/include/tradstdc.h index d77348f85..3681861aa 100644 --- a/include/tradstdc.h +++ b/include/tradstdc.h @@ -401,6 +401,9 @@ typedef genericptr genericptr_t; /* (void *) or (char *) */ #if (__GNUC__ >= 2) && !defined(USE_OLDARGS) #define PRINTF_F(f, v) __attribute__((format(printf, f, v))) #endif +#if (__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1) +#define PRINTF_F_PTR(f, v) PRINTF_F(f, v) +#endif #if __GNUC__ >= 3 #define UNUSED __attribute__((unused)) #define NORETURN __attribute__((noreturn)) @@ -419,6 +422,9 @@ typedef genericptr genericptr_t; /* (void *) or (char *) */ #ifndef PRINTF_F #define PRINTF_F(f, v) #endif +#ifndef PRINTF_F_PTR +#define PRINTF_F_PTR(f, v) +#endif #ifndef UNUSED #define UNUSED #endif diff --git a/src/mkobj.c b/src/mkobj.c index 53f5cf64f..8f3893c89 100644 --- a/src/mkobj.c +++ b/src/mkobj.c @@ -761,7 +761,7 @@ static const char dknowns[] = { WAND_CLASS, RING_CLASS, POTION_CLASS, void clear_dknown(struct obj *obj) { - obj->dknown = strchr(dknowns, obj->oclass) ? 0 : 1; + obj->dknown = index(dknowns, obj->oclass) ? 0 : 1; if ((obj->otyp >= ELVEN_SHIELD && obj->otyp <= ORCISH_SHIELD) || obj->otyp == SHIELD_OF_REFLECTION || objects[obj->otyp].oc_merge) @@ -2107,7 +2107,7 @@ place_object(struct obj *otmp, coordxy x, coordxy y) register struct obj *otmp2; if (!isok(x, y)) { /* validate location */ - void (*func)(const char *, ...) PRINTF_F(1, 2); + void (*func)(const char *, ...) PRINTF_F_PTR(1, 2); func = (x < 0 || y < 0 || x > COLNO - 1 || y > ROWNO - 1) ? panic : impossible; diff --git a/src/vault.c b/src/vault.c index f86a4b5e2..18db9adc0 100644 --- a/src/vault.c +++ b/src/vault.c @@ -413,7 +413,7 @@ invault(void) otherwise the hero wouldn't be able to push one to follow the guard out of the vault because that guard would be in its way */ if ((otmp = sobj_at(BOULDER, guard->mx, guard->my)) != 0) { - void (*func)(const char *, ...) PRINTF_F(1, 2); + void (*func)(const char *, ...) PRINTF_F_PTR(1, 2); const char *bname = simpleonames(otmp); int bcnt = 0;