diff options
author | Henry Stiles <henry.stiles@artifex.com> | 1998-07-26 07:36:41 +0000 |
---|---|---|
committer | Henry Stiles <henry.stiles@artifex.com> | 1998-07-26 07:36:41 +0000 |
commit | eec0ef527f18c5978c4476c9490f4de4c4249628 (patch) | |
tree | 5588d5e1300a245186594893c930949a19bcbbce /gs/src/stdpre.h | |
parent | d4bdba93ef34f68d27148e1b31088d1d3e786e8c (diff) | |
download | ghostpdl-eec0ef527f18c5978c4476c9490f4de4c4249628.tar.gz |
Initial revision
git-svn-id: http://svn.ghostscript.com/ghostpcl/trunk/ghostpcl@246 06663e23-700e-0410-b217-a244a6096597
Diffstat (limited to 'gs/src/stdpre.h')
-rw-r--r-- | gs/src/stdpre.h | 378 |
1 files changed, 378 insertions, 0 deletions
diff --git a/gs/src/stdpre.h b/gs/src/stdpre.h new file mode 100644 index 000000000..753d04b31 --- /dev/null +++ b/gs/src/stdpre.h @@ -0,0 +1,378 @@ +/* Copyright (C) 1993, 1994, 1996, 1997 Aladdin Enterprises. All rights reserved. + + This file is part of Aladdin Ghostscript. + + Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND. No author + or distributor accepts any responsibility for the consequences of using it, + or for whether it serves any particular purpose or works at all, unless he + or she says so in writing. Refer to the Aladdin Ghostscript Free Public + License (the "License") for full details. + + Every copy of Aladdin Ghostscript must include a copy of the License, + normally in a plain ASCII text file named PUBLIC. The License grants you + the right to copy, modify and redistribute Aladdin Ghostscript, but only + under certain conditions described in the License. Among other things, the + License requires that the copyright notice and this notice be preserved on + all copies. +*/ + +/* stdpre.h */ +/* Standard definitions for Aladdin Enterprises code not needing arch.h */ + +#ifndef stdpre_INCLUDED +# define stdpre_INCLUDED + +/* + * Here we deal with the vagaries of various C compilers. We assume that: + * ANSI-standard Unix compilers define __STDC__. + * Borland Turbo C and Turbo C++ define __MSDOS__ and __TURBOC__. + * Borland C++ defines __BORLANDC__, __MSDOS__, and __TURBOC__. + * Microsoft C/C++ defines _MSC_VER and _MSDOS. + * Watcom C defines __WATCOMC__ and MSDOS. + * + * We arrange to define __MSDOS__ on all the MS-DOS platforms. + */ +#if (defined(MSDOS) || defined(_MSDOS)) && !defined(__MSDOS__) +# define __MSDOS__ +#endif +/* + * Also, not used much here, but used in other header files, we assume: + * Unix System V environments define SYSV. + * The SCO ODT compiler defines M_SYSV and M_SYS3. + * VMS systems define VMS. + * OSF/1 compilers define __osf__ or __OSF__. + * (The VMS and OSF/1 C compilers handle prototypes and const, + * but do not define __STDC__.) + * bsd 4.2 or 4.3 systems define BSD4_2. + * POSIX-compliant environments define _POSIX_SOURCE. + * Motorola 88K BCS/OCS systems defined m88k. + * + * We make fairly heroic efforts to confine all uses of these flags to + * header files, and never to use them in code. + */ +#if defined(__osf__) && !defined(__OSF__) +# define __OSF__ /* */ +#endif +#if defined(M_SYSV) && !defined(SYSV) +# define SYSV /* */ +#endif +#if defined(M_SYS3) && !defined(__SVR3) +# define __SVR3 /* */ +#endif + +#if defined(__STDC__) || defined(__MSDOS__) || defined(__convex__) || defined(VMS) || defined(__OSF__) || defined(__WIN32__) || defined(__IBMC__) || defined(M_UNIX) || defined(__GNUC__) || defined(__BORLANDC__) +# if !(defined(M_XENIX) && !defined(__GNUC__)) /* SCO Xenix cc is broken */ +# define __PROTOTYPES__ /* */ +# endif +#endif + +/* Define dummy values for __FILE__ and __LINE__ if the compiler */ +/* doesn't provide these. Note that places that use __FILE__ */ +/* must check explicitly for a null pointer. */ +#ifndef __FILE__ +# define __FILE__ NULL +#endif +#ifndef __LINE__ +# define __LINE__ 0 +#endif + +/* Disable 'const' and 'volatile' if the compiler can't handle them. */ +#ifndef __PROTOTYPES__ +# undef const +# define const /* */ +# undef volatile +# define volatile /* */ +#endif + +/* + * Some compilers give a warning if a function call that returns a value + * is used as a statement; a few compilers give an error for the construct + * (void)0, which is contrary to the ANSI standard. Since we don't know of + * any compilers that do both, we define a macro here for discarding + * the value of an expression statement, which can be defined as either + * including or not including the cast. (We don't conditionalize this here, + * because no commercial compiler gives the error on (void)0, although + * some give warnings.) + */ +#define discard(expr) ((void)(expr)) + +/* + * The SVR4.2 C compiler incorrectly considers the result of << and >> + * to be unsigned if the left operand is signed and the right operand is + * unsigned. We believe this only causes trouble in Ghostscript code when + * the right operand is a sizeof(...), which is unsigned for this compiler. + * Therefore, we replace the relevant uses of sizeof with size_of: + */ +#define size_of(x) ((int)(sizeof(x))) + +/* + * Disable MS-DOS specialized pointer types on non-MS-DOS systems. + * Watcom C defines near, far, and huge as macros, so we must undef them. + * far_data is used for static data that must get its own segment. + * This is supported in Borland C++, but none of the others. + */ +#undef far_data +#if defined(__TURBOC__) && !defined(__WIN32__) +# ifdef __BORLANDC__ +# define far_data far +# else +# define far_data /* */ +# endif +#else +# undef near +# define near /* */ +# undef far +# define far /* */ +# define far_data /* */ +# undef huge +# define huge /* */ +# define _cs /* */ +# define _ds /* */ +/* _es is never safe to use */ +# define _ss /* */ +#endif + +/* Get the size of a statically declared array. */ +#define countof(a) (sizeof(a) / sizeof((a)[0])) +#define count_of(a) (size_of(a) / size_of((a)[0])) + +/* + * Get the offset of a structure member. Amazingly enough, the simpler + * definition works on all compilers except for one broken MIPS compiler + * and the IBM RS/6000. Unfortunately, because of these two compilers, + * we have to use the more complex definition. Even more unfortunately, + * the more complex definition doesn't work on the MetroWerks + * CodeWarrior compiler (Macintosh and BeOS). + */ +#ifdef __MWERKS__ +#define offset_of(type, memb)\ + ((int) &((type *) 0)->memb) +#else +#define offset_of(type, memb)\ + ((int) ( (char *)&((type *)0)->memb - (char *)((type *)0) )) +#endif + +/* + * Get the alignment of a pointer modulo a given power of 2. + * There is no portable way to do this, but the following definition + * works on all reasonable systems. + */ +#define alignment_mod(ptr, modu)\ + ((uint)( ((const char *)(ptr) - (const char *)0) & ((modu) - 1) )) + +/* Define short names for the unsigned types. */ +typedef unsigned char byte; +typedef unsigned char uchar; +typedef unsigned short ushort; +typedef unsigned int uint; +typedef unsigned long ulong; + +/* Since sys/types.h often defines one or more of these (depending on */ +/* the platform), we have to take steps to prevent name clashes. */ +/*** NOTE: This requires that you include std.h *before* any other ***/ +/*** header file that includes sys/types.h. ***/ +#define bool bool_ /* (maybe not needed) */ +#define uchar uchar_ +#define uint uint_ +#define ushort ushort_ +#define ulong ulong_ +#include <sys/types.h> +#undef bool +#undef uchar +#undef uint +#undef ushort +#undef ulong + +/* + * Define a Boolean type. Even though we would like it to be + * unsigned char, it pretty well has to be int, because + * that's what all the relational operators and && and || produce. + * We can't make it an enumerated type, because ints don't coerce + * freely to enums (although the opposite is true). + * Unfortunately, at least some C++ compilers have a built-in bool type, + * and the MetroWerks C++ compiler insists that bool be equivalent to + * unsigned char. + */ +#ifndef __cplusplus +#ifdef __BEOS__ +typedef unsigned char bool; +#else +typedef int bool; +#endif +#endif +/* + * MetroWerks CodeWarrior predefines true and false, probably as 1 and 0. + * We need to cancel those definitions for our own code. + */ +#undef false +#define false ((bool)0) +#undef true +#define true ((bool)1) + +/* + * Compilers disagree as to whether macros used in macro arguments + * should be expanded at the time of the call, or at the time of + * final expansion. Even authoritative documents disagree: the ANSI + * standard says the former, but Harbison and Steele's book says the latter. + * In order to work around this discrepancy, we have to do some very + * ugly things in a couple of places. We mention it here because + * it might well trip up future developers. + */ + +/* + * Define the type to be used for ordering pointers (<, >=, etc.). + * The Borland and Microsoft large models only compare the offset part + * of segmented pointers. Semantically, the right type to use for the + * comparison is char huge *, but we have no idea how expensive comparing + * such pointers is, and any type that compares all the bits of the pointer, + * gives the right result for pointers in the same segment, and keeps + * different segments disjoint will do. + */ +#if defined(__TURBOC__) || defined(_MSC_VER) +typedef unsigned long ptr_ord_t; +#else +typedef const char *ptr_ord_t; +#endif +/* Define all the pointer comparison operations. */ +#define _ptr_cmp(p1, rel, p2) ((ptr_ord_t)(p1) rel (ptr_ord_t)(p2)) +#define ptr_le(p1, p2) _ptr_cmp(p1, <=, p2) +#define ptr_lt(p1, p2) _ptr_cmp(p1, <, p2) +#define ptr_ge(p1, p2) _ptr_cmp(p1, >=, p2) +#define ptr_gt(p1, p2) _ptr_cmp(p1, >, p2) +#define ptr_between(ptr, lo, hi)\ + (ptr_ge(ptr, lo) && ptr_lt(ptr, hi)) + +/* Define min and max, but make sure to use the identical definition */ +/* to the one that all the compilers seem to have.... */ +#ifndef min +# define min(a, b) (((a) < (b)) ? (a) : (b)) +#endif +#ifndef max +# define max(a, b) (((a) > (b)) ? (a) : (b)) +#endif + +/* Define a standard way to round values to a (constant) modulus. */ +#define round_down(value, modulus)\ + ( (modulus) & ((modulus) - 1) ? /* not a power of 2 */\ + (value) - (value) % (modulus) :\ + (value) & -(modulus) ) +#define round_up(value, modulus)\ + ( (modulus) & ((modulus) - 1) ? /* not a power of 2 */\ + ((value) + ((modulus) - 1)) / (modulus) * (modulus) :\ + ((value) + ((modulus) - 1)) & -(modulus) ) + +/* + * In pre-ANSI C, float parameters get converted to double. + * However, if we pass a float to a function that has been declared + * with a prototype, and the parameter has been declared as float, + * the ANSI standard specifies that the parameter is left as float. + * To avoid problems caused by missing prototypes, + * we declare almost all float parameters as double. + */ +typedef double floatp; + +/* + * Define a handy macro for a statement that does nothing. + * We can't just use an empty body, since this upsets some compilers. + * We can't use the obvious + * if (0) + * since that could "capture" a following statement if used incorrectly. + */ +#ifndef DO_NOTHING +# define DO_NOTHING do {} while (0) +#endif + +/* + * For accountability, debugging, and error messages, + * we pass a client identification string to alloc and free, + * and possibly other places as well. + * Define the type for these strings. Note that because of the _ds, + * we must coerce them explicitly when passing them to printf et al. + */ +typedef const char _ds *client_name_t; +#define client_name_string(cname) ((const char *)(cname)) + +/* + * If we are debugging, make all static variables and procedures public + * so they get passed through the linker. + */ +#define public /* */ +/* + * We separate out the definition of private this way so that + * we can temporarily #undef it to handle the X Windows headers, + * which define a member named private. + */ +#ifdef NOPRIVATE +# define private_ /* */ +#else +# define private_ static +#endif +#define private private_ + +/* + * Macros for argument templates. ANSI C has these, as does Turbo C, + * but older pcc-derived (K&R) Unix compilers don't. The syntax is + * resulttype func(Pn(arg1, ..., argn)); + */ + +#ifdef __PROTOTYPES__ +# define P0() void +# define P1(t1) t1 +# define P2(t1,t2) t1,t2 +# define P3(t1,t2,t3) t1,t2,t3 +# define P4(t1,t2,t3,t4) t1,t2,t3,t4 +# define P5(t1,t2,t3,t4,t5) t1,t2,t3,t4,t5 +# define P6(t1,t2,t3,t4,t5,t6) t1,t2,t3,t4,t5,t6 +# define P7(t1,t2,t3,t4,t5,t6,t7) t1,t2,t3,t4,t5,t6,t7 +# define P8(t1,t2,t3,t4,t5,t6,t7,t8) t1,t2,t3,t4,t5,t6,t7,t8 +# define P9(t1,t2,t3,t4,t5,t6,t7,t8,t9) t1,t2,t3,t4,t5,t6,t7,t8,t9 +# define P10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10 +# define P11(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11 +# define P12(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12 +# define P13(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13 +# define P14(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14 +# define P15(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15) t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15 +#else +# define P0() /* */ +# define P1(t1) /* */ +# define P2(t1,t2) /* */ +# define P3(t1,t2,t3) /* */ +# define P4(t1,t2,t3,t4) /* */ +# define P5(t1,t2,t3,t4,t5) /* */ +# define P6(t1,t2,t3,t4,t5,t6) /* */ +# define P7(t1,t2,t3,t4,t5,t6,t7) /* */ +# define P8(t1,t2,t3,t4,t5,t6,t7,t8) /* */ +# define P9(t1,t2,t3,t4,t5,t6,t7,t8,t9) /* */ +# define P10(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10) /* */ +# define P11(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11) /* */ +# define P12(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12) /* */ +# define P13(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13) /* */ +# define P14(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14) /* */ +# define P15(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15) /* */ +#endif + +/* Define success and failure codes for 'exit'. */ +#ifdef VMS +# define exit_OK 1 +# define exit_FAILED 18 +#else +# define exit_OK 0 +# define exit_FAILED 1 +#endif +/* + * Define the informational exit status. + * We need to distinguish information returns because under MS Windows, + * they must return like an error so that the text window stays on the + * screen, while on other platforms, they must return successfully. + * Note that we define both gs_exit_INFO (before platform-specific + * mapping of 0 to exit_OK and 1 to exit_FAILED) and exit_INFO. + */ +#if defined(_WINDOWS) || defined(_Windows) +# define exit_INFO exit_FAILED +# define gs_exit_INFO 1 +#else +# define exit_INFO exit_OK +# define gs_exit_INFO 0 +#endif + +#endif /* stdpre_INCLUDED */ |