@@ -11,12 +11,14 @@ static const char *day_names[] = {
11
11
"Sunday" , "Monday" , "Tuesday" , "Wednesday" ,
12
12
"Thursday" , "Friday" , "Saturday" ,
13
13
};
14
+ static const int ABBREVIATED_DAY_NAME_LENGTH = 3 ;
14
15
15
16
static const char * month_names [] = {
16
17
"January" , "February" , "March" , "April" ,
17
18
"May" , "June" , "July" , "August" , "September" ,
18
19
"October" , "November" , "December" ,
19
20
};
21
+ static const int ABBREVIATED_MONTH_NAME_LENGTH = 3 ;
20
22
21
23
#define sizeof_array (o ) (sizeof o / sizeof o[0])
22
24
@@ -146,13 +148,20 @@ do { \
146
148
147
149
VALUE date_zone_to_diff (VALUE );
148
150
151
+ static inline int
152
+ head_match_p (size_t len , const char * name , const char * str , size_t slen , size_t si )
153
+ {
154
+ return slen - si >= len && strncasecmp (name , & str [si ], len ) == 0 ;
155
+ }
156
+
149
157
static size_t
150
158
date__strptime_internal (const char * str , size_t slen ,
151
159
const char * fmt , size_t flen , VALUE hash )
152
160
{
153
161
size_t si , fi ;
154
162
int c ;
155
163
164
+ #define HEAD_MATCH_P (len , name ) head_match_p(len, name, str, slen, si)
156
165
si = fi = 0 ;
157
166
158
167
while (fi < flen ) {
@@ -203,8 +212,8 @@ date__strptime_internal(const char *str, size_t slen,
203
212
for (i = 0 ; i < (int )sizeof_array (day_names ); i ++ ) {
204
213
const char * day_name = day_names [i ];
205
214
size_t l = strlen (day_name );
206
- if (( slen - si >= l && strncasecmp ( day_name , & str [ si ], l ) == 0 ) ||
207
- ( slen - si >= ( l = 3 ) && strncasecmp ( day_name , & str [ si ], l ) == 0 )) {
215
+ if (HEAD_MATCH_P ( l , day_name ) ||
216
+ HEAD_MATCH_P ( l = ABBREVIATED_DAY_NAME_LENGTH , day_name )) {
208
217
si += l ;
209
218
set_hash ("wday" , INT2FIX (i ));
210
219
goto matched ;
@@ -221,8 +230,8 @@ date__strptime_internal(const char *str, size_t slen,
221
230
for (i = 0 ; i < (int )sizeof_array (month_names ); i ++ ) {
222
231
const char * month_name = month_names [i ];
223
232
size_t l = strlen (month_name );
224
- if (( slen - si >= l && strncasecmp ( month_name , & str [ si ], l ) == 0 ) ||
225
- ( slen - si >= ( l = 3 ) && strncasecmp ( month_name , & str [ si ], l ) == 0 )) {
233
+ if (HEAD_MATCH_P ( l , month_name ) ||
234
+ HEAD_MATCH_P ( l = ABBREVIATED_MONTH_NAME_LENGTH , month_name )) {
226
235
si += l ;
227
236
set_hash ("mon" , INT2FIX (i + 1 ));
228
237
goto matched ;
0 commit comments