1 /* SCCS Id: @(#)system.h 3.4 2001/12/07 */ 2 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3 /* NetHack may be freely redistributed. See license for details. */ 4 5 #ifndef SYSTEM_H 6 #define SYSTEM_H 7 8 #if !defined(__cplusplus) && !defined(__GO32__) 9 10 #define E extern 11 12 /* some old <sys/types.h> may not define off_t and size_t; if your system is 13 * one of these, define them by hand below 14 */ 15 #if (defined(VMS) && !defined(__GNUC__)) || defined(MAC) 16 #include <types.h> 17 #else 18 # ifndef AMIGA 19 # ifndef __WATCOMC__ 20 #include <sys/types.h> 21 # endif 22 # endif 23 #endif 24 25 #if (defined(MICRO) && !defined(TOS)) || defined(ANCIENT_VAXC) 26 # if !defined(_SIZE_T) && !defined(__size_t) /* __size_t for CSet/2 */ 27 # define _SIZE_T 28 # if !((defined(MSDOS) || defined(OS2)) && defined(_SIZE_T_DEFINED)) /* MSC 5.1 */ 29 # if !(defined(__GNUC__) && defined(AMIGA)) 30 typedef unsigned int size_t; 31 # endif 32 # endif 33 # endif 34 #endif /* MICRO && !TOS */ 35 36 #if defined(__TURBOC__) || defined(MAC) 37 #include <time.h> /* time_t is not in <sys/types.h> */ 38 #endif 39 #if defined(ULTRIX) && !(defined(ULTRIX_PROTO) || defined(NHSTDC)) 40 /* The Ultrix v3.0 <sys/types.h> seems to be very wrong. */ 41 # define time_t long 42 #endif 43 44 #if defined(ULTRIX) || defined(VMS) 45 # define off_t long 46 #endif 47 #if defined(AZTEC) || defined(THINKC4) || defined(__TURBOC__) 48 typedef long off_t; 49 #endif 50 51 #endif /* !__cplusplus && !__GO32__ */ 52 53 /* You may want to change this to fit your system, as this is almost 54 * impossible to get right automatically. 55 * This is the type of signal handling functions. 56 */ 57 #if !defined(OS2) && (defined(_MSC_VER) || defined(__TURBOC__) || defined(__SC__) || defined(WIN32)) 58 # define SIG_RET_TYPE void (__cdecl *)(int) 59 #endif 60 #ifndef SIG_RET_TYPE 61 # if defined(NHSTDC) || defined(POSIX_TYPES) || defined(OS2) || defined(__DECC) 62 # define SIG_RET_TYPE void (*)(int) 63 # endif 64 #endif 65 #ifndef SIG_RET_TYPE 66 # if defined(ULTRIX) || defined(SUNOS4) || defined(SVR3) || defined(SVR4) 67 /* SVR3 is defined automatically by some systems */ 68 # define SIG_RET_TYPE void (*)() 69 # endif 70 #endif 71 #ifndef SIG_RET_TYPE /* BSD, SIII, SVR2 and earlier, Sun3.5 and earlier */ 72 # define SIG_RET_TYPE int (*)() 73 #endif 74 75 #if !defined(__cplusplus) && !defined(__GO32__) 76 77 #if defined(BSD) || defined(ULTRIX) || defined(RANDOM) 78 # ifdef random 79 # undef random 80 # endif 81 # if !defined(__SC__) && !defined(__CYGWIN__) && !defined(LINUX) 82 E long NDECL(random); 83 # endif 84 # if (!defined(SUNOS4) && !defined(bsdi) && !defined(__FreeBSD__)) || defined(RANDOM) 85 E void FDECL(srandom, (unsigned int)); 86 # else 87 # if !defined(bsdi) && !defined(LINUX) && !defined(__CYGWIN__) && !defined(__FreeBSD__) 88 E int FDECL(srandom, (unsigned int)); 89 # endif 90 # endif 91 #else 92 E long FDECL(lrand48, (void)); 93 E void FDECL(srand48, (long)); 94 #endif /* BSD || ULTRIX || RANDOM */ 95 96 #if !defined(BSD) || defined(ultrix) 97 /* real BSD wants all these to return int */ 98 # ifndef MICRO 99 E void FDECL(exit, (int)); 100 # endif /* MICRO */ 101 /* compensate for some CSet/2 bogosities */ 102 # if defined(OS2_CSET2) && defined(OS2_CSET2_VER_2) 103 # define open _open 104 # define close _close 105 # define read _read 106 # define write _write 107 # define lseek _lseek 108 # define chdir _chdir 109 # define getcwd _getcwd 110 # define setmode _setmode 111 # endif /* OS2_CSET2 && OS2_CSET2_VER_2 */ 112 /* If flex thinks that we're not __STDC__ it declares free() to return 113 int and we die. We must use __STDC__ instead of NHSTDC because 114 the former is naturally what flex tests for. */ 115 # if defined(__STDC__) || !defined(FLEX_SCANNER) 116 # ifndef OS2_CSET2 117 # ifndef MONITOR_HEAP 118 E void FDECL(free, (genericptr_t)); 119 # endif 120 # endif 121 # endif 122 #if !defined(__SASC_60) && !defined(_DCC) && !defined(__SC__) 123 # if defined(AMIGA) && !defined(AZTEC_50) && !defined(__GNUC__) 124 E int FDECL(perror, (const char *)); 125 # else 126 # if !(defined(ULTRIX_PROTO) && defined(__GNUC__)) 127 E void FDECL(perror, (const char *)); 128 # endif 129 # endif 130 #endif 131 #endif 132 #ifndef NeXT 133 #ifdef POSIX_TYPES 134 E void FDECL(qsort, (genericptr_t,size_t,size_t, 135 int(*)(const genericptr,const genericptr))); 136 #else 137 # if (defined(BSD) || defined(ULTRIX)) && (!defined(LINUX) && !defined(__CYGWIN__)) 138 E int qsort(); 139 # else 140 # if !defined(LATTICE) && !defined(AZTEC_50) 141 E void FDECL(qsort, (genericptr_t,size_t,size_t, 142 int(*)(const genericptr,const genericptr))); 143 # endif 144 # endif 145 #endif 146 #endif /* NeXT */ 147 148 #ifndef __SASC_60 149 #if !defined(AZTEC_50) && !defined(__GNUC__) 150 /* may already be defined */ 151 152 # ifdef ULTRIX 153 # ifdef ULTRIX_PROTO 154 E int FDECL(lseek, (int,off_t,int)); 155 # else 156 E long FDECL(lseek, (int,off_t,int)); 157 # endif 158 /* Ultrix 3.0 man page mistakenly says it returns an int. */ 159 E int FDECL(write, (int,char *,int)); 160 E int FDECL(link, (const char *, const char*)); 161 # else 162 # ifndef bsdi 163 E long FDECL(lseek, (int,long,int)); 164 # endif 165 # if defined(POSIX_TYPES) || defined(__TURBOC__) || defined(_MSC_VER) 166 # ifndef bsdi 167 E int FDECL(write, (int, const void *,unsigned)); 168 # endif 169 # else 170 # ifndef __MWERKS__ /* metrowerks defines write via universal headers */ 171 E int FDECL(write, (int,genericptr_t,unsigned)); 172 # endif 173 # endif 174 # endif /* ULTRIX */ 175 176 # ifdef OS2_CSET2 /* IBM CSet/2 */ 177 # ifdef OS2_CSET2_VER_1 178 E int FDECL(unlink, (char *)); 179 # else 180 # ifndef __SC__ 181 E int FDECL(unlink, (const char *)); 182 # else 183 E int FDECL(unlink, (const char *)); /* prototype is ok in ver >= 2 */ 184 # endif 185 # endif 186 # endif 187 188 #endif /* AZTEC_50 && __GNUC__ */ 189 190 #ifdef MAC 191 #ifndef __CONDITIONALMACROS__ /* universal headers */ 192 E int FDECL(close, (int)); /* unistd.h */ 193 E int FDECL(read, (int, char *, int)); /* unistd.h */ 194 E int FDECL(chdir, (const char *)); /* unistd.h */ 195 E char *FDECL(getcwd, (char *,int)); /* unistd.h */ 196 #endif 197 198 E int FDECL(open, (const char *,int)); 199 #endif 200 201 #if defined(MICRO) 202 E int FDECL(close, (int)); 203 #ifndef __EMX__ 204 E int FDECL(read, (int,genericptr_t,unsigned int)); 205 #endif 206 E int FDECL(open, (const char *,int,...)); 207 E int FDECL(dup2, (int, int)); 208 E int FDECL(setmode, (int,int)); 209 E int NDECL(kbhit); 210 # if !defined(_DCC) && !defined(__MINGW32__) 211 # if defined(__TURBOC__) || defined(_MSC_VER) 212 E int FDECL(chdir, (const char *)); 213 # else 214 # ifndef __EMX__ 215 E int FDECL(chdir, (char *)); 216 # endif 217 # endif 218 # ifndef __EMX__ 219 E char *FDECL(getcwd, (char *,int)); 220 # endif 221 # endif /* !_DCC */ 222 #endif 223 224 #ifdef ULTRIX 225 E int FDECL(close, (int)); 226 E int FDECL(atoi, (const char *)); 227 E int FDECL(chdir, (const char *)); 228 # if !defined(ULTRIX_CC20) && !defined(__GNUC__) 229 E int FDECL(chmod, (const char *,int)); 230 E mode_t FDECL(umask, (int)); 231 # endif 232 E int FDECL(read, (int,genericptr_t,unsigned)); 233 /* these aren't quite right, but this saves including lots of system files */ 234 E int FDECL(stty, (int,genericptr_t)); 235 E int FDECL(gtty, (int,genericptr_t)); 236 E int FDECL(ioctl, (int, int, char*)); 237 E int FDECL(isatty, (int)); /* 1==yes, 0==no, -1==error */ 238 #include <sys/file.h> 239 # if defined(ULTRIX_PROTO) || defined(__GNUC__) 240 E int NDECL(fork); 241 # else 242 E long NDECL(fork); 243 # endif 244 #endif /* ULTRIX */ 245 246 #ifdef VMS 247 # ifndef abs 248 E int FDECL(abs, (int)); 249 # endif 250 E int FDECL(atexit, (void (*)(void))); 251 E int FDECL(atoi, (const char *)); 252 E int FDECL(chdir, (const char *)); 253 E int FDECL(chown, (const char *,unsigned,unsigned)); 254 # ifdef __DECC_VER 255 E int FDECL(chmod, (const char *,mode_t)); 256 E mode_t FDECL(umask, (mode_t)); 257 # else 258 E int FDECL(chmod, (const char *,int)); 259 E int FDECL(umask, (int)); 260 # endif 261 /* #include <unixio.h> */ 262 E int FDECL(close, (int)); 263 E int VDECL(creat, (const char *,unsigned,...)); 264 E int FDECL(delete, (const char *)); 265 E int FDECL(fstat, ( /*_ int, stat_t * _*/ )); 266 E int FDECL(isatty, (int)); /* 1==yes, 0==no, -1==error */ 267 E long FDECL(lseek, (int,long,int)); 268 E int VDECL(open, (const char *,int,unsigned,...)); 269 E int FDECL(read, (int,genericptr_t,unsigned)); 270 E int FDECL(rename, (const char *,const char *)); 271 E int FDECL(stat, ( /*_ const char *,stat_t * _*/ )); 272 E int FDECL(write, (int,const genericptr,unsigned)); 273 #endif 274 275 #endif /* __SASC_60 */ 276 277 /* both old & new versions of Ultrix want these, but real BSD does not */ 278 #ifdef ultrix 279 E void abort(); 280 E void bcopy(); 281 # ifdef ULTRIX 282 E int FDECL(system, (const char *)); 283 # ifndef _UNISTD_H_ 284 E int FDECL(execl, (const char *, ...)); 285 # endif 286 # endif 287 #endif 288 #ifdef MICRO 289 E void NDECL(abort); 290 E void FDECL(_exit, (int)); 291 E int FDECL(system, (const char *)); 292 #endif 293 #if defined(HPUX) && !defined(_POSIX_SOURCE) 294 E long NDECL(fork); 295 #endif 296 297 #ifdef POSIX_TYPES 298 /* The POSIX string.h is required to define all the mem* and str* functions */ 299 #include <string.h> 300 #else 301 #if defined(SYSV) || defined(VMS) || defined(MAC) || defined(SUNOS4) 302 # if defined(NHSTDC) || (defined(VMS) && !defined(ANCIENT_VAXC)) 303 # if !defined(_AIX32) && !(defined(SUNOS4) && defined(__STDC__)) && !defined(LINUX) 304 /* Solaris unbundled cc (acc) */ 305 E int FDECL(memcmp, (const void *,const void *,size_t)); 306 E void *FDECL(memcpy, (void *, const void *, size_t)); 307 E void *FDECL(memset, (void *, int, size_t)); 308 # endif 309 # else 310 # ifndef memcmp /* some systems seem to macro these back to b*() */ 311 E int memcmp(); 312 # endif 313 # ifndef memcpy 314 E char *memcpy(); 315 # endif 316 # ifndef memset 317 E char *memset(); 318 # endif 319 # endif 320 #else 321 # ifdef HPUX 322 E int FDECL(memcmp, (char *,char *,int)); 323 E void *FDECL(memcpy, (char *,char *,int)); 324 E void *FDECL(memset, (char*,int,int)); 325 # endif 326 #endif 327 #endif /* POSIX_TYPES */ 328 329 #if defined(MICRO) && !defined(LATTICE) 330 # if defined(TOS) && defined(__GNUC__) 331 E int FDECL(memcmp, (const void *,const void *,size_t)); 332 E void *FDECL(memcpy, (void *,const void *,size_t)); 333 E void *FDECL(memset, (void *,int,size_t)); 334 # else 335 # if defined(AZTEC_50) || defined(NHSTDC) || defined(WIN32) 336 E int FDECL(memcmp, (const void *, const void *, size_t)); 337 E void *FDECL(memcpy, (void *, const void *, size_t)); 338 E void *FDECL(memset, (void *, int, size_t)); 339 # else 340 E int FDECL(memcmp, (char *,char *,unsigned int)); 341 E char *FDECL(memcpy, (char *,char *,unsigned int)); 342 E char *FDECL(memset, (char*,int,int)); 343 # endif /* AZTEC_50 || NHSTDC */ 344 # endif /* TOS */ 345 #endif /* MICRO */ 346 347 #if defined(BSD) && defined(ultrix) /* i.e., old versions of Ultrix */ 348 E void sleep(); 349 #endif 350 #if defined(ULTRIX) || defined(SYSV) 351 E unsigned sleep(unsigned); 352 #endif 353 #if defined(HPUX) 354 E unsigned int FDECL(sleep, (unsigned int)); 355 #endif 356 #ifdef VMS 357 E int FDECL(sleep, (unsigned)); 358 #endif 359 360 E char *FDECL(getenv, (const char *)); 361 E char *getlogin(void); 362 #if defined(HPUX) && !defined(_POSIX_SOURCE) 363 E long NDECL(getuid); 364 E long NDECL(getgid); 365 E long NDECL(getpid); 366 #else 367 # ifdef POSIX_TYPES 368 E pid_t NDECL(getpid); 369 E uid_t NDECL(getuid); 370 E gid_t NDECL(getgid); 371 # ifdef VMS 372 E pid_t NDECL(getppid); 373 # endif 374 # else /*!POSIX_TYPES*/ 375 # ifndef getpid /* Borland C defines getpid() as a macro */ 376 E int NDECL(getpid); 377 # endif 378 # ifdef VMS 379 E int NDECL(getppid); 380 E unsigned NDECL(getuid); 381 E unsigned NDECL(getgid); 382 # endif 383 # if defined(ULTRIX) && !defined(_UNISTD_H_) 384 E unsigned NDECL(getuid); 385 E unsigned NDECL(getgid); 386 E int FDECL(setgid, (int)); 387 E int FDECL(setuid, (int)); 388 # endif 389 # endif /*?POSIX_TYPES*/ 390 #endif /*?(HPUX && !_POSIX_SOURCE)*/ 391 392 /* add more architectures as needed */ 393 #if defined(HPUX) 394 #define seteuid(x) setreuid(-1, (x)); 395 #endif 396 397 /*# string(s).h #*/ 398 #if !defined(_XtIntrinsic_h) && !defined(POSIX_TYPES) 399 /* <X11/Intrinsic.h> #includes <string[s].h>; so does defining POSIX_TYPES */ 400 401 #if (defined(ULTRIX) || defined(NeXT)) && defined(__GNUC__) 402 #include <strings.h> 403 #else 404 E char *FDECL(strcpy, (char *,const char *)); 405 E char *FDECL(strncpy, (char *,const char *,size_t)); 406 E char *FDECL(strcat, (char *,const char *)); 407 E char *FDECL(strncat, (char *,const char *,size_t)); 408 E char *FDECL(strpbrk, (const char *,const char *)); 409 410 # if defined(SYSV) || defined(MICRO) || defined(MAC) || defined(VMS) || defined(HPUX) 411 E char *FDECL(strchr, (const char *,int)); 412 E char *FDECL(strrchr, (const char *,int)); 413 # else /* BSD */ 414 E char *FDECL(index, (const char *,int)); 415 E char *FDECL(rindex, (const char *,int)); 416 # endif 417 418 E int FDECL(strcmp, (const char *,const char *)); 419 E int FDECL(strncmp, (const char *,const char *,size_t)); 420 # if defined(MICRO) || defined(MAC) || defined(VMS) 421 E size_t FDECL(strlen, (const char *)); 422 # else 423 # ifdef HPUX 424 E unsigned int FDECL(strlen, (char *)); 425 # else 426 # if !(defined(ULTRIX_PROTO) && defined(__GNUC__)) && !defined(LINUX) 427 E int FDECL(strlen, (const char *)); 428 # endif 429 # endif /* HPUX */ 430 # endif /* MICRO */ 431 #endif /* ULTRIX */ 432 433 #endif /* !_XtIntrinsic_h_ && !POSIX_TYPES */ 434 435 #if defined(ULTRIX) && defined(__GNUC__) 436 E char *FDECL(index, (const char *,int)); 437 E char *FDECL(rindex, (const char *,int)); 438 #endif 439 440 /* Old varieties of BSD have char *sprintf(). 441 * Newer varieties of BSD have int sprintf() but allow for the old char *. 442 * Several varieties of SYSV and PC systems also have int sprintf(). 443 * If your system doesn't agree with this breakdown, you may want to change 444 * this declaration, especially if your machine treats the types differently. 445 * If your system defines sprintf, et al, in stdio.h, add to the initial 446 * #if. 447 */ 448 #if defined(ULTRIX) || defined(__DECC) || defined(__SASC_60) || defined(WIN32) 449 #define SPRINTF_PROTO 450 #endif 451 #if (defined(SUNOS4) && defined(__STDC__)) || defined(_AIX32) 452 #define SPRINTF_PROTO 453 #endif 454 #if defined(TOS) || defined(AZTEC_50) || defined(__sgi) || defined(__GNUC__) 455 /* problem with prototype mismatches */ 456 #define SPRINTF_PROTO 457 #endif 458 #if defined(__MWERKS__) || defined(__SC__) 459 /* Metrowerks already has a prototype for sprintf() */ 460 # define SPRINTF_PROTO 461 #endif 462 463 #ifndef SPRINTF_PROTO 464 # if defined(POSIX_TYPES) || defined(DGUX) || defined(NeXT) || !defined(BSD) 465 E int FDECL(sprintf, (char *,const char *,...)); 466 # else 467 # define OLD_SPRINTF 468 E char *sprintf(); 469 # endif 470 #endif 471 #ifdef SPRINTF_PROTO 472 # undef SPRINTF_PROTO 473 #endif 474 475 #ifndef __SASC_60 476 #ifdef NEED_VARARGS 477 # if defined(USE_STDARG) || defined(USE_VARARGS) 478 # if !defined(SVR4) && !defined(apollo) 479 # if !(defined(ULTRIX_PROTO) && defined(__GNUC__)) 480 # if !(defined(SUNOS4) && defined(__STDC__)) /* Solaris unbundled cc (acc) */ 481 E int FDECL(vsprintf, (char *, const char *, va_list)); 482 E int FDECL(vfprintf, (FILE *, const char *, va_list)); 483 E int FDECL(vprintf, (const char *, va_list)); 484 # endif 485 # endif 486 # endif 487 # else 488 # define vprintf printf 489 # define vfprintf fprintf 490 # define vsprintf sprintf 491 # endif 492 #endif /* NEED_VARARGS */ 493 #endif 494 495 496 #ifdef MICRO 497 E int FDECL(tgetent, (const char *,const char *)); 498 E void FDECL(tputs, (const char *,int,int (*)())); 499 E int FDECL(tgetnum, (const char *)); 500 E int FDECL(tgetflag, (const char *)); 501 E char *FDECL(tgetstr, (const char *,char **)); 502 E char *FDECL(tgoto, (const char *,int,int)); 503 #else 504 # if ! (defined(HPUX) && defined(_POSIX_SOURCE)) 505 E int FDECL(tgetent, (char *,const char *)); 506 E void FDECL(tputs, (const char *,int,int (*)())); 507 # endif 508 E int FDECL(tgetnum, (const char *)); 509 E int FDECL(tgetflag, (const char *)); 510 E char *FDECL(tgetstr, (const char *,char **)); 511 E char *FDECL(tgoto, (const char *,int,int)); 512 #endif 513 514 #ifdef ALLOC_C 515 E genericptr_t FDECL(malloc, (size_t)); 516 #endif 517 518 /* time functions */ 519 520 # ifndef LATTICE 521 # if !(defined(ULTRIX_PROTO) && defined(__GNUC__)) 522 # ifndef __WATCOMC__ 523 E struct tm *FDECL(localtime, (const time_t *)); 524 # endif 525 # endif 526 # endif 527 528 # if defined(ULTRIX) || (defined(BSD) && defined(POSIX_TYPES)) || defined(SYSV) || defined(MICRO) || defined(VMS) || defined(MAC) || (defined(HPUX) && defined(_POSIX_SOURCE)) 529 # ifndef __WATCOMC__ 530 E time_t FDECL(time, (time_t *)); 531 # endif 532 # else 533 E long FDECL(time, (time_t *)); 534 # endif /* ULTRIX */ 535 536 #ifdef VMS 537 /* used in makedefs.c, but missing from gcc-vms's <time.h> */ 538 E char *FDECL(ctime, (const time_t *)); 539 #endif 540 541 542 #ifdef MICRO 543 # ifdef abs 544 # undef abs 545 # endif 546 E int FDECL(abs, (int)); 547 # ifdef atoi 548 # undef atoi 549 # endif 550 E int FDECL(atoi, (const char *)); 551 #endif 552 553 #undef E 554 555 #endif /* !__cplusplus && !__GO32__ */ 556 557 #endif /* SYSTEM_H */ 558