153469Sobrien/* Portability cruft.  Include after config.h and sys/types.h.
2126432Sache   Copyright 1996, 1998, 1999, 2000 Free Software Foundation, Inc.
353469Sobrien
453469Sobrien   This program is free software; you can redistribute it and/or modify
553469Sobrien   it under the terms of the GNU General Public License as published by
653469Sobrien   the Free Software Foundation; either version 2, or (at your option)
753469Sobrien   any later version.
853469Sobrien
953469Sobrien   This program is distributed in the hope that it will be useful,
1053469Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
1153469Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1253469Sobrien   GNU General Public License for more details.
1353469Sobrien
1453469Sobrien   You should have received a copy of the GNU General Public License
1553469Sobrien   along with this program; if not, write to the Free Software
1653469Sobrien   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
1753469Sobrien   02111-1307, USA.  */
1853469Sobrien
1953469Sobrien#undef PARAMS
2053469Sobrien#if defined (__STDC__) && __STDC__
2153469Sobrien# ifndef _PTR_T
2253469Sobrien# define _PTR_T
2353469Sobrien  typedef void * ptr_t;
2453469Sobrien# endif
2553469Sobrien# define PARAMS(x) x
2653469Sobrien#else
2753469Sobrien# ifndef _PTR_T
2853469Sobrien# define _PTR_T
2953469Sobrien  typedef char * ptr_t;
3053469Sobrien# endif
3153469Sobrien# define PARAMS(x) ()
3253469Sobrien#endif
3353469Sobrien
3453469Sobrien#ifdef HAVE_UNISTD_H
3553469Sobrien# include <fcntl.h>
3653469Sobrien# include <unistd.h>
3753469Sobrien#else
3853469Sobrien# define O_RDONLY 0
3955360Sobrien# define SEEK_SET 0
4055360Sobrien# define SEEK_CUR 1
4153469Sobrienint open(), read(), close();
4253469Sobrien#endif
4353469Sobrien
4453469Sobrien#include <errno.h>
4553469Sobrien#ifndef errno
4653469Sobrienextern int errno;
4753469Sobrien#endif
4853469Sobrien
4953469Sobrien#ifndef HAVE_STRERROR
5053469Sobrienextern int sys_nerr;
5153469Sobrienextern char *sys_errlist[];
5253469Sobrien# define strerror(E) (0 <= (E) && (E) < sys_nerr ? _(sys_errlist[E]) : _("Unknown system error"))
5353469Sobrien#endif
5453469Sobrien
5553469Sobrien/* Some operating systems treat text and binary files differently.  */
56131554Stjr#ifdef __BEOS__
57131554Stjr# undef O_BINARY /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */
58131554Stjr#endif
59131554Stjr#ifdef HAVE_DOS_FILE_CONTENTS
6053469Sobrien# include <io.h>
6153469Sobrien# ifdef HAVE_SETMODE
6253469Sobrien#  define SET_BINARY(fd)  setmode (fd, O_BINARY)
6353469Sobrien# else
6453469Sobrien#  define SET_BINARY(fd)  _setmode (fd, O_BINARY)
6553469Sobrien# endif
6653469Sobrien#endif
6753469Sobrien
6853469Sobrien#ifdef HAVE_DOS_FILE_NAMES
6953469Sobrien# define IS_SLASH(c) ((c) == '/' || (c) == '\\')
7053469Sobrien# define FILESYSTEM_PREFIX_LEN(f) ((f)[0] && (f)[1] == ':' ? 2 : 0)
7153469Sobrien#endif
7253469Sobrien
7353469Sobrien#ifndef IS_SLASH
7453469Sobrien# define IS_SLASH(c) ((c) == '/')
7553469Sobrien#endif
7653469Sobrien
7753469Sobrien#ifndef FILESYSTEM_PREFIX_LEN
7853469Sobrien# define FILESYSTEM_PREFIX_LEN(f) 0
7953469Sobrien#endif
8053469Sobrien
81131554Stjrint isdir PARAMS ((char const *));
82131554Stjr
83131554Stjr#ifdef HAVE_DIR_EACCES_BUG
8453469Sobrien# ifdef EISDIR
8553469Sobrien#  define is_EISDIR(e, f) \
8653469Sobrien     ((e) == EISDIR \
87131554Stjr      || ((e) == EACCES && isdir (f) && ((e) = EISDIR, 1)))
8853469Sobrien# else
89131554Stjr#  define is_EISDIR(e, f) ((e) == EACCES && isdir (f))
9053469Sobrien# endif
9153469Sobrien#endif
9253469Sobrien
9353469Sobrien#ifndef is_EISDIR
9453469Sobrien# ifdef EISDIR
9553469Sobrien#  define is_EISDIR(e, f) ((e) == EISDIR)
9653469Sobrien# else
9753469Sobrien#  define is_EISDIR(e, f) 0
9853469Sobrien# endif
9953469Sobrien#endif
10053469Sobrien
10153469Sobrien#if STAT_MACROS_BROKEN
10253469Sobrien# undef S_ISDIR
10355360Sobrien# undef S_ISREG
10453469Sobrien#endif
10553469Sobrien#if !defined(S_ISDIR) && defined(S_IFDIR)
10653469Sobrien# define S_ISDIR(Mode) (((Mode) & S_IFMT) == S_IFDIR)
10753469Sobrien#endif
10855360Sobrien#if !defined(S_ISREG) && defined(S_IFREG)
10955360Sobrien# define S_ISREG(Mode) (((Mode) & S_IFMT) == S_IFREG)
11055360Sobrien#endif
11153469Sobrien
11253469Sobrien#ifdef STDC_HEADERS
11353469Sobrien# include <stdlib.h>
11453469Sobrien#else
11555360Sobrienchar *getenv ();
11653469Sobrienptr_t malloc(), realloc(), calloc();
11753469Sobrienvoid free();
11853469Sobrien#endif
11953469Sobrien
12053469Sobrien#if __STDC__
12153469Sobrien# include <stddef.h>
12253469Sobrien#endif
12353469Sobrien#ifdef STDC_HEADERS
12453469Sobrien# include <limits.h>
12553469Sobrien#endif
12653469Sobrien#ifndef CHAR_BIT
12753469Sobrien# define CHAR_BIT 8
12853469Sobrien#endif
12956230Sru/* The extra casts work around common compiler bugs.  */
13056230Sru#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
13156230Sru#define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
13256230Sru			      ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \
13356230Sru			      : (t) 0))
13456230Sru#define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
13556230Sru#ifndef CHAR_MAX
13656230Sru# define CHAR_MAX TYPE_MAXIMUM (char)
13756230Sru#endif
13853469Sobrien#ifndef INT_MAX
13956230Sru# define INT_MAX TYPE_MAXIMUM (int)
14053469Sobrien#endif
14153469Sobrien#ifndef UCHAR_MAX
14256230Sru# define UCHAR_MAX TYPE_MAXIMUM (unsigned char)
14353469Sobrien#endif
14453469Sobrien
14553469Sobrien#if !defined(STDC_HEADERS) && defined(HAVE_STRING_H) && defined(HAVE_MEMORY_H)
14653469Sobrien# include <memory.h>
14753469Sobrien#endif
14853469Sobrien#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
14953469Sobrien# include <string.h>
15053469Sobrien#else
15153469Sobrien# include <strings.h>
15253469Sobrien# undef strchr
15353469Sobrien# define strchr index
15453469Sobrien# undef strrchr
15553469Sobrien# define strrchr rindex
15653469Sobrien# undef memcpy
15755360Sobrien# define memcpy(d, s, n) bcopy (s, d, n)
15853469Sobrien#endif
15953469Sobrien#ifndef HAVE_MEMCHR
16053469Sobrienptr_t memchr();
16153469Sobrien#endif
16255360Sobrien#if ! defined HAVE_MEMMOVE && ! defined memmove
16355360Sobrien# define memmove(d, s, n) bcopy (s, d, n)
16455360Sobrien#endif
16553469Sobrien
16653469Sobrien#include <ctype.h>
16753469Sobrien
16853469Sobrien#ifndef isgraph
16953469Sobrien# define isgraph(C) (isprint(C) && !isspace(C))
17053469Sobrien#endif
17153469Sobrien
17253469Sobrien#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
17353469Sobrien# define IN_CTYPE_DOMAIN(c) 1
17453469Sobrien#else
17553469Sobrien# define IN_CTYPE_DOMAIN(c) isascii(c)
17653469Sobrien#endif
17753469Sobrien
17853469Sobrien#define ISALPHA(C)	(IN_CTYPE_DOMAIN (C) && isalpha (C))
17953469Sobrien#define ISUPPER(C)	(IN_CTYPE_DOMAIN (C) && isupper (C))
18053469Sobrien#define ISLOWER(C)	(IN_CTYPE_DOMAIN (C) && islower (C))
18153469Sobrien#define ISDIGIT(C)	(IN_CTYPE_DOMAIN (C) && isdigit (C))
18253469Sobrien#define ISXDIGIT(C)	(IN_CTYPE_DOMAIN (C) && isxdigit (C))
18353469Sobrien#define ISSPACE(C)	(IN_CTYPE_DOMAIN (C) && isspace (C))
18453469Sobrien#define ISPUNCT(C)	(IN_CTYPE_DOMAIN (C) && ispunct (C))
18553469Sobrien#define ISALNUM(C)	(IN_CTYPE_DOMAIN (C) && isalnum (C))
18653469Sobrien#define ISPRINT(C)	(IN_CTYPE_DOMAIN (C) && isprint (C))
18753469Sobrien#define ISGRAPH(C)	(IN_CTYPE_DOMAIN (C) && isgraph (C))
18853469Sobrien#define ISCNTRL(C)	(IN_CTYPE_DOMAIN (C) && iscntrl (C))
18953469Sobrien
19053469Sobrien#define TOLOWER(C) (ISUPPER(C) ? tolower(C) : (C))
19153469Sobrien
19253469Sobrien#if ENABLE_NLS
19353469Sobrien# include <libintl.h>
19453469Sobrien# define _(String) gettext (String)
19553469Sobrien#else
19653469Sobrien# define _(String) String
19753469Sobrien#endif
19853469Sobrien#define N_(String) String
19953469Sobrien
20053469Sobrien#if HAVE_SETLOCALE
20153469Sobrien# include <locale.h>
20253469Sobrien#endif
20353469Sobrien
20453469Sobrien#ifndef initialize_main
20553469Sobrien#define initialize_main(argcp, argvp)
20653469Sobrien#endif
207