summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNobuyoshi Nakada <[email protected]>2022-12-18 11:38:07 +0900
committergit <[email protected]>2022-12-18 02:58:51 +0000
commitb8cc0992c681de30d48e9c9bdb59721604c194b5 (patch)
treeeb6176d9fe0abe7bb3592c866c4d724f79a92fe8
parentdf49bf8150ee0a6ea2a06b0d2288863b2032c932 (diff)
[ruby/date] Extract `head_match_p` and abbreviated name length constants
https://github.com/ruby/date/commit/3f666fa882
-rw-r--r--ext/date/date_strptime.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/ext/date/date_strptime.c b/ext/date/date_strptime.c
index 72d6b8a31e..f731629df1 100644
--- a/ext/date/date_strptime.c
+++ b/ext/date/date_strptime.c
@@ -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])
@@ -146,6 +148,12 @@ 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)
@@ -153,6 +161,7 @@ date__strptime_internal(const char *str, size_t slen,
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) {
@@ -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;
@@ -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;