@@ -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
*
@@ -3000,19 +2992,19 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3000
2992
case DCH_HH12 :
3001
2993
from_char_parse_int_len (& out -> hh , & s , 2 , n );
3002
2994
out -> clock = CLOCK_12_HOUR ;
3003
- s += SKIP_THth (n -> suffix );
2995
+ SKIP_THth (s , n -> suffix );
3004
2996
break ;
3005
2997
case DCH_HH24 :
3006
2998
from_char_parse_int_len (& out -> hh , & s , 2 , n );
3007
- s += SKIP_THth (n -> suffix );
2999
+ SKIP_THth (s , n -> suffix );
3008
3000
break ;
3009
3001
case DCH_MI :
3010
3002
from_char_parse_int (& out -> mi , & s , n );
3011
- s += SKIP_THth (n -> suffix );
3003
+ SKIP_THth (s , n -> suffix );
3012
3004
break ;
3013
3005
case DCH_SS :
3014
3006
from_char_parse_int (& out -> ss , & s , n );
3015
- s += SKIP_THth (n -> suffix );
3007
+ SKIP_THth (s , n -> suffix );
3016
3008
break ;
3017
3009
case DCH_MS : /* millisecond */
3018
3010
len = from_char_parse_int_len (& out -> ms , & s , 3 , n );
@@ -3023,7 +3015,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3023
3015
out -> ms *= len == 1 ? 100 :
3024
3016
len == 2 ? 10 : 1 ;
3025
3017
3026
- s += SKIP_THth (n -> suffix );
3018
+ SKIP_THth (s , n -> suffix );
3027
3019
break ;
3028
3020
case DCH_US : /* microsecond */
3029
3021
len = from_char_parse_int_len (& out -> us , & s , 6 , n );
@@ -3034,11 +3026,11 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3034
3026
len == 4 ? 100 :
3035
3027
len == 5 ? 10 : 1 ;
3036
3028
3037
- s += SKIP_THth (n -> suffix );
3029
+ SKIP_THth (s , n -> suffix );
3038
3030
break ;
3039
3031
case DCH_SSSS :
3040
3032
from_char_parse_int (& out -> ssss , & s , n );
3041
- s += SKIP_THth (n -> suffix );
3033
+ SKIP_THth (s , n -> suffix );
3042
3034
break ;
3043
3035
case DCH_tz :
3044
3036
case DCH_TZ :
@@ -3078,7 +3070,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3078
3070
break ;
3079
3071
case DCH_MM :
3080
3072
from_char_parse_int (& out -> mm , & s , n );
3081
- s += SKIP_THth (n -> suffix );
3073
+ SKIP_THth (s , n -> suffix );
3082
3074
break ;
3083
3075
case DCH_DAY :
3084
3076
case DCH_Day :
@@ -3098,31 +3090,31 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3098
3090
break ;
3099
3091
case DCH_DDD :
3100
3092
from_char_parse_int (& out -> ddd , & s , n );
3101
- s += SKIP_THth (n -> suffix );
3093
+ SKIP_THth (s , n -> suffix );
3102
3094
break ;
3103
3095
case DCH_IDDD :
3104
3096
from_char_parse_int_len (& out -> ddd , & s , 3 , n );
3105
- s += SKIP_THth (n -> suffix );
3097
+ SKIP_THth (s , n -> suffix );
3106
3098
break ;
3107
3099
case DCH_DD :
3108
3100
from_char_parse_int (& out -> dd , & s , n );
3109
- s += SKIP_THth (n -> suffix );
3101
+ SKIP_THth (s , n -> suffix );
3110
3102
break ;
3111
3103
case DCH_D :
3112
3104
from_char_parse_int (& out -> d , & s , n );
3113
- s += SKIP_THth (n -> suffix );
3105
+ SKIP_THth (s , n -> suffix );
3114
3106
break ;
3115
3107
case DCH_ID :
3116
3108
from_char_parse_int_len (& out -> d , & s , 1 , n );
3117
3109
/* Shift numbering to match Gregorian where Sunday = 1 */
3118
3110
if (++ out -> d > 7 )
3119
3111
out -> d = 1 ;
3120
- s += SKIP_THth (n -> suffix );
3112
+ SKIP_THth (s , n -> suffix );
3121
3113
break ;
3122
3114
case DCH_WW :
3123
3115
case DCH_IW :
3124
3116
from_char_parse_int (& out -> ww , & s , n );
3125
- s += SKIP_THth (n -> suffix );
3117
+ SKIP_THth (s , n -> suffix );
3126
3118
break ;
3127
3119
case DCH_Q :
3128
3120
@@ -3137,55 +3129,57 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3137
3129
* isn't stored anywhere in 'out'.
3138
3130
*/
3139
3131
from_char_parse_int ((int * ) NULL , & s , n );
3140
- s += SKIP_THth (n -> suffix );
3132
+ SKIP_THth (s , n -> suffix );
3141
3133
break ;
3142
3134
case DCH_CC :
3143
3135
from_char_parse_int (& out -> cc , & s , n );
3144
- s += SKIP_THth (n -> suffix );
3136
+ SKIP_THth (s , n -> suffix );
3145
3137
break ;
3146
3138
case DCH_Y_YYY :
3147
3139
{
3148
3140
int matched ,
3149
3141
years ,
3150
- millenia ;
3142
+ millenia ,
3143
+ nch ;
3151
3144
3152
- matched = sscanf (s , "%d,%03d" , & millenia , & years );
3153
- if (matched != 2 )
3145
+ matched = sscanf (s , "%d,%03d%n " , & millenia , & years , & nch );
3146
+ if (matched < 2 )
3154
3147
ereport (ERROR ,
3155
3148
(errcode (ERRCODE_INVALID_DATETIME_FORMAT ),
3156
3149
errmsg ("invalid input string for \"Y,YYY\"" )));
3157
3150
years += (millenia * 1000 );
3158
3151
from_char_set_int (& out -> year , years , n );
3159
3152
out -> yysz = 4 ;
3160
- s += strdigits_len (s ) + 4 + SKIP_THth (n -> suffix );
3153
+ s += nch ;
3154
+ SKIP_THth (s , n -> suffix );
3161
3155
}
3162
3156
break ;
3163
3157
case DCH_YYYY :
3164
3158
case DCH_IYYY :
3165
3159
from_char_parse_int (& out -> year , & s , n );
3166
3160
out -> yysz = 4 ;
3167
- s += SKIP_THth (n -> suffix );
3161
+ SKIP_THth (s , n -> suffix );
3168
3162
break ;
3169
3163
case DCH_YYY :
3170
3164
case DCH_IYY :
3171
3165
if (from_char_parse_int (& out -> year , & s , n ) < 4 )
3172
3166
out -> year = adjust_partial_year_to_2020 (out -> year );
3173
3167
out -> yysz = 3 ;
3174
- s += SKIP_THth (n -> suffix );
3168
+ SKIP_THth (s , n -> suffix );
3175
3169
break ;
3176
3170
case DCH_YY :
3177
3171
case DCH_IY :
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 = 2 ;
3181
- s += SKIP_THth (n -> suffix );
3175
+ SKIP_THth (s , n -> suffix );
3182
3176
break ;
3183
3177
case DCH_Y :
3184
3178
case DCH_I :
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 = 1 ;
3188
- s += SKIP_THth (n -> suffix );
3182
+ SKIP_THth (s , n -> suffix );
3189
3183
break ;
3190
3184
case DCH_RM :
3191
3185
from_char_seq_search (& value , & s , rm_months_upper ,
@@ -3199,11 +3193,11 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3199
3193
break ;
3200
3194
case DCH_W :
3201
3195
from_char_parse_int (& out -> w , & s , n );
3202
- s += SKIP_THth (n -> suffix );
3196
+ SKIP_THth (s , n -> suffix );
3203
3197
break ;
3204
3198
case DCH_J :
3205
3199
from_char_parse_int (& out -> j , & s , n );
3206
- s += SKIP_THth (n -> suffix );
3200
+ SKIP_THth (s , n -> suffix );
3207
3201
break ;
3208
3202
}
3209
3203
}
0 commit comments