1    | /*	SCCS Id: @(#)tradstdc.h 3.3	93/05/30	*/
2    | /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
3    | /* NetHack may be freely redistributed.  See license for details. */
4    | 
5    | #ifndef TRADSTDC_H
6    | #define TRADSTDC_H
7    | 
8    | #if defined(DUMB) && !defined(NOVOID)
9    | #define NOVOID
10   | #endif
11   | 
12   | #ifdef NOVOID
13   | #define void int
14   | #endif
15   | 
16   | /*
17   |  * Borland C provides enough ANSI C compatibility in its Borland C++
18   |  * mode to warrant this.  But it does not set __STDC__ unless it compiles
19   |  * in its ANSI keywords only mode, which prevents use of <dos.h> and
20   |  * far pointer use.
21   |  */
22   | #if (defined(__STDC__) || defined(__TURBOC__)) && !defined(NOTSTDC)
23   | #define NHSTDC
24   | #endif
25   | 
26   | #if defined(ultrix) && defined(__STDC__) && !defined(__LANGUAGE_C)
27   | /* Ultrix seems to be in a constant state of flux.  This check attempts to
28   |  * set up ansi compatibility if it wasn't set up correctly by the compiler.
29   |  */
30   | #ifdef mips
31   | #define __mips mips
32   | #endif
33   | 
34   | #ifdef LANGUAGE_C
35   | #define __LANGUAGE_C LANGUAGE_C
36   | #endif
37   | 
38   | #endif
39   | 
40   | /*
41   |  * ANSI X3J11 detection.
42   |  * Makes substitutes for compatibility with the old C standard.
43   |  */
44   | 
45   | /* Decide how to handle variable parameter lists:
46   |  * USE_STDARG means use the ANSI <stdarg.h> facilities (only ANSI compilers
47   |  * should do this, and only if the library supports it).
48   |  * USE_VARARGS means use the <varargs.h> facilities.  Again, this should only
49   |  * be done if the library supports it.	ANSI is *not* required for this.
50   |  * Otherwise, the kludgy old methods are used.
51   |  * The defaults are USE_STDARG for ANSI compilers, and USE_OLDARGS for
52   |  * others.
53   |  */
54   | 
55   | /* #define USE_VARARGS */	/* use <varargs.h> instead of <stdarg.h> */
56   | /* #define USE_OLDARGS */	/* don't use any variable argument facilites */
57   | 
58   | #if defined(apollo)		/* Apollos have stdarg(3) but not stdarg.h */
59   | # define USE_VARARGS
60   | #endif
61   | 
62   | #if defined(NHSTDC) || defined(ULTRIX_PROTO) || defined(MAC)
63   | # if !defined(USE_VARARGS) && !defined(USE_OLDARGS) && !defined(USE_STDARG)
64   | #   define USE_STDARG
65   | # endif
66   | #endif
67   | 
68   | #ifdef NEED_VARARGS		/* only define these if necessary */
69   | #ifdef USE_STDARG
70   | #include <stdarg.h>
71   | # define VA_DECL(typ1,var1)	(typ1 var1, ...) { va_list the_args;
72   | # define VA_DECL2(typ1,var1,typ2,var2)	\
73   | 	(typ1 var1, typ2 var2, ...) { va_list the_args;
74   | # define VA_INIT(var1,typ1)
75   | # define VA_NEXT(var1,typ1)	var1 = va_arg(the_args, typ1)
76   | # define VA_ARGS		the_args
77   | # define VA_START(x)		va_start(the_args, x)
78   | # define VA_END()		va_end(the_args)
79   | # if defined(ULTRIX_PROTO) && !defined(_VA_LIST_)
80   | #  define _VA_LIST_	/* prevents multiple def in stdio.h */
81   | # endif
82   | #else
83   | # ifdef USE_VARARGS
84   | #include <varargs.h>
85   | #  define VA_DECL(typ1,var1)	(va_alist) va_dcl {\
86   | 		va_list the_args; typ1 var1;
87   | #  define VA_DECL2(typ1,var1,typ2,var2) (va_alist) va_dcl {\
88   | 		va_list the_args; typ1 var1; typ2 var2;
89   | #  define VA_ARGS		the_args
90   | #  define VA_START(x)		va_start(the_args)
91   | #  define VA_INIT(var1,typ1)	var1 = va_arg(the_args, typ1)
92   | #  define VA_NEXT(var1,typ1)	var1 = va_arg(the_args,typ1)
93   | #  define VA_END()		va_end(the_args)
94   | # else
95   | #   define VA_ARGS	arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9
96   | #   define VA_DECL(typ1,var1)  (var1,VA_ARGS) typ1 var1; \
97   | 	char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9; {
98   | #   define VA_DECL2(typ1,var1,typ2,var2)  (var1,var2,VA_ARGS) \
99   | 	typ1 var1; typ2 var2;\
100  | 	char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9; {
101  | #   define VA_START(x)
102  | #   define VA_INIT(var1,typ1)
103  | #   define VA_END()
104  | # endif
105  | #endif
106  | #endif /* NEED_VARARGS */
107  | 
108  | #if defined(NHSTDC) || defined(MSDOS) || defined(MAC) || defined(ULTRIX_PROTO) || defined(__BEOS__)
109  | 
110  | /*
111  |  * Used for robust ANSI parameter forward declarations:
112  |  * int VDECL(sprintf, (char *, const char *, ...));
113  |  *
114  |  * NDECL() is used for functions with zero arguments;
115  |  * FDECL() is used for functions with a fixed number of arguments;
116  |  * VDECL() is used for functions with a variable number of arguments.
117  |  * Separate macros are needed because ANSI will mix old-style declarations
118  |  * with prototypes, except in the case of varargs, and the OVERLAY-specific
119  |  * trampoli.* mechanism conflicts with the ANSI <<f(void)>> syntax.
120  |  */
121  | 
122  | # define NDECL(f)	f(void) /* overridden later if USE_TRAMPOLI set */
123  | 
124  | # define FDECL(f,p)	f p
125  | 
126  | # if defined(MSDOS) || defined(USE_STDARG)
127  | #  define VDECL(f,p)	f p
128  | # else
129  | #  define VDECL(f,p)	f()
130  | # endif
131  | 
132  | /* generic pointer, always a macro; genericptr_t is usually a typedef */
133  | # define genericptr	void *
134  | 
135  | # if (defined(ULTRIX_PROTO) && !defined(__GNUC__)) || defined(OS2_CSET2)
136  | /* Cover for Ultrix on a DECstation with 2.0 compiler, which coredumps on
137  |  *   typedef void * genericptr_t;
138  |  *   extern void a(void(*)(int, genericptr_t));
139  |  * Using the #define is OK for other compiler versions too.
140  |  */
141  | /* And IBM CSet/2.  The redeclaration of free hoses the compile. */
142  | #  define genericptr_t	genericptr
143  | # else
144  | #  if !defined(NHSTDC) && !defined(MAC)
145  | #   define const
146  | #   define signed
147  | #   define volatile
148  | #  endif
149  | # endif
150  | 
151  | /*
152  |  * Suppress `const' if necessary and not handled elsewhere.
153  |  * Don't use `#if defined(xxx) && !defined(const)'
154  |  * because some compilers choke on `defined(const)'.
155  |  * This has been observed with Lattice, MPW, and High C.
156  |  */
157  | # if (defined(ULTRIX_PROTO) && !defined(NHSTDC)) || defined(apollo)
158  | 	/* the system header files don't use `const' properly */
159  | #  ifndef const
160  | #   define const
161  | #  endif
162  | # endif
163  | 
164  | #else /* NHSTDC */	/* a "traditional" C  compiler */
165  | 
166  | # define NDECL(f)	f()
167  | # define FDECL(f,p)	f()
168  | # define VDECL(f,p)	f()
169  | 
170  | # if defined(AMIGA) || defined(HPUX) || defined(POSIX_TYPES) || defined(__DECC)
171  | #  define genericptr	void *
172  | # endif
173  | # ifndef genericptr
174  | #  define genericptr	char *
175  | # endif
176  | 
177  | /*
178  |  * Traditional C compilers don't have "signed", "const", or "volatile".
179  |  */
180  | # define signed
181  | # define const
182  | # define volatile
183  | 
184  | #endif /* NHSTDC */
185  | 
186  | 
187  | #ifndef genericptr_t
188  | typedef genericptr genericptr_t;	/* (void *) or (char *) */
189  | #endif
190  | 
191  | 
192  | /*
193  |  * According to ANSI, prototypes for old-style declarations must widen the
194  |  * arguments to int.  However, the MSDOS compilers accept shorter arguments
195  |  * (char, short, etc.) in prototypes and do typechecking with them.  Therefore
196  |  * this mess to allow the better typechecking while also allowing some
197  |  * prototypes for the ANSI compilers so people quit trying to fix the
198  |  * prototypes to match the standard and thus lose the typechecking.
199  |  */
200  | #if defined(MSDOS) && !defined(__GO32__)
201  | #define UNWIDENED_PROTOTYPES
202  | #endif
203  | #if defined(AMIGA) && !defined(AZTEC_50)
204  | #define UNWIDENED_PROTOTYPES
205  | #endif
206  | #if defined(applec)
207  | #define UNWIDENED_PROTOTYPES
208  | #endif
209  | #if defined(__MWERKS__) && defined(__BEOS__)
210  | #define UNWIDENED_PROTOTYPES
211  | #endif
212  | #if defined(WIN32)
213  | #define UNWIDENED_PROTOTYPES
214  | #endif
215  | 
216  | #if defined(ULTRIX_PROTO) && defined(ULTRIX_CC20)
217  | #define UNWIDENED_PROTOTYPES
218  | #endif
219  | #if defined(apollo)
220  | #define UNWIDENED_PROTOTYPES
221  | #endif
222  | 
223  | #ifndef UNWIDENED_PROTOTYPES
224  | # if defined(NHSTDC) || defined(ULTRIX_PROTO) || defined(THINK_C)
225  | # define WIDENED_PROTOTYPES
226  | # endif
227  | #endif
228  | 
229  | #if 0
230  | /* The problem below is still the case through 4.0.5F, but the suggested
231  |  * compiler flags in the Makefiles suppress the nasty messages, so we don't
232  |  * need to be quite so drastic.
233  |  */
234  | #if defined(__sgi) && !defined(__GNUC__)
235  | /*
236  |  * As of IRIX 4.0.1, /bin/cc claims to be an ANSI compiler, but it thinks
237  |  * it's impossible for a prototype to match an old-style definition with
238  |  * unwidened argument types.  Thus, we have to turn off all NetHack
239  |  * prototypes, and avoid declaring several system functions, since the system
240  |  * include files have prototypes and the compiler also complains that
241  |  * prototyped and unprototyped declarations don't match.
242  |  */
243  | # undef NDECL
244  | # undef FDECL
245  | # undef VDECL
246  | # define NDECL(f)	f()
247  | # define FDECL(f,p)	f()
248  | # define VDECL(f,p)	f()
249  | #endif
250  | #endif
251  | 
252  | 
253  | 	/* MetaWare High-C defaults to unsigned chars */
254  | 	/* AIX 3.2 needs this also */
255  | #if defined(__HC__) || defined(_AIX32)
256  | # undef signed
257  | #endif
258  | 
259  | 
260  | /*
261  |  * Allow gcc2 to check parameters of printf-like calls with -Wformat;
262  |  * append this to a prototype declaration (see pline() in extern.h).
263  |  */
264  | #ifdef __GNUC__
265  | # if __GNUC__ >= 2
266  | #define PRINTF_F(f,v) __attribute__ ((format (printf, f, v)))
267  | # endif
268  | #endif
269  | #ifndef PRINTF_F
270  | #define PRINTF_F(f,v)
271  | #endif
272  | 
273  | #endif /* TRADSTDC_H */