mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Avoid failures in cash_out and cash_words for INT_MIN.
Also, 'fourty' -> 'forty'.
This commit is contained in:
		@@ -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.51.2.1 2002/02/19 22:19:42 tgl Exp $
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "postgres.h"
 | 
					#include "postgres.h"
 | 
				
			||||||
@@ -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)
 | 
				
			|||||||
		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
 | 
				
			|||||||
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)
 | 
				
			|||||||
	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)
 | 
				
			|||||||
	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)
 | 
				
			|||||||
		"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;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user