home_run 0.9.0-x86-mingw32 → 0.9.1-x86-mingw32
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.
- data/CHANGELOG +46 -0
- data/README.rdoc +45 -33
- data/Rakefile +26 -67
- data/bench/cpu_bench.rb +1 -54
- data/bench/cpu_bench_util.rb +55 -0
- data/bench/parser_bench.rb +20 -0
- data/bin/home_run +14 -17
- data/default.mspec +1 -1
- data/ext/{date_ext.c → date_ext/date_ext.c} +95 -208
- data/ext/date_ext/date_ext.h +187 -0
- data/ext/date_ext/date_parser.c +852 -0
- data/ext/date_ext/date_parser.rl +352 -0
- data/ext/{datetime.c → date_ext/datetime.c} +120 -77
- data/ext/date_ext/extconf.rb +6 -0
- data/lib/1.8/date_ext.so +0 -0
- data/lib/1.9/date_ext.so +0 -0
- data/{ext → lib}/date/format.rb +1 -1
- data/lib/date.rb +7 -0
- data/lib/home_run.rb +5 -0
- data/spec/date/allocate_spec.rb +7 -0
- data/spec/date/encoding_spec.rb +42 -0
- data/spec/date/limits_spec.rb +121 -0
- data/spec/date/parse_spec.rb +154 -0
- data/spec/date/parsing_spec.rb +11 -0
- data/spec/date/step_spec.rb +22 -0
- data/spec/date/strptime_spec.rb +35 -3
- data/spec/datetime/add_spec.rb +4 -4
- data/spec/datetime/allocate_spec.rb +7 -0
- data/spec/datetime/encoding_spec.rb +42 -0
- data/spec/datetime/limits_spec.rb +170 -0
- data/spec/datetime/parse_spec.rb +73 -0
- data/spec/datetime/parsing_spec.rb +4 -0
- data/spec/datetime/step_spec.rb +22 -0
- data/spec/datetime/strptime_spec.rb +10 -0
- metadata +24 -14
- data/ext/1.8/date_ext.so +0 -0
- data/ext/1.9/date_ext.so +0 -0
- data/ext/date.rb +0 -7
- data/ext/date_parser.c +0 -367
- data/ext/date_parser.rl +0 -134
- data/ext/extconf.rb +0 -6
@@ -1,6 +1,67 @@
|
|
1
|
+
#include "date_ext.h"
|
2
|
+
|
3
|
+
extern const unsigned char rhrd_days_in_month[];
|
4
|
+
extern const long rhrd_cumulative_days_in_month[];
|
5
|
+
extern const unsigned char rhrd_yday_to_month[];
|
6
|
+
extern const unsigned char rhrd_leap_yday_to_month[];
|
7
|
+
|
8
|
+
extern const char * rhrd__abbr_month_names[];
|
9
|
+
extern const char * rhrd__abbr_day_names[];
|
10
|
+
|
11
|
+
static VALUE rhrdt_step(int argc, VALUE *argv, VALUE self);
|
12
|
+
static VALUE rhrdt_to_s(VALUE self);
|
13
|
+
VALUE rhrdt__new_offset(VALUE self, double offset);
|
14
|
+
void rhrdt__jd_to_civil(rhrdt_t *date);
|
15
|
+
void rhrdt__nanos_to_hms(rhrdt_t *d);
|
16
|
+
|
17
|
+
extern VALUE rhrd_class;
|
18
|
+
extern VALUE rhrdt_class;
|
19
|
+
extern VALUE rhrdt_s_class;
|
20
|
+
extern ID rhrd_id__parse;
|
21
|
+
extern ID rhrd_id_cwday;
|
22
|
+
extern ID rhrd_id_cweek;
|
23
|
+
extern ID rhrd_id_cwyear;
|
24
|
+
extern ID rhrd_id_hash;
|
25
|
+
extern ID rhrd_id_now;
|
26
|
+
extern ID rhrd_id_offset;
|
27
|
+
extern ID rhrd_id_to_i;
|
28
|
+
#ifdef RUBY19
|
29
|
+
extern ID rhrd_id_nsec;
|
30
|
+
#else
|
31
|
+
extern ID rhrd_id_usec;
|
32
|
+
#endif
|
33
|
+
extern ID rhrd_id_utc_offset;
|
34
|
+
extern VALUE rhrd_sym_hour;
|
35
|
+
extern VALUE rhrd_sym_min;
|
36
|
+
extern VALUE rhrd_sym_offset;
|
37
|
+
extern VALUE rhrd_sym_sec;
|
38
|
+
extern VALUE rhrd_sym_sec_fraction;
|
39
|
+
extern VALUE rhrd_sym_seconds;
|
40
|
+
|
41
|
+
#ifdef RUBY19
|
42
|
+
extern ID rhrd_id__httpdate;
|
43
|
+
extern ID rhrd_id__iso8601;
|
44
|
+
extern ID rhrd_id__jisx0301;
|
45
|
+
extern ID rhrd_id__rfc2822;
|
46
|
+
extern ID rhrd_id__rfc3339;
|
47
|
+
extern ID rhrd_id__xmlschema;
|
48
|
+
|
49
|
+
extern ID rhrd_id_to_enum;
|
50
|
+
extern ID rhrd_id_localtime;
|
51
|
+
extern ID rhrd_id_utc;
|
52
|
+
|
53
|
+
extern VALUE rhrd_sym_step;
|
54
|
+
#endif
|
1
55
|
|
2
56
|
/* Helper methods */
|
3
57
|
|
58
|
+
/* Raise an ArgumentError if the offset is outside the allowed range. */
|
59
|
+
void rhrdt__check_offset(long offset) {
|
60
|
+
if (offset > RHR_MAX_OFFSET || offset < RHR_MIN_OFFSET) {
|
61
|
+
rb_raise(rb_eArgError, "invalid offset: %ld minutes", offset);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
4
65
|
/* Identical for rhrd__valid_civil, but for rhrdt_t. Not very
|
5
66
|
* DRY, but the arguments get modified by the method and then
|
6
67
|
* used to populate the rhrdt_t. Because the rhrd_t field structure
|
@@ -38,7 +99,7 @@ int rhrdt__valid_civil(rhrdt_t *dt, long year, long month, long day) {
|
|
38
99
|
}
|
39
100
|
|
40
101
|
if(!rhrd__valid_civil_limits(year, month, day)) {
|
41
|
-
|
102
|
+
rb_raise(rb_eRangeError, "datetime out of range: year = %li, month = %li, day = %li", year, month, day);
|
42
103
|
}
|
43
104
|
|
44
105
|
dt->year = year;
|
@@ -49,23 +110,21 @@ int rhrdt__valid_civil(rhrdt_t *dt, long year, long month, long day) {
|
|
49
110
|
}
|
50
111
|
|
51
112
|
/* Check if the given offset is valid. If so, set the offset field
|
52
|
-
* in the rhrdt_t
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
dt->offset = lround(offset * 1440);
|
59
|
-
return 1;
|
113
|
+
* in the rhrdt_t, otherwise, raise an ArgumentError. */
|
114
|
+
void rhrdt__set_offset(rhrdt_t *dt, double offset) {
|
115
|
+
long offset_min;
|
116
|
+
offset_min = lround(offset * 1440);
|
117
|
+
rhrdt__check_offset(offset_min);
|
118
|
+
dt->offset = offset_min;
|
60
119
|
}
|
61
120
|
|
62
|
-
/* Check if the time information consistutes a valid time. If not,
|
63
|
-
*
|
121
|
+
/* Check if the time information consistutes a valid time. If not, raise an
|
122
|
+
* ArgumentError. If so, fill in the fields in the rhrdt_t. This handles
|
64
123
|
* wrap around for negative hour, minute, and second arguments, and handles
|
65
124
|
* an hour of 24 with no minute or second value as the 0th hour of the next
|
66
125
|
* day, so either the julian day or civil day fields in the rhrdt_t should
|
67
126
|
* be filled out before calling this method. */
|
68
|
-
|
127
|
+
void rhrdt__set_time(rhrdt_t *dt, long h, long m, long s, double offset) {
|
69
128
|
if (h < 0) {
|
70
129
|
h += 24;
|
71
130
|
}
|
@@ -82,17 +141,14 @@ int rhrdt__valid_time(rhrdt_t *dt, long h, long m, long s, double offset) {
|
|
82
141
|
dt->flags &= ~RHR_HAVE_CIVIL;
|
83
142
|
h = 0;
|
84
143
|
} else if (h < 0 || m < 0 || s < 0 || h > 23 || m > 59 || s > 59) {
|
85
|
-
|
86
|
-
}
|
87
|
-
if(!rhrdt__valid_offset(dt, offset)) {
|
88
|
-
return 0;
|
144
|
+
rb_raise(rb_eArgError, "invalid time: %ld hours, %ld minutes, %ld seconds", h, m, s);
|
89
145
|
}
|
146
|
+
rhrdt__set_offset(dt, offset);
|
90
147
|
|
91
148
|
dt->hour = h;
|
92
149
|
dt->minute = m;
|
93
150
|
dt->second = s;
|
94
151
|
dt->flags |= RHR_HAVE_HMS;
|
95
|
-
return 1;
|
96
152
|
}
|
97
153
|
|
98
154
|
/* Same as rhrd__civil_to_jd for rhrdt_t. */
|
@@ -172,7 +228,7 @@ int rhrdt__valid_commercial(rhrdt_t *d, long cwyear, long cweek, long cwday) {
|
|
172
228
|
}
|
173
229
|
|
174
230
|
if ((n.jd > RHR_JD_MAX) || (n.jd < RHR_JD_MIN)) {
|
175
|
-
|
231
|
+
rb_raise(rb_eRangeError, "datetime out of range");
|
176
232
|
}
|
177
233
|
|
178
234
|
d->jd = n.jd;
|
@@ -209,7 +265,7 @@ int rhrdt__valid_ordinal(rhrdt_t *d, long year, long yday) {
|
|
209
265
|
}
|
210
266
|
|
211
267
|
if(!rhrd__valid_civil_limits(year, month, day)) {
|
212
|
-
|
268
|
+
rb_raise(rb_eRangeError, "datetime out of range");
|
213
269
|
}
|
214
270
|
|
215
271
|
d->year = year;
|
@@ -251,7 +307,7 @@ VALUE rhrdt__from_jd_nanos(long jd, long long nanos, short offset) {
|
|
251
307
|
long t;
|
252
308
|
rhrdt_t *dt;
|
253
309
|
VALUE new;
|
254
|
-
new = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL,
|
310
|
+
new = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL, -1, dt);
|
255
311
|
|
256
312
|
if (nanos < 0) {
|
257
313
|
t = nanos/RHR_NANOS_PER_DAY - 1;
|
@@ -263,6 +319,7 @@ VALUE rhrdt__from_jd_nanos(long jd, long long nanos, short offset) {
|
|
263
319
|
jd += t;
|
264
320
|
}
|
265
321
|
dt->jd = jd;
|
322
|
+
RHR_CHECK_JD(dt)
|
266
323
|
dt->nanos = nanos;
|
267
324
|
dt->offset = offset;
|
268
325
|
dt->flags = RHR_HAVE_JD | RHR_HAVE_NANOS;
|
@@ -314,7 +371,7 @@ VALUE rhrdt__add_months(VALUE self, long n) {
|
|
314
371
|
long x;
|
315
372
|
Data_Get_Struct(self, rhrdt_t, d);
|
316
373
|
|
317
|
-
new = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL,
|
374
|
+
new = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL, -1, newd);
|
318
375
|
RHRDT_FILL_CIVIL(d)
|
319
376
|
memcpy(newd, d, sizeof(rhrdt_t));
|
320
377
|
|
@@ -377,9 +434,7 @@ void rhrdt__fill_from_hash(rhrdt_t *dt, VALUE hash) {
|
|
377
434
|
dt->minute = (time_set - dt->hour * RHR_SECONDS_PER_HOUR)/60;
|
378
435
|
dt->second = rhrd__mod(time_set, 60);
|
379
436
|
offset /= 60;
|
380
|
-
|
381
|
-
rb_raise(rb_eArgError, "invalid offset: %ld minutes", offset);
|
382
|
-
}
|
437
|
+
rhrdt__check_offset(offset);
|
383
438
|
RHR_CHECK_JD(dt);
|
384
439
|
dt->flags = RHR_HAVE_JD | RHR_HAVE_NANOS | RHR_HAVE_HMS;
|
385
440
|
return;
|
@@ -428,15 +483,13 @@ void rhrdt__fill_from_hash(rhrdt_t *dt, VALUE hash) {
|
|
428
483
|
dt->flags |= RHR_HAVE_CIVIL;
|
429
484
|
}
|
430
485
|
if(time_set) {
|
431
|
-
|
486
|
+
rhrdt__set_time(dt, hour, minute, second, offset/RHR_SECONDS_PER_DAYD);
|
432
487
|
if(nanos) {
|
433
488
|
RHRDT_FILL_NANOS(dt)
|
434
489
|
dt->nanos += nanos;
|
435
490
|
}
|
436
491
|
} else if (offset) {
|
437
|
-
|
438
|
-
rb_raise(rb_eArgError, "invalid date");
|
439
|
-
}
|
492
|
+
rhrdt__set_offset(dt, offset/RHR_SECONDS_PER_DAYD);
|
440
493
|
}
|
441
494
|
}
|
442
495
|
|
@@ -447,10 +500,8 @@ VALUE rhrdt__new_offset(VALUE self, double offset) {
|
|
447
500
|
rhrdt_t *dt;
|
448
501
|
long offset_min;
|
449
502
|
|
450
|
-
if(offset < RHR_MIN_OFFSET_FRACT || offset > RHR_MAX_OFFSET_FRACT) {
|
451
|
-
rb_raise(rb_eArgError, "invalid offset (%f)", offset);
|
452
|
-
}
|
453
503
|
offset_min = lround(offset * 1440.0);
|
504
|
+
rhrdt__check_offset(offset_min);
|
454
505
|
Data_Get_Struct(self, rhrdt_t, dt);
|
455
506
|
RHRDT_FILL_JD(dt)
|
456
507
|
RHRDT_FILL_NANOS(dt)
|
@@ -473,7 +524,7 @@ static VALUE rhrdt_s__load(VALUE klass, VALUE string) {
|
|
473
524
|
rhrdt_t * d;
|
474
525
|
long x;
|
475
526
|
VALUE ary, rd;
|
476
|
-
rd = Data_Make_Struct(klass, rhrdt_t, NULL,
|
527
|
+
rd = Data_Make_Struct(klass, rhrdt_t, NULL, -1, d);
|
477
528
|
|
478
529
|
ary = rb_marshal_load(string);
|
479
530
|
if (!RTEST(rb_obj_is_kind_of(ary, rb_cArray)) || RARRAY_LEN(ary) != 3) {
|
@@ -489,9 +540,7 @@ static VALUE rhrdt_s__load(VALUE klass, VALUE string) {
|
|
489
540
|
}
|
490
541
|
|
491
542
|
x = NUM2LONG(rb_ary_entry(ary, 2));
|
492
|
-
|
493
|
-
rb_raise(rb_eArgError, "invalid offset: %ld minutes", x);
|
494
|
-
}
|
543
|
+
rhrdt__check_offset(x);
|
495
544
|
d->offset = x;
|
496
545
|
|
497
546
|
d->flags = RHR_HAVE_JD | RHR_HAVE_NANOS;
|
@@ -545,7 +594,7 @@ static VALUE rhrdt_s_civil(int argc, VALUE *argv, VALUE klass) {
|
|
545
594
|
long minute = 0;
|
546
595
|
long second = 0;
|
547
596
|
double offset = 0.0;
|
548
|
-
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL,
|
597
|
+
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL, -1, dt);
|
549
598
|
|
550
599
|
switch(argc) {
|
551
600
|
case 0:
|
@@ -573,13 +622,9 @@ static VALUE rhrdt_s_civil(int argc, VALUE *argv, VALUE klass) {
|
|
573
622
|
}
|
574
623
|
|
575
624
|
if (!rhrdt__valid_civil(dt, year, month, day)) {
|
576
|
-
RHR_CHECK_CIVIL(dt)
|
577
625
|
rb_raise(rb_eArgError, "invalid date (year: %li, month: %li, day: %li)", year, month, day);
|
578
626
|
}
|
579
|
-
|
580
|
-
rb_raise(rb_eArgError, "invalid time (hour: %li, minute: %li, second: %li, offset: %f)", hour, minute, second, offset);
|
581
|
-
}
|
582
|
-
|
627
|
+
rhrdt__set_time(dt, hour, minute, second, offset);
|
583
628
|
return rdt;
|
584
629
|
}
|
585
630
|
|
@@ -606,7 +651,7 @@ static VALUE rhrdt_s_commercial(int argc, VALUE *argv, VALUE klass) {
|
|
606
651
|
long minute = 0;
|
607
652
|
long second = 0;
|
608
653
|
double offset = 0.0;
|
609
|
-
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL,
|
654
|
+
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL, -1, dt);
|
610
655
|
|
611
656
|
switch(argc) {
|
612
657
|
case 8:
|
@@ -638,13 +683,9 @@ static VALUE rhrdt_s_commercial(int argc, VALUE *argv, VALUE klass) {
|
|
638
683
|
break;
|
639
684
|
}
|
640
685
|
if(!rhrdt__valid_commercial(dt, cwyear, cweek, cwday)) {
|
641
|
-
RHR_CHECK_JD(dt)
|
642
686
|
rb_raise(rb_eArgError, "invalid date (cwyear: %li, cweek: %li, cwday: %li)", cwyear, cweek, cwday);
|
643
687
|
}
|
644
|
-
|
645
|
-
rb_raise(rb_eArgError, "invalid time (hour: %li, minute: %li, second: %li, offset: %f)", hour, minute, second, offset);
|
646
|
-
}
|
647
|
-
|
688
|
+
rhrdt__set_time(dt, hour, minute, second, offset);
|
648
689
|
return rdt;
|
649
690
|
}
|
650
691
|
|
@@ -662,7 +703,7 @@ static VALUE rhrdt_s_jd(int argc, VALUE *argv, VALUE klass) {
|
|
662
703
|
long minute = 0;
|
663
704
|
long second = 0;
|
664
705
|
double offset = 0.0;
|
665
|
-
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL,
|
706
|
+
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL, -1, dt);
|
666
707
|
|
667
708
|
switch(argc) {
|
668
709
|
case 0:
|
@@ -687,10 +728,7 @@ static VALUE rhrdt_s_jd(int argc, VALUE *argv, VALUE klass) {
|
|
687
728
|
|
688
729
|
RHR_CHECK_JD(dt)
|
689
730
|
dt->flags = RHR_HAVE_JD;
|
690
|
-
|
691
|
-
rb_raise(rb_eArgError, "invalid time (hour: %li, minute: %li, second: %li, offset: %f)", hour, minute, second, offset);
|
692
|
-
}
|
693
|
-
|
731
|
+
rhrdt__set_time(dt, hour, minute, second, offset);
|
694
732
|
return rdt;
|
695
733
|
}
|
696
734
|
|
@@ -715,7 +753,7 @@ static VALUE rhrdt_s_jd(int argc, VALUE *argv, VALUE klass) {
|
|
715
753
|
static VALUE rhrdt_s_new_b(int argc, VALUE *argv, VALUE klass) {
|
716
754
|
double offset = 0;
|
717
755
|
rhrdt_t *dt;
|
718
|
-
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL,
|
756
|
+
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL, -1, dt);
|
719
757
|
|
720
758
|
switch(argc) {
|
721
759
|
case 0:
|
@@ -724,12 +762,11 @@ static VALUE rhrdt_s_new_b(int argc, VALUE *argv, VALUE klass) {
|
|
724
762
|
case 2:
|
725
763
|
case 3:
|
726
764
|
offset = NUM2DBL(argv[1]);
|
727
|
-
|
728
|
-
rb_raise(rb_eArgError, "invalid offset (%f)", offset);
|
729
|
-
}
|
765
|
+
rhrdt__set_offset(dt, offset);
|
730
766
|
case 1:
|
731
767
|
offset += NUM2DBL(argv[0]) + 0.5;
|
732
768
|
dt->jd = offset;
|
769
|
+
RHR_CHECK_JD(dt)
|
733
770
|
dt->nanos = (offset - dt->jd)*RHR_NANOS_PER_DAY;
|
734
771
|
dt->flags = RHR_HAVE_JD | RHR_HAVE_NANOS;
|
735
772
|
break;
|
@@ -751,7 +788,7 @@ static VALUE rhrdt_s_new_b(int argc, VALUE *argv, VALUE klass) {
|
|
751
788
|
*/
|
752
789
|
static VALUE rhrdt_s_now(int argc, VALUE *argv, VALUE klass) {
|
753
790
|
rhrdt_t *dt;
|
754
|
-
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL,
|
791
|
+
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL, -1, dt);
|
755
792
|
|
756
793
|
switch(argc) {
|
757
794
|
case 0:
|
@@ -784,7 +821,7 @@ static VALUE rhrdt_s_ordinal(int argc, VALUE *argv, VALUE klass) {
|
|
784
821
|
long second = 0;
|
785
822
|
double offset = 0.0;
|
786
823
|
rhrdt_t *dt;
|
787
|
-
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL,
|
824
|
+
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL, -1, dt);
|
788
825
|
|
789
826
|
switch(argc) {
|
790
827
|
case 7:
|
@@ -813,9 +850,7 @@ static VALUE rhrdt_s_ordinal(int argc, VALUE *argv, VALUE klass) {
|
|
813
850
|
RHR_CHECK_JD(dt)
|
814
851
|
rb_raise(rb_eArgError, "invalid date (year: %li, yday: %li)", year, day);
|
815
852
|
}
|
816
|
-
|
817
|
-
rb_raise(rb_eArgError, "invalid time (hour: %li, minute: %li, second: %li, offset: %f)", hour, minute, second, offset);
|
818
|
-
}
|
853
|
+
rhrdt__set_time(dt, hour, minute, second, offset);
|
819
854
|
return rdt;
|
820
855
|
}
|
821
856
|
|
@@ -833,7 +868,7 @@ static VALUE rhrdt_s_ordinal(int argc, VALUE *argv, VALUE klass) {
|
|
833
868
|
*/
|
834
869
|
static VALUE rhrdt_s_parse(int argc, VALUE *argv, VALUE klass) {
|
835
870
|
rhrdt_t *dt;
|
836
|
-
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL,
|
871
|
+
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL, -1, dt);
|
837
872
|
|
838
873
|
switch(argc) {
|
839
874
|
case 0:
|
@@ -867,7 +902,7 @@ static VALUE rhrdt_s_parse(int argc, VALUE *argv, VALUE klass) {
|
|
867
902
|
*/
|
868
903
|
static VALUE rhrdt_s_strptime(int argc, VALUE *argv, VALUE klass) {
|
869
904
|
rhrdt_t *dt;
|
870
|
-
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL,
|
905
|
+
VALUE rdt = Data_Make_Struct(klass, rhrdt_t, NULL, -1, dt);
|
871
906
|
|
872
907
|
switch(argc) {
|
873
908
|
case 0:
|
@@ -1403,18 +1438,19 @@ static VALUE rhrdt_step(int argc, VALUE *argv, VALUE self) {
|
|
1403
1438
|
double step, limit;
|
1404
1439
|
long long step_nanos, limit_nanos, current_nanos;
|
1405
1440
|
long step_jd, limit_jd, current_jd;
|
1406
|
-
VALUE rlimit, new;
|
1441
|
+
VALUE rlimit, new, rstep;
|
1407
1442
|
Data_Get_Struct(self, rhrdt_t, d);
|
1408
1443
|
Data_Get_Struct(rhrdt__new_offset(self, 0), rhrdt_t, d0);
|
1409
1444
|
|
1410
|
-
rb_need_block();
|
1411
1445
|
switch(argc) {
|
1412
1446
|
case 1:
|
1413
1447
|
step_nanos = 0;
|
1414
1448
|
step_jd = 1;
|
1449
|
+
rstep = LONG2NUM(step_jd);
|
1415
1450
|
break;
|
1416
1451
|
case 2:
|
1417
|
-
|
1452
|
+
rstep = argv[1];
|
1453
|
+
step = NUM2DBL(rstep);
|
1418
1454
|
step_jd = floor(step);
|
1419
1455
|
step_nanos = llround((step - step_jd)*RHR_NANOS_PER_DAY);
|
1420
1456
|
break;
|
@@ -1422,8 +1458,16 @@ static VALUE rhrdt_step(int argc, VALUE *argv, VALUE self) {
|
|
1422
1458
|
rb_raise(rb_eArgError, "wrong number of arguments: %i for 2", argc);
|
1423
1459
|
break;
|
1424
1460
|
}
|
1425
|
-
|
1426
1461
|
rlimit = argv[0];
|
1462
|
+
|
1463
|
+
#ifdef RUBY19
|
1464
|
+
if (!rb_block_given_p()) {
|
1465
|
+
return rb_funcall(self, rhrd_id_to_enum, 3, rhrd_sym_step, rlimit, rstep);
|
1466
|
+
}
|
1467
|
+
#else
|
1468
|
+
rb_need_block();
|
1469
|
+
#endif
|
1470
|
+
|
1427
1471
|
if (RTEST(rb_obj_is_kind_of(rlimit, rb_cNumeric))) {
|
1428
1472
|
limit = NUM2DBL(rlimit);
|
1429
1473
|
limit_jd = floor(limit);
|
@@ -1864,7 +1908,7 @@ VALUE rhrdt__add_years(VALUE self, long n) {
|
|
1864
1908
|
VALUE new;
|
1865
1909
|
Data_Get_Struct(self, rhrdt_t, d);
|
1866
1910
|
|
1867
|
-
new = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL,
|
1911
|
+
new = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL, -1, newd);
|
1868
1912
|
RHRDT_FILL_CIVIL(d)
|
1869
1913
|
memcpy(newd, d, sizeof(rhrdt_t));
|
1870
1914
|
|
@@ -1943,7 +1987,7 @@ long rhrdt__add_iso_time_format(rhrdt_t *dt, char *str, long len, long i) {
|
|
1943
1987
|
static VALUE rhrdt_s_httpdate(int argc, VALUE *argv, VALUE klass) {
|
1944
1988
|
rhrdt_t *d;
|
1945
1989
|
VALUE rd;
|
1946
|
-
rd = Data_Make_Struct(klass, rhrdt_t, NULL,
|
1990
|
+
rd = Data_Make_Struct(klass, rhrdt_t, NULL, -1, d);
|
1947
1991
|
|
1948
1992
|
switch(argc) {
|
1949
1993
|
case 0:
|
@@ -1978,7 +2022,7 @@ static VALUE rhrdt_s_httpdate(int argc, VALUE *argv, VALUE klass) {
|
|
1978
2022
|
static VALUE rhrdt_s_iso8601(int argc, VALUE *argv, VALUE klass) {
|
1979
2023
|
rhrdt_t *d;
|
1980
2024
|
VALUE rd;
|
1981
|
-
rd = Data_Make_Struct(klass, rhrdt_t, NULL,
|
2025
|
+
rd = Data_Make_Struct(klass, rhrdt_t, NULL, -1, d);
|
1982
2026
|
|
1983
2027
|
switch(argc) {
|
1984
2028
|
case 0:
|
@@ -2013,7 +2057,7 @@ static VALUE rhrdt_s_iso8601(int argc, VALUE *argv, VALUE klass) {
|
|
2013
2057
|
static VALUE rhrdt_s_jisx0301(int argc, VALUE *argv, VALUE klass) {
|
2014
2058
|
rhrdt_t *d;
|
2015
2059
|
VALUE rd;
|
2016
|
-
rd = Data_Make_Struct(klass, rhrdt_t, NULL,
|
2060
|
+
rd = Data_Make_Struct(klass, rhrdt_t, NULL, -1, d);
|
2017
2061
|
|
2018
2062
|
switch(argc) {
|
2019
2063
|
case 0:
|
@@ -2048,7 +2092,7 @@ static VALUE rhrdt_s_jisx0301(int argc, VALUE *argv, VALUE klass) {
|
|
2048
2092
|
static VALUE rhrdt_s_rfc2822(int argc, VALUE *argv, VALUE klass) {
|
2049
2093
|
rhrdt_t *d;
|
2050
2094
|
VALUE rd;
|
2051
|
-
rd = Data_Make_Struct(klass, rhrdt_t, NULL,
|
2095
|
+
rd = Data_Make_Struct(klass, rhrdt_t, NULL, -1, d);
|
2052
2096
|
|
2053
2097
|
switch(argc) {
|
2054
2098
|
case 0:
|
@@ -2083,7 +2127,7 @@ static VALUE rhrdt_s_rfc2822(int argc, VALUE *argv, VALUE klass) {
|
|
2083
2127
|
static VALUE rhrdt_s_rfc3339(int argc, VALUE *argv, VALUE klass) {
|
2084
2128
|
rhrdt_t *d;
|
2085
2129
|
VALUE rd;
|
2086
|
-
rd = Data_Make_Struct(klass, rhrdt_t, NULL,
|
2130
|
+
rd = Data_Make_Struct(klass, rhrdt_t, NULL, -1, d);
|
2087
2131
|
|
2088
2132
|
switch(argc) {
|
2089
2133
|
case 0:
|
@@ -2118,7 +2162,7 @@ static VALUE rhrdt_s_rfc3339(int argc, VALUE *argv, VALUE klass) {
|
|
2118
2162
|
static VALUE rhrdt_s_xmlschema(int argc, VALUE *argv, VALUE klass) {
|
2119
2163
|
rhrdt_t *d;
|
2120
2164
|
VALUE rd;
|
2121
|
-
rd = Data_Make_Struct(klass, rhrdt_t, NULL,
|
2165
|
+
rd = Data_Make_Struct(klass, rhrdt_t, NULL, -1, d);
|
2122
2166
|
|
2123
2167
|
switch(argc) {
|
2124
2168
|
case 0:
|
@@ -2512,7 +2556,7 @@ static VALUE rhrdt_rfc2822(VALUE self) {
|
|
2512
2556
|
static VALUE rhrdt_to_date(VALUE self) {
|
2513
2557
|
rhrd_t *d;
|
2514
2558
|
rhrdt_t *dt;
|
2515
|
-
VALUE rd = Data_Make_Struct(rhrd_class, rhrd_t, NULL,
|
2559
|
+
VALUE rd = Data_Make_Struct(rhrd_class, rhrd_t, NULL, -1, d);
|
2516
2560
|
Data_Get_Struct(self, rhrdt_t, dt);
|
2517
2561
|
|
2518
2562
|
if (RHR_HAS_CIVIL(dt)) {
|
@@ -2570,7 +2614,7 @@ static VALUE rhrdt_time_to_datetime(VALUE self) {
|
|
2570
2614
|
rhrdt_t *dt;
|
2571
2615
|
VALUE rd;
|
2572
2616
|
long t, offset;
|
2573
|
-
rd = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL,
|
2617
|
+
rd = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL, -1, dt);
|
2574
2618
|
|
2575
2619
|
offset = NUM2LONG(rb_funcall(self, rhrd_id_utc_offset, 0));
|
2576
2620
|
t = NUM2LONG(rb_funcall(self, rhrd_id_to_i, 0)) + offset;
|
@@ -2680,7 +2724,6 @@ void Init_datetime(void) {
|
|
2680
2724
|
/* Define class */
|
2681
2725
|
|
2682
2726
|
rhrdt_class = rb_define_class("DateTime", rhrd_class);
|
2683
|
-
rb_undef_alloc_func(rhrdt_class);
|
2684
2727
|
rhrdt_s_class = rb_singleton_class(rhrdt_class);
|
2685
2728
|
|
2686
2729
|
/* Define methods for all ruby versions*/
|
data/lib/1.8/date_ext.so
ADDED
Binary file
|
data/lib/1.9/date_ext.so
ADDED
Binary file
|
data/{ext → lib}/date/format.rb
RENAMED
@@ -1,7 +1,7 @@
|
|
1
1
|
# format.rb: Written by Tadayoshi Funaba 1999-2009
|
2
2
|
# $Id: format.rb,v 2.43 2008-01-17 20:16:31+09 tadf Exp $
|
3
3
|
|
4
|
-
require 'date' unless defined?(Date)
|
4
|
+
require 'date' unless defined?(Date::ZONES)
|
5
5
|
|
6
6
|
class Date
|
7
7
|
# Holds some constants used by the pure ruby parsing code.
|
data/lib/date.rb
ADDED
data/lib/home_run.rb
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
2
|
+
|
3
|
+
ruby_version_is "1.9" do
|
4
|
+
describe "Date string encoding methods" do
|
5
|
+
it "should return strings in US-ASCII encoding by default" do
|
6
|
+
d = Date.today
|
7
|
+
d.asctime.encoding.name.should == 'US-ASCII'
|
8
|
+
d.ctime.encoding.name.should == 'US-ASCII'
|
9
|
+
d.httpdate.encoding.name.should == 'US-ASCII'
|
10
|
+
d.inspect.encoding.name.should == 'US-ASCII'
|
11
|
+
d.iso8601.encoding.name.should == 'US-ASCII'
|
12
|
+
d.jisx0301.encoding.name.should == 'US-ASCII'
|
13
|
+
d.rfc2822.encoding.name.should == 'US-ASCII'
|
14
|
+
d.rfc3339.encoding.name.should == 'US-ASCII'
|
15
|
+
d.rfc822.encoding.name.should == 'US-ASCII'
|
16
|
+
d.strftime('%S:%M:%H').encoding.name.should == 'US-ASCII'
|
17
|
+
d.to_s.encoding.name.should == 'US-ASCII'
|
18
|
+
d.xmlschema.encoding.name.should == 'US-ASCII'
|
19
|
+
end
|
20
|
+
|
21
|
+
it "should return strings in default_internal encoding if set" do
|
22
|
+
begin
|
23
|
+
Encoding.default_internal = 'UTF-8'
|
24
|
+
d = Date.today
|
25
|
+
d.asctime.encoding.name.should == 'UTF-8'
|
26
|
+
d.ctime.encoding.name.should == 'UTF-8'
|
27
|
+
d.httpdate.encoding.name.should == 'UTF-8'
|
28
|
+
d.inspect.encoding.name.should == 'UTF-8'
|
29
|
+
d.iso8601.encoding.name.should == 'UTF-8'
|
30
|
+
d.jisx0301.encoding.name.should == 'UTF-8'
|
31
|
+
d.rfc2822.encoding.name.should == 'UTF-8'
|
32
|
+
d.rfc3339.encoding.name.should == 'UTF-8'
|
33
|
+
d.rfc822.encoding.name.should == 'UTF-8'
|
34
|
+
d.strftime('%S:%M:%H').encoding.name.should == 'UTF-8'
|
35
|
+
d.to_s.encoding.name.should == 'UTF-8'
|
36
|
+
d.xmlschema.encoding.name.should == 'UTF-8'
|
37
|
+
ensure
|
38
|
+
Encoding.default_internal = nil
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|