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