1 /* system.h - Get common system includes and various definitions and
2 declarations based on autoconf macros.
3 Copyright (C) 1998, 1999 Free Software Foundation, Inc.
5 This file is part of GNU CC.
7 GNU CC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
12 GNU CC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with GNU CC; see the file COPYING. If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
22 #ifndef __GCC_SYSTEM_H__
23 #define __GCC_SYSTEM_H__
25 /* Autoconf will possibly define the `inline' or `const' keywords as
26 macros, however this is only valid for the stage1 compiler. If we
27 detect a modern version of gcc, unconditionally reset the values.
28 This makes sure the right thing happens in stage2 and later. We
29 need to do this before any header files in case they use these
30 keywords or conflicts might occur. */
31 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
34 # define inline __inline__ /* Modern gcc can use `__inline__' freely. */
35 #endif /* GCC >= 2.7 */
37 /* We must include stdarg.h/varargs.h before stdio.h. */
38 #ifdef ANSI_PROTOTYPES
46 /* Define a generic NULL if one hasn't already been defined. */
51 /* The compiler is not a multi-threaded application and therefore we
52 do not have to use the locking functions. */
53 #ifdef HAVE_PUTC_UNLOCKED
55 # define putc(C, Stream) putc_unlocked (C, Stream)
57 #ifdef HAVE_FPUTC_UNLOCKED
59 # define fputc(C, Stream) fputc_unlocked (C, Stream)
61 #ifdef HAVE_FPUTS_UNLOCKED
63 # define fputs(String, Stream) fputs_unlocked (String, Stream)
68 /* Jim Meyering writes:
70 "... Some ctype macros are valid only for character codes that
71 isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
72 using /bin/cc or gcc but without giving an ansi option). So, all
73 ctype uses should be through macros like ISPRINT... If
74 STDC_HEADERS is defined, then autoconf has verified that the ctype
75 macros don't need to be guarded with references to isascii. ...
76 Defining isascii to 1 should let any compiler worth its salt
77 eliminate the && through constant folding."
81 "... Furthermore, isupper(c) etc. have an undefined result if c is
82 outside the range -1 <= c <= 255. One is tempted to write isupper(c)
83 with c being of type `char', but this is wrong if c is an 8-bit
84 character >= 128 which gets sign-extended to a negative value.
85 The macro ISUPPER protects against this as well." */
87 #if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
88 # define IN_CTYPE_DOMAIN(c) 1
90 # define IN_CTYPE_DOMAIN(c) isascii(c)
94 # define ISBLANK(c) (IN_CTYPE_DOMAIN (c) && isblank (c))
96 # define ISBLANK(c) ((c) == ' ' || (c) == '\t')
99 # define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isgraph (c))
101 # define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isprint (c) && !isspace (c))
104 #define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c))
105 #define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c))
106 #define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c))
107 #define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c))
108 #define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c))
109 #define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (c))
110 #define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
111 #define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))
112 #define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c))
113 #define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))
115 /* ISDIGIT differs from ISDIGIT_LOCALE, as follows:
116 - Its arg may be any int or unsigned int; it need not be an unsigned char.
117 - It's guaranteed to evaluate its argument exactly once.
118 - It's typically faster.
119 Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that
120 only '0' through '9' are digits. Prefer ISDIGIT to ISDIGIT_LOCALE unless
121 it's important to use the locale's definition of `digit' even when the
122 host does not conform to Posix. */
123 #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9)
126 #include <sys/types.h>
133 #ifdef STRING_WITH_STRINGS
135 # include <strings.h>
137 # ifdef HAVE_STRING_H
140 # ifdef HAVE_STRINGS_H
141 # include <strings.h>
154 #ifdef HAVE_SYS_PARAM_H
155 # include <sys/param.h>
162 #ifdef TIME_WITH_SYS_TIME
163 # include <sys/time.h>
167 # include <sys/time.h>
178 # ifdef HAVE_SYS_FILE_H
179 # include <sys/file.h>
201 /* Some systems define these in, e.g., param.h. We undefine these names
202 here to avoid the warnings. We prefer to use our definitions since we
203 know they are correct. */
207 #define MIN(X,Y) ((X) < (Y) ? (X) : (Y))
208 #define MAX(X,Y) ((X) > (Y) ? (X) : (Y))
210 #ifdef HAVE_SYS_WAIT_H
211 #include <sys/wait.h>
215 #define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f)
218 #define WTERMSIG(S) ((S) & 0x7f)
221 #define WIFEXITED(S) (((S) & 0xff) == 0)
224 #define WEXITSTATUS(S) (((S) & 0xff00) >> 8)
231 # ifdef NEED_DECLARATION_BCOPY
232 extern void bcopy ();
234 # else /* ! HAVE_BCOPY */
235 # define bcopy(src,dst,len) memmove((dst),(src),(len))
241 # ifdef NEED_DECLARATION_BCMP
244 # else /* ! HAVE_BCMP */
245 # define bcmp(left,right,len) memcmp ((left),(right),(len))
251 # ifdef NEED_DECLARATION_BZERO
252 extern void bzero ();
254 # else /* ! HAVE_BZERO */
255 # define bzero(dst,len) memset ((dst),0,(len))
261 # ifdef NEED_DECLARATION_INDEX
262 extern char *index ();
264 # else /* ! HAVE_INDEX */
265 # define index strchr
271 # ifdef NEED_DECLARATION_RINDEX
272 extern char *rindex ();
274 # else /* ! HAVE_RINDEX */
275 # define rindex strrchr
279 #ifdef NEED_DECLARATION_ATOF
280 extern double atof ();
283 #ifdef NEED_DECLARATION_ATOL
287 #ifdef NEED_DECLARATION_FREE
291 #ifdef NEED_DECLARATION_GETCWD
292 extern char *getcwd ();
295 #ifdef NEED_DECLARATION_GETENV
296 extern char *getenv ();
299 #ifdef NEED_DECLARATION_GETWD
300 extern char *getwd ();
303 #ifdef NEED_DECLARATION_SBRK
304 extern char *sbrk ();
308 # ifdef NEED_DECLARATION_STRERROR
310 extern char *strerror ();
313 #else /* ! HAVE_STRERROR */
315 extern char *sys_errlist[];
316 #endif /* HAVE_STRERROR */
318 #ifdef HAVE_STRSIGNAL
319 # ifdef NEED_DECLARATION_STRSIGNAL
321 extern char * strsignal ();
324 #else /* ! HAVE_STRSIGNAL */
325 # ifndef SYS_SIGLIST_DECLARED
326 # ifndef NO_SYS_SIGLIST
327 extern char * sys_siglist[];
330 #endif /* HAVE_STRSIGNAL */
332 #ifdef HAVE_GETRLIMIT
333 # ifdef NEED_DECLARATION_GETRLIMIT
335 extern int getrlimit ();
340 #ifdef HAVE_SETRLIMIT
341 # ifdef NEED_DECLARATION_SETRLIMIT
343 extern int setrlimit ();
348 /* HAVE_VOLATILE only refers to the stage1 compiler. We also check
349 __STDC__ and assume gcc sets it and has volatile in stage >=2. */
350 #if !defined(HAVE_VOLATILE) && !defined(__STDC__) && !defined(volatile)
354 /* Redefine abort to report an internal error w/o coredump, and reporting the
355 location of the error in the source file. */
359 #ifndef USE_SYSTEM_ABORT
360 #define USE_SYSTEM_ABORT
361 #endif /* !USE_SYSTEM_ABORT */
362 #endif /* !__GNUC__ */
363 #endif /* !__STDC__ */
365 #ifdef USE_SYSTEM_ABORT
366 # ifdef NEED_DECLARATION_ABORT
367 extern void abort ();
370 #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7)
373 "%s:%d: Internal compiler error\n", __FILE__, __LINE__), \
374 exit (FATAL_EXIT_CODE))
379 "%s:%d: Internal compiler error in function %s\n" \
380 "Please submit a full bug report to `egcs-bugs@egcs.cygnus.com'.\n" \
381 "See <URL:http://egcs.cygnus.com/faq.html#bugreport> for details.\n", \
382 __FILE__, __LINE__, __PRETTY_FUNCTION__), \
383 exit (FATAL_EXIT_CODE))
385 #endif /* recent gcc */
386 #endif /* USE_SYSTEM_ABORT */
390 /* Define a STRINGIFY macro that's right for ANSI or traditional C.
391 HAVE_CPP_STRINGIFY only refers to the stage1 compiler. Assume that
392 (non-traditional) gcc used in stage2 or later has this feature.
394 Note: if the argument passed to STRINGIFY is itself a macro, eg
395 #define foo bar, STRINGIFY(foo) will produce "foo", not "bar".
396 Although the __STDC__ case could be made to expand this via a layer
397 of indirection, the traditional C case can not do so. Therefore
398 this behavior is not supported. */
400 # if defined(HAVE_CPP_STRINGIFY) || (defined(__GNUC__) && defined(__STDC__))
401 # define STRINGIFY(STRING) #STRING
403 # define STRINGIFY(STRING) "STRING"
405 #endif /* ! STRINGIFY */
408 # include <sys/stat.h>
411 /* Test if something is a normal file. */
413 #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
416 /* Test if something is a directory. */
418 #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
421 /* Test if something is a character special file. */
423 #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
426 /* Test if something is a socket. */
429 # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
431 # define S_ISSOCK(m) 0
435 /* Test if something is a FIFO. */
438 # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
440 # define S_ISFIFO(m) 0
444 /* Approximate O_NONBLOCK. */
446 #define O_NONBLOCK O_NDELAY
449 /* Approximate O_NOCTTY. */
454 /* Get libiberty declarations. */
455 #include "libiberty.h"
457 #if defined (ANSI_PROTOTYPES)
458 # define PRINTF_PROTO(ARGS, m, n) PVPROTO (ARGS) ATTRIBUTE_PRINTF(m, n)
460 # define PRINTF_PROTO(ARGS, m, n) () ATTRIBUTE_PRINTF(m, n)
462 #define PRINTF_PROTO_1(ARGS) PRINTF_PROTO(ARGS, 1, 2)
463 #define PRINTF_PROTO_2(ARGS) PRINTF_PROTO(ARGS, 2, 3)
464 #define PRINTF_PROTO_3(ARGS) PRINTF_PROTO(ARGS, 3, 4)
465 #define PRINTF_PROTO_4(ARGS) PRINTF_PROTO(ARGS, 4, 5)
468 #endif /* __GCC_SYSTEM_H__ */