home_run 0.9.0-x86-mswin32-60 → 0.9.1-x86-mswin32-60

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.
@@ -1,146 +1,5 @@
1
-
2
- #include <math.h>
3
- #include <stdio.h>
4
- #include <stdlib.h>
5
- #include <inttypes.h>
6
- #include <ruby.h>
7
-
8
- #ifdef RUBY19
9
- #define RHR_DEFAULT_CWYEAR -4713
10
- #define RHR_DEFAULT_CWEEK 1
11
- #define RHR_DEFAULT_CWDAY 1
12
- #else
13
- #define RHR_DEFAULT_CWYEAR 1582
14
- #define RHR_DEFAULT_CWEEK 41
15
- #define RHR_DEFAULT_CWDAY 5
16
- #endif
17
-
18
- #define RHR_JD_MJD 2400001
19
- #define RHR_JD_LD 2299160
20
- #define RHR_JD_ITALY 2299161
21
- #define RHR_JD_ENGLAND 2361222
22
- #define RHR_UNIX_EPOCH 2440588
23
- #define RHR_SECONDS_PER_HOUR 3600
24
- #define RHR_MINUTES_PER_DAYD 1440.0
25
- #define RHR_SECONDS_PER_DAY 86400
26
- #define RHR_SECONDS_PER_DAYD 86400.0
27
- #define RHR_MAX_OFFSET_MINUTES 864
28
- #define RHR_MAX_OFFSET_FRACT 0.6
29
- #define RHR_MIN_OFFSET_MINUTES -864
30
- #define RHR_MIN_OFFSET_FRACT -0.6
31
-
32
- /*
33
- In both the 32-bit and 64-bit cases, the limits are chosen so that you cannot
34
- store a civil date where converting it to a jd would cause an overflow.
35
- */
36
- #if __LP64__
37
- /*
38
- On 64-bit systems, the limits depend on the number of significant digits in
39
- a double (15). These are slightly below the maximum so that all numbers used
40
- in calculations have fewer than 15 digits.
41
- */
42
- #define RHR_JD_MAX 999979466117609
43
- #define RHR_JD_MIN -999979466119058
44
- #define RHR_YEAR_MAX 2737850782415
45
- #define RHR_MONTH_MAX 12
46
- #define RHR_DAY_MAX 5
47
- #define RHR_YEAR_MIN -2737850791845
48
- #define RHR_MONTH_MIN 11
49
- #define RHR_DAY_MIN 26
50
-
51
- #else
52
- /*
53
- On 32-bit systems, the limits depend on the storage limits of 32-bit integers.
54
- The numbers are slightly less than 2**31 - 1 and slightly greater than -2**31
55
- so that no calculations can overflow.
56
- */
57
- #define RHR_JD_MAX 2147438064
58
- #define RHR_JD_MIN -2145083647
59
- #define RHR_YEAR_MAX 5874773
60
- #define RHR_MONTH_MAX 8
61
- #define RHR_DAY_MAX 15
62
- #define RHR_YEAR_MIN -5877752
63
- #define RHR_MONTH_MIN 5
64
- #define RHR_DAY_MIN 8
65
- #endif
66
-
67
- #define RHR_HAVE_JD 1
68
- #define RHR_HAVE_CIVIL 2
69
- #define RHR_HAVE_NANOS 4
70
- #define RHR_HAVE_HMS 8
71
-
72
- #define RHR_NANOS_PER_MILLISECOND 1000000LL
73
- #define RHR_NANOS_PER_SECOND 1000000000LL
74
- #define RHR_NANOS_PER_MINUTE 60000000000LL
75
- #define RHR_NANOS_PER_DAY 86400000000000LL
76
- #define RHR_NANOS_PER_DAYD 86400000000000.0
77
- #define RHR_NANOS_PER_SECONDD 1000000000.0
78
-
79
- #define RHRR_YEAR_SET 0x1
80
- #define RHRR_MONTH_SET 0x2
81
- #define RHRR_DAY_SET 0x4
82
- #define RHRR_YDAY_SET 0x8
83
- #define RHRR_HOUR_SET 0x10
84
- #define RHRR_MINUTE_SET 0x20
85
- #define RHRR_SECOND_SET 0x40
86
- #define RHRR_WDAY_SET 0x80
87
- #define RHRR_CENTURY_SET 0x100
88
- #define RHRR_CWYEAR_SET 0x200
89
- #define RHRR_CWEEK_SET 0x400
90
- #define RHRR_CWDAY_SET 0x800
91
- #define RHRR_SEC_FRACTION_SET 0x1000
92
- #define RHRR_UNIX_SET 0x2000
93
- #define RHRR_WNUM0_SET 0x4000
94
- #define RHRR_WNUM1_SET 0x8000
95
- #define RHRR_MERIDIAN_SET 0x10000
96
- #define RHRR_ZONE_SET 0x20000
97
- #define RHRR_OFFSET_SET 0x40000
98
- #define RHRR_UNIXM_SET 0x80000
99
-
100
- #define RHR_HAS_JD(d) (((d)->flags & RHR_HAVE_JD) == RHR_HAVE_JD)
101
- #define RHR_HAS_CIVIL(d) (((d)->flags & RHR_HAVE_CIVIL) == RHR_HAVE_CIVIL)
102
-
103
- #define RHR_FILL_JD(d) if (((d)->flags & RHR_HAVE_JD) == 0) { rhrd__civil_to_jd(d); }
104
- #define RHR_FILL_CIVIL(d) if (((d)->flags & RHR_HAVE_CIVIL) == 0) { rhrd__jd_to_civil(d); }
105
-
106
- #define RHRDT_FILL_JD(d) if (!((d)->flags & RHR_HAVE_JD)) { rhrdt__civil_to_jd(d); }
107
- #define RHRDT_FILL_CIVIL(d) if (!((d)->flags & RHR_HAVE_CIVIL)) { rhrdt__jd_to_civil(d); }
108
- #define RHRDT_FILL_HMS(d) if (!((d)->flags & RHR_HAVE_HMS)) { rhrdt__nanos_to_hms(d); }
109
- #define RHRDT_FILL_NANOS(d) if (!((d)->flags & RHR_HAVE_NANOS)) { rhrdt__hms_to_nanos(d); }
110
-
111
- #ifdef RUBY186
112
- #define RHR_RETURN_RESIZED_STR(s, len) return rb_str_resize(s, len);
113
- #else
114
- #define RHR_RETURN_RESIZED_STR(s, len) rb_str_set_len(s, len); return s;
115
- #endif
116
-
117
- #define RHR_SPACE_SHIP(x, l, r) if (l < r) { x = -1; } else if (l == r) { x = 0; } else { x = 1; }
118
-
119
- #define RHR_CHECK_JD(d) if ((d->jd > RHR_JD_MAX) || (d->jd < RHR_JD_MIN)) { rb_raise(rb_eRangeError, "date out of range: jd = %li", d->jd);}
120
- #define RHR_CHECK_CIVIL(d) if (!rhrd__valid_civil_limits(d->year, d->month, d->day)) { rb_raise(rb_eRangeError, "date out of range: year = %li, month = %hhi, day = %hhi", d->year, d->month, d->day);}
121
-
122
- #define RHR_CACHED_IV(self, iv) VALUE v = rb_ivar_get(self, iv); if (RTEST(v)) {return v;}
123
-
124
- typedef struct rhrd_s {
125
- long jd;
126
- long year;
127
- unsigned char month;
128
- unsigned char day;
129
- unsigned char flags;
130
- } rhrd_t;
131
-
132
- typedef struct rhrdt_s {
133
- long long nanos; /* Nanoseconds since start of day */
134
- long jd;
135
- long year;
136
- short offset; /* Offset from UTC in minutes */
137
- unsigned char month;
138
- unsigned char day;
139
- unsigned char hour;
140
- unsigned char minute;
141
- unsigned char second;
142
- unsigned char flags;
143
- } rhrdt_t;
1
+ #include <ctype.h>
2
+ #include "date_ext.h"
144
3
 
