Skip to content

Commit 3f666fa

Browse files
committed
Extract head_match_p and abbreviated name length constants
1 parent 3bfed83 commit 3f666fa

File tree

1 file changed

+13
-4
lines changed

1 file changed

+13
-4
lines changed

ext/date/date_strptime.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@ static const char *day_names[] = {
1111
"Sunday", "Monday", "Tuesday", "Wednesday",
1212
"Thursday", "Friday", "Saturday",
1313
};
14+
static const int ABBREVIATED_DAY_NAME_LENGTH = 3;
1415

1516
static const char *month_names[] = {
1617
"January", "February", "March", "April",
1718
"May", "June", "July", "August", "September",
1819
"October", "November", "December",
1920
};
21+
static const int ABBREVIATED_MONTH_NAME_LENGTH = 3;
2022

2123
#define sizeof_array(o) (sizeof o / sizeof o[0])
2224

@@ -146,13 +148,20 @@ do { \
146148

147149
VALUE date_zone_to_diff(VALUE);
148150

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+
149157
static size_t
150158
date__strptime_internal(const char *str, size_t slen,
151159
const char *fmt, size_t flen, VALUE hash)
152160
{
153161
size_t si, fi;
154162
int c;
155163

164+
#define HEAD_MATCH_P(len, name) head_match_p(len, name, str, slen, si)
156165
si = fi = 0;
157166

158167
while (fi < flen) {
@@ -203,8 +212,8 @@ date__strptime_internal(const char *str, size_t slen,
203212
for (i = 0; i < (int)sizeof_array(day_names); i++) {
204213
const char *day_name = day_names[i];
205214
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)) {
208217
si += l;
209218
set_hash("wday", INT2FIX(i));
210219
goto matched;
@@ -221,8 +230,8 @@ date__strptime_internal(const char *str, size_t slen,
221230
for (i = 0; i < (int)sizeof_array(month_names); i++) {
222231
const char *month_name = month_names[i];
223232
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)) {
226235
si += l;
227236
set_hash("mon", INT2FIX(i + 1));
228237
goto matched;

0 commit comments

Comments
 (0)