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