11/* -----------------------------------------------------------------------
22 * formatting.c
33 *
4- * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.109 2006/04/1914:48:06 momjian Exp $
4+ * $PostgreSQL: pgsql/src/backend/utils/adt/formatting.c,v 1.110 2006/04/1918:49:09 momjian Exp $
55 *
66 *
77 * Portions Copyright (c) 1999-2006, PostgreSQL Global Development Group
@@ -917,6 +917,7 @@ static void dump_node(FormatNode *node, int max);
917917
918918static char * get_th (char * num ,int type );
919919static char * str_numth (char * dest ,char * num ,int type );
920+ static int strspace_len (char * str );
920921static int strdigits_len (char * str );
921922static char * str_toupper (char * buff );
922923static char * str_tolower (char * buff );
@@ -1686,12 +1687,28 @@ is_next_separator(FormatNode *n)
16861687return TRUE;/* some non-digit input (separator) */
16871688}
16881689
1690+ static int
1691+ strspace_len (char * str )
1692+ {
1693+ int len = 0 ;
1694+
1695+ while (* str && isspace ((unsignedchar )* str ))
1696+ {
1697+ str ++ ;
1698+ len ++ ;
1699+ }
1700+ return len ;
1701+ }
1702+
16891703static int
16901704strdigits_len (char * str )
16911705{
16921706char * p = str ;
1693- int len = 0 ;
1707+ int len ;
16941708
1709+ len = strspace_len (str );
1710+ p += len ;
1711+
16951712while (* p && isdigit ((unsignedchar )* p )&& len <=DCH_MAX_ITEM_SIZ )
16961713{
16971714len ++ ;
@@ -1826,7 +1843,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
18261843else
18271844{
18281845sscanf (inout ,"%02d" ,& tmfc -> hh );
1829- return 2 + SKIP_THth (suf );
1846+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
18301847}
18311848}
18321849break ;
@@ -1848,7 +1865,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
18481865else
18491866{
18501867sscanf (inout ,"%02d" ,& tmfc -> hh );
1851- return 2 + SKIP_THth (suf );
1868+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
18521869}
18531870}
18541871break ;
@@ -1870,7 +1887,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
18701887else
18711888{
18721889sscanf (inout ,"%02d" ,& tmfc -> mi );
1873- return 2 + SKIP_THth (suf );
1890+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
18741891}
18751892}
18761893break ;
@@ -1892,7 +1909,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
18921909else
18931910{
18941911sscanf (inout ,"%02d" ,& tmfc -> ss );
1895- return 2 + SKIP_THth (suf );
1912+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
18961913}
18971914}
18981915break ;
@@ -1998,7 +2015,7 @@ dch_time(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
19982015else
19992016{
20002017sscanf (inout ,"%05d" ,& tmfc -> ssss );
2001- return 5 + SKIP_THth (suf );
2018+ return strspace_len ( inout ) + 5 + SKIP_THth (suf );
20022019}
20032020}
20042021break ;
@@ -2249,7 +2266,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
22492266else
22502267{
22512268sscanf (inout ,"%02d" ,& tmfc -> mm );
2252- return 2 + SKIP_THth (suf );
2269+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
22532270}
22542271}
22552272break ;
@@ -2323,7 +2340,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
23232340else
23242341{
23252342sscanf (inout ,"%03d" ,& tmfc -> ddd );
2326- return 3 + SKIP_THth (suf );
2343+ return strspace_len ( inout ) + 3 + SKIP_THth (suf );
23272344}
23282345}
23292346break ;
@@ -2345,7 +2362,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
23452362else
23462363{
23472364sscanf (inout ,"%02d" ,& tmfc -> dd );
2348- return 2 + SKIP_THth (suf );
2365+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
23492366}
23502367}
23512368break ;
@@ -2360,7 +2377,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
23602377else
23612378{
23622379sscanf (inout ,"%1d" ,& tmfc -> d );
2363- return 1 + SKIP_THth (suf );
2380+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
23642381}
23652382break ;
23662383case DCH_WW :
@@ -2382,7 +2399,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
23822399else
23832400{
23842401sscanf (inout ,"%02d" ,& tmfc -> ww );
2385- return 2 + SKIP_THth (suf );
2402+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
23862403}
23872404}
23882405break ;
@@ -2405,7 +2422,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
24052422else
24062423{
24072424sscanf (inout ,"%02d" ,& tmfc -> iw );
2408- return 2 + SKIP_THth (suf );
2425+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
24092426}
24102427}
24112428break ;
@@ -2422,7 +2439,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
24222439else
24232440{
24242441sscanf (inout ,"%1d" ,& tmfc -> q );
2425- return 1 + SKIP_THth (suf );
2442+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
24262443}
24272444break ;
24282445case DCH_CC :
@@ -2447,7 +2464,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
24472464else
24482465{
24492466sscanf (inout ,"%02d" ,& tmfc -> cc );
2450- return 2 + SKIP_THth (suf );
2467+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
24512468}
24522469}
24532470break ;
@@ -2507,7 +2524,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
25072524{
25082525sscanf (inout ,"%04d" ,& tmfc -> year );
25092526tmfc -> yysz = 4 ;
2510- return 4 + SKIP_THth (suf );
2527+ return strspace_len ( inout ) + 4 + SKIP_THth (suf );
25112528}
25122529}
25132530break ;
@@ -2540,7 +2557,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
25402557else
25412558tmfc -> year += 2000 ;
25422559tmfc -> yysz = 3 ;
2543- return 3 + SKIP_THth (suf );
2560+ return strspace_len ( inout ) + 3 + SKIP_THth (suf );
25442561}
25452562break ;
25462563case DCH_YY :
@@ -2572,7 +2589,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
25722589else
25732590tmfc -> year += 1900 ;
25742591tmfc -> yysz = 2 ;
2575- return 2 + SKIP_THth (suf );
2592+ return strspace_len ( inout ) + 2 + SKIP_THth (suf );
25762593}
25772594break ;
25782595case DCH_Y :
@@ -2600,7 +2617,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
26002617 */
26012618tmfc -> year += 2000 ;
26022619tmfc -> yysz = 1 ;
2603- return 1 + SKIP_THth (suf );
2620+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
26042621}
26052622break ;
26062623case DCH_RM :
@@ -2652,7 +2669,7 @@ dch_date(int arg, char *inout, int suf, bool is_to_char, bool is_interval,
26522669else
26532670{
26542671sscanf (inout ,"%1d" ,& tmfc -> w );
2655- return 1 + SKIP_THth (suf );
2672+ return strspace_len ( inout ) + 1 + SKIP_THth (suf );
26562673}
26572674break ;
26582675case DCH_J :