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 */