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
24you 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
106struct 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
118void *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.  */
151enum
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.  */
161static inline void
162initialize_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.  */
470static 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
498void free ();
499#endif
500
501#if !HAVE_DECL_MALLOC
502char *malloc ();
503#endif
504
505#if !HAVE_DECL_MEMCHR
506char *memchr ();
507#endif
508
509#if !HAVE_DECL_REALLOC
510char *realloc ();
511#endif
512
513#if !HAVE_DECL_STPCPY
514# ifndef stpcpy
515char *stpcpy ();
516# endif
517#endif
518
519#if !HAVE_DECL_STRNDUP
520char *strndup ();
521#endif
522
523#if !HAVE_DECL_STRSTR
524char *strstr ();
525#endif
526
527#if !HAVE_DECL_GETENV
528char *getenv ();
529#endif
530
531#if !HAVE_DECL_LSEEK
532off_t lseek ();
533#endif
534
535/* This is needed on some AIX systems.  */
536#if !HAVE_DECL_STRTOUL
537unsigned long strtoul ();
538#endif
539
540#if !HAVE_DECL_GETLOGIN
541char *getlogin ();
542#endif
543
544#if !HAVE_DECL_TTYNAME
545char *ttyname ();
546#endif
547
548#if !HAVE_DECL_GETEUID
549uid_t geteuid ();
550#endif
551
552#if !HAVE_DECL_GETPWUID
553struct passwd *getpwuid ();
554#endif
555
556#if !HAVE_DECL_GETGRGID
557struct group *getgrgid ();
558#endif
559
560#if !HAVE_DECL_GETUID
561uid_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 `..'.  */
583static inline struct dirent const *
584readdir_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.  */
607enum
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
796static inline size_t
797gcd (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
814static inline size_t
815lcm (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
825static inline void *
826ptr_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}
832