9
9
* workings can be found in the book "Software Solutions in C" by
10
10
* Dale Schumacher, Academic Press, ISBN: 0-12-632360-7.
11
11
*
12
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.51 2001/10/25 05:49:43 momjian Exp $
12
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/cash.c,v 1.52 2002/02/19 22:19:34 tgl Exp $
13
13
*/
14
14
15
15
#include "postgres.h"
@@ -287,7 +287,7 @@ cash_out(PG_FUNCTION_ARGS)
287
287
if (value < 0 )
288
288
{
289
289
minus = 1 ;
290
- value * = -1 ;
290
+ value = - value ;
291
291
}
292
292
293
293
/* allow for trailing negative strings */
@@ -301,8 +301,8 @@ cash_out(PG_FUNCTION_ARGS)
301
301
else if (comma && count % (mon_group + 1 ) == comma_position )
302
302
buf [count -- ] = comma ;
303
303
304
- buf [count -- ] = (value % 10 ) + '0' ;
305
- value /= 10 ;
304
+ buf [count -- ] = (( unsigned int ) value % 10 ) + '0' ;
305
+ value = (( unsigned int ) value ) / 10 ;
306
306
}
307
307
308
308
strncpy ((buf + count - strlen (csymbol ) + 1 ), csymbol , strlen (csymbol ));
@@ -664,6 +664,7 @@ Datum
664
664
cash_words (PG_FUNCTION_ARGS )
665
665
{
666
666
Cash value = PG_GETARG_CASH (0 );
667
+ unsigned int val ;
667
668
char buf [128 ];
668
669
char * p = buf ;
669
670
Cash m0 ;
@@ -682,10 +683,13 @@ cash_words(PG_FUNCTION_ARGS)
682
683
else
683
684
buf [0 ] = '\0' ;
684
685
685
- m0 = value % 100 ; /* cents */
686
- m1 = (value / 100 ) % 1000 ; /* hundreds */
687
- m2 = (value / 100000 ) % 1000 ; /* thousands */
688
- m3 = value / 100000000 % 1000 ; /* millions */
686
+ /* Now treat as unsigned, to avoid trouble at INT_MIN */
687
+ val = (unsigned int ) value ;
688
+
689
+ m0 = val % 100 ; /* cents */
690
+ m1 = (val / 100 ) % 1000 ; /* hundreds */
691
+ m2 = (val / 100000 ) % 1000 ; /* thousands */
692
+ m3 = val / 100000000 % 1000 ; /* millions */
689
693
690
694
if (m3 )
691
695
{
@@ -705,7 +709,7 @@ cash_words(PG_FUNCTION_ARGS)
705
709
if (!* p )
706
710
strcat (buf , "zero" );
707
711
708
- strcat (buf , (int ) ( value / 100 ) == 1 ? " dollar and " : " dollars and " );
712
+ strcat (buf , (val / 100 ) == 1 ? " dollar and " : " dollars and " );
709
713
strcat (buf , num_word (m0 ));
710
714
strcat (buf , m0 == 1 ? " cent" : " cents" );
711
715
@@ -733,7 +737,7 @@ num_word(Cash value)
733
737
"zero" , "one" , "two" , "three" , "four" , "five" , "six" , "seven" ,
734
738
"eight" , "nine" , "ten" , "eleven" , "twelve" , "thirteen" , "fourteen" ,
735
739
"fifteen" , "sixteen" , "seventeen" , "eighteen" , "nineteen" , "twenty" ,
736
- "thirty" , "fourty " , "fifty" , "sixty" , "seventy" , "eighty" , "ninety"
740
+ "thirty" , "forty " , "fifty" , "sixty" , "seventy" , "eighty" , "ninety"
737
741
};
738
742
const char * * big = small + 18 ;
739
743
int tu = value % 100 ;
0 commit comments