⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 c.h

📁 从一个开源软件中摘取的正则表达式模块
💻 H
📖 第 1 页 / 共 2 页
字号:
{	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 + -