diff options
Diffstat (limited to 'src/backend/utils/adt/numeric.c')
-rw-r--r-- | src/backend/utils/adt/numeric.c | 1046 |
1 files changed, 530 insertions, 516 deletions
diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index b1a86986ac0..e9e5a28c363 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -5,7 +5,7 @@ * * 1998 Jan Wieck * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.13 1999/05/10 18:17:44 wieck Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.14 1999/05/25 16:12:14 momjian Exp $ * * ---------- */ @@ -41,10 +41,10 @@ #define NUMERIC_MAX_FREEBUFS 20 #ifndef MIN -# define MIN(a,b) (((a)<(b)) ? (a) : (b)) +#define MIN(a,b) (((a)<(b)) ? (a) : (b)) #endif #ifndef MAX -# define MAX(a,b) (((a)>(b)) ? (a) : (b)) +#define MAX(a,b) (((a)>(b)) ? (a) : (b)) #endif #ifndef NAN @@ -56,52 +56,54 @@ * Local data types * ---------- */ -typedef unsigned char NumericDigit; +typedef unsigned char NumericDigit; -typedef struct NumericDigitBuf { - struct NumericDigitBuf *prev; - struct NumericDigitBuf *next; - int size; -} NumericDigitBuf; +typedef struct NumericDigitBuf +{ + struct NumericDigitBuf *prev; + struct NumericDigitBuf *next; + int size; +} NumericDigitBuf; -typedef struct NumericVar { - int ndigits; - int weight; - int rscale; - int dscale; - int sign; - NumericDigitBuf *buf; - NumericDigit *digits; -} NumericVar; +typedef struct NumericVar +{ + int ndigits; + int weight; + int rscale; + int dscale; + int sign; + NumericDigitBuf *buf; + NumericDigit *digits; +} NumericVar; /* ---------- * Local data * ---------- */ -static NumericDigitBuf *digitbuf_freelist = NULL; -static NumericDigitBuf *digitbuf_usedlist = NULL; -static int digitbuf_nfree = 0; -static int global_rscale = NUMERIC_MIN_RESULT_SCALE; +static NumericDigitBuf *digitbuf_freelist = NULL; +static NumericDigitBuf *digitbuf_usedlist = NULL; +static int digitbuf_nfree = 0; +static int global_rscale = NUMERIC_MIN_RESULT_SCALE; /* ---------- * Some preinitialized variables we need often * ---------- */ -static NumericDigit const_zero_data[1] = {0}; -static NumericVar const_zero = - {0, 0, 0, 0, NUMERIC_POS, NULL, const_zero_data}; +static NumericDigit const_zero_data[1] = {0}; +static NumericVar const_zero = +{0, 0, 0, 0, NUMERIC_POS, NULL, const_zero_data}; -static NumericDigit const_one_data[1] = {1}; -static NumericVar const_one = - {1, 0, 0, 0, NUMERIC_POS, NULL, const_one_data}; +static NumericDigit const_one_data[1] = {1}; +static NumericVar const_one = +{1, 0, 0, 0, NUMERIC_POS, NULL, const_one_data}; -static NumericDigit const_two_data[1] = {2}; -static NumericVar const_two = - {1, 0, 0, 0, NUMERIC_POS, NULL, const_two_data}; +static NumericDigit const_two_data[1] = {2}; +static NumericVar const_two = +{1, 0, 0, 0, NUMERIC_POS, NULL, const_two_data}; -static NumericVar const_nan = - {0, 0, 0, 0, NUMERIC_NAN, NULL, NULL}; +static NumericVar const_nan = +{0, 0, 0, 0, NUMERIC_NAN, NULL, NULL}; @@ -112,44 +114,45 @@ static NumericVar const_nan = #ifdef NUMERIC_DEBUG static void dump_numeric(char *str, Numeric num); -static void dump_var(char *str, NumericVar *var); +static void dump_var(char *str, NumericVar * var); + #else #define dump_numeric(s,n) #define dump_var(s,v) #endif static NumericDigitBuf *digitbuf_alloc(int size); -static void digitbuf_free(NumericDigitBuf *buf); +static void digitbuf_free(NumericDigitBuf * buf); #define init_var(v) memset(v,0,sizeof(NumericVar)) -static void free_var(NumericVar *var); +static void free_var(NumericVar * var); static void free_allvars(void); -static void set_var_from_str(char *str, NumericVar *dest); -static void set_var_from_num(Numeric value, NumericVar *dest); -static void set_var_from_var(NumericVar *value, NumericVar *dest); -static Numeric make_result(NumericVar *var); +static void set_var_from_str(char *str, NumericVar * dest); +static void set_var_from_num(Numeric value, NumericVar * dest); +static void set_var_from_var(NumericVar * value, NumericVar * dest); +static Numeric make_result(NumericVar * var); -static void apply_typmod(NumericVar *var, int32 typmod); +static void apply_typmod(NumericVar * var, int32 typmod); -static int cmp_var(NumericVar *var1, NumericVar *var2); -static void add_var(NumericVar *var1, NumericVar *var2, NumericVar *result); -static void sub_var(NumericVar *var1, NumericVar *var2, NumericVar *result); -static void mul_var(NumericVar *var1, NumericVar *var2, NumericVar *result); -static void div_var(NumericVar *var1, NumericVar *var2, NumericVar *result); -static void mod_var(NumericVar *var1, NumericVar *var2, NumericVar *result); -static void ceil_var(NumericVar *var, NumericVar *result); -static void floor_var(NumericVar *var, NumericVar *result); +static int cmp_var(NumericVar * var1, NumericVar * var2); +static void add_var(NumericVar * var1, NumericVar * var2, NumericVar * result); +static void sub_var(NumericVar * var1, NumericVar * var2, NumericVar * result); +static void mul_var(NumericVar * var1, NumericVar * var2, NumericVar * result); +static void div_var(NumericVar * var1, NumericVar * var2, NumericVar * result); +static void mod_var(NumericVar * var1, NumericVar * var2, NumericVar * result); +static void ceil_var(NumericVar * var, NumericVar * result); +static void floor_var(NumericVar * var, NumericVar * result); -static void sqrt_var(NumericVar *arg, NumericVar *result); -static void exp_var(NumericVar *arg, NumericVar *result); -static void ln_var(NumericVar *arg, NumericVar *result); -static void log_var(NumericVar *base, NumericVar *num, NumericVar *result); -static void power_var(NumericVar *base, NumericVar *exp, NumericVar *result); +static void sqrt_var(NumericVar * arg, NumericVar * result); +static void exp_var(NumericVar * arg, NumericVar * result); +static void ln_var(NumericVar * arg, NumericVar * result); +static void log_var(NumericVar * base, NumericVar * num, NumericVar * result); +static void power_var(NumericVar * base, NumericVar * exp, NumericVar * result); -static int cmp_abs(NumericVar *var1, NumericVar *var2); -static void add_abs(NumericVar *var1, NumericVar *var2, NumericVar *result); -static void sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result); +static int cmp_abs(NumericVar * var1, NumericVar * var2); +static void add_abs(NumericVar * var1, NumericVar * var2, NumericVar * result); +static void sub_abs(NumericVar * var1, NumericVar * var2, NumericVar * result); @@ -216,8 +219,8 @@ numeric_in(char *str, int dummy, int32 typmod) char * numeric_out(Numeric num) { - char *str; - char *cp; + char *str; + char *cp; NumericVar x; int i; int d; @@ -257,7 +260,7 @@ numeric_out(Numeric num) */ str = palloc(x.dscale + MAX(0, x.weight) + 5); cp = str; - + /* ---------- * Output a dash for negative values * ---------- @@ -272,8 +275,8 @@ numeric_out(Numeric num) */ if (x.dscale < x.rscale && (x.dscale + x.weight + 1) < x.ndigits) { - int j; - int carry; + int j; + int carry; j = x.dscale + x.weight + 1; carry = (x.digits[j] > 4) ? 1 : 0; @@ -342,7 +345,7 @@ numeric_out(Numeric num) * * This is a special function called by the Postgres database system * before a value is stored in a tuples attribute. The precision and - * scale of the attribute have to be applied on the value. + * scale of the attribute have to be applied on the value. * ---------- */ Numeric @@ -374,9 +377,9 @@ numeric(Numeric num, int32 typmod) * copy of the input value * ---------- */ - if (typmod < (int32)(VARHDRSZ)) + if (typmod < (int32) (VARHDRSZ)) { - new = (Numeric)palloc(num->varlen); + new = (Numeric) palloc(num->varlen); memcpy(new, num, num->varlen); return new; } @@ -387,7 +390,7 @@ numeric(Numeric num, int32 typmod) */ tmp_typmod = typmod - VARHDRSZ; precision = (tmp_typmod >> 16) & 0xffff; - scale = tmp_typmod & 0xffff; + scale = tmp_typmod & 0xffff; maxweight = precision - scale; /* ---------- @@ -398,11 +401,11 @@ numeric(Numeric num, int32 typmod) */ if (num->n_weight < maxweight && scale >= num->n_rscale) { - new = (Numeric)palloc(num->varlen); + new = (Numeric) palloc(num->varlen); memcpy(new, num, num->varlen); new->n_rscale = scale; - new->n_sign_dscale = NUMERIC_SIGN(new) | - ((uint16)scale & ~NUMERIC_SIGN_MASK); + new->n_sign_dscale = NUMERIC_SIGN(new) | + ((uint16) scale & ~NUMERIC_SIGN_MASK); return new; } @@ -454,7 +457,7 @@ numeric_abs(Numeric num) * Do it the easy way directly on the packed format * ---------- */ - res = (Numeric)palloc(num->varlen); + res = (Numeric) palloc(num->varlen); memcpy(res, num, num->varlen); res->n_sign_dscale = NUMERIC_POS | NUMERIC_DSCALE(num); @@ -492,9 +495,7 @@ numeric_sign(Numeric num) * ---------- */ if (num->varlen == NUMERIC_HDRSZ) - { set_var_from_var(&const_zero, &result); - } else { /* ---------- @@ -523,7 +524,7 @@ Numeric numeric_round(Numeric num, int32 scale) { int32 typmod; - int precision; + int precision; /* ---------- * Handle NULL @@ -547,7 +548,7 @@ numeric_round(Numeric num, int32 scale) { free_allvars(); elog(ERROR, "illegal numeric scale %d - must be between 0 and %d", - scale, NUMERIC_MAX_DISPLAY_SCALE); + scale, NUMERIC_MAX_DISPLAY_SCALE); } /* ---------- @@ -569,8 +570,8 @@ numeric_round(Numeric num, int32 scale) Numeric numeric_trunc(Numeric num, int32 scale) { - Numeric res; - NumericVar arg; + Numeric res; + NumericVar arg; /* ---------- * Handle NULL @@ -594,7 +595,7 @@ numeric_trunc(Numeric num, int32 scale) { free_allvars(); elog(ERROR, "illegal numeric scale %d - must be between 0 and %d", - scale, NUMERIC_MAX_DISPLAY_SCALE); + scale, NUMERIC_MAX_DISPLAY_SCALE); } /* ---------- @@ -609,9 +610,7 @@ numeric_trunc(Numeric num, int32 scale) arg.ndigits = MIN(arg.ndigits, MAX(0, arg.weight + scale + 1)); while (arg.ndigits > 0 && arg.digits[arg.ndigits - 1] == 0) - { arg.ndigits--; - } /* ---------- * Return the truncated result @@ -1085,7 +1084,7 @@ numeric_div(Numeric num1, Numeric num2) * numeric.h): * * DR = MIN(MAX(D1 + D2, MIN_DISPLAY_SCALE)) - * SR = MIN(MAX(MAX(S1 + S2, MIN_RESULT_SCALE), DR + 4), MAX_RESULT_SCALE) + * SR = MIN(MAX(MAX(S1 + S2, MIN_RESULT_SCALE), DR + 4), MAX_RESULT_SCALE) * * By default, any result is computed with a minimum of 34 digits * after the decimal point or at least with 4 digits more than @@ -1094,7 +1093,7 @@ numeric_div(Numeric num1, Numeric num2) */ res_dscale = MAX(arg1.dscale + arg2.dscale, NUMERIC_MIN_DISPLAY_SCALE); res_dscale = MIN(res_dscale, NUMERIC_MAX_DISPLAY_SCALE); - global_rscale = MAX(arg1.rscale + arg2.rscale, + global_rscale = MAX(arg1.rscale + arg2.rscale, NUMERIC_MIN_RESULT_SCALE); global_rscale = MAX(global_rscale, res_dscale + 4); global_rscale = MIN(global_rscale, NUMERIC_MAX_RESULT_SCALE); @@ -1358,10 +1357,10 @@ numeric_larger(Numeric num1, Numeric num2) Numeric numeric_sqrt(Numeric num) { - Numeric res; - NumericVar arg; - NumericVar result; - int res_dscale; + Numeric res; + NumericVar arg; + NumericVar result; + int res_dscale; /* ---------- * Handle NULL @@ -1415,10 +1414,10 @@ numeric_sqrt(Numeric num) Numeric numeric_exp(Numeric num) { - Numeric res; - NumericVar arg; - NumericVar result; - int res_dscale; + Numeric res; + NumericVar arg; + NumericVar result; + int res_dscale; /* ---------- * Handle NULL @@ -1470,10 +1469,10 @@ numeric_exp(Numeric num) Numeric numeric_ln(Numeric num) { - Numeric res; - NumericVar arg; - NumericVar result; - int res_dscale; + Numeric res; + NumericVar arg; + NumericVar result; + int res_dscale; /* ---------- * Handle NULL @@ -1525,11 +1524,11 @@ numeric_ln(Numeric num) Numeric numeric_log(Numeric num1, Numeric num2) { - Numeric res; - NumericVar arg1; - NumericVar arg2; - NumericVar result; - int res_dscale; + Numeric res; + NumericVar arg1; + NumericVar arg2; + NumericVar result; + int res_dscale; /* ---------- * Handle NULL @@ -1588,11 +1587,11 @@ numeric_log(Numeric num1, Numeric num2) Numeric numeric_power(Numeric num1, Numeric num2) { - Numeric res; - NumericVar arg1; - NumericVar arg2; - NumericVar result; - int res_dscale; + Numeric res; + NumericVar arg1; + NumericVar arg2; + NumericVar result; + int res_dscale; /* ---------- * Handle NULL @@ -1653,7 +1652,7 @@ int4_numeric(int32 val) { Numeric res; NumericVar result; - char *tmp; + char *tmp; init_var(&result); @@ -1671,7 +1670,7 @@ int4_numeric(int32 val) int32 numeric_int4(Numeric num) { - char *tmp; + char *tmp; int32 result; if (num == NULL) @@ -1717,7 +1716,7 @@ float8_numeric(float64 val) float64 numeric_float8(Numeric num) { - char *tmp; + char *tmp; float64 result; if (num == NULL) @@ -1725,7 +1724,7 @@ numeric_float8(Numeric num) if (NUMERIC_IS_NAN(num)) { - result = (float64)palloc(sizeof(float64data)); + result = (float64) palloc(sizeof(float64data)); *result = NAN; return result; } @@ -1743,7 +1742,7 @@ float4_numeric(float32 val) { Numeric res; NumericVar result; - char *tmp; + char *tmp; if (val == NULL) return NULL; @@ -1767,7 +1766,7 @@ float4_numeric(float32 val) float32 numeric_float4(Numeric num) { - char *tmp; + char *tmp; float32 result; if (num == NULL) @@ -1775,7 +1774,7 @@ numeric_float4(Numeric num) if (NUMERIC_IS_NAN(num)) { - result = (float32)palloc(sizeof(float32data)); + result = (float32) palloc(sizeof(float32data)); *result = NAN; return result; } @@ -1805,26 +1804,28 @@ numeric_float4(Numeric num) static void dump_numeric(char *str, Numeric num) { - int i; + int i; printf("%s: NUMERIC w=%d r=%d d=%d ", str, num->n_weight, num->n_rscale, - NUMERIC_DSCALE(num)); + NUMERIC_DSCALE(num)); switch (NUMERIC_SIGN(num)) { - case NUMERIC_POS: printf("POS"); - break; - case NUMERIC_NEG: printf("NEG"); - break; - case NUMERIC_NAN: printf("NaN"); - break; - default: printf("SIGN=0x%x", NUMERIC_SIGN(num)); - break; + case NUMERIC_POS: + printf("POS"); + break; + case NUMERIC_NEG: + printf("NEG"); + break; + case NUMERIC_NAN: + printf("NaN"); + break; + default: + printf("SIGN=0x%x", NUMERIC_SIGN(num)); + break; } for (i = 0; i < num->varlen - NUMERIC_HDRSZ; i++) - { printf(" %d %d", (num->n_data[i] >> 4) & 0x0f, num->n_data[i] & 0x0f); - } printf("\n"); } @@ -1834,31 +1835,35 @@ dump_numeric(char *str, Numeric num) * ---------- */ static void -dump_var(char *str, NumericVar *var) +dump_var(char *str, NumericVar * var) { - int i; + int i; printf("%s: VAR w=%d r=%d d=%d ", str, var->weight, var->rscale, - var->dscale); + var->dscale); switch (var->sign) { - case NUMERIC_POS: printf("POS"); - break; - case NUMERIC_NEG: printf("NEG"); - break; - case NUMERIC_NAN: printf("NaN"); - break; - default: printf("SIGN=0x%x", var->sign); - break; + case NUMERIC_POS: + printf("POS"); + break; + case NUMERIC_NEG: + printf("NEG"); + break; + case NUMERIC_NAN: + printf("NaN"); + break; + default: + printf("SIGN=0x%x", var->sign); + break; } for (i = 0; i < var->ndigits; i++) printf(" %d", var->digits[i]); - + printf("\n"); } -#endif /* NUMERIC_DEBUG */ +#endif /* NUMERIC_DEBUG */ /* ---------- @@ -1868,7 +1873,7 @@ dump_var(char *str, NumericVar *var) * information (sign, scales etc.) and a digit buffer for the * value itself. All the variable level functions are written in * a style that makes it possible to give one and the same variable - * as argument and result destination. + * as argument and result destination. * * The two functions below manage unused buffers in a free list * as a try to reduce the number of malloc()/free() calls. @@ -1877,8 +1882,8 @@ dump_var(char *str, NumericVar *var) static NumericDigitBuf * digitbuf_alloc(int size) { - NumericDigitBuf *buf; - int asize; + NumericDigitBuf *buf; + int asize; /* ---------- * Lookup the free list if there is a digit buffer of @@ -1887,7 +1892,8 @@ digitbuf_alloc(int size) */ for (buf = digitbuf_freelist; buf != NULL; buf = buf->next) { - if (buf->size < size) continue; + if (buf->size < size) + continue; /* ---------- * We found a free buffer that is big enough - remove it from @@ -1930,7 +1936,7 @@ digitbuf_alloc(int size) * ---------- */ for (asize = NUMERIC_MIN_BUFSIZE; asize < size; asize *= 2); - buf = (NumericDigitBuf *)malloc(sizeof(NumericDigitBuf) + asize); + buf = (NumericDigitBuf *) malloc(sizeof(NumericDigitBuf) + asize); buf->size = asize; /* ---------- @@ -1956,9 +1962,9 @@ digitbuf_alloc(int size) * ---------- */ static void -digitbuf_free(NumericDigitBuf *buf) +digitbuf_free(NumericDigitBuf * buf) { - NumericDigitBuf *smallest; + NumericDigitBuf *smallest; if (buf == NULL) return; @@ -2042,12 +2048,12 @@ digitbuf_free(NumericDigitBuf *buf) * ---------- */ static void -free_var(NumericVar *var) +free_var(NumericVar * var) { if (var->buf != NULL) { digitbuf_free(var->buf); - var->buf = NULL; + var->buf = NULL; var->digits = NULL; } var->sign = NUMERIC_NAN; @@ -2070,8 +2076,8 @@ free_var(NumericVar *var) static void free_allvars(void) { - NumericDigitBuf *buf; - NumericDigitBuf *next; + NumericDigitBuf *buf; + NumericDigitBuf *next; buf = digitbuf_usedlist; while (buf != NULL) @@ -2090,25 +2096,26 @@ free_allvars(void) * ---------- */ static void -set_var_from_str(char *str, NumericVar *dest) +set_var_from_str(char *str, NumericVar * dest) { - char *cp = str; - bool have_dp = FALSE; - int i = 1; + char *cp = str; + bool have_dp = FALSE; + int i = 1; - while(*cp) + while (*cp) { - if (!isspace(*cp)) break; + if (!isspace(*cp)) + break; cp++; } digitbuf_free(dest->buf); - dest->buf = digitbuf_alloc(strlen(cp) + 2); - dest->digits = (NumericDigit *)(dest->buf) + sizeof(NumericDigitBuf); + dest->buf = digitbuf_alloc(strlen(cp) + 2); + dest->digits = (NumericDigit *) (dest->buf) + sizeof(NumericDigitBuf); dest->digits[0] = 0; - dest->weight = 0; - dest->dscale = 0; + dest->weight = 0; + dest->dscale = 0; switch (*cp) { @@ -2121,24 +2128,29 @@ set_var_from_str(char *str, NumericVar *dest) case '6': case '7': case '8': - case '9': dest->sign = NUMERIC_POS; - break; + case '9': + dest->sign = NUMERIC_POS; + break; - case '+': dest->sign = NUMERIC_POS; - cp++; - break; + case '+': + dest->sign = NUMERIC_POS; + cp++; + break; - case '-': dest->sign = NUMERIC_NEG; - cp++; - break; + case '-': + dest->sign = NUMERIC_NEG; + cp++; + break; - case '.': dest->sign = NUMERIC_POS; - have_dp = TRUE; - cp++; - break; + case '.': + dest->sign = NUMERIC_POS; + have_dp = TRUE; + cp++; + break; - default: free_allvars(); - elog(ERROR, "Bad numeric input format '%s'", str); + default: + free_allvars(); + elog(ERROR, "Bad numeric input format '%s'", str); } if (*cp == '.') @@ -2178,24 +2190,27 @@ set_var_from_str(char *str, NumericVar *dest) case '6': case '7': case '8': - case '9': dest->digits[i++] = *cp++ - '0'; - if (!have_dp) - dest->weight++; - else - dest->dscale++; - break; - - case '.': if (have_dp) - { - free_allvars(); - elog(ERROR, "Bad numeric input format '%s'", str); - } - have_dp = TRUE; - cp++; - break; - - default: free_allvars(); - elog(ERROR, "Bad numeric input format '%s'", str); + case '9': + dest->digits[i++] = *cp++ - '0'; + if (!have_dp) + dest->weight++; + else + dest->dscale++; + break; + + case '.': + if (have_dp) + { + free_allvars(); + elog(ERROR, "Bad numeric input format '%s'", str); + } + have_dp = TRUE; + cp++; + break; + + default: + free_allvars(); + elog(ERROR, "Bad numeric input format '%s'", str); } } dest->ndigits = i; @@ -2223,18 +2238,18 @@ set_var_from_str(char *str, NumericVar *dest) * */ static void -set_var_from_num(Numeric num, NumericVar *dest) +set_var_from_num(Numeric num, NumericVar * dest) { - NumericDigit *digit; - int i; - int n; + NumericDigit *digit; + int i; + int n; n = num->varlen - NUMERIC_HDRSZ; digitbuf_free(dest->buf); dest->buf = digitbuf_alloc(n * 2 + 2); - digit = ((NumericDigit *)(dest->buf)) + sizeof(NumericDigitBuf); + digit = ((NumericDigit *) (dest->buf)) + sizeof(NumericDigitBuf); *digit++ = 0; *digit++ = 0; dest->digits = digit; @@ -2243,7 +2258,7 @@ set_var_from_num(Numeric num, NumericVar *dest) dest->weight = num->n_weight; dest->rscale = num->n_rscale; dest->dscale = NUMERIC_DSCALE(num); - dest->sign = NUMERIC_SIGN(num); + dest->sign = NUMERIC_SIGN(num); for (i = 0; i < n; i++) { @@ -2260,18 +2275,18 @@ set_var_from_num(Numeric num, NumericVar *dest) * ---------- */ static void -set_var_from_var(NumericVar *value, NumericVar *dest) +set_var_from_var(NumericVar * value, NumericVar * dest) { - NumericDigitBuf *newbuf; - NumericDigit *newdigits; + NumericDigitBuf *newbuf; + NumericDigit *newdigits; newbuf = digitbuf_alloc(value->ndigits); - newdigits = ((NumericDigit *)newbuf) + sizeof(NumericDigitBuf); + newdigits = ((NumericDigit *) newbuf) + sizeof(NumericDigitBuf); memcpy(newdigits, value->digits, value->ndigits); digitbuf_free(dest->buf); memcpy(dest, value, sizeof(NumericVar)); - dest->buf = newbuf; + dest->buf = newbuf; dest->digits = newdigits; } @@ -2284,22 +2299,23 @@ set_var_from_var(NumericVar *value, NumericVar *dest) * ---------- */ static Numeric -make_result(NumericVar *var) +make_result(NumericVar * var) { - Numeric result; - NumericDigit *digit = var->digits; - int n; - int weight = var->weight; - int sign = var->sign; - int i, j; + Numeric result; + NumericDigit *digit = var->digits; + int n; + int weight = var->weight; + int sign = var->sign; + int i, + j; if (sign == NUMERIC_NAN) { - result = (Numeric)palloc(NUMERIC_HDRSZ); + result = (Numeric) palloc(NUMERIC_HDRSZ); - result->varlen = NUMERIC_HDRSZ; - result->n_weight = 0; - result->n_rscale = 0; + result->varlen = NUMERIC_HDRSZ; + result->n_weight = 0; + result->n_rscale = 0; result->n_sign_dscale = NUMERIC_NAN; dump_numeric("make_result()", result); @@ -2320,16 +2336,17 @@ make_result(NumericVar *var) if (n == 0) { weight = 0; - sign = NUMERIC_POS; + sign = NUMERIC_POS; } - result = (Numeric)palloc(NUMERIC_HDRSZ + (n + 1) / 2); + result = (Numeric) palloc(NUMERIC_HDRSZ + (n + 1) / 2); result->varlen = NUMERIC_HDRSZ + (n + 1) / 2; result->n_weight = weight; result->n_rscale = var->rscale; - result->n_sign_dscale = sign | ((uint16)(var->dscale) & ~NUMERIC_SIGN_MASK); + result->n_sign_dscale = sign | ((uint16) (var->dscale) & ~NUMERIC_SIGN_MASK); - i = 0; j = 0; + i = 0; + j = 0; while (j < n) { result->n_data[i] = digit[j++] << 4; @@ -2351,33 +2368,33 @@ make_result(NumericVar *var) * ---------- */ static void -apply_typmod(NumericVar *var, int32 typmod) +apply_typmod(NumericVar * var, int32 typmod) { int precision; int scale; int maxweight; int i; - if (typmod < (int32)(VARHDRSZ)) + if (typmod < (int32) (VARHDRSZ)) return; typmod -= VARHDRSZ; precision = (typmod >> 16) & 0xffff; - scale = typmod & 0xffff; + scale = typmod & 0xffff; maxweight = precision - scale; if (var->weight >= maxweight) { free_allvars(); elog(ERROR, "overflow on numeric " - "ABS(value) >= 10^%d for field with precision %d scale %d", - var->weight, precision, scale); + "ABS(value) >= 10^%d for field with precision %d scale %d", + var->weight, precision, scale); } i = scale + var->weight + 1; if (i >= 0 && var->ndigits > i) { - long carry = (var->digits[i] > 4) ? 1 : 0; + long carry = (var->digits[i] > 4) ? 1 : 0; var->ndigits = i; while (carry) @@ -2395,9 +2412,7 @@ apply_typmod(NumericVar *var, int32 typmod) } } else - { var->ndigits = MAX(0, MIN(i, var->ndigits)); - } /* ---------- * Check for overflow again - rounding could have raised the @@ -2408,8 +2423,8 @@ apply_typmod(NumericVar *var, int32 typmod) { free_allvars(); elog(ERROR, "overflow on numeric " - "ABS(value) >= 10^%d for field with precision %d scale %d", - var->weight, precision, scale); + "ABS(value) >= 10^%d for field with precision %d scale %d", + var->weight, precision, scale); } var->rscale = scale; @@ -2424,7 +2439,7 @@ apply_typmod(NumericVar *var, int32 typmod) * ---------- */ static int -cmp_var(NumericVar *var1, NumericVar *var2) +cmp_var(NumericVar * var1, NumericVar * var2) { if (var1->ndigits == 0) { @@ -2463,7 +2478,7 @@ cmp_var(NumericVar *var1, NumericVar *var2) * ---------- */ static void -add_var(NumericVar *var1, NumericVar *var2, NumericVar *result) +add_var(NumericVar * var1, NumericVar * var2, NumericVar * result) { /* ---------- * Decide on the signs of the two variables what to do @@ -2474,7 +2489,7 @@ add_var(NumericVar *var1, NumericVar *var2, NumericVar *result) if (var2->sign == NUMERIC_POS) { /* ---------- - * Both are positive + * Both are positive * result = +(ABS(var1) + ABS(var2)) * ---------- */ @@ -2490,39 +2505,39 @@ add_var(NumericVar *var1, NumericVar *var2, NumericVar *result) */ switch (cmp_abs(var1, var2)) { - case 0: /* ---------- - * ABS(var1) == ABS(var2) - * result = ZERO - * ---------- - */ - digitbuf_free(result->buf); - result->buf = digitbuf_alloc(0); - result->ndigits = 0; - result->digits = ((NumericDigit *)(result->buf)) + - sizeof(NumericDigitBuf); - result->weight = 0; - result->rscale = MAX(var1->rscale, var2->rscale); - result->dscale = MAX(var1->dscale, var2->dscale); - result->sign = NUMERIC_POS; - break; - - case 1: /* ---------- - * ABS(var1) > ABS(var2) - * result = +(ABS(var1) - ABS(var2)) - * ---------- - */ - sub_abs(var1, var2, result); - result->sign = NUMERIC_POS; - break; - - case -1: /* ---------- - * ABS(var1) < ABS(var2) - * result = -(ABS(var2) - ABS(var1)) - * ---------- - */ - sub_abs(var2, var1, result); - result->sign = NUMERIC_NEG; - break; + case 0: /* ---------- + * ABS(var1) == ABS(var2) + * result = ZERO + * ---------- + */ + digitbuf_free(result->buf); + result->buf = digitbuf_alloc(0); + result->ndigits = 0; + result->digits = ((NumericDigit *) (result->buf)) + + sizeof(NumericDigitBuf); + result->weight = 0; + result->rscale = MAX(var1->rscale, var2->rscale); + result->dscale = MAX(var1->dscale, var2->dscale); + result->sign = NUMERIC_POS; + break; + + case 1: /* ---------- + * ABS(var1) > ABS(var2) + * result = +(ABS(var1) - ABS(var2)) + * ---------- + */ + sub_abs(var1, var2, result); + result->sign = NUMERIC_POS; + break; + + case -1: /* ---------- + * ABS(var1) < ABS(var2) + * result = -(ABS(var2) - ABS(var1)) + * ---------- + */ + sub_abs(var2, var1, result); + result->sign = NUMERIC_NEG; + break; } } } @@ -2537,39 +2552,39 @@ add_var(NumericVar *var1, NumericVar *var2, NumericVar *result) */ switch (cmp_abs(var1, var2)) { - case 0: /* ---------- - * ABS(var1) == ABS(var2) - * result = ZERO - * ---------- - */ - digitbuf_free(result->buf); - result->buf = digitbuf_alloc(0); - result->ndigits = 0; - result->digits = ((NumericDigit *)(result->buf)) + - sizeof(NumericDigitBuf); - result->weight = 0; - result->rscale = MAX(var1->rscale, var2->rscale); - result->dscale = MAX(var1->dscale, var2->dscale); - result->sign = NUMERIC_POS; - break; - - case 1: /* ---------- - * ABS(var1) > ABS(var2) - * result = -(ABS(var1) - ABS(var2)) - * ---------- - */ - sub_abs(var1, var2, result); - result->sign = NUMERIC_NEG; - break; - - case -1: /* ---------- - * ABS(var1) < ABS(var2) - * result = +(ABS(var2) - ABS(var1)) - * ---------- - */ - sub_abs(var2, var1, result); - result->sign = NUMERIC_POS; - break; + case 0: /* ---------- + * ABS(var1) == ABS(var2) + * result = ZERO + * ---------- + */ + digitbuf_free(result->buf); + result->buf = digitbuf_alloc(0); + result->ndigits = 0; + result->digits = ((NumericDigit *) (result->buf)) + + sizeof(NumericDigitBuf); + result->weight = 0; + result->rscale = MAX(var1->rscale, var2->rscale); + result->dscale = MAX(var1->dscale, var2->dscale); + result->sign = NUMERIC_POS; + break; + + case 1: /* ---------- + * ABS(var1) > ABS(var2) + * result = -(ABS(var1) - ABS(var2)) + * ---------- + */ + sub_abs(var1, var2, result); + result->sign = NUMERIC_NEG; + break; + + case -1: /* ---------- + * ABS(var1) < ABS(var2) + * result = +(ABS(var2) - ABS(var1)) + * ---------- + */ + sub_abs(var2, var1, result); + result->sign = NUMERIC_POS; + break; } } else @@ -2594,7 +2609,7 @@ add_var(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ static void -sub_var(NumericVar *var1, NumericVar *var2, NumericVar *result) +sub_var(NumericVar * var1, NumericVar * var2, NumericVar * result) { /* ---------- * Decide on the signs of the two variables what to do @@ -2621,39 +2636,39 @@ sub_var(NumericVar *var1, NumericVar *var2, NumericVar *result) */ switch (cmp_abs(var1, var2)) { - case 0: /* ---------- - * ABS(var1) == ABS(var2) - * result = ZERO - * ---------- - */ - digitbuf_free(result->buf); - result->buf = digitbuf_alloc(0); - result->ndigits = 0; - result->digits = ((NumericDigit *)(result->buf)) + - sizeof(NumericDigitBuf); - result->weight = 0; - result->rscale = MAX(var1->rscale, var2->rscale); - result->dscale = MAX(var1->dscale, var2->dscale); - result->sign = NUMERIC_POS; - break; - - case 1: /* ---------- - * ABS(var1) > ABS(var2) - * result = +(ABS(var1) - ABS(var2)) - * ---------- - */ - sub_abs(var1, var2, result); - result->sign = NUMERIC_POS; - break; - - case -1: /* ---------- - * ABS(var1) < ABS(var2) - * result = -(ABS(var2) - ABS(var1)) - * ---------- - */ - sub_abs(var2, var1, result); - result->sign = NUMERIC_NEG; - break; + case 0: /* ---------- + * ABS(var1) == ABS(var2) + * result = ZERO + * ---------- + */ + digitbuf_free(result->buf); + result->buf = digitbuf_alloc(0); + result->ndigits = 0; + result->digits = ((NumericDigit *) (result->buf)) + + sizeof(NumericDigitBuf); + result->weight = 0; + result->rscale = MAX(var1->rscale, var2->rscale); + result->dscale = MAX(var1->dscale, var2->dscale); + result->sign = NUMERIC_POS; + break; + + case 1: /* ---------- + * ABS(var1) > ABS(var2) + * result = +(ABS(var1) - ABS(var2)) + * ---------- + */ + sub_abs(var1, var2, result); + result->sign = NUMERIC_POS; + break; + + case -1: /* ---------- + * ABS(var1) < ABS(var2) + * result = -(ABS(var2) - ABS(var1)) + * ---------- + */ + sub_abs(var2, var1, result); + result->sign = NUMERIC_NEG; + break; } } } @@ -2668,39 +2683,39 @@ sub_var(NumericVar *var1, NumericVar *var2, NumericVar *result) */ switch (cmp_abs(var1, var2)) { - case 0: /* ---------- - * ABS(var1) == ABS(var2) - * result = ZERO - * ---------- - */ - digitbuf_free(result->buf); - result->buf = digitbuf_alloc(0); - result->ndigits = 0; - result->digits = ((NumericDigit *)(result->buf)) + - sizeof(NumericDigitBuf); - result->weight = 0; - result->rscale = MAX(var1->rscale, var2->rscale); - result->dscale = MAX(var1->dscale, var2->dscale); - result->sign = NUMERIC_POS; - break; - - case 1: /* ---------- - * ABS(var1) > ABS(var2) - * result = -(ABS(var1) - ABS(var2)) - * ---------- - */ - sub_abs(var1, var2, result); - result->sign = NUMERIC_NEG; - break; - - case -1: /* ---------- - * ABS(var1) < ABS(var2) - * result = +(ABS(var2) - ABS(var1)) - * ---------- - */ - sub_abs(var2, var1, result); - result->sign = NUMERIC_POS; - break; + case 0: /* ---------- + * ABS(var1) == ABS(var2) + * result = ZERO + * ---------- + */ + digitbuf_free(result->buf); + result->buf = digitbuf_alloc(0); + result->ndigits = 0; + result->digits = ((NumericDigit *) (result->buf)) + + sizeof(NumericDigitBuf); + result->weight = 0; + result->rscale = MAX(var1->rscale, var2->rscale); + result->dscale = MAX(var1->dscale, var2->dscale); + result->sign = NUMERIC_POS; + break; + + case 1: /* ---------- + * ABS(var1) > ABS(var2) + * result = -(ABS(var1) - ABS(var2)) + * ---------- + */ + sub_abs(var1, var2, result); + result->sign = NUMERIC_NEG; + break; + + case -1: /* ---------- + * ABS(var1) < ABS(var2) + * result = +(ABS(var2) - ABS(var1)) + * ---------- + */ + sub_abs(var2, var1, result); + result->sign = NUMERIC_POS; + break; } } else @@ -2725,17 +2740,20 @@ sub_var(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ static void -mul_var(NumericVar *var1, NumericVar *var2, NumericVar *result) +mul_var(NumericVar * var1, NumericVar * var2, NumericVar * result) { - NumericDigitBuf *res_buf; - NumericDigit *res_digits; - int res_ndigits; - int res_weight; - int res_sign; - int i, ri, i1, i2; - long sum = 0; - - res_weight = var1->weight + var2->weight + 2; + NumericDigitBuf *res_buf; + NumericDigit *res_digits; + int res_ndigits; + int res_weight; + int res_sign; + int i, + ri, + i1, + i2; + long sum = 0; + + res_weight = var1->weight + var2->weight + 2; res_ndigits = var1->ndigits + var2->ndigits + 1; if (var1->sign == var2->sign) res_sign = NUMERIC_POS; @@ -2743,7 +2761,7 @@ mul_var(NumericVar *var1, NumericVar *var2, NumericVar *result) res_sign = NUMERIC_NEG; res_buf = digitbuf_alloc(res_ndigits); - res_digits = ((NumericDigit *)res_buf) + sizeof(NumericDigitBuf); + res_digits = ((NumericDigit *) res_buf) + sizeof(NumericDigitBuf); memset(res_digits, 0, res_ndigits); ri = res_ndigits; @@ -2782,23 +2800,21 @@ mul_var(NumericVar *var1, NumericVar *var2, NumericVar *result) res_ndigits--; } while (res_ndigits > 0 && res_digits[res_ndigits - 1] == 0) - { res_ndigits--; - } if (res_ndigits == 0) { - res_sign = NUMERIC_POS; + res_sign = NUMERIC_POS; res_weight = 0; } digitbuf_free(result->buf); - result->buf = res_buf; - result->digits = res_digits; + result->buf = res_buf; + result->digits = res_digits; result->ndigits = res_ndigits; - result->weight = res_weight; - result->rscale = global_rscale; - result->sign = res_sign; + result->weight = res_weight; + result->rscale = global_rscale; + result->sign = res_sign; } @@ -2809,24 +2825,24 @@ mul_var(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ static void -div_var(NumericVar *var1, NumericVar *var2, NumericVar *result) -{ - NumericDigit *res_digits; - int res_ndigits; - int res_sign; - int res_weight; - NumericVar dividend; - NumericVar divisor[10]; - int ndigits_tmp; - int weight_tmp; - int rscale_tmp; - int ri; - int i; - long guess; - long first_have; - long first_div; - int first_nextdigit; - int stat = 0; +div_var(NumericVar * var1, NumericVar * var2, NumericVar * result) +{ + NumericDigit *res_digits; + int res_ndigits; + int res_sign; + int res_weight; + NumericVar dividend; + NumericVar divisor[10]; + int ndigits_tmp; + int weight_tmp; + int rscale_tmp; + int ri; + int i; + long guess; + long first_have; + long first_div; + int first_nextdigit; + int stat = 0; /* ---------- * First of all division by zero check @@ -2858,11 +2874,11 @@ div_var(NumericVar *var1, NumericVar *var2, NumericVar *result) { digitbuf_free(result->buf); result->buf = digitbuf_alloc(0); - result->digits = ((NumericDigit *)(result->buf)) + sizeof(NumericDigitBuf); + result->digits = ((NumericDigit *) (result->buf)) + sizeof(NumericDigitBuf); result->ndigits = 0; - result->weight = 0; - result->rscale = global_rscale; - result->sign = NUMERIC_POS; + result->weight = 0; + result->rscale = global_rscale; + result->sign = NUMERIC_POS; return; } @@ -2872,21 +2888,19 @@ div_var(NumericVar *var1, NumericVar *var2, NumericVar *result) */ init_var(÷nd); for (i = 1; i < 10; i++) - { init_var(&divisor[i]); - } /* ---------- * Make a copy of the divisor which has one leading zero digit * ---------- */ - divisor[1].ndigits = ndigits_tmp; - divisor[1].rscale = var2->ndigits; - divisor[1].sign = NUMERIC_POS; - divisor[1].buf = digitbuf_alloc(ndigits_tmp); - divisor[1].digits = ((NumericDigit *)(divisor[1].buf)) + - sizeof(NumericDigitBuf); + divisor[1].ndigits = ndigits_tmp; + divisor[1].rscale = var2->ndigits; + divisor[1].sign = NUMERIC_POS; + divisor[1].buf = digitbuf_alloc(ndigits_tmp); + divisor[1].digits = ((NumericDigit *) (divisor[1].buf)) + + sizeof(NumericDigitBuf); divisor[1].digits[0] = 0; memcpy(&(divisor[1].digits[1]), var2->digits, ndigits_tmp - 1); @@ -2895,11 +2909,11 @@ div_var(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ dividend.ndigits = var1->ndigits; - dividend.weight = 0; - dividend.rscale = var1->ndigits; - dividend.sign = NUMERIC_POS; - dividend.buf = digitbuf_alloc(var1->ndigits); - dividend.digits = ((NumericDigit *)(dividend.buf)) + sizeof(NumericDigitBuf); + dividend.weight = 0; + dividend.rscale = var1->ndigits; + dividend.sign = NUMERIC_POS; + dividend.buf = digitbuf_alloc(var1->ndigits); + dividend.digits = ((NumericDigit *) (dividend.buf)) + sizeof(NumericDigitBuf); memcpy(dividend.digits, var1->digits, var1->ndigits); /* ---------- @@ -2908,18 +2922,18 @@ div_var(NumericVar *var1, NumericVar *var2, NumericVar *result) */ digitbuf_free(result->buf); result->buf = digitbuf_alloc(res_ndigits + 2); - res_digits = ((NumericDigit *)(result->buf)) + sizeof(NumericDigitBuf); + res_digits = ((NumericDigit *) (result->buf)) + sizeof(NumericDigitBuf); result->digits = res_digits; result->ndigits = res_ndigits; - result->weight = res_weight; - result->rscale = global_rscale; - result->sign = res_sign; + result->weight = res_weight; + result->rscale = global_rscale; + result->sign = res_sign; res_digits[0] = 0; first_div = divisor[1].digits[1] * 10; if (ndigits_tmp > 2) first_div += divisor[1].digits[2]; - + first_have = 0; first_nextdigit = 0; @@ -2941,13 +2955,13 @@ div_var(NumericVar *var1, NumericVar *var2, NumericVar *result) { if (divisor[guess].buf == NULL) { - int i; - long sum = 0; + int i; + long sum = 0; memcpy(&divisor[guess], &divisor[1], sizeof(NumericVar)); divisor[guess].buf = digitbuf_alloc(divisor[guess].ndigits); - divisor[guess].digits = ((NumericDigit *)(divisor[guess].buf) + - sizeof(NumericDigitBuf)); + divisor[guess].digits = ((NumericDigit *) (divisor[guess].buf) + + sizeof(NumericDigitBuf)); for (i = divisor[1].ndigits - 1; i >= 0; i--) { sum += divisor[1].digits[i] * guess; @@ -2960,7 +2974,8 @@ div_var(NumericVar *var1, NumericVar *var2, NumericVar *result) divisor[guess].rscale = rscale_tmp; stat = cmp_abs(÷nd, &divisor[guess]); - if (stat >= 0) break; + if (stat >= 0) + break; guess--; } @@ -2990,12 +3005,12 @@ div_var(NumericVar *var1, NumericVar *var2, NumericVar *result) result->ndigits = ri + 1; if (ri == res_ndigits + 1) { - long carry = (res_digits[ri] > 4) ? 1 : 0; + long carry = (res_digits[ri] > 4) ? 1 : 0; result->ndigits = ri; res_digits[ri] = 0; - while(carry && ri > 0) + while (carry && ri > 0) { carry += res_digits[--ri]; res_digits[ri] = carry % 10; @@ -3010,9 +3025,7 @@ div_var(NumericVar *var1, NumericVar *var2, NumericVar *result) (result->ndigits)--; } while (result->ndigits > 0 && result->digits[result->ndigits - 1] == 0) - { (result->ndigits)--; - } if (result->ndigits == 0) result->sign = NUMERIC_POS; @@ -3033,10 +3046,10 @@ div_var(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ static void -mod_var(NumericVar *var1, NumericVar *var2, NumericVar *result) +mod_var(NumericVar * var1, NumericVar * var2, NumericVar * result) { - NumericVar tmp; - int save_global_rscale; + NumericVar tmp; + int save_global_rscale; init_var(&tmp); @@ -3070,9 +3083,9 @@ mod_var(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ static void -ceil_var(NumericVar *var, NumericVar *result) +ceil_var(NumericVar * var, NumericVar * result) { - NumericVar tmp; + NumericVar tmp; init_var(&tmp); set_var_from_var(var, &tmp); @@ -3095,9 +3108,9 @@ ceil_var(NumericVar *var, NumericVar *result) * ---------- */ static void -floor_var(NumericVar *var, NumericVar *result) +floor_var(NumericVar * var, NumericVar * result) { - NumericVar tmp; + NumericVar tmp; init_var(&tmp); set_var_from_var(var, &tmp); @@ -3119,14 +3132,14 @@ floor_var(NumericVar *var, NumericVar *result) * ---------- */ static void -sqrt_var(NumericVar *arg, NumericVar *result) +sqrt_var(NumericVar * arg, NumericVar * result) { - NumericVar tmp_arg; - NumericVar tmp_val; - NumericVar last_val; - int res_rscale; - int save_global_rscale; - int stat; + NumericVar tmp_arg; + NumericVar tmp_val; + NumericVar last_val; + int res_rscale; + int save_global_rscale; + int stat; save_global_rscale = global_rscale; global_rscale += 8; @@ -3137,7 +3150,7 @@ sqrt_var(NumericVar *arg, NumericVar *result) { set_var_from_var(&const_zero, result); result->rscale = res_rscale; - result->sign = NUMERIC_POS; + result->sign = NUMERIC_POS; return; } @@ -3160,14 +3173,14 @@ sqrt_var(NumericVar *arg, NumericVar *result) */ digitbuf_free(result->buf); result->buf = digitbuf_alloc(1); - result->digits = ((NumericDigit *)(result->buf)) + sizeof(NumericDigitBuf); + result->digits = ((NumericDigit *) (result->buf)) + sizeof(NumericDigitBuf); result->digits[0] = tmp_arg.digits[0] / 2; if (result->digits[0] == 0) result->digits[0] = 1; result->ndigits = 1; result->weight = tmp_arg.weight / 2; result->rscale = res_rscale; - result->sign = NUMERIC_POS; + result->sign = NUMERIC_POS; for (;;) { @@ -3176,7 +3189,8 @@ sqrt_var(NumericVar *arg, NumericVar *result) add_var(result, &tmp_val, result); div_var(result, &const_two, result); - if (cmp_var(&last_val, result) == 0) break; + if (cmp_var(&last_val, result) == 0) + break; set_var_from_var(result, &last_val); } @@ -3196,18 +3210,18 @@ sqrt_var(NumericVar *arg, NumericVar *result) * ---------- */ static void -exp_var(NumericVar *arg, NumericVar *result) -{ - NumericVar x; - NumericVar xpow; - NumericVar ifac; - NumericVar elem; - NumericVar ni; - int d; - int i; - int ndiv2 = 0; - bool xneg = FALSE; - int save_global_rscale; +exp_var(NumericVar * arg, NumericVar * result) +{ + NumericVar x; + NumericVar xpow; + NumericVar ifac; + NumericVar elem; + NumericVar ni; + int d; + int i; + int ndiv2 = 0; + bool xneg = FALSE; + int save_global_rscale; init_var(&x); init_var(&xpow); @@ -3239,7 +3253,7 @@ exp_var(NumericVar *arg, NumericVar *result) global_rscale = global_rscale / 2 + save_global_rscale + 8; - while(cmp_var(&x, &const_one) > 0) + while (cmp_var(&x, &const_one) > 0) { ndiv2++; global_rscale++; @@ -3290,15 +3304,15 @@ exp_var(NumericVar *arg, NumericVar *result) * ---------- */ static void -ln_var(NumericVar *arg, NumericVar *result) +ln_var(NumericVar * arg, NumericVar * result) { - NumericVar x; - NumericVar xx; - NumericVar ni; - NumericVar elem; - NumericVar fact; - int i; - int save_global_rscale; + NumericVar x; + NumericVar xx; + NumericVar ni; + NumericVar elem; + NumericVar fact; + int i; + int save_global_rscale; if (cmp_var(arg, &const_zero) <= 0) { @@ -3368,7 +3382,7 @@ ln_var(NumericVar *arg, NumericVar *result) * ---------- */ static void -log_var(NumericVar *base, NumericVar *num, NumericVar *result) +log_var(NumericVar * base, NumericVar * num, NumericVar * result) { NumericVar ln_base; NumericVar ln_num; @@ -3379,10 +3393,10 @@ log_var(NumericVar *base, NumericVar *num, NumericVar *result) init_var(&ln_num); ln_var(base, &ln_base); - ln_var(num, &ln_num); + ln_var(num, &ln_num); global_rscale -= 8; - + div_var(&ln_num, &ln_base, result); free_var(&ln_num); @@ -3397,7 +3411,7 @@ log_var(NumericVar *base, NumericVar *num, NumericVar *result) * ---------- */ static void -power_var(NumericVar *base, NumericVar *exp, NumericVar *result) +power_var(NumericVar * base, NumericVar * exp, NumericVar * result) { NumericVar ln_base; NumericVar ln_num; @@ -3415,7 +3429,7 @@ power_var(NumericVar *base, NumericVar *exp, NumericVar *result) global_rscale = save_global_rscale; exp_var(&ln_num, result); - + free_var(&ln_num); free_var(&ln_base); @@ -3441,22 +3455,24 @@ power_var(NumericVar *base, NumericVar *exp, NumericVar *result) * ---------- */ static int -cmp_abs(NumericVar *var1, NumericVar *var2) +cmp_abs(NumericVar * var1, NumericVar * var2) { - int i1 = 0; - int i2 = 0; - int w1 = var1->weight; - int w2 = var2->weight; - int stat; + int i1 = 0; + int i2 = 0; + int w1 = var1->weight; + int w2 = var2->weight; + int stat; while (w1 > w2 && i1 < var1->ndigits) { - if (var1->digits[i1++] != 0) return 1; + if (var1->digits[i1++] != 0) + return 1; w1--; } while (w2 > w1 && i2 < var2->ndigits) { - if (var2->digits[i2++] != 0) return -1; + if (var2->digits[i2++] != 0) + return -1; w2--; } @@ -3497,16 +3513,18 @@ cmp_abs(NumericVar *var1, NumericVar *var2) * ---------- */ static void -add_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) +add_abs(NumericVar * var1, NumericVar * var2, NumericVar * result) { - NumericDigitBuf *res_buf; - NumericDigit *res_digits; - int res_ndigits; - int res_weight; - int res_rscale; - int res_dscale; - int i, i1, i2; - int carry = 0; + NumericDigitBuf *res_buf; + NumericDigit *res_digits; + int res_ndigits; + int res_weight; + int res_rscale; + int res_dscale; + int i, + i1, + i2; + int carry = 0; res_weight = MAX(var1->weight, var2->weight) + 1; res_rscale = MAX(var1->rscale, var2->rscale); @@ -3514,7 +3532,7 @@ add_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) res_ndigits = res_rscale + res_weight + 1; res_buf = digitbuf_alloc(res_ndigits); - res_digits = ((NumericDigit *)res_buf) + sizeof(NumericDigitBuf); + res_digits = ((NumericDigit *) res_buf) + sizeof(NumericDigitBuf); i1 = res_rscale + var1->weight + 1; i2 = res_rscale + var2->weight + 1; @@ -3538,20 +3556,18 @@ add_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) res_ndigits--; } while (res_ndigits > 0 && res_digits[res_ndigits - 1] == 0) - { res_ndigits--; - } if (res_ndigits == 0) res_weight = 0; digitbuf_free(result->buf); result->ndigits = res_ndigits; - result->buf = res_buf; - result->digits = res_digits; - result->weight = res_weight; - result->rscale = res_rscale; - result->dscale = res_dscale; + result->buf = res_buf; + result->digits = res_digits; + result->weight = res_weight; + result->rscale = res_rscale; + result->dscale = res_dscale; } @@ -3566,16 +3582,18 @@ add_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) * ---------- */ static void -sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) +sub_abs(NumericVar * var1, NumericVar * var2, NumericVar * result) { - NumericDigitBuf *res_buf; - NumericDigit *res_digits; - int res_ndigits; - int res_weight; - int res_rscale; - int res_dscale; - int i, i1, i2; - int borrow = 0; + NumericDigitBuf *res_buf; + NumericDigit *res_digits; + int res_ndigits; + int res_weight; + int res_rscale; + int res_dscale; + int i, + i1, + i2; + int borrow = 0; res_weight = var1->weight; res_rscale = MAX(var1->rscale, var2->rscale); @@ -3583,7 +3601,7 @@ sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) res_ndigits = res_rscale + res_weight + 1; res_buf = digitbuf_alloc(res_ndigits); - res_digits = ((NumericDigit *)res_buf) + sizeof(NumericDigitBuf); + res_digits = ((NumericDigit *) res_buf) + sizeof(NumericDigitBuf); i1 = res_rscale + var1->weight + 1; i2 = res_rscale + var2->weight + 1; @@ -3615,20 +3633,16 @@ sub_abs(NumericVar *var1, NumericVar *var2, NumericVar *result) res_ndigits--; } while (res_ndigits > 0 && res_digits[res_ndigits - 1] == 0) - { res_ndigits--; - } if (res_ndigits == 0) res_weight = 0; digitbuf_free(result->buf); result->ndigits = res_ndigits; - result->buf = res_buf; - result->digits = res_digits; - result->weight = res_weight; - result->rscale = res_rscale; - result->dscale = res_dscale; + result->buf = res_buf; + result->digits = res_digits; + result->weight = res_weight; + result->rscale = res_rscale; + result->dscale = res_dscale; } - - |