date 3.2.2 → 3.3.0
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/README.md +102 -0
- data/ext/date/date_core.c +920 -962
- data/ext/date/date_parse.c +89 -42
- data/ext/date/extconf.rb +1 -0
- data/ext/date/zonetab.h +2 -2
- data/ext/date/zonetab.list +1 -1
- data/lib/date.rb +5 -1
- metadata +4 -3
data/ext/date/date_parse.c
CHANGED
@@ -253,6 +253,8 @@ s3e(VALUE hash, VALUE y, VALUE m, VALUE d, int bc)
|
|
253
253
|
#define ABBR_DAYS "sun|mon|tue|wed|thu|fri|sat"
|
254
254
|
#define ABBR_MONTHS "jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec"
|
255
255
|
|
256
|
+
#define NUMBER "(?<!\\d)\\d"
|
257
|
+
|
256
258
|
#ifdef TIGHT_PARSER
|
257
259
|
#define VALID_DAYS "(?:" DAYS ")" "|(?:tues|wednes|thurs|thur|" ABBR_DAYS ")\\.?"
|
258
260
|
#define VALID_MONTHS "(?:" MONTHS ")" "|(?:sept|" ABBR_MONTHS ")\\.?"
|
@@ -411,7 +413,6 @@ VALUE
|
|
411
413
|
date_zone_to_diff(VALUE str)
|
412
414
|
{
|
413
415
|
VALUE offset = Qnil;
|
414
|
-
VALUE vbuf = 0;
|
415
416
|
long l = RSTRING_LEN(str);
|
416
417
|
const char *s = RSTRING_PTR(str);
|
417
418
|
|
@@ -437,16 +438,26 @@ date_zone_to_diff(VALUE str)
|
|
437
438
|
l -= w;
|
438
439
|
dst = 1;
|
439
440
|
}
|
441
|
+
|
440
442
|
{
|
443
|
+
const char *zn = s;
|
441
444
|
long sl = shrunk_size(s, l);
|
445
|
+
char shrunk_buff[MAX_WORD_LENGTH]; /* no terminator to be added */
|
446
|
+
const struct zone *z = 0;
|
447
|
+
|
448
|
+
if (sl <= 0) {
|
449
|
+
sl = l;
|
450
|
+
}
|
451
|
+
else if (sl <= MAX_WORD_LENGTH) {
|
452
|
+
char *d = shrunk_buff;
|
453
|
+
sl = shrink_space(d, s, l);
|
454
|
+
zn = d;
|
455
|
+
}
|
456
|
+
|
442
457
|
if (sl > 0 && sl <= MAX_WORD_LENGTH) {
|
443
|
-
|
444
|
-
l = shrink_space(d, s, l);
|
445
|
-
s = d;
|
458
|
+
z = zonetab(zn, (unsigned int)sl);
|
446
459
|
}
|
447
|
-
|
448
|
-
if (l > 0 && l <= MAX_WORD_LENGTH) {
|
449
|
-
const struct zone *z = zonetab(s, (unsigned int)l);
|
460
|
+
|
450
461
|
if (z) {
|
451
462
|
int d = z->offset;
|
452
463
|
if (dst)
|
@@ -455,6 +466,7 @@ date_zone_to_diff(VALUE str)
|
|
455
466
|
goto ok;
|
456
467
|
}
|
457
468
|
}
|
469
|
+
|
458
470
|
{
|
459
471
|
char *p;
|
460
472
|
int sign = 0;
|
@@ -471,27 +483,53 @@ date_zone_to_diff(VALUE str)
|
|
471
483
|
s++;
|
472
484
|
l--;
|
473
485
|
|
486
|
+
#define out_of_range(v, min, max) ((v) < (min) || (max) < (v))
|
474
487
|
hour = STRTOUL(s, &p, 10);
|
475
488
|
if (*p == ':') {
|
489
|
+
if (out_of_range(hour, 0, 23)) return Qnil;
|
476
490
|
s = ++p;
|
477
491
|
min = STRTOUL(s, &p, 10);
|
492
|
+
if (out_of_range(min, 0, 59)) return Qnil;
|
478
493
|
if (*p == ':') {
|
479
494
|
s = ++p;
|
480
495
|
sec = STRTOUL(s, &p, 10);
|
496
|
+
if (out_of_range(sec, 0, 59)) return Qnil;
|
481
497
|
}
|
482
|
-
goto num;
|
483
498
|
}
|
484
|
-
if (*p == ',' || *p == '.') {
|
485
|
-
|
486
|
-
|
487
|
-
|
499
|
+
else if (*p == ',' || *p == '.') {
|
500
|
+
/* fractional hour */
|
501
|
+
size_t n;
|
502
|
+
int ov;
|
503
|
+
/* no over precision for offset; 10**-7 hour = 0.36
|
504
|
+
* milliseconds should be enough. */
|
505
|
+
const size_t max_digits = 7; /* 36 * 10**7 < 32-bit FIXNUM_MAX */
|
506
|
+
|
507
|
+
if (out_of_range(hour, 0, 23)) return Qnil;
|
508
|
+
|
509
|
+
n = (s + l) - ++p;
|
510
|
+
if (n > max_digits) n = max_digits;
|
511
|
+
sec = ruby_scan_digits(p, n, 10, &n, &ov);
|
512
|
+
if ((p += n) < s + l && *p >= ('5' + !(sec & 1)) && *p <= '9') {
|
513
|
+
/* round half to even */
|
514
|
+
sec++;
|
515
|
+
}
|
516
|
+
sec *= 36;
|
488
517
|
if (sign) {
|
489
518
|
hour = -hour;
|
490
|
-
|
519
|
+
sec = -sec;
|
520
|
+
}
|
521
|
+
if (n <= 2) {
|
522
|
+
/* HH.nn or HH.n */
|
523
|
+
if (n == 1) sec *= 10;
|
524
|
+
offset = INT2FIX(sec + hour * 3600);
|
525
|
+
}
|
526
|
+
else {
|
527
|
+
VALUE denom = rb_int_positive_pow(10, (int)(n - 2));
|
528
|
+
offset = f_add(rb_rational_new(INT2FIX(sec), denom), INT2FIX(hour * 3600));
|
529
|
+
if (rb_rational_den(offset) == INT2FIX(1)) {
|
530
|
+
offset = rb_rational_num(offset);
|
531
|
+
}
|
491
532
|
}
|
492
|
-
offset = rb_rational_new(INT2FIX(min),
|
493
|
-
rb_int_positive_pow(10, (int)(e - p)));
|
494
|
-
offset = f_add(INT2FIX(hour * 3600), offset);
|
495
533
|
goto ok;
|
496
534
|
}
|
497
535
|
else if (l > 2) {
|
@@ -504,18 +542,16 @@ date_zone_to_diff(VALUE str)
|
|
504
542
|
min = ruby_scan_digits(&s[2 - l % 2], 2, 10, &n, &ov);
|
505
543
|
if (l >= 5)
|
506
544
|
sec = ruby_scan_digits(&s[4 - l % 2], 2, 10, &n, &ov);
|
507
|
-
goto num;
|
508
545
|
}
|
509
|
-
num:
|
510
546
|
sec += min * 60 + hour * 3600;
|
511
547
|
if (sign) sec = -sec;
|
512
548
|
offset = INT2FIX(sec);
|
549
|
+
#undef out_of_range
|
513
550
|
}
|
514
551
|
}
|
515
552
|
}
|
516
553
|
RB_GC_GUARD(str);
|
517
554
|
ok:
|
518
|
-
ALLOCV_END(vbuf);
|
519
555
|
return offset;
|
520
556
|
}
|
521
557
|
|
@@ -652,24 +688,27 @@ parse_time(VALUE str, VALUE hash)
|
|
652
688
|
{
|
653
689
|
static const char pat_source[] =
|
654
690
|
"("
|
691
|
+
"" NUMBER "+\\s*"
|
655
692
|
"(?:"
|
656
|
-
"\\d+\\s*:\\s*\\d+"
|
657
693
|
"(?:"
|
694
|
+
":\\s*\\d+"
|
695
|
+
"(?:"
|
658
696
|
#ifndef TIGHT_PARSER
|
659
|
-
|
697
|
+
"\\s*:\\s*\\d+(?:[,.]\\d*)?"
|
660
698
|
#else
|
661
|
-
|
699
|
+
"\\s*:\\s*\\d+(?:[,.]\\d+)?"
|
662
700
|
#endif
|
701
|
+
")?"
|
702
|
+
"|"
|
703
|
+
"h(?:\\s*\\d+m?(?:\\s*\\d+s?)?)?"
|
704
|
+
")"
|
705
|
+
"(?:"
|
706
|
+
"\\s*"
|
707
|
+
"[ap](?:m\\b|\\.m\\.)"
|
663
708
|
")?"
|
664
709
|
"|"
|
665
|
-
"\\d+\\s*h(?:\\s*\\d+m?(?:\\s*\\d+s?)?)?"
|
666
|
-
")"
|
667
|
-
"(?:"
|
668
|
-
"\\s*"
|
669
710
|
"[ap](?:m\\b|\\.m\\.)"
|
670
|
-
")
|
671
|
-
"|"
|
672
|
-
"\\d+\\s*[ap](?:m\\b|\\.m\\.)"
|
711
|
+
")"
|
673
712
|
")"
|
674
713
|
"(?:"
|
675
714
|
"\\s*"
|
@@ -691,6 +730,9 @@ parse_time(VALUE str, VALUE hash)
|
|
691
730
|
#endif
|
692
731
|
}
|
693
732
|
|
733
|
+
#define BEGIN_ERA "\\b"
|
734
|
+
#define END_ERA "(?!(?<!\\.)[a-z])"
|
735
|
+
|
694
736
|
#ifdef TIGHT_PARSER
|
695
737
|
static int
|
696
738
|
parse_era1_cb(VALUE m, VALUE hash)
|
@@ -702,7 +744,7 @@ static int
|
|
702
744
|
parse_era1(VALUE str, VALUE hash)
|
703
745
|
{
|
704
746
|
static const char pat_source[] =
|
705
|
-
"(a(?:d|\\.d\\.))";
|
747
|
+
BEGIN_ERA "(a(?:d\\b|\\.d\\.))" END_ERA;
|
706
748
|
static VALUE pat = Qnil;
|
707
749
|
|
708
750
|
REGCOMP_I(pat);
|
@@ -724,8 +766,9 @@ parse_era2_cb(VALUE m, VALUE hash)
|
|
724
766
|
static int
|
725
767
|
parse_era2(VALUE str, VALUE hash)
|
726
768
|
{
|
727
|
-
static const char pat_source[] =
|
728
|
-
"(c(?:e|\\.e\\.)|b(?:ce|\\.c\\.e\\.)|b(?:c|\\.c\\.))"
|
769
|
+
static const char pat_source[] = BEGIN_ERA
|
770
|
+
"(c(?:e\\b|\\.e\\.)|b(?:ce\\b|\\.c\\.e\\.)|b(?:c\\b|\\.c\\.))"
|
771
|
+
END_ERA;
|
729
772
|
static VALUE pat = Qnil;
|
730
773
|
|
731
774
|
REGCOMP_I(pat);
|
@@ -829,7 +872,7 @@ parse_eu(VALUE str, VALUE hash)
|
|
829
872
|
FPW_COM FPT_COM
|
830
873
|
#endif
|
831
874
|
#ifndef TIGHT_PARSER
|
832
|
-
"('
|
875
|
+
"('?" NUMBER "+)[^-\\d\\s]*"
|
833
876
|
#else
|
834
877
|
"(\\d+)(?:(?:st|nd|rd|th)\\b)?"
|
835
878
|
#endif
|
@@ -842,7 +885,11 @@ parse_eu(VALUE str, VALUE hash)
|
|
842
885
|
"(?:"
|
843
886
|
"\\s*"
|
844
887
|
#ifndef TIGHT_PARSER
|
845
|
-
"(
|
888
|
+
"(?:"
|
889
|
+
BEGIN_ERA
|
890
|
+
"(c(?:e|\\.e\\.)|b(?:ce|\\.c\\.e\\.)|a(?:d|\\.d\\.)|b(?:c|\\.c\\.))"
|
891
|
+
END_ERA
|
892
|
+
")?"
|
846
893
|
"\\s*"
|
847
894
|
"('?-?\\d+(?:(?:st|nd|rd|th)\\b)?)"
|
848
895
|
#else
|
@@ -919,8 +966,8 @@ parse_us(VALUE str, VALUE hash)
|
|
919
966
|
COM_FPT
|
920
967
|
#endif
|
921
968
|
"(?:"
|
922
|
-
"\\s
|
923
|
-
"\\s
|
969
|
+
"\\s*+,?"
|
970
|
+
"\\s*+"
|
924
971
|
#ifndef TIGHT_PARSER
|
925
972
|
"(c(?:e|\\.e\\.)|b(?:ce|\\.c\\.e\\.)|a(?:d|\\.d\\.)|b(?:c|\\.c\\.))?"
|
926
973
|
"\\s*"
|
@@ -967,7 +1014,7 @@ parse_iso(VALUE str, VALUE hash)
|
|
967
1014
|
{
|
968
1015
|
static const char pat_source[] =
|
969
1016
|
#ifndef TIGHT_PARSER
|
970
|
-
"('?[-+]
|
1017
|
+
"('?[-+]?" NUMBER "+)-(\\d+)-('?-?\\d+)"
|
971
1018
|
#else
|
972
1019
|
BOS
|
973
1020
|
FPW_COM FPT_COM
|
@@ -1321,7 +1368,7 @@ parse_vms11(VALUE str, VALUE hash)
|
|
1321
1368
|
{
|
1322
1369
|
static const char pat_source[] =
|
1323
1370
|
#ifndef TIGHT_PARSER
|
1324
|
-
"('
|
1371
|
+
"('?-?" NUMBER "+)-(" ABBR_MONTHS ")[^-/.]*"
|
1325
1372
|
"-('?-?\\d+)"
|
1326
1373
|
#else
|
1327
1374
|
BOS
|
@@ -1416,7 +1463,7 @@ parse_sla(VALUE str, VALUE hash)
|
|
1416
1463
|
{
|
1417
1464
|
static const char pat_source[] =
|
1418
1465
|
#ifndef TIGHT_PARSER
|
1419
|
-
"('
|
1466
|
+
"('?-?" NUMBER "+)/\\s*('?\\d+)(?:\\D\\s*('?-?\\d+))?"
|
1420
1467
|
#else
|
1421
1468
|
BOS
|
1422
1469
|
FPW_COM FPT_COM
|
@@ -1524,7 +1571,7 @@ parse_dot(VALUE str, VALUE hash)
|
|
1524
1571
|
{
|
1525
1572
|
static const char pat_source[] =
|
1526
1573
|
#ifndef TIGHT_PARSER
|
1527
|
-
"('
|
1574
|
+
"('?-?" NUMBER "+)\\.\\s*('?\\d+)\\.\\s*('?-?\\d+)"
|
1528
1575
|
#else
|
1529
1576
|
BOS
|
1530
1577
|
FPW_COM FPT_COM
|
@@ -1684,7 +1731,7 @@ parse_mday(VALUE str, VALUE hash)
|
|
1684
1731
|
{
|
1685
1732
|
static const char pat_source[] =
|
1686
1733
|
#ifndef TIGHT_PARSER
|
1687
|
-
"(
|
1734
|
+
"(" NUMBER "+)(st|nd|rd|th)\\b"
|
1688
1735
|
#else
|
1689
1736
|
BOS
|
1690
1737
|
FPW_COM FPT_COM
|
@@ -1922,7 +1969,7 @@ parse_ddd(VALUE str, VALUE hash)
|
|
1922
1969
|
#ifdef TIGHT_PARSER
|
1923
1970
|
BOS
|
1924
1971
|
#endif
|
1925
|
-
"([-+]?)(
|
1972
|
+
"([-+]?)(" NUMBER "{2,14})"
|
1926
1973
|
"(?:"
|
1927
1974
|
"\\s*"
|
1928
1975
|
"t?"
|
data/ext/date/extconf.rb
CHANGED
data/ext/date/zonetab.h
CHANGED
@@ -36,7 +36,7 @@ struct zone {
|
|
36
36
|
int name;
|
37
37
|
int offset;
|
38
38
|
};
|
39
|
-
static const struct zone *zonetab();
|
39
|
+
static const struct zone *zonetab(register const char *str, register size_t len);
|
40
40
|
#line 9 "zonetab.list"
|
41
41
|
struct zone;
|
42
42
|
|
@@ -49,7 +49,7 @@ struct zone;
|
|
49
49
|
|
50
50
|
#ifndef GPERF_DOWNCASE
|
51
51
|
#define GPERF_DOWNCASE 1
|
52
|
-
static unsigned char gperf_downcase[256] =
|
52
|
+
static const unsigned char gperf_downcase[256] =
|
53
53
|
{
|
54
54
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
55
55
|
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
|
data/ext/date/zonetab.list
CHANGED
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.
|
4
|
+
version: 3.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tadayoshi Funaba
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A subclass of Object includes Comparable module for handling dates.
|
14
14
|
email:
|
@@ -18,6 +18,7 @@ extensions:
|
|
18
18
|
- ext/date/extconf.rb
|
19
19
|
extra_rdoc_files: []
|
20
20
|
files:
|
21
|
+
- README.md
|
21
22
|
- ext/date/date_core.c
|
22
23
|
- ext/date/date_parse.c
|
23
24
|
- ext/date/date_strftime.c
|
@@ -48,7 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
48
49
|
- !ruby/object:Gem::Version
|
49
50
|
version: '0'
|
50
51
|
requirements: []
|
51
|
-
rubygems_version: 3.
|
52
|
+
rubygems_version: 3.4.0.dev
|
52
53
|
signing_key:
|
53
54
|
specification_version: 4
|
54
55
|
summary: A subclass of Object includes Comparable module for handling dates.
|