@@ -964,7 +964,6 @@ static const char *get_th(char *num, int type);
964
964
static char * str_numth (char * dest , char * num , int type );
965
965
static int adjust_partial_year_to_2020 (int year );
966
966
static int strspace_len (char * str );
967
- static int strdigits_len (char * str );
968
967
static void from_char_set_mode (TmFromChar * tmfc , const FromCharDateMode mode );
969
968
static void from_char_set_int (int * dest , const int value , const FormatNode * node );
970
969
static int from_char_parse_int_len (int * dest , char * * src , const int len , FormatNode * node );
@@ -1976,9 +1975,19 @@ asc_toupper_z(const char *buff)
1976
1975
1977
1976
/* ----------
1978
1977
* Skip TM / th in FROM_CHAR
1978
+ *
1979
+ * If S_THth is on, skip two chars, assuming there are two available
1979
1980
* ----------
1980
1981
*/
1981
- #define SKIP_THth (_suf ) (S_THth(_suf) ? 2 : 0)
1982
+ #define SKIP_THth (ptr , _suf ) \
1983
+ do { \
1984
+ if (S_THth(_suf)) \
1985
+ { \
1986
+ if (*(ptr)) (ptr)++; \
1987
+ if (*(ptr)) (ptr)++; \
1988
+ } \
1989
+ } while (0)
1990
+
1982
1991
1983
1992
#ifdef DEBUG_TO_FROM_CHAR
1984
1993
/* -----------
@@ -2086,23 +2095,6 @@ strspace_len(char *str)
2086
2095
return len ;
2087
2096
}
2088
2097
2089
- static int
2090
- strdigits_len (char * str )
2091
- {
2092
- char * p = str ;
2093
- int len ;
2094
-
2095
- len = strspace_len (str );
2096
- p += len ;
2097
-
2098
- while (* p && isdigit ((unsigned char ) * p ) && len <= DCH_MAX_ITEM_SIZ )
2099
- {
2100
- len ++ ;
2101
- p ++ ;
2102
- }
2103
- return len ;
2104
- }
2105
-
2106
2098
/*
2107
2099
* Set the date mode of a from-char conversion.
2108
2100
*
@@ -3007,19 +2999,19 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3007
2999
case DCH_HH12 :
3008
3000
from_char_parse_int_len (& out -> hh , & s , 2 , n );
3009
3001
out -> clock = CLOCK_12_HOUR ;
3010
- s += SKIP_THth (n -> suffix );
3002
+ SKIP_THth (s , n -> suffix );
3011
3003
break ;
3012
3004
case DCH_HH24 :
3013
3005
from_char_parse_int_len (& out -> hh , & s , 2 , n );
3014
- s += SKIP_THth (n -> suffix );
3006
+ SKIP_THth (s , n -> suffix );
3015
3007
break ;
3016
3008
case DCH_MI :
3017
3009
from_char_parse_int (& out -> mi , & s , n );
3018
- s += SKIP_THth (n -> suffix );
3010
+ SKIP_THth (s , n -> suffix );
3019
3011
break ;
3020
3012
case DCH_SS :
3021
3013
from_char_parse_int (& out -> ss , & s , n );
3022
- s += SKIP_THth (n -> suffix );
3014
+ SKIP_THth (s , n -> suffix );
3023
3015
break ;
3024
3016
case DCH_MS : /* millisecond */
3025
3017
len = from_char_parse_int_len (& out -> ms , & s , 3 , n );
@@ -3030,7 +3022,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3030
3022
out -> ms *= len == 1 ? 100 :
3031
3023
len == 2 ? 10 : 1 ;
3032
3024
3033
- s += SKIP_THth (n -> suffix );
3025
+ SKIP_THth (s , n -> suffix );
3034
3026
break ;
3035
3027
case DCH_US : /* microsecond */
3036
3028
len = from_char_parse_int_len (& out -> us , & s , 6 , n );
@@ -3041,11 +3033,11 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3041
3033
len == 4 ? 100 :
3042
3034
len == 5 ? 10 : 1 ;
3043
3035
3044
- s += SKIP_THth (n -> suffix );
3036
+ SKIP_THth (s , n -> suffix );
3045
3037
break ;
3046
3038
case DCH_SSSS :
3047
3039
from_char_parse_int (& out -> ssss , & s , n );
3048
- s += SKIP_THth (n -> suffix );
3040
+ SKIP_THth (s , n -> suffix );
3049
3041
break ;
3050
3042
case DCH_tz :
3051
3043
case DCH_TZ :
@@ -3085,7 +3077,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3085
3077
break ;
3086
3078
case DCH_MM :
3087
3079
from_char_parse_int (& out -> mm , & s , n );
3088
- s += SKIP_THth (n -> suffix );
3080
+ SKIP_THth (s , n -> suffix );
3089
3081
break ;
3090
3082
case DCH_DAY :
3091
3083
case DCH_Day :
@@ -3105,31 +3097,31 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3105
3097
break ;
3106
3098
case DCH_DDD :
3107
3099
from_char_parse_int (& out -> ddd , & s , n );
3108
- s += SKIP_THth (n -> suffix );
3100
+ SKIP_THth (s , n -> suffix );
3109
3101
break ;
3110
3102
case DCH_IDDD :
3111
3103
from_char_parse_int_len (& out -> ddd , & s , 3 , n );
3112
- s += SKIP_THth (n -> suffix );
3104
+ SKIP_THth (s , n -> suffix );
3113
3105
break ;
3114
3106
case DCH_DD :
3115
3107
from_char_parse_int (& out -> dd , & s , n );
3116
- s += SKIP_THth (n -> suffix );
3108
+ SKIP_THth (s , n -> suffix );
3117
3109
break ;
3118
3110
case DCH_D :
3119
3111
from_char_parse_int (& out -> d , & s , n );
3120
- s += SKIP_THth (n -> suffix );
3112
+ SKIP_THth (s , n -> suffix );
3121
3113
break ;
3122
3114
case DCH_ID :
3123
3115
from_char_parse_int_len (& out -> d , & s , 1 , n );
3124
3116
/* Shift numbering to match Gregorian where Sunday = 1 */
3125
3117
if (++ out -> d > 7 )
3126
3118
out -> d = 1 ;
3127
- s += SKIP_THth (n -> suffix );
3119
+ SKIP_THth (s , n -> suffix );
3128
3120
break ;
3129
3121
case DCH_WW :
3130
3122
case DCH_IW :
3131
3123
from_char_parse_int (& out -> ww , & s , n );
3132
- s += SKIP_THth (n -> suffix );
3124
+ SKIP_THth (s , n -> suffix );
3133
3125
break ;
3134
3126
case DCH_Q :
3135
3127
@@ -3144,55 +3136,57 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3144
3136
* isn't stored anywhere in 'out'.
3145
3137
*/
3146
3138
from_char_parse_int ((int * ) NULL , & s , n );
3147
- s += SKIP_THth (n -> suffix );
3139
+ SKIP_THth (s , n -> suffix );
3148
3140
break ;
3149
3141
case DCH_CC :
3150
3142
from_char_parse_int (& out -> cc , & s , n );
3151
- s += SKIP_THth (n -> suffix );
3143
+ SKIP_THth (s , n -> suffix );
3152
3144
break ;
3153
3145
case DCH_Y_YYY :
3154
3146
{
3155
3147
int matched ,
3156
3148
years ,
3157
- millenia ;
3149
+ millenia ,
3150
+ nch ;
3158
3151
3159
- matched = sscanf (s , "%d,%03d" , & millenia , & years );
3160
- if (matched != 2 )
3152
+ matched = sscanf (s , "%d,%03d%n " , & millenia , & years , & nch );
3153
+ if (matched < 2 )
3161
3154
ereport (ERROR ,
3162
3155
(errcode (ERRCODE_INVALID_DATETIME_FORMAT ),
3163
3156
errmsg ("invalid input string for \"Y,YYY\"" )));
3164
3157
years += (millenia * 1000 );
3165
3158
from_char_set_int (& out -> year , years , n );
3166
3159
out -> yysz = 4 ;
3167
- s += strdigits_len (s ) + 4 + SKIP_THth (n -> suffix );
3160
+ s += nch ;
3161
+ SKIP_THth (s , n -> suffix );
3168
3162
}
3169
3163
break ;
3170
3164
case DCH_YYYY :
3171
3165
case DCH_IYYY :
3172
3166
from_char_parse_int (& out -> year , & s , n );
3173
3167
out -> yysz = 4 ;
3174
- s += SKIP_THth (n -> suffix );
3168
+ SKIP_THth (s , n -> suffix );
3175
3169
break ;
3176
3170
case DCH_YYY :
3177
3171
case DCH_IYY :
3178
3172
if (from_char_parse_int (& out -> year , & s , n ) < 4 )
3179
3173
out -> year = adjust_partial_year_to_2020 (out -> year );
3180
3174
out -> yysz = 3 ;
3181
- s += SKIP_THth (n -> suffix );
3175
+ SKIP_THth (s , n -> suffix );
3182
3176
break ;
3183
3177
case DCH_YY :
3184
3178
case DCH_IY :
3185
3179
if (from_char_parse_int (& out -> year , & s , n ) < 4 )
3186
3180
out -> year = adjust_partial_year_to_2020 (out -> year );
3187
3181
out -> yysz = 2 ;
3188
- s += SKIP_THth (n -> suffix );
3182
+ SKIP_THth (s , n -> suffix );
3189
3183
break ;
3190
3184
case DCH_Y :
3191
3185
case DCH_I :
3192
3186
if (from_char_parse_int (& out -> year , & s , n ) < 4 )
3193
3187
out -> year = adjust_partial_year_to_2020 (out -> year );
3194
3188
out -> yysz = 1 ;
3195
- s += SKIP_THth (n -> suffix );
3189
+ SKIP_THth (s , n -> suffix );
3196
3190
break ;
3197
3191
case DCH_RM :
3198
3192
from_char_seq_search (& value , & s , rm_months_upper ,
@@ -3206,11 +3200,11 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3206
3200
break ;
3207
3201
case DCH_W :
3208
3202
from_char_parse_int (& out -> w , & s , n );
3209
- s += SKIP_THth (n -> suffix );
3203
+ SKIP_THth (s , n -> suffix );
3210
3204
break ;
3211
3205
case DCH_J :
3212
3206
from_char_parse_int (& out -> j , & s , n );
3213
- s += SKIP_THth (n -> suffix );
3207
+ SKIP_THth (s , n -> suffix );
3214
3208
break ;
3215
3209
}
3216
3210
}
0 commit comments