date 2.0.0 → 3.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/date/date_core.c +415 -147
- data/ext/date/date_parse.c +103 -82
- data/ext/date/date_strptime.c +2 -4
- data/ext/date/prereq.mk +5 -1
- data/ext/date/zonetab.h +1364 -697
- data/ext/date/zonetab.list +146 -0
- data/lib/date.rb +4 -0
- metadata +4 -18
data/ext/date/date_parse.c
CHANGED
@@ -70,7 +70,7 @@ static size_t
|
|
70
70
|
digit_span(const char *s, const char *e)
|
71
71
|
{
|
72
72
|
size_t i = 0;
|
73
|
-
while (s + i < e && isdigit(s[i])) i++;
|
73
|
+
while (s + i < e && isdigit((unsigned char)s[i])) i++;
|
74
74
|
return i;
|
75
75
|
}
|
76
76
|
|
@@ -110,7 +110,7 @@ s3e(VALUE hash, VALUE y, VALUE m, VALUE d, int bc)
|
|
110
110
|
|
111
111
|
s = RSTRING_PTR(y);
|
112
112
|
ep = RSTRING_END(y);
|
113
|
-
while (s < ep && !issign(*s) && !isdigit(*s))
|
113
|
+
while (s < ep && !issign(*s) && !isdigit((unsigned char)*s))
|
114
114
|
s++;
|
115
115
|
if (s >= ep) goto no_date;
|
116
116
|
bp = s;
|
@@ -162,7 +162,7 @@ s3e(VALUE hash, VALUE y, VALUE m, VALUE d, int bc)
|
|
162
162
|
|
163
163
|
s = RSTRING_PTR(y);
|
164
164
|
ep = RSTRING_END(y);
|
165
|
-
while (s < ep && !issign(*s) && !isdigit(*s))
|
165
|
+
while (s < ep && !issign(*s) && !isdigit((unsigned char)*s))
|
166
166
|
s++;
|
167
167
|
if (s >= ep) goto no_year;
|
168
168
|
bp = s;
|
@@ -199,7 +199,7 @@ s3e(VALUE hash, VALUE y, VALUE m, VALUE d, int bc)
|
|
199
199
|
|
200
200
|
s = RSTRING_PTR(m);
|
201
201
|
ep = RSTRING_END(m);
|
202
|
-
while (s < ep && !isdigit(*s))
|
202
|
+
while (s < ep && !isdigit((unsigned char)*s))
|
203
203
|
s++;
|
204
204
|
if (s >= ep) goto no_month;
|
205
205
|
bp = s;
|
@@ -225,7 +225,7 @@ s3e(VALUE hash, VALUE y, VALUE m, VALUE d, int bc)
|
|
225
225
|
|
226
226
|
s = RSTRING_PTR(d);
|
227
227
|
ep = RSTRING_END(d);
|
228
|
-
while (s < ep && !isdigit(*s))
|
228
|
+
while (s < ep && !isdigit((unsigned char)*s))
|
229
229
|
s++;
|
230
230
|
if (s >= ep) goto no_mday;
|
231
231
|
bp = s;
|
@@ -361,66 +361,90 @@ do { \
|
|
361
361
|
#include "zonetab.h"
|
362
362
|
|
363
363
|
static int
|
364
|
-
|
364
|
+
str_end_with_word(const char *s, long l, const char *w)
|
365
365
|
{
|
366
366
|
int n = (int)strlen(w);
|
367
|
-
|
367
|
+
if (l <= n || !isspace((unsigned char)s[l - n - 1])) return 0;
|
368
|
+
if (strncasecmp(&s[l - n], w, n)) return 0;
|
369
|
+
do ++n; while (l > n && isspace((unsigned char)s[l - n - 1]));
|
370
|
+
return n;
|
368
371
|
}
|
369
372
|
|
370
|
-
|
371
|
-
|
373
|
+
static long
|
374
|
+
shrunk_size(const char *s, long l)
|
372
375
|
{
|
373
|
-
|
374
|
-
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
l = RSTRING_LEN(str);
|
381
|
-
s = RSTRING_PTR(str);
|
382
|
-
|
383
|
-
dest = d = ALLOCV_N(char, vbuf, l + 1);
|
384
|
-
|
385
|
-
for (i = 0; i < l; i++) {
|
386
|
-
if (isspace((unsigned char)s[i]) || s[i] == '\0') {
|
387
|
-
if (!sp)
|
388
|
-
*d++ = ' ';
|
389
|
-
sp = 1;
|
376
|
+
long i, ni;
|
377
|
+
int sp = 0;
|
378
|
+
for (i = ni = 0; i < l; ++i) {
|
379
|
+
if (!isspace((unsigned char)s[i])) {
|
380
|
+
if (sp) ni++;
|
381
|
+
sp = 0;
|
382
|
+
ni++;
|
390
383
|
}
|
391
384
|
else {
|
392
|
-
|
393
|
-
*d++ = tolower((unsigned char)s[i]);
|
394
|
-
else
|
395
|
-
*d++ = s[i];
|
396
|
-
sp = 0;
|
385
|
+
sp = 1;
|
397
386
|
}
|
398
387
|
}
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
388
|
+
return ni < l ? ni : 0;
|
389
|
+
}
|
390
|
+
|
391
|
+
static long
|
392
|
+
shrink_space(char *d, const char *s, long l)
|
393
|
+
{
|
394
|
+
long i, ni;
|
395
|
+
int sp = 0;
|
396
|
+
for (i = ni = 0; i < l; ++i) {
|
397
|
+
if (!isspace((unsigned char)s[i])) {
|
398
|
+
if (sp) d[ni++] = ' ';
|
399
|
+
sp = 0;
|
400
|
+
d[ni++] = s[i];
|
401
|
+
}
|
402
|
+
else {
|
403
|
+
sp = 1;
|
404
|
+
}
|
403
405
|
}
|
404
|
-
|
405
|
-
|
406
|
+
return ni;
|
407
|
+
}
|
408
|
+
|
409
|
+
VALUE
|
410
|
+
date_zone_to_diff(VALUE str)
|
411
|
+
{
|
412
|
+
VALUE offset = Qnil;
|
413
|
+
VALUE vbuf = 0;
|
414
|
+
long l = RSTRING_LEN(str);
|
415
|
+
const char *s = RSTRING_PTR(str);
|
416
|
+
|
406
417
|
{
|
407
|
-
static const char STD[] = " standard time";
|
408
|
-
static const char DST1[] = " daylight time";
|
409
|
-
static const char DST2[] = " dst";
|
410
418
|
int dst = 0;
|
419
|
+
int w;
|
411
420
|
|
412
|
-
if (
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
421
|
+
if ((w = str_end_with_word(s, l, "time")) > 0) {
|
422
|
+
int wtime = w;
|
423
|
+
l -= w;
|
424
|
+
if ((w = str_end_with_word(s, l, "standard")) > 0) {
|
425
|
+
l -= w;
|
426
|
+
}
|
427
|
+
else if ((w = str_end_with_word(s, l, "daylight")) > 0) {
|
428
|
+
l -= w;
|
429
|
+
dst = 1;
|
430
|
+
}
|
431
|
+
else {
|
432
|
+
l += wtime;
|
433
|
+
}
|
418
434
|
}
|
419
|
-
else if (
|
420
|
-
l -=
|
435
|
+
else if ((w = str_end_with_word(s, l, "dst")) > 0) {
|
436
|
+
l -= w;
|
421
437
|
dst = 1;
|
422
438
|
}
|
423
439
|
{
|
440
|
+
long sl = shrunk_size(s, l);
|
441
|
+
if (sl > 0 && sl <= MAX_WORD_LENGTH) {
|
442
|
+
char *d = ALLOCV_N(char, vbuf, sl);
|
443
|
+
l = shrink_space(d, s, l);
|
444
|
+
s = d;
|
445
|
+
}
|
446
|
+
}
|
447
|
+
if (l > 0 && l <= MAX_WORD_LENGTH) {
|
424
448
|
const struct zone *z = zonetab(s, (unsigned int)l);
|
425
449
|
if (z) {
|
426
450
|
int d = z->offset;
|
@@ -436,8 +460,8 @@ date_zone_to_diff(VALUE str)
|
|
436
460
|
long hour = 0, min = 0, sec = 0;
|
437
461
|
|
438
462
|
if (l > 3 &&
|
439
|
-
(
|
440
|
-
|
463
|
+
(strncasecmp(s, "gmt", 3) == 0 ||
|
464
|
+
strncasecmp(s, "utc", 3) == 0)) {
|
441
465
|
s += 3;
|
442
466
|
l -= 3;
|
443
467
|
}
|
@@ -730,8 +754,8 @@ check_year_width(VALUE y)
|
|
730
754
|
l = RSTRING_LEN(y);
|
731
755
|
if (l < 2) return 0;
|
732
756
|
s = RSTRING_PTR(y);
|
733
|
-
if (!isdigit(s[1])) return 0;
|
734
|
-
return (l == 2 || !isdigit(s[2]));
|
757
|
+
if (!isdigit((unsigned char)s[1])) return 0;
|
758
|
+
return (l == 2 || !isdigit((unsigned char)s[2]));
|
735
759
|
}
|
736
760
|
|
737
761
|
static int
|
@@ -1212,6 +1236,9 @@ parse_iso2(VALUE str, VALUE hash)
|
|
1212
1236
|
return 1;
|
1213
1237
|
}
|
1214
1238
|
|
1239
|
+
#define JISX0301_ERA_INITIALS "mtshr"
|
1240
|
+
#define JISX0301_DEFAULT_ERA 'H' /* obsolete */
|
1241
|
+
|
1215
1242
|
static int
|
1216
1243
|
gengo(int c)
|
1217
1244
|
{
|
@@ -1222,6 +1249,7 @@ gengo(int c)
|
|
1222
1249
|
case 'T': case 't': e = 1911; break;
|
1223
1250
|
case 'S': case 's': e = 1925; break;
|
1224
1251
|
case 'H': case 'h': e = 1988; break;
|
1252
|
+
case 'R': case 'r': e = 2018; break;
|
1225
1253
|
default: e = 0; break;
|
1226
1254
|
}
|
1227
1255
|
return e;
|
@@ -1252,11 +1280,11 @@ parse_jis(VALUE str, VALUE hash)
|
|
1252
1280
|
{
|
1253
1281
|
static const char pat_source[] =
|
1254
1282
|
#ifndef TIGHT_PARSER
|
1255
|
-
|
1283
|
+
"\\b([" JISX0301_ERA_INITIALS "])(\\d+)\\.(\\d+)\\.(\\d+)"
|
1256
1284
|
#else
|
1257
1285
|
BOS
|
1258
1286
|
FPW_COM FPT_COM
|
1259
|
-
|
1287
|
+
"([" JISX0301_ERA_INITIALS "])(\\d+)\\.(\\d+)\\.(\\d+)"
|
1260
1288
|
TEE_FPT COM_FPW
|
1261
1289
|
EOS
|
1262
1290
|
#endif
|
@@ -1859,30 +1887,26 @@ parse_ddd_cb(VALUE m, VALUE hash)
|
|
1859
1887
|
set_hash("zone", s5);
|
1860
1888
|
|
1861
1889
|
if (*cs5 == '[') {
|
1862
|
-
|
1863
|
-
char *buf = ALLOCV_N(char, vbuf, l5 + 1);
|
1864
|
-
char *s1, *s2, *s3;
|
1890
|
+
const char *s1, *s2;
|
1865
1891
|
VALUE zone;
|
1866
1892
|
|
1867
|
-
|
1868
|
-
|
1869
|
-
|
1870
|
-
s1 = buf + 1;
|
1871
|
-
s2 = strchr(buf, ':');
|
1893
|
+
l5 -= 2;
|
1894
|
+
s1 = cs5 + 1;
|
1895
|
+
s2 = memchr(s1, ':', l5);
|
1872
1896
|
if (s2) {
|
1873
|
-
*s2 = '\0';
|
1874
1897
|
s2++;
|
1898
|
+
zone = rb_str_subseq(s5, s2 - cs5, l5 - (s2 - s1));
|
1899
|
+
s5 = rb_str_subseq(s5, 1, s2 - s1);
|
1875
1900
|
}
|
1876
|
-
|
1877
|
-
|
1878
|
-
|
1879
|
-
|
1880
|
-
|
1901
|
+
else {
|
1902
|
+
zone = rb_str_subseq(s5, 1, l5);
|
1903
|
+
if (isdigit((unsigned char)*s1))
|
1904
|
+
s5 = rb_str_append(rb_str_new_cstr("+"), zone);
|
1905
|
+
else
|
1906
|
+
s5 = zone;
|
1907
|
+
}
|
1881
1908
|
set_hash("zone", zone);
|
1882
|
-
|
1883
|
-
*--s1 = '+';
|
1884
|
-
set_hash("offset", date_zone_to_diff(rb_str_new2(s1)));
|
1885
|
-
ALLOCV_END(vbuf);
|
1909
|
+
set_hash("offset", date_zone_to_diff(s5));
|
1886
1910
|
}
|
1887
1911
|
RB_GC_GUARD(s5);
|
1888
1912
|
}
|
@@ -2175,7 +2199,7 @@ date__parse(VALUE str, VALUE comp)
|
|
2175
2199
|
#endif
|
2176
2200
|
|
2177
2201
|
{
|
2178
|
-
|
2202
|
+
if (RTEST(del_hash("_bc"))) {
|
2179
2203
|
VALUE y;
|
2180
2204
|
|
2181
2205
|
y = ref_hash("cwyear");
|
@@ -2190,7 +2214,7 @@ date__parse(VALUE str, VALUE comp)
|
|
2190
2214
|
}
|
2191
2215
|
}
|
2192
2216
|
|
2193
|
-
|
2217
|
+
if (RTEST(del_hash("_comp"))) {
|
2194
2218
|
VALUE y;
|
2195
2219
|
|
2196
2220
|
y = ref_hash("cwyear");
|
@@ -2213,9 +2237,6 @@ date__parse(VALUE str, VALUE comp)
|
|
2213
2237
|
|
2214
2238
|
}
|
2215
2239
|
|
2216
|
-
del_hash("_bc");
|
2217
|
-
del_hash("_comp");
|
2218
|
-
|
2219
2240
|
{
|
2220
2241
|
VALUE zone = ref_hash("zone");
|
2221
2242
|
if (!NIL_P(zone) && NIL_P(ref_hash("offset")))
|
@@ -2265,8 +2286,8 @@ iso8601_ext_datetime_cb(VALUE m, VALUE hash)
|
|
2265
2286
|
s[i] = rb_reg_nth_match(i, m);
|
2266
2287
|
}
|
2267
2288
|
|
2268
|
-
if (!NIL_P(s[
|
2269
|
-
set_hash("mday", str2num(s[3]));
|
2289
|
+
if (!NIL_P(s[1])) {
|
2290
|
+
if (!NIL_P(s[3])) set_hash("mday", str2num(s[3]));
|
2270
2291
|
if (strcmp(RSTRING_PTR(s[1]), "-") != 0) {
|
2271
2292
|
y = str2num(s[1]);
|
2272
2293
|
if (RSTRING_LEN(s[1]) < 4)
|
@@ -2323,7 +2344,7 @@ static int
|
|
2323
2344
|
iso8601_ext_datetime(VALUE str, VALUE hash)
|
2324
2345
|
{
|
2325
2346
|
static const char pat_source[] =
|
2326
|
-
"\\A\\s*(?:([-+]?\\d{2,}|-)-(\\d{2})
|
2347
|
+
"\\A\\s*(?:([-+]?\\d{2,}|-)-(\\d{2})?(?:-(\\d{2}))?|"
|
2327
2348
|
"([-+]?\\d{2,})?-(\\d{3})|"
|
2328
2349
|
"(\\d{4}|\\d{2})?-w(\\d{2})-(\\d)|"
|
2329
2350
|
"-w-(\\d))"
|
@@ -2954,7 +2975,7 @@ jisx0301_cb(VALUE m, VALUE hash)
|
|
2954
2975
|
s[i] = rb_reg_nth_match(i, m);
|
2955
2976
|
}
|
2956
2977
|
|
2957
|
-
ep = gengo(NIL_P(s[1]) ?
|
2978
|
+
ep = gengo(NIL_P(s[1]) ? JISX0301_DEFAULT_ERA : *RSTRING_PTR(s[1]));
|
2958
2979
|
set_hash("year", f_add(str2num(s[2]), INT2FIX(ep)));
|
2959
2980
|
set_hash("mon", str2num(s[3]));
|
2960
2981
|
set_hash("mday", str2num(s[4]));
|
@@ -2979,7 +3000,7 @@ static int
|
|
2979
3000
|
jisx0301(VALUE str, VALUE hash)
|
2980
3001
|
{
|
2981
3002
|
static const char pat_source[] =
|
2982
|
-
|
3003
|
+
"\\A\\s*([" JISX0301_ERA_INITIALS "])?(\\d{2})\\.(\\d{2})\\.(\\d{2})"
|
2983
3004
|
"(?:t"
|
2984
3005
|
"(?:(\\d{2}):(\\d{2})(?::(\\d{2})(?:[,.](\\d*))?)?"
|
2985
3006
|
"(z|[-+]\\d{2}(?::?\\d{2})?)?)?)?\\s*\\z";
|
data/ext/date/date_strptime.c
CHANGED
@@ -669,7 +669,7 @@ date__strptime(const char *str, size_t slen,
|
|
669
669
|
if (fail_p())
|
670
670
|
return Qnil;
|
671
671
|
|
672
|
-
cent =
|
672
|
+
cent = del_hash("_cent");
|
673
673
|
if (!NIL_P(cent)) {
|
674
674
|
VALUE year;
|
675
675
|
|
@@ -679,10 +679,9 @@ date__strptime(const char *str, size_t slen,
|
|
679
679
|
year = ref_hash("year");
|
680
680
|
if (!NIL_P(year))
|
681
681
|
set_hash("year", f_add(year, f_mul(cent, INT2FIX(100))));
|
682
|
-
del_hash("_cent");
|
683
682
|
}
|
684
683
|
|
685
|
-
merid =
|
684
|
+
merid = del_hash("_merid");
|
686
685
|
if (!NIL_P(merid)) {
|
687
686
|
VALUE hour;
|
688
687
|
|
@@ -691,7 +690,6 @@ date__strptime(const char *str, size_t slen,
|
|
691
690
|
hour = f_mod(hour, INT2FIX(12));
|
692
691
|
set_hash("hour", f_add(hour, merid));
|
693
692
|
}
|
694
|
-
del_hash("_merid");
|
695
693
|
}
|
696
694
|
|
697
695
|
return hash;
|
data/ext/date/prereq.mk
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
.SUFFIXES: .list
|
2
2
|
|
3
3
|
.list.h:
|
4
|
-
gperf -
|
4
|
+
gperf --ignore-case -C -c -P -p -j1 -i 1 -g -o -t -N $(*F) $< \
|
5
5
|
| sed -f $(top_srcdir)/tool/gperf.sed \
|
6
6
|
> $(@F)
|
7
7
|
|
8
8
|
zonetab.h: zonetab.list
|
9
|
+
|
10
|
+
.PHONY: update-zonetab
|
11
|
+
update-zonetab:
|
12
|
+
$(RUBY) -C $(srcdir) update-abbr.rb
|