1
1
/* -----------------------------------------------------------------------
2
2
* formatting.c
3
3
*
4
- * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.109 2006/04/19 14:48:06 momjian Exp $
4
+ * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.110 2006/04/19 18:49:09 momjian Exp $
5
5
*
6
6
*
7
7
* Portions Copyright (c) 1999-2006, PostgreSQL Global Development Group
@@ -917,6 +917,7 @@ static void dump_node(FormatNode *node, int max);
917
917
918
918
static char * get_th (char * num , int type );
919
919
static char * str_numth (char * dest , char * num , int type );
920
+ static int strspace_len (char * str );
920
921
static int strdigits_len (char * str );
921
922
static char * str_toupper (char * buff );
922
923
static char * str_tolower (char * buff );
@@ -1686,12 +1687,28 @@ is_next_separator(FormatNode *n)
1686
1687
return TRUE; /* some non-digit input (separator) */
1687
1688
}
1688
1689
1690
+ static int
1691
+ strspace_len (char * str )
1692
+ {
1693
+ int len = 0 ;
1694
+
1695
+ while (* str && isspace ((unsigned char ) * str ))
1696
+ {
1697
+ str ++ ;
1698
+ len ++ ;
1699
+ }
1700
+ return len ;
1701
+ }
1702
+
1689
1703
static int
1690
1704
strdigits_len (char * str )
1691
1705
{
1692
1706
char * p = str ;
1693
- int len = 0 ;
1707
+ int len ;
1694
1708
1709
+ len = strspace_len (str );
1710
+ p += len ;
1711
+
1695
1712
while (* p && isdigit ((unsigned char ) * p ) && len <= DCH_MAX_ITEM_SIZ )
1696
1713
{
1697
1714
len ++ ;
@@ -1826,7 +1843,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
1826
1843
else
1827
1844
{
1828
1845
sscanf (inout , "%02d" , & tmfc -> hh );
1829
- return 2 + SKIP_THth (suf );
1846
+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
1830
1847
}
1831
1848
}
1832
1849
break ;
@@ -1848,7 +1865,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
1848
1865
else
1849
1866
{
1850
1867
sscanf (inout , "%02d" , & tmfc -> hh );
1851
- return 2 + SKIP_THth (suf );
1868
+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
1852
1869
}
1853
1870
}
1854
1871
break ;
@@ -1870,7 +1887,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
1870
1887
else
1871
1888
{
1872
1889
sscanf (inout , "%02d" , & tmfc -> mi );
1873
- return 2 + SKIP_THth (suf );
1890
+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
1874
1891
}
1875
1892
}
1876
1893
break ;
@@ -1892,7 +1909,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
1892
1909
else
1893
1910
{
1894
1911
sscanf (inout , "%02d" , & tmfc -> ss );
1895
- return 2 + SKIP_THth (suf );
1912
+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
1896
1913
}
1897
1914
}
1898
1915
break ;
@@ -1998,7 +2015,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
1998
2015
else
1999
2016
{
2000
2017
sscanf (inout , "%05d" , & tmfc -> ssss );
2001
- return 5 + SKIP_THth (suf );
2018
+ return strspace_len ( inout ) + 5 + SKIP_THth (suf );
2002
2019
}
2003
2020
}
2004
2021
break ;
@@ -2249,7 +2266,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2249
2266
else
2250
2267
{
2251
2268
sscanf (inout , "%02d" , & tmfc -> mm );
2252
- return 2 + SKIP_THth (suf );
2269
+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
2253
2270
}
2254
2271
}
2255
2272
break ;
@@ -2323,7 +2340,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2323
2340
else
2324
2341
{
2325
2342
sscanf (inout , "%03d" , & tmfc -> ddd );
2326
- return 3 + SKIP_THth (suf );
2343
+ return strspace_len ( inout ) + 3 + SKIP_THth (suf );
2327
2344
}
2328
2345
}
2329
2346
break ;
@@ -2345,7 +2362,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2345
2362
else
2346
2363
{
2347
2364
sscanf (inout , "%02d" , & tmfc -> dd );
2348
- return 2 + SKIP_THth (suf );
2365
+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
2349
2366
}
2350
2367
}
2351
2368
break ;
@@ -2360,7 +2377,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2360
2377
else
2361
2378
{
2362
2379
sscanf (inout , "%1d" , & tmfc -> d );
2363
- return 1 + SKIP_THth (suf );
2380
+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
2364
2381
}
2365
2382
break ;
2366
2383
case DCH_WW :
@@ -2382,7 +2399,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2382
2399
else
2383
2400
{
2384
2401
sscanf (inout , "%02d" , & tmfc -> ww );
2385
- return 2 + SKIP_THth (suf );
2402
+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
2386
2403
}
2387
2404
}
2388
2405
break ;
@@ -2405,7 +2422,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2405
2422
else
2406
2423
{
2407
2424
sscanf (inout , "%02d" , & tmfc -> iw );
2408
- return 2 + SKIP_THth (suf );
2425
+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
2409
2426
}
2410
2427
}
2411
2428
break ;
@@ -2422,7 +2439,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2422
2439
else
2423
2440
{
2424
2441
sscanf (inout , "%1d" , & tmfc -> q );
2425
- return 1 + SKIP_THth (suf );
2442
+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
2426
2443
}
2427
2444
break ;
2428
2445
case DCH_CC :
@@ -2447,7 +2464,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2447
2464
else
2448
2465
{
2449
2466
sscanf (inout , "%02d" , & tmfc -> cc );
2450
- return 2 + SKIP_THth (suf );
2467
+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
2451
2468
}
2452
2469
}
2453
2470
break ;
@@ -2507,7 +2524,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2507
2524
{
2508
2525
sscanf (inout , "%04d" , & tmfc -> year );
2509
2526
tmfc -> yysz = 4 ;
2510
- return 4 + SKIP_THth (suf );
2527
+ return strspace_len ( inout ) + 4 + SKIP_THth (suf );
2511
2528
}
2512
2529
}
2513
2530
break ;
@@ -2540,7 +2557,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2540
2557
else
2541
2558
tmfc -> year += 2000 ;
2542
2559
tmfc -> yysz = 3 ;
2543
- return 3 + SKIP_THth (suf );
2560
+ return strspace_len ( inout ) + 3 + SKIP_THth (suf );
2544
2561
}
2545
2562
break ;
2546
2563
case DCH_YY :
@@ -2572,7 +2589,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2572
2589
else
2573
2590
tmfc -> year += 1900 ;
2574
2591
tmfc -> yysz = 2 ;
2575
- return 2 + SKIP_THth (suf );
2592
+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
2576
2593
}
2577
2594
break ;
2578
2595
case DCH_Y :
@@ -2600,7 +2617,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2600
2617
*/
2601
2618
tmfc -> year += 2000 ;
2602
2619
tmfc -> yysz = 1 ;
2603
- return 1 + SKIP_THth (suf );
2620
+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
2604
2621
}
2605
2622
break ;
2606
2623
case DCH_RM :
@@ -2652,7 +2669,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
2652
2669
else
2653
2670
{
2654
2671
sscanf (inout , "%1d" , & tmfc -> w );
2655
- return 1 + SKIP_THth (suf );
2672
+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
2656
2673
}
2657
2674
break ;
2658
2675
case DCH_J :
0 commit comments