diff options
author | Bruce Momjian <bruce@momjian.us> | 1997-09-07 05:04:48 +0000 |
---|---|---|
committer | Bruce Momjian <bruce@momjian.us> | 1997-09-07 05:04:48 +0000 |
commit | 1ccd423235a48739d6f7a4d7889705b5f9ecc69b (patch) | |
tree | 8001c4e839dfad8f29ceda7f8c5f5dbb8759b564 /src/backend/utils/adt/numutils.c | |
parent | 8fecd4febf8357f3cc20383ed29ced484877d5ac (diff) | |
download | postgresql-1ccd423235a48739d6f7a4d7889705b5f9ecc69b.tar.gz postgresql-1ccd423235a48739d6f7a4d7889705b5f9ecc69b.zip |
Massive commit to run PGINDENT on all *.c and *.h files.
Diffstat (limited to 'src/backend/utils/adt/numutils.c')
-rw-r--r-- | src/backend/utils/adt/numutils.c | 687 |
1 files changed, 363 insertions, 324 deletions
diff --git a/src/backend/utils/adt/numutils.c b/src/backend/utils/adt/numutils.c index 7f14317a700..3fd4ae382be 100644 --- a/src/backend/utils/adt/numutils.c +++ b/src/backend/utils/adt/numutils.c @@ -1,410 +1,449 @@ /*------------------------------------------------------------------------- * * numutils.c-- - * utility functions for I/O of built-in numeric types. + * utility functions for I/O of built-in numeric types. * - * integer: itoa, ltoa - * floating point: ftoa, atof1 + * integer: itoa, ltoa + * floating point: ftoa, atof1 * * Copyright (c) 1994, Regents of the University of California * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/numutils.c,v 1.13 1997/08/19 21:34:51 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/numutils.c,v 1.14 1997/09/07 04:50:33 momjian Exp $ * *------------------------------------------------------------------------- */ -#include <stdio.h> /* for sprintf() */ +#include <stdio.h> /* for sprintf() */ #include <errno.h> #include <math.h> #include "postgres.h" #include "utils/builtins.h" /* where the declarations go */ #ifndef HAVE_MEMMOVE -# include <regex/utils.h> +#include <regex/utils.h> #else -# include <string.h> +#include <string.h> #endif -#include <port-protos.h> /* ecvt(), fcvt() */ +#include <port-protos.h> /* ecvt(), fcvt() */ int32 pg_atoi(char *s, int size, int c) { - long l; - char *badp = (char *) NULL; - - Assert(s); - - errno = 0; - l = strtol(s, &badp, 10); - if (errno) /* strtol must set ERANGE */ - elog(WARN, "pg_atoi: error reading \"%s\": %m", s); - if (badp && *badp && (*badp != c)) - elog(WARN, "pg_atoi: error in \"%s\": can\'t parse \"%s\"", s, badp); - - switch (size) { - case sizeof(int32): + long l; + char *badp = (char *) NULL; + + Assert(s); + + errno = 0; + l = strtol(s, &badp, 10); + if (errno) /* strtol must set ERANGE */ + elog(WARN, "pg_atoi: error reading \"%s\": %m", s); + if (badp && *badp && (*badp != c)) + elog(WARN, "pg_atoi: error in \"%s\": can\'t parse \"%s\"", s, badp); + + switch (size) + { + case sizeof(int32): #ifdef HAS_LONG_LONG - /* won't get ERANGE on these with 64-bit longs... */ - if (l < -0x80000000L) { - errno = ERANGE; - elog(WARN, "pg_atoi: error reading \"%s\": %m", s); - } - if (l > 0x7fffffffL) { - errno = ERANGE; - elog(WARN, "pg_atoi: error reading \"%s\": %m", s); - } -#endif /* HAS_LONG_LONG */ - break; - case sizeof(int16): - if (l < -0x8000) { - errno = ERANGE; - elog(WARN, "pg_atoi: error reading \"%s\": %m", s); - } - if (l > 0x7fff) { - errno = ERANGE; - elog(WARN, "pg_atoi: error reading \"%s\": %m", s); - } - break; - case sizeof(int8): - if (l < -0x80) { - errno = ERANGE; - elog(WARN, "pg_atoi: error reading \"%s\": %m", s); - } - if (l > 0x7f) { - errno = ERANGE; - elog(WARN, "pg_atoi: error reading \"%s\": %m", s); + /* won't get ERANGE on these with 64-bit longs... */ + if (l < -0x80000000L) + { + errno = ERANGE; + elog(WARN, "pg_atoi: error reading \"%s\": %m", s); + } + if (l > 0x7fffffffL) + { + errno = ERANGE; + elog(WARN, "pg_atoi: error reading \"%s\": %m", s); + } +#endif /* HAS_LONG_LONG */ + break; + case sizeof(int16): + if (l < -0x8000) + { + errno = ERANGE; + elog(WARN, "pg_atoi: error reading \"%s\": %m", s); + } + if (l > 0x7fff) + { + errno = ERANGE; + elog(WARN, "pg_atoi: error reading \"%s\": %m", s); + } + break; + case sizeof(int8): + if (l < -0x80) + { + errno = ERANGE; + elog(WARN, "pg_atoi: error reading \"%s\": %m", s); + } + if (l > 0x7f) + { + errno = ERANGE; + elog(WARN, "pg_atoi: error reading \"%s\": %m", s); + } + break; + default: + elog(WARN, "pg_atoi: invalid result size: %d", size); } - break; - default: - elog(WARN, "pg_atoi: invalid result size: %d", size); - } - return((int32) l); + return ((int32) l); } /* - * itoa - converts a short int to its string represention + * itoa - converts a short int to its string represention * - * Note: - * previously based on ~ingres/source/gutil/atoi.c - * now uses vendor's sprintf conversion + * Note: + * previously based on ~ingres/source/gutil/atoi.c + * now uses vendor's sprintf conversion */ void itoa(int i, char *a) { - sprintf(a, "%hd", (short)i); + sprintf(a, "%hd", (short) i); } /* - * ltoa - converts a long int to its string represention + * ltoa - converts a long int to its string represention * - * Note: - * previously based on ~ingres/source/gutil/atoi.c - * now uses vendor's sprintf conversion + * Note: + * previously based on ~ingres/source/gutil/atoi.c + * now uses vendor's sprintf conversion */ void ltoa(int32 l, char *a) { - sprintf(a, "%d", l); + sprintf(a, "%d", l); } /* - ** ftoa - FLOATING POINT TO ASCII CONVERSION + ** ftoa - FLOATING POINT TO ASCII CONVERSION ** - ** CODE derived from ingres, ~ingres/source/gutil/ftoa.c + ** CODE derived from ingres, ~ingres/source/gutil/ftoa.c ** - ** 'Value' is converted to an ascii character string and stored - ** into 'ascii'. Ascii should have room for at least 'width' + 1 - ** characters. 'Width' is the width of the output field (max). - ** 'Prec' is the number of characters to put after the decimal - ** point. The format of the output string is controlled by - ** 'format'. + ** 'Value' is converted to an ascii character string and stored + ** into 'ascii'. Ascii should have room for at least 'width' + 1 + ** characters. 'Width' is the width of the output field (max). + ** 'Prec' is the number of characters to put after the decimal + ** point. The format of the output string is controlled by + ** 'format'. ** - ** 'Format' can be: - ** e or E: "E" format output - ** f or F: "F" format output - ** g or G: "F" format output if it will fit, otherwise - ** use "E" format. - ** n or N: same as G, but decimal points will not always - ** be aligned. + ** 'Format' can be: + ** e or E: "E" format output + ** f or F: "F" format output + ** g or G: "F" format output if it will fit, otherwise + ** use "E" format. + ** n or N: same as G, but decimal points will not always + ** be aligned. ** - ** If 'format' is upper case, the "E" comes out in upper case; - ** otherwise it comes out in lower case. + ** If 'format' is upper case, the "E" comes out in upper case; + ** otherwise it comes out in lower case. ** - ** When the field width is not big enough, it fills the field with - ** stars ("*****") and returns zero. Normal return is the width - ** of the output field (sometimes shorter than 'width'). + ** When the field width is not big enough, it fills the field with + ** stars ("*****") and returns zero. Normal return is the width + ** of the output field (sometimes shorter than 'width'). */ #ifdef NOT_USED int ftoa(double value, char *ascii, int width, int prec1, char format) { #ifndef HAVE_FCVT - char out[256]; - char fmt[256]; - int ret; + char out[256]; + char fmt[256]; + int ret; sprintf(fmt, "%%%d.%d%c", width, prec1, format); sprintf(out, fmt, value); - if ((ret = strlen(out)) > width) { + if ((ret = strlen(out)) > width) + { memset(ascii, '*', width - 2); ascii[width] = 0; - return(0); + return (0); } strcpy(ascii, out); - return(ret); + return (ret); #else - auto int expon; - auto int sign; - register int avail = 0; - register char *a = NULL; - register char *p = NULL; - char mode; - int lowercase; - int prec; -/* extern char *ecvt(), *fcvt();*/ - - prec = prec1; - mode = format; - lowercase = 'a' - 'A'; - if (mode >= 'a') - mode -= 'a' - 'A'; - else - lowercase = 0; - - if (mode != 'E') { - /* try 'F' style output */ - p = fcvt(value, prec, &expon, &sign); - avail = width; - a = ascii; - - /* output sign */ - if (sign) { - avail--; - *a++ = '-'; + auto int expon; + auto int sign; + register int avail = 0; + register char *a = NULL; + register char *p = NULL; + char mode; + int lowercase; + int prec; + +/* extern char *ecvt(), *fcvt();*/ + + prec = prec1; + mode = format; + lowercase = 'a' - 'A'; + if (mode >= 'a') + mode -= 'a' - 'A'; + else + lowercase = 0; + + if (mode != 'E') + { + /* try 'F' style output */ + p = fcvt(value, prec, &expon, &sign); + avail = width; + a = ascii; + + /* output sign */ + if (sign) + { + avail--; + *a++ = '-'; + } + + /* output '0' before the decimal point */ + if (expon <= 0) + { + *a++ = '0'; + avail--; + } + + /* compute space length left after dec pt and fraction */ + avail -= prec + 1; + if (mode == 'G') + avail -= 4; + + if (avail >= expon) + { + + /* it fits. output */ + while (expon > 0) + { + /* output left of dp */ + expon--; + if (*p) + { + *a++ = *p++; + } + else + *a++ = '0'; + } + + /* output fraction (right of dec pt) */ + avail = expon; + goto frac_out; + } + /* won't fit; let's hope for G format */ } - - /* output '0' before the decimal point */ - if (expon <= 0) { - *a++ = '0'; - avail--; + + if (mode != 'F') + { + /* try to do E style output */ + p = ecvt(value, prec + 1, &expon, &sign); + avail = width - 5; + a = ascii; + + /* output the sign */ + if (sign) + { + *a++ = '-'; + avail--; + } } - - /* compute space length left after dec pt and fraction */ - avail -= prec + 1; - if (mode == 'G') - avail -= 4; - - if (avail >= expon) { - - /* it fits. output */ - while (expon > 0) { - /* output left of dp */ - expon--; - if (*p) { - *a++ = *p++; - } else - *a++ = '0'; - } - - /* output fraction (right of dec pt) */ - avail = expon; - goto frac_out; + + /* check for field too small */ + if (mode == 'F' || avail < prec) + { + /* sorry joker, you lose */ + a = ascii; + for (avail = width; avail > 0; avail--) + *a++ = '*'; + *a = 0; + return (0); } - /* won't fit; let's hope for G format */ - } - - if (mode != 'F') { - /* try to do E style output */ - p = ecvt(value, prec + 1, &expon, &sign); - avail = width - 5; - a = ascii; - - /* output the sign */ - if (sign) { - *a++ = '-'; - avail--; + + /* it fits; output the number */ + mode = 'E'; + + /* output the LHS single digit */ + *a++ = *p++; + expon--; + + /* output the rhs */ + avail = 1; + +frac_out: + *a++ = '.'; + while (prec > 0) + { + prec--; + if (avail < 0) + { + avail++; + *a++ = '0'; + } + else + { + if (*p) + *a++ = *p++; + else + *a++ = '0'; + } } - } - - /* check for field too small */ - if (mode == 'F' || avail < prec) { - /* sorry joker, you lose */ - a = ascii; - for (avail = width; avail > 0; avail--) - *a++ = '*'; - *a = 0; - return (0); - } - - /* it fits; output the number */ - mode = 'E'; - - /* output the LHS single digit */ - *a++ = *p++; - expon--; - - /* output the rhs */ - avail = 1; - - frac_out: - *a++ = '.'; - while (prec > 0) { - prec--; - if (avail < 0) { - avail++; - *a++ = '0'; - } else { - if (*p) - *a++ = *p++; - else - *a++ = '0'; + + /* output the exponent */ + if (mode == 'E') + { + *a++ = 'E' + lowercase; + if (expon < 0) + { + *a++ = '-'; + expon = -expon; + } + else + *a++ = '+'; + *a++ = (expon / 10) % 10 + '0'; + *a++ = expon % 10 + '0'; } - } - - /* output the exponent */ - if (mode == 'E') { - *a++ = 'E' + lowercase; - if (expon < 0) { - *a++ = '-'; - expon = -expon; - } else - *a++ = '+'; - *a++ = (expon / 10) % 10 + '0'; - *a++ = expon % 10 + '0'; - } - - /* output spaces on the end in G format */ - if (mode == 'G') { - *a++ = ' '; - *a++ = ' '; - *a++ = ' '; - *a++ = ' '; - } - - /* finally, we can return */ - *a = 0; - avail = a - ascii; - return (avail); -#endif /* !BSD44_derived */ + + /* output spaces on the end in G format */ + if (mode == 'G') + { + *a++ = ' '; + *a++ = ' '; + *a++ = ' '; + *a++ = ' '; + } + + /* finally, we can return */ + *a = 0; + avail = a - ascii; + return (avail); +#endif /* !BSD44_derived */ } + #endif /* - ** atof1 - ASCII TO FLOATING CONVERSION + ** atof1 - ASCII TO FLOATING CONVERSION ** - ** CODE derived from ~ingres/source/gutil/atof.c + ** CODE derived from ~ingres/source/gutil/atof.c ** - ** Converts the string 'str' to floating point and stores the - ** result into the cell pointed to by 'val'. + ** Converts the string 'str' to floating point and stores the + ** result into the cell pointed to by 'val'. ** - ** The syntax which it accepts is pretty much what you would - ** expect. Basically, it is: - ** {<sp>} [+|-] {<sp>} {<digit>} [.{digit}] {<sp>} [<exp>] - ** where <exp> is "e" or "E" followed by an integer, <sp> is a - ** space character, <digit> is zero through nine, [] is zero or - ** one, and {} is zero or more. + ** The syntax which it accepts is pretty much what you would + ** expect. Basically, it is: + ** {<sp>} [+|-] {<sp>} {<digit>} [.{digit}] {<sp>} [<exp>] + ** where <exp> is "e" or "E" followed by an integer, <sp> is a + ** space character, <digit> is zero through nine, [] is zero or + ** one, and {} is zero or more. ** - ** Parameters: - ** str -- string to convert. - ** val -- pointer to place to put the result (which - ** must be type double). + ** Parameters: + ** str -- string to convert. + ** val -- pointer to place to put the result (which + ** must be type double). ** - ** Returns: - ** zero -- ok. - ** -1 -- syntax error. - ** +1 -- overflow (not implemented). + ** Returns: + ** zero -- ok. + ** -1 -- syntax error. + ** +1 -- overflow (not implemented). ** - ** Side Effects: - ** clobbers *val. + ** Side Effects: + ** clobbers *val. */ #ifdef NOT_USED int atof1(char *str, double *val) { - register char *p; - double v; - double fact; - int minus; - register char c; - int expon; - register int gotmant; - - v = 0.0; - p = str; - minus = 0; - - /* skip leading blanks */ - while ((c = *p) != '\0') { - if (c != ' ') - break; - p++; - } - - /* handle possible sign */ - switch (c) { - case '-': - minus++; - - case '+': - p++; - } - - /* skip blanks after sign */ - while ((c = *p) != '\0') { - if (c != ' ') - break; - p++; - } - - /* start collecting the number to the decimal point */ - gotmant = 0; - for (;;) { - c = *p; - if (c < '0' || c > '9') - break; - v = v * 10.0 + (c - '0'); - gotmant++; - p++; - } - - /* check for fractional part */ - if (c == '.') { - fact = 1.0; - for (;;) { - c = *++p; - if (c < '0' || c > '9') - break; - fact *= 0.1; - v += (c - '0') * fact; - gotmant++; + register char *p; + double v; + double fact; + int minus; + register char c; + int expon; + register int gotmant; + + v = 0.0; + p = str; + minus = 0; + + /* skip leading blanks */ + while ((c = *p) != '\0') + { + if (c != ' ') + break; + p++; + } + + /* handle possible sign */ + switch (c) + { + case '-': + minus++; + + case '+': + p++; } - } - - /* skip blanks before possible exponent */ - while ((c = *p) != '\0') { - if (c != ' ') - break; - p++; - } - - /* test for exponent */ - if (c == 'e' || c == 'E') { - p++; - expon = pg_atoi(p, sizeof(expon), '\0'); - if (!gotmant) - v = 1.0; - fact = expon; - v *= pow(10.0, fact); - } else { - /* if no exponent, then nothing */ - if (c != 0) - return (-1); - } - - /* store the result and exit */ - if (minus) - v = -v; - *val = v; - return (0); + + /* skip blanks after sign */ + while ((c = *p) != '\0') + { + if (c != ' ') + break; + p++; + } + + /* start collecting the number to the decimal point */ + gotmant = 0; + for (;;) + { + c = *p; + if (c < '0' || c > '9') + break; + v = v * 10.0 + (c - '0'); + gotmant++; + p++; + } + + /* check for fractional part */ + if (c == '.') + { + fact = 1.0; + for (;;) + { + c = *++p; + if (c < '0' || c > '9') + break; + fact *= 0.1; + v += (c - '0') * fact; + gotmant++; + } + } + + /* skip blanks before possible exponent */ + while ((c = *p) != '\0') + { + if (c != ' ') + break; + p++; + } + + /* test for exponent */ + if (c == 'e' || c == 'E') + { + p++; + expon = pg_atoi(p, sizeof(expon), '\0'); + if (!gotmant) + v = 1.0; + fact = expon; + v *= pow(10.0, fact); + } + else + { + /* if no exponent, then nothing */ + if (c != 0) + return (-1); + } + + /* store the result and exit */ + if (minus) + v = -v; + *val = v; + return (0); } + #endif |