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