/*===========================================================================*
* *
* prelude.h - *
* *
* Copyright (c) 1991-2003 iMatix Corporation *
* *
* ------------------ GPL Licensed Source Code ------------------ *
* iMatix makes this software available under the GNU General *
* Public License (GPL) license for open source projects. For *
* details of the GPL license please see www.gnu.org or read the *
* file license.gpl provided in this package. *
* *
* This program is free software; you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation; either version 2 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public *
* License along with this program in the file 'license.gpl'; if *
* not, write to the Free Software Foundation, Inc., 59 Temple *
* Place - Suite 330, Boston, MA 02111-1307, USA. *
* *
* You can also license this software under iMatix's General Terms *
* of Business (GTB) for commercial projects. If you have not *
* explicitly licensed this software under the iMatix GTB you may *
* only use it under the terms of the GNU General Public License. *
* *
* For more information, send an email to info@imatix.com. *
* -------------------------------------------------------------- *
*===========================================================================*/
/*
Synopsis: This header file encapsulates many generally-useful include
files and defines lots of good stuff. The intention of this
header file is to hide the messy #ifdef's that you typically
need to make real programs compile & run. To use, specify
as the first include file in your program.
The main contributors to this file were:
PH Pieter Hintjens
EDM Ewen McNeill
PA Pascal Antonnaux
BW Bruce Walter
RJ Rob Judd
*/
#ifndef PRELUDE_INCLUDED /* Allow multiple inclusions */
#define PRELUDE_INCLUDED
/*- Establish the compiler and computer system ------------------------------*/
/*
* Defines zero or more of these symbols, for use in any non-portable
* code:
*
* __WINDOWS__ Microsoft C/C++ with Windows calls
* __MSDOS__ System is MS-DOS (set if __WINDOWS__ set)
* __VMS__ System is VAX/VMS or Alpha/OpenVMS
* __UNIX__ System is UNIX
* __OS2__ System is OS/2
*
* __IS_32BIT__ OS/compiler is 32 bits
* __IS_64BIT__ OS/compiler is 64 bits
*
* When __UNIX__ is defined, we also define exactly one of these:
*
* __UTYPE_AUX Apple AUX
* __UTYPE_BEOS BeOS
* __UTYPE_BSDOS BSD/OS
* __UTYPE_DECALPHA Digital UNIX (Alpha)
* __UTYPE_IBMAIX IBM RS/6000 AIX
* __UTYPE_FREEBSD FreeBSD
* __UTYPE_HPUX HP/UX
* __UTYPE_LINUX Linux
* __UTYPE_MIPS MIPS (BSD 4.3/System V mixture)
* __UTYPE_NETBSD NetBSD
* __UTYPE_NEXT NeXT
* __UTYPE_QNX QNX
* __UTYPE_SCO SCO Unix
* __UTYPE_IRIX Silicon Graphics IRIX
* __UTYPE_SINIX SINIX-N (Siemens-Nixdorf Unix)
* __UTYPE_SUNOS SunOS
* __UTYPE_SUNSOLARIS Sun Solaris
* __UTYPE_UNIXWARE SCO UnixWare
* ... these are the ones I know about so far.
* __UTYPE_GENERIC Any other UNIX
*
* When __VMS__ is defined, we may define one or more of these:
*
* __VMS_XOPEN Supports XOPEN functions
*/
#if (defined (__64BIT__)) /* EDM 96/05/30 */
# define __IS_64BIT__ /* May have 64-bit OS/compiler */
#else
# define __IS_32BIT__ /* Else assume 32-bit OS/compiler */
#endif
#if (defined WIN32 || defined (_WIN32))
# undef __WINDOWS__
# define __WINDOWS__
# undef __MSDOS__
# define __MSDOS__
# undef UNIX /* Some Win32 compilers like RSXNT */
# undef unix /* define UNIX as well as Win32 */
# undef __unix__ /* which causes problems... */
#endif
#if (defined WINDOWS || defined (_WINDOWS) || defined (__WINDOWS__))
# undef __WINDOWS__
# define __WINDOWS__
# undef __MSDOS__
# define __MSDOS__
#endif
/* MSDOS Microsoft C */
/* _MSC_VER Microsoft C */
/* __TURBOC__ Borland Turbo C */
/* __DJGPP__ D.J. Delorie's GNU C for DOS */
#if (defined (MSDOS) || defined (_MSC_VER) || defined (__TURBOC__) \
|| defined (__DJGPP__))
# undef __MSDOS__
# define __MSDOS__
# if (defined (_DEBUG) && !defined (DEBUG))
# define DEBUG
# endif
#endif
/* EDM 96/05/28 */
/* __OS2__ Triggered by __EMX__ define and __i386__ define to avoid */
/* manual definition (eg, makefile) even though __EMX__ and */
/* __i386__ can be used on a MSDOS machine as well. Here */
/* the same work is required at present. */
#if (defined (__EMX__) && defined (__i386__))
# undef __OS2__
# define __OS2__
#endif
/* VMS VAX C (VAX/VMS) */
/* __VMS Dec C (Alpha/OpenVMS) */
/* __vax__ gcc */
#if (defined (VMS) || defined (__VMS) || defined (__vax__))
# undef __VMS__
# define __VMS__
# if (__VMS_VER >= 70000000)
# define __VMS_XOPEN
# endif
#endif
/* Try to define a __UTYPE_xxx symbol... */
/* unix SunOS at least */
/* __unix__ gcc */
/* _POSIX_SOURCE is various UNIX systems, maybe also VAX/VMS */
#if (defined (unix) || defined (__unix__) || defined (_POSIX_SOURCE))
# if (!defined (__VMS__))
# undef __UNIX__
# define __UNIX__
# if (defined (__alpha)) /* Digital UNIX is 64-bit */
# undef __IS_32BIT__
# define __IS_64BIT__
# define __UTYPE_DECALPHA
# endif
# endif
#endif
#if (defined (_AUX))
# define __UTYPE_AUX
# define __UNIX__
#elif (defined (__BEOS__))
# define __UTYPE_BEOS
# define __UNIX__
#elif (defined (__hpux))
# define __UTYPE_HPUX
# define __UNIX__
# define _INCLUDE_HPUX_SOURCE
# define _INCLUDE_XOPEN_SOURCE
# define _INCLUDE_POSIX_SOURCE
#elif (defined (_AIX) || defined (AIX))
# define __UTYPE_IBMAIX
# define __UNIX__
#elif (defined (BSD) || defined (bsd))
# define __UTYPE_BSDOS
# define __UNIX__
#elif (defined (linux))
# define __UTYPE_LINUX
# define __UNIX__
# define __NO_CTYPE /* Suppress warnings on tolower() */
#elif (defined (Mips))
# define __UTYPE_MIPS
# define __UNIX__
#elif (defined (FreeBSD) || defined (__FreeBSD__))
# define __UTYPE_FREEBSD
# define __UNIX__
#if !defined(__i386__)
# undef __IS_32BIT__
# define __IS_64BIT__
#endif
#elif (defined (NetBSD) || defined (__NetBSD__))
# define __UTYPE_NETBSD
# define __UNIX__
#elif (defined (NeXT))
# define __UTYPE_NEXT
# define __UNIX__
#elif (defined (__QNX__))
# define __UTYPE_QNX
# define __UNIX__
#elif (defined (sco))
# define __UTYPE_SCO
# define __UNIX__
#elif (defined (sgi))
# define __UTYPE_IRIX
# define __UNIX__
#elif (defined (sinix))
# define __UTYPE_SINIX
# define __UNIX__
#elif (defined (SOLARIS) || defined (__SRV4))
# define __UTYPE_SUNSOLARIS
# define __UNIX__
#elif (defined (SUNOS) || defined (SUN) || defined (sun))
# define __UTYPE_SUNOS
# define __UNIX__
#elif (defined (__USLC__) || defined (UnixWare))
# define __UTYPE_UNIXWARE
# define __UNIX__
#elif (defined (__DJGPP__)) /* DJGPP thinks it's running in Unix. heh. */
# undef __UNIX__
#elif (defined __UNIX__)
# define __UTYPE_GENERIC
#endif
/*- Standard ANSI include files ---------------------------------------------*/
#ifdef __cplusplus
#include /* A bit of support for C++ */
#endif
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
/*- System-specific include files -------------------------------------------*/
#if (defined (__MSDOS__))
# if (defined (__WINDOWS__)) /* When __WINDOWS__ is defined, */
# define FD_SETSIZE 1024 /* Max. filehandles/sockets */
# include
# include /* May cause trouble on VC 1.x */
# include
# include
# endif
# if (defined (__TURBOC__))
# include
# include /* Okay for Turbo C */
# else
# include /* But will it work for others? */
# endif
# include
# include
# include
# include
# include
#endif
/* These include files are for non-PC systems */
#if (defined (__UNIX__))
# if defined (__GNUC__) && (__GNUC__ >= 2)
# define __STRICT_ANSI__
# endif
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include /* Must come before arpa/inet.h */
# if (!defined (__UTYPE_BEOS))
# include
# if (!defined (TCP_NODELAY))
# include
# endif
# endif
/* Specific #include's for UNIX varieties */
# if (defined (__UTYPE_IBMAIX) || defined(__UTYPE_QNX))
# include
# endif
#endif
#if (defined (__VMS__))
# if (!defined (vaxc))
# include /* Not provided by Vax C */
# endif
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
#endif
#if (defined (__OS2__))
/* Include list for OS/2 updated by EDM 96/12/31
* NOTE: sys/types.h must go near the top of the list because some of the
* definitions in other include files rely on types defined there.
*/
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include /* Must come before arpa/inet.h */
# include
# if (!defined (TCP_NODELAY))
# include
# endif
#endif
#if (defined (__DJGPP__))
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
# include
#endif
/*- Data types --------------------------------------------------------------*/
typedef unsigned short Bool; /* Boolean TRUE/FALSE value */
typedef unsigned char byte; /* Single unsigned byte = 8 bits */
typedef unsigned short dbyte; /* Double byte = 16 bits */
typedef unsigned short word; /* Alternative for double-byte */
typedef unsigned long dword; /* Double word >= 32 bits */
#if (defined (__IS_32BIT__))
typedef unsigned long qbyte; /* Quad byte = 32 bits */
#else
typedef unsigned int qbyte; /* Quad byte = 32 bits */
#endif
typedef void (*function) (void); /* Address of simple function */
#define local static void /* Shorthand for local functions */
typedef struct { /* Memory descriptor */
size_t size; /* Size of data part */
byte *data; /* Data part follows here */
} DESCR;
typedef struct { /* Variable-size descriptor */
size_t max_size; /* Maximum size of data part */
size_t cur_size; /* Current size of data part */
byte *data; /* Data part follows here */
} VDESCR;
typedef struct { /* Database timestamp */
long date;
long time;
} TIMESTAMP;
/*- Check compiler data type sizes ------------------------------------------*/
#if (UCHAR_MAX != 0xFF)
# error "Cannot compile: must change definition of 'byte'."
#endif
#if (USHRT_MAX != 0xFFFFU)
# error "Cannot compile: must change definition of 'dbyte'."
#endif
#if (defined (__IS_32BIT__))
# if (ULONG_MAX != 0xFFFFFFFFUL)
# error "Cannot compile: must change definition of 'qbyte'."
# endif
#else
# if (UINT_MAX != 0xFFFFFFFFU)
# error "Cannot compile: must change definition of 'qbyte'."
# endif
#endif
/*- Pseudo-functions --------------------------------------------------------*/
#define FOREVER for (;;) /* FOREVER { ... } */
#define until(expr) while (!(expr)) /* do { ... } until (expr) */
#define streq(s1,s2) (!strcmp ((s1), (s2)))
#define strneq(s1,s2) (strcmp ((s1), (s2)))
#define strused(s) (*(s) != 0)
#define strnull(s) (*(s) == 0)
#define strclr(s) (*(s) = 0)
#define strlast(s) ((s) [strlen (s) - 1])
#define strterm(s) ((s) [strlen (s)])
#define bit_msk(bit) (1 << (bit))
#define bit_set(x,bit) ((x) |= bit_msk (bit))
#define bit_clr(x,bit) ((x) &= ~bit_msk (bit))
#define bit_tst(x,bit) ((x) & bit_msk (bit))
#define tblsize(x) (sizeof (x) / sizeof ((x) [0]))
#define tbllast(x) (x [tblsize (x) - 1])
#if (defined (random))
# undef random
# undef randomize
#endif
#if (defined (min))
# undef min
# undef max
#endif
#if (defined (__IS_32BIT__))
#define random(num) (int) ((long) rand () % (num))
#else
#define random(num) (int) ((int) rand () % (num))
#endif
#define randomize() srand ((unsigned) time (NULL))
#define min(a,b) (((a) < (b))? (a): (b))
#define max(a,b) (((a) > (b))? (a): (b))
/*- ASSERT ------------------------------------------------------------------*/
/* If DEBUG is defined, the ASSERT macro aborts if the specified condition
* is false. Note that you must include sflsyst.c in your application, for
* the sys_assert() function.
*/
#if (defined (DEBUG))
# ifdef __cplusplus
extern "C" {
# endif
void sys_assert (const char *filename, unsigned line_number);
# undef ASSERT
# define ASSERT(f) \
if (f) \
; \
else \
sys_assert (__FILE__, __LINE__)
# ifdef __cplusplus
};
# endif
#else
# define ASSERT(f)
#endif
/*- Boolean operators and constants -----------------------------------------*/
#if (!defined (TRUE))
# define TRUE 1 /* ANSI standard */
# define FALSE 0
#endif
/*- Symbolic constants ------------------------------------------------------*/
#define FORK_ERROR -1 /* Return codes from fork() */
#define FORK_CHILD 0
#undef LINE_MAX
#define LINE_MAX 1024 /* Length of line from text file */
#if (!defined (PATH_MAX)) /* Length of path variable */
# define PATH_MAX 2048 /* if not previously #define'd */
#endif /* EDM 96/05/28 */
#if (!defined (EXIT_SUCCESS)) /* ANSI, and should be in stdlib.h */
# define EXIT_SUCCESS 0 /* but not defined on SunOs with */
# define EXIT_FAILURE 1 /* GCC, sometimes. */
#endif
/*- System-specific definitions ---------------------------------------------*/
/* On most systems, 'timezone' is an external long variable. On a few, it
* is a function that returns a string. We define TIMEZONE to be the long
* value. */
#undef TIMEZONE
#define TIMEZONE timezone /* Unless redefined later */
/* UNIX defines sleep() in terms of second; Win32 defines Sleep() in
* terms of milliseconds. We want to be able to use sleep() anywhere. */
#if (defined (__WINDOWS__))
# if (defined (WIN32))
# undef sleep
# define sleep(a) Sleep(a*1000) /* UNIX sleep() is seconds */
# else
# define sleep(a) /* Do nothing? */
# endif
/* MSVC 1.x does not define standard signals if in Windows */
# if (!defined (SIGINT))
# define SIGINT 2 /* Ctrl-C sequence */
# define SIGILL 4 /* Illegal instruction */
# define SIGSEGV 11 /* Segment violation */
# define SIGTERM 15 /* Kill signal */
# define SIGABRT 22 /* Termination by abort() */
# endif
/* MSVC 4.x does not define SIGALRM, so we pinch SIGFPE */
# if (!defined (SIGALRM))
# define SIGALRM SIGFPE /* Must be a known signal */
# endif
/* Define STDxx_FILENO macros */
# if (!defined (STDIN_FILENO))
# define STDIN_FILENO _fileno (stdin)
# define STDOUT_FILENO _fileno (stdout)
# define STDERR_FILENO _fileno (stderr)
# endif
/* Support for LCC-WIN32 compiler */
# if (defined (__LCC__))
# include
# undef TIMEZONE
# define TIMEZONE 0
# define environ _environ
extern char **environ; /* Not defined in include files */
# endif
/* On SunOs, the ANSI C compiler costs extra, so many people install gcc
* but using the standard non-ANSI C library. We have to make a few extra
* definitions for this case. (Here we defined just what we needed for
* Libero and SMT -- we'll add more code as required.) */
#elif (defined (__UTYPE_SUNOS) || defined (__UTYPE_SUNSOLARIS))
# if (!defined (_SIZE_T)) /* Non-ANSI headers/libraries */
# define strerror(n) sys_errlist [n]
# define memmove(d,s,l) bcopy (s,d,l)
extern char *sys_errlist [];
# endif
#elif (defined (__UTYPE_BSDOS))
# undef TIMEZONE
# define TIMEZONE 0 /* timezone is not available */
#elif (defined (__UTYPE_FREEBSD))
# undef TIMEZONE
# define TIMEZONE 0 /* timezone is not available */
#elif (defined (__UTYPE_NETBSD))
# undef TIMEZONE
# define TIMEZONE 0 /* timezone is not available */
#elif (defined (__DJGPP__))
# undef TIMEZONE
# define TIMEZONE 0 /* timezone is not available */
#elif (defined (__VMS__))
/* This data structure is often used in OpenVMS library functions */
typedef struct { /* Fixed-string descriptor: */
word length; /* Length of string in bytes */
byte dtype; /* Must be DSC$K_DTYPE_T = 14 */
byte class; /* Must be DSC$K_CLASS_S = 1 */
char *value; /* Address of start of string */
} STRING_DESC;
#define VMS_STRING(name,value) STRING_DESC name = \
{ sizeof (value) - 1, 14, 1, value }
#endif
#if (defined (__UNIX__) || defined (__VMS__) || defined (__DJGPP__))
extern char **environ; /* Not defined in include files */
#endif
/* On some systems (older Vaxen and Unixes) O_BINARY is not defined. */
#if (!defined (O_BINARY))
# define O_BINARY 0
#endif
/* On some systems SIGALRM is not defined; we allow it in code anyhow */
#if (!defined (SIGALRM))
# define SIGALRM 1
#endif
/* On some systems O_NDELAY is used instead of O_NONBLOCK */
#if (!defined (O_NONBLOCK))
# if (!defined (O_NDELAY))
# define O_NDELAY 0
# endif
# if (defined (__VMS__))
# define O_NONBLOCK 0 /* Can't use O_NONBLOCK on files */
# else
# define O_NONBLOCK O_NDELAY
# endif
#endif
/* We define constants for the way the current system formats filenames;
* we assume that the system has some type of path concept. */
#if (defined (WIN32)) /* Windows 95/NT */
# define PATHSEP ";" /* Separates path components */
# define PATHEND '\\' /* Delimits directory and filename */
# define PATHFOLD FALSE /* Convert pathvalue to uppercase? */
# define NAMEFOLD FALSE /* Convert filenames to uppercase? */
# define GATES_FILESYSTEM /* MS-DOS derivative */
#elif (defined (__MSDOS__)) /* 16-bit Windows, MS-DOS */
# define PATHSEP ";"
# define PATHEND '\\'
# if defined LFN /* Support DRDOS long file names */
# define PATHFOLD FALSE
# define NAMEFOLD FALSE
# else
# define PATHFOLD TRUE
# define NAMEFOLD TRUE
# endif
# define GATES_FILESYSTEM /* MS-DOS derivative */
#elif (defined (__VMS__)) /* Digital OpenVMS */
# define PATHSEP "," /* We work with POSIX filenames */
# define PATHEND '/'
# define PATHFOLD TRUE
# define NAMEFOLD TRUE
#elif (defined (__UNIX__)) /* All UNIXes */
# define PATHSEP ":"
# define PATHEND '/'
# define PATHFOLD FALSE
# define NAMEFOLD FALSE
#elif (defined (__OS2__)) /* OS/2 using EMX/GCC */
# define PATHSEP ";" /* EDM 96/05/28 */
# define PATHEND '\\'
# define PATHFOLD TRUE
# define NAMEFOLD FALSE
# define GATES_FILESYSTEM /* MS-DOS derivative */
#else
# error "No definitions for PATH constants"
#endif
/*- Capability definitions --------------------------------------------------*/
/*
* Defines zero or more of these symbols, for use in any non-portable
* code:
*
* DOES_SOCKETS We can use (at least some) BSD socket functions
* DOES_UID We can use (at least some) uid access functions
* DOES_SNPRINTF Supports snprintf and vsnprintf functions
* DOES_BSDSIGNALS Supports BSD signal model (e.g. siginterrupt)
*/
#if (defined (AF_INET))
# define DOES_SOCKETS /* System supports BSD sockets */
#else
# undef DOES_SOCKETS
#endif
#if (defined (__UNIX__) || defined (__VMS__) || defined (__OS2__))
# define DOES_UID /* System supports uid functions */
#else
# undef DOES_UID
# if (!defined (__DJGPP__)) /* gid_t and uid_t already defined */
typedef int gid_t; /* Group id type */
typedef int uid_t; /* User id type */
# endif
#endif
#if (defined (__WINDOWS__) && (!defined (__LCC__)))
# define DOES_SNPRINTF
# define snprintf _snprintf
# define vsnprintf _vsnprintf
#elif (defined (__OS2__))
# define DOES_SNPRINTF
#elif (defined (__UTYPE_SCO))
# define DOES_SNPRINTF
#elif (defined (__UTYPE_LINUX))
# define DOES_SNPRINTF
#else
# undef DOES_SNPRINTF
#endif
/* SunOS 5 (Solaris) does not support BSD-style signal handling */
#if (!defined (__UTYPE_SUNSOLARIS))
# define DOES_BSDSIGNALS
#else
# undef DOES_BSDSIGNALS
#endif
#endif /* Include PRELUDE.H */