1 /*-------------------------------------------------------------------------
4 * Fundamental C definitions. This is included by every .c file in
5 * PostgreSQL (via either postgres.h or postgres_fe.h, as appropriate).
7 * Note that the definitions here are not intended to be exposed to clients of
8 * the frontend interface libraries --- so we don't worry much about polluting
9 * the namespace with lots of stuff...
12 * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
13 * Portions Copyright (c) 1994, Regents of the University of California
15 * $Id: c.h,v 1.114 2002/01/22 19:02:39 tgl Exp $
17 *-------------------------------------------------------------------------
20 *----------------------------------------------------------------
23 * When adding stuff to this file, please try to put stuff
24 * into the relevant section, or add new sections as appropriate.
27 * ------- ------------------------------------------------
28 * 0) pg_config.h and standard system headers
29 * 1) hacks to cope with non-ANSI C compilers
30 * 2) bool, true, false, TRUE, FALSE, NULL
31 * 3) standard system types
32 * 4) IsValid macros for system types
33 * 5) offsetof, lengthof, endof, alignment
34 * 6) widely useful macros
36 * 8) system-specific hacks
38 * NOTE: since this file is included by both frontend and backend modules, it's
39 * almost certainly wrong to put an "extern" declaration here. typedefs and macros
40 * are the kind of thing that might go here.
42 *----------------------------------------------------------------
47 /* We have to include stdlib.h here because it defines many of these macros
48 on some platforms, and we only want our definitions used if stdlib.h doesn't
49 have its own. The same goes for stddef and stdarg if present.
52 #include "pg_config.h"
53 #include "postgres_ext.h"
60 #ifdef STRING_H_WITH_STRINGS_H
66 #include <sys/fcntl.h> /* ensure O_BINARY is available */
68 #ifdef HAVE_SUPPORTDEFS_H
69 #include <SupportDefs.h>
72 /* Must be before gettext() games below */
78 #define gettext(x) (x)
80 #define gettext_noop(x) (x)
83 /* ----------------------------------------------------------------
84 * Section 1: hacks to cope with non-ANSI C compilers
86 * type prefixes (const, signed, volatile, inline) are handled in pg_config.h.
87 * ----------------------------------------------------------------
92 * Convert the argument to a string, using the C preprocessor.
94 * Concatenate two arguments together, using the C preprocessor.
96 * Note: the standard Autoconf macro AC_C_STRINGIZE actually only checks
97 * whether #identifier works, but if we have that we likely have ## too.
99 #if defined(HAVE_STRINGIZE)
101 #define CppAsString(identifier) #identifier
102 #define CppConcat(x, y) x##y
104 #else /* !HAVE_STRINGIZE */
106 #define CppAsString(identifier) "identifier"
109 * CppIdentity -- On Reiser based cpp's this is used to concatenate
110 * two tokens. That is
111 * CppIdentity(A)B ==> AB
112 * We renamed it to _private_CppIdentity because it should not
113 * be referenced outside this file. On other cpp's it
116 #define _priv_CppIdentity(x)x
117 #define CppConcat(x, y) _priv_CppIdentity(x)y
118 #endif /* !HAVE_STRINGIZE */
121 * dummyret is used to set return values in macros that use ?: to make
122 * assignments. gcc wants these to be void, other compilers like char
124 #ifdef __GNUC__ /* GNU cc */
125 #define dummyret void
127 #define dummyret char
131 #define __attribute__(_arg_)
134 /* ----------------------------------------------------------------
135 * Section 2: bool, true, false, TRUE, FALSE, NULL
136 * ----------------------------------------------------------------
141 * Boolean value, either true or false.
143 * XXX for C++ compilers, we assume the compiler has a compatible
144 * built-in definition of bool.
147 /* BeOS defines bool already, but the compiler chokes on the
148 * #ifndef unless we wrap it in this check.
150 /* Also defined in interfaces/odbc/md5.h */
160 #define true ((bool) 1)
164 #define false ((bool) 0)
167 #endif /* __BEOS__ */
169 typedef bool *BoolPtr;
184 #define NULL ((void *) 0)
188 /* ----------------------------------------------------------------
189 * Section 3: standard system types
190 * ----------------------------------------------------------------
195 * Variable holding address of any memory resident object.
197 * XXX Pointer arithmetic is done with this, so it can't be void *
198 * under "true" ANSI compilers.
200 typedef char *Pointer;
204 * Signed integer, EXACTLY N BITS IN SIZE,
205 * used for numerical computations and the
206 * frontend/backend protocol.
209 typedef signed char int8; /* == 8 bits */
210 typedef signed short int16; /* == 16 bits */
211 typedef signed int int32; /* == 32 bits */
212 #endif /* not HAVE_INT8 */
216 * Unsigned integer, EXACTLY N BITS IN SIZE,
217 * used for numerical computations and the
218 * frontend/backend protocol.
220 /* Also defined in interfaces/odbc/md5.h */
222 typedef unsigned char uint8; /* == 8 bits */
223 typedef unsigned short uint16; /* == 16 bits */
224 typedef unsigned int uint32; /* == 32 bits */
225 #endif /* not HAVE_UINT8 */
229 * Boolean value, AT LEAST N BITS IN SIZE.
231 typedef uint8 bool8; /* >= 8 bits */
232 typedef uint16 bool16; /* >= 16 bits */
233 typedef uint32 bool32; /* >= 32 bits */
237 * Unit of bitwise operation, AT LEAST N BITS IN SIZE.
239 typedef uint8 bits8; /* >= 8 bits */
240 typedef uint16 bits16; /* >= 16 bits */
241 typedef uint32 bits32; /* >= 32 bits */
245 * Unit of storage, AT LEAST N BITS IN SIZE,
246 * used to fetch/store data.
248 typedef uint8 word8; /* >= 8 bits */
249 typedef uint16 word16; /* >= 16 bits */
250 typedef uint32 word32; /* >= 32 bits */
254 * Floating point number, AT LEAST N BITS IN SIZE,
255 * used for numerical computations.
257 * Since sizeof(floatN) may be > sizeof(char *), always pass
258 * floatN by reference.
260 * XXX: these typedefs are now deprecated in favor of float4 and float8.
261 * They will eventually go away.
263 typedef float float32data;
264 typedef double float64data;
265 typedef float *float32;
266 typedef double *float64;
271 #ifdef HAVE_LONG_INT_64
272 /* Plain "long int" fits, use it */
275 typedef long int int64;
278 typedef unsigned long int uint64;
281 #elif defined(HAVE_LONG_LONG_INT_64)
282 /* We have working support for "long long int", use that */
285 typedef long long int int64;
288 typedef unsigned long long int uint64;
291 #else /* not HAVE_LONG_INT_64 and not HAVE_LONG_LONG_INT_64 */
293 /* Won't actually work, but fall back to long int so that code compiles */
295 typedef long int int64;
298 typedef unsigned long int uint64;
301 #define INT64_IS_BUSTED
303 #endif /* not HAVE_LONG_INT_64 and not HAVE_LONG_LONG_INT_64 */
305 /* sig_atomic_t is required by ANSI C, but may be missing on old platforms */
306 #ifndef HAVE_SIG_ATOMIC_T
307 typedef int sig_atomic_t;
312 * Size of any memory resident object, as returned by sizeof.
318 * Index into any memory resident array.
321 * Indices are non negative.
323 typedef unsigned int Index;
327 * Offset into any memory resident array.
330 * This differs from an Index in that an Index is always
331 * non negative, whereas Offset may be negative.
333 typedef signed int Offset;
336 * Common Postgres datatype names (as used in the catalogs)
340 typedef float float4;
341 typedef double float8;
344 * Oid, RegProcedure, TransactionId, CommandId
347 /* typedef Oid is in postgres_ext.h */
349 /* unfortunately, both regproc and RegProcedure are used */
351 typedef Oid RegProcedure;
353 typedef uint32 TransactionId;
355 typedef uint32 CommandId;
357 #define FirstCommandId ((CommandId) 0)
360 * Array indexing support
369 * Variable-length datatypes all share the 'struct varlena' header.
371 * NOTE: for TOASTable types, this is an oversimplification, since the value may be
372 * compressed or moved out-of-line. However datatype-specific routines are mostly
373 * content to deal with de-TOASTed values only, and of course client-side routines
374 * should never see a TOASTed value. See postgres.h for details of the TOASTed form.
383 #define VARHDRSZ ((int32) sizeof(int32))
386 * These widely-used datatypes are just a varlena header and the data bytes.
387 * There is no terminating null or anything like that --- the data length is
388 * always VARSIZE(ptr) - VARHDRSZ.
390 typedef struct varlena bytea;
391 typedef struct varlena text;
392 typedef struct varlena BpChar; /* blank-padded char, ie SQL char(n) */
393 typedef struct varlena VarChar; /* var-length char, ie SQL varchar(n) */
396 * Fixed-length array types (these are not varlena's!)
399 typedef int2 int2vector[INDEX_MAX_KEYS];
400 typedef Oid oidvector[INDEX_MAX_KEYS];
403 * We want NameData to have length NAMEDATALEN and int alignment,
404 * because that's how the data type 'name' is defined in pg_type.
405 * Use a union to make sure the compiler agrees.
407 typedef union nameData
409 char data[NAMEDATALEN];
412 typedef NameData *Name;
414 #define NameStr(name) ((name).data)
417 /* ----------------------------------------------------------------
418 * Section 4: IsValid macros for system types
419 * ----------------------------------------------------------------
423 * True iff bool is valid.
425 #define BoolIsValid(boolean) ((boolean) == false || (boolean) == true)
429 * True iff pointer is valid.
431 #define PointerIsValid(pointer) ((void*)(pointer) != NULL)
435 * True iff pointer is properly aligned to point to the given type.
437 #define PointerIsAligned(pointer, type) \
438 (((long)(pointer) % (sizeof (type))) == 0)
440 #define OidIsValid(objectId) ((bool) ((objectId) != InvalidOid))
442 #define RegProcedureIsValid(p) OidIsValid(p)
445 /* ----------------------------------------------------------------
446 * Section 5: offsetof, lengthof, endof, alignment
447 * ----------------------------------------------------------------
451 * Offset of a structure/union field within that structure/union.
453 * XXX This is supposed to be part of stddef.h, but isn't on
454 * some systems (like SunOS 4).
457 #define offsetof(type, field) ((long) &((type *)0)->field)
458 #endif /* offsetof */
462 * Number of elements in an array.
464 #define lengthof(array) (sizeof (array) / sizeof ((array)[0]))
468 * Address of the element one past the last in an array.
470 #define endof(array) (&array[lengthof(array)])
473 * Alignment macros: align a length or address appropriately for a given type.
475 * There used to be some incredibly crufty platform-dependent hackery here,
476 * but now we rely on the configure script to get the info for us. Much nicer.
478 * NOTE: TYPEALIGN will not work if ALIGNVAL is not a power of 2.
479 * That case seems extremely unlikely to occur in practice, however.
483 #define TYPEALIGN(ALIGNVAL,LEN) (((long)(LEN) + (ALIGNVAL-1)) & ~(ALIGNVAL-1))
485 #define SHORTALIGN(LEN) TYPEALIGN(ALIGNOF_SHORT, (LEN))
486 #define INTALIGN(LEN) TYPEALIGN(ALIGNOF_INT, (LEN))
487 #define LONGALIGN(LEN) TYPEALIGN(ALIGNOF_LONG, (LEN))
488 #define DOUBLEALIGN(LEN) TYPEALIGN(ALIGNOF_DOUBLE, (LEN))
489 #define MAXALIGN(LEN) TYPEALIGN(MAXIMUM_ALIGNOF, (LEN))
492 /* ----------------------------------------------------------------
493 * Section 6: widely useful macros
494 * ----------------------------------------------------------------
498 * Return the maximum of two numbers.
500 #define Max(x, y) ((x) > (y) ? (x) : (y))
504 * Return the minimum of two numbers.
506 #define Min(x, y) ((x) < (y) ? (x) : (y))
510 * Return the absolute value of the argument.
512 #define Abs(x) ((x) >= 0 ? (x) : -(x))
516 * Like standard library function strncpy(), except that result string
517 * is guaranteed to be null-terminated --- that is, at most N-1 bytes
518 * of the source string will be kept.
519 * Also, the macro returns no result (too hard to do that without
520 * evaluating the arguments multiple times, which seems worse).
522 * BTW: when you need to copy a non-null-terminated string (like a text
523 * datum) and add a null, do not do it with StrNCpy(..., len+1). That
524 * might seem to work, but it fetches one byte more than there is in the
525 * text object. One fine day you'll have a SIGSEGV because there isn't
526 * another byte before the end of memory. Don't laugh, we've had real
527 * live bug reports from real live users over exactly this mistake.
528 * Do it honestly with "memcpy(dst,src,len); dst[len] = '\0';", instead.
530 #define StrNCpy(dst,src,len) \
533 char * _dst = (dst); \
538 strncpy(_dst, (src), _len); \
539 _dst[_len-1] = '\0'; \
544 /* Get a bit mask of the bits set in non-int32 aligned addresses */
545 #define INT_ALIGN_MASK (sizeof(int32) - 1)
549 * Exactly the same as standard library function memset(), but considerably
550 * faster for zeroing small word-aligned structures (such as parsetree nodes).
551 * This has to be a macro because the main point is to avoid function-call
554 * We got the 64 number by testing this against the stock memset() on
555 * BSD/OS 3.0. Larger values were slower. bjm 1997/09/11
557 * I think the crossover point could be a good deal higher for
558 * most platforms, actually. tgl 2000-03-19
560 #define MemSet(start, val, len) \
563 int32 * _start = (int32 *) (start); \
567 if ((((long) _start) & INT_ALIGN_MASK) == 0 && \
568 (_len & INT_ALIGN_MASK) == 0 && \
570 _len <= MEMSET_LOOP_LIMIT) \
572 int32 * _stop = (int32 *) ((char *) _start + _len); \
573 while (_start < _stop) \
577 memset((char *) _start, _val, _len); \
580 #define MEMSET_LOOP_LIMIT 64
583 /* ----------------------------------------------------------------
584 * Section 7: random stuff
585 * ----------------------------------------------------------------
589 #define CSIGNBIT (0x80)
591 #define STATUS_OK (0)
592 #define STATUS_ERROR (-1)
593 #define STATUS_EOF (-2)
594 #define STATUS_FOUND (1)
597 /* ----------------------------------------------------------------
598 * Section 8: system-specific hacks
600 * This should be limited to things that absolutely have to be
601 * included in every source file. The port-specific header file
602 * is usually a better place for this sort of thing.
603 * ----------------------------------------------------------------
607 #define PG_BINARY O_BINARY
608 #define PG_BINARY_R "rb"
609 #define PG_BINARY_W "wb"
612 #define PG_BINARY_R "r"
613 #define PG_BINARY_W "w"
616 #if defined(sun) && defined(__sparc__) && !defined(__SVR4)
620 /* These are for things that are one way on Unix and another on NT */
621 #define NULL_DEV "/dev/null"
624 * Provide prototypes for routines not present in a particular machine's
625 * standard C library. It'd be better to put these in pg_config.h, but
626 * in pg_config.h we haven't yet included anything that defines size_t...
629 #ifndef HAVE_SNPRINTF_DECL
631 snprintf(char *str, size_t count, const char *fmt,...)
632 /* This extension allows gcc to check the format string */
633 __attribute__((format(printf, 3, 4)));
636 #ifndef HAVE_VSNPRINTF_DECL
637 extern int vsnprintf(char *str, size_t count, const char *fmt, va_list args);
640 #if !defined(HAVE_MEMMOVE) && !defined(memmove)
641 #define memmove(d, s, c) bcopy(s, d, c)