@@ -969,7 +969,6 @@ static char *get_th(char *num, int type);
969
969
static char * str_numth (char * dest , char * num , int type );
970
970
static int adjust_partial_year_to_2020 (int year );
971
971
static int strspace_len (char * str );
972
- static int strdigits_len (char * str );
973
972
static void from_char_set_mode (TmFromChar * tmfc , const FromCharDateMode mode );
974
973
static void from_char_set_int (int * dest , const int value , const FormatNode * node );
975
974
static int from_char_parse_int_len (int * dest , char * * src , const int len , FormatNode * node );
@@ -1981,9 +1980,19 @@ asc_toupper_z(const char *buff)
1981
1980
1982
1981
/* ----------
1983
1982
* Skip TM / th in FROM_CHAR
1983
+ *
1984
+ * If S_THth is on, skip two chars, assuming there are two available
1984
1985
* ----------
1985
1986
*/
1986
- #define SKIP_THth (_suf ) (S_THth(_suf) ? 2 : 0)
1987
+ #define SKIP_THth (ptr , _suf ) \
1988
+ do { \
1989
+ if (S_THth(_suf)) \
1990
+ { \
1991
+ if (*(ptr)) (ptr)++; \
1992
+ if (*(ptr)) (ptr)++; \
1993
+ } \
1994
+ } while (0)
1995
+
1987
1996
1988
1997
#ifdef DEBUG_TO_FROM_CHAR
1989
1998
/* -----------
@@ -2091,23 +2100,6 @@ strspace_len(char *str)
2091
2100
return len ;
2092
2101
}
2093
2102
2094
- static int
2095
- strdigits_len (char * str )
2096
- {
2097
- char * p = str ;
2098
- int len ;
2099
-
2100
- len = strspace_len (str );
2101
- p += len ;
2102
-
2103
- while (* p && isdigit ((unsigned char ) * p ) && len <= DCH_MAX_ITEM_SIZ )
2104
- {
2105
- len ++ ;
2106
- p ++ ;
2107
- }
2108
- return len ;
2109
- }
2110
-
2111
2103
/*
2112
2104
* Set the date mode of a from-char conversion.
2113
2105
*
@@ -2985,19 +2977,19 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
2985
2977
case DCH_HH12 :
2986
2978
from_char_parse_int_len (& out -> hh , & s , 2 , n );
2987
2979
out -> clock = CLOCK_12_HOUR ;
2988
- s += SKIP_THth (n -> suffix );
2980
+ SKIP_THth (s , n -> suffix );
2989
2981
break ;
2990
2982
case DCH_HH24 :
2991
2983
from_char_parse_int_len (& out -> hh , & s , 2 , n );
2992
- s += SKIP_THth (n -> suffix );
2984
+ SKIP_THth (s , n -> suffix );
2993
2985
break ;
2994
2986
case DCH_MI :
2995
2987
from_char_parse_int (& out -> mi , & s , n );
2996
- s += SKIP_THth (n -> suffix );
2988
+ SKIP_THth (s , n -> suffix );
2997
2989
break ;
2998
2990
case DCH_SS :
2999
2991
from_char_parse_int (& out -> ss , & s , n );
3000
- s += SKIP_THth (n -> suffix );
2992
+ SKIP_THth (s , n -> suffix );
3001
2993
break ;
3002
2994
case DCH_MS : /* millisecond */
3003
2995
len = from_char_parse_int_len (& out -> ms , & s , 3 , n );
@@ -3008,7 +3000,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3008
3000
out -> ms *= len == 1 ? 100 :
3009
3001
len == 2 ? 10 : 1 ;
3010
3002
3011
- s += SKIP_THth (n -> suffix );
3003
+ SKIP_THth (s , n -> suffix );
3012
3004
break ;
3013
3005
case DCH_US : /* microsecond */
3014
3006
len = from_char_parse_int_len (& out -> us , & s , 6 , n );
@@ -3019,11 +3011,11 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3019
3011
len == 4 ? 100 :
3020
3012
len == 5 ? 10 : 1 ;
3021
3013
3022
- s += SKIP_THth (n -> suffix );
3014
+ SKIP_THth (s , n -> suffix );
3023
3015
break ;
3024
3016
case DCH_SSSS :
3025
3017
from_char_parse_int (& out -> ssss , & s , n );
3026
- s += SKIP_THth (n -> suffix );
3018
+ SKIP_THth (s , n -> suffix );
3027
3019
break ;
3028
3020
case DCH_tz :
3029
3021
case DCH_TZ :
@@ -3062,7 +3054,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3062
3054
break ;
3063
3055
case DCH_MM :
3064
3056
from_char_parse_int (& out -> mm , & s , n );
3065
- s += SKIP_THth (n -> suffix );
3057
+ SKIP_THth (s , n -> suffix );
3066
3058
break ;
3067
3059
case DCH_DAY :
3068
3060
case DCH_Day :
@@ -3082,31 +3074,31 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3082
3074
break ;
3083
3075
case DCH_DDD :
3084
3076
from_char_parse_int (& out -> ddd , & s , n );
3085
- s += SKIP_THth (n -> suffix );
3077
+ SKIP_THth (s , n -> suffix );
3086
3078
break ;
3087
3079
case DCH_IDDD :
3088
3080
from_char_parse_int_len (& out -> ddd , & s , 3 , n );
3089
- s += SKIP_THth (n -> suffix );
3081
+ SKIP_THth (s , n -> suffix );
3090
3082
break ;
3091
3083
case DCH_DD :
3092
3084
from_char_parse_int (& out -> dd , & s , n );
3093
- s += SKIP_THth (n -> suffix );
3085
+ SKIP_THth (s , n -> suffix );
3094
3086
break ;
3095
3087
case DCH_D :
3096
3088
from_char_parse_int (& out -> d , & s , n );
3097
- s += SKIP_THth (n -> suffix );
3089
+ SKIP_THth (s , n -> suffix );
3098
3090
break ;
3099
3091
case DCH_ID :
3100
3092
from_char_parse_int_len (& out -> d , & s , 1 , n );
3101
3093
/* Shift numbering to match Gregorian where Sunday = 1 */
3102
3094
if (++ out -> d > 7 )
3103
3095
out -> d = 1 ;
3104
- s += SKIP_THth (n -> suffix );
3096
+ SKIP_THth (s , n -> suffix );
3105
3097
break ;
3106
3098
case DCH_WW :
3107
3099
case DCH_IW :
3108
3100
from_char_parse_int (& out -> ww , & s , n );
3109
- s += SKIP_THth (n -> suffix );
3101
+ SKIP_THth (s , n -> suffix );
3110
3102
break ;
3111
3103
case DCH_Q :
3112
3104
@@ -3121,55 +3113,57 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3121
3113
* isn't stored anywhere in 'out'.
3122
3114
*/
3123
3115
from_char_parse_int ((int * ) NULL , & s , n );
3124
- s += SKIP_THth (n -> suffix );
3116
+ SKIP_THth (s , n -> suffix );
3125
3117
break ;
3126
3118
case DCH_CC :
3127
3119
from_char_parse_int (& out -> cc , & s , n );
3128
- s += SKIP_THth (n -> suffix );
3120
+ SKIP_THth (s , n -> suffix );
3129
3121
break ;
3130
3122
case DCH_Y_YYY :
3131
3123
{
3132
3124
int matched ,
3133
3125
years ,
3134
- millenia ;
3126
+ millenia ,
3127
+ nch ;
3135
3128
3136
- matched = sscanf (s , "%d,%03d" , & millenia , & years );
3137
- if (matched != 2 )
3129
+ matched = sscanf (s , "%d,%03d%n " , & millenia , & years , & nch );
3130
+ if (matched < 2 )
3138
3131
ereport (ERROR ,
3139
3132
(errcode (ERRCODE_INVALID_DATETIME_FORMAT ),
3140
3133
errmsg ("invalid input string for \"Y,YYY\"" )));
3141
3134
years += (millenia * 1000 );
3142
3135
from_char_set_int (& out -> year , years , n );
3143
3136
out -> yysz = 4 ;
3144
- s += strdigits_len (s ) + 4 + SKIP_THth (n -> suffix );
3137
+ s += nch ;
3138
+ SKIP_THth (s , n -> suffix );
3145
3139
}
3146
3140
break ;
3147
3141
case DCH_YYYY :
3148
3142
case DCH_IYYY :
3149
3143
from_char_parse_int (& out -> year , & s , n );
3150
3144
out -> yysz = 4 ;
3151
- s += SKIP_THth (n -> suffix );
3145
+ SKIP_THth (s , n -> suffix );
3152
3146
break ;
3153
3147
case DCH_YYY :
3154
3148
case DCH_IYY :
3155
3149
if (from_char_parse_int (& out -> year , & s , n ) < 4 )
3156
3150
out -> year = adjust_partial_year_to_2020 (out -> year );
3157
3151
out -> yysz = 3 ;
3158
- s += SKIP_THth (n -> suffix );
3152
+ SKIP_THth (s , n -> suffix );
3159
3153
break ;
3160
3154
case DCH_YY :
3161
3155
case DCH_IY :
3162
3156
if (from_char_parse_int (& out -> year , & s , n ) < 4 )
3163
3157
out -> year = adjust_partial_year_to_2020 (out -> year );
3164
3158
out -> yysz = 2 ;
3165
- s += SKIP_THth (n -> suffix );
3159
+ SKIP_THth (s , n -> suffix );
3166
3160
break ;
3167
3161
case DCH_Y :
3168
3162
case DCH_I :
3169
3163
if (from_char_parse_int (& out -> year , & s , n ) < 4 )
3170
3164
out -> year = adjust_partial_year_to_2020 (out -> year );
3171
3165
out -> yysz = 1 ;
3172
- s += SKIP_THth (n -> suffix );
3166
+ SKIP_THth (s , n -> suffix );
3173
3167
break ;
3174
3168
case DCH_RM :
3175
3169
from_char_seq_search (& value , & s , rm_months_upper ,
@@ -3183,11 +3177,11 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3183
3177
break ;
3184
3178
case DCH_W :
3185
3179
from_char_parse_int (& out -> w , & s , n );
3186
- s += SKIP_THth (n -> suffix );
3180
+ SKIP_THth (s , n -> suffix );
3187
3181
break ;
3188
3182
case DCH_J :
3189
3183
from_char_parse_int (& out -> j , & s , n );
3190
- s += SKIP_THth (n -> suffix );
3184
+ SKIP_THth (s , n -> suffix );
3191
3185
break ;
3192
3186
}
3193
3187
}
0 commit comments