#include "fmgr.h"

Go to the source code of this file.
Defines | |
| #define | DatumGetCash(X) ((Cash) DatumGetInt64(X)) |
| #define | CashGetDatum(X) Int64GetDatum(X) |
| #define | PG_GETARG_CASH(n) DatumGetCash(PG_GETARG_DATUM(n)) |
| #define | PG_RETURN_CASH(x) return CashGetDatum(x) |
Typedefs | |
| typedef int64 | Cash |
Functions | |
| Datum | cash_in (PG_FUNCTION_ARGS) |
| Datum | cash_out (PG_FUNCTION_ARGS) |
| Datum | cash_recv (PG_FUNCTION_ARGS) |
| Datum | cash_send (PG_FUNCTION_ARGS) |
| Datum | cash_eq (PG_FUNCTION_ARGS) |
| Datum | cash_ne (PG_FUNCTION_ARGS) |
| Datum | cash_lt (PG_FUNCTION_ARGS) |
| Datum | cash_le (PG_FUNCTION_ARGS) |
| Datum | cash_gt (PG_FUNCTION_ARGS) |
| Datum | cash_ge (PG_FUNCTION_ARGS) |
| Datum | cash_cmp (PG_FUNCTION_ARGS) |
| Datum | cash_pl (PG_FUNCTION_ARGS) |
| Datum | cash_mi (PG_FUNCTION_ARGS) |
| Datum | cash_div_cash (PG_FUNCTION_ARGS) |
| Datum | cash_mul_flt8 (PG_FUNCTION_ARGS) |
| Datum | flt8_mul_cash (PG_FUNCTION_ARGS) |
| Datum | cash_div_flt8 (PG_FUNCTION_ARGS) |
| Datum | cash_mul_flt4 (PG_FUNCTION_ARGS) |
| Datum | flt4_mul_cash (PG_FUNCTION_ARGS) |
| Datum | cash_div_flt4 (PG_FUNCTION_ARGS) |
| Datum | cash_mul_int8 (PG_FUNCTION_ARGS) |
| Datum | int8_mul_cash (PG_FUNCTION_ARGS) |
| Datum | cash_div_int8 (PG_FUNCTION_ARGS) |
| Datum | cash_mul_int4 (PG_FUNCTION_ARGS) |
| Datum | int4_mul_cash (PG_FUNCTION_ARGS) |
| Datum | cash_div_int4 (PG_FUNCTION_ARGS) |
| Datum | cash_mul_int2 (PG_FUNCTION_ARGS) |
| Datum | int2_mul_cash (PG_FUNCTION_ARGS) |
| Datum | cash_div_int2 (PG_FUNCTION_ARGS) |
| Datum | cashlarger (PG_FUNCTION_ARGS) |
| Datum | cashsmaller (PG_FUNCTION_ARGS) |
| Datum | cash_words (PG_FUNCTION_ARGS) |
| Datum | cash_numeric (PG_FUNCTION_ARGS) |
| Datum | numeric_cash (PG_FUNCTION_ARGS) |
| Datum | int4_cash (PG_FUNCTION_ARGS) |
| Datum | int8_cash (PG_FUNCTION_ARGS) |
| #define DatumGetCash | ( | X | ) | ((Cash) DatumGetInt64(X)) |
Definition at line 20 of file cash.h.
Referenced by gbt_num_compress().
| #define PG_GETARG_CASH | ( | n | ) | DatumGetCash(PG_GETARG_DATUM(n)) |
Definition at line 22 of file cash.h.
Referenced by cash_cmp(), cash_dist(), cash_div_cash(), cash_div_flt4(), cash_div_flt8(), cash_div_int2(), cash_div_int4(), cash_div_int8(), cash_eq(), cash_ge(), cash_gt(), cash_le(), cash_lt(), cash_mi(), cash_mul_flt4(), cash_mul_flt8(), cash_mul_int2(), cash_mul_int4(), cash_mul_int8(), cash_ne(), cash_numeric(), cash_out(), cash_pl(), cash_send(), cash_words(), cashlarger(), cashsmaller(), flt4_mul_cash(), flt8_mul_cash(), gbt_cash_consistent(), gbt_cash_distance(), int2_mul_cash(), int4_mul_cash(), and int8_mul_cash().
| #define PG_RETURN_CASH | ( | x | ) | return CashGetDatum(x) |
Definition at line 23 of file cash.h.
Referenced by cash_dist(), cash_div_flt4(), cash_div_flt8(), cash_div_int2(), cash_div_int4(), cash_div_int8(), cash_in(), cash_mi(), cash_mul_flt4(), cash_mul_flt8(), cash_mul_int2(), cash_mul_int4(), cash_mul_int8(), cash_pl(), cash_recv(), cashlarger(), cashsmaller(), flt4_mul_cash(), flt8_mul_cash(), int2_mul_cash(), int4_cash(), int4_mul_cash(), int8_cash(), int8_mul_cash(), and numeric_cash().
| Datum cash_cmp | ( | PG_FUNCTION_ARGS | ) |
Definition at line 550 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_INT32.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
if (c1 > c2)
PG_RETURN_INT32(1);
else if (c1 == c2)
PG_RETURN_INT32(0);
else
PG_RETURN_INT32(-1);
}
| Datum cash_div_cash | ( | PG_FUNCTION_ARGS | ) |
Definition at line 600 of file cash.c.
References ereport, errcode(), errmsg(), ERROR, PG_GETARG_CASH, and PG_RETURN_FLOAT8.
{
Cash dividend = PG_GETARG_CASH(0);
Cash divisor = PG_GETARG_CASH(1);
float8 quotient;
if (divisor == 0)
ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero")));
quotient = (float8) dividend / (float8) divisor;
PG_RETURN_FLOAT8(quotient);
}
| Datum cash_div_flt4 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 701 of file cash.c.
References ereport, errcode(), errmsg(), ERROR, PG_GETARG_CASH, PG_GETARG_FLOAT4, PG_RETURN_CASH, and rint().
{
Cash c = PG_GETARG_CASH(0);
float4 f = PG_GETARG_FLOAT4(1);
Cash result;
if (f == 0.0)
ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero")));
result = rint(c / f);
PG_RETURN_CASH(result);
}
| Datum cash_div_flt8 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 650 of file cash.c.
References ereport, errcode(), errmsg(), ERROR, PG_GETARG_CASH, PG_GETARG_FLOAT8, PG_RETURN_CASH, and rint().
{
Cash c = PG_GETARG_CASH(0);
float8 f = PG_GETARG_FLOAT8(1);
Cash result;
if (f == 0.0)
ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero")));
result = rint(c / f);
PG_RETURN_CASH(result);
}
| Datum cash_div_int2 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 852 of file cash.c.
References ereport, errcode(), errmsg(), ERROR, PG_GETARG_CASH, PG_GETARG_INT16, PG_RETURN_CASH, and rint().
{
Cash c = PG_GETARG_CASH(0);
int16 s = PG_GETARG_INT16(1);
Cash result;
if (s == 0)
ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero")));
result = rint(c / s);
PG_RETURN_CASH(result);
}
| Datum cash_div_int4 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 802 of file cash.c.
References ereport, errcode(), errmsg(), ERROR, i, PG_GETARG_CASH, PG_GETARG_INT32, PG_RETURN_CASH, and rint().
{
Cash c = PG_GETARG_CASH(0);
int32 i = PG_GETARG_INT32(1);
Cash result;
if (i == 0)
ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero")));
result = rint(c / i);
PG_RETURN_CASH(result);
}
| Datum cash_div_int8 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 750 of file cash.c.
References ereport, errcode(), errmsg(), ERROR, i, PG_GETARG_CASH, PG_GETARG_INT64, PG_RETURN_CASH, and rint().
{
Cash c = PG_GETARG_CASH(0);
int64 i = PG_GETARG_INT64(1);
Cash result;
if (i == 0)
ereport(ERROR,
(errcode(ERRCODE_DIVISION_BY_ZERO),
errmsg("division by zero")));
result = rint(c / i);
PG_RETURN_CASH(result);
}
| Datum cash_eq | ( | PG_FUNCTION_ARGS | ) |
Definition at line 496 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_BOOL.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
PG_RETURN_BOOL(c1 == c2);
}
| Datum cash_ge | ( | PG_FUNCTION_ARGS | ) |
Definition at line 541 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_BOOL.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
PG_RETURN_BOOL(c1 >= c2);
}
| Datum cash_gt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 532 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_BOOL.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
PG_RETURN_BOOL(c1 > c2);
}
| Datum cash_in | ( | PG_FUNCTION_ARGS | ) |
Definition at line 97 of file cash.c.
References ereport, errcode(), errmsg(), ERROR, PG_GETARG_CSTRING, PG_RETURN_CASH, PGLC_localeconv(), and value.
{
char *str = PG_GETARG_CSTRING(0);
Cash result;
Cash value = 0;
Cash dec = 0;
Cash sgn = 1;
bool seen_dot = false;
const char *s = str;
int fpoint;
char dsymbol;
const char *ssymbol,
*psymbol,
*nsymbol,
*csymbol;
struct lconv *lconvert = PGLC_localeconv();
/*
* frac_digits will be CHAR_MAX in some locales, notably C. However, just
* testing for == CHAR_MAX is risky, because of compilers like gcc that
* "helpfully" let you alter the platform-standard definition of whether
* char is signed or not. If we are so unfortunate as to get compiled
* with a nonstandard -fsigned-char or -funsigned-char switch, then our
* idea of CHAR_MAX will not agree with libc's. The safest course is not
* to test for CHAR_MAX at all, but to impose a range check for plausible
* frac_digits values.
*/
fpoint = lconvert->frac_digits;
if (fpoint < 0 || fpoint > 10)
fpoint = 2; /* best guess in this case, I think */
/* we restrict dsymbol to be a single byte, but not the other symbols */
if (*lconvert->mon_decimal_point != '\0' &&
lconvert->mon_decimal_point[1] == '\0')
dsymbol = *lconvert->mon_decimal_point;
else
dsymbol = '.';
if (*lconvert->mon_thousands_sep != '\0')
ssymbol = lconvert->mon_thousands_sep;
else /* ssymbol should not equal dsymbol */
ssymbol = (dsymbol != ',') ? "," : ".";
csymbol = (*lconvert->currency_symbol != '\0') ? lconvert->currency_symbol : "$";
psymbol = (*lconvert->positive_sign != '\0') ? lconvert->positive_sign : "+";
nsymbol = (*lconvert->negative_sign != '\0') ? lconvert->negative_sign : "-";
#ifdef CASHDEBUG
printf("cashin- precision '%d'; decimal '%c'; thousands '%s'; currency '%s'; positive '%s'; negative '%s'\n",
fpoint, dsymbol, ssymbol, csymbol, psymbol, nsymbol);
#endif
/* we need to add all sorts of checking here. For now just */
/* strip all leading whitespace and any leading currency symbol */
while (isspace((unsigned char) *s))
s++;
if (strncmp(s, csymbol, strlen(csymbol)) == 0)
s += strlen(csymbol);
while (isspace((unsigned char) *s))
s++;
#ifdef CASHDEBUG
printf("cashin- string is '%s'\n", s);
#endif
/* a leading minus or paren signifies a negative number */
/* again, better heuristics needed */
/* XXX - doesn't properly check for balanced parens - djmc */
if (strncmp(s, nsymbol, strlen(nsymbol)) == 0)
{
sgn = -1;
s += strlen(nsymbol);
}
else if (*s == '(')
{
sgn = -1;
s++;
}
else if (strncmp(s, psymbol, strlen(psymbol)) == 0)
s += strlen(psymbol);
#ifdef CASHDEBUG
printf("cashin- string is '%s'\n", s);
#endif
/* allow whitespace and currency symbol after the sign, too */
while (isspace((unsigned char) *s))
s++;
if (strncmp(s, csymbol, strlen(csymbol)) == 0)
s += strlen(csymbol);
while (isspace((unsigned char) *s))
s++;
#ifdef CASHDEBUG
printf("cashin- string is '%s'\n", s);
#endif
for (; *s; s++)
{
/* we look for digits as long as we have found less */
/* than the required number of decimal places */
if (isdigit((unsigned char) *s) && (!seen_dot || dec < fpoint))
{
value = (value * 10) + (*s - '0');
if (seen_dot)
dec++;
}
/* decimal point? then start counting fractions... */
else if (*s == dsymbol && !seen_dot)
{
seen_dot = true;
}
/* ignore if "thousands" separator, else we're done */
else if (strncmp(s, ssymbol, strlen(ssymbol)) == 0)
s += strlen(ssymbol) - 1;
else
break;
}
/* round off if there's another digit */
if (isdigit((unsigned char) *s) && *s >= '5')
value++;
/* adjust for less than required decimal places */
for (; dec < fpoint; dec++)
value *= 10;
/*
* should only be trailing digits followed by whitespace, right paren,
* trailing sign, and/or trailing currency symbol
*/
while (isdigit((unsigned char) *s))
s++;
while (*s)
{
if (isspace((unsigned char) *s) || *s == ')')
s++;
else if (strncmp(s, nsymbol, strlen(nsymbol)) == 0)
{
sgn = -1;
s += strlen(nsymbol);
}
else if (strncmp(s, psymbol, strlen(psymbol)) == 0)
s += strlen(psymbol);
else if (strncmp(s, csymbol, strlen(csymbol)) == 0)
s += strlen(csymbol);
else
ereport(ERROR,
(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
errmsg("invalid input syntax for type money: \"%s\"",
str)));
}
result = value * sgn;
#ifdef CASHDEBUG
printf("cashin- result is " INT64_FORMAT "\n", result);
#endif
PG_RETURN_CASH(result);
}
| Datum cash_le | ( | PG_FUNCTION_ARGS | ) |
Definition at line 523 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_BOOL.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
PG_RETURN_BOOL(c1 <= c2);
}
| Datum cash_lt | ( | PG_FUNCTION_ARGS | ) |
Definition at line 514 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_BOOL.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
PG_RETURN_BOOL(c1 < c2);
}
| Datum cash_mi | ( | PG_FUNCTION_ARGS | ) |
Definition at line 584 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_CASH.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
Cash result;
result = c1 - c2;
PG_RETURN_CASH(result);
}
| Datum cash_mul_flt4 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 670 of file cash.c.
References PG_GETARG_CASH, PG_GETARG_FLOAT4, and PG_RETURN_CASH.
{
Cash c = PG_GETARG_CASH(0);
float4 f = PG_GETARG_FLOAT4(1);
Cash result;
result = c * f;
PG_RETURN_CASH(result);
}
| Datum cash_mul_flt8 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 620 of file cash.c.
References PG_GETARG_CASH, PG_GETARG_FLOAT8, and PG_RETURN_CASH.
{
Cash c = PG_GETARG_CASH(0);
float8 f = PG_GETARG_FLOAT8(1);
Cash result;
result = c * f;
PG_RETURN_CASH(result);
}
| Datum cash_mul_int2 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 823 of file cash.c.
References PG_GETARG_CASH, PG_GETARG_INT16, and PG_RETURN_CASH.
{
Cash c = PG_GETARG_CASH(0);
int16 s = PG_GETARG_INT16(1);
Cash result;
result = c * s;
PG_RETURN_CASH(result);
}
| Datum cash_mul_int4 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 771 of file cash.c.
References i, PG_GETARG_CASH, PG_GETARG_INT32, and PG_RETURN_CASH.
{
Cash c = PG_GETARG_CASH(0);
int32 i = PG_GETARG_INT32(1);
Cash result;
result = c * i;
PG_RETURN_CASH(result);
}
| Datum cash_mul_int8 | ( | PG_FUNCTION_ARGS | ) |
Definition at line 721 of file cash.c.
References i, PG_GETARG_CASH, PG_GETARG_INT64, and PG_RETURN_CASH.
{
Cash c = PG_GETARG_CASH(0);
int64 i = PG_GETARG_INT64(1);
Cash result;
result = c * i;
PG_RETURN_CASH(result);
}
| Datum cash_ne | ( | PG_FUNCTION_ARGS | ) |
Definition at line 505 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_BOOL.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
PG_RETURN_BOOL(c1 != c2);
}
| Datum cash_numeric | ( | PG_FUNCTION_ARGS | ) |
Definition at line 989 of file cash.c.
References DatumGetNumeric, DirectFunctionCall1, DirectFunctionCall2, i, Int32GetDatum, Int64GetDatum(), int8_numeric(), numeric_div(), numeric_round(), PG_GETARG_CASH, PG_RETURN_NUMERIC, PGLC_localeconv(), and scale.
{
Cash money = PG_GETARG_CASH(0);
Numeric result;
int fpoint;
int64 scale;
int i;
Datum amount;
Datum numeric_scale;
Datum quotient;
struct lconv *lconvert = PGLC_localeconv();
/* see comments about frac_digits in cash_in() */
fpoint = lconvert->frac_digits;
if (fpoint < 0 || fpoint > 10)
fpoint = 2;
/* compute required scale factor */
scale = 1;
for (i = 0; i < fpoint; i++)
scale *= 10;
/* form the result as money / scale */
amount = DirectFunctionCall1(int8_numeric, Int64GetDatum(money));
numeric_scale = DirectFunctionCall1(int8_numeric, Int64GetDatum(scale));
quotient = DirectFunctionCall2(numeric_div, amount, numeric_scale);
/* forcibly round to exactly the intended number of digits */
result = DatumGetNumeric(DirectFunctionCall2(numeric_round,
quotient,
Int32GetDatum(fpoint)));
PG_RETURN_NUMERIC(result);
}
| Datum cash_out | ( | PG_FUNCTION_ARGS | ) |
Definition at line 265 of file cash.c.
References buf, palloc(), PG_GETARG_CASH, PG_RETURN_CSTRING, PGLC_localeconv(), and value.
{
Cash value = PG_GETARG_CASH(0);
char *result;
char buf[128];
char *bufptr;
int digit_pos;
int points,
mon_group;
char dsymbol;
const char *ssymbol,
*csymbol,
*signsymbol;
char sign_posn,
cs_precedes,
sep_by_space;
struct lconv *lconvert = PGLC_localeconv();
/* see comments about frac_digits in cash_in() */
points = lconvert->frac_digits;
if (points < 0 || points > 10)
points = 2; /* best guess in this case, I think */
/*
* As with frac_digits, must apply a range check to mon_grouping to avoid
* being fooled by variant CHAR_MAX values.
*/
mon_group = *lconvert->mon_grouping;
if (mon_group <= 0 || mon_group > 6)
mon_group = 3;
/* we restrict dsymbol to be a single byte, but not the other symbols */
if (*lconvert->mon_decimal_point != '\0' &&
lconvert->mon_decimal_point[1] == '\0')
dsymbol = *lconvert->mon_decimal_point;
else
dsymbol = '.';
if (*lconvert->mon_thousands_sep != '\0')
ssymbol = lconvert->mon_thousands_sep;
else /* ssymbol should not equal dsymbol */
ssymbol = (dsymbol != ',') ? "," : ".";
csymbol = (*lconvert->currency_symbol != '\0') ? lconvert->currency_symbol : "$";
if (value < 0)
{
/* make the amount positive for digit-reconstruction loop */
value = -value;
/* set up formatting data */
signsymbol = (*lconvert->negative_sign != '\0') ? lconvert->negative_sign : "-";
sign_posn = lconvert->n_sign_posn;
cs_precedes = lconvert->n_cs_precedes;
sep_by_space = lconvert->n_sep_by_space;
}
else
{
signsymbol = lconvert->positive_sign;
sign_posn = lconvert->p_sign_posn;
cs_precedes = lconvert->p_cs_precedes;
sep_by_space = lconvert->p_sep_by_space;
}
/* we build the digits+decimal-point+sep string right-to-left in buf[] */
bufptr = buf + sizeof(buf) - 1;
*bufptr = '\0';
/*
* Generate digits till there are no non-zero digits left and we emitted
* at least one to the left of the decimal point. digit_pos is the
* current digit position, with zero as the digit just left of the decimal
* point, increasing to the right.
*/
digit_pos = points;
do
{
if (points && digit_pos == 0)
{
/* insert decimal point, but not if value cannot be fractional */
*(--bufptr) = dsymbol;
}
else if (digit_pos < 0 && (digit_pos % mon_group) == 0)
{
/* insert thousands sep, but only to left of radix point */
bufptr -= strlen(ssymbol);
memcpy(bufptr, ssymbol, strlen(ssymbol));
}
*(--bufptr) = ((uint64) value % 10) + '0';
value = ((uint64) value) / 10;
digit_pos--;
} while (value || digit_pos >= 0);
/*----------
* Now, attach currency symbol and sign symbol in the correct order.
*
* The POSIX spec defines these values controlling this code:
*
* p/n_sign_posn:
* 0 Parentheses enclose the quantity and the currency_symbol.
* 1 The sign string precedes the quantity and the currency_symbol.
* 2 The sign string succeeds the quantity and the currency_symbol.
* 3 The sign string precedes the currency_symbol.
* 4 The sign string succeeds the currency_symbol.
*
* p/n_cs_precedes: 0 means currency symbol after value, else before it.
*
* p/n_sep_by_space:
* 0 No <space> separates the currency symbol and value.
* 1 If the currency symbol and sign string are adjacent, a <space>
* separates them from the value; otherwise, a <space> separates
* the currency symbol from the value.
* 2 If the currency symbol and sign string are adjacent, a <space>
* separates them; otherwise, a <space> separates the sign string
* from the value.
*----------
*/
result = palloc(strlen(bufptr) + strlen(csymbol) + strlen(signsymbol) + 4);
switch (sign_posn)
{
case 0:
if (cs_precedes)
sprintf(result, "(%s%s%s)",
csymbol,
(sep_by_space == 1) ? " " : "",
bufptr);
else
sprintf(result, "(%s%s%s)",
bufptr,
(sep_by_space == 1) ? " " : "",
csymbol);
break;
case 1:
default:
if (cs_precedes)
sprintf(result, "%s%s%s%s%s",
signsymbol,
(sep_by_space == 2) ? " " : "",
csymbol,
(sep_by_space == 1) ? " " : "",
bufptr);
else
sprintf(result, "%s%s%s%s%s",
signsymbol,
(sep_by_space == 2) ? " " : "",
bufptr,
(sep_by_space == 1) ? " " : "",
csymbol);
break;
case 2:
if (cs_precedes)
sprintf(result, "%s%s%s%s%s",
csymbol,
(sep_by_space == 1) ? " " : "",
bufptr,
(sep_by_space == 2) ? " " : "",
signsymbol);
else
sprintf(result, "%s%s%s%s%s",
bufptr,
(sep_by_space == 1) ? " " : "",
csymbol,
(sep_by_space == 2) ? " " : "",
signsymbol);
break;
case 3:
if (cs_precedes)
sprintf(result, "%s%s%s%s%s",
signsymbol,
(sep_by_space == 2) ? " " : "",
csymbol,
(sep_by_space == 1) ? " " : "",
bufptr);
else
sprintf(result, "%s%s%s%s%s",
bufptr,
(sep_by_space == 1) ? " " : "",
signsymbol,
(sep_by_space == 2) ? " " : "",
csymbol);
break;
case 4:
if (cs_precedes)
sprintf(result, "%s%s%s%s%s",
csymbol,
(sep_by_space == 2) ? " " : "",
signsymbol,
(sep_by_space == 1) ? " " : "",
bufptr);
else
sprintf(result, "%s%s%s%s%s",
bufptr,
(sep_by_space == 1) ? " " : "",
csymbol,
(sep_by_space == 2) ? " " : "",
signsymbol);
break;
}
PG_RETURN_CSTRING(result);
}
| Datum cash_pl | ( | PG_FUNCTION_ARGS | ) |
Definition at line 568 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_CASH.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
Cash result;
result = c1 + c2;
PG_RETURN_CASH(result);
}
| Datum cash_recv | ( | PG_FUNCTION_ARGS | ) |
Definition at line 470 of file cash.c.
References buf, PG_GETARG_POINTER, PG_RETURN_CASH, and pq_getmsgint64().
{
StringInfo buf = (StringInfo) PG_GETARG_POINTER(0);
PG_RETURN_CASH((Cash) pq_getmsgint64(buf));
}
| Datum cash_send | ( | PG_FUNCTION_ARGS | ) |
Definition at line 481 of file cash.c.
References buf, PG_GETARG_CASH, PG_RETURN_BYTEA_P, pq_begintypsend(), pq_endtypsend(), and pq_sendint64().
{
Cash arg1 = PG_GETARG_CASH(0);
StringInfoData buf;
pq_begintypsend(&buf);
pq_sendint64(&buf, arg1);
PG_RETURN_BYTEA_P(pq_endtypsend(&buf));
}
| Datum cash_words | ( | PG_FUNCTION_ARGS | ) |
Definition at line 902 of file cash.c.
References buf, cstring_to_text(), INT64CONST, num_word(), PG_GETARG_CASH, PG_RETURN_TEXT_P, pg_toupper(), val, and value.
{
Cash value = PG_GETARG_CASH(0);
uint64 val;
char buf[256];
char *p = buf;
Cash m0;
Cash m1;
Cash m2;
Cash m3;
Cash m4;
Cash m5;
Cash m6;
/* work with positive numbers */
if (value < 0)
{
value = -value;
strcpy(buf, "minus ");
p += 6;
}
else
buf[0] = '\0';
/* Now treat as unsigned, to avoid trouble at INT_MIN */
val = (uint64) value;
m0 = val % INT64CONST(100); /* cents */
m1 = (val / INT64CONST(100)) % 1000; /* hundreds */
m2 = (val / INT64CONST(100000)) % 1000; /* thousands */
m3 = (val / INT64CONST(100000000)) % 1000; /* millions */
m4 = (val / INT64CONST(100000000000)) % 1000; /* billions */
m5 = (val / INT64CONST(100000000000000)) % 1000; /* trillions */
m6 = (val / INT64CONST(100000000000000000)) % 1000; /* quadrillions */
if (m6)
{
strcat(buf, num_word(m6));
strcat(buf, " quadrillion ");
}
if (m5)
{
strcat(buf, num_word(m5));
strcat(buf, " trillion ");
}
if (m4)
{
strcat(buf, num_word(m4));
strcat(buf, " billion ");
}
if (m3)
{
strcat(buf, num_word(m3));
strcat(buf, " million ");
}
if (m2)
{
strcat(buf, num_word(m2));
strcat(buf, " thousand ");
}
if (m1)
strcat(buf, num_word(m1));
if (!*p)
strcat(buf, "zero");
strcat(buf, (val / 100) == 1 ? " dollar and " : " dollars and ");
strcat(buf, num_word(m0));
strcat(buf, m0 == 1 ? " cent" : " cents");
/* capitalize output */
buf[0] = pg_toupper((unsigned char) buf[0]);
/* return as text datum */
PG_RETURN_TEXT_P(cstring_to_text(buf));
}
| Datum cashlarger | ( | PG_FUNCTION_ARGS | ) |
Definition at line 871 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_CASH.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
Cash result;
result = (c1 > c2) ? c1 : c2;
PG_RETURN_CASH(result);
}
| Datum cashsmaller | ( | PG_FUNCTION_ARGS | ) |
Definition at line 886 of file cash.c.
References PG_GETARG_CASH, and PG_RETURN_CASH.
{
Cash c1 = PG_GETARG_CASH(0);
Cash c2 = PG_GETARG_CASH(1);
Cash result;
result = (c1 < c2) ? c1 : c2;
PG_RETURN_CASH(result);
}
| Datum flt4_mul_cash | ( | PG_FUNCTION_ARGS | ) |
Definition at line 685 of file cash.c.
References PG_GETARG_CASH, PG_GETARG_FLOAT4, and PG_RETURN_CASH.
{
float4 f = PG_GETARG_FLOAT4(0);
Cash c = PG_GETARG_CASH(1);
Cash result;
result = f * c;
PG_RETURN_CASH(result);
}
| Datum flt8_mul_cash | ( | PG_FUNCTION_ARGS | ) |
Definition at line 635 of file cash.c.
References PG_GETARG_CASH, PG_GETARG_FLOAT8, and PG_RETURN_CASH.
{
float8 f = PG_GETARG_FLOAT8(0);
Cash c = PG_GETARG_CASH(1);
Cash result;
result = f * c;
PG_RETURN_CASH(result);
}
| Datum int2_mul_cash | ( | PG_FUNCTION_ARGS | ) |
Definition at line 837 of file cash.c.
References PG_GETARG_CASH, PG_GETARG_INT16, and PG_RETURN_CASH.
{
int16 s = PG_GETARG_INT16(0);
Cash c = PG_GETARG_CASH(1);
Cash result;
result = s * c;
PG_RETURN_CASH(result);
}
| Datum int4_cash | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1062 of file cash.c.
References DatumGetInt64, DirectFunctionCall2, i, Int64GetDatum(), int8mul(), PG_GETARG_INT32, PG_RETURN_CASH, PGLC_localeconv(), and scale.
{
int32 amount = PG_GETARG_INT32(0);
Cash result;
int fpoint;
int64 scale;
int i;
struct lconv *lconvert = PGLC_localeconv();
/* see comments about frac_digits in cash_in() */
fpoint = lconvert->frac_digits;
if (fpoint < 0 || fpoint > 10)
fpoint = 2;
/* compute required scale factor */
scale = 1;
for (i = 0; i < fpoint; i++)
scale *= 10;
/* compute amount * scale, checking for overflow */
result = DatumGetInt64(DirectFunctionCall2(int8mul, Int64GetDatum(amount),
Int64GetDatum(scale)));
PG_RETURN_CASH(result);
}
| Datum int4_mul_cash | ( | PG_FUNCTION_ARGS | ) |
Definition at line 786 of file cash.c.
References i, PG_GETARG_CASH, PG_GETARG_INT32, and PG_RETURN_CASH.
{
int32 i = PG_GETARG_INT32(0);
Cash c = PG_GETARG_CASH(1);
Cash result;
result = i * c;
PG_RETURN_CASH(result);
}
| Datum int8_cash | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1092 of file cash.c.
References DatumGetInt64, DirectFunctionCall2, i, Int64GetDatum(), int8mul(), PG_GETARG_INT64, PG_RETURN_CASH, PGLC_localeconv(), and scale.
{
int64 amount = PG_GETARG_INT64(0);
Cash result;
int fpoint;
int64 scale;
int i;
struct lconv *lconvert = PGLC_localeconv();
/* see comments about frac_digits in cash_in() */
fpoint = lconvert->frac_digits;
if (fpoint < 0 || fpoint > 10)
fpoint = 2;
/* compute required scale factor */
scale = 1;
for (i = 0; i < fpoint; i++)
scale *= 10;
/* compute amount * scale, checking for overflow */
result = DatumGetInt64(DirectFunctionCall2(int8mul, Int64GetDatum(amount),
Int64GetDatum(scale)));
PG_RETURN_CASH(result);
}
| Datum int8_mul_cash | ( | PG_FUNCTION_ARGS | ) |
Definition at line 736 of file cash.c.
References i, PG_GETARG_CASH, PG_GETARG_INT64, and PG_RETURN_CASH.
{
int64 i = PG_GETARG_INT64(0);
Cash c = PG_GETARG_CASH(1);
Cash result;
result = i * c;
PG_RETURN_CASH(result);
}
| Datum numeric_cash | ( | PG_FUNCTION_ARGS | ) |
Definition at line 1028 of file cash.c.
References DatumGetInt64, DirectFunctionCall1, DirectFunctionCall2, i, Int64GetDatum(), int8_numeric(), numeric_int8(), numeric_mul(), PG_GETARG_DATUM, PG_RETURN_CASH, PGLC_localeconv(), and scale.
{
Datum amount = PG_GETARG_DATUM(0);
Cash result;
int fpoint;
int64 scale;
int i;
Datum numeric_scale;
struct lconv *lconvert = PGLC_localeconv();
/* see comments about frac_digits in cash_in() */
fpoint = lconvert->frac_digits;
if (fpoint < 0 || fpoint > 10)
fpoint = 2;
/* compute required scale factor */
scale = 1;
for (i = 0; i < fpoint; i++)
scale *= 10;
/* multiply the input amount by scale factor */
numeric_scale = DirectFunctionCall1(int8_numeric, Int64GetDatum(scale));
amount = DirectFunctionCall2(numeric_mul, amount, numeric_scale);
/* note that numeric_int8 will round to nearest integer for us */
result = DatumGetInt64(DirectFunctionCall1(numeric_int8, amount));
PG_RETURN_CASH(result);
}
1.7.1