Skip to content

Commit

Permalink
[ruby/date] Extract head_match_p and abbreviated name length constants
Browse files Browse the repository at this point in the history
  • Loading branch information
nobu authored and matzbot committed Dec 18, 2022
1 parent df49bf8 commit b8cc099
Showing 1 changed file with 13 additions and 4 deletions.
17 changes: 13 additions & 4 deletions ext/date/date_strptime.c
Expand Up @@ -11,12 +11,14 @@ static const char *day_names[] = {
"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday",
};
static const int ABBREVIATED_DAY_NAME_LENGTH = 3;

static const char *month_names[] = {
"January", "February", "March", "April",
"May", "June", "July", "August", "September",
"October", "November", "December",
};
static const int ABBREVIATED_MONTH_NAME_LENGTH = 3;

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

Expand Down Expand Up @@ -146,13 +148,20 @@ do { \

VALUE date_zone_to_diff(VALUE);

static inline int
head_match_p(size_t len, const char *name, const char *str, size_t slen, size_t si)
{
return slen - si >= len && strncasecmp(name, &str[si], len) == 0;
}

static size_t
date__strptime_internal(const char *str, size_t slen,
const char *fmt, size_t flen, VALUE hash)
{
size_t si, fi;
int c;

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

while (fi < flen) {
Expand Down Expand Up @@ -203,8 +212,8 @@ date__strptime_internal(const char *str, size_t slen,
for (i = 0; i < (int)sizeof_array(day_names); i++) {
const char *day_name = day_names[i];
size_t l = strlen(day_name);
if ((slen - si >= l && strncasecmp(day_name, &str[si], l) == 0) ||
(slen - si >= (l = 3) && strncasecmp(day_name, &str[si], l) == 0)) {
if (HEAD_MATCH_P(l, day_name) ||
HEAD_MATCH_P(l = ABBREVIATED_DAY_NAME_LENGTH, day_name)) {
si += l;
set_hash("wday", INT2FIX(i));
goto matched;
Expand All @@ -221,8 +230,8 @@ date__strptime_internal(const char *str, size_t slen,
for (i = 0; i < (int)sizeof_array(month_names); i++) {
const char *month_name = month_names[i];
size_t l = strlen(month_name);
if ((slen - si >= l && strncasecmp(month_name, &str[si], l) == 0) ||
(slen - si >= (l = 3) && strncasecmp(month_name, &str[si], l) == 0)) {
if (HEAD_MATCH_P(l, month_name) ||
HEAD_MATCH_P(l = ABBREVIATED_MONTH_NAME_LENGTH, month_name)) {
si += l;
set_hash("mon", INT2FIX(i + 1));
goto matched;
Expand Down

0 comments on commit b8cc099

Please sign in to comment.