home_run 0.9.0-x86-mingw32 → 0.9.1-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- 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
|