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

📄 int8.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
字号:
/*------------------------------------------------------------------------- * * int8.c *	  Internal 64-bit integer operations * *------------------------------------------------------------------------- */#include <ctype.h>#include <time.h>#include <math.h>#include <float.h>#include "postgres.h"#ifdef HAVE_LIMITS_H#include <limits.h>#endif#include "utils/int8.h"#define MAXINT8LEN		25#ifndef INT_MAX#define INT_MAX (0x7FFFFFFFL)#endif#ifndef INT_MIN#define INT_MIN (-INT_MAX-1)#endif#ifndef SHRT_MAX#define SHRT_MAX (0x7FFF)#endif#ifndef SHRT_MIN#define SHRT_MIN (-SHRT_MAX-1)#endif/*********************************************************************** ** **		Routines for 64-bit integers. ** ***********************************************************************//*---------------------------------------------------------- * Formatting and conversion routines. *---------------------------------------------------------*//* int8in() */int64 *int8in(char *str){	int64	   *result = palloc(sizeof(int64));	char	   *ptr = str;	int64		tmp = 0;	int			sign = 1;	if (!PointerIsValid(str))		elog(ERROR, "Bad (null) int8 external representation");	/*	 * Do our own scan, rather than relying on sscanf which might be	 * broken for long long.  NOTE: this will not detect int64 overflow...	 * but sscanf doesn't either...	 */	while (*ptr && isspace(*ptr))		/* skip leading spaces */		ptr++;	if (*ptr == '-')			/* handle sign */		sign = -1, ptr++;	else if (*ptr == '+')		ptr++;	if (!isdigit(*ptr))			/* require at least one digit */		elog(ERROR, "Bad int8 external representation '%s'", str);	while (*ptr && isdigit(*ptr))		/* process digits */		tmp = tmp * 10 + (*ptr++ - '0');	if (*ptr)					/* trailing junk? */		elog(ERROR, "Bad int8 external representation '%s'", str);	*result = (sign < 0) ? -tmp : tmp;	return result;}	/* int8in() *//* int8out() */char *int8out(int64 *val){	char	   *result;	int			len;	char		buf[MAXINT8LEN + 1];	if (!PointerIsValid(val))		return NULL;	if ((len = snprintf(buf, MAXINT8LEN, INT64_FORMAT, *val)) < 0)		elog(ERROR, "Unable to format int8");	result = palloc(len + 1);	strcpy(result, buf);	return result;}	/* int8out() *//*---------------------------------------------------------- *	Relational operators for int8s. *---------------------------------------------------------*//* int8relop() * Is val1 relop val2? */boolint8eq(int64 *val1, int64 *val2){	if (!val1 || !val2)		return 0;	return *val1 == *val2;}	/* int8eq() */boolint8ne(int64 *val1, int64 *val2){	if (!val1 || !val2)		return 0;	return *val1 != *val2;}	/* int8ne() */boolint8lt(int64 *val1, int64 *val2){	if (!val1 || !val2)		return 0;	return *val1 < *val2;}	/* int8lt() */boolint8gt(int64 *val1, int64 *val2){	if (!val1 || !val2)		return 0;	return *val1 > *val2;}	/* int8gt() */boolint8le(int64 *val1, int64 *val2){	if (!val1 || !val2)		return 0;	return *val1 <= *val2;}	/* int8le() */boolint8ge(int64 *val1, int64 *val2){	if (!val1 || !val2)		return 0;	return *val1 >= *val2;}	/* int8ge() *//* int84relop() * Is 64-bit val1 relop 32-bit val2? */boolint84eq(int64 *val1, int32 val2){	if (!val1)		return 0;	return *val1 == val2;}	/* int84eq() */boolint84ne(int64 *val1, int32 val2){	if (!val1)		return 0;	return *val1 != val2;}	/* int84ne() */boolint84lt(int64 *val1, int32 val2){	if (!val1)		return 0;	return *val1 < val2;}	/* int84lt() */boolint84gt(int64 *val1, int32 val2){	if (!val1)		return 0;	return *val1 > val2;}	/* int84gt() */boolint84le(int64 *val1, int32 val2){	if (!val1)		return 0;	return *val1 <= val2;}	/* int84le() */boolint84ge(int64 *val1, int32 val2){	if (!val1)		return 0;	return *val1 >= val2;}	/* int84ge() *//* int48relop() * Is 32-bit val1 relop 64-bit val2? */boolint48eq(int32 val1, int64 *val2){	if (!val2)		return 0;	return val1 == *val2;}	/* int48eq() */boolint48ne(int32 val1, int64 *val2){	if (!val2)		return 0;	return val1 != *val2;}	/* int48ne() */boolint48lt(int32 val1, int64 *val2){	if (!val2)		return 0;	return val1 < *val2;}	/* int48lt() */boolint48gt(int32 val1, int64 *val2){	if (!val2)		return 0;	return val1 > *val2;}	/* int48gt() */boolint48le(int32 val1, int64 *val2){	if (!val2)		return 0;	return val1 <= *val2;}	/* int48le() */boolint48ge(int32 val1, int64 *val2){	if (!val2)		return 0;	return val1 >= *val2;}	/* int48ge() *//*---------------------------------------------------------- *	Arithmetic operators on 64-bit integers. *---------------------------------------------------------*/int64 *int8um(int64 *val){	int64		temp = 0;	int64	   *result = palloc(sizeof(int64));	if (!PointerIsValid(val))		return NULL;	result = int8mi(&temp, val);	return result;}	/* int8um() */int64 *int8pl(int64 *val1, int64 *val2){	int64	   *result = palloc(sizeof(int64));	if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))		return NULL;	*result = *val1 + *val2;	return result;}	/* int8pl() */int64 *int8mi(int64 *val1, int64 *val2){	int64	   *result = palloc(sizeof(int64));	if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))		return NULL;	*result = *val1 - *val2;	return result;}	/* int8mi() */int64 *int8mul(int64 *val1, int64 *val2){	int64	   *result = palloc(sizeof(int64));	if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))		return NULL;	*result = *val1 * *val2;	return result;}	/* int8mul() */int64 *int8div(int64 *val1, int64 *val2){	int64	   *result = palloc(sizeof(int64));	if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))		return NULL;	*result = *val1 / *val2;	return result;}	/* int8div() */int64 *int8larger(int64 *val1, int64 *val2){	int64	   *result = palloc(sizeof(int64));	if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))		return NULL;	*result = ((*val1 > *val2) ? *val1 : *val2);	return result;}	/* int8larger() */int64 *int8smaller(int64 *val1, int64 *val2){	int64	   *result = palloc(sizeof(int64));	if ((!PointerIsValid(val1)) || (!PointerIsValid(val2)))		return NULL;	*result = ((*val1 < *val2) ? *val1 : *val2);	return result;}	/* int8smaller() */int64 *int84pl(int64 *val1, int32 val2){	int64	   *result = palloc(sizeof(int64));	if (!PointerIsValid(val1))		return NULL;	*result = *val1 + (int64) val2;	return result;}	/* int84pl() */int64 *int84mi(int64 *val1, int32 val2){	int64	   *result = palloc(sizeof(int64));	if (!PointerIsValid(val1))		return NULL;	*result = *val1 - (int64) val2;	return result;}	/* int84mi() */int64 *int84mul(int64 *val1, int32 val2){	int64	   *result = palloc(sizeof(int64));	if (!PointerIsValid(val1))		return NULL;	*result = *val1 * (int64) val2;	return result;}	/* int84mul() */int64 *int84div(int64 *val1, int32 val2){	int64	   *result = palloc(sizeof(int64));	if (!PointerIsValid(val1))		return NULL;	*result = *val1 / (int64) val2;	return result;}	/* int84div() */int64 *int48pl(int32 val1, int64 *val2){	int64	   *result = palloc(sizeof(int64));	if (!PointerIsValid(val2))		return NULL;	*result = (int64) val1 + *val2;	return result;}	/* int48pl() */int64 *int48mi(int32 val1, int64 *val2){	int64	   *result = palloc(sizeof(int64));	if (!PointerIsValid(val2))		return NULL;	*result = (int64) val1 - *val2;	return result;}	/* int48mi() */int64 *int48mul(int32 val1, int64 *val2){	int64	   *result = palloc(sizeof(int64));	if (!PointerIsValid(val2))		return NULL;	*result = (int64) val1 **val2;	return result;}	/* int48mul() */int64 *int48div(int32 val1, int64 *val2){	int64	   *result = palloc(sizeof(int64));	if (!PointerIsValid(val2))		return NULL;	*result = (int64) val1 / *val2;	return result;}	/* int48div() *//*---------------------------------------------------------- *	Conversion operators. *---------------------------------------------------------*/int64 *int48(int32 val){	int64	   *result = palloc(sizeof(int64));	*result = val;	return result;}	/* int48() */int32int84(int64 *val){	int32		result;	if (!PointerIsValid(val))		elog(ERROR, "Invalid (null) int64, can't convert int8 to int4");	if ((*val < INT_MIN) || (*val > INT_MAX))		elog(ERROR, "int8 conversion to int4 is out of range");	result = *val;	return result;}	/* int84() */#if NOT_USEDint64 *int28		(int16 val){	int64	   *result;	result = palloc(sizeof(int64));	*result = val;	return result;}	/* int28() */int16int82(int64 *val){	int16		result;	if (!PointerIsValid(val))		elog(ERROR, "Invalid (null) int8, can't convert to int2");	if ((*val < SHRT_MIN) || (*val > SHRT_MAX))		elog(ERROR, "int8 conversion to int2 is out of range");	result = *val;	return result;}	/* int82() */#endiffloat64i8tod(int64 *val){	float64		result = palloc(sizeof(float64data));	if (!PointerIsValid(val))		elog(ERROR, "Invalid (null) int8, can't convert to float8");	*result = *val;	return result;}	/* i8tod() *//* dtoi8() * Convert double float to 8-byte integer. * Do a range check before the conversion. * Note that the comparison probably isn't quite right *	since we only have ~52 bits of precision in a double float *	and so subtracting one from a large number gives the large *	number exactly. However, for some reason the comparison below *	does the right thing on my i686/linux-rh4.2 box. * - thomas 1998-06-16 */int64 *dtoi8(float64 val){	int64	   *result = palloc(sizeof(int64));	if (!PointerIsValid(val))		elog(ERROR, "Invalid (null) float8, can't convert to int8");	if ((*val < (-pow(2, 63) + 1)) || (*val > (pow(2, 63) - 1)))		elog(ERROR, "Floating point conversion to int64 is out of range");	*result = *val;	return result;}	/* dtoi8() *//* text_int8() */int64 *text_int8(text *str){	int			len;	char	   *s;	if (!PointerIsValid(str))		elog(ERROR, "Bad (null) int8 external representation");	len = (VARSIZE(str) - VARHDRSZ);	s = palloc(len + 1);	memmove(s, VARDATA(str), len);	*(s + len) = '\0';	return int8in(s);}	/* text_int8() *//* int8_text() */text *int8_text(int64 *val){	text	   *result;	int			len;	char	   *s;	if (!PointerIsValid(val))		return NULL;	s = int8out(val);	len = strlen(s);	result = palloc(VARHDRSZ + len);	VARSIZE(result) = len + VARHDRSZ;	memmove(VARDATA(result), s, len);	return result;}	/* int8out() */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -