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