(sync) [!HAVE_SYNC]: New macro.
[platform/upstream/coreutils.git] / src / system.h
1 /* system-dependent definitions for coreutils
2    Copyright (C) 1989, 1991-2006 Free Software Foundation, Inc.
3
4    This program is free software; you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation; either version 2, or (at your option)
7    any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program; if not, write to the Free Software Foundation,
16    Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */
17
18 #include <alloca.h>
19
20 /* Include sys/types.h before this file.  */
21
22 #if 2 <= __GLIBC__ && 2 <= __GLIBC_MINOR__
23 # if ! defined _SYS_TYPES_H
24 you must include <sys/types.h> before including this file
25 # endif
26 #endif
27
28 #include <sys/stat.h>
29
30 #if !defined HAVE_MKFIFO
31 # define mkfifo(name, mode) mknod (name, (mode) | S_IFIFO, 0)
32 #endif
33
34 #if HAVE_SYS_PARAM_H
35 # include <sys/param.h>
36 #endif
37
38 #include <unistd.h>
39
40 #ifndef STDIN_FILENO
41 # define STDIN_FILENO 0
42 #endif
43
44 #ifndef STDOUT_FILENO
45 # define STDOUT_FILENO 1
46 #endif
47
48 #ifndef STDERR_FILENO
49 # define STDERR_FILENO 2
50 #endif
51
52
53 /* limits.h must come before pathmax.h because limits.h on some systems
54    undefs PATH_MAX, whereas pathmax.h sets PATH_MAX.  */
55 #include <limits.h>
56
57 #include "pathmax.h"
58 #include "localedir.h"
59
60 #if TIME_WITH_SYS_TIME
61 # include <sys/time.h>
62 # include <time.h>
63 #else
64 # if HAVE_SYS_TIME_H
65 #  include <sys/time.h>
66 # else
67 #  include <time.h>
68 # endif
69 #endif
70
71 /* Since major is a function on SVR4, we can't use `ifndef major'.  */
72 #if MAJOR_IN_MKDEV
73 # include <sys/mkdev.h>
74 # define HAVE_MAJOR
75 #endif
76 #if MAJOR_IN_SYSMACROS
77 # include <sys/sysmacros.h>
78 # define HAVE_MAJOR
79 #endif
80 #ifdef major                    /* Might be defined in sys/types.h.  */
81 # define HAVE_MAJOR
82 #endif
83
84 #ifndef HAVE_MAJOR
85 # define major(dev)  (((dev) >> 8) & 0xff)
86 # define minor(dev)  ((dev) & 0xff)
87 # define makedev(maj, min)  (((maj) << 8) | (min))
88 #endif
89 #undef HAVE_MAJOR
90
91 #if ! defined makedev && defined mkdev
92 # define makedev(maj, min)  mkdev (maj, min)
93 #endif
94
95 /* Don't use bcopy!  Use memmove if source and destination may overlap,
96    memcpy otherwise.  */
97
98 #include <string.h>
99 #include "memrchr.h"
100
101 #include <errno.h>
102
103 /* Some systems don't define the following symbols.  */
104 #ifndef ENOSYS
105 # define ENOSYS (-1)
106 #endif
107 #ifndef EISDIR
108 # define EISDIR (-1)
109 #endif
110
111 #include <stdbool.h>
112 #include <stdlib.h>
113
114 /* The following test is to work around the gross typo in
115    systems like Sony NEWS-OS Release 4.0C, whereby EXIT_FAILURE
116    is defined to 0, not 1.  */
117 #if !EXIT_FAILURE
118 # undef EXIT_FAILURE
119 # define EXIT_FAILURE 1
120 #endif
121
122 #ifndef EXIT_SUCCESS
123 # define EXIT_SUCCESS 0
124 #endif
125
126 /* Exit statuses for programs like 'env' that exec other programs.
127    EXIT_FAILURE might not be 1, so use EXIT_FAIL in such programs.  */
128 enum
129 {
130   EXIT_FAIL = 1,
131   EXIT_CANNOT_INVOKE = 126,
132   EXIT_ENOENT = 127
133 };
134
135 #include "exitfail.h"
136
137 /* Set exit_failure to STATUS if that's not the default already.  */
138 static inline void
139 initialize_exit_failure (int status)
140 {
141   if (status != EXIT_FAILURE)
142     exit_failure = status;
143 }
144
145 #include <fcntl.h>
146
147 #if !defined SEEK_SET
148 # define SEEK_SET 0
149 # define SEEK_CUR 1
150 # define SEEK_END 2
151 #endif
152 #ifndef F_OK
153 # define F_OK 0
154 # define X_OK 1
155 # define W_OK 2
156 # define R_OK 4
157 #endif
158
159 #if !defined O_DIRECT && defined O_DIRECTIO
160 /* Tru64 spells it `O_DIRECTIO'.  */
161 # define O_DIRECT O_DIRECTIO
162 #endif
163
164 #if !defined O_DIRECT
165 # define O_DIRECT 0
166 #endif
167
168 #if !defined O_DIRECTORY
169 # define O_DIRECTORY 0
170 #endif
171
172 #if !defined O_DSYNC
173 # define O_DSYNC 0
174 #endif
175
176 #if !defined O_NDELAY
177 # define O_NDELAY 0
178 #endif
179
180 #if !defined O_NOATIME
181 # define O_NOATIME 0
182 #endif
183
184 #if !defined O_NONBLOCK
185 # define O_NONBLOCK O_NDELAY
186 #endif
187
188 #if !defined O_NOCTTY
189 # define O_NOCTTY 0
190 #endif
191
192 #if !defined O_NOFOLLOW
193 # define O_NOFOLLOW 0
194 #endif
195
196 #if !defined O_NOLINKS
197 # define O_NOLINKS 0
198 #endif
199
200 #if !defined O_RSYNC
201 # define O_RSYNC 0
202 #endif
203
204 #if !defined O_SYNC
205 # define O_SYNC 0
206 #endif
207
208 /* For systems that distinguish between text and binary I/O.
209    O_BINARY is usually declared in fcntl.h  */
210 #if !defined O_BINARY && defined _O_BINARY
211   /* For MSC-compatible compilers.  */
212 # define O_BINARY _O_BINARY
213 # define O_TEXT _O_TEXT
214 #endif
215
216 #ifdef __BEOS__
217   /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect.  */
218 # undef O_BINARY
219 # undef O_TEXT
220 #endif
221
222 #ifndef O_BINARY
223 # define O_BINARY 0
224 # define O_TEXT 0
225 #endif
226
227 #if HAVE_DIRENT_H
228 # include <dirent.h>
229 # define NLENGTH(direct) (strlen((direct)->d_name))
230 #else /* not HAVE_DIRENT_H */
231 # define dirent direct
232 # define NLENGTH(direct) ((direct)->d_namlen)
233 # if HAVE_SYS_NDIR_H
234 #  include <sys/ndir.h>
235 # endif /* HAVE_SYS_NDIR_H */
236 # if HAVE_SYS_DIR_H
237 #  include <sys/dir.h>
238 # endif /* HAVE_SYS_DIR_H */
239 # if HAVE_NDIR_H
240 #  include <ndir.h>
241 # endif /* HAVE_NDIR_H */
242 #endif /* HAVE_DIRENT_H */
243
244 #if CLOSEDIR_VOID
245 /* Fake a return value. */
246 # define CLOSEDIR(d) (closedir (d), 0)
247 #else
248 # define CLOSEDIR(d) closedir (d)
249 #endif
250
251 enum
252 {
253   NOT_AN_INODE_NUMBER = 0
254 };
255
256 #ifdef D_INO_IN_DIRENT
257 # define D_INO(dp) ((dp)->d_ino)
258 #else
259 /* Some systems don't have inodes, so fake them to avoid lots of ifdefs.  */
260 # define D_INO(dp) NOT_AN_INODE_NUMBER
261 #endif
262
263 /* Get or fake the disk device blocksize.
264    Usually defined by sys/param.h (if at all).  */
265 #if !defined DEV_BSIZE && defined BSIZE
266 # define DEV_BSIZE BSIZE
267 #endif
268 #if !defined DEV_BSIZE && defined BBSIZE /* SGI */
269 # define DEV_BSIZE BBSIZE
270 #endif
271 #ifndef DEV_BSIZE
272 # define DEV_BSIZE 4096
273 #endif
274
275 /* Extract or fake data from a `struct stat'.
276    ST_BLKSIZE: Preferred I/O blocksize for the file, in bytes.
277    ST_NBLOCKS: Number of blocks in the file, including indirect blocks.
278    ST_NBLOCKSIZE: Size of blocks used when calculating ST_NBLOCKS.  */
279 #ifndef HAVE_STRUCT_STAT_ST_BLOCKS
280 # define ST_BLKSIZE(statbuf) DEV_BSIZE
281 # if defined _POSIX_SOURCE || !defined BSIZE /* fileblocks.c uses BSIZE.  */
282 #  define ST_NBLOCKS(statbuf) \
283   ((statbuf).st_size / ST_NBLOCKSIZE + ((statbuf).st_size % ST_NBLOCKSIZE != 0))
284 # else /* !_POSIX_SOURCE && BSIZE */
285 #  define ST_NBLOCKS(statbuf) \
286   (S_ISREG ((statbuf).st_mode) \
287    || S_ISDIR ((statbuf).st_mode) \
288    ? st_blocks ((statbuf).st_size) : 0)
289 # endif /* !_POSIX_SOURCE && BSIZE */
290 #else /* HAVE_STRUCT_STAT_ST_BLOCKS */
291 /* Some systems, like Sequents, return st_blksize of 0 on pipes.
292    Also, when running `rsh hpux11-system cat any-file', cat would
293    determine that the output stream had an st_blksize of 2147421096.
294    So here we arbitrarily limit the `optimal' block size to 4MB.
295    If anyone knows of a system for which the legitimate value for
296    st_blksize can exceed 4MB, please report it as a bug in this code.  */
297 # define ST_BLKSIZE(statbuf) ((0 < (statbuf).st_blksize \
298                                && (statbuf).st_blksize <= (1 << 22)) /* 4MB */ \
299                               ? (statbuf).st_blksize : DEV_BSIZE)
300 # if defined hpux || defined __hpux__ || defined __hpux
301 /* HP-UX counts st_blocks in 1024-byte units.
302    This loses when mixing HP-UX and BSD file systems with NFS.  */
303 #  define ST_NBLOCKSIZE 1024
304 # else /* !hpux */
305 #  if defined _AIX && defined _I386
306 /* AIX PS/2 counts st_blocks in 4K units.  */
307 #   define ST_NBLOCKSIZE (4 * 1024)
308 #  else /* not AIX PS/2 */
309 #   if defined _CRAY
310 #    define ST_NBLOCKS(statbuf) \
311   (S_ISREG ((statbuf).st_mode) \
312    || S_ISDIR ((statbuf).st_mode) \
313    ? (statbuf).st_blocks * ST_BLKSIZE(statbuf)/ST_NBLOCKSIZE : 0)
314 #   endif /* _CRAY */
315 #  endif /* not AIX PS/2 */
316 # endif /* !hpux */
317 #endif /* HAVE_STRUCT_STAT_ST_BLOCKS */
318
319 #ifndef ST_NBLOCKS
320 # define ST_NBLOCKS(statbuf) ((statbuf).st_blocks)
321 #endif
322
323 #ifndef ST_NBLOCKSIZE
324 # ifdef S_BLKSIZE
325 #  define ST_NBLOCKSIZE S_BLKSIZE
326 # else
327 #  define ST_NBLOCKSIZE 512
328 # endif
329 #endif
330
331 /* Redirection and wildcarding when done by the utility itself.
332    Generally a noop, but used in particular for native VMS. */
333 #ifndef initialize_main
334 # define initialize_main(ac, av)
335 #endif
336
337 #include "stat-macros.h"
338
339 #include "timespec.h"
340
341 #if HAVE_INTTYPES_H
342 # include <inttypes.h>
343 #endif
344 #if HAVE_STDINT_H
345 # include <stdint.h>
346 #endif
347
348 #if ULONG_MAX_LT_ULLONG_MAX
349 # define LONGEST_MODIFIER "ll"
350 #else
351 # define LONGEST_MODIFIER "l"
352 #endif
353 #if PRI_MACROS_BROKEN
354 # undef PRIdMAX
355 # undef PRIoMAX
356 # undef PRIuMAX
357 # undef PRIxMAX
358 #endif
359 #ifndef PRIdMAX
360 # define PRIdMAX LONGEST_MODIFIER "d"
361 #endif
362 #ifndef PRIoMAX
363 # define PRIoMAX LONGEST_MODIFIER "o"
364 #endif
365 #ifndef PRIuMAX
366 # define PRIuMAX LONGEST_MODIFIER "u"
367 #endif
368 #ifndef PRIxMAX
369 # define PRIxMAX LONGEST_MODIFIER "x"
370 #endif
371
372 #include <ctype.h>
373
374 /* Jim Meyering writes:
375
376    "... Some ctype macros are valid only for character codes that
377    isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
378    using /bin/cc or gcc but without giving an ansi option).  So, all
379    ctype uses should be through macros like ISPRINT...  If
380    STDC_HEADERS is defined, then autoconf has verified that the ctype
381    macros don't need to be guarded with references to isascii. ...
382    Defining isascii to 1 should let any compiler worth its salt
383    eliminate the && through constant folding."
384
385    Bruno Haible adds:
386
387    "... Furthermore, isupper(c) etc. have an undefined result if c is
388    outside the range -1 <= c <= 255. One is tempted to write isupper(c)
389    with c being of type `char', but this is wrong if c is an 8-bit
390    character >= 128 which gets sign-extended to a negative value.
391    The macro ISUPPER protects against this as well."  */
392
393 #if STDC_HEADERS || (!defined isascii && !HAVE_ISASCII)
394 # define IN_CTYPE_DOMAIN(c) 1
395 #else
396 # define IN_CTYPE_DOMAIN(c) isascii(c)
397 #endif
398
399 #ifdef isblank
400 # define ISBLANK(c) (IN_CTYPE_DOMAIN (c) && isblank (c))
401 #else
402 # define ISBLANK(c) ((c) == ' ' || (c) == '\t')
403 #endif
404 #ifdef isgraph
405 # define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isgraph (c))
406 #else
407 # define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isprint (c) && !isspace (c))
408 #endif
409
410 /* This is defined in <sys/euc.h> on at least Solaris2.6 systems.  */
411 #undef ISPRINT
412
413 #define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c))
414 #define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c))
415 #define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c))
416 #define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c))
417 #define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c))
418 #define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (c))
419 #define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
420 #define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))
421 #define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c))
422 #define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))
423
424 #if STDC_HEADERS
425 # define TOLOWER(Ch) tolower (Ch)
426 # define TOUPPER(Ch) toupper (Ch)
427 #else
428 # define TOLOWER(Ch) (ISUPPER (Ch) ? tolower (Ch) : (Ch))
429 # define TOUPPER(Ch) (ISLOWER (Ch) ? toupper (Ch) : (Ch))
430 #endif
431
432 /* ISDIGIT differs from ISDIGIT_LOCALE, as follows:
433    - Its arg may be any int or unsigned int; it need not be an unsigned char.
434    - It's guaranteed to evaluate its argument exactly once.
435    - It's typically faster.
436    POSIX says that only '0' through '9' are digits.  Prefer ISDIGIT to
437    ISDIGIT_LOCALE unless it's important to use the locale's definition
438    of `digit' even when the host does not conform to POSIX.  */
439 #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
440
441 /* Convert a possibly-signed character to an unsigned character.  This is
442    a bit safer than casting to unsigned char, since it catches some type
443    errors that the cast doesn't.  */
444 static inline unsigned char to_uchar (char ch) { return ch; }
445
446 #include <locale.h>
447
448 /* Take care of NLS matters.  */
449
450 #include "gettext.h"
451 #if ! ENABLE_NLS
452 # undef textdomain
453 # define textdomain(Domainname) /* empty */
454 # undef bindtextdomain
455 # define bindtextdomain(Domainname, Dirname) /* empty */
456 #endif
457
458 #define _(msgid) gettext (msgid)
459 #define N_(msgid) msgid
460
461 #define STREQ(a, b) (strcmp ((a), (b)) == 0)
462
463 #if !HAVE_DECL_FREE
464 void free ();
465 #endif
466
467 #if !HAVE_DECL_MALLOC
468 char *malloc ();
469 #endif
470
471 #if !HAVE_DECL_MEMCHR
472 char *memchr ();
473 #endif
474
475 #if !HAVE_DECL_REALLOC
476 char *realloc ();
477 #endif
478
479 #if !HAVE_DECL_STPCPY
480 # ifndef stpcpy
481 char *stpcpy ();
482 # endif
483 #endif
484
485 #if !HAVE_DECL_STRNDUP
486 char *strndup ();
487 #endif
488
489 #if !HAVE_DECL_STRSTR
490 char *strstr ();
491 #endif
492
493 #if !HAVE_DECL_GETENV
494 char *getenv ();
495 #endif
496
497 #if !HAVE_DECL_LSEEK
498 off_t lseek ();
499 #endif
500
501 /* This is needed on some AIX systems.  */
502 #if !HAVE_DECL_STRTOUL
503 unsigned long strtoul ();
504 #endif
505
506 #if !HAVE_DECL_GETLOGIN
507 char *getlogin ();
508 #endif
509
510 #if !HAVE_DECL_TTYNAME
511 char *ttyname ();
512 #endif
513
514 #if !HAVE_DECL_GETEUID
515 uid_t geteuid ();
516 #endif
517
518 #if !HAVE_DECL_GETPWUID
519 struct passwd *getpwuid ();
520 #endif
521
522 #if !HAVE_DECL_GETGRGID
523 struct group *getgrgid ();
524 #endif
525
526 #if !HAVE_DECL_GETUID
527 uid_t getuid ();
528 #endif
529
530 #include "xalloc.h"
531 #include "verify.h"
532
533 /* This is simply a shorthand for the common case in which
534    the third argument to x2nrealloc would be `sizeof *(P)'.
535    Ensure that sizeof *(P) is *not* 1.  In that case, it'd be
536    better to use X2REALLOC, although not strictly necessary.  */
537 #define X2NREALLOC(P, PN) ((void) verify_true (sizeof *(P) != 1), \
538                            x2nrealloc (P, PN, sizeof *(P)))
539
540 /* Using x2realloc (when appropriate) usually makes your code more
541    readable than using x2nrealloc, but it also makes it so your
542    code will malfunction if sizeof *(P) ever becomes 2 or greater.
543    So use this macro instead of using x2realloc directly.  */
544 #define X2REALLOC(P, PN) ((void) verify_true (sizeof *(P) == 1), \
545                           x2realloc (P, PN))
546
547 #if ! defined HAVE_MEMPCPY && ! defined mempcpy
548 /* Be CAREFUL that there are no side effects in N.  */
549 # define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
550 #endif
551
552 /* Include automatically-generated macros for unlocked I/O.  */
553 #include "unlocked-io.h"
554 #include "same-inode.h"
555
556 #define DOT_OR_DOTDOT(Basename) \
557   (Basename[0] == '.' && (Basename[1] == '\0' \
558                           || (Basename[1] == '.' && Basename[2] == '\0')))
559
560 /* A wrapper for readdir so that callers don't see entries for `.' or `..'.  */
561 static inline struct dirent const *
562 readdir_ignoring_dot_and_dotdot (DIR *dirp)
563 {
564   while (1)
565     {
566       struct dirent const *dp = readdir (dirp);
567       if (dp == NULL || ! DOT_OR_DOTDOT (dp->d_name))
568         return dp;
569     }
570 }
571
572 #if SETVBUF_REVERSED
573 # define SETVBUF(Stream, Buffer, Type, Size) \
574     setvbuf (Stream, Type, Buffer, Size)
575 #else
576 # define SETVBUF(Stream, Buffer, Type, Size) \
577     setvbuf (Stream, Buffer, Type, Size)
578 #endif
579
580 /* Factor out some of the common --help and --version processing code.  */
581
582 /* These enum values cannot possibly conflict with the option values
583    ordinarily used by commands, including CHAR_MAX + 1, etc.  Avoid
584    CHAR_MIN - 1, as it may equal -1, the getopt end-of-options value.  */
585 enum
586 {
587   GETOPT_HELP_CHAR = (CHAR_MIN - 2),
588   GETOPT_VERSION_CHAR = (CHAR_MIN - 3)
589 };
590
591 #define GETOPT_HELP_OPTION_DECL \
592   "help", no_argument, NULL, GETOPT_HELP_CHAR
593 #define GETOPT_VERSION_OPTION_DECL \
594   "version", no_argument, NULL, GETOPT_VERSION_CHAR
595
596 #define case_GETOPT_HELP_CHAR                   \
597   case GETOPT_HELP_CHAR:                        \
598     usage (EXIT_SUCCESS);                       \
599     break;
600
601 /* Program_name must be a literal string.
602    Usually it is just PROGRAM_NAME.  */
603 #define USAGE_BUILTIN_WARNING \
604   _("\n" \
605 "NOTE: your shell may have its own version of %s, which usually supersedes\n" \
606 "the version described here.  Please refer to your shell's documentation\n" \
607 "for details about the options it supports.\n")
608
609 #define HELP_OPTION_DESCRIPTION \
610   _("      --help     display this help and exit\n")
611 #define VERSION_OPTION_DESCRIPTION \
612   _("      --version  output version information and exit\n")
613
614 #include "closeout.h"
615 #include "version-etc.h"
616
617 #define case_GETOPT_VERSION_CHAR(Program_name, Authors)                 \
618   case GETOPT_VERSION_CHAR:                                             \
619     version_etc (stdout, Program_name, GNU_PACKAGE, VERSION, Authors,   \
620                  (char *) NULL);                                        \
621     exit (EXIT_SUCCESS);                                                \
622     break;
623
624 #ifndef MAX
625 # define MAX(a, b) ((a) > (b) ? (a) : (b))
626 #endif
627
628 #ifndef MIN
629 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
630 #endif
631
632 #include "intprops.h"
633
634 #ifndef CHAR_MIN
635 # define CHAR_MIN TYPE_MINIMUM (char)
636 #endif
637
638 #ifndef CHAR_MAX
639 # define CHAR_MAX TYPE_MAXIMUM (char)
640 #endif
641
642 #ifndef SCHAR_MIN
643 # define SCHAR_MIN (-1 - SCHAR_MAX)
644 #endif
645
646 #ifndef SCHAR_MAX
647 # define SCHAR_MAX (CHAR_MAX == UCHAR_MAX ? CHAR_MAX / 2 : CHAR_MAX)
648 #endif
649
650 #ifndef UCHAR_MAX
651 # define UCHAR_MAX TYPE_MAXIMUM (unsigned char)
652 #endif
653
654 #ifndef SHRT_MIN
655 # define SHRT_MIN TYPE_MINIMUM (short int)
656 #endif
657
658 #ifndef SHRT_MAX
659 # define SHRT_MAX TYPE_MAXIMUM (short int)
660 #endif
661
662 #ifndef INT_MAX
663 # define INT_MAX TYPE_MAXIMUM (int)
664 #endif
665
666 #ifndef INT_MIN
667 # define INT_MIN TYPE_MINIMUM (int)
668 #endif
669
670 #ifndef INTMAX_MAX
671 # define INTMAX_MAX TYPE_MAXIMUM (intmax_t)
672 #endif
673
674 #ifndef INTMAX_MIN
675 # define INTMAX_MIN TYPE_MINIMUM (intmax_t)
676 #endif
677
678 #ifndef UINT_MAX
679 # define UINT_MAX TYPE_MAXIMUM (unsigned int)
680 #endif
681
682 #ifndef LONG_MAX
683 # define LONG_MAX TYPE_MAXIMUM (long int)
684 #endif
685
686 #ifndef ULONG_MAX
687 # define ULONG_MAX TYPE_MAXIMUM (unsigned long int)
688 #endif
689
690 #ifndef SIZE_MAX
691 # define SIZE_MAX TYPE_MAXIMUM (size_t)
692 #endif
693
694 #ifndef SSIZE_MAX
695 # define SSIZE_MAX TYPE_MAXIMUM (ssize_t)
696 #endif
697
698 #ifndef UINTMAX_MAX
699 # define UINTMAX_MAX TYPE_MAXIMUM (uintmax_t)
700 #endif
701
702 #ifndef OFF_T_MIN
703 # define OFF_T_MIN TYPE_MINIMUM (off_t)
704 #endif
705
706 #ifndef OFF_T_MAX
707 # define OFF_T_MAX TYPE_MAXIMUM (off_t)
708 #endif
709
710 #ifndef UID_T_MAX
711 # define UID_T_MAX TYPE_MAXIMUM (uid_t)
712 #endif
713
714 #ifndef GID_T_MAX
715 # define GID_T_MAX TYPE_MAXIMUM (gid_t)
716 #endif
717
718 #ifndef PID_T_MAX
719 # define PID_T_MAX TYPE_MAXIMUM (pid_t)
720 #endif
721
722 /* Use this to suppress gcc's `...may be used before initialized' warnings. */
723 #ifdef lint
724 # define IF_LINT(Code) Code
725 #else
726 # define IF_LINT(Code) /* empty */
727 #endif
728
729 #ifndef __attribute__
730 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
731 #  define __attribute__(x) /* empty */
732 # endif
733 #endif
734
735 #ifndef ATTRIBUTE_NORETURN
736 # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
737 #endif
738
739 #ifndef ATTRIBUTE_UNUSED
740 # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
741 #endif
742
743 #if defined strdupa
744 # define ASSIGN_STRDUPA(DEST, S)                \
745   do { DEST = strdupa (S); } while (0)
746 #else
747 # define ASSIGN_STRDUPA(DEST, S)                \
748   do                                            \
749     {                                           \
750       const char *s_ = (S);                     \
751       size_t len_ = strlen (s_) + 1;            \
752       char *tmp_dest_ = alloca (len_);          \
753       DEST = memcpy (tmp_dest_, (s_), len_);    \
754     }                                           \
755   while (0)
756 #endif
757
758 #ifndef EOVERFLOW
759 # define EOVERFLOW EINVAL
760 #endif
761
762 #if ! HAVE_FSEEKO && ! defined fseeko
763 # define fseeko(s, o, w) ((o) == (long int) (o)         \
764                           ? fseek (s, o, w)             \
765                           : (errno = EOVERFLOW, -1))
766 #endif
767
768 #if ! HAVE_SYNC
769 # define sync() /* empty */
770 #endif
771
772 /* Compute the greatest common divisor of U and V using Euclid's
773    algorithm.  U and V must be nonzero.  */
774
775 static inline size_t
776 gcd (size_t u, size_t v)
777 {
778   do
779     {
780       size_t t = u % v;
781       u = v;
782       v = t;
783     }
784   while (v);
785
786   return u;
787 }
788
789 /* Compute the least common multiple of U and V.  U and V must be
790    nonzero.  There is no overflow checking, so callers should not
791    specify outlandish sizes.  */
792
793 static inline size_t
794 lcm (size_t u, size_t v)
795 {
796   return u * (v / gcd (u, v));
797 }
798
799 /* Return PTR, aligned upward to the next multiple of ALIGNMENT.
800    ALIGNMENT must be nonzero.  The caller must arrange for ((char *)
801    PTR) through ((char *) PTR + ALIGNMENT - 1) to be addressable
802    locations.  */
803
804 static inline void *
805 ptr_align (void const *ptr, size_t alignment)
806 {
807   char const *p0 = ptr;
808   char const *p1 = p0 + alignment - 1;
809   return (void *) (p1 - (size_t) p1 % alignment);
810 }
811
812 /* If 10*Accum + Digit_val is larger than the maximum value for Type,
813    then don't update Accum and return false to indicate it would
814    overflow.  Otherwise, set Accum to that new value and return true.
815    Verify at compile-time that Type is Accum's type, and that Type is
816    unsigned.  Accum must be an object, so that we can take its
817    address.  Accum and Digit_val may be evaluated multiple times.
818
819    The "Added check" below is not strictly required, but it causes GCC
820    to return a nonzero exit status instead of merely a warning
821    diagnostic, and that is more useful.  */
822
823 #define DECIMAL_DIGIT_ACCUMULATE(Accum, Digit_val, Type)                \
824   (                                                                     \
825    (void) (&(Accum) == (Type *) NULL),  /* The type matches.  */        \
826    (void) verify_true (! TYPE_SIGNED (Type)), /* The type is unsigned.  */ \
827    (void) verify_true (sizeof (Accum) == sizeof (Type)), /* Added check.  */ \
828    (((Type) -1 / 10 < (Accum)                                           \
829      || (Type) ((Accum) * 10 + (Digit_val)) < (Accum))                  \
830     ? false : (((Accum) = (Accum) * 10 + (Digit_val)), true))           \
831   )