📄 c.h
字号:
{ char vl_len_[4]; /* Do not touch this field directly! */ char vl_dat[1];};#define VARHDRSZ ((int32) sizeof(int32))/* * These widely-used datatypes are just a varlena header and the data bytes. * There is no terminating null or anything like that --- the data length is * always VARSIZE(ptr) - VARHDRSZ. */typedef struct varlena bytea;typedef struct varlena text;typedef struct varlena BpChar; /* blank-padded char, ie SQL char(n) */typedef struct varlena VarChar; /* var-length char, ie SQL varchar(n) *//* * Specialized array types. These are physically laid out just the same * as regular arrays (so that the regular array subscripting code works * with them). They exist as distinct types mostly for historical reasons: * they have nonstandard I/O behavior which we don't want to change for fear * of breaking applications that look at the system catalogs. There is also * an implementation issue for oidvector: it's part of the primary key for * pg_proc, and we can't use the normal btree array support routines for that * without circularity. *//* * We want NameData to have length NAMEDATALEN and int alignment, * because that's how the data type 'name' is defined in pg_type. * Use a union to make sure the compiler agrees. Note that NAMEDATALEN * must be a multiple of sizeof(int), else sizeof(NameData) will probably * not come out equal to NAMEDATALEN. *//*typedef union nameData{ char data[NAMEDATALEN]; int alignmentDummy;} NameData;typedef NameData *Name;#define NameStr(name) ((name).data)*//* * Support macros for escaping strings. escape_backslash should be TRUE * if generating a non-standard-conforming string. Prefixing a string * with ESCAPE_STRING_SYNTAX guarantees it is non-standard-conforming. * Beware of multiple evaluation of the "ch" argument! */#define SQL_STR_DOUBLE(ch, escape_backslash) \ ((ch) == '\'' || ((ch) == '\\' && (escape_backslash)))#define ESCAPE_STRING_SYNTAX 'E'/* ---------------------------------------------------------------- * Section 4: 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) ((void*)(pointer) != NULL)/* * PointerIsAligned * True iff pointer is properly aligned to point to the given type. */#define PointerIsAligned(pointer, type) \ (((long)(pointer) % (sizeof (type))) == 0)#define OidIsValid(objectId) ((bool) ((objectId) != InvalidOid))#define RegProcedureIsValid(p) OidIsValid(p)/* ---------------------------------------------------------------- * Section 5: offsetof, lengthof, endof, alignment * ---------------------------------------------------------------- *//* * 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)])/* ---------------- * Alignment macros: align a length or address appropriately for a given type. * The fooALIGN() macros round up to a multiple of the required alignment, * while the fooALIGN_DOWN() macros round down. The latter are more useful * for problems like "how many X-sized structures will fit in a page?". * * NOTE: TYPEALIGN[_DOWN] will not work if ALIGNVAL is not a power of 2. * That case seems extremely unlikely to be needed in practice, however. * ---------------- */#define TYPEALIGN(ALIGNVAL,LEN) \ (((long) (LEN) + ((ALIGNVAL) - 1)) & ~((long) ((ALIGNVAL) - 1)))#define SHORTALIGN(LEN) TYPEALIGN(ALIGNOF_SHORT, (LEN))#define INTALIGN(LEN) TYPEALIGN(ALIGNOF_INT, (LEN))#define LONGALIGN(LEN) TYPEALIGN(ALIGNOF_LONG, (LEN))#define DOUBLEALIGN(LEN) TYPEALIGN(ALIGNOF_DOUBLE, (LEN))#define MAXALIGN(LEN) TYPEALIGN(MAXIMUM_ALIGNOF, (LEN))/* MAXALIGN covers only built-in types, not buffers */#define BUFFERALIGN(LEN) TYPEALIGN(ALIGNOF_BUFFER, (LEN))#define TYPEALIGN_DOWN(ALIGNVAL,LEN) \ (((long) (LEN)) & ~((long) ((ALIGNVAL) - 1)))#define SHORTALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_SHORT, (LEN))#define INTALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_INT, (LEN))#define LONGALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_LONG, (LEN))#define DOUBLEALIGN_DOWN(LEN) TYPEALIGN_DOWN(ALIGNOF_DOUBLE, (LEN))#define MAXALIGN_DOWN(LEN) TYPEALIGN_DOWN(MAXIMUM_ALIGNOF, (LEN))/* ---------------------------------------------------------------- * Section 6: widely useful 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 * Like standard library function strncpy(), except that result string * is guaranteed to be null-terminated --- that is, at most N-1 bytes * of the source string will be kept. * Also, the macro returns no result (too hard to do that without * evaluating the arguments multiple times, which seems worse). * * BTW: when you need to copy a non-null-terminated string (like a text * datum) and add a null, do not do it with StrNCpy(..., len+1). That * might seem to work, but it fetches one byte more than there is in the * text object. One fine day you'll have a SIGSEGV because there isn't * another byte before the end of memory. Don't laugh, we've had real * live bug reports from real live users over exactly this mistake. * Do it honestly with "memcpy(dst,src,len); dst[len] = '\0';", instead. */#define StrNCpy(dst,src,len) \ do \ { \ char * _dst = (dst); \ Size _len = (len); \\ if (_len > 0) \ { \ strncpy(_dst, (src), _len); \ _dst[_len-1] = '\0'; \ } \ } while (0)/* Get a bit mask of the bits set in non-long aligned addresses */#define LONG_ALIGN_MASK (sizeof(long) - 1)/* * MemSet * Exactly the same as standard library function memset(), but considerably * faster for zeroing small word-aligned structures (such as parsetree nodes). * This has to be a macro because the main point is to avoid function-call * overhead. However, we have also found that the loop is faster than * native libc memset() on some platforms, even those with assembler * memset() functions. More research needs to be done, perhaps with * MEMSET_LOOP_LIMIT tests in configure. */#define MemSet(start, val, len) \ do \ { \ /* must be void* because we don't know if it is integer aligned yet */ \ void *_vstart = (void *) (start); \ int _val = (val); \ Size _len = (len); \\ if ((((long) _vstart) & LONG_ALIGN_MASK) == 0 && \ (_len & LONG_ALIGN_MASK) == 0 && \ _val == 0 && \ _len <= MEMSET_LOOP_LIMIT && \ /* \ * If MEMSET_LOOP_LIMIT == 0, optimizer should find \ * the whole "if" false at compile time. \ */ \ MEMSET_LOOP_LIMIT != 0) \ { \ long *_start = (long *) _vstart; \ long *_stop = (long *) ((char *) _start + _len); \ while (_start < _stop) \ *_start++ = 0; \ } \ else \ memset(_vstart, _val, _len); \ } while (0)/* * MemSetAligned is the same as MemSet except it omits the test to see if * "start" is word-aligned. This is okay to use if the caller knows a-priori * that the pointer is suitably aligned (typically, because he just got it * from palloc(), which always delivers a max-aligned pointer). */#define MemSetAligned(start, val, len) \ do \ { \ long *_start = (long *) (start); \ int _val = (val); \ Size _len = (len); \\ if ((_len & LONG_ALIGN_MASK) == 0 && \ _val == 0 && \ _len <= MEMSET_LOOP_LIMIT && \ MEMSET_LOOP_LIMIT != 0) \ { \ long *_stop = (long *) ((char *) _start + _len); \ while (_start < _stop) \ *_start++ = 0; \ } \ else \ memset(_start, _val, _len); \ } while (0)/* * MemSetTest/MemSetLoop are a variant version that allow all the tests in * MemSet to be done at compile time in cases where "val" and "len" are * constants *and* we know the "start" pointer must be word-aligned. * If MemSetTest succeeds, then it is okay to use MemSetLoop, otherwise use * MemSetAligned. Beware of multiple evaluations of the arguments when using * this approach. */#define MemSetTest(val, len) \ ( ((len) & LONG_ALIGN_MASK) == 0 && \ (len) <= MEMSET_LOOP_LIMIT && \ MEMSET_LOOP_LIMIT != 0 && \ (val) == 0 )#define MemSetLoop(start, val, len) \ do \ { \ long * _start = (long *) (start); \ long * _stop = (long *) ((char *) _start + (Size) (len)); \ \ while (_start < _stop) \ *_start++ = 0; \ } while (0)/* ---------------------------------------------------------------- * Section 7: random stuff * ---------------------------------------------------------------- *//* msb for char */#define HIGHBIT (0x80)#define IS_HIGHBIT_SET(ch) ((unsigned char)(ch) & HIGHBIT)#define STATUS_OK (0)#define STATUS_ERROR (-1)#define STATUS_EOF (-2)#define STATUS_FOUND (1)#define STATUS_WAITING (2)/* ---------------------------------------------------------------- * Section 8: system-specific hacks * * This should be limited to things that absolutely have to be * included in every source file. The port-specific header file * is usually a better place for this sort of thing. * ---------------------------------------------------------------- *//* * NOTE: this is also used for opening text files. * WIN32 treats Control-Z as EOF in files opened in text mode. * Therefore, we open files in binary mode on Win32 so we can read * literal control-Z. The other affect is that we see CRLF, but * that is OK because we can already handle those cleanly. */#if defined(WIN32) || defined(__CYGWIN__)#define PG_BINARY O_BINARY#define PG_BINARY_A "ab"#define PG_BINARY_R "rb"#define PG_BINARY_W "wb"#else#define PG_BINARY 0#define PG_BINARY_A "a"#define PG_BINARY_R "r"#define PG_BINARY_W "w"#endif#if defined(sun) && defined(__sparc__) && !defined(__SVR4)#include <unistd.h>#endif/* These are for things that are one way on Unix and another on NT */#define NULL_DEV "/dev/null"/* * Provide prototypes for routines not present in a particular machine's * standard C library. */#if !HAVE_DECL_SNPRINTFextern intsnprintf(char *str, size_t count, const char *fmt,...)/* This extension allows gcc to check the format string */__attribute__((format(printf, 3, 4)));#endif#if !HAVE_DECL_VSNPRINTFextern int vsnprintf(char *str, size_t count, const char *fmt, va_list args);#endif#if !defined(HAVE_MEMMOVE) && !defined(memmove)#define memmove(d, s, c) bcopy(s, d, c)#endif#ifndef PGDLLIMPORT#define PGDLLIMPORT /* no special DLL markers on most ports */#endif/* * The following is used as the arg list for signal handlers. Any ports * that take something other than an int argument should override this in * their pg_config_os.h file. Note that variable names are required * because it is used in both the prototypes as well as the definitions. * Note also the long name. We expect that this won't collide with * other names causing compiler warnings. */#ifndef SIGNAL_ARGS#define SIGNAL_ARGS int postgres_signal_arg#endif/* * When there is no sigsetjmp, its functionality is provided by plain * setjmp. Incidentally, nothing provides setjmp's functionality in * that case. */#ifndef HAVE_SIGSETJMP#define sigjmp_buf jmp_buf#define sigsetjmp(x,y) setjmp(x)#define siglongjmp longjmp#endif#if defined(HAVE_FDATASYNC) && !HAVE_DECL_FDATASYNCextern int fdatasync(int fildes);#endif/* If strtoq() exists, rename it to the more standard strtoll() */#if defined(HAVE_LONG_LONG_INT_64) && !defined(HAVE_STRTOLL) && defined(HAVE_STRTOQ)#define strtoll strtoq#define HAVE_STRTOLL 1#endif/* If strtouq() exists, rename it to the more standard strtoull() */#if defined(HAVE_LONG_LONG_INT_64) && !defined(HAVE_STRTOULL) && defined(HAVE_STRTOUQ)#define strtoull strtouq#define HAVE_STRTOULL 1#endif/* EXEC_BACKEND defines */#ifdef EXEC_BACKEND#define NON_EXEC_STATIC#else#define NON_EXEC_STATIC static#endif/* /port compatibility functions *//*#include "port.h"*/#endif /* C_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -