From: Bart House Date: Sat, 13 Jul 2019 01:40:34 +0000 (-0700) Subject: Tweaks to nhassert implementation. Change to warnings on MSC build. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93ce6857d317989cbbe1d8afbf218f70a474bfb5;p=nethack Tweaks to nhassert implementation. Change to warnings on MSC build. --- diff --git a/include/extern.h b/include/extern.h index ca480cf0d..18f81ea48 100644 --- a/include/extern.h +++ b/include/extern.h @@ -2020,7 +2020,7 @@ E void VDECL(verbalize, (const char *, ...)) PRINTF_F(1, 2); E void VDECL(raw_printf, (const char *, ...)) PRINTF_F(1, 2); E void VDECL(impossible, (const char *, ...)) PRINTF_F(1, 2); E void VDECL(config_error_add, (const char *, ...)) PRINTF_F(1, 2); -E void FDECL(nhassert_failed, (const char *, const char *, int)); +E void FDECL(nhassert_failed, (const char *, int)); /* ### polyself.c ### */ diff --git a/include/global.h b/include/global.h index 23350a12c..cfd81ddbf 100644 --- a/include/global.h +++ b/include/global.h @@ -428,7 +428,7 @@ struct savefile_info { /* Supply nhassert macro if not supplied by port */ #ifndef nhassert #define nhassert(expression) (void)((!!(expression)) || \ - (nhassert_failed(#expression, __FILE__, __LINE__), 0)) + (nhassert_failed(__FILE__, __LINE__), 0)) #endif #endif /* GLOBAL_H */ diff --git a/include/ntconf.h b/include/ntconf.h index 45a8ce266..711c83914 100644 --- a/include/ntconf.h +++ b/include/ntconf.h @@ -144,6 +144,8 @@ extern void FDECL(interject, (int)); #ifndef HAS_STDINT_H #define HAS_STDINT_H /* force include of stdint.h in integer.h */ #endif +/* Turn on some additional warnings */ +#pragma warning(3:4389) #endif /* _MSC_VER */ /* The following is needed for prototypes of certain functions */ @@ -281,4 +283,13 @@ extern boolean FDECL(file_newer, (const char *, const char *)); #include "system.h" #endif +/* Override the default version of nhassert. The default version is unable + * to generate a string form of the expression due to the need to be + * compatible with compilers which do not support macro stringization (i.e. + * #x to turn x into its string form). + */ +extern void FDECL(nt_assert_failed, (const char *, const char *, int)); +#define nhassert(expression) (void)((!!(expression)) || \ + (nt_assert_failed(#expression, __FILE__, __LINE__), 0)) + #endif /* NTCONF_H */ diff --git a/src/pline.c b/src/pline.c index 03c041c03..0c69a13e4 100644 --- a/src/pline.c +++ b/src/pline.c @@ -620,9 +620,20 @@ VA_DECL(const char *, str) } /* nhassert_failed is called when an nhassert's condition is false */ -void nhassert_failed(const char * exp, const char * file, int line) +void +nhassert_failed(filepath, line) + const char * filepath; + int line; { - impossible("NHASSERT(%s) in '%s' at line %d", exp, file, line); + const char * filename; + + /* attempt to get filename from path. TODO: we really need a port provided + * function to return a filename from a path */ + filename = strrchr(filepath, '/'); + filename = (filename == NULL ? strrchr(filepath, '\\') : filename); + filename = (filename == NULL ? filepath : filename + 1); + + impossible("nhassert failed in file '%s' at line %d", filename, line); } /*pline.c*/ diff --git a/sys/winnt/winnt.c b/sys/winnt/winnt.c index 238b78549..09ee0c9b4 100644 --- a/sys/winnt/winnt.c +++ b/sys/winnt/winnt.c @@ -717,6 +717,22 @@ sys_random_seed(VOID_ARGS) return ourseed; } +/* nt_assert_failed is called when an nhassert's condition is false */ +void +nt_assert_failed(expression, filepath, line) + const char * expression; + const char * filepath; + int line; +{ + const char * filename; + + /* get file name from path */ + filename = strrchr(filepath, '\\'); + filename = (filename == NULL ? filepath : filename + 1); + impossible("nhassert(%s) failed in file '%s' at line %d", + expression, filename, line); +} + #endif /* WIN32 */ /*winnt.c*/