date 3.3.2 → 3.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/date/date_core.c +8 -4
- data/ext/date/date_strptime.c +51 -54
- data/lib/date.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ccf42407789dcdf94598ab68332e1860f4f2b5f5820d7b2b2bd8ae283088160
|
4
|
+
data.tar.gz: 988c7bded5cb20a4b68283216eeaaddf874a15765705919fe372bdeaf58d1c2a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f99b7157afc55d925ffe6ea0f786ce4dc377a30786bb8045b71019db65cd056c83edbd4a979925060ed0daaae2f0cc71f19c04d0b89df53b6a39c70ad6005457
|
7
|
+
data.tar.gz: d4d955554151f00b3e0db05cf684d5e7c47655654fd3174aa3e1c67b14a9fa8696092219eac5e540ae9d9abe8c05b06e13bb4ff74c754c33b7e075e9b5498597
|
data/ext/date/date_core.c
CHANGED
@@ -64,7 +64,8 @@ static VALUE datetime_initialize(int argc, VALUE *argv, VALUE self);
|
|
64
64
|
|
65
65
|
#define RETURN_FALSE_UNLESS_NUMERIC(obj) if(!RTEST(rb_obj_is_kind_of((obj), rb_cNumeric))) return Qfalse
|
66
66
|
inline static void
|
67
|
-
check_numeric(VALUE obj, const char* field)
|
67
|
+
check_numeric(VALUE obj, const char* field)
|
68
|
+
{
|
68
69
|
if(!RTEST(rb_obj_is_kind_of(obj, rb_cNumeric))) {
|
69
70
|
rb_raise(rb_eTypeError, "invalid %s (not numeric)", field);
|
70
71
|
}
|
@@ -7437,7 +7438,8 @@ d_lite_jisx0301(VALUE self)
|
|
7437
7438
|
}
|
7438
7439
|
|
7439
7440
|
static VALUE
|
7440
|
-
deconstruct_keys(VALUE self, VALUE keys, int is_datetime)
|
7441
|
+
deconstruct_keys(VALUE self, VALUE keys, int is_datetime)
|
7442
|
+
{
|
7441
7443
|
VALUE h = rb_hash_new();
|
7442
7444
|
long i;
|
7443
7445
|
|
@@ -7520,7 +7522,8 @@ deconstruct_keys(VALUE self, VALUE keys, int is_datetime) {
|
|
7520
7522
|
*
|
7521
7523
|
*/
|
7522
7524
|
static VALUE
|
7523
|
-
d_lite_deconstruct_keys(VALUE self, VALUE keys)
|
7525
|
+
d_lite_deconstruct_keys(VALUE self, VALUE keys)
|
7526
|
+
{
|
7524
7527
|
return deconstruct_keys(self, keys, /* is_datetime=false */ 0);
|
7525
7528
|
}
|
7526
7529
|
|
@@ -8868,7 +8871,8 @@ dt_lite_jisx0301(int argc, VALUE *argv, VALUE self)
|
|
8868
8871
|
*
|
8869
8872
|
*/
|
8870
8873
|
static VALUE
|
8871
|
-
dt_lite_deconstruct_keys(VALUE self, VALUE keys)
|
8874
|
+
dt_lite_deconstruct_keys(VALUE self, VALUE keys)
|
8875
|
+
{
|
8872
8876
|
return deconstruct_keys(self, keys, /* is_datetime=true */ 1);
|
8873
8877
|
}
|
8874
8878
|
|
data/ext/date/date_strptime.c
CHANGED
@@ -10,28 +10,15 @@
|
|
10
10
|
static const char *day_names[] = {
|
11
11
|
"Sunday", "Monday", "Tuesday", "Wednesday",
|
12
12
|
"Thursday", "Friday", "Saturday",
|
13
|
-
"Sun", "Mon", "Tue", "Wed",
|
14
|
-
"Thu", "Fri", "Sat"
|
15
13
|
};
|
14
|
+
static const int ABBREVIATED_DAY_NAME_LENGTH = 3;
|
16
15
|
|
17
16
|
static const char *month_names[] = {
|
18
17
|
"January", "February", "March", "April",
|
19
18
|
"May", "June", "July", "August", "September",
|
20
19
|
"October", "November", "December",
|
21
|
-
"Jan", "Feb", "Mar", "Apr", "May", "Jun",
|
22
|
-
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
|
23
|
-
};
|
24
|
-
|
25
|
-
static const char *merid_names[] = {
|
26
|
-
"am", "pm",
|
27
|
-
"a.m.", "p.m."
|
28
|
-
};
|
29
|
-
|
30
|
-
static const char *extz_pats[] = {
|
31
|
-
":z",
|
32
|
-
"::z",
|
33
|
-
":::z"
|
34
20
|
};
|
21
|
+
static const int ABBREVIATED_MONTH_NAME_LENGTH = 3;
|
35
22
|
|
36
23
|
#define sizeof_array(o) (sizeof o / sizeof o[0])
|
37
24
|
|
@@ -75,7 +62,7 @@ num_pattern_p(const char *s)
|
|
75
62
|
#define NUM_PATTERN_P() num_pattern_p(&fmt[fi + 1])
|
76
63
|
|
77
64
|
static long
|
78
|
-
read_digits(const char *s, VALUE *n, size_t width)
|
65
|
+
read_digits(const char *s, size_t slen, VALUE *n, size_t width)
|
79
66
|
{
|
80
67
|
size_t l;
|
81
68
|
|
@@ -83,7 +70,7 @@ read_digits(const char *s, VALUE *n, size_t width)
|
|
83
70
|
return 0;
|
84
71
|
|
85
72
|
l = 0;
|
86
|
-
while (ISDIGIT(s[l])) {
|
73
|
+
while (l < slen && ISDIGIT(s[l])) {
|
87
74
|
if (++l == width) break;
|
88
75
|
}
|
89
76
|
|
@@ -131,7 +118,7 @@ do { \
|
|
131
118
|
#define READ_DIGITS(n,w) \
|
132
119
|
do { \
|
133
120
|
size_t l; \
|
134
|
-
l = read_digits(&str[si], &n, w); \
|
121
|
+
l = read_digits(&str[si], slen - si, &n, w); \
|
135
122
|
if (l == 0) \
|
136
123
|
fail(); \
|
137
124
|
si += l; \
|
@@ -161,6 +148,12 @@ do { \
|
|
161
148
|
|
162
149
|
VALUE date_zone_to_diff(VALUE);
|
163
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
|
+
|
164
157
|
static size_t
|
165
158
|
date__strptime_internal(const char *str, size_t slen,
|
166
159
|
const char *fmt, size_t flen, VALUE hash)
|
@@ -168,9 +161,18 @@ date__strptime_internal(const char *str, size_t slen,
|
|
168
161
|
size_t si, fi;
|
169
162
|
int c;
|
170
163
|
|
164
|
+
#define HEAD_MATCH_P(len, name) head_match_p(len, name, str, slen, si)
|
171
165
|
si = fi = 0;
|
172
166
|
|
173
167
|
while (fi < flen) {
|
168
|
+
if (isspace((unsigned char)fmt[fi])) {
|
169
|
+
while (si < slen && isspace((unsigned char)str[si]))
|
170
|
+
si++;
|
171
|
+
while (++fi < flen && isspace((unsigned char)fmt[fi]));
|
172
|
+
continue;
|
173
|
+
}
|
174
|
+
|
175
|
+
if (si >= slen) fail();
|
174
176
|
|
175
177
|
switch (fmt[fi]) {
|
176
178
|
case '%':
|
@@ -194,12 +196,11 @@ date__strptime_internal(const char *str, size_t slen,
|
|
194
196
|
{
|
195
197
|
int i;
|
196
198
|
|
197
|
-
for (i =
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
}
|
199
|
+
for (i = 1; i < 3 && fi + i < flen && fmt[fi+i] == ':'; ++i);
|
200
|
+
if (fmt[fi+i] == 'z') {
|
201
|
+
fi += i - 1;
|
202
|
+
goto again;
|
203
|
+
}
|
203
204
|
fail();
|
204
205
|
}
|
205
206
|
|
@@ -209,10 +210,12 @@ date__strptime_internal(const char *str, size_t slen,
|
|
209
210
|
int i;
|
210
211
|
|
211
212
|
for (i = 0; i < (int)sizeof_array(day_names); i++) {
|
212
|
-
|
213
|
-
|
213
|
+
const char *day_name = day_names[i];
|
214
|
+
size_t l = strlen(day_name);
|
215
|
+
if (HEAD_MATCH_P(l, day_name) ||
|
216
|
+
HEAD_MATCH_P(l = ABBREVIATED_DAY_NAME_LENGTH, day_name)) {
|
214
217
|
si += l;
|
215
|
-
set_hash("wday", INT2FIX(i
|
218
|
+
set_hash("wday", INT2FIX(i));
|
216
219
|
goto matched;
|
217
220
|
}
|
218
221
|
}
|
@@ -225,10 +228,12 @@ date__strptime_internal(const char *str, size_t slen,
|
|
225
228
|
int i;
|
226
229
|
|
227
230
|
for (i = 0; i < (int)sizeof_array(month_names); i++) {
|
228
|
-
|
229
|
-
|
231
|
+
const char *month_name = month_names[i];
|
232
|
+
size_t l = strlen(month_name);
|
233
|
+
if (HEAD_MATCH_P(l, month_name) ||
|
234
|
+
HEAD_MATCH_P(l = ABBREVIATED_MONTH_NAME_LENGTH, month_name)) {
|
230
235
|
si += l;
|
231
|
-
set_hash("mon", INT2FIX(
|
236
|
+
set_hash("mon", INT2FIX(i + 1));
|
232
237
|
goto matched;
|
233
238
|
}
|
234
239
|
}
|
@@ -402,18 +407,19 @@ date__strptime_internal(const char *str, size_t slen,
|
|
402
407
|
|
403
408
|
case 'P':
|
404
409
|
case 'p':
|
410
|
+
if (slen - si < 2) fail();
|
405
411
|
{
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
410
|
-
if (
|
411
|
-
|
412
|
-
set_hash("_merid", INT2FIX((i % 2) == 0 ? 0 : 12));
|
413
|
-
goto matched;
|
414
|
-
}
|
412
|
+
char c = str[si];
|
413
|
+
const int hour = (c == 'P' || c == 'p') ? 12 : 0;
|
414
|
+
if (!hour && !(c == 'A' || c == 'a')) fail();
|
415
|
+
if ((c = str[si+1]) == '.') {
|
416
|
+
if (slen - si < 4 || str[si+3] != '.') fail();
|
417
|
+
c = str[si += 2];
|
415
418
|
}
|
416
|
-
fail();
|
419
|
+
if (!(c == 'M' || c == 'm')) fail();
|
420
|
+
si += 2;
|
421
|
+
set_hash("_merid", INT2FIX(hour));
|
422
|
+
goto matched;
|
417
423
|
}
|
418
424
|
|
419
425
|
case 'Q':
|
@@ -587,7 +593,7 @@ date__strptime_internal(const char *str, size_t slen,
|
|
587
593
|
|
588
594
|
b = rb_backref_get();
|
589
595
|
rb_match_busy(b);
|
590
|
-
m = f_match(pat,
|
596
|
+
m = f_match(pat, rb_usascii_str_new(&str[si], slen - si));
|
591
597
|
|
592
598
|
if (!NIL_P(m)) {
|
593
599
|
VALUE s, l, o;
|
@@ -619,22 +625,13 @@ date__strptime_internal(const char *str, size_t slen,
|
|
619
625
|
if (str[si] != '%')
|
620
626
|
fail();
|
621
627
|
si++;
|
622
|
-
if (fi < flen)
|
623
|
-
if (str[si] != fmt[fi])
|
628
|
+
if (fi < flen) {
|
629
|
+
if (si >= slen || str[si] != fmt[fi])
|
624
630
|
fail();
|
625
|
-
|
631
|
+
si++;
|
632
|
+
}
|
626
633
|
goto matched;
|
627
634
|
}
|
628
|
-
case ' ':
|
629
|
-
case '\t':
|
630
|
-
case '\n':
|
631
|
-
case '\v':
|
632
|
-
case '\f':
|
633
|
-
case '\r':
|
634
|
-
while (isspace((unsigned char)str[si]))
|
635
|
-
si++;
|
636
|
-
fi++;
|
637
|
-
break;
|
638
635
|
default:
|
639
636
|
ordinal:
|
640
637
|
if (str[si] != fmt[fi])
|
data/lib/date.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: date
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3.
|
4
|
+
version: 3.3.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tadayoshi Funaba
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-12-
|
11
|
+
date: 2022-12-19 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A subclass of Object includes Comparable module for handling dates.
|
14
14
|
email:
|
@@ -49,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
49
49
|
- !ruby/object:Gem::Version
|
50
50
|
version: '0'
|
51
51
|
requirements: []
|
52
|
-
rubygems_version: 3.
|
52
|
+
rubygems_version: 3.4.0.dev
|
53
53
|
signing_key:
|
54
54
|
specification_version: 4
|
55
55
|
summary: A subclass of Object includes Comparable module for handling dates.
|