1
1
/* -----------------------------------------------------------------------
2
2
* formatting.c
3
3
*
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 $
5
5
*
6
6
*
7
7
* Portions Copyright (c) 1999-2000, PostgreSQL Global Development Group
@@ -1991,6 +1991,7 @@ static int
1991
1991
dch_date (int arg ,char * inout ,int suf ,int flag ,FormatNode * node ,void * data )
1992
1992
{
1993
1993
char buff [DCH_CACHE_SIZE ],
1994
+ workbuff [32 ],
1994
1995
* p_inout ;
1995
1996
int i ,
1996
1997
len ;
@@ -2113,21 +2114,27 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
2113
2114
}
2114
2115
break ;
2115
2116
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 ));
2118
2121
if (S_FM (suf ))
2119
2122
return strlen (p_inout )- 1 ;
2120
2123
else
2121
2124
return 8 ;
2122
2125
2123
2126
case DCH_Month :
2127
+ if (!tm -> tm_mon )
2128
+ return -1 ;
2124
2129
sprintf (inout ,"%*s" ,S_FM (suf ) ?0 :-9 ,months_full [tm -> tm_mon - 1 ]);
2125
2130
if (S_FM (suf ))
2126
2131
return strlen (p_inout )- 1 ;
2127
2132
else
2128
2133
return 8 ;
2129
2134
2130
2135
case DCH_month :
2136
+ if (!tm -> tm_mon )
2137
+ return -1 ;
2131
2138
sprintf (inout ,"%*s" ,S_FM (suf ) ?0 :-9 ,months_full [tm -> tm_mon - 1 ]);
2132
2139
* inout = tolower ((unsignedchar )* inout );
2133
2140
if (S_FM (suf ))
@@ -2136,15 +2143,21 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
2136
2143
return 8 ;
2137
2144
2138
2145
case DCH_MON :
2146
+ if (!tm -> tm_mon )
2147
+ return -1 ;
2139
2148
strcpy (inout ,months [tm -> tm_mon - 1 ]);
2140
2149
inout = str_toupper (inout );
2141
2150
return 2 ;
2142
2151
2143
2152
case DCH_Mon :
2153
+ if (!tm -> tm_mon )
2154
+ return -1 ;
2144
2155
strcpy (inout ,months [tm -> tm_mon - 1 ]);
2145
2156
return 2 ;
2146
2157
2147
2158
case DCH_mon :
2159
+ if (!tm -> tm_mon )
2160
+ return -1 ;
2148
2161
strcpy (inout ,months [tm -> tm_mon - 1 ]);
2149
2162
* inout = tolower ((unsignedchar )* inout );
2150
2163
return 2 ;
@@ -2159,7 +2172,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
2159
2172
return strlen (p_inout )- 1 ;
2160
2173
else
2161
2174
return 1 ;
2162
-
2163
2175
}
2164
2176
else if (flag == FROM_CHAR )
2165
2177
{
@@ -2176,8 +2188,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
2176
2188
}
2177
2189
break ;
2178
2190
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 ));
2181
2193
if (S_FM (suf ))
2182
2194
return strlen (p_inout )- 1 ;
2183
2195
else
@@ -2319,7 +2331,6 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
2319
2331
return strlen (p_inout )- 1 ;
2320
2332
else
2321
2333
return 1 ;
2322
-
2323
2334
}
2324
2335
else if (flag == FROM_CHAR )
2325
2336
{
@@ -2338,14 +2349,15 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
2338
2349
case DCH_Q :
2339
2350
if (flag == TO_CHAR )
2340
2351
{
2352
+ if (!tm -> tm_mon )
2353
+ return -1 ;
2341
2354
sprintf (inout ,"%d" , (tm -> tm_mon - 1 ) /3 + 1 );
2342
2355
if (S_THth (suf ))
2343
2356
{
2344
2357
str_numth (p_inout ,inout ,S_TH_TYPE (suf ));
2345
2358
return 2 ;
2346
2359
}
2347
2360
return 0 ;
2348
-
2349
2361
}
2350
2362
else if (flag == FROM_CHAR )
2351
2363
{
@@ -2515,6 +2527,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
2515
2527
case DCH_RM :
2516
2528
if (flag == TO_CHAR )
2517
2529
{
2530
+ if (!tm -> tm_mon )
2531
+ return -1 ;
2518
2532
sprintf (inout ,"%*s" ,S_FM (suf ) ?0 :-4 ,
2519
2533
rm_months_upper [12 - tm -> tm_mon ]);
2520
2534
if (S_FM (suf ))
@@ -2536,6 +2550,8 @@ dch_date(int arg, char *inout, int suf, int flag, FormatNode *node, void *data)
2536
2550
case DCH_rm :
2537
2551
if (flag == TO_CHAR )
2538
2552
{
2553
+ if (!tm -> tm_mon )
2554
+ return -1 ;
2539
2555
sprintf (inout ,"%*s" ,S_FM (suf ) ?0 :-4 ,
2540
2556
rm_months_lower [12 - tm -> tm_mon ]);
2541
2557
if (S_FM (suf ))