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