Commit d9b01c13 authored by Tom Lane's avatar Tom Lane

Avoid failures in cash_out and cash_words for INT_MIN.

Also, 'fourty' -> 'forty'.
parent a2b4dbd4
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
* workings can be found in the book "Software Solutions in C" by * workings can be found in the book "Software Solutions in C" by
* Dale Schumacher, Academic Press, ISBN: 0-12-632360-7. * 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.52 2002/02/19 22:19:34 tgl Exp $
*/ */
#include "postgres.h" #include "postgres.h"
...@@ -287,7 +287,7 @@ cash_out(PG_FUNCTION_ARGS) ...@@ -287,7 +287,7 @@ cash_out(PG_FUNCTION_ARGS)
if (value < 0) if (value < 0)
{ {
minus = 1; minus = 1;
value *= -1; value = -value;
} }
/* allow for trailing negative strings */ /* allow for trailing negative strings */
...@@ -301,8 +301,8 @@ cash_out(PG_FUNCTION_ARGS) ...@@ -301,8 +301,8 @@ cash_out(PG_FUNCTION_ARGS)
else if (comma && count % (mon_group + 1) == comma_position) else if (comma && count % (mon_group + 1) == comma_position)
buf[count--] = comma; buf[count--] = comma;
buf[count--] = (value % 10) + '0'; buf[count--] = ((unsigned int) value % 10) + '0';
value /= 10; value = ((unsigned int) value) / 10;
} }
strncpy((buf + count - strlen(csymbol) + 1), csymbol, strlen(csymbol)); strncpy((buf + count - strlen(csymbol) + 1), csymbol, strlen(csymbol));
...@@ -664,6 +664,7 @@ Datum ...@@ -664,6 +664,7 @@ Datum
cash_words(PG_FUNCTION_ARGS) cash_words(PG_FUNCTION_ARGS)
{ {
Cash value = PG_GETARG_CASH(0); Cash value = PG_GETARG_CASH(0);
unsigned int val;
char buf[128]; char buf[128];
char *p = buf; char *p = buf;
Cash m0; Cash m0;
...@@ -682,10 +683,13 @@ cash_words(PG_FUNCTION_ARGS) ...@@ -682,10 +683,13 @@ cash_words(PG_FUNCTION_ARGS)
else else
buf[0] = '\0'; buf[0] = '\0';
m0 = value % 100; /* cents */ /* Now treat as unsigned, to avoid trouble at INT_MIN */
m1 = (value / 100) % 1000; /* hundreds */ val = (unsigned int) value;
m2 = (value / 100000) % 1000; /* thousands */
m3 = value / 100000000 % 1000; /* millions */ m0 = val % 100; /* cents */
m1 = (val / 100) % 1000; /* hundreds */
m2 = (val / 100000) % 1000; /* thousands */
m3 = val / 100000000 % 1000; /* millions */
if (m3) if (m3)
{ {
...@@ -705,7 +709,7 @@ cash_words(PG_FUNCTION_ARGS) ...@@ -705,7 +709,7 @@ cash_words(PG_FUNCTION_ARGS)
if (!*p) if (!*p)
strcat(buf, "zero"); 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, num_word(m0));
strcat(buf, m0 == 1 ? " cent" : " cents"); strcat(buf, m0 == 1 ? " cent" : " cents");
...@@ -733,7 +737,7 @@ num_word(Cash value) ...@@ -733,7 +737,7 @@ num_word(Cash value)
"zero", "one", "two", "three", "four", "five", "six", "seven", "zero", "one", "two", "three", "four", "five", "six", "seven",
"eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen",
"fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", "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; const char **big = small + 18;
int tu = value % 100; int tu = value % 100;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment