#undef PORTNAME #define PORTNAME OS2 /*------------------------------------------------------------------------- * * c.h-- * Fundamental C definitions. This is included by every .c file in * postgres. * * * Copyright (c) 1994, Regents of the University of California * * $Id: c.h,v 1.1 1998/10/31 04:10:53 scrappy Exp $ * *------------------------------------------------------------------------- */ /* * TABLE OF CONTENTS * * When adding stuff to this file, please try and put stuff * into the relevant section, or add new sections as appropriate. * * section description * ------- ------------------------------------------------ * 1) bool, true, false, TRUE, FALSE * 2) __STDC__, non-ansi C definitions: * Pointer typedef, NULL * cpp magic macros * type prefixes: const, signed, volatile, inline * 3) standard system types * 4) datum type * 5) IsValid macros for system types * 6) offsetof, lengthof, endof * 7) exception handling definitions, Assert, Trap, etc macros * 8) Min, Max, Abs, StrNCpy macros * 9) externs * 10) Berkeley-specific defs * 11) system-specific hacks * * NOTES * * This file is MACHINE AND COMPILER dependent!!! (For now.) * * ---------------------------------------------------------------- */ #ifndef C_H #define C_H /* We have to include stdlib.h here because it defines many of these macros on some platforms, and we only want our definitions used if stdlib.h doesn't have its own. */ #include /* ---------------------------------------------------------------- * Section 1: bool, true, false, TRUE, FALSE * ---------------------------------------------------------------- */ /* * bool -- * Boolean value, either true or false. * */ #define false ((char) 0) #define true ((char) 1) #ifndef __cplusplus #ifndef bool typedef char bool; #endif /* ndef bool */ #endif /* not C++ */ typedef bool *BoolPtr; #ifndef TRUE #define TRUE 1 #endif /* TRUE */ #ifndef FALSE #define FALSE 0 #endif /* FALSE */ /* ---------------------------------------------------------------- * Section 2: __STDC__, non-ansi C definitions: * * cpp magic macros * Pointer typedef, NULL * type prefixes: const, signed, volatile, inline * ---------------------------------------------------------------- */ #ifdef __STDC__ /* ANSI C */ /* * Pointer -- * Variable holding address of any memory resident object. */ /* * XXX Pointer arithmetic is done with this, so it can't be void * * under "true" ANSI compilers. */ typedef char *Pointer; #ifndef NULL /* * NULL -- * Null pointer. */ #define NULL ((void *) 0) #endif /* !defined(NULL) */ #define HAVE_ANSI_CPP /* all ANSI C compilers must have this! */ #if defined(NEED_STD_HDRS) #undef NEED_STD_HDRS /* all ANSI systems must have * stddef/stdlib */ #endif /* NEED_STD_HDRS */ #else /* !defined(__STDC__) *//* NOT ANSI C */ /* * Pointer -- * Variable containing address of any memory resident object. */ typedef char *Pointer; #ifndef NULL /* * NULL -- * Null pointer. */ #define NULL 0 #endif /* !defined(NULL) */ /* * const -- * Type modifier. Identifies read only variables. * * Example: * extern const Version RomVersion; */ #ifndef WIN32 #define const /* const */ #endif /* * signed -- * Type modifier. Identifies signed integral types. */ #define signed /* signed */ /* * volatile -- * Type modifier. Identifies variables which may change in ways not * noticeable by the compiler, e.g. via asynchronous interrupts. * * Example: * extern volatile unsigned int NumberOfInterrupts; */ #define volatile /* volatile */ #endif /* !defined(__STDC__) */ /* NOT ANSI C */ /* * CppAsString -- * Convert the argument to a string, using the C preprocessor. * CppConcat -- * Concatenate two arguments together, using the C preprocessor. */ #if defined(HAVE_ANSI_CPP) #define CppAsString(identifier) #identifier #define CppConcat(x, y) x##y #else /* !HAVE_ANSI_CPP */ #define CppAsString(identifier) "identifier" /* * CppIdentity -- On Reiser based cpp's this is used to concatenate * two tokens. That is * CppIdentity(A)B ==> AB * We renamed it to _private_CppIdentity because it should not * be referenced outside this file. On other cpp's it * produces A B. */ #define _priv_CppIdentity(x)x #define CppConcat(x, y) _priv_CppIdentity(x)y #endif /* !HAVE_ANSI_CPP */ #ifndef __GNUC__ /* GNU cc */ #endif #ifndef __GNUC__ /* GNU cc */ #define inline /* * dummyret is used to set return values in macros that use ?: to make * assignments. gcc wants these to be void, other compilers like char */ #define dummyret char #else #define dummyret void #endif #if defined(NEED_STD_HDRS) /* * You're doomed. We've removed almost all of our own C library * extern declarations because they conflict on the different * systems. You'll have to write your own stdlib.h. */ #include "stdlib.h" #else /* NEED_STD_HDRS */ #include #include #endif /* NEED_STD_HDRS */ /* ---------------------------------------------------------------- * Section 3: standard system types * ---------------------------------------------------------------- */ /* * intN -- * Signed integer, EXACTLY N BITS IN SIZE, * used for numerical computations and the * frontend/backend protocol. */ typedef signed char int8; /* == 8 bits */ typedef signed short int16; /* == 16 bits */ typedef signed int int32; /* == 32 bits */ /* * uintN -- * Unsigned integer, EXACTLY N BITS IN SIZE, * used for numerical computations and the * frontend/backend protocol. */ typedef unsigned char uint8; /* == 8 bits */ typedef unsigned short uint16; /* == 16 bits */ typedef unsigned int uint32; /* == 32 bits */ /* * floatN -- * Floating point number, AT LEAST N BITS IN SIZE, * used for numerical computations. * * Since sizeof(floatN) may be > sizeof(char *), always pass * floatN by reference. */ typedef float float32data; typedef double float64data; typedef float *float32; typedef double *float64; /* * boolN -- * Boolean value, AT LEAST N BITS IN SIZE. */ typedef uint8 bool8; /* >= 8 bits */ typedef uint16 bool16; /* >= 16 bits */ typedef uint32 bool32; /* >= 32 bits */ /* * bitsN -- * Unit of bitwise operation, AT LEAST N BITS IN SIZE. */ typedef uint8 bits8; /* >= 8 bits */ typedef uint16 bits16; /* >= 16 bits */ typedef uint32 bits32; /* >= 32 bits */ /* * wordN -- * Unit of storage, AT LEAST N BITS IN SIZE, * used to fetch/store data. */ typedef uint8 word8; /* >= 8 bits */ typedef uint16 word16; /* >= 16 bits */ typedef uint32 word32; /* >= 32 bits */ /* * Size -- * Size of any memory resident object, as returned by sizeof. */ typedef unsigned int Size; /* * Index -- * Index into any memory resident array. * * Note: * Indices are non negative. */ typedef unsigned int Index; #define MAXDIM 6 typedef struct { int indx[MAXDIM]; } IntArray; /* * Offset -- * Offset into any memory resident array. * * Note: * This differs from an Index in that an Index is always * non negative, whereas Offset may be negative. */ typedef signed int Offset; /* ---------------------------------------------------------------- * Section 4: datum type + support macros * ---------------------------------------------------------------- */ /* * datum.h -- * POSTGRES abstract data type datum representation definitions. * * Note: * * Port Notes: * Postgres makes the following assumption about machines: * * sizeof(Datum) == sizeof(long) >= sizeof(void *) >= 4 * * Postgres also assumes that * * sizeof(char) == 1 * * and that * * sizeof(short) == 2 * * If your machine meets these requirements, Datums should also be checked * to see if the positioning is correct. * * This file is MACHINE AND COMPILER dependent!!! */ typedef unsigned long Datum; /* XXX sizeof(long) >= sizeof(void *) */ typedef Datum *DatumPtr; #define GET_1_BYTE(datum) (((Datum) (datum)) & 0x000000ff) #define GET_2_BYTES(datum) (((Datum) (datum)) & 0x0000ffff) #define GET_4_BYTES(datum) (((Datum) (datum)) & 0xffffffff) #define SET_1_BYTE(value) (((Datum) (value)) & 0x000000ff) #define SET_2_BYTES(value) (((Datum) (value)) & 0x0000ffff) #define SET_4_BYTES(value) (((Datum) (value)) & 0xffffffff) /* * DatumGetChar -- * Returns character value of a datum. */ #define DatumGetChar(X) ((char) GET_1_BYTE(X)) /* * CharGetDatum -- * Returns datum representation for a character. */ #define CharGetDatum(X) ((Datum) SET_1_BYTE(X)) /* * Int8GetDatum -- * Returns datum representation for an 8-bit integer. */ #define Int8GetDatum(X) ((Datum) SET_1_BYTE(X)) /* * DatumGetUInt8 -- * Returns 8-bit unsigned integer value of a datum. */ #define DatumGetUInt8(X) ((uint8) GET_1_BYTE(X)) /* * UInt8GetDatum -- * Returns datum representation for an 8-bit unsigned integer. */ #define UInt8GetDatum(X) ((Datum) SET_1_BYTE(X)) /* * DatumGetInt16 -- * Returns 16-bit integer value of a datum. */ #define DatumGetInt16(X) ((int16) GET_2_BYTES(X)) /* * Int16GetDatum -- * Returns datum representation for a 16-bit integer. */ #define Int16GetDatum(X) ((Datum) SET_2_BYTES(X)) /* * DatumGetUInt16 -- * Returns 16-bit unsigned integer value of a datum. */ #define DatumGetUInt16(X) ((uint16) GET_2_BYTES(X)) /* * UInt16GetDatum -- * Returns datum representation for a 16-bit unsigned integer. */ #define UInt16GetDatum(X) ((Datum) SET_2_BYTES(X)) /* * DatumGetInt32 -- * Returns 32-bit integer value of a datum. */ #define DatumGetInt32(X) ((int32) GET_4_BYTES(X)) /* * Int32GetDatum -- * Returns datum representation for a 32-bit integer. */ #define Int32GetDatum(X) ((Datum) SET_4_BYTES(X)) /* * DatumGetUInt32 -- * Returns 32-bit unsigned integer value of a datum. */ #define DatumGetUInt32(X) ((uint32) GET_4_BYTES(X)) /* * UInt32GetDatum -- * Returns datum representation for a 32-bit unsigned integer. */ #define UInt32GetDatum(X) ((Datum) SET_4_BYTES(X)) /* * DatumGetObjectId -- * Returns object identifier value of a datum. */ #define DatumGetObjectId(X) ((Oid) GET_4_BYTES(X)) /* * ObjectIdGetDatum -- * Returns datum representation for an object identifier. */ #define ObjectIdGetDatum(X) ((Datum) SET_4_BYTES(X)) /* * DatumGetPointer -- * Returns pointer value of a datum. */ #define DatumGetPointer(X) ((Pointer) X) /* * PointerGetDatum -- * Returns datum representation for a pointer. */ #define PointerGetDatum(X) ((Datum) X) /* * DatumGetName -- * Returns name value of a datum. */ #define DatumGetName(X) ((Name) DatumGetPointer((Datum) X)) /* * NameGetDatum -- * Returns datum representation for a name. */ #define NameGetDatum(X) PointerGetDatum((Pointer) X) /* * DatumGetFloat32 -- * Returns 32-bit floating point value of a datum. * This is really a pointer, of course. */ #define DatumGetFloat32(X) ((float32) DatumGetPointer((Datum) X)) /* * Float32GetDatum -- * Returns datum representation for a 32-bit floating point number. * This is really a pointer, of course. */ #define Float32GetDatum(X) PointerGetDatum((Pointer) X) /* * DatumGetFloat64 -- * Returns 64-bit floating point value of a datum. * This is really a pointer, of course. */ #define DatumGetFloat64(X) ((float64) DatumGetPointer(X)) /* * Float64GetDatum -- * Returns datum representation for a 64-bit floating point number. * This is really a pointer, of course. */ #define Float64GetDatum(X) PointerGetDatum((Pointer) X) /* ---------------------------------------------------------------- * Section 5: IsValid macros for system types * ---------------------------------------------------------------- */ /* * BoolIsValid -- * True iff bool is valid. */ #define BoolIsValid(boolean) ((boolean) == false || (boolean) == true) /* * PointerIsValid -- * True iff pointer is valid. */ #define PointerIsValid(pointer) (bool)((void*)(pointer) != NULL) /* * PointerIsInBounds -- * True iff pointer is within given bounds. * * Note: * Assumes the bounded interval to be [min,max), * i.e. closed on the left and open on the right. */ #define PointerIsInBounds(pointer, min, max) \ ((min) <= (pointer) && (pointer) < (max)) /* * PointerIsAligned -- * True iff pointer is properly aligned to point to the given type. */ #define PointerIsAligned(pointer, type) \ (((long)(pointer) % (sizeof (type))) == 0) /* ---------------------------------------------------------------- * Section 6: offsetof, lengthof, endof * ---------------------------------------------------------------- */ /* * offsetof -- * Offset of a structure/union field within that structure/union. * * XXX This is supposed to be part of stddef.h, but isn't on * some systems (like SunOS 4). */ #ifndef offsetof #define offsetof(type, field) ((long) &((type *)0)->field) #endif /* offsetof */ /* * lengthof -- * Number of elements in an array. */ #define lengthof(array) (sizeof (array) / sizeof ((array)[0])) /* * endof -- * Address of the element one past the last in an array. */ #define endof(array) (&array[lengthof(array)]) /* ---------------------------------------------------------------- * Section 7: exception handling definitions * Assert, Trap, etc macros * ---------------------------------------------------------------- */ /* * Exception Handling definitions */ typedef char *ExcMessage; typedef struct Exception { ExcMessage message; } Exception; /* * USE_ASSERT_CHECKING, if defined, turns on all the assertions. * - plai 9/5/90 * * It should _NOT_ be defined in releases or in benchmark copies */ /* * Trap -- * Generates an exception if the given condition is true. * */ #define Trap(condition, exception) \ { if ((assert_enabled) && (condition)) \ ExceptionalCondition(CppAsString(condition), &(exception), \ (char*)NULL, __FILE__, __LINE__); } /* * TrapMacro is the same as Trap but it's intended for use in macros: * * #define foo(x) (AssertM(x != 0) && bar(x)) * * Isn't CPP fun? */ #define TrapMacro(condition, exception) \ ((bool) ((! assert_enabled) || (! condition) || \ (ExceptionalCondition(CppAsString(condition), \ &(exception), \ (char*) NULL, __FILE__, __LINE__)))) #ifndef USE_ASSERT_CHECKING #define Assert(condition) #define AssertMacro(condition) (void)true #define AssertArg(condition) #define AssertState(condition) #define assert_enabled 0 #else #define Assert(condition) \ Trap(!(condition), FailedAssertion) #define AssertMacro(condition) \ (void)TrapMacro(!(condition), FailedAssertion) #define AssertArg(condition) \ Trap(!(condition), BadArg) #define AssertState(condition) \ Trap(!(condition), BadState) extern int assert_enabled; #endif /* USE_ASSERT_CHECKING */ /* * LogTrap -- * Generates an exception with a message if the given condition is true. * */ #define LogTrap(condition, exception, printArgs) \ { if ((assert_enabled) && (condition)) \ ExceptionalCondition(CppAsString(condition), &(exception), \ form printArgs, __FILE__, __LINE__); } /* * LogTrapMacro is the same as LogTrap but it's intended for use in macros: * * #define foo(x) (LogAssertMacro(x != 0, "yow!") && bar(x)) */ #define LogTrapMacro(condition, exception, printArgs) \ ((bool) ((! assert_enabled) || (! condition) || \ (ExceptionalCondition(CppAsString(condition), \ &(exception), \ form printArgs, __FILE__, __LINE__)))) #ifndef USE_ASSERT_CHECKING #define LogAssert(condition, printArgs) #define LogAssertMacro(condition, printArgs) true #define LogAssertArg(condition, printArgs) #define LogAssertState(condition, printArgs) #else #define LogAssert(condition, printArgs) \ LogTrap(!(condition), FailedAssertion, printArgs) #define LogAssertMacro(condition, printArgs) \ LogTrapMacro(!(condition), FailedAssertion, printArgs) #define LogAssertArg(condition, printArgs) \ LogTrap(!(condition), BadArg, printArgs) #define LogAssertState(condition, printArgs) \ LogTrap(!(condition), BadState, printArgs) extern int assertEnable(int val); #ifdef ASSERT_CHECKING_TEST extern int assertTest(int val); #endif #endif /* USE_ASSERT_CHECKING */ /* ---------------------------------------------------------------- * Section 8: Min, Max, Abs macros * ---------------------------------------------------------------- */ /* * Max -- * Return the maximum of two numbers. */ #define Max(x, y) ((x) > (y) ? (x) : (y)) /* * Min -- * Return the minimum of two numbers. */ #define Min(x, y) ((x) < (y) ? (x) : (y)) /* * Abs -- * Return the absolute value of the argument. */ #define Abs(x) ((x) >= 0 ? (x) : -(x)) /* * StrNCpy -- * Does string copy, and forces terminating NULL */ /* we do this so if the macro is used in an if action, it will work */ #define StrNCpy(dst,src,len) \ ( \ ((len) > 0) ? \ ( \ strncpy((dst),(src),(len)-1), \ *((dst)+(len)-1)='\0' \ ) \ : \ (dummyret)NULL,(void)(dst) \ ) /* Get a bit mask of the bits set in non-int32 aligned addresses */ #define INT_ALIGN_MASK (sizeof(int32) - 1) /* * This function gets call too often, so we inline it if we can. * Are we aligned for int32? * We have to cast the pointer to int so we can do the AND * We got the 64 number by testing this against the stock memset() on * BSD/OS 3.0. Larger values were slower. */ #define MemSet(start, val, len) do \ { \ if (((long)(start) & INT_ALIGN_MASK) == 0 && \ ((len) & INT_ALIGN_MASK) == 0 && \ (val) == 0 && \ (len) <= 64) \ { \ int32 *_i = (int32 *)(start); \ int32 *_stop = (int32 *)((char *)(start) + (len)); \ \ while (_i < _stop) \ *_i++ = 0; \ } \ else \ memset((start), (val), (len)); \ } while (0) /* ---------------------------------------------------------------- * Section 9: externs * ---------------------------------------------------------------- */ extern Exception FailedAssertion; extern Exception BadArg; extern Exception BadState; /* in utils/error/assert.c */ extern int ExceptionalCondition(char *conditionName, Exception *exceptionP, char *details, char *fileName, int lineNumber); /* ---------------- * form is used by assert and the exception handling stuff * ---------------- */ extern char *form(const char *fmt,...); /* ---------------------------------------------------------------- * Section 10: berkeley-specific configuration * * this section contains settings which are only relevant to the UC Berkeley * sites. Other sites can ignore this * ---------------------------------------------------------------- */ /* ---------------- * storage managers * * These are experimental and are not supported in the code that * we distribute to other sites. * ---------------- */ #ifdef NOT_USED #define STABLE_MEMORY_STORAGE #endif /* ---------------------------------------------------------------- * Section 11: system-specific hacks * * This should be limited to things that absolutely have to be * included in every source file. The changes should be factored * into a separate file so that changes to one port don't require * changes to c.h (and everyone recompiling their whole system). * ---------------------------------------------------------------- */ #ifdef FIXADE #if defined(hpux) #include "port/hpux/fixade.h" /* for unaligned access fixup */ #endif /* hpux */ #endif #if defined(sun) && defined(sparc) && !defined(__SVR4) #define memmove(d, s, l) bcopy(s, d, l) #include #endif /* These are for things that are one way on Unix and another on NT */ #define NULL_DEV "/dev/null" #define COPY_CMD "cp" #define SEP_CHAR '/' /* ---------------- * end of c.h * ---------------- */ #endif /* C_H */