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,146 +1,5 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
             
     | 
| 
       2 
     | 
    
         
            -
            #include  
     | 
| 
       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  
     | 
| 
       268 
     | 
    
         
            -
             * the allowed limits,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
      
 701 
     | 
    
         
            +
             
     | 
| 
      
 702 
     | 
    
         
            +
              if (yday && rhrd__valid_ordinal(d, year, yday, RHR_OVERLIMIT_RAISE)) {
         
     | 
| 
       839 
703 
     | 
    
         
             
                return 0;
         
     | 
| 
       840 
     | 
    
         
            -
              } 
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
      
 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,  
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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 
     | 
    
         
            -
             
     | 
| 
      
 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 
     | 
    
         
            -
                   
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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,  
     | 
| 
      
 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);
         
     |