@@ -968,7 +968,6 @@ static void dump_node(FormatNode *node, int max);
968
968
static char * get_th (char * num , int type );
969
969
static char * str_numth (char * dest , char * num , int type );
970
970
static int strspace_len (char * str );
971
- static int strdigits_len (char * str );
972
971
static void from_char_set_mode (TmFromChar * tmfc , const FromCharDateMode mode );
973
972
static void from_char_set_int (int * dest , const int value , const FormatNode * node );
974
973
static int from_char_parse_int_len (int * dest , char * * src , const int len , FormatNode * node );
@@ -1969,9 +1968,19 @@ asc_toupper_z(const char *buff)
1969
1968
1970
1969
/* ----------
1971
1970
* Skip TM / th in FROM_CHAR
1971
+ *
1972
+ * If S_THth is on, skip two chars, assuming there are two available
1972
1973
* ----------
1973
1974
*/
1974
- #define SKIP_THth (_suf ) (S_THth(_suf) ? 2 : 0)
1975
+ #define SKIP_THth (ptr , _suf ) \
1976
+ do { \
1977
+ if (S_THth(_suf)) \
1978
+ { \
1979
+ if (*(ptr)) (ptr)++; \
1980
+ if (*(ptr)) (ptr)++; \
1981
+ } \
1982
+ } while (0)
1983
+
1975
1984
1976
1985
#ifdef DEBUG_TO_FROM_CHAR
1977
1986
/* -----------
@@ -2054,23 +2063,6 @@ strspace_len(char *str)
2054
2063
return len ;
2055
2064
}
2056
2065
2057
- static int
2058
- strdigits_len (char * str )
2059
- {
2060
- char * p = str ;
2061
- int len ;
2062
-
2063
- len = strspace_len (str );
2064
- p += len ;
2065
-
2066
- while (* p && isdigit ((unsigned char ) * p ) && len <= DCH_MAX_ITEM_SIZ )
2067
- {
2068
- len ++ ;
2069
- p ++ ;
2070
- }
2071
- return len ;
2072
- }
2073
-
2074
2066
/*
2075
2067
* Set the date mode of a from-char conversion.
2076
2068
*
@@ -2941,19 +2933,19 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
2941
2933
case DCH_HH12 :
2942
2934
from_char_parse_int_len (& out -> hh , & s , 2 , n );
2943
2935
out -> clock = CLOCK_12_HOUR ;
2944
- s += SKIP_THth (n -> suffix );
2936
+ SKIP_THth (s , n -> suffix );
2945
2937
break ;
2946
2938
case DCH_HH24 :
2947
2939
from_char_parse_int_len (& out -> hh , & s , 2 , n );
2948
- s += SKIP_THth (n -> suffix );
2940
+ SKIP_THth (s , n -> suffix );
2949
2941
break ;
2950
2942
case DCH_MI :
2951
2943
from_char_parse_int (& out -> mi , & s , n );
2952
- s += SKIP_THth (n -> suffix );
2944
+ SKIP_THth (s , n -> suffix );
2953
2945
break ;
2954
2946
case DCH_SS :
2955
2947
from_char_parse_int (& out -> ss , & s , n );
2956
- s += SKIP_THth (n -> suffix );
2948
+ SKIP_THth (s , n -> suffix );
2957
2949
break ;
2958
2950
case DCH_MS : /* millisecond */
2959
2951
len = from_char_parse_int_len (& out -> ms , & s , 3 , n );
@@ -2964,7 +2956,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
2964
2956
out -> ms *= len == 1 ? 100 :
2965
2957
len == 2 ? 10 : 1 ;
2966
2958
2967
- s += SKIP_THth (n -> suffix );
2959
+ SKIP_THth (s , n -> suffix );
2968
2960
break ;
2969
2961
case DCH_US : /* microsecond */
2970
2962
len = from_char_parse_int_len (& out -> us , & s , 6 , n );
@@ -2975,11 +2967,11 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
2975
2967
len == 4 ? 100 :
2976
2968
len == 5 ? 10 : 1 ;
2977
2969
2978
- s += SKIP_THth (n -> suffix );
2970
+ SKIP_THth (s , n -> suffix );
2979
2971
break ;
2980
2972
case DCH_SSSS :
2981
2973
from_char_parse_int (& out -> ssss , & s , n );
2982
- s += SKIP_THth (n -> suffix );
2974
+ SKIP_THth (s , n -> suffix );
2983
2975
break ;
2984
2976
case DCH_tz :
2985
2977
case DCH_TZ :
@@ -3018,7 +3010,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3018
3010
break ;
3019
3011
case DCH_MM :
3020
3012
from_char_parse_int (& out -> mm , & s , n );
3021
- s += SKIP_THth (n -> suffix );
3013
+ SKIP_THth (s , n -> suffix );
3022
3014
break ;
3023
3015
case DCH_DAY :
3024
3016
case DCH_Day :
@@ -3036,29 +3028,29 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3036
3028
break ;
3037
3029
case DCH_DDD :
3038
3030
from_char_parse_int (& out -> ddd , & s , n );
3039
- s += SKIP_THth (n -> suffix );
3031
+ SKIP_THth (s , n -> suffix );
3040
3032
break ;
3041
3033
case DCH_IDDD :
3042
3034
from_char_parse_int_len (& out -> ddd , & s , 3 , n );
3043
- s += SKIP_THth (n -> suffix );
3035
+ SKIP_THth (s , n -> suffix );
3044
3036
break ;
3045
3037
case DCH_DD :
3046
3038
from_char_parse_int (& out -> dd , & s , n );
3047
- s += SKIP_THth (n -> suffix );
3039
+ SKIP_THth (s , n -> suffix );
3048
3040
break ;
3049
3041
case DCH_D :
3050
3042
from_char_parse_int (& out -> d , & s , n );
3051
3043
out -> d -- ;
3052
- s += SKIP_THth (n -> suffix );
3044
+ SKIP_THth (s , n -> suffix );
3053
3045
break ;
3054
3046
case DCH_ID :
3055
3047
from_char_parse_int_len (& out -> d , & s , 1 , n );
3056
- s += SKIP_THth (n -> suffix );
3048
+ SKIP_THth (s , n -> suffix );
3057
3049
break ;
3058
3050
case DCH_WW :
3059
3051
case DCH_IW :
3060
3052
from_char_parse_int (& out -> ww , & s , n );
3061
- s += SKIP_THth (n -> suffix );
3053
+ SKIP_THth (s , n -> suffix );
3062
3054
break ;
3063
3055
case DCH_Q :
3064
3056
@@ -3073,34 +3065,36 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3073
3065
* isn't stored anywhere in 'out'.
3074
3066
*/
3075
3067
from_char_parse_int ((int * ) NULL , & s , n );
3076
- s += SKIP_THth (n -> suffix );
3068
+ SKIP_THth (s , n -> suffix );
3077
3069
break ;
3078
3070
case DCH_CC :
3079
3071
from_char_parse_int (& out -> cc , & s , n );
3080
- s += SKIP_THth (n -> suffix );
3072
+ SKIP_THth (s , n -> suffix );
3081
3073
break ;
3082
3074
case DCH_Y_YYY :
3083
3075
{
3084
3076
int matched ,
3085
3077
years ,
3086
- millenia ;
3078
+ millenia ,
3079
+ nch ;
3087
3080
3088
- matched = sscanf (s , "%d,%03d" , & millenia , & years );
3089
- if (matched != 2 )
3081
+ matched = sscanf (s , "%d,%03d%n " , & millenia , & years , & nch );
3082
+ if (matched < 2 )
3090
3083
ereport (ERROR ,
3091
3084
(errcode (ERRCODE_INVALID_DATETIME_FORMAT ),
3092
3085
errmsg ("invalid input string for \"Y,YYY\"" )));
3093
3086
years += (millenia * 1000 );
3094
3087
from_char_set_int (& out -> year , years , n );
3095
3088
out -> yysz = 4 ;
3096
- s += strdigits_len (s ) + 4 + SKIP_THth (n -> suffix );
3089
+ s += nch ;
3090
+ SKIP_THth (s , n -> suffix );
3097
3091
}
3098
3092
break ;
3099
3093
case DCH_YYYY :
3100
3094
case DCH_IYYY :
3101
3095
from_char_parse_int (& out -> year , & s , n );
3102
3096
out -> yysz = 4 ;
3103
- s += SKIP_THth (n -> suffix );
3097
+ SKIP_THth (s , n -> suffix );
3104
3098
break ;
3105
3099
case DCH_YYY :
3106
3100
case DCH_IYY :
@@ -3115,7 +3109,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3115
3109
out -> year += 1000 ;
3116
3110
else
3117
3111
out -> year += 2000 ;
3118
- s += SKIP_THth (n -> suffix );
3112
+ SKIP_THth (s , n -> suffix );
3119
3113
break ;
3120
3114
case DCH_YY :
3121
3115
case DCH_IY :
@@ -3130,7 +3124,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3130
3124
out -> year += 2000 ;
3131
3125
else
3132
3126
out -> year += 1900 ;
3133
- s += SKIP_THth (n -> suffix );
3127
+ SKIP_THth (s , n -> suffix );
3134
3128
break ;
3135
3129
case DCH_Y :
3136
3130
case DCH_I :
@@ -3141,7 +3135,7 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3141
3135
* 1-digit year: always +2000
3142
3136
*/
3143
3137
out -> year += 2000 ;
3144
- s += SKIP_THth (n -> suffix );
3138
+ SKIP_THth (s , n -> suffix );
3145
3139
break ;
3146
3140
case DCH_RM :
3147
3141
from_char_seq_search (& value , & s , rm_months_upper ,
@@ -3155,11 +3149,11 @@ DCH_from_char(FormatNode *node, char *in, TmFromChar *out)
3155
3149
break ;
3156
3150
case DCH_W :
3157
3151
from_char_parse_int (& out -> w , & s , n );
3158
- s += SKIP_THth (n -> suffix );
3152
+ SKIP_THth (s , n -> suffix );
3159
3153
break ;
3160
3154
case DCH_J :
3161
3155
from_char_parse_int (& out -> j , & s , n );
3162
- s += SKIP_THth (n -> suffix );
3156
+ SKIP_THth (s , n -> suffix );
3163
3157
break ;
3164
3158
}
3165
3159
}
0 commit comments