Article View: comp.lang.c.moderated
Article #2073Search for the Universal Header File
From: Pieter Hintjens
Date: Sun, 25 Feb 1996 19:45
Date: Sun, 25 Feb 1996 19:45
332 lines
11714 bytes
11714 bytes
I am building the ultimate Universal Header File. :-)
This is a tool to make cross-platform programming in C
easier. Basically, all 'common' header files are put
in the uUHF, instead of in each program. By 'common',
I mean: all ANSI C header files, plus file i/o, socket
i/o, and anything else that is useful.
Up to a point, this is working, but I need help. If
you want to participate, send me information about your
platform:
- What C compiler, version
- What operating system, version
- Standard define's made by the compiler - e.g. __UNIX__
- Compiler switches for ANSI C compilation
- Any particular order for include files
- Location of common include files
- Supports sockets? If so, what include files
I attach the current version of the uUHF - prelude.h.
Cheers,
Pieter A. Hintjens
/*===========================================================================*
* *
* prelude.h Universal header file for C programming *
* *
* Written: 93/03/29 Pieter Hintjens <ph@mymail.com> *
* Revised: 96/02/25 Version 1.01 *
* *
* This header encapsulates all generally-useful include files and defines *
* various useful things. To use, specify as first include file in code. *
* *
* Contributors & critics: *
* Gordon Burditt <gordon@sneaky.lerctr.org> 25 Feb 1996 *
* Steve Leibel <stevel@coastside.net> 25 Feb 1996 *
* *
* Copyright (c) 1991-96 Pieter A. Hintjens. May be freely distributed. *
*===========================================================================*/
#ifndef _PRELUDE_INCLUDED /* Allow multiple inclusions */
#define _PRELUDE_INCLUDED
/*- Generally-useful include files ------------------------------------------*/
#include <ctype.h>
#include <limits.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <signal.h>
#include <errno.h>
#include <fcntl.h>
/*- Establish the compiler and computer system ------------------------------*/
/*
* Defines one or more of these symbols, for use in any non-portable
* code:
*
* __WINDOWS__ Microsoft C/C++ with Windows calls
* __MSDOS__ File system is MS-DOS
* __VMS__ System is VAX/VMS or Alpha/OpenVMS
* __UNIX__ System is UNIX
* __MAC__ System is Mac/OS
*
* __32BIT__ OS/compiler is 32 bits
* __64BIT__ OS/compiler is 64 bits
*
* When __UNIX__ is defined, we also define exactly one of these:
*
* __UTYPE_AUX Apple AUX
* __UTYPE_DECALPHA Digital UNIX (Alpha)
* __UTYPE_HPUX HP/UX
* __UTYPE_IBMAIX IBM RS/6000 AIX
* __UTYPE_LINUX Linux
* __UTYPE_MIPS MIPS (BSD 4.3/System V mixture)
* __UTYPE_NETBSD NetBSD
* __UTYPE_NEXT NeXT
* __UTYPE_SCO SCO Unix
* __UTYPE_SUNOS SunOS
* __UTYPE_SUNSOLARIS Sun Solaris
* __UTYPE_GENERIC Any other UNIX
*/
#define __32BIT__ /* Assume 32-bit OS/compiler */
#if (defined (WIN32) || defined (WINDOWS))
# undef __WINDOWS__
# define __WINDOWS__
# undef __MSDOS__
# define __MSDOS__
#endif
/* MSDOS is Microsoft C */
/* _MSC_VER is Microsoft C */
/* __TURBOC__ is Borland Turbo C */
#if (defined (MSDOS) || defined (_MSC_VER) || defined (__TURBOC__))
# undef __MSDOS__
# define __MSDOS__
#endif
/* VMS is VAX C (VAX/VMS) */
/* __VMS is Dec C (Alpha/OpenVMS) */
/* __vax__ is gcc */
#if (defined (VMS) || defined (__VMS) || defined (__vax__))
# undef __VMS__
# define __VMS__
#endif
/* unix is SunOS */
/* __unix__ is 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 __32BIT__
# define __64BIT__
# endif
# endif
#endif
/* Try to define a __UTYPE_xxx symbol... */
#if (defined __UNIX__)
# if (defined (_AUX))
# define __UTYPE_AUX
# elif (defined (__alpha))
# define __UTYPE_DECALPHA
# elif (defined (__hpux))
# define __UTYPE_HPUX
# elif (defined (_AIX) || defined (AIX))
# define __UTYPE_IBMAIX
# elif (defined (linux))
# define __UTYPE_LINUX
# elif (defined (Mips))
# define __UTYPE_MIPS
# elif (defined (NetBSD))
# define __UTYPE_NETBSD
# elif (defined (NeXT))
# define __UTYPE_NEXT
# elif (defined (sco))
# define __UTYPE_SCO
# elif (defined (SUNOS))
# define __UTYPE_SUNOS
# elif (defined (SOLARIS))
# define __UTYPE_SUNSOLARIS
# else
# define __UTYPE_GENERIC
# endif
#endif
/* Untested */
#if (defined (_MAC))
# undef __MAC__
# define __MAC__
#endif
/*- System-specific include files -------------------------------------------*/
#if (defined (__TURBOC__)) /* Borland Turbo-C uses this */
# include <alloc.h> /* name for its include file */
#else
# include <malloc.h>
#endif
#if (defined (__WINDOWS__)) /* When __WINDOWS__ is defined, */
# include <windows.h> /* so is __MSDOS__ */
#endif
#if (defined (__MSDOS__))
# include <dos.h>
# include <io.h>
# include <fcntl.h>
# include <sys\types.h>
# include <sys\stat.h>
#endif
#if (defined (__UNIX__))
# include <netdb.h>
# include <unistd.h>
# include <netinet/in.h>
# include <sys/types.h>
# include <sys/param.h>
# include <sys/socket.h>
# include <sys/time.h>
# include <sys/stat.h>
/* Specific includes for UNIX varieties */
# if defined (__UTYPE_IBMAIX)
# include <sys/select.h>
# endif
#endif
#if (defined (__VMS__))
# include <types.h>
# include <netdb.h>
# include <unixio.h>
# include <in.h>
# include <param.h>
# include <socket.h>
# include <time.h>
# include <stat.h>
#endif
/*- Data types --------------------------------------------------------------*/
typedef int Bool; /* Boolean TRUE / FALSE value */
typedef unsigned char byte; /* Single unsigned byte = 8 bits */
typedef unsigned short dbyte; /* Double byte = 16 bits */
#if (defined (__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 */
/*- 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 (__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 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 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 (__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 and debugging ----------------------------------------------------*/
#if (defined (DEBUG))
/* Define _Assert function here locally */
local _Assert (char *File, unsigned Line)
{
fflush (stdout);
fprintf (stderr, "\nAssertion failed: %s, line %u\n", File, Line);
fflush (stderr);
abort ();
}
# define ASSERT(f) \
if (f) \
; \
else \
_Assert (__FILE__, __LINE__)
#else
# define ASSERT(f)
#endif
/*- Boolean operators and constants -----------------------------------------*/
#if (defined (TRUE))
# undef TRUE
# undef FALSE
#endif
#define TRUE (1==1)
#define FALSE (1==0)
/*- Symbolic constants ------------------------------------------------------*/
#define FORK_ERROR -1 /* Return codes from fork() */
#define FORK_CHILD 0
#if (!defined (LINE_MAX))
# define LINE_MAX 255
#endif
/*- System-specific definitions ---------------------------------------------*/
#if (defined (__VMS__))
# define RET_OKAY 1 /* Return codes for main() */
# define RET_ERROR 0 /* VMS does it its own way. */
#else
# define RET_OKAY 0 /* On non-VMS systems 0 is okay, */
# define RET_ERROR 1 /* and 1 is an error. */
#endif
#endif /* Include PRELUDE.H */
Technical Details
Message-ID:
<4gqe8u$pn7@solutions.solon.com>Path:
arc1-ca.pugleaf.net!solon.com!not-for-mailShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!solon.com!not-for-mail From: pahint@eunet.be (Pieter Hintjens) Newsgroups: comp.lang.c.moderated Subject: Search for the Universal Header File Date: 25 Feb 1996 13:45:34 -0600 Organization: EUnet Belgium, Leuven, Belgium Sender: clc@solutions.solon.com Approved: clc@solutions.solon.com Message-ID: <4gqe8u$pn7@solutions.solon.com> NNTP-Posting-Host: solutions.solon.com X-Newsreader: TIN [version 1.2 PL2]