145
4
  const unsigned char rhrd_days_in_month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
146
5
  const long rhrd_cumulative_days_in_month[13] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
@@ -153,6 +12,7 @@ const char * rhrd__abbr_day_names[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri"
153
12
  const char rhrd__zone_re_str[] = "\\A(?:gmt|utc?)?[-+]\\d+(?:[,.:]\\d+(?::\\d+)?)?|[[:alpha:].\\s]+(?:standard|daylight)\\s+time\\b|[[:alpha:]]+(?:\\s+dst)?\\b";
154
13
  const char rhrd__zone_dst_re_str[] = "\\s+(?:(?:(standard)|daylight)\\s+time|dst)\\z";
155
14
  const char rhrd__zone_sign_re_str[] = "\\A(?:gmt|utc?)?(?:(-)|\\+)";
15
+ const char rhrd__strptime_num_patterns[] = "CDdeFGgHIjkLlMmNQRrSsTUuVvWwXxYy0123456789";
156
16
 
157
17
  VALUE rhrd_class;
158
18
  VALUE rhrd_s_class;
@@ -191,6 +51,7 @@ ID rhrd_id_offset;
191
51
  ID rhrd_id_slice;
192
52
  ID rhrd_id_split;
193
53
  ID rhrd_id_sub_b;
54
+ ID rhrd_id_to_enum;
194
55
  ID rhrd_id_to_i;
195
56
  #ifdef RUBY19
196
57
  ID rhrd_id_nsec;
@@ -223,6 +84,7 @@ VALUE rhrd_sym_offset;
223
84
  VALUE rhrd_sym_sec;
224
85
  VALUE rhrd_sym_sec_fraction;
225
86
  VALUE rhrd_sym_seconds;
87
+ VALUE rhrd_sym_step;
226
88
  VALUE rhrd_sym_wday;
227
89
  VALUE rhrd_sym_wnum0;
228
90
  VALUE rhrd_sym_wnum1;
@@ -231,15 +93,7 @@ VALUE rhrd_sym_year;
231
93
  VALUE rhrd_sym_zone;
232
94
 
233
95
  static VALUE rhrd_step(int argc, VALUE *argv, VALUE self);
234
- static VALUE rhrdt_step(int argc, VALUE *argv, VALUE self);
235
96
  static VALUE rhrd_to_s(VALUE self);
236
- static VALUE rhrdt_to_s(VALUE self);
237
- static VALUE rhrd_s_zone_to_diff(VALUE self, VALUE zone);
238
- VALUE rhrdt__new_offset(VALUE self, double offset);
239
- void rhrdt__civil_to_jd(rhrdt_t *d);
240
- void rhrdt__jd_to_civil(rhrdt_t *date);
241
- void rhrdt__nanos_to_hms(rhrdt_t *d);
242
- void rhrdt__hms_to_nanos(rhrdt_t *d);
243
97
 
244
98
  /* C helper methods */
245
99
 
@@ -264,8 +118,8 @@ long rhrd__modll(long long a, long b) {
264
118
  return c;
265
119
  }
266
120
 
267
- /* Return 0 if the year, month, day provided are greater than
268
- * the allowed limits, 1 otherwise. */
121
+ /* Return 1 if the year, month, day provided are within
122
+ * the allowed limits, 0 otherwise. */
269
123
  int rhrd__valid_civil_limits(long year, long month, long day) {
270
124
  if (year > RHR_YEAR_MAX || year < RHR_YEAR_MIN) {
271
125
  return 0;
@@ -365,7 +219,7 @@ int rhrd__leap_year(long year) {
365
219
  * fields in the rhrd_t and returning 1 if so. If the fields
366
220
  * given are not a valid date, return 0.
367
221
  * This also handles wrap around if the month or day is negative. */
368
- int rhrd__valid_civil(rhrd_t *d, long year, long month, long day) {
222
+ int rhrd__valid_civil(rhrd_t *d, long year, long month, long day, int overlimit_raise) {
369
223
  if (month < 0 && month >= -12) {
370
224
  month += 13;
371
225
  }
@@ -397,6 +251,9 @@ int rhrd__valid_civil(rhrd_t *d, long year, long month, long day) {
397
251
  }
398
252
 
399
253
  if(!rhrd__valid_civil_limits(year, month, day)) {
254
+ if (overlimit_raise == RHR_OVERLIMIT_RAISE) {
255
+ rb_raise(rb_eRangeError, "date out of range: year = %li, month = %li, day = %li", year, month, day);
256
+ }
400
257
  return 0;
401
258
  }
402
259
 
@@ -425,7 +282,7 @@ VALUE rhrd__add_days(VALUE self, long n) {
425
282
  VALUE new;
426
283
  long x;
427
284
  Data_Get_Struct(self, rhrd_t, d);
428
- new = Data_Make_Struct(rhrd_class, rhrd_t, NULL, free, newd);
285
+ new = Data_Make_Struct(rhrd_class, rhrd_t, NULL, -1, newd);
429
286
 
430
287
  if(!(RHR_HAS_JD(d))) {
431
288
  x = rhrd__safe_add_long(n, (long)(d->day));
@@ -456,7 +313,7 @@ VALUE rhrd__add_months(VALUE self, long n) {
456
313
  long x;
457
314
  Data_Get_Struct(self, rhrd_t, d);
458
315
 
459
- new = Data_Make_Struct(rhrd_class, rhrd_t, NULL, free, newd);
316
+ new = Data_Make_Struct(rhrd_class, rhrd_t, NULL, -1, newd);
460
317
  RHR_FILL_CIVIL(d)
461
318
  n = rhrd__safe_add_long(n, (long)(d->month));
462
319
  if(n > 1 && n <= 12) {
@@ -556,7 +413,7 @@ void rhrd__fill_commercial(rhrd_t *d) {
556
413
  * and cwday arguments, if the date is valid, and return 1. If the
557
414
  * date is not valid, return 0. This also handles wrap around if
558
415
  * the cweek or cwday arguments is negative. */
559
- int rhrd__valid_commercial(rhrd_t *d, long cwyear, long cweek, long cwday) {
416
+ int rhrd__valid_commercial(rhrd_t *d, long cwyear, long cweek, long cwday, int overlimit_raise) {
560
417
  rhrd_t n;
561
418
  memset(&n, 0, sizeof(rhrd_t));
562
419
 
@@ -586,6 +443,9 @@ int rhrd__valid_commercial(rhrd_t *d, long cwyear, long cweek, long cwday) {
586
443
  }
587
444
 
588
445
  if ((n.jd > RHR_JD_MAX) || (n.jd < RHR_JD_MIN)) {
446
+ if (overlimit_raise == RHR_OVERLIMIT_RAISE) {
447
+ rb_raise(rb_eRangeError, "date out of range");
448
+ }
589
449
  return 0;
590
450
  }
591
451
 
@@ -608,7 +468,7 @@ long rhrd__ordinal_day(long year, unsigned char month, unsigned char day) {
608
468
  * given ordinal day fields, if they are valid. Returns
609
469
  * 1 if the date is valid, 0 if not. This also handles
610
470
  * wrap around for a negative yday argument. */
611
- int rhrd__valid_ordinal(rhrd_t *d, long year, long yday) {
471
+ int rhrd__valid_ordinal(rhrd_t *d, long year, long yday, int overlimit_raise) {
612
472
  int leap;
613
473
  long month, day;
614
474
 
@@ -636,6 +496,9 @@ int rhrd__valid_ordinal(rhrd_t *d, long year, long yday) {
636
496
  }
637
497
 
638
498
  if(!rhrd__valid_civil_limits(year, month, day)) {
499
+ if (overlimit_raise == RHR_OVERLIMIT_RAISE) {
500
+ rb_raise(rb_eRangeError, "date out of range");
501
+ }
639
502
  return 0;
640
503
  }
641
504
 
@@ -778,7 +641,7 @@ int rhrd__fill_from_hash(rhrd_t *d, VALUE hash) {
778
641
  d->jd = rhrd__yday1_jd(year);
779
642
  d->flags |= RHR_HAVE_JD;
780
643
  rhrd__fill_commercial(d);
781
- if(!rhrd__valid_commercial(d, d->year, 1, NUM2LONG(rwday))) {
644
+ if(!rhrd__valid_commercial(d, d->year, 1, NUM2LONG(rwday), RHR_NO_RAISE)) {
782
645
  return 1;
783
646
  }
784
647
  d->flags &= ~RHR_HAVE_CIVIL;
@@ -835,15 +698,17 @@ int rhrd__fill_from_hash(rhrd_t *d, VALUE hash) {
835
698
  } else {
836
699
  return -1;
837
700
  }
838
- if (yday && rhrd__valid_ordinal(d, year, yday)) {
701
+
702
+ if (yday && rhrd__valid_ordinal(d, year, yday, RHR_OVERLIMIT_RAISE)) {
839
703
  return 0;
840
- } else if (cweek && cwday && rhrd__valid_commercial(d, cwyear, cweek, cwday)) {
704
+ }
705
+ if (cweek && cwday && rhrd__valid_commercial(d, cwyear, cweek, cwday, RHR_OVERLIMIT_RAISE)) {
841
706
  return 0;
842
- } else if (!rhrd__valid_civil(d, year, month, day)) {
843
- return 1;
844
707
  }
845
-
846
- return 0;
708
+ if (rhrd__valid_civil(d, year, month, day, RHR_OVERLIMIT_RAISE)) {
709
+ return 0;
710
+ }
711
+ return 1;
847
712
  }
848
713
 
849
714
  /* Returns a new ruby object filled with information from
@@ -851,7 +716,7 @@ int rhrd__fill_from_hash(rhrd_t *d, VALUE hash) {
851
716
  * did not contain valid date information. */
852
717
  VALUE rhrd__from_hash(VALUE hash) {
853
718
  rhrd_t *d;
854
- VALUE rd = Data_Make_Struct(rhrd_class, rhrd_t, NULL, free, d);
719
+ VALUE rd = Data_Make_Struct(rhrd_class, rhrd_t, NULL, -1, d);
855
720
  if(rhrd__fill_from_hash(d, hash)) {
856
721
  rb_raise(rb_eArgError, "invalid date");
857
722
  } else {
@@ -1071,6 +936,7 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
1071
936
  long wnum1 = 0;
1072
937
  long i;
1073
938
  long fmt_pos;
939
+ int year_only4 = 0;
1074
940
  int scan_len;
1075
941
  VALUE zone = Qnil;
1076
942
  VALUE hash;
@@ -1180,7 +1046,16 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
1180
1046
  state |= RHRR_CWYEAR_SET | RHRR_CENTURY_SET;
1181
1047
  break;
1182
1048
  case 'G':
1183
- if (sscanf(str + pos, "%ld%n", &cwyear, &scan_len) != 1) {
1049
+ #define RHR_PARSE_year_only4 year_only4 = 0;\
1050
+ if (fmt_pos + 1 < fmt_len) {\
1051
+ if(isdigit(fmt_str[fmt_pos + 1])) {\
1052
+ year_only4 = 1;\
1053
+ } else if ((fmt_pos + 2 < fmt_len) && (fmt_str[fmt_pos + 1] == '%') && strchr(rhrd__strptime_num_patterns, fmt_str[fmt_pos + 2])) {\
1054
+ year_only4 = 1;\
1055
+ }\
1056
+ }
1057
+ RHR_PARSE_year_only4
1058
+ if (sscanf(str + pos, year_only4 ? "%4ld%n" : "%ld%n", &cwyear, &scan_len) != 1) {
1184
1059
  return Qnil;
1185
1060
  }
1186
1061
  state |= RHRR_CWYEAR_SET + RHRR_CENTURY_SET;
@@ -1365,10 +1240,11 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
1365
1240
  RHR_PARSE_y
1366
1241
  break;
1367
1242
  case 'Y':
1368
- #define RHR_PARSE_Y if (sscanf(str + pos, "%ld%n", &year, &scan_len) != 1) {\
1243
+ #define RHR_PARSE_Y if (sscanf(str + pos, year_only4 ? "%4ld%n" : "%ld%n", &year, &scan_len) != 1) {\
1369
1244
  return Qnil;\
1370
1245
  }\
1371
1246
  state |= RHRR_YEAR_SET + RHRR_CENTURY_SET;
1247
+ RHR_PARSE_year_only4
1372
1248
  RHR_PARSE_Y
1373
1249
  break;
1374
1250
  case 'z':
@@ -1402,6 +1278,7 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
1402
1278
  RHR_PARSE_sep(':')
1403
1279
  RHR_PARSE_S
1404
1280
  RHR_PARSE_sep(' ')
1281
+ RHR_PARSE_year_only4
1405
1282
  RHR_PARSE_Y
1406
1283
  break;
1407
1284
  case 'x':
@@ -1446,6 +1323,7 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
1446
1323
  RHR_PARSE_sep('-')
1447
1324
  RHR_PARSE_b
1448
1325
  RHR_PARSE_sep('-')
1326
+ RHR_PARSE_year_only4
1449
1327
  RHR_PARSE_Y
1450
1328
  break;
1451
1329
  case '+':
@@ -1463,6 +1341,7 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
1463
1341
  RHR_PARSE_sep(' ')
1464
1342
  RHR_PARSE_Z
1465
1343
  RHR_PARSE_sep(' ')
1344
+ RHR_PARSE_year_only4
1466
1345
  RHR_PARSE_Y
1467
1346
  break;
1468
1347
  default:
@@ -1569,8 +1448,6 @@ void rhrd__set_cw_ivs(VALUE self, rhrd_t *d) {
1569
1448
  rb_ivar_set(self, rhrd_id_cwday, LONG2NUM(d->day));
1570
1449
  }
1571
1450
 
1572
- #include "date_parser.c"
1573
-
1574
1451
  /* Ruby class methods */
1575
1452
 
1576
1453
  /* call-seq:
@@ -1587,7 +1464,7 @@ static VALUE rhrd_s__load(VALUE klass, VALUE string) {
1587
1464
  rhrd_t * d;
1588
1465
  VALUE jd, rd;
1589
1466
  jd = rb_marshal_load(string);
1590
- rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
1467
+ rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
1591
1468
  d->jd = NUM2LONG(jd);
1592
1469
  RHR_CHECK_JD(d)
1593
1470
  d->flags = RHR_HAVE_JD;
@@ -1648,7 +1525,7 @@ static VALUE rhrd_s_civil(int argc, VALUE *argv, VALUE klass) {
1648
1525
  long year;
1649
1526
  long month = 1;
1650
1527
  long day = 1;
1651
- VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
1528
+ VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
1652
1529
 
1653
1530
  switch(argc) {
1654
1531
  case 3:
@@ -1667,8 +1544,7 @@ static VALUE rhrd_s_civil(int argc, VALUE *argv, VALUE klass) {
1667
1544
  break;
1668
1545
  }
1669
1546
 
1670
- if (!rhrd__valid_civil(d, year, month, day)) {
1671
- RHR_CHECK_CIVIL(d)
1547
+ if (!rhrd__valid_civil(d, year, month, day, RHR_OVERLIMIT_RAISE)) {
1672
1548
  rb_raise(rb_eArgError, "invalid date (year: %li, month: %li, day: %li)", year, month, day);
1673
1549
  }
1674
1550
  return rd;
@@ -1693,7 +1569,7 @@ static VALUE rhrd_s_commercial(int argc, VALUE *argv, VALUE klass) {
1693
1569
  long cwyear = RHR_DEFAULT_CWYEAR;
1694
1570
  long cweek = RHR_DEFAULT_CWEEK;
1695
1571
  long cwday = RHR_DEFAULT_CWDAY;
1696
- VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
1572
+ VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
1697
1573
 
1698
1574
  switch(argc) {
1699
1575
  case 3:
@@ -1717,8 +1593,7 @@ static VALUE rhrd_s_commercial(int argc, VALUE *argv, VALUE klass) {
1717
1593
  break;
1718
1594
  }
1719
1595
 
1720
- if(!rhrd__valid_commercial(d, cwyear, cweek, cwday)) {
1721
- RHR_CHECK_JD(d)
1596
+ if(!rhrd__valid_commercial(d, cwyear, cweek, cwday, RHR_OVERLIMIT_RAISE)) {
1722
1597
  rb_raise(rb_eArgError, "invalid date (cwyear: %li, cweek: %li, cwday: %li)", cwyear, cweek, cwday);
1723
1598
  }
1724
1599
  return rd;
@@ -1742,7 +1617,7 @@ static VALUE rhrd_s_gregorian_leap_q(VALUE klass, VALUE year) {
1742
1617
  */
1743
1618
  static VALUE rhrd_s_jd (int argc, VALUE *argv, VALUE klass) {
1744
1619
  rhrd_t *d;
1745
- VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
1620
+ VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
1746
1621
 
1747
1622
  switch(argc) {
1748
1623
  case 0:
@@ -1779,7 +1654,7 @@ static VALUE rhrd_s_julian_leap_q(VALUE klass, VALUE y) {
1779
1654
  */
1780
1655
  static VALUE rhrd_s_new_b(int argc, VALUE *argv, VALUE klass) {
1781
1656
  rhrd_t *d;
1782
- VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
1657
+ VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
1783
1658
 
1784
1659
  switch(argc) {
1785
1660
  case 0:
@@ -1812,7 +1687,7 @@ static VALUE rhrd_s_ordinal(int argc, VALUE *argv, VALUE klass) {
1812
1687
  long year;
1813
1688
  long day = 1;
1814
1689
  rhrd_t *d;
1815
- VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
1690
+ VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
1816
1691
 
1817
1692
  switch(argc) {
1818
1693
  case 2:
@@ -1820,8 +1695,7 @@ static VALUE rhrd_s_ordinal(int argc, VALUE *argv, VALUE klass) {
1820
1695
  day = NUM2LONG(argv[1]);
1821
1696
  case 1:
1822
1697
  year = NUM2LONG(argv[0]);
1823
- if(!rhrd__valid_ordinal(d, year, day)) {
1824
- RHR_CHECK_JD(d)
1698
+ if(!rhrd__valid_ordinal(d, year, day, RHR_OVERLIMIT_RAISE)) {
1825
1699
  rb_raise(rb_eArgError, "invalid date (year: %li, yday: %li)", year, day);
1826
1700
  }
1827
1701
  break;
@@ -1854,7 +1728,7 @@ static VALUE rhrd_s_parse(int argc, VALUE *argv, VALUE klass) {
1854
1728
 
1855
1729
  switch(argc) {
1856
1730
  case 0:
1857
- rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
1731
+ rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
1858
1732
  d->flags = RHR_HAVE_JD;
1859
1733
  return rd;
1860
1734
  case 1:
@@ -1885,7 +1759,7 @@ static VALUE rhrd_s_strptime(int argc, VALUE *argv, VALUE klass) {
1885
1759
 
1886
1760
  switch(argc) {
1887
1761
  case 0:
1888
- rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
1762
+ rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
1889
1763
  d->flags = RHR_HAVE_JD;
1890
1764
  return rd;
1891
1765
  case 1:
@@ -1914,7 +1788,7 @@ static VALUE rhrd_s_strptime(int argc, VALUE *argv, VALUE klass) {
1914
1788
  */
1915
1789
  static VALUE rhrd_s_today(int argc, VALUE *argv, VALUE klass) {
1916
1790
  rhrd_t *d;
1917
- VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
1791
+ VALUE rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
1918
1792
 
1919
1793
  switch(argc) {
1920
1794
  case 0:
@@ -1948,7 +1822,7 @@ static VALUE rhrd_s_valid_civil_q(int argc, VALUE *argv, VALUE klass) {
1948
1822
  switch(argc) {
1949
1823
  case 3:
1950
1824
  case 4:
1951
- if (!rhrd__valid_civil(&d, NUM2LONG(argv[0]), NUM2LONG(argv[1]), NUM2LONG(argv[2]))) {
1825
+ if (!rhrd__valid_civil(&d, NUM2LONG(argv[0]), NUM2LONG(argv[1]), NUM2LONG(argv[2]), RHR_NO_RAISE)) {
1952
1826
  #ifdef RUBY19
1953
1827
  return Qfalse;
1954
1828
  #else
@@ -1988,7 +1862,7 @@ static VALUE rhrd_s_valid_commercial_q(int argc, VALUE *argv, VALUE klass) {
1988
1862
  switch(argc) {
1989
1863
  case 3:
1990
1864
  case 4:
1991
- if (!rhrd__valid_commercial(&d, NUM2LONG(argv[0]), NUM2LONG(argv[1]), NUM2LONG(argv[2]))) {
1865
+ if (!rhrd__valid_commercial(&d, NUM2LONG(argv[0]), NUM2LONG(argv[1]), NUM2LONG(argv[2]), RHR_NO_RAISE)) {
1992
1866
  #ifdef RUBY19
1993
1867
  return Qfalse;
1994
1868
  #else
@@ -2052,7 +1926,7 @@ static VALUE rhrd_s_valid_ordinal_q(int argc, VALUE *argv, VALUE klass) {
2052
1926
  switch(argc) {
2053
1927
  case 2:
2054
1928
  case 3:
2055
- if (!rhrd__valid_ordinal(&d, NUM2LONG(argv[0]), NUM2LONG(argv[1]))) {
1929
+ if (!rhrd__valid_ordinal(&d, NUM2LONG(argv[0]), NUM2LONG(argv[1]), RHR_NO_RAISE)) {
2056
1930
  #ifdef RUBY19
2057
1931
  return Qfalse;
2058
1932
  #else
@@ -2087,7 +1961,7 @@ static VALUE rhrd_s_valid_ordinal_q(int argc, VALUE *argv, VALUE klass) {
2087
1961
  *
2088
1962
  * On ruby 1.9, this method is private.
2089
1963
  */
2090
- static VALUE rhrd_s_zone_to_diff(VALUE klass, VALUE str) {
1964
+ VALUE rhrd_s_zone_to_diff(VALUE klass, VALUE str) {
2091
1965
  long offset = 0;
2092
1966
  long len, i, j;
2093
1967
  char *s;
@@ -2125,8 +1999,8 @@ static VALUE rhrd_s_zone_to_diff(VALUE klass, VALUE str) {
2125
1999
  if((s[i] == ',') || (s[i] == '.')) {
2126
2000
  v = rb_funcall(str, rhrd_id_split, 1, rhrd_re_comma_period);
2127
2001
  e = rb_ary_entry(v, 1);
2128
- return LONG2NUM((NUM2LONG(rb_funcall(rb_ary_entry(v, 0), rhrd_id_to_i, 0)) * RHR_SECONDS_PER_HOUR)
2129
- + (NUM2LONG(rb_funcall(e, rhrd_id_to_i, 0)) * RHR_SECONDS_PER_HOUR) / (long)pow(10, RSTRING_LEN(rb_str_to_str(e))) * offset);
2002
+ return LONG2NUM(((NUM2LONG(rb_funcall(rb_ary_entry(v, 0), rhrd_id_to_i, 0)) * RHR_SECONDS_PER_HOUR)
2003
+ + ((NUM2LONG(rb_funcall(e, rhrd_id_to_i, 0)) * RHR_SECONDS_PER_HOUR) / (long)pow(10, RSTRING_LEN(rb_str_to_str(e))))) * offset);
2130
2004
  }
2131
2005
  }
2132
2006
  switch (len) {
@@ -2574,24 +2448,33 @@ static VALUE rhrd_step(int argc, VALUE *argv, VALUE self) {
2574
2448
  rhrd_t *d, *n, *newd;
2575
2449
  rhrdt_t *ndt;
2576
2450
  long step, limit, current;
2577
- VALUE rlimit, new;
2451
+ VALUE rlimit, new, rstep;
2578
2452
  Data_Get_Struct(self, rhrd_t, d);
2579
2453
  RHR_FILL_JD(d)
2580
2454
 
2581
- rb_need_block();
2582
2455
  switch(argc) {
2583
2456
  case 1:
2584
2457
  step = 1;
2458
+ rstep = LONG2NUM(step);
2585
2459
  break;
2586
2460
  case 2:
2587
- step = NUM2LONG(argv[1]);
2461
+ rstep = argv[1];
2462
+ step = NUM2LONG(rstep);
2588
2463
  break;
2589
2464
  default:
2590
2465
  rb_raise(rb_eArgError, "wrong number of arguments: %i for 2", argc);
2591
2466
  break;
2592
2467
  }
2593
-
2594
2468
  rlimit = argv[0];
2469
+
2470
+ #ifdef RUBY19
2471
+ if (!rb_block_given_p()) {
2472
+ return rb_funcall(self, rhrd_id_to_enum, 3, rhrd_sym_step, rlimit, rstep);
2473
+ }
2474
+ #else
2475
+ rb_need_block();
2476
+ #endif
2477
+
2595
2478
  if (RTEST(rb_obj_is_kind_of(rlimit, rb_cNumeric))) {
2596
2479
  limit = NUM2LONG(rlimit);
2597
2480
  } else if (RTEST((rb_obj_is_kind_of(rlimit, rhrdt_class)))) {
@@ -2610,7 +2493,7 @@ static VALUE rhrd_step(int argc, VALUE *argv, VALUE self) {
2610
2493
  if (limit > current) {
2611
2494
  if (step > 0) {
2612
2495
  while(limit >= current) {
2613
- new = Data_Make_Struct(rhrd_class, rhrd_t, NULL, free, newd);
2496
+ new = Data_Make_Struct(rhrd_class, rhrd_t, NULL, -1, newd);
2614
2497
  newd->jd = current;
2615
2498
  RHR_CHECK_JD(newd)
2616
2499
  newd->flags = RHR_HAVE_JD;
@@ -2621,7 +2504,7 @@ static VALUE rhrd_step(int argc, VALUE *argv, VALUE self) {
2621
2504
  } else if (limit < current) {
2622
2505
  if (step < 0) {
2623
2506
  while(limit <= current) {
2624
- new = Data_Make_Struct(rhrd_class, rhrd_t, NULL, free, newd);
2507
+ new = Data_Make_Struct(rhrd_class, rhrd_t, NULL, -1, newd);
2625
2508
  newd->jd = current;
2626
2509
  RHR_CHECK_JD(newd)
2627
2510
  newd->flags = RHR_HAVE_JD;
@@ -3006,7 +2889,7 @@ VALUE rhrd__add_years(VALUE self, long n) {
3006
2889
  VALUE new;
3007
2890
  Data_Get_Struct(self, rhrd_t, d);
3008
2891
 
3009
- new = Data_Make_Struct(rhrd_class, rhrd_t, NULL, free, newd);
2892
+ new = Data_Make_Struct(rhrd_class, rhrd_t, NULL, -1, newd);
3010
2893
  RHR_FILL_CIVIL(d)
3011
2894
  newd->year = rhrd__safe_add_long(n, d->year);
3012
2895
  newd->month = d->month;
@@ -3054,7 +2937,7 @@ static VALUE rhrd_s_httpdate(int argc, VALUE *argv, VALUE klass) {
3054
2937
 
3055
2938
  switch(argc) {
3056
2939
  case 0:
3057
- rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
2940
+ rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
3058
2941
  d->flags = RHR_HAVE_JD;
3059
2942
  return rd;
3060
2943
  case 1:
@@ -3088,7 +2971,7 @@ static VALUE rhrd_s_iso8601(int argc, VALUE *argv, VALUE klass) {
3088
2971
 
3089
2972
  switch(argc) {
3090
2973
  case 0:
3091
- rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
2974
+ rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
3092
2975
  d->flags = RHR_HAVE_JD;
3093
2976
  return rd;
3094
2977
  case 1:
@@ -3122,7 +3005,7 @@ static VALUE rhrd_s_jisx0301(int argc, VALUE *argv, VALUE klass) {
3122
3005
 
3123
3006
  switch(argc) {
3124
3007
  case 0:
3125
- rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
3008
+ rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
3126
3009
  d->flags = RHR_HAVE_JD;
3127
3010
  return rd;
3128
3011
  case 1:
@@ -3156,7 +3039,7 @@ static VALUE rhrd_s_rfc2822(int argc, VALUE *argv, VALUE klass) {
3156
3039
 
3157
3040
  switch(argc) {
3158
3041
  case 0:
3159
- rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
3042
+ rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
3160
3043
  d->flags = RHR_HAVE_JD;
3161
3044
  return rd;
3162
3045
  case 1:
@@ -3190,7 +3073,7 @@ static VALUE rhrd_s_rfc3339(int argc, VALUE *argv, VALUE klass) {
3190
3073
 
3191
3074
  switch(argc) {
3192
3075
  case 0:
3193
- rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
3076
+ rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
3194
3077
  d->flags = RHR_HAVE_JD;
3195
3078
  return rd;
3196
3079
  case 1:
@@ -3224,7 +3107,7 @@ static VALUE rhrd_s_xmlschema(int argc, VALUE *argv, VALUE klass) {
3224
3107
 
3225
3108
  switch(argc) {
3226
3109
  case 0:
3227
- rd = Data_Make_Struct(klass, rhrd_t, NULL, free, d);
3110
+ rd = Data_Make_Struct(klass, rhrd_t, NULL, -1, d);
3228
3111
  d->flags = RHR_HAVE_JD;
3229
3112
  return rd;
3230
3113
  case 1:
@@ -3560,7 +3443,7 @@ static VALUE rhrd_rfc3339(VALUE self) {
3560
3443
  static VALUE rhrd_to_datetime(VALUE self) {
3561
3444
  rhrd_t *d;
3562
3445
  rhrdt_t *dt;
3563
- VALUE rdt = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL, free, dt);
3446
+ VALUE rdt = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL, -1, dt);
3564
3447
  Data_Get_Struct(self, rhrd_t, d);
3565
3448
 
3566
3449
  if (RHR_HAS_CIVIL(d)) {
@@ -3607,7 +3490,7 @@ static VALUE rhrd_to_time(VALUE self) {
3607
3490
  static VALUE rhrd_time_to_date(VALUE self) {
3608
3491
  rhrd_t *d;
3609
3492
  VALUE rd;
3610
- rd = Data_Make_Struct(rhrd_class, rhrd_t, NULL, free, d);
3493
+ rd = Data_Make_Struct(rhrd_class, rhrd_t, NULL, -1, d);
3611
3494
  d->jd = rhrd__unix_to_jd(NUM2LONG(rb_funcall(self, rhrd_id_to_i, 0)) + NUM2LONG(rb_funcall(self, rhrd_id_utc_offset, 0)));
3612
3495
  d->flags = RHR_HAVE_JD;
3613
3496
  RHR_CHECK_JD(d)
@@ -4059,8 +3942,6 @@ static VALUE rhrd_s_valid_time_q(VALUE klass, VALUE rh, VALUE rm, VALUE rs) {
4059
3942
 
4060
3943
  #endif
4061
3944
 
4062
- #include "datetime.c"
4063
-
4064
3945
  /* Ruby Library Initialization */
4065
3946
 
4066
3947
  /* +Date+ is used to store a single date in the gregorian calendar.
@@ -4096,6 +3977,7 @@ void Init_date_ext(void) {
4096
3977
  rhrd_id_slice = rb_intern("slice");
4097
3978
  rhrd_id_split = rb_intern("split");
4098
3979
  rhrd_id_sub_b = rb_intern("sub!");
3980
+ rhrd_id_to_enum = rb_intern("to_enum");
4099
3981
  rhrd_id_to_i = rb_intern("to_i");
4100
3982
  #ifdef RUBY19
4101
3983
  rhrd_id_nsec = rb_intern("nsec");
@@ -4128,6 +4010,7 @@ void Init_date_ext(void) {
4128
4010
  rhrd_sym_sec = ID2SYM(rb_intern("sec"));
4129
4011
  rhrd_sym_sec_fraction = ID2SYM(rb_intern("sec_fraction"));
4130
4012
  rhrd_sym_seconds = ID2SYM(rb_intern("seconds"));
4013
+ rhrd_sym_step = ID2SYM(rb_intern("step"));
4131
4014
  rhrd_sym_wday = ID2SYM(rb_intern("wday"));
4132
4015
  rhrd_sym_wnum0 = ID2SYM(rb_intern("wnum0"));
4133
4016
  rhrd_sym_wnum1 = ID2SYM(rb_intern("wnum1"));
@@ -4135,6 +4018,10 @@ void Init_date_ext(void) {
4135
4018
  rhrd_sym_year = ID2SYM(rb_intern("year"));
4136
4019
  rhrd_sym_zone = ID2SYM(rb_intern("zone"));
4137
4020
 
4021
+ #ifdef RHR_ENCODING
4022
+ rhrd_encoding_index = rb_enc_to_index(rb_usascii_encoding());
4023
+ #endif
4024
+
4138
4025
  /* Define classes*/
4139
4026
 
4140
4027
  rhrd_class = rb_define_class("Date", rb_cObject);