13#define Max(x, y) ((x) > (y) ? (x) : (y))
14#define Min(x, y) ((x) < (y) ? (x) : (y))
16#define init_var(v) memset(v,0,sizeof(numeric))
18#define digitbuf_alloc(size) ((NumericDigit *) pgtypes_alloc(size))
19#define digitbuf_free(buf) free(buf)
87 if (!
isspace((
unsigned char) *(*ptr)))
100 if (!
isspace((
unsigned char) *(*ptr)))
136 if (!
isdigit((
unsigned char) *(*ptr)))
144 if (
isdigit((
unsigned char) *(*ptr)))
146 dest->digits[
i++] = *(*ptr)++ -
'0';
152 else if (*(*ptr) ==
'.')
168 if (*(*ptr) ==
'e' || *(*ptr) ==
'E')
174 exponent =
strtol(*ptr, &endptr, 10);
175 if (endptr == (*ptr))
186 dest->weight += (
int) exponent;
187 dest->dscale -= (
int) exponent;
188 if (dest->dscale < 0)
195 if (!
isspace((
unsigned char) *(*ptr)))
204 while (dest->ndigits > 0 && *(dest->digits) == 0)
210 if (dest->ndigits == 0)
213 dest->rscale = dest->dscale;
417 if (
var1->digits[i1++] != 0)
423 if (
var2->digits[i2++] != 0)
444 if (
var1->digits[i1++] != 0)
449 if (
var2->digits[i2++] != 0)
923 for (i1 =
var1->ndigits - 1; i1 >= 0; i1--)
928 for (i2 =
var2->ndigits - 1; i2 >= 0; i2--)
1009 for (
i = 0;
i <
var1->ndigits;
i++)
1021 for (
i = 0;
i <
var2->ndigits;
i++)
1100 if (
var1->ndigits == 0)
1111 for (
int i = 1;
i < 10;
i++)
1191 for (
i =
divisor[1].ndigits - 1;
i >= 0;
i--)
1270 for (
int i = 1;
i < 10;
i++)
1312 signed long int long_int = int_val;
1470 if (*endptr !=
'\0')
1503#if SIZEOF_LONG > SIZEOF_INT
static void sub_abs(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
static void add_abs(const NumericVar *var1, const NumericVar *var2, NumericVar *result)
static void zero_var(NumericVar *var)
static char * get_str_from_var(const NumericVar *var)
static bool set_var_from_str(const char *str, const char *cp, NumericVar *dest, const char **endptr, Node *escontext)
static int select_div_scale(const NumericVar *var1, const NumericVar *var2)
static int cmp_abs(const NumericVar *var1, const NumericVar *var2)
static void alloc_var(NumericVar *var, int ndigits)
void err(int eval, const char *fmt,...)
char * pgtypes_alloc(long size)
int PGTYPESnumeric_from_double(double d, numeric *dst)
#define digitbuf_free(buf)
int PGTYPESnumeric_copy(numeric *src, numeric *dst)
#define digitbuf_alloc(size)
int PGTYPESnumeric_from_decimal(decimal *src, numeric *dst)
numeric * PGTYPESnumeric_new(void)
int PGTYPESnumeric_to_decimal(numeric *src, decimal *dst)
char * PGTYPESnumeric_to_asc(numeric *num, int dscale)
void PGTYPESdecimal_free(decimal *var)
int PGTYPESnumeric_mul(numeric *var1, numeric *var2, numeric *result)
int PGTYPESnumeric_to_long(numeric *nv, long *lp)
static int numericvar_to_double(numeric *var, double *dp)
int PGTYPESnumeric_to_double(numeric *nv, double *dp)
int PGTYPESnumeric_from_long(signed long int long_val, numeric *var)
int PGTYPESnumeric_to_int(numeric *nv, int *ip)
int PGTYPESnumeric_from_int(signed int int_val, numeric *var)
int PGTYPESnumeric_sub(numeric *var1, numeric *var2, numeric *result)
decimal * PGTYPESdecimal_new(void)
void PGTYPESnumeric_free(numeric *var)
int PGTYPESnumeric_cmp(numeric *var1, numeric *var2)
int PGTYPESnumeric_div(numeric *var1, numeric *var2, numeric *result)
int PGTYPESnumeric_add(numeric *var1, numeric *var2, numeric *result)
numeric * PGTYPESnumeric_from_asc(char *str, char **endptr)
#define NUMERIC_MAX_DISPLAY_SCALE
#define NUMERIC_MIN_SIG_DIGITS
#define NUMERIC_MIN_DISPLAY_SCALE
static char buf[DEFAULT_XLOG_SEG_SIZE]
#define PGTYPES_NUM_BAD_NUMERIC
#define PGTYPES_NUM_OVERFLOW
#define PGTYPES_NUM_UNDERFLOW
#define PGTYPES_NUM_DIVIDE_ZERO
int pg_strncasecmp(const char *s1, const char *s2, size_t n)
NumericDigit digits[DECSIZE]