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
+ unsignedint 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 = (unsignedint )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 ;