1/* Portability cruft.  Include after config.h and sys/types.h.
2   Copyright 1996, 1998, 1999, 2000 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
16   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17   02111-1307, USA.  */
18
19#undef PARAMS
20#if defined (__STDC__) && __STDC__
21# ifndef _PTR_T
22# define _PTR_T
23  typedef void * ptr_t;
24# endif
25# define PARAMS(x) x
26#else
27# ifndef _PTR_T
28# define _PTR_T
29  typedef char * ptr_t;
30# endif
31# define PARAMS(x) ()
32#endif
33
34#ifdef HAVE_UNISTD_H
35# include <fcntl.h>
36# include <unistd.h>
37#else
38# define O_RDONLY 0
39# define SEEK_SET 0
40# define SEEK_CUR 1
41int open(), read(), close();
42#endif
43
44#include <errno.h>
45#ifndef errno
46extern int errno;
47#endif
48
49#ifndef HAVE_STRERROR
50extern int sys_nerr;
51extern char *sys_errlist[];
52# define strerror(E) (0 <= (E) && (E) < sys_nerr ? _(sys_errlist[E]) : _("Unknown system error"))
53#endif
54
55/* Some operating systems treat text and binary files differently.  */
56#ifdef __BEOS__
57# undef O_BINARY /* BeOS 5 has O_BINARY and O_TEXT, but they have no effect. */
58#endif
59#ifdef HAVE_DOS_FILE_CONTENTS
60# include <io.h>
61# ifdef HAVE_SETMODE
62#  define SET_BINARY(fd)  setmode (fd, O_BINARY)
63# else
64#  define SET_BINARY(fd)  _setmode (fd, O_BINARY)
65# endif
66#endif
67
68#ifdef HAVE_DOS_FILE_NAMES
69# define IS_SLASH(c) ((c) == '/' || (c) == '\\')
70# define FILESYSTEM_PREFIX_LEN(f) ((f)[0] && (f)[1] == ':' ? 2 : 0)
71#endif
72
73#ifndef IS_SLASH
74# define IS_SLASH(c) ((c) == '/')
75#endif
76
77#ifndef FILESYSTEM_PREFIX_LEN
78# define FILESYSTEM_PREFIX_LEN(f) 0
79#endif
80
81int isdir PARAMS ((char const *));
82
83#ifdef HAVE_DIR_EACCES_BUG
84# ifdef EISDIR
85#  define is_EISDIR(e, f) \
86     ((e) == EISDIR \
87      || ((e) == EACCES && isdir (f) && ((e) = EISDIR, 1)))
88# else
89#  define is_EISDIR(e, f) ((e) == EACCES && isdir (f))
90# endif
91#endif
92
93#ifndef is_EISDIR
94# ifdef EISDIR
95#  define is_EISDIR(e, f) ((e) == EISDIR)
96# else
97#  define is_EISDIR(e, f) 0
98# endif
99#endif
100
101#if STAT_MACROS_BROKEN
102# undef S_ISDIR
103# undef S_ISREG
104#endif
105#if !defined(S_ISDIR) && defined(S_IFDIR)
106# define S_ISDIR(Mode) (((Mode) & S_IFMT) == S_IFDIR)
107#endif
108#if !defined(S_ISREG) && defined(S_IFREG)
109# define S_ISREG(Mode) (((Mode) & S_IFMT) == S_IFREG)
110#endif
111
112#ifdef STDC_HEADERS
113# include <stdlib.h>
114#else
115char *getenv ();
116ptr_t malloc(), realloc(), calloc();
117void free();
118#endif
119
120#if __STDC__
121# include <stddef.h>
122#endif
123#ifdef STDC_HEADERS
124# include <limits.h>
125#endif
126#ifndef CHAR_BIT
127# define CHAR_BIT 8
128#endif
129/* The extra casts work around common compiler bugs.  */
130#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
131#define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
132			      ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \
133			      : (t) 0))
134#define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
135#ifndef CHAR_MAX
136# define CHAR_MAX TYPE_MAXIMUM (char)
137#endif
138#ifndef INT_MAX
139# define INT_MAX TYPE_MAXIMUM (int)
140#endif
141#ifndef UCHAR_MAX
142# define UCHAR_MAX TYPE_MAXIMUM (unsigned char)
143#endif
144
145#if !defined(STDC_HEADERS) && defined(HAVE_STRING_H) && defined(HAVE_MEMORY_H)
146# include <memory.h>
147#endif
148#if defined(STDC_HEADERS) || defined(HAVE_STRING_H)
149# include <string.h>
150#else
151# include <strings.h>
152# undef strchr
153# define strchr index
154# undef strrchr
155# define strrchr rindex
156# undef memcpy
157# define memcpy(d, s, n) bcopy (s, d, n)
158#endif
159#ifndef HAVE_MEMCHR
160ptr_t memchr();
161#endif
162#if ! defined HAVE_MEMMOVE && ! defined memmove
163# define memmove(d, s, n) bcopy (s, d, n)
164#endif
165
166#include <ctype.h>
167
168#ifndef isgraph
169# define isgraph(C) (isprint(C) && !isspace(C))
170#endif
171
172#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII))
173# define IN_CTYPE_DOMAIN(c) 1
174#else
175# define IN_CTYPE_DOMAIN(c) isascii(c)
176#endif
177
178#define ISALPHA(C)	(IN_CTYPE_DOMAIN (C) && isalpha (C))
179#define ISUPPER(C)	(IN_CTYPE_DOMAIN (C) && isupper (C))
180#define ISLOWER(C)	(IN_CTYPE_DOMAIN (C) && islower (C))
181#define ISDIGIT(C)	(IN_CTYPE_DOMAIN (C) && isdigit (C))
182#define ISXDIGIT(C)	(IN_CTYPE_DOMAIN (C) && isxdigit (C))
183#define ISSPACE(C)	(IN_CTYPE_DOMAIN (C) && isspace (C))
184#define ISPUNCT(C)	(IN_CTYPE_DOMAIN (C) && ispunct (C))
185#define ISALNUM(C)	(IN_CTYPE_DOMAIN (C) && isalnum (C))
186#define ISPRINT(C)	(IN_CTYPE_DOMAIN (C) && isprint (C))
187#define ISGRAPH(C)	(IN_CTYPE_DOMAIN (C) && isgraph (C))
188#define ISCNTRL(C)	(IN_CTYPE_DOMAIN (C) && iscntrl (C))
189
190#define TOLOWER(C) (ISUPPER(C) ? tolower(C) : (C))
191
192#if ENABLE_NLS
193# include <libintl.h>
194# define _(String) gettext (String)
195#else
196# define _(String) String
197#endif
198#define N_(String) String
199
200#if HAVE_SETLOCALE
201# include <locale.h>
202#endif
203
204#ifndef initialize_main
205#define initialize_main(argcp, argvp)
206#endif
207