This is portdefs.h in view mode; [Download] [Up]
/*+++* * RCS $Id: portdefs.h,v 1.13 1993/02/02 21:00:42 gerben Exp $ * title: portdefs.h * abstract: Improve portability of C software. * author: T.R.Hageman, Groningen, The Netherlands * created: September 1992 (reimplementation of existing sources) * modified: (see RCS Log at end) * copyleft: * * Copyright (C) 1992 Tom R. Hageman. * * This 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 software 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 software; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * * description: * * Resolve some common compiler-dependent issues. * * Overview: * * (items marked with `@' can be overridden from the command line, * or from "config.h" by the mechanism below) * * - read configuration file "config.h" (possibly generated by an * auto-configure script) if _PORT_CONFIG is defined. * * - setup compiler-independent flags for some known system types: * __MSDOS__ * __MINIX__ (also sets __UNIX__) * __TOS__ * __UNIX__ (also sets `unix' if not __STRICT_ANSI__) * __VMS__ * __XENIX__ (also sets __UNIX__) * @ __POSIX__ (in principle, independent of other types.) * @ __SYSV__ * @ __BSD__ * * - setup @ __MSHORT__ iff (sizeof(int) == sizeof(short)), * * - determine ANSI-ness of the compiler (see "portansi.h"), * * - determine various other compiler aspects: * @ _HAS_UNSIGNED_ (1) if compiler knows unsigned {char,long}, * @ _HAS_VOID_ (-1) if compiler knows `void' only; * (1) if compiler knows both `void' and `void *', * @ __CHAR_UNSIGNED__ if default `char' type is unsigned, * * - explicit character sign-(non)extension macros: * @ _UC_(c) extend `c' as if it were an (unsigned char), * @ _SC_(c) extend `c' as if it were a (signed char), * * - @ _I_<header> * * define _I_<header> flags for all headers mandated by Posix * but not by ANSI that are known to exist: * * <dirent.h> <fcntl.h> [<grp.h>] [<pwd.h>] * [<sys/stat.h>] [<sys/times.h>] [<sys/types.h>] <sys/utsname.h> * <sys/wait.h> <tar.h> <termios.h> <unistd.h> * <utime.h> * * The headers in [ ] are present on the majority of UNIX systems, * so these are assumed PRESENT unless the corresponding _I_<header> * is defined as (-1). The other headers are assumed ABSENT unless * the corresponding _I_<header> is defined as 1. * (Note: <header> stands for the name of the header in all CAPS * without the trailing ".h" and any `/' replaced with `_') * * Other _I_<header> flags may be defined if the related Posix * headers are not available: * * [<sys/types.h>] -> <types.h> * [<sys/stat.h>] -> <stat.h> * <termios.h> -> <termio.h> -> [<sgtty.h>] * * - define various datatypes mandated by ANSI C and/or Posix: * @ ptrdiff_t (ANSI) integer type big enough to hold any * pointer difference (not if __STRICT_POSIX__), * @ size_t (ANSI/Posix) type returned by `sizeof' operator, * @ ssize_t (Posix) signed version of `size_t', * * - real-life portability kludges: * @ _LIBC_NEEDS_PROMOTION if library is built by an oldstyle * compiler and used by an ANSI compiler; in this * case the library functions should be prototyped * with promoted parameter types instead of the * actual types if these are subject to default * promotion. * * @ _P_<function>_RETURN_TYPE to accommodate standard library * functions that have, for historic reasons, * different return types than prescribed by * ANSI C. (These are ignored if _ANSI_LIBRARY_) * * @ _P_TRADITIONAL_RETURN_TYPES request traditional return types for * abort, exit, free, qsort, srand (int) and * bsearch, mem*, {m,c,re}alloc, sprintf (char *). * * - optional portability modes, which are provided only if explicitly * requested (to issue a request, #define the corresponding macro * before including this header): * * _PORT_TYPES various general datatypes, one or more of: * _PORT_BWL_TYPES BYTE-WORD-LONG style (default), * _PORT_INTN_TYPES INT[124] style, * * _PORT_CONSTS various more-or-less useful constants: * (NIL, NUL, EOF, TRUE, FALSE, OK, ERR) * * _PORT_FUNCTIONS various function aliases, one or more of: * _PORT_CHR_FUNCTIONS str[r]chr <-> [r]index (default), * _PORT_MEM_FUNCTIONS mem{cpy,cmp} <-> b{copy,cmp}, bzero * * _PORT_STYLE various style aliases, optionally: * _PORT_REG_STYLE (REG, REGL) * * _PORT_KEYWORDS keyword compatibility modes for some compilers: * _PORT_GNUC_KEYWORDS various Gnu C extension keywords, * _PORT_DOS_KEYWORDS DOS-keyword portability mode, * _PORT_TOS_KEYWORDS TOS-keyword portability mode, * * _PORT_FILENAME various filename-related macros, * * _PORT_ERROR declaration of error(), puterr() functions. * * This file is designed to work together well with a "config.h" generated * by GNU Autoconfig or Larry Wall's Metaconfig. In the absence of such * a configuration file, reasonable (I hope) assumptions are made about * some (hopefully most) systems I happen to be acquainted with. * * These are: * * Unix - NeXT 2.1/3.0, pdp-11 7th Ed, Atari ST Minix 1.5, * SunOS 4.1, SCO unix 3.2.2 * (HP-UX 5.5, SCO, Xenix, Ultrix, ibm rt AIX * untested) * * MSDOS - Microsof C 5.1 and up, Turbo/Borland C 3.0. * * Atari TOS - Gnu C 1.37 (jrb distribution), * Turbo C 2.03 (with my own UNIX library enhancements) * * VMS - Vax C 3.2 on VMS 5.x * * This file is also supposed to be compatible with Posix.1 and ANSI * standards. Related flags are: * * @ __STRICT_ANSI__ - enforce strict ANSI C conformance. * * @ __STRICT_POSIX__ - enforce strict Posix.1 conformance. * * (Note that the Posix standard states that strict conformance is * forced by definition the ``feature test'' macro _POSIX_SOURCE, but * in this less-than-perfect world some compilers seem to use that * just to enable their (otherwise invisible) Posix features... * hence this separate macro) *---*/ /* Configuration section. (protected against multiple inclusion.) */ #ifndef _PORTDEFS_H_ #define _PORTDEFS_H_ 0x112 /* Include local configuration, if so requested. (probably generated by an auto-configure script) */ #ifdef _PORT_CONFIG # include "config.h" #endif #if 0 /* * _defined_empty_(macroname) * * This utility macro tests whether macroname's definition is empty. * It should be used ONLY in a preprocessor conditional statement. * (The definition below works since (2*macro-1) evaluates to an odd * number for all numeric replacement values of `macro', and to (-2), * i.e., an even number, if `macro' expands to a blank string. * This trick relies on undefined or non-numeric macros being * evaluated to 0 (the number zero).) * {{Unfortunately this is useless since olden preprocessors do not * expand macros with arguments in preprocessor #if expressions, * so we are forced to use the literal expression. Sigh.}} * * _empty_or_nonzero_(macroname) * * Analogous to the above, tests whether macroname's definition is * empty or non-zero. Evaluates FALSE if macro is undefined. * {{In practice we use the literal expression, as explained above, * and we ditch the 2*0 from it to avoid clutter.}} * * _undef_or_zero_(macroname) * * The logical negation of _empty_or_nonzero_(macroname). */ # define _defined_empty_(macroname) (2*macroname-1==2*-1) # define _empty_or_nonzero_(macroname) (2*macroname-1!=2*0-1) # define _undef_or_zero_(macroname) (2*macroname-1==2*0-1) #endif /* Some systems that I happen to know about. */ #ifdef TOS /* Lattice C (Atari ST) */ # define __TOS__ 1 #endif #ifdef MSDOS /* Microsof C */ # define __MSDOS__ 1 # ifndef __TURBOC__ # ifndef __MSC__ # define __MSC__ 1 # endif # endif #endif #ifdef _MINIX /* Minix?? */ # define __MINIX__ 1 #endif #if (2* M_XENIX -1!=-1) /* SCO Xenix */ # define __XENIX__ 1 #endif #if (unix || __unix__ || __UNIX__ || __XENIX__ || __MINIX__) /* Unix clones. */ # ifndef __UNIX__ # define __UNIX__ 1 # endif # ifndef unix # ifndef __STRICT_ANSI__ # ifndef __STRICT_POSIX__ # define unix 1 # endif # endif # endif #endif #if (vms || __vms__ || __VMS__) # ifndef __VMS__ # define __VMS__ 1 # endif # ifndef vms # ifndef __STRICT_ANSI__ # ifndef __STRICT_POSIX__ # define vms 1 # endif # endif # endif #endif /* * __SYSV__ Generic AT&T System V Unix. * * Assumes the existence of the following headers: * <fcntl.h> * <string.h> * <termio.h> (if not also Posix-compliant) * <utime.h> * * Also assumes the existence of the following functions/variables: * tzset(), tzname[2], timezone in <time.h>. */ #ifndef __SYSV__ # if (2* SVR2 -1!=-1 || \ 2* SVR3 -1!=-1 || \ 2* SVR4 -1!=-1 || \ hpux || __hpux__ || \ sco || __sco__ || \ /* Add other known SYSV systems here. */0) # define __SYSV__ 1 # endif #else # if (2*__SYSV__-1==2*-1) # undef __SYSV__ # define __SYSV__ 1 # endif #endif /* * __BSD__ Generic Berkeley Standard Distribution Unix. * * Assumes the existence of the following headers: * <strings.h> (if not also ANSI- or Posix compliant) * <sgtty.h> (if not also Posix-compliant) * <sys/wait.h> (with union wait, if not Posix-compliant) * * Also assumes the existence of the following functions/variables: */ #ifndef __BSD__ # if (2* BSD -1!=-1 || \ NeXT || __NeXT__ || \ sun || __sun__ || \ /* Add other known BSD systems here. */0) # define __BSD__ 1 # endif #else # if (2*__BSD__-1==2*-1) # undef __BSD__ # define __BSD__ 1 # endif #endif /* Determine size of int, if we can. ("portansi.h" occasionally needs it!) */ #ifndef __MSHORT__ # if __TURBOC__ /* Turbo C allows the use of `sizeof' in preprocessor conditionals. */ # if (sizeof(int) == sizeof(short)) /* {{MS-DOS too?}} */ # define __MSHORT__ 1 # endif # endif # ifdef MSDOS /* Microsof C (6.1 and down at least) */ # define __MSHORT__ 1 # endif # if pdp11 # define __MSHORT__ 1 # endif #else # if (2*__MSHORT__-1==2*-1) /* Empty definition, assume TRUE. */ # undef __MSHORT__ # define __MSHORT__ 1 # endif #endif /* Resolve ANSI-ness of compilation environment. */ #ifndef _ANSI_HEADERS_ # ifdef STDC_HEADERS /* Autoconfig. */ # if (2*STDC_HEADERS-1==2*0-1) # define _ANSI_HEADERS_ 0 # else # define _ANSI_HEADERS_ 1 # endif # else # if (sco || __sco__ /* 3.2.2(?) */ || \ ultrix || __ultrix__ /* Ultrix ?.? */|| \ /* Add other trusted systems here. */0) # define _ANSI_HEADERS_ 1 # endif # endif #endif /* Resolve ANSI-ness of the compiler. */ #ifndef _PORTANSI_H_ # include "portansi.h" #endif /* Determine size of int, if we can. ("portansi.h" occasionally needs it!) */ #ifndef __MSHORT__ # if __TURBOC__ /* Turbo C allows the use of `sizeof' in preprocessor conditionals. */ # if (sizeof(int) == sizeof(short)) /* {{MS-DOS too?}} */ # define __MSHORT__ 1 # endif # endif # ifdef MSDOS /* Microsof C (6.1 and down at least) */ # define __MSHORT__ 1 # endif # if pdp11 # define __MSHORT__ 1 # endif #else # if (2*__MSHORT__-1==2*-1) /* Empty definition, assume TRUE. */ # undef __MSHORT__ # define __MSHORT__ 1 # endif #endif /* Resolve ANSI-ness of compilation environment. */ #ifndef _ANSI_HEADERS_ # ifdef STDC_HEADERS /* Autoconfig. */ # if (2*STDC_HEADERS-1==2*0-1) # define _ANSI_HEADERS_ 0 # else # define _ANSI_HEADERS_ 1 # endif # else # if (sco || __sco__ /* 3.2.2(?) */ || \ ultrix || __ultrix__ /* Ultrix ?.? */|| \ /* Add other trusted systems here. */0) # define _ANSI_HEADERS_ 1 # endif # endif #endif /* Resolve ANSI-ness of the compiler. */ #ifndef _PORTANSI_H_ # include "portansi.h" #endif /* {{WARNING: There isn't a truly satisfactory way to check for Posix systems yet. For now, this requires you to define either __POSIX__ or _I_UNISTD/I_UNISTD/HAVE_UNISTD_H to the right value, and issue the _POSIX_SOURCE request only if you are compiling on a Posix system}} */ /* (Moved beyond "portansi.h" to let <unistd.h> see the right `void'.) */ /* (Moved beyond "portansi.h" to let <unistd.h> see the right `void'.) */ #ifndef __POSIX__ # ifdef _POSIX_SOURCE # define __POSIX__ 1 # endif # ifdef POSIX /* Larry Wall's Metaconfig. */ # define __POSIX__ 1 # endif #else # if (2*__POSIX__-1==2*-1) /* Empty definition, assume TRUE. */ # undef __POSIX__ # define __POSIX__ 1 # endif #endif #ifndef _I_UNISTD # if (2* HAVE_UNISTD_H -1!=-1 /* GNU's Autoconfig. */ || \ 2* I_UNISTD -1!=-1 /* Metaconfig. */ || \ __POSIX__ /* When claimed to be Posix, check that it indeed is. */ || \ __MINIX__ /* 1.5 */ || \ sun || __sun__ /* 4.1 */ || \ sco || __sco__ /* 3.2.2(?) */ || \ ultrix || __ultrix__ /* Ultrix ?.? */ || \ /* Add other trusted systems here. */0) # define _I_UNISTD 1 # endif #else # if (2*_I_UNISTD-1==2*-1) # undef _I_UNISTD # define _I_UNISTD 1 # endif #endif #if _I_UNISTD # ifndef _SYS_TYPES_H_ /* <unistd.h> needs types from <sys/types.h> */ # include <sys/types.h> # define _SYS_TYPES_H_ # endif # include <unistd.h> # ifdef _POSIX_VERSION /* Only defined in <unistd.h> if Posix. */ # ifndef __POSIX__ # define __POSIX__ 1 # endif # else # undef __POSIX__ # undef _POSIX_SOURCE /* {{this is debatable.}} */ # endif #endif #if pdp11 /* Ancient K&R compiler */ # define _KNR_ANTIQUE_ 1 #endif /* Determine existence of other system header files (if we can). */ /* Does compiler know unsigned {char,long}? */ #ifndef _HAS_UNSIGNED_ # if (_ANSI_C_ || !_KNR_ANTIQUE_) # define _HAS_UNSIGNED_ 1 # endif #else # if (2*_HAS_UNSIGNED_-1==2*-1) /* Empty definition, assume TRUE. */ # undef _HAS_UNSIGNED_ # define _HAS_UNSIGNED_ 1 # endif #endif /* Does compiler know both `void' and `void *'? */ #ifndef _HAS_VOID_ # if _ANSI_void_ /* knows both `void' and `void *' */ # define _HAS_VOID_ 1 # else # if !_KNR_ANTIQUE_ /* knows `void' only */ # define _HAS_VOID_ -1 # endif # endif #else # if (2*_HAS_VOID_-1==2*-1) /* Empty definition, assume TRUE. */ # undef _HAS_VOID_ # define _HAS_VOID_ 1 # endif #endif /* Determine signedness of `char'. */ #ifndef __CHAR_UNSIGNED__ # ifndef __CHAR_SIGNED__ # if ('\377' > 0) /* {{assume the preprocessor handles character constants the same way the compiler does.}} */ # define __CHAR_UNSIGNED__ 1 # endif # endif #else # ifdef __CHAR_SIGNED__ #error "__CHAR_UNSIGNED__ and __CHAR_SIGNED__ conflict." # endif # if (2*__CHAR_UNSIGNED__-1==2*-1) /* Empty definition, assume TRUE. */ # undef __CHAR_UNSIGNED__ # define __CHAR_UNSIGNED__ 1 # endif #endif /* Explicit conversion to unsigned char. */ #ifndef _UC_ # if _HAS_UNSIGNED_ # define _UC_(c) ((unsigned char)(c)) # else # if __CHAR_UNSIGNED__ # define _UC_(c) ((char)(c)) # else /* {{WARNING: assumes 8-bit char.}} */ # define _UC_(c) ((c)&0xFF) # endif # endif #endif /* Explicit conversion to signed char. */ #ifndef _SC_ # if (_ANSI_signed_ || !__CHAR_UNSIGNED__) # define _SC_(c) ((signed char)(c)) # else /* {{WARNING: assumes 8-bit char and 2's complement arithmetic.}} */ # define _SC_(c) (((c)^0x80)-0x80) # endif #endif /* {{The previous definitions rely heavily on the compiler doing the right things with implicit and explicit integer conversions. Unfortunately some compilers cannot be trusted in this respect...}} */ /* Flags to indicate that the corresponding header files exist. */ #if __POSIX__ # ifndef _ANSI_HEADERS_ /* Posix implies existence of ANSI headers. */ # define _ANSI_HEADERS_ 1 # ifndef _I_FLOAT /* ...except <float.h> */ # define _I_FLOAT -1 # endif # endif # define _I_DIRENT 1 # define _I_FCNTL 1 /*# define _I_GRP 1 implied */ /*# define _I_PWD 1 implied */ /*# define _I_SYS_STAT 1 implied */ /*# define _I_SYS_TIMES 1 implied */ /*# define _I_SYS_TYPES 1 implied */ # define _I_SYS_UTSNAME 1 # define _I_SYS_WAIT 1 # define _I_TAR 1 # if !(__MINIX__) /* Minix 1.5 <termios.h> not yet implemented. */ # define _I_TERMIOS 1 # endif # define _I_UTIME 1 #else /* !__POSIX__ */ # ifndef _I_DIRENT # if (2* DIRENT -1!=-1 /* Autoconfig. */ || \ 2* HAVE_DIRENT_H -1!=-1 /* Alt. Autoconfig. */ || \ 2* I_DIRENT -1!=-1 /* Metaconfig. */ || \ /* Add other systems known to have it here. */0) # define _I_DIRENT 1 # endif # endif # if !_I_DIRENT # ifndef _I_NDIR # if (2* HAVE_NDIR_H -1!=-1 /* Autoconfig. */ || \ 2* I_NDIR -1!=-1 /* Metaconfig. */ || \ /* Add other systems known to have it here. */0) # define _I_NDIR 1 # endif # endif # if !_I_NDIR # ifndef _I_SYS_NDIR # if (2* SYSNDIR -1!=-1 /* Autoconfig. */ || \ 2* HAVE_SYS_NDIR_H -1!=-1 /* Alt. Autoconfig. */ || \ 2* I_SYS_NDIR -1!=-1 /* Metaconfig. */ || \ /* Add other systems known to have it here. */0) # define _I_SYS_NDIR 1 # endif # endif # if !_I_SYS_NDIR # ifndef _I_SYS_DIR # if (2* HAVE_SYS_DIR_H -1!=-1/* Autoconfig. */ || \ 2* I_SYS_DIR -1!=-1 /* Metaconfig. */ || \ __BSD__ || \ /* Add other systems known to have it here. */0) # define _I_SYS_DIR 1 # endif # endif # endif # endif # endif # ifndef _I_FCNTL # if (2* HAVE_FCNTL_H -1!=-1 /* Autoconfig. */ || \ 2* I_FCNTL -1!=-1 /* Metaconfig. */ || \ __MINIX__ || \ __XENIX__ || \ __SYSV__ || \ __MSDOS__ && (__TURBOC__ || __MSC__) || \ __TOS__ && __GNUC__ || \ /* Add other systems known to have it here. */0) # define _I_FCNTL 1 # endif # endif # ifndef _I_GRP # ifdef HAVE_GRP_H /* Autoconfig. */ # if (2* HAVE_GRP_H -1==-1) # define _I_GRP -1 # endif # else # ifndef I_GRP /* Metaconfig. */ # if !(__UNIX__ || \ __TOS__ && __GNUC__ || \ /* Add other systems known to have it here. */0) # define _I_GRP -1 # endif # endif # endif # endif # ifndef _I_PWD # ifdef HAVE_PWD_H /* Autoconfig. */ # if (2* HAVE_PWD_H -1==-1) # define _I_PWD -1 # endif # else # ifndef I_PWD /* Metaconfig. */ # if !(__UNIX__ || \ __TOS__ && __GNUC__ || \ /* Add other systems known to have it here. */0) # define _I_PWD -1 # endif # endif # endif # endif # ifndef _I_SYS_STAT # ifdef HAVE_SYS_STAT_H /* Autoconfig. */ # if (2* HAVE_SYS_STAT_H -1==-1) # define _I_SYS_STAT -1 # endif # else # ifndef I_SYS_STAT /* Metaconfig. */ # if !(__UNIX__ || \ __TOS__ || \ __MSDOS__ || \ /* Add other systems known to have it here. */0) # define _I_SYS_STAT -1 # endif # endif # endif # endif # if !(_I_SYS_STAT - -1) # ifndef _I_STAT # if (2* HAVE_STAT_H -1!=-1 /* Autoconfig. */ || \ 2* I_STAT -1!=-1 /* Metaconfig. */ || \ __VMS__ && VAXC || \ /* Add other systems known to have it here. */0) # define _I_STAT 1 # endif # endif # endif # ifndef _I_SYS_TIMES # ifdef HAVE_SYS_TIMES_H /* Autoconfig. */ # if (2* HAVE_SYS_TIMES_H -1==-1) # define _I_SYS_TIMES -1 # endif # else # ifndef I_SYS_TIMES /* Metaconfig. */ # if !(__UNIX__ || \ __TOS__ && __GNUC__ || \ /* Add other systems known to have it here. */0) # define _I_SYS_TIMES -1 # endif # endif # endif # endif # ifndef _I_SYS_TYPES # ifdef HAVE_SYS_TYPES_H /* Autoconfig. */ # if (2* HAVE_SYS_TYPES_H -1==-1) # define _I_SYS_TYPES -1 # endif # else # ifndef I_SYS_TYPES /* Metaconfig. */ # if !(__UNIX__ || \ __TOS__ || \ __MSDOS__ || \ /* Add other systems known to have it here. */0) # define _I_SYS_TYPES -1 # endif # endif # endif # endif # if !(_I_SYS_TYPES - -1) # ifndef _I_TYPES # if (2* HAVE_TYPES_H -1!=-1 /* Autoconfig. */ || \ 2* I_TYPES -1!=-1 /* Metaconfig. */ || \ __VMS__ && VAXC || \ /* Add other systems known to have it here. */0) # define _I_TYPES 1 # endif # endif # endif # ifndef _I_SYS_UTSNAME # if (2* HAVE_SYS_UTSNAME_H -1!=-1 /* Autoconfig. */ || \ 2* I_SYS_UTSNAME -1!=-1 /* Metaconfig. */ || \ /* Add other systems known to have it here. */0) # define _I_SYS_UTSNAME 1 # endif # endif # ifndef _I_SYS_WAIT # if (2* HAVE_SYS_WAIT_H -1!=-1 /* Autoconfig. */ || \ 2* I_SYS_WAIT -1!=-1 /* Metaconfig. */ || \ __BSD__ || \ /* Add other systems known to have it here. */0) # define _I_SYS_WAIT 1 # endif # endif # if !_I_SYS_WAIT # ifndef _I_WAIT # if (2* HAVE_WAIT_H -1!=-1 /* Autoconfig. */ || \ 2* I_WAIT -1!=-1 /* Metaconfig. */ || \ /* Add other systems known to have it here. */0) # define _I_WAIT 1 # endif # endif # endif # ifndef _I_TAR /* Most UNIX systems seem to have <tar.h> nowadays. */ # if (2* HAVE_TAR_H -1!=-1 /* Autoconfig. */ || \ 2* I_TAR -1!=-1 /* Metaconfig. */ || \ __UNIX__ && !(pdp11 || \ /* add other defective systems here. */0)) # define _I_TAR 1 # endif # endif # ifndef _I_TERMIOS # if (2* HAVE_TERMIOS_H -1!=-1 /* Autoconfig. */ || \ 2* I_TERMIOS -1!=-1 /* Metaconfig. */ || \ /* Add other systems known to have it here. */0) # define _I_TERMIOS 1 # endif # endif # if !_I_TERMIOS # ifndef _I_TERMIO # if (2* HAVE_TERMIO_H -1!=-1 /* Autoconfig. */ || \ 2* I_TERMIO -1!=-1 /* Metaconfig. */ || \ __SYSV__ || \ /* Add other systems known to have it here. */0) # define _I_TERMIO 1 # endif # endif # if !_I_TERMIO # ifndef _I_SGTTY # ifdef HAVE_SGTTY_H /* Autoconfig. */ # if (2* HAVE_SGTTY_H -1==-1) # define _I_SGTTY -1 # endif # else # ifndef I_SGTTY /* Metaconfig. */ # if !(__UNIX__ || \ __TOS__ && __GNUC__ || \ /* Add other systems known to have it here. */0) # define _I_SGTTY -1 # endif # endif # endif # endif # endif # endif # ifndef _I_UTIME # if (2* HAVE_UTIME_H -1!=-1 /* Autoconfig. */ || \ 2* I_UTIME -1!=-1 /* Metaconfig. */ || \ __SYSV__ || \ __MINIX__ || \ /* Add other systems known to have it here. */0) # define _I_UTIME 1 # endif # endif #endif /* !__POSIX__ */ /* Data types mandated by ANSI: size_t, ptrdiff_t */ #ifndef size_t # ifndef _SIZE_T_ /* commonly used definition tag. */ # if _ANSI_HEADERS_ /* {{These multiple-inclusion tag checks are not strictly necessary since ANSI C explicitly allows multiple inclusion.}} */ # ifndef _STDDEF_H_ # ifndef _STDDEF_H # ifndef __STDDEF # include <stddef.h> # endif # endif # define _STDDEF_H_ # endif # else /* {{WARNING! Some older UNIX systems don't declare `size_t' in <sys/types.h>. Those that don't should be added to the exception list below. And those that do, do not always protect the header against multiple inclusions. So if you need <sys/types.h>, either include it AFTER this file #ifndef _SYS_TYPES_H_, or include it BEFORE this file, then explicitly #define _SYS_TYPES_H_ yourself.}} */ # if (__UNIX__ && !(pdp11 || \ /* {{Add other exceptions here.}} */0)) # ifndef _SYS_TYPES_H_ # include <sys/types.h> # define _SYS_TYPES_H_ # endif # else /* {{Pre-define _SIZE_T_ for compilers/systems that are known to need long instead of int here.}} */ # ifdef _SIZE_T_ # if _HAS_UNSIGNED_ typedef unsigned long size_t; # else typedef long size_t; # endif # else typedef int size_t; # endif # endif # endif # define _SIZE_T_ # endif #endif #ifndef __STRICT_POSIX__ /* Strict Posix shouldn't define this. */ # ifndef ptrdiff_t # ifndef _PTRDIFF_T_ /* commonly used definition tag. */ # if _ANSI_HEADERS_ # ifndef _STDDEF_H_ # ifndef _STDDEF_H # ifndef __STDDEF # include <stddef.h> # endif # endif # define _STDDEF_H_ # endif # else /* {{Pre-define _PTRDIFF_T_ for compilers/systems that are known to need long instead of int, here.}} */ # ifdef _PTRDIFF_T_ typedef long ptrdiff_t; # else typedef int ptrdiff_t; # endif # endif # define _PTRDIFF_T_ # endif # endif #endif /* Data types mandated by Posix: ssize_t */ #ifndef ssize_t # ifndef _SSIZE_T_ /* commonly used definition tag. */ # if (__POSIX__ && _POSIX_VERSION >= 199009L) /* `ssize_t' was introduced in the 1990 draft revision. */ # ifndef _SYS_TYPES_H_ # include <sys/types.h> # define _SYS_TYPES_H_ # endif # else /* {{WARNING: sizeof(ssize_t) should be equal to sizeof(size_t)! Pre-define _SSIZE_T_ for compilers/systems that are known to need long instead of int, here.}} */ # if __MSHORT__ # ifdef __GNUC__ # define _SSIZE_T_ # endif # endif # if (__TURBOC__ && __TOS__) # define _SSIZE_T_ # endif # ifdef _SSIZE_T_ typedef long ssize_t; # else typedef int ssize_t; # endif # endif # define _SSIZE_T_ # endif #endif /* * offsetof(type, field) */ #ifndef __STRICT_POSIX__ # ifndef offsetof # if _ANSI_HEADERS_ # ifndef _STDDEF_H_ # ifndef _STDDEF_H # ifndef __STDDEF # include <stddef.h> # endif # endif # define _STDDEF_H_ # endif # else # define offsetof(type,field) \ ((size_t)((char*)&((type*)0)->field - (char*)0)) # endif # endif #endif /* * Portability kludges. */ #if _ANSI_PROTO_ # ifndef _LIBC_NEEDS_PROMOTION # if ((__GNUC__ && sun) /* Gnu C with sun <4.1 native library */ || \ NeXT || \ /* Add other hybrid systems here. */0) # define _LIBC_NEEDS_PROMOTION 1 # endif # endif # if (2* _LIBC_NEEDS_PROMOTION -1 != 2* 0 -1) # define _PI_LIBC_(type) int # else # define _PI_LIBC_(type) type # endif /* {{NOTE: this is similar to, but independent of, the definition of _PI_}} */ #endif /* * Conflicting return types. * (that I have encountered in non-ANSI standard library headers thus far) */ #if !_ANSI_LIBRARY_ # ifndef _P_TRADITIONAL_RETURN_TYPES /* exit(), abort(), etc. are traditionally declared with return type `int' -- which conflicts with the ANSI-style declarations. */ # if (sun || \ /* add other traditional systems here. */0) # define _P_TRADITIONAL_RETURN_TYPES 1 # endif # endif # ifndef _P_ABORT_RETURN_TYPE # if (_P_TRADITIONAL_RETURN_TYPES || \ /* Add other systems here. */0) # define _P_ABORT_RETURN_TYPE int # endif # endif # ifndef _P_EXIT_RETURN_TYPE # if (_P_TRADITIONAL_RETURN_TYPES || \ /* Add other systems here. */0) # define _P_EXIT_RETURN_TYPE int # endif # endif # ifndef _P_FREE_RETURN_TYPE # if (_P_TRADITIONAL_RETURN_TYPES || \ /* Add other systems here. */0) # define _P_FREE_RETURN_TYPE int # endif # endif # ifndef _P_QSORT_RETURN_TYPE # if (_P_TRADITIONAL_RETURN_TYPES || \ /* Add other systems here. */0) # define _P_QSORT_RETURN_TYPE int # endif # endif # ifndef _P_SPRINTF_RETURN_TYPE # if (_P_TRADITIONAL_RETURN_TYPES || \ 2* CHARSPRINTF -1 != 2* 0 -1 /* Metaconfig. */ || \ _KNR_ANTIQUE_ || \ ultrix || \ /* Add other systems here. */0) # define _P_SPRINTF_RETURN_TYPE char * # endif # endif # ifndef _P_SRAND_RETURN_TYPE # if (_P_TRADITIONAL_RETURN_TYPES || \ /* Add other systems here. */0) # define _P_SRAND_RETURN_TYPE int # endif # endif # if (_P_TRADITIONAL_RETURN_TYPES || \ /* add other systems here. */0) /* Cheat for malloc() and friends. */ # undef void_ # define void_ char # endif #endif #endif /* _PORTDEFS_H_ */ /* Portability options. (provided only if explicitly requested) */ #ifdef _PORT_TYPES /* Provide various general datatypes. */ # ifndef _PORT_BWL_TYPES # define _PORT_BWL_TYPES 1/* BYTE-WORD-LONG (from [TRH] "portab.h") */ # if ((_PORT_TYPES-0) & _PORT_BWL_TYPES || (2*_PORT_TYPES-1==2*-1)) typedef signed char BYTE; /* signed? 8 bit integer */ typedef short WORD; /* signed 16 bit int */ typedef long LONG; /* signed 32 bit int */ typedef int INT; /* generic integer */ typedef unsigned int UINT; /* generic unsigned integer */ # if _HAS_UNSIGNED_ typedef unsigned char UBYTE; /* unsigned 8 bit int */ typedef unsigned short UWORD; /* unsigned 16 bit int */ typedef unsigned long ULONG; /* unsigned 32 bit int */ # else /* This is all we can do... (and hope for the best) */ typedef char UBYTE; /* unsigned? 8 bit int */ # if __MSHORT__ typedef unsigned int UWORD; /* unsigned 16 bit int */ typedef long ULONG; /* unsigned? 32 bit int */ # else typedef short UWORD; /* unsigned? 16 bit int */ typedef unsigned int ULONG; /* unsigned 32 bit int */ # endif # endif /* _HAS_UNSIGNED_ */ typedef UBYTE * ADDRESS; /* general (non-void *) address */ typedef char * STRING; /* pointer to string */ # define BOOLEAN int # define BOOL WORD # define BBOOL BYTE # define WBOOL WORD # define LBOOL LONG # else # undef _PORT_BWL_TYPES # endif # endif /* _PORT_BWL_TYPES */ # ifndef _PORT_INTN_TYPES # define _PORT_INTN_TYPES 2/* INT{1,2,4} (from [GCThW] "portdef.h") */ # if ((_PORT_TYPES-0) & _PORT_INTN_TYPES) /* {{NOTE: I [TRH] made the `XXX_pt' pointer defs optional since these look too much like a mis-typed `XXX_tp' in my opinion.}} */ # define _PORT_pt 0x8000 # if ((_PORT_TYPES-0) & _PORT_pt) # define _PT(x) , *x # else # define _PT(x) # endif typedef char CHAR_tp _PT(CHAR_pt); /* generic character */ typedef signed char INT1_tp _PT(INT1_pt); /* signed? 8 bit integer */ typedef short INT2_tp _PT(INT2_pt); /* signed 16 bit int */ typedef long INT4_tp _PT(INT4_pt); /* signed 32 bit int */ typedef int INT_tp _PT(INT_pt); /* generic integer */ typedef unsigned int UINT_tp _PT(UINT_pt); /* generic unsigned integer */ # if _HAS_UNSIGNED_ typedef unsigned char UINT1_tp _PT(UINT1_pt); /* unsigned 8 bit int */ typedef unsigned short UINT2_tp _PT(UINT2_pt); /* unsigned 16 bit int */ typedef unsigned long UINT4_tp _PT(UINT4_pt); /* unsigned 32 bit int */ # else /* This is all we can do... (and hope for the best) */ typedef char UINT1_tp _PT(UINT1_pt); /* unsigned? 8 bit int */ # if __MSHORT__ typedef unsigned int UINT2_tp _PT(UINT2_pt); /* unsigned 16 bit int */ typedef long UINT4_tp _PT(UINT4_pt); /* unsigned? 32 bit int */ # else typedef short UINT2_tp _PT(UINT2_pt); /* unsigned? 16 bit int */ typedef unsigned int UINT4_tp _PT(UINT4_pt); /* unsigned 32 bit int */ # endif # endif /* _HAS_UNSIGNED_ */ typedef UINT1_tp UCHAR_tp _PT(UCHAR_pt); /* unsigned char */ typedef UINT1_tp *ADDRESS_tp; /* general (non-void *) address */ typedef CHAR_tp *STRING_tp _PT(STRING_pt); /* pointer to string. */ # undef _PT /* {{These values assume 2's complement arithmetic; if necessary, the range is limited to avoid sign-extension problems.}} */ # if (_ANSI_signed_ || !__CHAR_UNSIGNED__) # define MIN_INT1 ((INT1_tp)0x80) # else # define MIN_INT1 MIN_UINT1 # endif # define MIN_INT2 ((INT2_tp)0x8000) # define MIN_INT4 ((INT4_tp)0x80000000L) # define MIN_UINT1 ((UINT1_tp)0) # define MIN_UINT2 ((UINT2_tp)0) # define MIN_UINT4 ((UINT4_tp)0) # define MAX_INT1 ((INT1_tp)0x7F) # define MAX_INT2 ((INT2_tp)0x7FFF) # define MAX_INT4 ((INT4_tp)0x7FFFFFFFL) # if (_HAS_UNSIGNED_ || __CHAR_UNSIGNED__) # define MAX_UINT1 ((UINT1_tp)0xFF) # else # define MAX_UINT1 MAX_INT1 # endif # if (_HAS_UNSIGNED_ || __MSHORT__) # define MAX_UINT2 ((UINT2_tp)0xFFFF) # else # define MAX_UINT2 MAX_INT2 # endif # if (_HAS_UNSIGNED_ || !__MSHORT__) # define MAX_UINT4 ((UINT4_tp)0xFFFFFFFF) # else # define MAX_UINT4 MAX_INT4 # endif /* Swap the range of a 2's complement integer, from unsigned to signed and vice versa. So, INT1 should swap -128..127 and 0..255, etc. Simply XOR-ing the sign bit should do the trick. */ # define int1_TC_swaprange(x) ((x)^0x80) # define int2_TC_swaprange(x) ((x)^0x8000) # define int4_TC_swaprange(x) ((x)^0x80000000L) # define BOOLEAN int # else # undef _PORT_INTN_TYPES # endif # endif /* _PORT_INTN_TYPES */ # if (((_PORT_TYPES-0) & ~(1|2)) || ((_PORT_TYPES-0) == 0 && !(2*_PORT_TYPES-1==2*-1))) #error "_PORT_TYPES should be empty or a combination of _PORT_{BWL,INTN}_TYPES" # endif # undef _PORT_TYPES #endif /* _PORT_TYPES */ #ifndef NULL /* (possibly from <stddef.h>) */ # define NULL 0 #endif #ifdef _PORT_CONSTS /* Provide various constants. */ #ifndef _PORTCONSTS_INCLUDED_ #define _PORTCONSTS_INCLUDED_ /* Enforce the next defines: */ /* Null pointer. */ #undef NIL #define NIL ((void_*)0) /* Null character. */ #undef NUL #define NUL '\0' /* EOF Value */ #undef EOF #define EOF (-1) /* Boolean values */ #undef TRUE #define TRUE 1 #undef FALSE #define FALSE 0 /* OK return value */ #undef OK #define OK 0 /* ERRor return value */ #undef ERR #define ERR (-1) #endif /* _PORTCONSTS_INCLUDED_ */ #undef _PORT_CONSTS #endif /* _PORT_CONSTS */ #ifdef _PORT_FUNCTIONS /* Provide system-dependent function aliases. */ # ifndef _PORT_CHR_FUNCTIONS # if _ANSI_HEADERS_ || _I_STRING # include <string.h> # else # include <strings.h> # endif # define _PORT_CHR_FUNCTIONS 1 # if ((_PORT_FUNCTIONS-0) & _PORT_CHR_FUNCTIONS || (2*_PORT_FUNCTIONS-1==2*-1)) # if _ANSI_LIBRARY_ # ifndef index # define index strchr # endif # ifndef rindex # define rindex strrchr # endif # else /* !_ANSI_LIBRARY_ */ /* (assume traditional BSD library) */ # ifndef strchr # define strchr index # endif # ifndef strrchr # define strrchr rindex # endif # endif /* !_ANSI_LIBRARY_ */ # else # undef _PORT_CHR_FUNCTIONS # endif # endif /* _PORT_CHR_FUNCTIONS */ # ifndef _PORT_MEM_FUNCTIONS # define _PORT_MEM_FUNCTIONS 2 # if ((_PORT_FUNCTIONS-0) & _PORT_MEM_FUNCTIONS || (2*_PORT_FUNCIONS-1==2*-1)) # if _ANSI_LIBRARY_ # ifndef bcmp # define bcmp(p,q,n) memcmp(p,q,(size_t)(n)) # endif # ifndef bcopy # define bcopy(s,d,n) ((void)memcpy(d,s,(size_t)(n))) # endif # ifndef bzero # define bzero(p,n) memset(p,0,(size_t)(n)) # endif # else /* !_ANSI_LIBRARY_ */ /* Assume traditional BSD library. */ # ifndef memcmp # define memcmp(p,q,n) bcmp(p,q,(int)(n)) # endif # ifndef memcpy # define memcpy(d,s,n) bcopy(s,d,(int)(n)) # endif /* sorry, cannot handle memset. */ # endif /* !_ANSI_LIBRARY_ */ # else # undef _PORT_MEM_FUNCTIONS # endif # endif /* _PORT_MEM_FUNCTIONS */ # if (((_PORT_FUNCTIONS-0) & ~(1|2)) || \ (_PORT_FUNCTIONS-0 == 0 && !(2*_PORT_FUNCTIONS-1==2*-1))) #error "_PORT_FUNCTIONS should be empty or a combination of _PORT_{STR,MEM}_FUNCTIONS." # endif # undef _PORT_FUNCTIONS #endif /* _PORT_FUNCTIONS */ #ifdef _PORT_KEYWORDS # ifndef _PORT_GNUC_KEYWORDS # define _PORT_GNUC_KEYWORDS 1 # if ((_PORT_KEYWORDS-0) & _PORT_GNUC_KEYWORDS) /* * Gnu C-style keyword extensions: * * __attribute__(attrlist) - storage attributes * __extension__ - explicit Gnu C extension * __inline__ - inline functions * * __const__ - functions without side-effects * __exiting__ - functions that do not return * * other, more fundamental, Gnu C language extensions cannot be so easily * hidden. */ # ifndef __attribute__ # if (__GNUC__-0 < 2) /* new in GCC v2.0 */ # define __attribute__(x) # endif # endif # ifndef __const__ # ifdef __GNUC__ # define __const__ const # else # define __const__ # endif # endif # ifndef __exiting__ # ifdef __GNUC__ # define __exiting__ volatile # else # define __exiting__ # endif # endif # ifndef __extension__ # ifndef __GNUC__ # define __extension__ # endif # endif # ifndef __inline__ # ifndef __GNUC__ # define __inline__ # endif # endif # else # undef _PORT_GNUC_KEYWORDS # endif # endif /* _PORT_GNUC_KEYWORDS */ # ifndef _PORT_DOS_KEYWORDS /* Provide dummy DOS keywords for non-DOS compilers */ # define _PORT_DOS_KEYWORDS 2 # if ((_PORT_KEYWORDS-0) & _PORT_DOS_KEYWORDS) # if !__MSDOS__ # define far # define huge # define near /* ...and probably much more??? */ # if !(__TOS__ && __TURBOC__) # define cdecl # endif # endif # if !__TURBOC__ # define pascal # endif # else # undef _PORT_DOS_KEYWORDS # endif # endif /* _PORT_DOS_KEYWORDS */ # ifndef _PORT_TOS_KEYWORDS /* Similar to the above, but for TOS (Atari ST) code. */ # define _PORT_TOS_KEYWORDS 4 # if ((_PORT_KEYWORDS-0) & _PORT_TOS_KEYWORDS) # if !(__TOS__ && __TURBOC__) # if !__DOS__ # define cdecl # endif # define pascal # endif # else # undef _PORT_TOS_KEYWORDS # endif # endif /* _PORT_TOS_KEYWORDS */ # if (((_PORT_KEYWORDS-0) & ~(1|2|4)) || (_PORT_KEYWORDS-0) == 0) #error "_PORT_KEYWORDS should be a combination of _PORT_{GNUC,DOS,TOS}_KEYWORDS" # endif # undef _PORT_KEYWORDS #endif /* _PORT_KEYWORDS */ #ifdef _PORT_STYLE /* Provide style options. */ # ifndef _PORT_REG_STYLE # define _PORT_REG_STYLE 1 # if ((_PORT_STYLE-0) & _PORT_REG_STYLE) # define REG register # if (m68k || mc68000 || __TOS__ || vax) # define REGL REG # else # define REGL /* low-priority register. */ # endif # else # undef _PORT_REG_STYLE # endif # endif /* _PORT_REG_STYLE */ # ifndef __CPLUSPLUS__ # ifndef __cplusplus # define public # define private static # endif # endif # ifdef _PORT_GNUC_KEYWORDS # define exiting __exiting__ # ifndef __GNUC__ # define inline __inline__ # endif # endif # if (((_PORT_STYLE-0) & ~(1)) || \ ((_PORT_STYLE-0) == 0 && !(2*_PORT_STYLE-1==2*-1))) #error "_PORT_STYLE should be empty or _PORT_REG_STYLE" # endif # undef _PORT_STYLE #endif /* _PORT_STYLE */ #ifdef _PORT_FILENAME /* Some file name related macros. */ # ifndef _PORTFILENAME_INCLUDED_ # define _PORTFILENAME_INCLUDED_ # if !(__DOS__ || __TOS__) /* UNIX-style filenames. */ # define SLASH '/' # define SLASH_str "/" # define isabsf(fnm) ((fnm)[0] == SLASH) # ifndef PATH_MAX /* obsolescent; should use _POSIX_PATH_MAX. */ # define PATH_MAX 1024 # endif # else /* (__DOS__ || __TOS__) */ # define SLASH '\\' # define SLASH_str "\\" # ifndef PATH_MAX # ifndef _MAX_PATH # define PATH_MAX 128 # else # define PATH_MAX _MAX_PATH # endif # endif # endif /* (__DOS__ || __TOS__) */ # ifndef _MAX_PATH # define _MAX_PATH PATH_MAX # endif # endif /* _PORTFILENAME_INCLUDED */ # undef _PORT_FILENAME #endif /* _PORT_FILENAME */ #ifdef _PORT_ERROR /* Some frequently used (by me [TRH]) declarations. */ # ifndef _PORTERROR_INCLUDED_ # define _PORTERROR_INCLUDED_ extern void error __(( const char *_(fmt) ___ )); extern void puterr __(( const char *_(fmt) ___ )); # endif # undef _PORT_ERROR #endif /*======================================================================* * $Log: portdefs.h,v $ * Revision 1.13 1993/02/02 21:00:42 gerben * *** empty log message *** * * Revision 1.12 1993/01/28 15:21:54 tom * some textual cleanups; fix _PORT_INTN_TYPES, add _PORT_pt compatibility * option; move _PORT_STYLE beyond _PORT_KEYWORDS. * * Revision 1.11 1992/12/30 12:38:04 tom * add support for traditional return types to avoid conflicts with ditto system headers; * move inclusion of <unistd.h> after "portansi.h" since that can redefine void. * * Revision 1.10 1992/12/22 14:56:29 tom * add _LIBC_NEEDS_PROMOTION, _P_<function>_RETURN_TYPE kludges; include proper * string header for _PORT_FUNCTIONS. * * Revision 1.9 1992/12/18 22:57:45 tom * remove sun from _ANSI_HEADERS_ list; add _I_NDIR/_I_SYS_NDIR/_I_SYS_DIR * as alternatives to _I_DIRENT. * * Revision 1.8 1992/10/27 13:07:48 tom * add mips (Ultrix) tentatively; add some missing line continuations; * change parenthesis order (_PORT_XXX)-0 => (_PORT_XXX-0) to allow empty def. * * Revision 1.7 1992/10/23 04:11:14 tom * update description; major revision of _I_<header> handling; add generic * __SYSV__ and __BSD__ flags; use `void_*'. * * Revision 1.6 1992/10/21 19:40:23 tom * some comment changes. * * Revision 1.5 1992/10/20 16:52:20 tom * revert to __STRICT_POSIX__; add _I_WAIT if not _I_SYS_WAIT; similarly, * add _I_TERMIO if not _I_TERMIOS, add _I_SGTTY if not _I_TERMIO (default * undefined for Unix; (-1) for non-Unix systems. * * Revision 1.4 1992/10/09 07:07:34 tom * add _I_<header> flags; add GNU Autoconfig/LWall Metaconfig compatibility; * replace __STRICT_POSIX__ with _POSIX_SOURCE since that is its meaning all * along (as I understood it, at least); add some comments. * * Revision 1.3 1992/10/03 01:01:26 tom * add copyleft; rename _PORT_STR_FUNCTIONS to _PORT_CHR_FUNCTIONS to avoid * 8-char significance conflict with _PORT_STYLE; group _PORT_{GNUC,DOS,TOS} * as _PORT_KEYWORDS options; allow multiple inclusions to define specific * optional _PORT_XXX features if required in other header files. * * Revision 1.2 1992/09/16 20:46:46 tom * add summary description; improve handling of pre-defined options; * add `offsetof()'; add configuration options: _PORT_GNUC, _PORT_TYPES, * (= _PORT_{BWL,INTN}_TYPES), _PORT_FUNCTIONS (= _PORT_{STR,MEM}_FUNCTIONS), * _PORT_STYLE (= _PORT_REG_STYLE), _PORT_DOS, _PORT_TOS, _PORT_FILENAME, * _PORT_ERROR. * * Revision 1.1 1992/09/14 04:43:40 tom * Initial revision * *======================================================================*/
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.