Avoid failures in cash_out and cash_words for INT_MIN.

Also, 'fourty' -> 'forty'.
REL7_2_STABLE
Tom Lane 24 years ago
parent cceca2ca26
commit c30ef871cd
  1. 24
      src/backend/utils/adt/cash.c

@ -9,7 +9,7 @@
* workings can be found in the book "Software Solutions in C" by
* Dale Schumacher, Academic Press, ISBN: 0-12-632360-7.
*
* $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.51 2001/10/25 05:49:43 momjian Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.51.2.1 2002/02/19 22:19:42 tgl Exp $
*/
#include "postgres.h"
@ -287,7 +287,7 @@ cash_out(PG_FUNCTION_ARGS)
if (value < 0)
{
minus = 1;
value *= -1;
value = -value;
}
/* allow for trailing negative strings */
@ -301,8 +301,8 @@ cash_out(PG_FUNCTION_ARGS)
else if (comma && count % (mon_group + 1) == comma_position)
buf[count--] = comma;
buf[count--] = (value % 10) + '0';
value /= 10;
buf[count--] = ((unsigned int) value % 10) + '0';
value = ((unsigned int) value) / 10;
}
strncpy((buf + count - strlen(csymbol) + 1), csymbol, strlen(csymbol));
@ -664,6 +664,7 @@ Datum
cash_words(PG_FUNCTION_ARGS)
{
Cash value = PG_GETARG_CASH(0);
unsigned int val;
char buf[128];
char *p = buf;
Cash m0;
@ -682,10 +683,13 @@ cash_words(PG_FUNCTION_ARGS)
else
buf[0] = '\0';
m0 = value % 100; /* cents */
m1 = (value / 100) % 1000; /* hundreds */
m2 = (value / 100000) % 1000; /* thousands */
m3 = value / 100000000 % 1000; /* millions */
/* Now treat as unsigned, to avoid trouble at INT_MIN */
val = (unsigned int) value;
m0 = val % 100; /* cents */
m1 = (val / 100) % 1000; /* hundreds */
m2 = (val / 100000) % 1000; /* thousands */
m3 = val / 100000000 % 1000; /* millions */
if (m3)
{
@ -705,7 +709,7 @@ cash_words(PG_FUNCTION_ARGS)
if (!*p)
strcat(buf, "zero");
strcat(buf, (int) (value / 100) == 1 ? " dollar and " : " dollars and ");
strcat(buf, (val / 100) == 1 ? " dollar and " : " dollars and ");
strcat(buf, num_word(m0));
strcat(buf, m0 == 1 ? " cent" : " cents");
@ -733,7 +737,7 @@ num_word(Cash value)
"zero", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty",
"thirty", "fourty", "fifty", "sixty", "seventy", "eighty", "ninety"
"thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
};
const char **big = small + 18;
int tu = value % 100;

Loading…
Cancel
Save