1 /*	SCCS Id: @(#)tradstdc.h 3.4	1993/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) || defined(__BORLANDC__)
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(macintosh) && (defined(__SC__) || defined(__MRC__))
207 #define WIDENED_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 */
274