blob: d29531696bd9f06ec3d05a3ce161d0821c4e3f21 [file] [log] [blame]
/* Copyright (C) 1989, 1990 Aladdin Enterprises. All rights reserved.
Distributed by Free Software Foundation, Inc.
This file is part of Ghostscript.
Ghostscript is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY. No author or distributor accepts responsibility
to anyone for the consequences of using it or for whether it serves any
particular purpose or works at all, unless he says so in writing. Refer
to the Ghostscript General Public License for full details.
Everyone is granted permission to copy, modify and redistribute
Ghostscript, but only under the conditions described in the Ghostscript
General Public License. A copy of this license is supposed to have been
given to you along with Ghostscript so you can know your rights and
responsibilities. It should be in a file named COPYING. Among other
things, the copyright notice and this notice must be preserved on all
copies. */
/* std.h */
/* Standard definitions for Aladdin Enterprises code */
/*
* Here we deal with the vagaries of various C compilers. We assume that:
* ANSI-standard Unix compilers define __STDC__.
* Turbo C defines __MSDOS__.
* Microsoft C defines MSDOS.
* Also, not used much here, but used in other header files, we assume:
* Unix System V environments define USG or SYSV.
* (GNU software uses the former, non-GNU tends to use the latter.)
* VMS systems define VMS.
* bsd 4.2 or 4.3 systems define BSD4_2.
* POSIX-compliant environments define _POSIX_SOURCE.
*
* We make fairly heroic efforts to confine all uses of these flags to
* header files, and never to use them in code.
*/
#ifdef __STDC__
# define STDC_OR_MSDOS /* */
#endif
#ifdef __MSDOS__
# define STDC_OR_MSDOS /* */
#endif
/* Recognize USG and SYSV as synonyms. GNU software uses the former, */
/* non-GNU tends to use the latter. We use the latter. */
#ifdef USG
# define SYSV /* */
#endif
/* Disable 'const' if the compiler can't handle it. */
#ifndef STDC_OR_MSDOS
# define const /* */
#endif
/* Disable MS-DOS specialized pointer types on non-MS-DOS systems. */
#ifndef __MSDOS__
# define near /* */
# define far /* */
# define huge /* */
# define _cs /* */
# define _ds /* */
/* _es is never safe to use */
# define _ss /* */
#endif
/* Miscellaneous types */
typedef unsigned char byte;
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
/* Maximum values for the unsigned types. */
#include <limits.h>
#define max_uchar UCHAR_MAX
#define max_ushort USHRT_MAX
#define max_uint UINT_MAX
#define max_ulong ULONG_MAX
/* Define a reliable arithmetic right shift. */
#if (-2 >> 1) == -1
# define arith_rshift(x,n) ((x) >> (n))
#else
# define arith_rshift(x,n) ((x) < 0 ? ~(~(x) >> (n)) : (x) >> (n))
#endif
/* The type to be used for comparing pointers for order (<, >=, etc.). */
/* Turbo C large model doesn't compare pointers per se correctly. */
#ifdef __MSDOS__
typedef unsigned long ptr_ord_t;
#else
typedef char *ptr_ord_t;
#endif
/* In case stdio.h doesn't have these: */
#ifndef min
# define min(a, b) ((a) < (b) ? (a) : (b))
#endif
#ifndef max
# define max(a, b) ((a) > (b) ? (a) : (b))
#endif
/* math.h is different for Turbo and Unix.... */
#ifndef M_PI
# ifdef PI
# define M_PI PI
# else
# define M_PI 3.14159265358979324
# endif
#endif
/* VMS doesn't have the unlink system call. Use delete instead. */
#ifdef VMS
# define unlink(fname) delete(fname)
#endif
/* K&R specifies that float parameters get converted to double. */
/* Most compilers allow a formal parameter to be declared float, */
/* and treat it as though it had been declared double; however, */
/* Turbo C (and perhaps the ANSI standard) doesn't allow this. */
/* Pending a deeper understanding of this issue, we define a */
/* special type for float parameters. */
#ifdef __STDC__
typedef double floatp;
#else
typedef float floatp;
#endif
/* If we are debugging, make all static variables and procedures public */
/* so they get passed through the linker. */
#ifdef NOPRIVATE
# define private /* */
#else
# define private static
#endif
/* Macros for argument templates. ANSI has these, as does Turbo C, */
/* but most Unix compilers don't. */
#ifdef STDC_OR_MSDOS
# 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
#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) /* */
#endif
/* Types for client-supplied allocate and free procedures. */
/* For accountability, debugging, and error messages, */
/* we pass an identifying string to alloc and free. */
/* Note that the arguments are like calloc, not like malloc, */
/* but an alloc procedure doesn't clear the block. */
typedef char *(*proc_alloc_t)(P3(unsigned num_elements, unsigned element_size, char *client_name));
typedef void (*proc_free_t)(P4(char *data, unsigned num_elements, unsigned element_size, char *client_name));
/* Standard error printing macros */
/* Use eprintf for ordinary error messages, */
/* dprintf for messages that should include debugging info. */
#ifdef PROGRAM_NAME
# define _epn fprintf(stderr, PROGRAM_NAME),
#else
# define _epn /* */
#endif
#define eprintf(str)\
(_epn fprintf(stderr, str))
#define eprintf1(str,arg1)\
(_epn fprintf(stderr, str, arg1))
#define eprintf2(str,arg1,arg2)\
(_epn fprintf(stderr, str, arg1, arg2))
#define eprintf3(str,arg1,arg2,arg3)\
(_epn fprintf(stderr, str, arg1, arg2, arg3))
#define _epfl /* */
#ifdef __FILE__
# ifdef __LINE__
# undef _epfl
# define _epfl fprintf(stderr, "%s(%d): ", __FILE__, __LINE__),
# endif
#endif
#define _epd _epn _epfl
#define dprintf(str)\
(_epd fprintf(stderr, str))
#define dprintf1(str,arg1)\
(_epd fprintf(stderr, str, arg1))
#define dprintf2(str,arg1,arg2)\
(_epd fprintf(stderr, str, arg1, arg2))
#define dprintf3(str,arg1,arg2,arg3)\
(_epd fprintf(stderr, str, arg1, arg2, arg3))