11/* -----------------------------------------------------------------------
22 * formatting.c
33 *
4- * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.49 2002/01/04 15:49:42 thomas Exp $
4+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/formatting.c,v 1.49.2.1 2005/03/26 00:42:56 tgl Exp $
55 *
66 *
77 * Portions Copyright (c) 1999-2000, PostgreSQL Global Development Group
@@ -1991,6 +1991,7 @@ static int
19911991dch_date (int arg , char * inout , int suf , int flag , FormatNode * node , void * data )
19921992{
19931993 char buff [DCH_CACHE_SIZE ],
1994+ workbuff [32 ],
19941995 * p_inout ;
19951996 int i ,
19961997 len ;
@@ -2113,21 +2114,27 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
21132114 }
21142115 break ;
21152116 case DCH_MONTH :
2116- strcpy (inout , months_full [tm -> tm_mon - 1 ]);
2117- sprintf (inout , "%*s" , S_FM (suf ) ? 0 : -9 , str_toupper (inout ));
2117+ if (!tm -> tm_mon )
2118+ return -1 ;
2119+ strcpy (workbuff , months_full [tm -> tm_mon - 1 ]);
2120+ sprintf (inout , "%*s" , S_FM (suf ) ? 0 : -9 , str_toupper (workbuff ));
21182121 if (S_FM (suf ))
21192122 return strlen (p_inout ) - 1 ;
21202123 else
21212124 return 8 ;
21222125
21232126 case DCH_Month :
2127+ if (!tm -> tm_mon )
2128+ return -1 ;
21242129 sprintf (inout , "%*s" , S_FM (suf ) ? 0 : -9 , months_full [tm -> tm_mon - 1 ]);
21252130 if (S_FM (suf ))
21262131 return strlen (p_inout ) - 1 ;
21272132 else
21282133 return 8 ;
21292134
21302135 case DCH_month :
2136+ if (!tm -> tm_mon )
2137+ return -1 ;
21312138 sprintf (inout , "%*s" , S_FM (suf ) ? 0 : -9 , months_full [tm -> tm_mon - 1 ]);
21322139 * inout = tolower ((unsigned char ) * inout );
21332140 if (S_FM (suf ))
@@ -2136,15 +2143,21 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
21362143 return 8 ;
21372144
21382145 case DCH_MON :
2146+ if (!tm -> tm_mon )
2147+ return -1 ;
21392148 strcpy (inout , months [tm -> tm_mon - 1 ]);
21402149 inout = str_toupper (inout );
21412150 return 2 ;
21422151
21432152 case DCH_Mon :
2153+ if (!tm -> tm_mon )
2154+ return -1 ;
21442155 strcpy (inout , months [tm -> tm_mon - 1 ]);
21452156 return 2 ;
21462157
21472158 case DCH_mon :
2159+ if (!tm -> tm_mon )
2160+ return -1 ;
21482161 strcpy (inout , months [tm -> tm_mon - 1 ]);
21492162 * inout = tolower ((unsigned char ) * inout );
21502163 return 2 ;
@@ -2159,7 +2172,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
21592172 return strlen (p_inout ) - 1 ;
21602173 else
21612174 return 1 ;
2162-
21632175 }
21642176 else if (flag == FROM_CHAR )
21652177 {
@@ -2176,8 +2188,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
21762188 }
21772189 break ;
21782190 case DCH_DAY :
2179- strcpy (inout , days [tm -> tm_wday ]);
2180- sprintf (inout , "%*s" , S_FM (suf ) ? 0 : -9 , str_toupper (inout ));
2191+ strcpy (workbuff , days [tm -> tm_wday ]);
2192+ sprintf (inout , "%*s" , S_FM (suf ) ? 0 : -9 , str_toupper (workbuff ));
21812193 if (S_FM (suf ))
21822194 return strlen (p_inout ) - 1 ;
21832195 else
@@ -2319,7 +2331,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
23192331 return strlen (p_inout ) - 1 ;
23202332 else
23212333 return 1 ;
2322-
23232334 }
23242335 else if (flag == FROM_CHAR )
23252336 {
@@ -2338,14 +2349,15 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
23382349 case DCH_Q :
23392350 if (flag == TO_CHAR )
23402351 {
2352+ if (!tm -> tm_mon )
2353+ return -1 ;
23412354 sprintf (inout , "%d" , (tm -> tm_mon - 1 ) / 3 + 1 );
23422355 if (S_THth (suf ))
23432356 {
23442357 str_numth (p_inout , inout , S_TH_TYPE (suf ));
23452358 return 2 ;
23462359 }
23472360 return 0 ;
2348-
23492361 }
23502362 else if (flag == FROM_CHAR )
23512363 {
@@ -2515,6 +2527,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
25152527 case DCH_RM :
25162528 if (flag == TO_CHAR )
25172529 {
2530+ if (!tm -> tm_mon )
2531+ return -1 ;
25182532 sprintf (inout , "%*s" , S_FM (suf ) ? 0 : -4 ,
25192533 rm_months_upper [12 - tm -> tm_mon ]);
25202534 if (S_FM (suf ))
@@ -2536,6 +2550,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
25362550 case DCH_rm :
25372551 if (flag == TO_CHAR )
25382552 {
2553+ if (!tm -> tm_mon )
2554+ return -1 ;
25392555 sprintf (inout , "%*s" , S_FM (suf ) ? 0 : -4 ,
25402556 rm_months_lower [12 - tm -> tm_mon ]);
25412557 if (S_FM (suf ))
0 commit comments