]>
Commit | Line | Data |
---|---|---|
7014838c | 1 | /* Get common system includes and various definitions and declarations based |
2 | on autoconf macros. | |
b88cf7f6 | 3 | Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. |
073609a4 | 4 | |
41e3445a | 5 | This file is part of GNU CC. |
6 | ||
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) | |
10 | any later version. | |
11 | ||
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. | |
16 | ||
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. */ | |
073609a4 | 21 | |
7014838c | 22 | |
073609a4 | 23 | #ifndef __GCC_SYSTEM_H__ |
24 | #define __GCC_SYSTEM_H__ | |
25 | ||
57f194be | 26 | /* This is the location of the online document giving information how |
27 | to report bugs. If you change this string, also check for strings | |
28 | not under control of the preprocessor. */ | |
29 | #define GCCBUGURL "<URL:http://www.gnu.org/software/gcc/bugs.html>" | |
30 | ||
32e0908a | 31 | /* We must include stdarg.h/varargs.h before stdio.h. */ |
7bca031c | 32 | #ifdef ANSI_PROTOTYPES |
32e0908a | 33 | #include <stdarg.h> |
34 | #else | |
35 | #include <varargs.h> | |
36 | #endif | |
37 | ||
16bf93e5 | 38 | #ifndef va_copy |
39 | # ifdef __va_copy | |
40 | # define va_copy(d,s) __va_copy((d),(s)) | |
41 | # else | |
42 | # define va_copy(d,s) ((d) = (s)) | |
43 | # endif | |
44 | #endif | |
45 | ||
073609a4 | 46 | #include <stdio.h> |
2e9695c1 | 47 | |
48 | /* Define a generic NULL if one hasn't already been defined. */ | |
49 | #ifndef NULL | |
50 | #define NULL 0 | |
51 | #endif | |
52 | ||
1bcf5ab8 | 53 | /* The compiler is not a multi-threaded application and therefore we |
f29fb72e | 54 | do not have to use the locking functions. |
55 | ||
07c927cb | 56 | HAVE_DECL_PUTC_UNLOCKED actually indicates whether or not the IO |
57 | code is multi-thread safe by default. If it is set to 0, then do | |
58 | not worry about using the _unlocked functions. | |
f29fb72e | 59 | |
60 | fputs_unlocked is an extension and needs to be prototyped specially. */ | |
61 | ||
07c927cb | 62 | #if defined HAVE_PUTC_UNLOCKED && (defined (HAVE_DECL_PUTC_UNLOCKED) && HAVE_DECL_PUTC_UNLOCKED) |
1bcf5ab8 | 63 | # undef putc |
64 | # define putc(C, Stream) putc_unlocked (C, Stream) | |
65 | #endif | |
07c927cb | 66 | #if defined HAVE_FPUTC_UNLOCKED && (defined (HAVE_DECL_PUTC_UNLOCKED) && HAVE_DECL_PUTC_UNLOCKED) |
1bcf5ab8 | 67 | # undef fputc |
68 | # define fputc(C, Stream) fputc_unlocked (C, Stream) | |
69 | #endif | |
07c927cb | 70 | #if defined HAVE_FPUTS_UNLOCKED && (defined (HAVE_DECL_PUTC_UNLOCKED) && HAVE_DECL_PUTC_UNLOCKED) |
1bcf5ab8 | 71 | # undef fputs |
72 | # define fputs(String, Stream) fputs_unlocked (String, Stream) | |
07c927cb | 73 | # if defined (HAVE_DECL_FPUTS_UNLOCKED) && !HAVE_DECL_FPUTS_UNLOCKED |
0019492d | 74 | extern int fputs_unlocked PARAMS ((const char *, FILE *)); |
f29fb72e | 75 | # endif |
1bcf5ab8 | 76 | #endif |
77 | ||
073609a4 | 78 | #include <ctype.h> |
79 | ||
80 | /* Jim Meyering writes: | |
89f7f2db | 81 | |
073609a4 | 82 | "... Some ctype macros are valid only for character codes that |
83 | isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when | |
84 | using /bin/cc or gcc but without giving an ansi option). So, all | |
85 | ctype uses should be through macros like ISPRINT... If | |
86 | STDC_HEADERS is defined, then autoconf has verified that the ctype | |
87 | macros don't need to be guarded with references to isascii. ... | |
88 | Defining isascii to 1 should let any compiler worth its salt | |
89 | eliminate the && through constant folding." | |
89f7f2db | 90 | |
073609a4 | 91 | Bruno Haible adds: |
89f7f2db | 92 | |
073609a4 | 93 | "... Furthermore, isupper(c) etc. have an undefined result if c is |
94 | outside the range -1 <= c <= 255. One is tempted to write isupper(c) | |
95 | with c being of type `char', but this is wrong if c is an 8-bit | |
96 | character >= 128 which gets sign-extended to a negative value. | |
97 | The macro ISUPPER protects against this as well." */ | |
89f7f2db | 98 | |
38330f30 | 99 | #if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII)) || defined(HOST_EBCDIC) |
073609a4 | 100 | # define IN_CTYPE_DOMAIN(c) 1 |
101 | #else | |
102 | # define IN_CTYPE_DOMAIN(c) isascii(c) | |
103 | #endif | |
89f7f2db | 104 | |
fa8da10b | 105 | /* The ctype functions are often implemented as macros which do |
106 | lookups in arrays using the parameter as the offset. If the ctype | |
107 | function parameter is a char, then gcc will (appropriately) warn | |
108 | that a "subscript has type char". Using a (signed) char as a subscript | |
109 | is bad because you may get negative offsets and thus it is not 8-bit | |
110 | safe. The CTYPE_CONV macro ensures that the parameter is cast to an | |
111 | unsigned char when a char is passed in. When an int is passed in, the | |
112 | parameter is left alone so we don't lose EOF. | |
113 | */ | |
114 | ||
115 | #define CTYPE_CONV(CH) \ | |
116 | (sizeof(CH) == sizeof(unsigned char) ? (int)(unsigned char)(CH) : (int)(CH)) | |
117 | ||
118 | ||
119 | /* WARNING! The argument to the ctype replacement macros below is | |
120 | evaluated more than once so it must not have side effects! */ | |
121 | ||
073609a4 | 122 | #ifdef isblank |
fa8da10b | 123 | # define ISBLANK(c) (IN_CTYPE_DOMAIN (c) && isblank (CTYPE_CONV(c))) |
073609a4 | 124 | #else |
125 | # define ISBLANK(c) ((c) == ' ' || (c) == '\t') | |
126 | #endif | |
127 | #ifdef isgraph | |
fa8da10b | 128 | # define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isgraph (CTYPE_CONV(c))) |
073609a4 | 129 | #else |
fa8da10b | 130 | # define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isprint (CTYPE_CONV(c)) && !isspace (CTYPE_CONV(c))) |
073609a4 | 131 | #endif |
89f7f2db | 132 | |
fa8da10b | 133 | #define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (CTYPE_CONV(c))) |
134 | #define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (CTYPE_CONV(c))) | |
135 | #define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (CTYPE_CONV(c))) | |
136 | #define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (CTYPE_CONV(c))) | |
137 | #define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (CTYPE_CONV(c))) | |
138 | #define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (CTYPE_CONV(c))) | |
139 | #define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (CTYPE_CONV(c))) | |
140 | #define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (CTYPE_CONV(c))) | |
141 | #define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (CTYPE_CONV(c))) | |
142 | #define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (CTYPE_CONV(c))) | |
143 | ||
144 | #if STDC_HEADERS | |
145 | # define TOLOWER(c) (tolower (CTYPE_CONV(c))) | |
146 | # define TOUPPER(c) (toupper (CTYPE_CONV(c))) | |
147 | #else | |
148 | # define TOLOWER(c) (ISUPPER (c) ? tolower (CTYPE_CONV(c)) : (c)) | |
149 | # define TOUPPER(c) (ISLOWER (c) ? toupper (CTYPE_CONV(c)) : (c)) | |
150 | #endif | |
89f7f2db | 151 | |
073609a4 | 152 | /* ISDIGIT differs from ISDIGIT_LOCALE, as follows: |
153 | - Its arg may be any int or unsigned int; it need not be an unsigned char. | |
154 | - It's guaranteed to evaluate its argument exactly once. | |
155 | - It's typically faster. | |
156 | Posix 1003.2-1992 section 2.5.2.1 page 50 lines 1556-1558 says that | |
157 | only '0' through '9' are digits. Prefer ISDIGIT to ISDIGIT_LOCALE unless | |
158 | it's important to use the locale's definition of `digit' even when the | |
159 | host does not conform to Posix. */ | |
160 | #define ISDIGIT(c) ((unsigned) (c) - '0' <= 9) | |
161 | ||
301893f9 | 162 | /* Define a default escape character; its different for EBCDIC. */ |
163 | #ifndef TARGET_ESC | |
164 | #define TARGET_ESC 033 | |
165 | #endif | |
166 | ||
073609a4 | 167 | #include <sys/types.h> |
7014838c | 168 | |
073609a4 | 169 | #include <errno.h> |
170 | ||
171 | #ifndef errno | |
172 | extern int errno; | |
173 | #endif | |
174 | ||
259a120e | 175 | #ifdef STRING_WITH_STRINGS |
073609a4 | 176 | # include <string.h> |
259a120e | 177 | # include <strings.h> |
073609a4 | 178 | #else |
259a120e | 179 | # ifdef HAVE_STRING_H |
180 | # include <string.h> | |
181 | # else | |
182 | # ifdef HAVE_STRINGS_H | |
183 | # include <strings.h> | |
184 | # endif | |
073609a4 | 185 | # endif |
186 | #endif | |
187 | ||
188 | #ifdef HAVE_STDLIB_H | |
189 | # include <stdlib.h> | |
397f1574 | 190 | # ifdef USE_C_ALLOCA |
191 | /* Note that systems that use glibc have a <stdlib.h> that includes | |
192 | <alloca.h> that defines alloca, so let USE_C_ALLOCA override this. */ | |
193 | # undef alloca | |
194 | #endif | |
073609a4 | 195 | #endif |
196 | ||
197 | #ifdef HAVE_UNISTD_H | |
198 | # include <unistd.h> | |
199 | #endif | |
200 | ||
201 | #ifdef HAVE_SYS_PARAM_H | |
202 | # include <sys/param.h> | |
203 | #endif | |
204 | ||
205 | #if HAVE_LIMITS_H | |
206 | # include <limits.h> | |
207 | #endif | |
208 | ||
1d11d8e4 | 209 | /* Find HOST_WIDEST_INT and set its bit size, type and print macros. |
210 | It will be the largest integer mode supported by the host which may | |
211 | (or may not) be larger than HOST_WIDE_INT. This must appear after | |
212 | <limits.h> since we only use `long long' if its bigger than a | |
213 | `long' and also if it is supported by macros in limits.h. For old | |
214 | hosts which don't have a limits.h (and thus won't include it in | |
215 | stage2 cause we don't rerun configure) we assume gcc supports long | |
216 | long.) Note, you won't get these defined if you don't include | |
217 | {ht}config.h before this file to set the HOST_BITS_PER_* macros. */ | |
218 | ||
219 | #ifndef HOST_WIDEST_INT | |
220 | # if defined (HOST_BITS_PER_LONG) && defined (HOST_BITS_PER_LONGLONG) | |
221 | # if (HOST_BITS_PER_LONGLONG > HOST_BITS_PER_LONG) && (defined (LONG_LONG_MAX) || defined (LONGLONG_MAX) || defined (LLONG_MAX) || defined (__GNUC__)) | |
222 | # define HOST_BITS_PER_WIDEST_INT HOST_BITS_PER_LONGLONG | |
223 | # define HOST_WIDEST_INT long long | |
224 | # define HOST_WIDEST_INT_PRINT_DEC "%lld" | |
225 | # define HOST_WIDEST_INT_PRINT_UNSIGNED "%llu" | |
226 | # define HOST_WIDEST_INT_PRINT_HEX "0x%llx" | |
227 | # else | |
228 | # define HOST_BITS_PER_WIDEST_INT HOST_BITS_PER_LONG | |
229 | # define HOST_WIDEST_INT long | |
230 | # define HOST_WIDEST_INT_PRINT_DEC "%ld" | |
231 | # define HOST_WIDEST_INT_PRINT_UNSIGNED "%lu" | |
232 | # define HOST_WIDEST_INT_PRINT_HEX "0x%lx" | |
233 | # endif /*(long long>long) && (LONG_LONG_MAX||LONGLONG_MAX||LLONG_MAX||GNUC)*/ | |
234 | # endif /* defined(HOST_BITS_PER_LONG) && defined(HOST_BITS_PER_LONGLONG) */ | |
235 | #endif /* ! HOST_WIDEST_INT */ | |
236 | ||
99a9be64 | 237 | /* Infrastructure for defining missing _MAX and _MIN macros. Note that |
238 | macros defined with these cannot be used in #if. */ | |
239 | ||
240 | /* The extra casts work around common compiler bugs. */ | |
241 | #define INTTYPE_SIGNED(t) (! ((t) 0 < (t) -1)) | |
242 | /* The outer cast is needed to work around a bug in Cray C 5.0.3.0. | |
243 | It is necessary at least when t == time_t. */ | |
244 | #define INTTYPE_MINIMUM(t) ((t) (INTTYPE_SIGNED (t) \ | |
245 | ? ~ (t) 0 << (sizeof(t) * CHAR_BIT - 1) : (t) 0)) | |
246 | #define INTTYPE_MAXIMUM(t) ((t) (~ (t) 0 - INTTYPE_MINIMUM (t))) | |
247 | ||
248 | /* Use that infrastructure to provide a few constants. */ | |
249 | #ifndef UCHAR_MAX | |
250 | # define UCHAR_MAX INTTYPE_MAXIMUM (unsigned char) | |
251 | #endif | |
252 | ||
073609a4 | 253 | #ifdef TIME_WITH_SYS_TIME |
254 | # include <sys/time.h> | |
255 | # include <time.h> | |
256 | #else | |
257 | # if HAVE_SYS_TIME_H | |
f11c33a2 | 258 | # include <sys/time.h> |
073609a4 | 259 | # else |
f11c33a2 | 260 | # ifdef HAVE_TIME_H |
261 | # include <time.h> | |
262 | # endif | |
263 | # endif | |
073609a4 | 264 | #endif |
265 | ||
266 | #ifdef HAVE_FCNTL_H | |
267 | # include <fcntl.h> | |
268 | #else | |
f11c33a2 | 269 | # ifdef HAVE_SYS_FILE_H |
270 | # include <sys/file.h> | |
271 | # endif | |
073609a4 | 272 | #endif |
273 | ||
274 | #ifndef SEEK_SET | |
275 | # define SEEK_SET 0 | |
276 | # define SEEK_CUR 1 | |
277 | # define SEEK_END 2 | |
278 | #endif | |
279 | #ifndef F_OK | |
280 | # define F_OK 0 | |
281 | # define X_OK 1 | |
282 | # define W_OK 2 | |
283 | # define R_OK 4 | |
284 | #endif | |
f11c33a2 | 285 | #ifndef O_RDONLY |
286 | # define O_RDONLY 0 | |
287 | #endif | |
288 | #ifndef O_WRONLY | |
289 | # define O_WRONLY 1 | |
290 | #endif | |
073609a4 | 291 | |
65cee259 | 292 | /* Some systems define these in, e.g., param.h. We undefine these names |
293 | here to avoid the warnings. We prefer to use our definitions since we | |
294 | know they are correct. */ | |
295 | ||
296 | #undef MIN | |
297 | #undef MAX | |
298 | #define MIN(X,Y) ((X) < (Y) ? (X) : (Y)) | |
299 | #define MAX(X,Y) ((X) > (Y) ? (X) : (Y)) | |
300 | ||
b4898254 | 301 | /* Returns the least number N such that N * Y >= X. */ |
302 | #define CEIL(x,y) (((x) + (y) - 1) / (y)) | |
303 | ||
5a3ee0b1 | 304 | #ifdef HAVE_SYS_WAIT_H |
305 | #include <sys/wait.h> | |
306 | #endif | |
307 | ||
308 | #ifndef WIFSIGNALED | |
309 | #define WIFSIGNALED(S) (((S) & 0xff) != 0 && ((S) & 0xff) != 0x7f) | |
310 | #endif | |
311 | #ifndef WTERMSIG | |
312 | #define WTERMSIG(S) ((S) & 0x7f) | |
313 | #endif | |
314 | #ifndef WIFEXITED | |
315 | #define WIFEXITED(S) (((S) & 0xff) == 0) | |
316 | #endif | |
317 | #ifndef WEXITSTATUS | |
318 | #define WEXITSTATUS(S) (((S) & 0xff00) >> 8) | |
319 | #endif | |
cb69854d | 320 | #ifndef WSTOPSIG |
321 | #define WSTOPSIG WEXITSTATUS | |
322 | #endif | |
5a3ee0b1 | 323 | |
07c927cb | 324 | /* The HAVE_DECL_* macros are three-state, undefined, 0 or 1. If they |
325 | are defined to 0 then we must provide the relevant declaration | |
326 | here. These checks will be in the undefined state while configure | |
327 | is running so be careful to test "defined (HAVE_DECL_*)". */ | |
073609a4 | 328 | |
329 | #ifndef bcopy | |
330 | # ifdef HAVE_BCOPY | |
07c927cb | 331 | # if defined (HAVE_DECL_BCOPY) && !HAVE_DECL_BCOPY |
17a44115 | 332 | extern void bcopy PARAMS ((const PTR, PTR, size_t)); |
073609a4 | 333 | # endif |
334 | # else /* ! HAVE_BCOPY */ | |
2f519eef | 335 | # define bcopy(src,dst,len) memmove((dst),(src),(len)) |
073609a4 | 336 | # endif |
337 | #endif | |
338 | ||
339 | #ifndef bcmp | |
340 | # ifdef HAVE_BCMP | |
07c927cb | 341 | # if defined (HAVE_DECL_BCMP) && !HAVE_DECL_BCMP |
17a44115 | 342 | extern int bcmp PARAMS ((const PTR, const PTR, size_t)); |
073609a4 | 343 | # endif |
344 | # else /* ! HAVE_BCMP */ | |
345 | # define bcmp(left,right,len) memcmp ((left),(right),(len)) | |
346 | # endif | |
347 | #endif | |
348 | ||
349 | #ifndef bzero | |
350 | # ifdef HAVE_BZERO | |
07c927cb | 351 | # if defined (HAVE_DECL_BZERO) && !HAVE_DECL_BZERO |
17a44115 | 352 | extern void bzero PARAMS ((PTR, size_t)); |
073609a4 | 353 | # endif |
354 | # else /* ! HAVE_BZERO */ | |
355 | # define bzero(dst,len) memset ((dst),0,(len)) | |
356 | # endif | |
357 | #endif | |
358 | ||
359 | #ifndef index | |
360 | # ifdef HAVE_INDEX | |
07c927cb | 361 | # if defined (HAVE_DECL_INDEX) && !HAVE_DECL_INDEX |
17a44115 | 362 | extern char *index PARAMS ((const char *, int)); |
073609a4 | 363 | # endif |
364 | # else /* ! HAVE_INDEX */ | |
365 | # define index strchr | |
366 | # endif | |
367 | #endif | |
368 | ||
369 | #ifndef rindex | |
370 | # ifdef HAVE_RINDEX | |
07c927cb | 371 | # if defined (HAVE_DECL_RINDEX) && !HAVE_DECL_RINDEX |
17a44115 | 372 | extern char *rindex PARAMS ((const char *, int)); |
073609a4 | 373 | # endif |
374 | # else /* ! HAVE_RINDEX */ | |
375 | # define rindex strrchr | |
376 | # endif | |
377 | #endif | |
378 | ||
07c927cb | 379 | #if defined (HAVE_DECL_ATOF) && !HAVE_DECL_ATOF |
17a44115 | 380 | extern double atof PARAMS ((const char *)); |
b3819e2e | 381 | #endif |
382 | ||
07c927cb | 383 | #if defined (HAVE_DECL_ATOL) && !HAVE_DECL_ATOL |
17a44115 | 384 | extern long atol PARAMS ((const char *)); |
b3819e2e | 385 | #endif |
386 | ||
07c927cb | 387 | #if defined (HAVE_DECL_FREE) && !HAVE_DECL_FREE |
17a44115 | 388 | extern void free PARAMS ((PTR)); |
073609a4 | 389 | #endif |
390 | ||
07c927cb | 391 | #if defined (HAVE_DECL_GETCWD) && !HAVE_DECL_GETCWD |
17a44115 | 392 | extern char *getcwd PARAMS ((char *, size_t)); |
ccb1060c | 393 | #endif |
394 | ||
07c927cb | 395 | #if defined (HAVE_DECL_GETENV) && !HAVE_DECL_GETENV |
17a44115 | 396 | extern char *getenv PARAMS ((const char *)); |
fe879f7c | 397 | #endif |
398 | ||
07c927cb | 399 | #if defined (HAVE_DECL_GETWD) && !HAVE_DECL_GETWD |
17a44115 | 400 | extern char *getwd PARAMS ((char *)); |
ccb1060c | 401 | #endif |
402 | ||
07c927cb | 403 | #if defined (HAVE_DECL_SBRK) && !HAVE_DECL_SBRK |
17a44115 | 404 | extern PTR sbrk PARAMS ((int)); |
b3819e2e | 405 | #endif |
406 | ||
07c927cb | 407 | #if defined (HAVE_DECL_STRSTR) && !HAVE_DECL_STRSTR |
17a44115 | 408 | extern char *strstr PARAMS ((const char *, const char *)); |
c80fcb0a | 409 | #endif |
410 | ||
7014838c | 411 | #ifdef HAVE_MALLOC_H |
412 | #include <malloc.h> | |
413 | #endif | |
414 | ||
07c927cb | 415 | #if defined (HAVE_DECL_MALLOC) && !HAVE_DECL_MALLOC |
17a44115 | 416 | extern PTR malloc PARAMS ((size_t)); |
7014838c | 417 | #endif |
418 | ||
07c927cb | 419 | #if defined (HAVE_DECL_CALLOC) && !HAVE_DECL_CALLOC |
17a44115 | 420 | extern PTR calloc PARAMS ((size_t, size_t)); |
7014838c | 421 | #endif |
422 | ||
07c927cb | 423 | #if defined (HAVE_DECL_REALLOC) && !HAVE_DECL_REALLOC |
17a44115 | 424 | extern PTR realloc PARAMS ((PTR, size_t)); |
7014838c | 425 | #endif |
426 | ||
4a8ba235 | 427 | /* If the system doesn't provide strsignal, we get it defined in |
428 | libiberty but no declaration is supplied. */ | |
02c09dab | 429 | #ifndef HAVE_STRSIGNAL |
4a8ba235 | 430 | # ifndef strsignal |
431 | extern const char *strsignal PARAMS ((int)); | |
0b6ff5fb | 432 | # endif |
4a8ba235 | 433 | #endif |
0b6ff5fb | 434 | |
436f5383 | 435 | #ifdef HAVE_GETRLIMIT |
07c927cb | 436 | # if defined (HAVE_DECL_GETRLIMIT) && !HAVE_DECL_GETRLIMIT |
436f5383 | 437 | # ifndef getrlimit |
17a44115 | 438 | # ifdef ANSI_PROTOTYPES |
439 | struct rlimit; | |
440 | # endif | |
441 | extern int getrlimit PARAMS ((int, struct rlimit *)); | |
436f5383 | 442 | # endif |
443 | # endif | |
444 | #endif | |
445 | ||
446 | #ifdef HAVE_SETRLIMIT | |
07c927cb | 447 | # if defined (HAVE_DECL_SETRLIMIT) && !HAVE_DECL_SETRLIMIT |
436f5383 | 448 | # ifndef setrlimit |
17a44115 | 449 | # ifdef ANSI_PROTOTYPES |
450 | struct rlimit; | |
451 | # endif | |
452 | extern int setrlimit PARAMS ((int, const struct rlimit *)); | |
436f5383 | 453 | # endif |
454 | # endif | |
455 | #endif | |
456 | ||
8564ad21 | 457 | /* HAVE_VOLATILE only refers to the stage1 compiler. We also check |
458 | __STDC__ and assume gcc sets it and has volatile in stage >=2. */ | |
459 | #if !defined(HAVE_VOLATILE) && !defined(__STDC__) && !defined(volatile) | |
460 | #define volatile | |
461 | #endif | |
462 | ||
07c927cb | 463 | #if defined (HAVE_DECL_ABORT) && !HAVE_DECL_ABORT |
17a44115 | 464 | extern void abort PARAMS ((void)); |
ef5ed00c | 465 | #endif |
42aaf0b7 | 466 | |
b3954366 | 467 | /* 1 if we have C99 designated initializers. */ |
468 | #define HAVE_DESIGNATED_INITIALIZERS \ | |
469 | ((GCC_VERSION >= 2007) || (__STDC_VERSION__ >= 199901L)) | |
470 | ||
42aaf0b7 | 471 | /* Define a STRINGIFY macro that's right for ANSI or traditional C. |
42aaf0b7 | 472 | Note: if the argument passed to STRINGIFY is itself a macro, eg |
473 | #define foo bar, STRINGIFY(foo) will produce "foo", not "bar". | |
474 | Although the __STDC__ case could be made to expand this via a layer | |
475 | of indirection, the traditional C case can not do so. Therefore | |
476 | this behavior is not supported. */ | |
477 | #ifndef STRINGIFY | |
11e01324 | 478 | # ifdef HAVE_STRINGIZE |
42aaf0b7 | 479 | # define STRINGIFY(STRING) #STRING |
480 | # else | |
481 | # define STRINGIFY(STRING) "STRING" | |
482 | # endif | |
483 | #endif /* ! STRINGIFY */ | |
484 | ||
8be93a1c | 485 | #if HAVE_SYS_STAT_H |
486 | # include <sys/stat.h> | |
487 | #endif | |
d128acff | 488 | |
489 | /* Test if something is a normal file. */ | |
490 | #ifndef S_ISREG | |
491 | #define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) | |
492 | #endif | |
493 | ||
494 | /* Test if something is a directory. */ | |
495 | #ifndef S_ISDIR | |
496 | #define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) | |
497 | #endif | |
498 | ||
2530cb46 | 499 | /* Test if something is a character special file. */ |
500 | #ifndef S_ISCHR | |
501 | #define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) | |
502 | #endif | |
503 | ||
20a6e842 | 504 | /* Test if something is a block special file. */ |
505 | #ifndef S_ISBLK | |
506 | #define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) | |
507 | #endif | |
508 | ||
2530cb46 | 509 | /* Test if something is a socket. */ |
510 | #ifndef S_ISSOCK | |
511 | # ifdef S_IFSOCK | |
512 | # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) | |
513 | # else | |
514 | # define S_ISSOCK(m) 0 | |
515 | # endif | |
516 | #endif | |
517 | ||
518 | /* Test if something is a FIFO. */ | |
519 | #ifndef S_ISFIFO | |
520 | # ifdef S_IFIFO | |
521 | # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) | |
522 | # else | |
523 | # define S_ISFIFO(m) 0 | |
524 | # endif | |
525 | #endif | |
526 | ||
527 | /* Approximate O_NONBLOCK. */ | |
528 | #ifndef O_NONBLOCK | |
529 | #define O_NONBLOCK O_NDELAY | |
530 | #endif | |
531 | ||
532 | /* Approximate O_NOCTTY. */ | |
533 | #ifndef O_NOCTTY | |
534 | #define O_NOCTTY 0 | |
535 | #endif | |
536 | ||
3b774709 | 537 | /* Define well known filenos if the system does not define them. */ |
538 | #ifndef STDIN_FILENO | |
539 | # define STDIN_FILENO 0 | |
540 | #endif | |
541 | #ifndef STDOUT_FILENO | |
542 | # define STDOUT_FILENO 1 | |
543 | #endif | |
67cf1bb0 | 544 | #ifndef STDERR_FILENO |
3b774709 | 545 | # define STDERR_FILENO 2 |
546 | #endif | |
547 | ||
a729d1c3 | 548 | /* Some systems have mkdir that takes a single argument. */ |
549 | #ifdef MKDIR_TAKES_ONE_ARG | |
550 | # define mkdir(a,b) mkdir(a) | |
551 | #endif | |
552 | ||
cfbfd5e6 | 553 | /* Provide a way to print an address via printf. */ |
554 | #ifndef HOST_PTR_PRINTF | |
555 | # ifdef HAVE_PRINTF_PTR | |
556 | # define HOST_PTR_PRINTF "%p" | |
557 | # else | |
558 | # define HOST_PTR_PRINTF \ | |
559 | (sizeof (int) == sizeof (char *) ? "%x" \ | |
560 | : sizeof (long) == sizeof (char *) ? "%lx" : "%llx") | |
561 | # endif | |
562 | #endif /* ! HOST_PTR_PRINTF */ | |
563 | ||
fadec241 | 564 | /* By default, colon separates directories in a path. */ |
565 | #ifndef PATH_SEPARATOR | |
566 | #define PATH_SEPARATOR ':' | |
567 | #endif | |
568 | ||
569 | #ifndef DIR_SEPARATOR | |
570 | #define DIR_SEPARATOR '/' | |
571 | #endif | |
572 | ||
573 | /* Define IS_DIR_SEPARATOR. */ | |
574 | #ifndef DIR_SEPARATOR_2 | |
575 | # define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR) | |
576 | #else /* DIR_SEPARATOR_2 */ | |
577 | # define IS_DIR_SEPARATOR(ch) \ | |
578 | (((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2)) | |
579 | #endif /* DIR_SEPARATOR_2 */ | |
580 | ||
ac7eca71 | 581 | /* Get libiberty declarations. */ |
582 | #include "libiberty.h" | |
583 | ||
968327cb | 584 | /* Make sure that ONLY_INT_FIELDS has an integral value. */ |
585 | #ifdef ONLY_INT_FIELDS | |
586 | #undef ONLY_INT_FIELDS | |
587 | #define ONLY_INT_FIELDS 1 | |
588 | #else | |
589 | #define ONLY_INT_FIELDS 0 | |
590 | #endif | |
591 | ||
655a58fa | 592 | /* Provide a default for the HOST_BIT_BUCKET. |
593 | This suffices for POSIX-like hosts. */ | |
594 | ||
595 | #ifndef HOST_BIT_BUCKET | |
596 | #define HOST_BIT_BUCKET "/dev/null" | |
597 | #endif | |
598 | ||
488c4206 | 599 | /* Enumerated bitfields are safe to use unless we've been explictly told |
1e50e9c3 | 600 | otherwise or if they are signed. */ |
488c4206 | 601 | |
968327cb | 602 | #define USE_ENUM_BITFIELDS (__GNUC__ || (!ONLY_INT_FIELDS && ENUM_BITFIELDS_ARE_UNSIGNED)) |
488c4206 | 603 | |
604 | #if USE_ENUM_BITFIELDS | |
605 | #define ENUM_BITFIELD(TYPE) enum TYPE | |
606 | #else | |
607 | #define ENUM_BITFIELD(TYPE) unsigned int | |
608 | #endif | |
609 | ||
19c2de72 | 610 | #ifndef offsetof |
611 | #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) | |
612 | #endif | |
488c4206 | 613 | |
8fa40693 | 614 | /* Traditional C cannot initialize union members of structs. Provide |
615 | a macro which expands appropriately to handle it. This only works | |
616 | if you intend to initalize the union member to zero since it relies | |
617 | on default initialization to zero in the traditional C case. */ | |
618 | #ifdef __STDC__ | |
619 | #define UNION_INIT_ZERO , {0} | |
620 | #else | |
621 | #define UNION_INIT_ZERO | |
622 | #endif | |
623 | ||
1289ba6e | 624 | /* GCC now gives implicit declaration warnings for undeclared builtins. */ |
625 | #if defined(__GNUC__) && defined (__SIZE_TYPE__) | |
626 | extern void *alloca (__SIZE_TYPE__); | |
627 | #endif | |
628 | ||
19fafbd3 | 629 | /* Various error reporting routines want to use __FUNCTION__. */ |
630 | #if (GCC_VERSION < 2007) | |
e08f94ba | 631 | #ifndef __FUNCTION__ |
19fafbd3 | 632 | #define __FUNCTION__ "?" |
e08f94ba | 633 | #endif /* ! __FUNCTION__ */ |
19fafbd3 | 634 | #endif |
635 | ||
073609a4 | 636 | #endif /* __GCC_SYSTEM_H__ */ |