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
188typedef 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