#include "postgres_fe.h"
#include <math.h>
#include <ctype.h>
#include <limits.h>
#include <ecpgtype.h>
#include <ecpg_informix.h>
#include <pgtypes_error.h>
#include <pgtypes_date.h>
#include <pgtypes_numeric.h>
#include <sqltypes.h>
#include <sqlca.h>
#include <ecpgerrno.h>
Go to the source code of this file.
Defines | |
#define | POSTGRES_ECPG_INTERNAL |
Functions | |
static int | deccall2 (decimal *arg1, decimal *arg2, int(*ptr)(numeric *, numeric *)) |
static int | deccall3 (decimal *arg1, decimal *arg2, decimal *result, int(*ptr)(numeric *, numeric *, numeric *)) |
int | decadd (decimal *arg1, decimal *arg2, decimal *sum) |
int | deccmp (decimal *arg1, decimal *arg2) |
void | deccopy (decimal *src, decimal *target) |
static char * | ecpg_strndup (const char *str, size_t len) |
int | deccvasc (char *cp, int len, decimal *np) |
int | deccvdbl (double dbl, decimal *np) |
int | deccvint (int in, decimal *np) |
int | deccvlong (long lng, decimal *np) |
int | decdiv (decimal *n1, decimal *n2, decimal *result) |
int | decmul (decimal *n1, decimal *n2, decimal *result) |
int | decsub (decimal *n1, decimal *n2, decimal *result) |
int | dectoasc (decimal *np, char *cp, int len, int right) |
int | dectodbl (decimal *np, double *dblp) |
int | dectoint (decimal *np, int *ip) |
int | dectolong (decimal *np, long *lngp) |
int | rdatestr (date d, char *str) |
int | rstrdate (char *str, date *d) |
void | rtoday (date *d) |
int | rjulmdy (date d, short mdy[3]) |
int | rdefmtdate (date *d, char *fmt, char *str) |
int | rfmtdate (date d, char *fmt, char *str) |
int | rmdyjul (short mdy[3], date *d) |
int | rdayofweek (date d) |
void | dtcurrent (timestamp *ts) |
int | dtcvasc (char *str, timestamp *ts) |
int | dtcvfmtasc (char *inbuf, char *fmtstr, timestamp *dtvalue) |
int | dtsub (timestamp *ts1, timestamp *ts2, interval *iv) |
int | dttoasc (timestamp *ts, char *output) |
int | dttofmtasc (timestamp *ts, char *output, int str_len, char *fmtstr) |
int | intoasc (interval *i, char *str) |
static int | initValue (long lng_val) |
static int | getRightMostDot (char *str) |
int | rfmtlong (long lng_val, char *fmt, char *outbuf) |
void | rupshift (char *str) |
int | byleng (char *str, int len) |
void | ldchar (char *src, int len, char *dest) |
int | rgetmsg (int msgnum, char *s, int maxsize) |
int | rtypalign (int offset, int type) |
int | rtypmsize (int type, int len) |
int | rtypwidth (int sqltype, int sqllen) |
void | ECPG_informix_set_var (int number, void *pointer, int lineno) |
void * | ECPG_informix_get_var (int number) |
void | ECPG_informix_reset_sqlca (void) |
int | rsetnull (int t, char *ptr) |
int | risnull (int t, char *ptr) |
Variables | |
static struct sqlca_t | sqlca_init |
struct { | |
long val | |
int maxdigits | |
int digits | |
int remaining | |
char sign | |
char * val_string | |
} | value |
#define POSTGRES_ECPG_INTERNAL |
Definition at line 3 of file informix.c.
int byleng | ( | char * | str, | |
int | len | |||
) |
Definition at line 968 of file informix.c.
Referenced by ldchar(), and main().
{ for (len--; str[len] && str[len] == ' '; len--); return (len + 1); }
Definition at line 151 of file informix.c.
References deccall3(), PGTYPES_NUM_OVERFLOW, PGTYPES_NUM_UNDERFLOW, and PGTYPESnumeric_add().
Referenced by main().
{ errno = 0; deccall3(arg1, arg2, sum, PGTYPESnumeric_add); if (errno == PGTYPES_NUM_OVERFLOW) return ECPG_INFORMIX_NUM_OVERFLOW; else if (errno == PGTYPES_NUM_UNDERFLOW) return ECPG_INFORMIX_NUM_UNDERFLOW; else if (errno != 0) return -1; else return 0; }
Definition at line 48 of file informix.c.
References a1, a2, i, NULL, PGTYPESnumeric_free(), PGTYPESnumeric_from_decimal(), and PGTYPESnumeric_new().
Referenced by deccmp().
{ numeric *a1, *a2; int i; if ((a1 = PGTYPESnumeric_new()) == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; if ((a2 = PGTYPESnumeric_new()) == NULL) { PGTYPESnumeric_free(a1); return ECPG_INFORMIX_OUT_OF_MEMORY; } if (PGTYPESnumeric_from_decimal(arg1, a1) != 0) { PGTYPESnumeric_free(a1); PGTYPESnumeric_free(a2); return ECPG_INFORMIX_OUT_OF_MEMORY; } if (PGTYPESnumeric_from_decimal(arg2, a2) != 0) { PGTYPESnumeric_free(a1); PGTYPESnumeric_free(a2); return ECPG_INFORMIX_OUT_OF_MEMORY; } i = (*ptr) (a1, a2); PGTYPESnumeric_free(a1); PGTYPESnumeric_free(a2); return (i); }
static int deccall3 | ( | decimal * | arg1, | |
decimal * | arg2, | |||
decimal * | result, | |||
int(*)(numeric *, numeric *, numeric *) | ptr | |||
) | [static] |
Definition at line 86 of file informix.c.
References a1, a2, CDECIMALTYPE, i, NULL, PGTYPESnumeric_free(), PGTYPESnumeric_from_decimal(), PGTYPESnumeric_new(), PGTYPESnumeric_to_decimal(), risnull(), and rsetnull().
Referenced by decadd(), decdiv(), decmul(), and decsub().
{ numeric *a1, *a2, *nres; int i; /* * we must NOT set the result to NULL here because it may be the same * variable as one of the arguments */ if (risnull(CDECIMALTYPE, (char *) arg1) || risnull(CDECIMALTYPE, (char *) arg2)) return 0; if ((a1 = PGTYPESnumeric_new()) == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; if ((a2 = PGTYPESnumeric_new()) == NULL) { PGTYPESnumeric_free(a1); return ECPG_INFORMIX_OUT_OF_MEMORY; } if ((nres = PGTYPESnumeric_new()) == NULL) { PGTYPESnumeric_free(a1); PGTYPESnumeric_free(a2); return ECPG_INFORMIX_OUT_OF_MEMORY; } if (PGTYPESnumeric_from_decimal(arg1, a1) != 0) { PGTYPESnumeric_free(a1); PGTYPESnumeric_free(a2); PGTYPESnumeric_free(nres); return ECPG_INFORMIX_OUT_OF_MEMORY; } if (PGTYPESnumeric_from_decimal(arg2, a2) != 0) { PGTYPESnumeric_free(a1); PGTYPESnumeric_free(a2); PGTYPESnumeric_free(nres); return ECPG_INFORMIX_OUT_OF_MEMORY; } i = (*ptr) (a1, a2, nres); if (i == 0) /* No error */ { /* set the result to null in case it errors out later */ rsetnull(CDECIMALTYPE, (char *) result); PGTYPESnumeric_to_decimal(nres, result); } PGTYPESnumeric_free(nres); PGTYPESnumeric_free(a1); PGTYPESnumeric_free(a2); return (i); }
Definition at line 167 of file informix.c.
References deccall2(), and PGTYPESnumeric_cmp().
Referenced by main().
{ return (deccall2(arg1, arg2, PGTYPESnumeric_cmp)); }
Definition at line 173 of file informix.c.
{ memcpy(target, src, sizeof(decimal)); }
int deccvasc | ( | char * | cp, | |
int | len, | |||
decimal * | np | |||
) |
Definition at line 198 of file informix.c.
References CDECIMALTYPE, CSTRINGTYPE, ecpg_strndup(), free, i, NULL, PGTYPES_NUM_BAD_NUMERIC, PGTYPES_NUM_OVERFLOW, PGTYPESnumeric_free(), PGTYPESnumeric_from_asc(), PGTYPESnumeric_to_decimal(), risnull(), and rsetnull().
Referenced by main().
{ char *str; int ret = 0; numeric *result; rsetnull(CDECIMALTYPE, (char *) np); if (risnull(CSTRINGTYPE, cp)) return 0; str = ecpg_strndup(cp, len);/* decimal_in always converts the complete * string */ if (!str) ret = ECPG_INFORMIX_NUM_UNDERFLOW; else { errno = 0; result = PGTYPESnumeric_from_asc(str, NULL); if (!result) { switch (errno) { case PGTYPES_NUM_OVERFLOW: ret = ECPG_INFORMIX_NUM_OVERFLOW; break; case PGTYPES_NUM_BAD_NUMERIC: ret = ECPG_INFORMIX_BAD_NUMERIC; break; default: ret = ECPG_INFORMIX_BAD_EXPONENT; break; } } else { int i = PGTYPESnumeric_to_decimal(result, np); PGTYPESnumeric_free(result); if (i != 0) ret = ECPG_INFORMIX_NUM_OVERFLOW; } } free(str); return ret; }
int deccvdbl | ( | double | dbl, | |
decimal * | np | |||
) |
Definition at line 246 of file informix.c.
References CDECIMALTYPE, CDOUBLETYPE, NULL, PGTYPESnumeric_free(), PGTYPESnumeric_from_double(), PGTYPESnumeric_new(), PGTYPESnumeric_to_decimal(), risnull(), and rsetnull().
{ numeric *nres; int result = 1; rsetnull(CDECIMALTYPE, (char *) np); if (risnull(CDOUBLETYPE, (char *) &dbl)) return 0; nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; result = PGTYPESnumeric_from_double(dbl, nres); if (result == 0) result = PGTYPESnumeric_to_decimal(nres, np); PGTYPESnumeric_free(nres); return (result); }
int deccvint | ( | int | in, | |
decimal * | np | |||
) |
Definition at line 268 of file informix.c.
References CDECIMALTYPE, CINTTYPE, NULL, PGTYPESnumeric_free(), PGTYPESnumeric_from_int(), PGTYPESnumeric_new(), PGTYPESnumeric_to_decimal(), risnull(), and rsetnull().
Referenced by main().
{ numeric *nres; int result = 1; rsetnull(CDECIMALTYPE, (char *) np); if (risnull(CINTTYPE, (char *) &in)) return 0; nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; result = PGTYPESnumeric_from_int(in, nres); if (result == 0) result = PGTYPESnumeric_to_decimal(nres, np); PGTYPESnumeric_free(nres); return (result); }
int deccvlong | ( | long | lng, | |
decimal * | np | |||
) |
Definition at line 290 of file informix.c.
References CDECIMALTYPE, CLONGTYPE, NULL, PGTYPESnumeric_free(), PGTYPESnumeric_from_long(), PGTYPESnumeric_new(), PGTYPESnumeric_to_decimal(), risnull(), and rsetnull().
Referenced by main().
{ numeric *nres; int result = 1; rsetnull(CDECIMALTYPE, (char *) np); if (risnull(CLONGTYPE, (char *) &lng)) return 0; nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; result = PGTYPESnumeric_from_long(lng, nres); if (result == 0) result = PGTYPESnumeric_to_decimal(nres, np); PGTYPESnumeric_free(nres); return (result); }
Definition at line 312 of file informix.c.
References deccall3(), i, PGTYPES_NUM_DIVIDE_ZERO, PGTYPES_NUM_OVERFLOW, and PGTYPESnumeric_div().
Referenced by main().
{ int i; errno = 0; i = deccall3(n1, n2, result, PGTYPESnumeric_div); if (i != 0) switch (errno) { case PGTYPES_NUM_DIVIDE_ZERO: return ECPG_INFORMIX_DIVIDE_ZERO; break; case PGTYPES_NUM_OVERFLOW: return ECPG_INFORMIX_NUM_OVERFLOW; break; default: return ECPG_INFORMIX_NUM_UNDERFLOW; break; } return 0; }
Definition at line 338 of file informix.c.
References deccall3(), i, PGTYPES_NUM_OVERFLOW, and PGTYPESnumeric_mul().
Referenced by main().
{ int i; errno = 0; i = deccall3(n1, n2, result, PGTYPESnumeric_mul); if (i != 0) switch (errno) { case PGTYPES_NUM_OVERFLOW: return ECPG_INFORMIX_NUM_OVERFLOW; break; default: return ECPG_INFORMIX_NUM_UNDERFLOW; break; } return 0; }
Definition at line 360 of file informix.c.
References deccall3(), i, PGTYPES_NUM_OVERFLOW, and PGTYPESnumeric_sub().
Referenced by main().
{ int i; errno = 0; i = deccall3(n1, n2, result, PGTYPESnumeric_sub); if (i != 0) switch (errno) { case PGTYPES_NUM_OVERFLOW: return ECPG_INFORMIX_NUM_OVERFLOW; break; default: return ECPG_INFORMIX_NUM_UNDERFLOW; break; } return 0; }
int dectoasc | ( | decimal * | np, | |
char * | cp, | |||
int | len, | |||
int | right | |||
) |
Definition at line 382 of file informix.c.
References CDECIMALTYPE, CSTRINGTYPE, numeric::dscale, free, NULL, PGTYPESnumeric_free(), PGTYPESnumeric_from_decimal(), PGTYPESnumeric_new(), PGTYPESnumeric_to_asc(), risnull(), and rsetnull().
Referenced by dump_sqlda(), and main().
{ char *str; numeric *nres; rsetnull(CSTRINGTYPE, (char *) cp); if (risnull(CDECIMALTYPE, (char *) np)) return 0; nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; if (PGTYPESnumeric_from_decimal(np, nres) != 0) { PGTYPESnumeric_free(nres); return ECPG_INFORMIX_OUT_OF_MEMORY; } if (right >= 0) str = PGTYPESnumeric_to_asc(nres, right); else str = PGTYPESnumeric_to_asc(nres, nres->dscale); PGTYPESnumeric_free(nres); if (!str) return -1; /* * TODO: have to take care of len here and create exponential notation if * necessary */ if ((int) (strlen(str) + 1) > len) { if (len > 1) { cp[0] = '*'; cp[1] = '\0'; } free(str); return -1; } else { strcpy(cp, str); free(str); return 0; } }
int dectodbl | ( | decimal * | np, | |
double * | dblp | |||
) |
Definition at line 433 of file informix.c.
References i, NULL, PGTYPESnumeric_free(), PGTYPESnumeric_from_decimal(), PGTYPESnumeric_new(), and PGTYPESnumeric_to_double().
Referenced by main().
{ int i; numeric *nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; if (PGTYPESnumeric_from_decimal(np, nres) != 0) { PGTYPESnumeric_free(nres); return ECPG_INFORMIX_OUT_OF_MEMORY; } i = PGTYPESnumeric_to_double(nres, dblp); PGTYPESnumeric_free(nres); return i; }
int dectoint | ( | decimal * | np, | |
int * | ip | |||
) |
Definition at line 454 of file informix.c.
References NULL, PGTYPES_NUM_OVERFLOW, PGTYPESnumeric_free(), PGTYPESnumeric_from_decimal(), PGTYPESnumeric_new(), and PGTYPESnumeric_to_int().
Referenced by main().
{ int ret; numeric *nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; if (PGTYPESnumeric_from_decimal(np, nres) != 0) { PGTYPESnumeric_free(nres); return ECPG_INFORMIX_OUT_OF_MEMORY; } ret = PGTYPESnumeric_to_int(nres, ip); PGTYPESnumeric_free(nres); if (ret == PGTYPES_NUM_OVERFLOW) ret = ECPG_INFORMIX_NUM_OVERFLOW; return ret; }
int dectolong | ( | decimal * | np, | |
long * | lngp | |||
) |
Definition at line 478 of file informix.c.
References NULL, PGTYPES_NUM_OVERFLOW, PGTYPESnumeric_free(), PGTYPESnumeric_from_decimal(), PGTYPESnumeric_new(), and PGTYPESnumeric_to_long().
Referenced by main().
{ int ret; numeric *nres = PGTYPESnumeric_new(); if (nres == NULL) return ECPG_INFORMIX_OUT_OF_MEMORY; if (PGTYPESnumeric_from_decimal(np, nres) != 0) { PGTYPESnumeric_free(nres); return ECPG_INFORMIX_OUT_OF_MEMORY; } ret = PGTYPESnumeric_to_long(nres, lngp); PGTYPESnumeric_free(nres); if (ret == PGTYPES_NUM_OVERFLOW) ret = ECPG_INFORMIX_NUM_OVERFLOW; return ret; }
void dtcurrent | ( | timestamp * | ts | ) |
Definition at line 608 of file informix.c.
References PGTYPEStimestamp_current().
{ PGTYPEStimestamp_current(ts); }
int dtcvasc | ( | char * | str, | |
timestamp * | ts | |||
) |
Definition at line 614 of file informix.c.
References i, and PGTYPEStimestamp_from_asc().
{ timestamp ts_tmp; int i; char **endptr = &str; errno = 0; ts_tmp = PGTYPEStimestamp_from_asc(str, endptr); i = errno; if (i) /* TODO: rewrite to Informix error codes */ return i; if (**endptr) { /* extra characters exist at the end */ return ECPG_INFORMIX_EXTRA_CHARS; } /* TODO: other Informix error codes missing */ /* everything went fine */ *ts = ts_tmp; return 0; }
int dtcvfmtasc | ( | char * | inbuf, | |
char * | fmtstr, | |||
timestamp * | dtvalue | |||
) |
Definition at line 640 of file informix.c.
References PGTYPEStimestamp_defmt_asc().
{ return PGTYPEStimestamp_defmt_asc(inbuf, fmtstr, dtvalue); }
Definition at line 646 of file informix.c.
References PGTYPEStimestamp_sub().
{ return PGTYPEStimestamp_sub(ts1, ts2, iv); }
int dttoasc | ( | timestamp * | ts, | |
char * | output | |||
) |
Definition at line 652 of file informix.c.
References free, and PGTYPEStimestamp_to_asc().
{ char *asctime = PGTYPEStimestamp_to_asc(*ts); strcpy(output, asctime); free(asctime); return 0; }
int dttofmtasc | ( | timestamp * | ts, | |
char * | output, | |||
int | str_len, | |||
char * | fmtstr | |||
) |
Definition at line 662 of file informix.c.
References PGTYPEStimestamp_fmt_asc().
{ return PGTYPEStimestamp_fmt_asc(ts, output, str_len, fmtstr); }
void* ECPG_informix_get_var | ( | int | number | ) |
Definition at line 1023 of file informix.c.
References ECPGget_var().
{ return ECPGget_var(number); }
void ECPG_informix_reset_sqlca | ( | void | ) |
Definition at line 1029 of file informix.c.
References ECPGget_sqlca(), and sqlca.
Referenced by main().
{ struct sqlca_t *sqlca = ECPGget_sqlca(); memcpy((char *) sqlca, (char *) &sqlca_init, sizeof(struct sqlca_t)); }
void ECPG_informix_set_var | ( | int | number, | |
void * | pointer, | |||
int | lineno | |||
) |
Definition at line 1017 of file informix.c.
References ECPGset_var().
{ ECPGset_var(number, pointer, lineno); }
static char* ecpg_strndup | ( | const char * | str, | |
size_t | len | |||
) | [static] |
Definition at line 179 of file informix.c.
References malloc.
Referenced by deccvasc().
{ size_t real_len = strlen(str); int use_len = (int) ((real_len > len) ? len : real_len); char *new = malloc(use_len + 1); if (new) { memcpy(new, str, use_len); new[use_len] = '\0'; } else errno = ENOMEM; return new; }
static int getRightMostDot | ( | char * | str | ) | [static] |
Definition at line 747 of file informix.c.
References i.
Referenced by rfmtlong().
{ size_t len = strlen(str); int i, j; j = 0; for (i = len - 1; i >= 0; i--) { if (str[i] == '.') return len - j - 1; j++; } return -1; }
static int initValue | ( | long | lng_val | ) | [static] |
initialize the struct, which holds the different forms of the long value
Definition at line 699 of file informix.c.
References i, malloc, NULL, and value.
Referenced by rfmtlong().
{ int i, j; long l, dig; /* set some obvious things */ value.val = lng_val >= 0 ? lng_val : lng_val * (-1); value.sign = lng_val >= 0 ? '+' : '-'; value.maxdigits = log10(2) * (8 * sizeof(long) - 1); /* determine the number of digits */ i = 0; l = 1; do { i++; l *= 10; } while ((l - 1) < value.val && l <= LONG_MAX / 10); if (l <= LONG_MAX / 10) { value.digits = i; l /= 10; } else value.digits = i + 1; value.remaining = value.digits; /* convert the long to string */ if ((value.val_string = (char *) malloc(value.digits + 1)) == NULL) return -1; dig = value.val; for (i = value.digits, j = 0; i > 0; i--, j++) { value.val_string[j] = dig / l + '0'; dig = dig % l; l /= 10; } value.val_string[value.digits] = '\0'; return 0; }
int intoasc | ( | interval * | i, | |
char * | str | |||
) |
Definition at line 668 of file informix.c.
References PGTYPESinterval_to_asc().
{ errno = 0; str = PGTYPESinterval_to_asc(i); if (!str) return -errno; return 0; }
void ldchar | ( | char * | src, | |
int | len, | |||
char * | dest | |||
) |
int rdatestr | ( | date | d, | |
char * | str | |||
) |
Definition at line 503 of file informix.c.
References free, and PGTYPESdate_to_asc().
Referenced by date_test_defmt(), date_test_strdate(), and main().
{ char *tmp = PGTYPESdate_to_asc(d); if (!tmp) return ECPG_INFORMIX_DATE_CONVERT; /* move to user allocated buffer */ strcpy(str, tmp); free(tmp); return 0; }
int rdayofweek | ( | date | d | ) |
Definition at line 600 of file informix.c.
References PGTYPESdate_dayofweek().
{ return (PGTYPESdate_dayofweek(d)); }
int rdefmtdate | ( | date * | d, | |
char * | fmt, | |||
char * | str | |||
) |
Definition at line 549 of file informix.c.
References PGTYPES_DATE_BAD_DAY, PGTYPES_DATE_BAD_MONTH, PGTYPES_DATE_ERR_EARGS, PGTYPES_DATE_ERR_ENOSHORTDATE, PGTYPES_DATE_ERR_ENOTDMY, and PGTYPESdate_defmt_asc().
Referenced by date_test_defmt(), and rstrdate().
{ /* TODO: take care of DBCENTURY environment variable */ /* PGSQL functions allow all centuries */ errno = 0; if (PGTYPESdate_defmt_asc(d, fmt, str) == 0) return 0; switch (errno) { case PGTYPES_DATE_ERR_ENOSHORTDATE: return ECPG_INFORMIX_ENOSHORTDATE; case PGTYPES_DATE_ERR_EARGS: case PGTYPES_DATE_ERR_ENOTDMY: return ECPG_INFORMIX_ENOTDMY; case PGTYPES_DATE_BAD_DAY: return ECPG_INFORMIX_BAD_DAY; case PGTYPES_DATE_BAD_MONTH: return ECPG_INFORMIX_BAD_MONTH; default: return ECPG_INFORMIX_BAD_YEAR; } }
int rfmtdate | ( | date | d, | |
char * | fmt, | |||
char * | str | |||
) |
Definition at line 575 of file informix.c.
References PGTYPESdate_fmt_asc().
Referenced by date_test_fmt().
{ errno = 0; if (PGTYPESdate_fmt_asc(d, fmt, str) == 0) return 0; if (errno == ENOMEM) return ECPG_INFORMIX_OUT_OF_MEMORY; return ECPG_INFORMIX_DATE_CONVERT; }
int rfmtlong | ( | long | lng_val, | |
char * | fmt, | |||
char * | outbuf | |||
) |
Definition at line 765 of file informix.c.
References fmtchar(), free, getRightMostDot(), i, initValue(), malloc, sign, and value.
Referenced by fmtlong().
{ size_t fmt_len = strlen(fmt); size_t temp_len; int i, j, /* position in temp */ k, dotpos; int leftalign = 0, blank = 0, sign = 0, entitydone = 0, signdone = 0, brackets_ok = 0; char *temp; char tmp[2] = " "; char lastfmt = ' ', fmtchar = ' '; temp = (char *) malloc(fmt_len + 1); if (!temp) { errno = ENOMEM; return -1; } /* put all info about the long in a struct */ if (initValue(lng_val) == -1) { free(temp); errno = ENOMEM; return -1; } /* '<' is the only format, where we have to align left */ if (strchr(fmt, (int) '<')) leftalign = 1; /* '(' requires ')' */ if (strchr(fmt, (int) '(') && strchr(fmt, (int) ')')) brackets_ok = 1; /* get position of the right-most dot in the format-string */ /* and fill the temp-string wit '0's up to there. */ dotpos = getRightMostDot(fmt); /* start to parse the formatstring */ temp[0] = '\0'; k = value.digits - 1; /* position in the value_string */ for (i = fmt_len - 1, j = 0; i >= 0; i--, j++) { /* qualify, where we are in the value_string */ if (k < 0) { blank = 1; if (k == -1) sign = 1; if (leftalign) { /* can't use strncat(,,0) here, Solaris would freek out */ if (sign) if (signdone) { temp[j] = '\0'; break; } } } /* if we're right side of the right-most dot, print '0' */ if (dotpos >= 0 && dotpos <= i) { if (dotpos < i) { if (fmt[i] == ')') tmp[0] = value.sign == '-' ? ')' : ' '; else tmp[0] = '0'; } else tmp[0] = '.'; strcat(temp, tmp); continue; } /* the ',' needs special attention, if it is in the blank area */ if (blank && fmt[i] == ',') fmtchar = lastfmt; else fmtchar = fmt[i]; /* waiting for the sign */ if (k < 0 && leftalign && sign && !signdone && fmtchar != '+' && fmtchar != '-') continue; /* analyse this format-char */ switch (fmtchar) { case ',': tmp[0] = ','; k++; break; case '*': if (blank) tmp[0] = '*'; else tmp[0] = value.val_string[k]; break; case '&': if (blank) tmp[0] = '0'; else tmp[0] = value.val_string[k]; break; case '#': if (blank) tmp[0] = ' '; else tmp[0] = value.val_string[k]; break; case '-': if (sign && value.sign == '-' && !signdone) { tmp[0] = '-'; signdone = 1; } else if (blank) tmp[0] = ' '; else tmp[0] = value.val_string[k]; break; case '+': if (sign && !signdone) { tmp[0] = value.sign; signdone = 1; } else if (blank) tmp[0] = ' '; else tmp[0] = value.val_string[k]; break; case '(': if (sign && brackets_ok && value.sign == '-') tmp[0] = '('; else if (blank) tmp[0] = ' '; else tmp[0] = value.val_string[k]; break; case ')': if (brackets_ok && value.sign == '-') tmp[0] = ')'; else tmp[0] = ' '; break; case '$': if (blank && !entitydone) { tmp[0] = '$'; entitydone = 1; } else if (blank) tmp[0] = ' '; else tmp[0] = value.val_string[k]; break; case '<': tmp[0] = value.val_string[k]; break; default: tmp[0] = fmt[i]; } strcat(temp, tmp); lastfmt = fmt[i]; k--; } /* safety-net */ temp[fmt_len] = '\0'; /* reverse the temp-string and put it into the outbuf */ temp_len = strlen(temp); outbuf[0] = '\0'; for (i = temp_len - 1; i >= 0; i--) { tmp[0] = temp[i]; strcat(outbuf, tmp); } outbuf[temp_len] = '\0'; /* cleaning up */ free(temp); free(value.val_string); return 0; }
int rgetmsg | ( | int | msgnum, | |
char * | s, | |||
int | maxsize | |||
) |
Definition at line 984 of file informix.c.
{ (void) msgnum; /* keep the compiler quiet */ (void) s; /* keep the compiler quiet */ (void) maxsize; /* keep the compiler quiet */ return 0; }
int risnull | ( | int | t, | |
char * | ptr | |||
) |
Definition at line 1044 of file informix.c.
References ECPGis_noind_null().
Referenced by deccall3(), deccvasc(), deccvdbl(), deccvint(), deccvlong(), dectoasc(), main(), and test_null().
{ return (ECPGis_noind_null(t, ptr)); }
int rjulmdy | ( | date | d, | |
short | mdy[3] | |||
) |
Definition at line 537 of file informix.c.
References PGTYPESdate_julmdy().
{ int mdy_int[3]; PGTYPESdate_julmdy(d, mdy_int); mdy[0] = (short) mdy_int[0]; mdy[1] = (short) mdy_int[1]; mdy[2] = (short) mdy_int[2]; return 0; }
int rmdyjul | ( | short | mdy[3], | |
date * | d | |||
) |
Definition at line 588 of file informix.c.
References PGTYPESdate_mdyjul().
Referenced by main().
{ int mdy_int[3]; mdy_int[0] = mdy[0]; mdy_int[1] = mdy[1]; mdy_int[2] = mdy[2]; PGTYPESdate_mdyjul(mdy_int, d); return 0; }
int rsetnull | ( | int | t, | |
char * | ptr | |||
) |
Definition at line 1037 of file informix.c.
References ECPGset_noind_null().
Referenced by deccall3(), deccvasc(), deccvdbl(), deccvint(), deccvlong(), dectoasc(), and main().
{ ECPGset_noind_null(t, ptr); return 0; }
int rstrdate | ( | char * | str, | |
date * | d | |||
) |
Definition at line 524 of file informix.c.
References rdefmtdate().
Referenced by date_test_strdate().
{ return rdefmtdate(d, "mm/dd/yyyy", str); }
void rtoday | ( | date * | d | ) |
Definition at line 530 of file informix.c.
References PGTYPESdate_today().
{ PGTYPESdate_today(d); return; }
int rtypalign | ( | int | offset, | |
int | type | |||
) |
Definition at line 993 of file informix.c.
{ (void) offset; /* keep the compiler quiet */ (void) type; /* keep the compiler quiet */ return 0; }
int rtypmsize | ( | int | type, | |
int | len | |||
) |
Definition at line 1001 of file informix.c.
{ (void) type; /* keep the compiler quiet */ (void) len; /* keep the compiler quiet */ return 0; }
int rtypwidth | ( | int | sqltype, | |
int | sqllen | |||
) |
Definition at line 1009 of file informix.c.
{ (void) sqltype; /* keep the compiler quiet */ (void) sqllen; /* keep the compiler quiet */ return 0; }
void rupshift | ( | char * | str | ) |
Definition at line 959 of file informix.c.
Referenced by main().
{ for (; *str != '\0'; str++) if (islower((unsigned char) *str)) *str = toupper((unsigned char) *str); return; }
int digits |
Definition at line 688 of file informix.c.
Referenced by getbits(), getv4(), hash_numeric(), inet_cidr_pton_ipv4(), inet_cidr_pton_ipv6(), inet_net_pton_ipv4(), PGTYPESnumeric_div(), to_hex32(), and to_hex64().
int maxdigits |
Definition at line 687 of file informix.c.
Referenced by apply_typmod(), mul_var(), and numeric().
int remaining |
Definition at line 689 of file informix.c.
Referenced by aclmask(), ahwrite(), deconstruct_recurse(), do_pg_stop_backup(), PQescapeStringInternal(), pqSendSome(), and ValidXLogRecord().
char sign |
Definition at line 690 of file informix.c.
Referenced by _fmt(), _ltree_compress(), ECPGis_noind_null(), float4_to_char(), float8_to_char(), g_intbig_compress(), gethms(), ghstore_compress(), ghstore_consistent(), gist_qe(), gist_te(), gtrgm_compress(), gtrgm_consistent(), gtrgm_penalty(), gtrgm_picksplit(), gtsquery_compress(), gtsquery_union(), gtsvector_compress(), gtsvector_penalty(), gtsvector_picksplit(), int4_to_char(), int8_to_char(), make_result(), makeTSQuerySign(), numeric_to_char(), QTNEq(), ReadInt(), restore(), rfmtlong(), scanint8(), set_var_from_str(), and strtoint64().
struct sqlca_t sqlca_init [static] |
{ { 'S', 'Q', 'L', 'C', 'A', ' ', ' ', ' ' }, sizeof(struct sqlca_t), 0, { 0, { 0 } }, { 'N', 'O', 'T', ' ', 'S', 'E', 'T', ' ' }, { 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0 }, { '0', '0', '0', '0', '0' } }
Definition at line 21 of file informix.c.
long val |
Definition at line 686 of file informix.c.
Referenced by _copyAConst(), _copyResTarget(), _copyValue(), _equalResTarget(), _equalValue(), _ltree_compress(), _outResTarget(), _readBitmapset(), _ShowOption(), AlterDomainValidateConstraint(), assignVariables(), AttrDefaultFetch(), autoinc(), bitfromint4(), bitfromint8(), boolop(), bqarr_in(), build_startup_packet(), BuildIndexValueDescription(), byteaout(), calc_distr(), calc_hist(), cash_words(), check_timezone(), checkcondition_arr(), CheckConstraintFetch(), composite_to_json(), conninfo_array_parse(), convert_string_datum(), CopyReadAttributesText(), datum_write(), DecodeDate(), DecodeDateTime(), DecodeInterval(), DecodeISO8601Interval(), DecodeNumber(), DecodePosixTimezone(), DecodeTimeOnly(), DropConfigurationMapping(), dump_sqlda(), each_object_field_end(), ean13_out(), ecpg_set_compat_sqlda(), ecpg_set_native_sqlda(), elem_contained_by_range(), elements_array_element_end(), esc_decode(), ExecBuildSlotValueDescription(), findoprnd(), findTargetlistEntrySQL92(), flatten_set_variable_args(), float4_numeric(), float4_to_char(), float4in(), float8_numeric(), float8_to_char(), float8in(), get_attstatsslot(), get_prompt(), get_sql_insert(), get_sql_update(), get_stack_depth_rlimit(), getbits(), GetDomainConstraints(), getTokenTypes(), getv4(), GetVariableNum(), ghstore_compress(), gin_extract_query_trgm(), gin_extract_tsquery(), gin_extract_value_trgm(), ginint4_queryextract(), gtrgm_compress(), gtsvector_compress(), GUCArrayDelete(), GUCArrayReset(), hash_object_field_end(), hashint8(), heap_compute_data_size(), heap_fill_tuple(), hstore_contains(), hstore_from_text(), inc_counter(), ineq_histogram_selectivity(), inet_aton(), inet_cidr_pton_ipv6(), int2_numeric(), int4_numeric(), int4_to_char(), int8_numeric(), int8_to_char(), int8out(), interval_part(), interval_trunc(), is_superuser(), is_valid(), isbn_cast_from_ean13(), ismn_cast_from_ean13(), isn_out(), issn_cast_from_ean13(), json_agg_transfn(), ltree_compress(), ltxtq_exec(), main(), make_array_ref(), make_const(), make_valid(), makepol(), MergeWithExistingConstraint(), nodeRead(), nodeTokenType(), numeric_exp(), numeric_float8_no_overflow(), numeric_int2(), numeric_to_char(), numeric_to_double_no_overflow(), numericvar_to_double(), numericvar_to_double_no_overflow(), numericvar_to_int4(), numericvar_to_int8(), OldSerXidGetMinConflictCommitSeqNo(), parse_args(), parse_hba_line(), parse_int(), parse_real(), parse_scalar(), parse_snapshot(), parseIntFromText(), ParseISO8601Number(), parseServiceFile(), parseXidFromText(), pg_get_constraintdef_worker(), plperl_build_tuple_result(), plperl_modify_tuple(), PLy_elog(), populate_recordset_object_field_end(), postgres_fdw_validator(), power_var(), pqGetErrorNotice3(), pqRowProcessor(), pqSetenvPoll(), prsd_headline(), putVariable(), range_contains_elem(), recompute_limits(), RelationBuildTriggers(), RelationGetExclusionInfo(), removeHeapElement(), ReportGUCOption(), ri_ReportViolation(), serialize_deflist(), session_username(), SPI_getvalue(), sqlda_common_total_size(), standard_strings(), str2txid(), strtoi(), sv2cstr(), text_format_parse_digits(), time_part(), timestamp_part(), timestamp_trunc(), timestamp_zone(), timestamptz_part(), timestamptz_trunc(), timestamptz_zone(), timetz_part(), timetz_zone(), to_json(), transformExprRecurse(), trgm2int(), ts_match_vq(), tsqueryrecv(), tstoreReceiveSlot_detoast(), tstz_to_ts_gmt(), txid_current(), untransformRelOptions(), upc_cast_from_ean13(), useKeepalives(), validateCheckConstraint(), and worker_spi_main().
char* val_string |
Definition at line 691 of file informix.c.
struct { ... } value [static] |
Referenced by _crypt_gensalt_extended_rn(), _crypt_gensalt_md5_rn(), array_fill(), array_fill_with_lower_bounds(), array_to_text_internal(), AuxiliaryProcessMain(), bytea_string_agg_transfn(), call_subtype_diff(), cash_in(), cash_out(), cash_words(), check_pghost_envvar(), compute_array_stats(), compute_minimal_stats(), compute_range_stats(), compute_scalar_stats(), compute_tsvector_stats(), concat_internal(), conninfo_uri_parse_params(), convert_prep_stmt_params(), CopyOneRowTo(), DCH_from_char(), debugtup(), DefineSequence(), domain_in(), domain_recv(), dxsyn_lexize(), exec_assign_c_string(), exec_assign_expr(), exec_command(), exec_move_row(), exec_stmt_case(), exec_stmt_exit(), exec_stmt_foreach_a(), exec_stmt_fori(), exec_stmt_if(), exec_stmt_while(), ExecEvalCoalesce(), ExecEvalMinMax(), ExecEvalXml(), ExecWindowAgg(), filter_list_to_array(), float4_to_char(), Float4GetDatum(), float8_to_char(), Float8GetDatum(), GetComment(), hstore_from_record(), hstore_populate_record(), initValue(), int4_to_char(), int8_to_char(), json_populate_record(), main(), numeric_in(), numeric_recv(), numeric_to_char(), numeric_to_number(), optionListToArray(), parse_one_reloption(), parse_psql_options(), pg_column_size(), pg_get_triggerdef_worker(), PGTYPESnumeric_from_asc(), plpgsql_token_is_unreserved_keyword(), PLy_subtransaction_exit(), PLyDict_FromTuple(), PLyGenericObject_ToComposite(), PLyMapping_ToComposite(), PLySequence_ToComposite(), populate_recordset_object_end(), PostmasterMain(), postquel_get_single_result(), pqRowProcessor(), process_postgres_switches(), process_startup_options(), ProcessGUCArray(), prune_element_hashtable(), read_dictionary(), record_out(), rfmtlong(), set_config_by_name(), ShowGUCConfigOption(), StoreQueryTuple(), text_format(), to_hex32(), to_hex64(), toast_delete(), transformRelOptions(), transtime(), txid_snapshot_xip(), txid_visible_in_snapshot(), and xmlelement().