revisit variable arguments in new lev_comp
The previous USE_OLDARGS worked with gcc on Intel, but was inherently unsafe. This method is completely safe, just obnoxiously intrusive. It you disliked debugpline*(), you're bound to hate this....
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.5 sp_lev.h $NHDT-Date$ $NHDT-Branch$:$NHDT-Revision$ */
|
||||
/* NetHack 3.5 sp_lev.h $NHDT-Date: 1428655166 2015/04/10 08:39:26 $ $NHDT-Branch: master $:$NHDT-Revision: 1.10 $ */
|
||||
/* NetHack 3.5 sp_lev.h $Date: 2009/05/06 10:45:06 $ $Revision: 1.5 $ */
|
||||
/* SCCS Id: @(#)sp_lev.h 3.5 2007/08/01 */
|
||||
/* Copyright (c) 1989 by Jean-Christophe Collet */
|
||||
@@ -471,4 +471,82 @@ struct lc_breakdef {
|
||||
int break_depth;
|
||||
};
|
||||
|
||||
/*
|
||||
* Quick! Avert your eyes while you still have a chance!
|
||||
*/
|
||||
#ifdef SPEC_LEV
|
||||
/* compiling lev_comp rather than nethack */
|
||||
# ifdef USE_OLDARGS
|
||||
# undef VA_ARGS
|
||||
# undef VA_DECL
|
||||
# undef VA_DECL2
|
||||
# undef VA_SHIFT
|
||||
# define VA_ARGS arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,\
|
||||
arg10,arg11,arg12,arg13,arg14
|
||||
# define VA_DECL(typ1,var1) (var1,VA_ARGS) \
|
||||
typ1 var1; \
|
||||
char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9,\
|
||||
*arg10,*arg11,*arg12,*arg13,*arg14; {
|
||||
# define VA_DECL2(typ1,var1,typ2,var2) (var1,var2,VA_ARGS) \
|
||||
typ1 var1; typ2 var2; \
|
||||
char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9,\
|
||||
*arg10,*arg11,*arg12,*arg13,*arg14; {
|
||||
/* unlike in the core, lev_comp's VA_SHIFT is completely safe,
|
||||
because callers always pass all these arguments */
|
||||
# define VA_SHIFT() (arg1=arg2, arg2=arg3, arg3=arg4, arg4=arg5,\
|
||||
arg5=arg6, arg6=arg7, arg7=arg8, arg8=arg9,\
|
||||
arg9=arg10, arg10=arg11, arg11=arg12,\
|
||||
arg12=arg13, arg13=arg14, arg14=0)
|
||||
/* standard NULL may be either (void *)0 or plain 0, both of
|
||||
which would need to be explicitly cast to (char *) here */
|
||||
typedef char *Va;
|
||||
# define VA_PASS1(a1) (Va)a1, (Va)0,(Va)0,(Va)0,(Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0,(Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0
|
||||
# define VA_PASS2(a1,a2) (Va)a1, (Va)a2, (Va)0,(Va)0,(Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0,(Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0
|
||||
# define VA_PASS3(a1,a2,a3) (Va)a1, (Va)a2, (Va)a3, (Va)0,(Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0,(Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0
|
||||
# define VA_PASS4(a1,a2,a3,a4) (Va)a1, (Va)a2, (Va)a3, (Va)a4, (Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0,(Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0
|
||||
# define VA_PASS5(a1,a2,a3,a4,a5) \
|
||||
(Va)a1, (Va)a2, (Va)a3, (Va)a4, (Va)a5,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0,(Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0
|
||||
# define VA_PASS7(a1,a2,a3,a4,a5,a6,a7) \
|
||||
(Va)a1, (Va)a2, (Va)a3, (Va)a4, (Va)a5,\
|
||||
(Va)a6, (Va)a7, (Va)0,(Va)0,(Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0
|
||||
# define VA_PASS8(a1,a2,a3,a4,a5,a6,a7,a8) \
|
||||
(Va)a1, (Va)a2, (Va)a3, (Va)a4, (Va)a5,\
|
||||
(Va)a6, (Va)a7, (Va)a8, (Va)0,(Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0
|
||||
# define VA_PASS9(a1,a2,a3,a4,a5,a6,a7,a8,a9) \
|
||||
(Va)a1, (Va)a2, (Va)a3, (Va)a4, (Va)a5,\
|
||||
(Va)a6, (Va)a7, (Va)a8, (Va)a9, (Va)0,\
|
||||
(Va)0,(Va)0,(Va)0,(Va)0
|
||||
# define VA_PASS14(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) \
|
||||
(Va)a1, (Va)a2, (Va)a3, (Va)a4, (Va)a5,\
|
||||
(Va)a6, (Va)a7, (Va)a8, (Va)a9, (Va)a10,\
|
||||
(Va)a11, (Va)a12, (Va)a13, (Va)a14
|
||||
# else /*!USE_OLDARGS*/
|
||||
/* USE_STDARG and USE_VARARGS don't need to pass dummy arguments
|
||||
or cast real ones */
|
||||
# define VA_PASS1(a1) a1
|
||||
# define VA_PASS2(a1,a2) a1,a2
|
||||
# define VA_PASS3(a1,a2,a3) a1,a2,a3
|
||||
# define VA_PASS4(a1,a2,a3,a4) a1,a2,a3,a4
|
||||
# define VA_PASS5(a1,a2,a3,a4,a5) a1,a2,a3,a4,a5
|
||||
# define VA_PASS7(a1,a2,a3,a4,a5,a6,a7) a1,a2,a3,a4,a5,a6,a7
|
||||
# define VA_PASS8(a1,a2,a3,a4,a5,a6,a7,a8) a1,a2,a3,a4,a5,a6,a7,a8
|
||||
# define VA_PASS9(a1,a2,a3,a4,a5,a6,a7,a8,a9) a1,a2,a3,a4,a5,a6,a7,a8,a9
|
||||
# define VA_PASS14(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14) \
|
||||
a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14
|
||||
# endif /*?USE_OLDARGS*/
|
||||
/* You were warned to avert your eyes.... */
|
||||
#endif /*SPEC_LEV*/
|
||||
|
||||
#endif /* SP_LEV_H */
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.5 tradstdc.h $NHDT-Date: 1428574130 2015/04/09 10:08:50 $ $NHDT-Branch: master $:$NHDT-Revision: 1.18 $ */
|
||||
/* NetHack 3.5 tradstdc.h $NHDT-Date: 1428655166 2015/04/10 08:39:26 $ $NHDT-Branch: master $:$NHDT-Revision: 1.19 $ */
|
||||
/* NetHack 3.5 tradstdc.h $Date: 2012/01/11 18:23:26 $ $Revision: 1.15 $ */
|
||||
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
|
||||
/* NetHack may be freely redistributed. See license for details. */
|
||||
@@ -91,22 +91,20 @@
|
||||
# define VA_NEXT(var1,typ1) var1 = va_arg(the_args,typ1)
|
||||
# define VA_END() va_end(the_args)
|
||||
# else
|
||||
/* the core never uses this many arguments, but lev_comp does */
|
||||
# define VA_ARGS arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,\
|
||||
arg10,arg11,arg12,arg13,arg14
|
||||
# define VA_ARGS arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9
|
||||
# define VA_DECL(typ1,var1) (var1,VA_ARGS) typ1 var1; \
|
||||
char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9,\
|
||||
*arg10,*arg11,*arg12,*arg13,*arg14; {
|
||||
char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9; {
|
||||
# define VA_DECL2(typ1,var1,typ2,var2) (var1,var2,VA_ARGS) \
|
||||
typ1 var1; typ2 var2; \
|
||||
char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9,\
|
||||
*arg10,*arg11,*arg12,*arg13,*arg14; {
|
||||
char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9; {
|
||||
# define VA_START(x)
|
||||
# define VA_INIT(var1,typ1)
|
||||
/* this is inherently risky, and should only be attempted as a
|
||||
very last resort; manipulating arguments which haven't actually
|
||||
been passed may or may not cause severe trouble depending on
|
||||
the function-calling/argument-passing mechanism being used */
|
||||
# define VA_SHIFT() (arg1=arg2, arg2=arg3, arg3=arg4, arg4=arg5,\
|
||||
arg5=arg6, arg6=arg7, arg7=arg8, arg8=arg9,\
|
||||
arg9=arg10, arg10=arg11, arg11=arg12,\
|
||||
arg12=arg13, arg13=arg14, arg14=0)
|
||||
arg5=arg6, arg6=arg7, arg7=arg8, arg8=arg9)
|
||||
# define VA_NEXT(var1,typ1) ((var1 = (typ1)arg1), VA_SHIFT(), var1)
|
||||
# define VA_END()
|
||||
# endif
|
||||
|
||||
607
util/lev_comp.y
607
util/lev_comp.y
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
/* NetHack 3.5 lev_main.c $NHDT-Date: 1428574133 2015/04/09 10:08:53 $ $NHDT-Branch: master $:$NHDT-Revision: 1.33 $ */
|
||||
/* NetHack 3.5 lev_main.c $NHDT-Date: 1428655166 2015/04/10 08:39:26 $ $NHDT-Branch: master $:$NHDT-Revision: 1.34 $ */
|
||||
/* NetHack 3.5 lev_main.c $Date: 2012/01/12 04:48:12 $ $Revision: 1.20 $ */
|
||||
/* SCCS Id: @(#)lev_main.c 3.5 2007/01/17 */
|
||||
/* Copyright (c) 1989 by Jean-Christophe Collet */
|
||||
@@ -8,8 +8,7 @@
|
||||
* This file contains the main function for the parser
|
||||
* and some useful functions needed by yacc
|
||||
*/
|
||||
#define SPEC_LEV /* for MPW */
|
||||
/* although, why don't we move those special defines here.. and in dgn_main? */
|
||||
#define SPEC_LEV /* for USE_OLDARGS (sp_lev.h) and for MPW (macconf.h) */
|
||||
|
||||
#define NEED_VARARGS
|
||||
#include "hack.h"
|
||||
@@ -1303,7 +1302,7 @@ sp_lev *sp;
|
||||
|
||||
mbuf[((max_hig-1) * max_len) + (max_len-1) + 1] = '\0';
|
||||
|
||||
add_opvars(sp, "siio", mbuf, max_hig, max_len, SPO_MAP);
|
||||
add_opvars(sp, "siio", VA_PASS4(mbuf, max_hig, max_len, SPO_MAP));
|
||||
|
||||
for (dy = 0; dy < max_hig; dy++)
|
||||
Free(tmpmap[dy]);
|
||||
|
||||
Reference in New Issue
Block a user