From 5eaa162c824003bf2ccdd969c08dc6a0629ebb87 Mon Sep 17 00:00:00 2001 From: Ray Chason Date: Thu, 3 Nov 2022 19:33:30 -0400 Subject: [PATCH 1/4] 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. --- include/tradstdc.h | 6 ++++++ src/mkobj.c | 4 ++-- src/vault.c | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) 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; From de32aa74c76d08910f93df0825e54a9c79392c58 Mon Sep 17 00:00:00 2001 From: Ray Chason Date: Thu, 3 Nov 2022 19:35:41 -0400 Subject: [PATCH 2/4] Use "magenta" for bright magenta Older X servers don't understand "Fuchsia," and NetHack throws impossibles as a result. The current Xorg defines "magenta" as the same color as "Fuchsia," namely #FF00FF, and older X servers understand "magenta." The resulting X11 NetHack is known to work with XFree86 4.2.0. The minimum version remains undetermined. --- win/X11/NetHack.ad | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/win/X11/NetHack.ad b/win/X11/NetHack.ad index 755fa58a7..519c8e2c8 100644 --- a/win/X11/NetHack.ad +++ b/win/X11/NetHack.ad @@ -321,7 +321,7 @@ NetHack*map*orange: orange NetHack*map*bright_green: green NetHack*map*yellow: yellow NetHack*map*bright_blue: Royal blue -NetHack*map*bright_magenta: Fuchsia +NetHack*map*bright_magenta: magenta NetHack*map*bright_cyan: cyan NetHack*map*white: white ! From 14b8350bcedec903bd172cdf2344b092df564b5c Mon Sep 17 00:00:00 2001 From: Ray Chason Date: Thu, 3 Nov 2022 19:58:56 -0400 Subject: [PATCH 3/4] Fix inadvertent change of strchr to index Thanks to entrez for pointing this out. --- src/mkobj.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mkobj.c b/src/mkobj.c index 8f3893c89..01a8a3419 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 = index(dknowns, obj->oclass) ? 0 : 1; + obj->dknown = strchr(dknowns, obj->oclass) ? 0 : 1; if ((obj->otyp >= ELVEN_SHIELD && obj->otyp <= ORCISH_SHIELD) || obj->otyp == SHIELD_OF_REFLECTION || objects[obj->otyp].oc_merge) From 940c37f13e5094d6cea226405b367a19119d1dfe Mon Sep 17 00:00:00 2001 From: Ray Chason Date: Thu, 3 Nov 2022 22:13:52 -0400 Subject: [PATCH 4/4] Add Xlib.h Gets us running on XFree86 3.3.5 --- win/X11/winmenu.c | 1 + 1 file changed, 1 insertion(+) diff --git a/win/X11/winmenu.c b/win/X11/winmenu.c index 4680229e4..ba272cd8b 100644 --- a/win/X11/winmenu.c +++ b/win/X11/winmenu.c @@ -12,6 +12,7 @@ #define PRESERVE_NO_SYSV /* X11 include files may define SYSV */ #endif +#include #include #include #include