/* std.h - automagically adapt to old and new compilers.
   In the Public Domain; written by Mike Haertel. */

/* MS-DOS port (c) 1990 by Thorsten Ohl, ohl@gnu.ai.mit.edu
   This port is also distributed under the terms of the
   GNU General Public License as published by the
   Free Software Foundation.

   Please note that this file is not identical to the
   original GNU release, you should have received this
   code as patch to the official release.

   $Header: e:/gnu/fgrep/RCS/std.h 1.1.0.3 90/09/24 00:38:01 tho Exp $
 */

#if __STDC__

#include <stddef.h>
#include <limits.h>

typedef void *PTR;
typedef const void *PTRCONST;

#define AND ,
#define DEFUN(F, L, P) F(P)
#define EXFUN(F, P) F P

#else

#define const
#define volatile

/* The following approximations of <stddef.h> and <limits.h> are appropriate
   for most machines. */
typedef int ptrdiff_t;
typedef unsigned int size_t;
#define NULL 0
#define offsetof(T, M) ((size_t)&((T *) 0)->(M))

#define CHAR_BIT 8
#define SCHAR_MIN -128
#define SCHAR_MAX 127
#define UCHAR_MAX 255
#define CHAR_MIN ((char) UCHAR_MAX < 0 ? SCHAR_MIN : 0)
#define CHAR_MAX ((char) UCHAR_MAX < 0 ? SCHAR_MAX : UCHAR_MAX)
#define SHRT_MIN -32768
#define SHRT_MAX 32767
#define USHRT_MAX 65535
#define INT_MIN (sizeof (int) == 2 ? -32768 : -2147483648)
#define INT_MAX (sizeof (int) == 2 ? 32767 : 2147483647)
#define UINT_MAX (sizeof (int) == 2 ? 65535 : 4294967295)
#define LONG_MIN -2147483648L
#define LONG_MAX 2147483647L
#define ULONG_MAX 4294967295

typedef char *PTR;
typedef const char *PTRCONST;

#define AND ;
#define DEFUN(F, L, P) F L P ;
#define EXFUN(F, P) F()

#endif

/* Deal with <ctype.h> lossage. */
#include <ctype.h>

#ifndef isascii

#define ISALNUM(C) isalnum(C)
#define ISALPHA(C) isalpha(C)
#define ISCNTRL(C) iscntrl(C)
#define ISDIGIT(C) isdigit(C)
#define ISGRAPH(C) isgraph(C)
#define ISLOWER(C) islower(C)
#define ISPRINT(C) isprint(C)
#define ISPUNCT(C) ispunct(C)
#define ISSPACE(C) isspace(C)
#define ISUPPER(C) isupper(C)
#define ISXDIGIT(C) isxdigit(C)
#define TOLOWER(C) tolower(C)
#define TOUPPER(C) toupper(C)

#else

#define ISALNUM(C) (isascii(C) && isalnum(C))
#define ISALPHA(C) (isascii(C) && isalpha(C))
#define ISCNTRL(C) (isascii(C) && iscntrl(C))
#define ISDIGIT(C) (isascii(C) && isdigit(C))
#define ISGRAPH(C) (isascii(C) && isgraph(C))
#define ISLOWER(C) (isascii(C) && islower(C))
#define ISPRINT(C) (isascii(C) && isprint(C))
#define ISPUNCT(C) (isascii(C) && ispunct(C))
#define ISSPACE(C) (isascii(C) && isspace(C))
#define ISUPPER(C) (isascii(C) && isupper(C))
#define ISXDIGIT(C) (isascii(C) && isxdigit(C))
#define TOLOWER(C) (ISUPPER(C) ? tolower(C) : (C))
#define TOUPPER(C) (ISLOWER(C) ? toupper(C) : (C))

#endif

/* Declaring this here should be safe.  Some losing <errno.h>'s don't. */
#ifndef MSDOS
extern int errno;
#endif

/* Adapt variable arguments to new implementations (with <stdarg.h>)
   or old (which are assumed to have <varargs.h>). */

#if __STDC__

#include <stdarg.h>

#define VA_ALIST ...
#define VA_DCL ...
#define VA_LIST va_list
#define VA_START(AP, LASTARG) va_start(AP, LASTARG)
#define VA_ARG(AP, TYPE) va_arg(AP, TYPE)
#define VA_END(AP) va_end(AP)

#define VA_DEFUN(F, L, P) F(P)

#else

#include <varargs.h>

#define VA_ALIST va_alist
#define VA_DCL va_dcl
#define VA_LIST va_list
#define VA_START(AP, LASTARG) va_start(AP)
#define VA_ARG(AP, TYPE) va_arg(AP, TYPE)
#define VA_END(AP) va_end(AP)

#define VA_DEFUN(F, L, P) F L P

#endif

/* Declarations of traditional library routines. */
#ifdef MSDOS
#include <stdlib.h>
extern void *xmalloc (size_t size);
extern void *xrealloc (void *ptr, size_t size);
#else /* not MSDOS */
extern double EXFUN(atof, (const char *));
extern int EXFUN(atoi, (const char *));
extern long int EXFUN(atol, (const char *));
extern int EXFUN(rand, (void));
extern void EXFUN(srand, (int));
extern PTR EXFUN(calloc, (size_t, size_t));
extern void EXFUN(free, (PTR));
extern PTR EXFUN(malloc, (size_t));
extern PTR EXFUN(realloc, (PTR, size_t));
extern void EXFUN(abort, (void));
extern void EXFUN(exit, (int));
extern char *EXFUN(getenv, (const char *));
extern int EXFUN(system, (const char *));
extern void EXFUN(qsort, (PTR, size_t, size_t,
			  int EXFUN((*), (PTRCONST, PTRCONST))));
extern int EXFUN(abs, (int));
extern long int EXFUN(labs, (long int));

#ifdef X_strerror
extern char *EXFUN(strerror, (int));
#endif
#endif /* not MSDOS */
