Include <stdint.h> unconditionally, since we
[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 enum
245 {
246   NOT_AN_INODE_NUMBER = 0
247 };
248
249 #ifdef D_INO_IN_DIRENT
250 # define D_INO(dp) ((dp)->d_ino)
251 #else
252 /* Some systems don't have inodes, so fake them to avoid lots of ifdefs.  */
253 # define D_INO(dp) NOT_AN_INODE_NUMBER
254 #endif
255
256 /* Get or fake the disk device blocksize.
257    Usually defined by sys/param.h (if at all).  */
258 #if !defined DEV_BSIZE && defined BSIZE
259 # define DEV_BSIZE BSIZE
260 #endif
261 #if !defined DEV_BSIZE && defined BBSIZE /* SGI */
262 # define DEV_BSIZE BBSIZE
263 #endif
264 #ifndef DEV_BSIZE
265 # define DEV_BSIZE 4096
266 #endif
267
268 /* Extract or fake data from a `struct stat'.
269    ST_BLKSIZE: Preferred I/O blocksize for the file, in bytes.
270    ST_NBLOCKS: Number of blocks in the file, including indirect blocks.
271    ST_NBLOCKSIZE: Size of blocks used when calculating ST_NBLOCKS.  */
272 #ifndef HAVE_STRUCT_STAT_ST_BLOCKS
273 # define ST_BLKSIZE(statbuf) DEV_BSIZE
274 # if defined _POSIX_SOURCE || !defined BSIZE /* fileblocks.c uses BSIZE.  */
275 #  define ST_NBLOCKS(statbuf) \
276   ((statbuf).st_size / ST_NBLOCKSIZE + ((statbuf).st_size % ST_NBLOCKSIZE != 0))
277 # else /* !_POSIX_SOURCE && BSIZE */
278 #  define ST_NBLOCKS(statbuf) \
279   (S_ISREG ((statbuf).st_mode) \
280    || S_ISDIR ((statbuf).st_mode) \
281    ? st_blocks ((statbuf).st_size) : 0)
282 # endif /* !_POSIX_SOURCE && BSIZE */
283 #else /* HAVE_STRUCT_STAT_ST_BLOCKS */
284 /* Some systems, like Sequents, return st_blksize of 0 on pipes.
285    Also, when running `rsh hpux11-system cat any-file', cat would
286    determine that the output stream had an st_blksize of 2147421096.
287    So here we arbitrarily limit the `optimal' block size to 4MB.
288    If anyone knows of a system for which the legitimate value for
289    st_blksize can exceed 4MB, please report it as a bug in this code.  */
290 # define ST_BLKSIZE(statbuf) ((0 < (statbuf).st_blksize \
291                                && (statbuf).st_blksize <= (1 << 22)) /* 4MB */ \
292                               ? (statbuf).st_blksize : DEV_BSIZE)
293 # if defined hpux || defined __hpux__ || defined __hpux
294 /* HP-UX counts st_blocks in 1024-byte units.
295    This loses when mixing HP-UX and BSD file systems with NFS.  */
296 #  define ST_NBLOCKSIZE 1024
297 # else /* !hpux */
298 #  if defined _AIX && defined _I386
299 /* AIX PS/2 counts st_blocks in 4K units.  */
300 #   define ST_NBLOCKSIZE (4 * 1024)
301 #  else /* not AIX PS/2 */
302 #   if defined _CRAY
303 #    define ST_NBLOCKS(statbuf) \
304   (S_ISREG ((statbuf).st_mode) \
305    || S_ISDIR ((statbuf).st_mode) \
306    ? (statbuf).st_blocks * ST_BLKSIZE(statbuf)/ST_NBLOCKSIZE : 0)
307 #   endif /* _CRAY */
308 #  endif /* not AIX PS/2 */
309 # endif /* !hpux */
310 #endif /* HAVE_STRUCT_STAT_ST_BLOCKS */
311
312 #ifndef ST_NBLOCKS
313 # define ST_NBLOCKS(statbuf) ((statbuf).st_blocks)
314 #endif
315
316 #ifndef ST_NBLOCKSIZE
317 # ifdef S_BLKSIZE
318 #  define ST_NBLOCKSIZE S_BLKSIZE
319 # else
320 #  define ST_NBLOCKSIZE 512
321 # endif
322 #endif
323
324 /* Redirection and wildcarding when done by the utility itself.
325    Generally a noop, but used in particular for native VMS. */
326 #ifndef initialize_main
327 # define initialize_main(ac, av)
328 #endif
329
330 #include "stat-macros.h"
331
332 #include "timespec.h"
333
334 #if HAVE_INTTYPES_H
335 # include <inttypes.h>
336 #endif
337 #include <stdint.h>
338
339 #if ULONG_MAX_LT_ULLONG_MAX
340 # define LONGEST_MODIFIER "ll"
341 #else
342 # define LONGEST_MODIFIER "l"
343 #endif
344 #if PRI_MACROS_BROKEN
345 # undef PRIdMAX
346 # undef PRIoMAX
347 # undef PRIuMAX
348 # undef PRIxMAX
349 #endif
350 #ifndef PRIdMAX
351 # define PRIdMAX LONGEST_MODIFIER "d"
352 #endif
353 #ifndef PRIoMAX
354 # define PRIoMAX LONGEST_MODIFIER "o"
355 #endif
356 #ifndef PRIuMAX
357 # define PRIuMAX LONGEST_MODIFIER "u"
358 #endif
359 #ifndef PRIxMAX
360 # define PRIxMAX LONGEST_MODIFIER "x"
361 #endif
362
363 #include <ctype.h>
364
365 /* Jim Meyering writes:
366
367    "... Some ctype macros are valid only for character codes that
368    isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
369    using /bin/cc or gcc but without giving an ansi option).  So, all
370    ctype uses should be through macros like ISPRINT...  If
371    STDC_HEADERS is defined, then autoconf has verified that the ctype
372    macros don't need to be guarded with references to isascii. ...
373    Defining isascii to 1 should let any compiler worth its salt
374    eliminate the && through constant folding."
375
376    Bruno Haible adds:
377
378    "... Furthermore, isupper(c) etc. have an undefined result if c is
379    outside the range -1 <= c <= 255. One is tempted to write isupper(c)
380    with c being of type `char', but this is wrong if c is an 8-bit
381    character >= 128 which gets sign-extended to a negative value.
382    The macro ISUPPER protects against this as well."  */
383
384 #if STDC_HEADERS || (!defined isascii && !HAVE_ISASCII)
385 # define IN_CTYPE_DOMAIN(c) 1
386 #else
387 # define IN_CTYPE_DOMAIN(c) isascii(c)
388 #endif
389
390 #ifdef isblank
391 # define ISBLANK(c) (IN_CTYPE_DOMAIN (c) && isblank (c))
392 #else
393 # define ISBLANK(c) ((c) == ' ' || (c) == '\t')
394 #endif
395 #ifdef isgraph
396 # define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isgraph (c))
397 #else
398 # define ISGRAPH(c) (IN_CTYPE_DOMAIN (c) && isprint (c) && !isspace (c))
399 #endif
400
401 /* This is defined in <sys/euc.h> on at least Solaris2.6 systems.  */
402 #undef ISPRINT
403
404 #define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c))
405 #define ISALNUM(c) (IN_CTYPE_DOMAIN (c) && isalnum (c))
406 #define ISALPHA(c) (IN_CTYPE_DOMAIN (c) && isalpha (c))
407 #define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c))
408 #define ISLOWER(c) (IN_CTYPE_DOMAIN (c) && islower (c))
409 #define ISPUNCT(c) (IN_CTYPE_DOMAIN (c) && ispunct (c))
410 #define ISSPACE(c) (IN_CTYPE_DOMAIN (c) && isspace (c))
411 #define ISUPPER(c) (IN_CTYPE_DOMAIN (c) && isupper (c))
412 #define ISXDIGIT(c) (IN_CTYPE_DOMAIN (c) && isxdigit (c))
413 #define ISDIGIT_LOCALE(c) (IN_CTYPE_DOMAIN (c) && isdigit (c))
414
415 #if STDC_HEADERS
416 # define TOLOWER(Ch) tolower (Ch)
417 # define TOUPPER(Ch) toupper (Ch)
418 #else
419 # define TOLOWER(Ch) (ISUPPER (Ch) ? tolower (Ch) : (Ch))
420 # define TOUPPER(Ch) (ISLOWER (Ch) ? toupper (Ch) : (Ch))
421 #endif
422
423 /* ISDIGIT differs from ISDIGIT_LOCALE, as follows:
424    - Its arg may be any int or unsigned int; it need not be an unsigned char.
425    - It's guaranteed to evaluate its argument exactly once.
426    - It's typically faster.
427    POSIX says that only '0' through '9' are digits.  Prefer ISDIGIT to
428    ISDIGIT_LOCALE unless it's important to use the locale's definition
429    of `digit' even when the host does not conform to POSIX.  */
430 #define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)
431
432 /* Convert a possibly-signed character to an unsigned character.  This is
433    a bit safer than casting to unsigned char, since it catches some type
434    errors that the cast doesn't.  */
435 static inline unsigned char to_uchar (char ch) { return ch; }
436
437 #include <locale.h>
438
439 /* Take care of NLS matters.  */
440
441 #include "gettext.h"
442 #if ! ENABLE_NLS
443 # undef textdomain
444 # define textdomain(Domainname) /* empty */
445 # undef bindtextdomain
446 # define bindtextdomain(Domainname, Dirname) /* empty */
447 #endif
448
449 #define _(msgid) gettext (msgid)
450 #define N_(msgid) msgid
451
452 #define STREQ(a, b) (strcmp ((a), (b)) == 0)
453
454 #if !HAVE_DECL_FREE
455 void free ();
456 #endif
457
458 #if !HAVE_DECL_MALLOC
459 char *malloc ();
460 #endif
461
462 #if !HAVE_DECL_MEMCHR
463 char *memchr ();
464 #endif
465
466 #if !HAVE_DECL_REALLOC
467 char *realloc ();
468 #endif
469
470 #if !HAVE_DECL_STPCPY
471 # ifndef stpcpy
472 char *stpcpy ();
473 # endif
474 #endif
475
476 #if !HAVE_DECL_STRNDUP
477 char *strndup ();
478 #endif
479
480 #if !HAVE_DECL_STRSTR
481 char *strstr ();
482 #endif
483
484 #if !HAVE_DECL_GETENV
485 char *getenv ();
486 #endif
487
488 #if !HAVE_DECL_LSEEK
489 off_t lseek ();
490 #endif
491
492 /* This is needed on some AIX systems.  */
493 #if !HAVE_DECL_STRTOUL
494 unsigned long strtoul ();
495 #endif
496
497 #if !HAVE_DECL_GETLOGIN
498 char *getlogin ();
499 #endif
500
501 #if !HAVE_DECL_TTYNAME
502 char *ttyname ();
503 #endif
504
505 #if !HAVE_DECL_GETEUID
506 uid_t geteuid ();
507 #endif
508
509 #if !HAVE_DECL_GETPWUID
510 struct passwd *getpwuid ();
511 #endif
512
513 #if !HAVE_DECL_GETGRGID
514 struct group *getgrgid ();
515 #endif
516
517 #if !HAVE_DECL_GETUID
518 uid_t getuid ();
519 #endif
520
521 #include "xalloc.h"
522 #include "verify.h"
523
524 /* This is simply a shorthand for the common case in which
525    the third argument to x2nrealloc would be `sizeof *(P)'.
526    Ensure that sizeof *(P) is *not* 1.  In that case, it'd be
527    better to use X2REALLOC, although not strictly necessary.  */
528 #define X2NREALLOC(P, PN) ((void) verify_true (sizeof *(P) != 1), \
529                            x2nrealloc (P, PN, sizeof *(P)))
530
531 /* Using x2realloc (when appropriate) usually makes your code more
532    readable than using x2nrealloc, but it also makes it so your
533    code will malfunction if sizeof *(P) ever becomes 2 or greater.
534    So use this macro instead of using x2realloc directly.  */
535 #define X2REALLOC(P, PN) ((void) verify_true (sizeof *(P) == 1), \
536                           x2realloc (P, PN))
537
538 #if ! defined HAVE_MEMPCPY && ! defined mempcpy
539 /* Be CAREFUL that there are no side effects in N.  */
540 # define mempcpy(D, S, N) ((void *) ((char *) memcpy (D, S, N) + (N)))
541 #endif
542
543 /* Include automatically-generated macros for unlocked I/O.  */
544 #include "unlocked-io.h"
545 #include "same-inode.h"
546
547 #define DOT_OR_DOTDOT(Basename) \
548   (Basename[0] == '.' && (Basename[1] == '\0' \
549                           || (Basename[1] == '.' && Basename[2] == '\0')))
550
551 /* A wrapper for readdir so that callers don't see entries for `.' or `..'.  */
552 static inline struct dirent const *
553 readdir_ignoring_dot_and_dotdot (DIR *dirp)
554 {
555   while (1)
556     {
557       struct dirent const *dp = readdir (dirp);
558       if (dp == NULL || ! DOT_OR_DOTDOT (dp->d_name))
559         return dp;
560     }
561 }
562
563 #if SETVBUF_REVERSED
564 # define SETVBUF(Stream, Buffer, Type, Size) \
565     setvbuf (Stream, Type, Buffer, Size)
566 #else
567 # define SETVBUF(Stream, Buffer, Type, Size) \
568     setvbuf (Stream, Buffer, Type, Size)
569 #endif
570
571 /* Factor out some of the common --help and --version processing code.  */
572
573 /* These enum values cannot possibly conflict with the option values
574    ordinarily used by commands, including CHAR_MAX + 1, etc.  Avoid
575    CHAR_MIN - 1, as it may equal -1, the getopt end-of-options value.  */
576 enum
577 {
578   GETOPT_HELP_CHAR = (CHAR_MIN - 2),
579   GETOPT_VERSION_CHAR = (CHAR_MIN - 3)
580 };
581
582 #define GETOPT_HELP_OPTION_DECL \
583   "help", no_argument, NULL, GETOPT_HELP_CHAR
584 #define GETOPT_VERSION_OPTION_DECL \
585   "version", no_argument, NULL, GETOPT_VERSION_CHAR
586
587 #define case_GETOPT_HELP_CHAR                   \
588   case GETOPT_HELP_CHAR:                        \
589     usage (EXIT_SUCCESS);                       \
590     break;
591
592 /* Program_name must be a literal string.
593    Usually it is just PROGRAM_NAME.  */
594 #define USAGE_BUILTIN_WARNING \
595   _("\n" \
596 "NOTE: your shell may have its own version of %s, which usually supersedes\n" \
597 "the version described here.  Please refer to your shell's documentation\n" \
598 "for details about the options it supports.\n")
599
600 #define HELP_OPTION_DESCRIPTION \
601   _("      --help     display this help and exit\n")
602 #define VERSION_OPTION_DESCRIPTION \
603   _("      --version  output version information and exit\n")
604
605 #include "closeout.h"
606 #include "version-etc.h"
607
608 #define case_GETOPT_VERSION_CHAR(Program_name, Authors)                 \
609   case GETOPT_VERSION_CHAR:                                             \
610     version_etc (stdout, Program_name, GNU_PACKAGE, VERSION, Authors,   \
611                  (char *) NULL);                                        \
612     exit (EXIT_SUCCESS);                                                \
613     break;
614
615 #ifndef MAX
616 # define MAX(a, b) ((a) > (b) ? (a) : (b))
617 #endif
618
619 #ifndef MIN
620 # define MIN(a,b) (((a) < (b)) ? (a) : (b))
621 #endif
622
623 #include "intprops.h"
624
625 #ifndef CHAR_MIN
626 # define CHAR_MIN TYPE_MINIMUM (char)
627 #endif
628
629 #ifndef CHAR_MAX
630 # define CHAR_MAX TYPE_MAXIMUM (char)
631 #endif
632
633 #ifndef SCHAR_MIN
634 # define SCHAR_MIN (-1 - SCHAR_MAX)
635 #endif
636
637 #ifndef SCHAR_MAX
638 # define SCHAR_MAX (CHAR_MAX == UCHAR_MAX ? CHAR_MAX / 2 : CHAR_MAX)
639 #endif
640
641 #ifndef UCHAR_MAX
642 # define UCHAR_MAX TYPE_MAXIMUM (unsigned char)
643 #endif
644
645 #ifndef SHRT_MIN
646 # define SHRT_MIN TYPE_MINIMUM (short int)
647 #endif
648
649 #ifndef SHRT_MAX
650 # define SHRT_MAX TYPE_MAXIMUM (short int)
651 #endif
652
653 #ifndef INT_MAX
654 # define INT_MAX TYPE_MAXIMUM (int)
655 #endif
656
657 #ifndef INT_MIN
658 # define INT_MIN TYPE_MINIMUM (int)
659 #endif
660
661 #ifndef INTMAX_MAX
662 # define INTMAX_MAX TYPE_MAXIMUM (intmax_t)
663 #endif
664
665 #ifndef INTMAX_MIN
666 # define INTMAX_MIN TYPE_MINIMUM (intmax_t)
667 #endif
668
669 #ifndef UINT_MAX
670 # define UINT_MAX TYPE_MAXIMUM (unsigned int)
671 #endif
672
673 #ifndef LONG_MAX
674 # define LONG_MAX TYPE_MAXIMUM (long int)
675 #endif
676
677 #ifndef ULONG_MAX
678 # define ULONG_MAX TYPE_MAXIMUM (unsigned long int)
679 #endif
680
681 #ifndef SIZE_MAX
682 # define SIZE_MAX TYPE_MAXIMUM (size_t)
683 #endif
684
685 #ifndef SSIZE_MAX
686 # define SSIZE_MAX TYPE_MAXIMUM (ssize_t)
687 #endif
688
689 #ifndef UINTMAX_MAX
690 # define UINTMAX_MAX TYPE_MAXIMUM (uintmax_t)
691 #endif
692
693 #ifndef OFF_T_MIN
694 # define OFF_T_MIN TYPE_MINIMUM (off_t)
695 #endif
696
697 #ifndef OFF_T_MAX
698 # define OFF_T_MAX TYPE_MAXIMUM (off_t)
699 #endif
700
701 #ifndef UID_T_MAX
702 # define UID_T_MAX TYPE_MAXIMUM (uid_t)
703 #endif
704
705 #ifndef GID_T_MAX
706 # define GID_T_MAX TYPE_MAXIMUM (gid_t)
707 #endif
708
709 #ifndef PID_T_MAX
710 # define PID_T_MAX TYPE_MAXIMUM (pid_t)
711 #endif
712
713 /* Use this to suppress gcc's `...may be used before initialized' warnings. */
714 #ifdef lint
715 # define IF_LINT(Code) Code
716 #else
717 # define IF_LINT(Code) /* empty */
718 #endif
719
720 #ifndef __attribute__
721 # if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__
722 #  define __attribute__(x) /* empty */
723 # endif
724 #endif
725
726 #ifndef ATTRIBUTE_NORETURN
727 # define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__))
728 #endif
729
730 #ifndef ATTRIBUTE_UNUSED
731 # define ATTRIBUTE_UNUSED __attribute__ ((__unused__))
732 #endif
733
734 #if defined strdupa
735 # define ASSIGN_STRDUPA(DEST, S)                \
736   do { DEST = strdupa (S); } while (0)
737 #else
738 # define ASSIGN_STRDUPA(DEST, S)                \
739   do                                            \
740     {                                           \
741       const char *s_ = (S);                     \
742       size_t len_ = strlen (s_) + 1;            \
743       char *tmp_dest_ = alloca (len_);          \
744       DEST = memcpy (tmp_dest_, (s_), len_);    \
745     }                                           \
746   while (0)
747 #endif
748
749 #ifndef EOVERFLOW
750 # define EOVERFLOW EINVAL
751 #endif
752
753 #if ! HAVE_FSEEKO && ! defined fseeko
754 # define fseeko(s, o, w) ((o) == (long int) (o)         \
755                           ? fseek (s, o, w)             \
756                           : (errno = EOVERFLOW, -1))
757 #endif
758
759 #if ! HAVE_SYNC
760 # define sync() /* empty */
761 #endif
762
763 /* Compute the greatest common divisor of U and V using Euclid's
764    algorithm.  U and V must be nonzero.  */
765
766 static inline size_t
767 gcd (size_t u, size_t v)
768 {
769   do
770     {
771       size_t t = u % v;
772       u = v;
773       v = t;
774     }
775   while (v);
776
777   return u;
778 }
779
780 /* Compute the least common multiple of U and V.  U and V must be
781    nonzero.  There is no overflow checking, so callers should not
782    specify outlandish sizes.  */
783
784 static inline size_t
785 lcm (size_t u, size_t v)
786 {
787   return u * (v / gcd (u, v));
788 }
789
790 /* Return PTR, aligned upward to the next multiple of ALIGNMENT.
791    ALIGNMENT must be nonzero.  The caller must arrange for ((char *)
792    PTR) through ((char *) PTR + ALIGNMENT - 1) to be addressable
793    locations.  */
794
795 static inline void *
796 ptr_align (void const *ptr, size_t alignment)
797 {
798   char const *p0 = ptr;
799   char const *p1 = p0 + alignment - 1;
800   return (void *) (p1 - (size_t) p1 % alignment);
801 }
802
803 /* If 10*Accum + Digit_val is larger than the maximum value for Type,
804    then don't update Accum and return false to indicate it would
805    overflow.  Otherwise, set Accum to that new value and return true.
806    Verify at compile-time that Type is Accum's type, and that Type is
807    unsigned.  Accum must be an object, so that we can take its
808    address.  Accum and Digit_val may be evaluated multiple times.
809
810    The "Added check" below is not strictly required, but it causes GCC
811    to return a nonzero exit status instead of merely a warning
812    diagnostic, and that is more useful.  */
813
814 #define DECIMAL_DIGIT_ACCUMULATE(Accum, Digit_val, Type)                \
815   (                                                                     \
816    (void) (&(Accum) == (Type *) NULL),  /* The type matches.  */        \
817    (void) verify_true (! TYPE_SIGNED (Type)), /* The type is unsigned.  */ \
818    (void) verify_true (sizeof (Accum) == sizeof (Type)), /* Added check.  */ \
819    (((Type) -1 / 10 < (Accum)                                           \
820      || (Type) ((Accum) * 10 + (Digit_val)) < (Accum))                  \
821     ? false : (((Accum) = (Accum) * 10 + (Digit_val)), true))           \
822   )