home_run 0.9.1-x86-mswin32-60 → 0.9.2-x86-mswin32-60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGELOG +8 -0
- data/README.rdoc +3 -7
- data/ext/date_ext/date_ext.c +65 -61
- data/ext/date_ext/date_ext.h +1 -2
- data/ext/date_ext/date_parser.c +59 -55
- data/ext/date_ext/date_parser.rl +12 -8
- data/ext/date_ext/datetime.c +90 -74
- data/ext/date_ext/extconf.rb +2 -0
- data/lib/1.8/date_ext.so +0 -0
- data/lib/1.9/date_ext.so +0 -0
- data/spec/datetime/accessor_spec.rb +13 -4
- data/spec/datetime/parse_spec.rb +10 -1
- metadata +4 -4
data/ext/date_ext/datetime.c
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
#include "date_ext.h"
|
2
2
|
|
3
|
+
#ifdef RHR_ENCODING
|
4
|
+
extern int rhrd_encoding_index;
|
5
|
+
#endif
|
6
|
+
|
3
7
|
extern const unsigned char rhrd_days_in_month[];
|
4
8
|
extern const long rhrd_cumulative_days_in_month[];
|
5
9
|
extern const unsigned char rhrd_yday_to_month[];
|
@@ -115,7 +119,7 @@ void rhrdt__set_offset(rhrdt_t *dt, double offset) {
|
|
115
119
|
long offset_min;
|
116
120
|
offset_min = lround(offset * 1440);
|
117
121
|
rhrdt__check_offset(offset_min);
|
118
|
-
dt->offset = offset_min;
|
122
|
+
dt->offset = (short)offset_min;
|
119
123
|
}
|
120
124
|
|
121
125
|
/* Check if the time information consistutes a valid time. If not, raise an
|
@@ -138,16 +142,16 @@ void rhrdt__set_time(rhrdt_t *dt, long h, long m, long s, double offset) {
|
|
138
142
|
if (h == 24 && m == 0 && s == 0) {
|
139
143
|
RHRDT_FILL_JD(dt)
|
140
144
|
dt->jd++;
|
141
|
-
dt->flags &= ~RHR_HAVE_CIVIL;
|
145
|
+
dt->flags &= (unsigned char)~RHR_HAVE_CIVIL;
|
142
146
|
h = 0;
|
143
147
|
} else if (h < 0 || m < 0 || s < 0 || h > 23 || m > 59 || s > 59) {
|
144
148
|
rb_raise(rb_eArgError, "invalid time: %ld hours, %ld minutes, %ld seconds", h, m, s);
|
145
149
|
}
|
146
150
|
rhrdt__set_offset(dt, offset);
|
147
151
|
|
148
|
-
dt->hour = h;
|
149
|
-
dt->minute = m;
|
150
|
-
dt->second = s;
|
152
|
+
dt->hour = (unsigned char)h;
|
153
|
+
dt->minute = (unsigned char)m;
|
154
|
+
dt->second = (unsigned char)s;
|
151
155
|
dt->flags |= RHR_HAVE_HMS;
|
152
156
|
}
|
153
157
|
|
@@ -166,12 +170,12 @@ void rhrdt__jd_to_civil(rhrdt_t *date) {
|
|
166
170
|
c = (long)floor((b - 122.1) / 365.25);
|
167
171
|
d = (long)floor(365.25 * c);
|
168
172
|
e = (long)floor((b - d) / 30.6001);
|
169
|
-
date->day = b - d - (long)floor(30.6001 * e);
|
173
|
+
date->day = (unsigned char)(b - d - (long)floor(30.6001 * e));
|
170
174
|
if (e <= 13) {
|
171
|
-
date->month = e - 1;
|
175
|
+
date->month = (unsigned char)(e - 1);
|
172
176
|
date->year = c - 4716;
|
173
177
|
} else {
|
174
|
-
date->month = e - 13;
|
178
|
+
date->month = (unsigned char)(e - 13);
|
175
179
|
date->year = c - 4715;
|
176
180
|
}
|
177
181
|
date->flags |= RHR_HAVE_CIVIL;
|
@@ -182,10 +186,10 @@ void rhrdt__jd_to_civil(rhrdt_t *date) {
|
|
182
186
|
* nanos field has already been filled in. */
|
183
187
|
void rhrdt__nanos_to_hms(rhrdt_t *d) {
|
184
188
|
unsigned int seconds;
|
185
|
-
seconds = d->nanos/RHR_NANOS_PER_SECOND;
|
186
|
-
d->hour = seconds/RHR_SECONDS_PER_HOUR;
|
187
|
-
d->minute = (seconds % RHR_SECONDS_PER_HOUR)/60;
|
188
|
-
d->second = seconds % 60;
|
189
|
+
seconds = (unsigned int)(d->nanos/RHR_NANOS_PER_SECOND);
|
190
|
+
d->hour = (unsigned char)(seconds/RHR_SECONDS_PER_HOUR);
|
191
|
+
d->minute = (unsigned char)((seconds % RHR_SECONDS_PER_HOUR)/60);
|
192
|
+
d->second = (unsigned char)(seconds % 60);
|
189
193
|
d->flags |= RHR_HAVE_HMS;
|
190
194
|
}
|
191
195
|
|
@@ -286,13 +290,13 @@ void rhrdt__now(rhrdt_t * dt) {
|
|
286
290
|
rt = rb_funcall(rb_cTime, rhrd_id_now, 0);
|
287
291
|
offset = NUM2LONG(rb_funcall(rt, rhrd_id_utc_offset, 0));
|
288
292
|
t = NUM2LONG(rb_funcall(rt, rhrd_id_to_i, 0)) + offset;
|
289
|
-
dt->jd = rhrd__unix_to_jd(t);
|
293
|
+
dt->jd = rhrd__unix_to_jd((long long)t);
|
290
294
|
#ifdef RUBY19
|
291
295
|
dt->nanos = rhrd__mod(t, RHR_SECONDS_PER_DAY) * RHR_NANOS_PER_SECOND + NUM2LONG(rb_funcall(rt, rhrd_id_nsec, 0));
|
292
296
|
#else
|
293
297
|
dt->nanos = rhrd__mod(t, RHR_SECONDS_PER_DAY) * RHR_NANOS_PER_SECOND + NUM2LONG(rb_funcall(rt, rhrd_id_usec, 0)) * 1000;
|
294
298
|
#endif
|
295
|
-
dt->offset = offset/60;
|
299
|
+
dt->offset = (short)(offset/60);
|
296
300
|
dt->flags |= RHR_HAVE_JD | RHR_HAVE_NANOS;
|
297
301
|
RHR_CHECK_JD(dt);
|
298
302
|
}
|
@@ -310,11 +314,11 @@ VALUE rhrdt__from_jd_nanos(long jd, long long nanos, short offset) {
|
|
310
314
|
new = Data_Make_Struct(rhrdt_class, rhrdt_t, NULL, -1, dt);
|
311
315
|
|
312
316
|
if (nanos < 0) {
|
313
|
-
t = nanos/RHR_NANOS_PER_DAY - 1;
|
317
|
+
t = (long)(nanos/RHR_NANOS_PER_DAY - 1);
|
314
318
|
nanos -= t * RHR_NANOS_PER_DAY;
|
315
319
|
jd += t;
|
316
320
|
} else if (nanos >= RHR_NANOS_PER_DAY) {
|
317
|
-
t = nanos/RHR_NANOS_PER_DAY;
|
321
|
+
t = (long)(nanos/RHR_NANOS_PER_DAY);
|
318
322
|
nanos -= t * RHR_NANOS_PER_DAY;
|
319
323
|
jd += t;
|
320
324
|
}
|
@@ -357,7 +361,7 @@ VALUE rhrdt__add_days(VALUE self, double n) {
|
|
357
361
|
Data_Get_Struct(self, rhrdt_t, dt);
|
358
362
|
RHRDT_FILL_JD(dt)
|
359
363
|
RHRDT_FILL_NANOS(dt)
|
360
|
-
l = floor(n);
|
364
|
+
l = (long)floor(n);
|
361
365
|
nanos = llround((n - l) * RHR_NANOS_PER_DAY);
|
362
366
|
return rhrdt__from_jd_nanos(rhrd__safe_add_long(dt->jd, l), dt->nanos + nanos, dt->offset);
|
363
367
|
}
|
@@ -378,13 +382,13 @@ VALUE rhrdt__add_months(VALUE self, long n) {
|
|
378
382
|
n = rhrd__safe_add_long(n, (long)(d->month));
|
379
383
|
if(n > 1 && n <= 12) {
|
380
384
|
newd->year = d->year;
|
381
|
-
newd->month = n;
|
385
|
+
newd->month = (unsigned char)n;
|
382
386
|
} else {
|
383
387
|
x = n / 12;
|
384
388
|
n = n % 12;
|
385
389
|
if (n <= 0) {
|
386
390
|
newd->year = d->year + x - 1;
|
387
|
-
newd->month = n + 12;
|
391
|
+
newd->month = (unsigned char)(n + 12);
|
388
392
|
} else {
|
389
393
|
newd->year = d->year + x;
|
390
394
|
newd->month = (unsigned char)n;
|
@@ -393,7 +397,7 @@ VALUE rhrdt__add_months(VALUE self, long n) {
|
|
393
397
|
x = rhrd__days_in_month(newd->year, newd->month);
|
394
398
|
newd->day = (unsigned char)(d->day > x ? x : d->day);
|
395
399
|
RHR_CHECK_CIVIL(newd)
|
396
|
-
newd->flags &= ~RHR_HAVE_JD;
|
400
|
+
newd->flags &= (unsigned char)~RHR_HAVE_JD;
|
397
401
|
return new;
|
398
402
|
}
|
399
403
|
|
@@ -430,9 +434,9 @@ void rhrdt__fill_from_hash(rhrdt_t *dt, VALUE hash) {
|
|
430
434
|
dt->jd = rhrd__unix_to_jd(time_set);
|
431
435
|
time_set = rhrd__modll(time_set, RHR_SECONDS_PER_DAY);
|
432
436
|
dt->nanos = time_set*RHR_NANOS_PER_SECOND + nanos;
|
433
|
-
dt->hour = time_set/RHR_SECONDS_PER_HOUR;
|
434
|
-
dt->minute = (time_set - dt->hour * RHR_SECONDS_PER_HOUR)/60;
|
435
|
-
dt->second = rhrd__mod(time_set, 60);
|
437
|
+
dt->hour = (unsigned char)(time_set/RHR_SECONDS_PER_HOUR);
|
438
|
+
dt->minute = (unsigned char)((time_set - dt->hour * RHR_SECONDS_PER_HOUR)/60);
|
439
|
+
dt->second = (unsigned char)rhrd__mod((long)time_set, 60);
|
436
440
|
offset /= 60;
|
437
441
|
rhrdt__check_offset(offset);
|
438
442
|
RHR_CHECK_JD(dt);
|
@@ -505,7 +509,7 @@ VALUE rhrdt__new_offset(VALUE self, double offset) {
|
|
505
509
|
Data_Get_Struct(self, rhrdt_t, dt);
|
506
510
|
RHRDT_FILL_JD(dt)
|
507
511
|
RHRDT_FILL_NANOS(dt)
|
508
|
-
return rhrdt__from_jd_nanos(dt->jd, dt->nanos - (dt->offset - offset_min)*RHR_NANOS_PER_MINUTE, offset_min);
|
512
|
+
return rhrdt__from_jd_nanos(dt->jd, dt->nanos - (dt->offset - offset_min)*RHR_NANOS_PER_MINUTE, (short)offset_min);
|
509
513
|
}
|
510
514
|
|
511
515
|
/* Class methods */
|
@@ -541,7 +545,7 @@ static VALUE rhrdt_s__load(VALUE klass, VALUE string) {
|
|
541
545
|
|
542
546
|
x = NUM2LONG(rb_ary_entry(ary, 2));
|
543
547
|
rhrdt__check_offset(x);
|
544
|
-
d->offset = x;
|
548
|
+
d->offset = (short)x;
|
545
549
|
|
546
550
|
d->flags = RHR_HAVE_JD | RHR_HAVE_NANOS;
|
547
551
|
return rd;
|
@@ -765,9 +769,9 @@ static VALUE rhrdt_s_new_b(int argc, VALUE *argv, VALUE klass) {
|
|
765
769
|
rhrdt__set_offset(dt, offset);
|
766
770
|
case 1:
|
767
771
|
offset += NUM2DBL(argv[0]) + 0.5;
|
768
|
-
dt->jd = offset;
|
772
|
+
dt->jd = (long)offset;
|
769
773
|
RHR_CHECK_JD(dt)
|
770
|
-
dt->nanos = (offset - dt->jd)*RHR_NANOS_PER_DAY;
|
774
|
+
dt->nanos = (long long)((offset - dt->jd)*RHR_NANOS_PER_DAY);
|
771
775
|
dt->flags = RHR_HAVE_JD | RHR_HAVE_NANOS;
|
772
776
|
break;
|
773
777
|
default:
|
@@ -949,7 +953,7 @@ static VALUE rhrdt_ajd(VALUE self) {
|
|
949
953
|
Data_Get_Struct(self, rhrdt_t, d);
|
950
954
|
RHRDT_FILL_JD(d)
|
951
955
|
RHRDT_FILL_NANOS(d)
|
952
|
-
return rb_float_new(d->jd + d->nanos/RHR_NANOS_PER_DAYD - d->offset/1440.0 - 0.5);
|
956
|
+
return rb_float_new(d->jd + (double)d->nanos/RHR_NANOS_PER_DAYD - d->offset/1440.0 - 0.5);
|
953
957
|
}
|
954
958
|
|
955
959
|
/* call-seq:
|
@@ -963,7 +967,7 @@ static VALUE rhrdt_amjd(VALUE self) {
|
|
963
967
|
Data_Get_Struct(self, rhrdt_t, d);
|
964
968
|
RHRDT_FILL_JD(d)
|
965
969
|
RHRDT_FILL_NANOS(d)
|
966
|
-
return rb_float_new(d->jd + d->nanos/RHR_NANOS_PER_DAYD - d->offset/1440.0 - RHR_JD_MJD);
|
970
|
+
return rb_float_new(d->jd + (double)d->nanos/RHR_NANOS_PER_DAYD - d->offset/1440.0 - RHR_JD_MJD);
|
967
971
|
}
|
968
972
|
|
969
973
|
/* call-seq:
|
@@ -984,10 +988,10 @@ static VALUE rhrdt_asctime(VALUE self) {
|
|
984
988
|
RHRDT_FILL_HMS(d)
|
985
989
|
|
986
990
|
s = rb_str_buf_new(128);
|
987
|
-
len = snprintf(RSTRING_PTR(s), 128, "%s %s %
|
991
|
+
len = snprintf(RSTRING_PTR(s), 128, "%s %s %2i %02i:%02i:%02i %04li",
|
988
992
|
rhrd__abbr_day_names[rhrd__jd_to_wday(d->jd)],
|
989
993
|
rhrd__abbr_month_names[d->month],
|
990
|
-
d->day, d->hour, d->minute, d->second,
|
994
|
+
(int)d->day, (int)d->hour, (int)d->minute, (int)d->second,
|
991
995
|
d->year);
|
992
996
|
if (len == -1 || len > 127) {
|
993
997
|
rb_raise(rb_eNoMemError, "in DateTime#asctime (in snprintf)");
|
@@ -1096,7 +1100,7 @@ static VALUE rhrdt_day_fraction(VALUE self) {
|
|
1096
1100
|
rhrdt_t *dt;
|
1097
1101
|
Data_Get_Struct(self, rhrdt_t, dt);
|
1098
1102
|
RHRDT_FILL_NANOS(dt)
|
1099
|
-
return rb_float_new(dt->nanos/RHR_NANOS_PER_DAYD);
|
1103
|
+
return rb_float_new((double)dt->nanos/RHR_NANOS_PER_DAYD);
|
1100
1104
|
}
|
1101
1105
|
|
1102
1106
|
/* call-seq:
|
@@ -1142,8 +1146,8 @@ static VALUE rhrdt_eql_q(VALUE self, VALUE other) {
|
|
1142
1146
|
long diff;
|
1143
1147
|
|
1144
1148
|
if (RTEST(rb_obj_is_kind_of(other, rhrdt_class))) {
|
1145
|
-
self = rhrdt__new_offset(self, 0);
|
1146
|
-
other = rhrdt__new_offset(other, 0);
|
1149
|
+
self = rhrdt__new_offset(self, 0.0);
|
1150
|
+
other = rhrdt__new_offset(other, 0.0);
|
1147
1151
|
Data_Get_Struct(self, rhrdt_t, dt);
|
1148
1152
|
Data_Get_Struct(other, rhrdt_t, odt);
|
1149
1153
|
return rhrdt__spaceship(dt, odt) == 0 ? Qtrue : Qfalse;
|
@@ -1170,8 +1174,9 @@ static VALUE rhrdt_eql_q(VALUE self, VALUE other) {
|
|
1170
1174
|
*/
|
1171
1175
|
static VALUE rhrdt_hash(VALUE self) {
|
1172
1176
|
rhrdt_t *d;
|
1177
|
+
VALUE new = rhrdt__new_offset(self, 0.0);
|
1173
1178
|
RHR_CACHED_IV(self, rhrd_id_hash)
|
1174
|
-
Data_Get_Struct(
|
1179
|
+
Data_Get_Struct(new, rhrdt_t, d);
|
1175
1180
|
return rb_ivar_set(self, rhrd_id_hash, rb_funcall(rb_ary_new3(2, LONG2NUM(d->jd), LL2NUM(d->nanos)), rhrd_id_hash, 0));
|
1176
1181
|
}
|
1177
1182
|
|
@@ -1208,8 +1213,8 @@ static VALUE rhrdt_inspect(VALUE self) {
|
|
1208
1213
|
RHRDT_FILL_HMS(dt)
|
1209
1214
|
|
1210
1215
|
s = rb_str_buf_new(128);
|
1211
|
-
len = snprintf(RSTRING_PTR(s), 128, "#<DateTime %04li-%
|
1212
|
-
dt->year, dt->month, dt->day, dt->hour, dt->minute, dt->second, dt->offset/60, abs(dt->offset % 60));
|
1216
|
+
len = snprintf(RSTRING_PTR(s), 128, "#<DateTime %04li-%02i-%02iT%02i:%02i:%02i%+03i:%02i>",
|
1217
|
+
dt->year, (int)dt->month, (int)dt->day, (int)dt->hour, (int)dt->minute, (int)dt->second, dt->offset/60, abs(dt->offset % 60));
|
1213
1218
|
if (len == -1 || len > 127) {
|
1214
1219
|
rb_raise(rb_eNoMemError, "in DateTime#inspect (in snprintf)");
|
1215
1220
|
}
|
@@ -1357,7 +1362,7 @@ static VALUE rhrdt_new_offset(int argc, VALUE *argv, VALUE self) {
|
|
1357
1362
|
* # => #<DateTime 2009-01-03T12:00:00+00:00>
|
1358
1363
|
*/
|
1359
1364
|
static VALUE rhrdt_next(VALUE self) {
|
1360
|
-
return rhrdt__add_days(self, 1);
|
1365
|
+
return rhrdt__add_days(self, 1.0);
|
1361
1366
|
}
|
1362
1367
|
|
1363
1368
|
/* call-seq:
|
@@ -1395,17 +1400,27 @@ static VALUE rhrdt_sec(VALUE self) {
|
|
1395
1400
|
/* call-seq:
|
1396
1401
|
* sec_fraction() -> Float
|
1397
1402
|
*
|
1398
|
-
*
|
1403
|
+
* On ruby 1.8, returns a +Float+ representing the fraction of the second as a
|
1399
1404
|
* fraction of the day, which will always be in the range [0.0, 1/86400.0).
|
1400
1405
|
*
|
1401
1406
|
* (DateTime.civil(2009, 1, 2, 12, 13, 14) + (1.5/86400)).sec_fraction
|
1402
1407
|
* # => 0.000005787037
|
1408
|
+
*
|
1409
|
+
* On ruby 1.9, returns a +Float+ representing the fraction of the second, which
|
1410
|
+
* will always be in the range [0,1).
|
1411
|
+
*
|
1412
|
+
* (DateTime.civil(2009, 1, 2, 12, 13, 14) + (1.5/86400)).sec_fraction
|
1413
|
+
* # => 0.5
|
1403
1414
|
*/
|
1404
1415
|
static VALUE rhrdt_sec_fraction(VALUE self) {
|
1405
1416
|
rhrdt_t *dt;
|
1406
1417
|
Data_Get_Struct(self, rhrdt_t, dt);
|
1407
1418
|
RHRDT_FILL_NANOS(dt)
|
1408
|
-
|
1419
|
+
#ifdef RUBY19
|
1420
|
+
return rb_float_new((double)(dt->nanos % RHR_NANOS_PER_SECOND)/RHR_NANOS_PER_SECONDD);
|
1421
|
+
#else
|
1422
|
+
return rb_float_new((double)(dt->nanos % RHR_NANOS_PER_SECOND)/RHR_NANOS_PER_DAYD);
|
1423
|
+
#endif
|
1409
1424
|
}
|
1410
1425
|
|
1411
1426
|
/* call-seq:
|
@@ -1438,9 +1453,10 @@ static VALUE rhrdt_step(int argc, VALUE *argv, VALUE self) {
|
|
1438
1453
|
double step, limit;
|
1439
1454
|
long long step_nanos, limit_nanos, current_nanos;
|
1440
1455
|
long step_jd, limit_jd, current_jd;
|
1441
|
-
VALUE rlimit, new, rstep;
|
1456
|
+
VALUE rlimit, new, rstep, new_off;
|
1457
|
+
new_off = rhrdt__new_offset(self, 0.0);
|
1442
1458
|
Data_Get_Struct(self, rhrdt_t, d);
|
1443
|
-
Data_Get_Struct(
|
1459
|
+
Data_Get_Struct(new_off, rhrdt_t, d0);
|
1444
1460
|
|
1445
1461
|
switch(argc) {
|
1446
1462
|
case 1:
|
@@ -1451,7 +1467,7 @@ static VALUE rhrdt_step(int argc, VALUE *argv, VALUE self) {
|
|
1451
1467
|
case 2:
|
1452
1468
|
rstep = argv[1];
|
1453
1469
|
step = NUM2DBL(rstep);
|
1454
|
-
step_jd = floor(step);
|
1470
|
+
step_jd = (long)floor(step);
|
1455
1471
|
step_nanos = llround((step - step_jd)*RHR_NANOS_PER_DAY);
|
1456
1472
|
break;
|
1457
1473
|
default:
|
@@ -1470,10 +1486,10 @@ static VALUE rhrdt_step(int argc, VALUE *argv, VALUE self) {
|
|
1470
1486
|
|
1471
1487
|
if (RTEST(rb_obj_is_kind_of(rlimit, rb_cNumeric))) {
|
1472
1488
|
limit = NUM2DBL(rlimit);
|
1473
|
-
limit_jd = floor(limit);
|
1489
|
+
limit_jd = (long)floor(limit);
|
1474
1490
|
limit_nanos = llround((limit - limit_jd)*RHR_NANOS_PER_DAY);
|
1475
1491
|
} else if (RTEST((rb_obj_is_kind_of(rlimit, rhrdt_class)))) {
|
1476
|
-
rlimit = rhrdt__new_offset(rlimit, 0);
|
1492
|
+
rlimit = rhrdt__new_offset(rlimit, 0.0);
|
1477
1493
|
Data_Get_Struct(rlimit, rhrdt_t, ndt);
|
1478
1494
|
RHRDT_FILL_JD(ndt)
|
1479
1495
|
RHRDT_FILL_NANOS(ndt)
|
@@ -1571,8 +1587,8 @@ static VALUE rhrdt_to_s(VALUE self) {
|
|
1571
1587
|
RHRDT_FILL_HMS(dt)
|
1572
1588
|
|
1573
1589
|
s = rb_str_buf_new(128);
|
1574
|
-
len = snprintf(RSTRING_PTR(s), 128, "%04li-%
|
1575
|
-
dt->year, dt->month, dt->day, dt->hour, dt->minute, dt->second, dt->offset/60, abs(dt->offset % 60));
|
1590
|
+
len = snprintf(RSTRING_PTR(s), 128, "%04li-%02i-%02iT%02i:%02i:%02i%+03i:%02i",
|
1591
|
+
dt->year, (int)dt->month, (int)dt->day, (int)dt->hour, (int)dt->minute, (int)dt->second, dt->offset/60, abs(dt->offset % 60));
|
1576
1592
|
if (len == -1 || len > 127) {
|
1577
1593
|
rb_raise(rb_eNoMemError, "in DateTime#to_s (in snprintf)");
|
1578
1594
|
}
|
@@ -1772,8 +1788,8 @@ static VALUE rhrdt_op_minus(VALUE self, VALUE other) {
|
|
1772
1788
|
return rhrdt__add_days(self, -NUM2DBL(other));
|
1773
1789
|
}
|
1774
1790
|
if (RTEST((rb_obj_is_kind_of(other, rhrdt_class)))) {
|
1775
|
-
self = rhrdt__new_offset(self, 0);
|
1776
|
-
other = rhrdt__new_offset(other, 0);
|
1791
|
+
self = rhrdt__new_offset(self, 0.0);
|
1792
|
+
other = rhrdt__new_offset(other, 0.0);
|
1777
1793
|
Data_Get_Struct(self, rhrdt_t, dt);
|
1778
1794
|
Data_Get_Struct(other, rhrdt_t, newdt);
|
1779
1795
|
RHRDT_FILL_JD(dt)
|
@@ -1781,11 +1797,11 @@ static VALUE rhrdt_op_minus(VALUE self, VALUE other) {
|
|
1781
1797
|
RHRDT_FILL_JD(newdt)
|
1782
1798
|
RHRDT_FILL_NANOS(newdt)
|
1783
1799
|
if (dt->nanos == newdt->nanos) {
|
1784
|
-
return rb_float_new(dt->jd - newdt->jd);
|
1800
|
+
return rb_float_new((double)(dt->jd - newdt->jd));
|
1785
1801
|
} else if (dt->jd == newdt->jd)
|
1786
|
-
return rb_float_new((dt->nanos - newdt->nanos)/RHR_NANOS_PER_DAYD);
|
1802
|
+
return rb_float_new((double)(dt->nanos - newdt->nanos)/RHR_NANOS_PER_DAYD);
|
1787
1803
|
else {
|
1788
|
-
return rb_float_new((dt->jd - newdt->jd) + (dt->nanos - newdt->nanos)/RHR_NANOS_PER_DAYD);
|
1804
|
+
return rb_float_new((dt->jd - newdt->jd) + (double)(dt->nanos - newdt->nanos)/RHR_NANOS_PER_DAYD);
|
1789
1805
|
}
|
1790
1806
|
}
|
1791
1807
|
if (RTEST((rb_obj_is_kind_of(other, rhrd_class)))) {
|
@@ -1794,7 +1810,7 @@ static VALUE rhrdt_op_minus(VALUE self, VALUE other) {
|
|
1794
1810
|
RHRDT_FILL_JD(dt)
|
1795
1811
|
RHRDT_FILL_NANOS(dt)
|
1796
1812
|
RHR_FILL_JD(newd)
|
1797
|
-
return rb_float_new((dt->jd - newd->jd) + dt->nanos/RHR_NANOS_PER_DAYD);
|
1813
|
+
return rb_float_new((dt->jd - newd->jd) + (double)dt->nanos/RHR_NANOS_PER_DAYD);
|
1798
1814
|
}
|
1799
1815
|
rb_raise(rb_eTypeError, "expected numeric or date");
|
1800
1816
|
}
|
@@ -1865,8 +1881,8 @@ static VALUE rhrdt_op_spaceship(VALUE self, VALUE other) {
|
|
1865
1881
|
int res;
|
1866
1882
|
|
1867
1883
|
if (RTEST(rb_obj_is_kind_of(other, rhrdt_class))) {
|
1868
|
-
self = rhrdt__new_offset(self, 0);
|
1869
|
-
other = rhrdt__new_offset(other, 0);
|
1884
|
+
self = rhrdt__new_offset(self, 0.0);
|
1885
|
+
other = rhrdt__new_offset(other, 0.0);
|
1870
1886
|
Data_Get_Struct(self, rhrdt_t, dt);
|
1871
1887
|
Data_Get_Struct(other, rhrdt_t, odt);
|
1872
1888
|
return LONG2NUM(rhrdt__spaceship(dt, odt));
|
@@ -1918,7 +1934,7 @@ VALUE rhrdt__add_years(VALUE self, long n) {
|
|
1918
1934
|
}
|
1919
1935
|
|
1920
1936
|
RHR_CHECK_CIVIL(newd)
|
1921
|
-
newd->flags &= ~RHR_HAVE_JD;
|
1937
|
+
newd->flags &= (unsigned char)~RHR_HAVE_JD;
|
1922
1938
|
return new;
|
1923
1939
|
}
|
1924
1940
|
|
@@ -1943,7 +1959,7 @@ long rhrdt__add_iso_time_format(rhrdt_t *dt, char *str, long len, long i) {
|
|
1943
1959
|
i = 9;
|
1944
1960
|
}
|
1945
1961
|
|
1946
|
-
l = snprintf(str + len, 128 - len, "T%
|
1962
|
+
l = snprintf(str + len, (size_t)(128 - len), "T%02i:%02i:%02i", (int)dt->hour, (int)dt->minute, (int)dt->second);
|
1947
1963
|
if (l == -1 || l > 127) {
|
1948
1964
|
rb_raise(rb_eNoMemError, "in DateTime formatting method (in snprintf)");
|
1949
1965
|
}
|
@@ -1951,14 +1967,14 @@ long rhrdt__add_iso_time_format(rhrdt_t *dt, char *str, long len, long i) {
|
|
1951
1967
|
|
1952
1968
|
if (i) {
|
1953
1969
|
RHRDT_FILL_NANOS(dt)
|
1954
|
-
l = snprintf(str + len, 128 - len, ".%09lli", dt->nanos % RHR_NANOS_PER_SECOND);
|
1970
|
+
l = snprintf(str + len, (size_t)(128 - len), ".%09lli", dt->nanos % RHR_NANOS_PER_SECOND);
|
1955
1971
|
if (l == -1 || l > 127) {
|
1956
1972
|
rb_raise(rb_eNoMemError, "in DateTime formatting method (in snprintf)");
|
1957
1973
|
}
|
1958
1974
|
len += i + 1;
|
1959
1975
|
}
|
1960
1976
|
|
1961
|
-
l = snprintf(str + len, 128 - len, "%+03i:%02i", dt->offset/60, abs(dt->offset % 60));
|
1977
|
+
l = snprintf(str + len, (size_t)(128 - len), "%+03i:%02i", dt->offset/60, abs(dt->offset % 60));
|
1962
1978
|
if (l == -1 || l > 127) {
|
1963
1979
|
rb_raise(rb_eNoMemError, "in DateTime formatting method (in snprintf)");
|
1964
1980
|
}
|
@@ -2193,18 +2209,18 @@ static VALUE rhrdt_httpdate(VALUE self) {
|
|
2193
2209
|
VALUE s;
|
2194
2210
|
rhrdt_t *d;
|
2195
2211
|
int len;
|
2196
|
-
s = rhrdt__new_offset(self, 0);
|
2212
|
+
s = rhrdt__new_offset(self, 0.0);
|
2197
2213
|
Data_Get_Struct(s, rhrdt_t, d);
|
2198
2214
|
RHRDT_FILL_JD(d)
|
2199
2215
|
RHRDT_FILL_CIVIL(d)
|
2200
2216
|
RHRDT_FILL_HMS(d)
|
2201
2217
|
|
2202
2218
|
s = rb_str_buf_new(128);
|
2203
|
-
len = snprintf(RSTRING_PTR(s), 128, "%s, %
|
2219
|
+
len = snprintf(RSTRING_PTR(s), 128, "%s, %02i %s %04li %02i:%02i:%02i GMT",
|
2204
2220
|
rhrd__abbr_day_names[rhrd__jd_to_wday(d->jd)],
|
2205
|
-
d->day,
|
2221
|
+
(int)d->day,
|
2206
2222
|
rhrd__abbr_month_names[d->month],
|
2207
|
-
d->year, d->hour, d->minute, d->second);
|
2223
|
+
d->year, (int)d->hour, (int)d->minute, (int)d->second);
|
2208
2224
|
if (len == -1 || len > 127) {
|
2209
2225
|
rb_raise(rb_eNoMemError, "in DateTime#httpdate (in snprintf)");
|
2210
2226
|
}
|
@@ -2250,7 +2266,7 @@ static VALUE rhrdt_iso8601(int argc, VALUE *argv, VALUE self) {
|
|
2250
2266
|
s = rb_str_buf_new(128);
|
2251
2267
|
str = RSTRING_PTR(s);
|
2252
2268
|
|
2253
|
-
len = snprintf(str, 128, "%04li-%
|
2269
|
+
len = snprintf(str, 128, "%04li-%02i-%02i", dt->year, (int)dt->month, (int)dt->day);
|
2254
2270
|
if (len == -1 || len > 127) {
|
2255
2271
|
rb_raise(rb_eNoMemError, "in DateTime#to_s (in snprintf)");
|
2256
2272
|
}
|
@@ -2301,7 +2317,7 @@ static VALUE rhrdt_jisx0301(int argc, VALUE *argv, VALUE self) {
|
|
2301
2317
|
str = RSTRING_PTR(s);
|
2302
2318
|
|
2303
2319
|
if (d->jd < 2405160) {
|
2304
|
-
len = snprintf(str, 128, "%04li-%
|
2320
|
+
len = snprintf(str, 128, "%04li-%02i-%02i", d->year, (int)d->month, (int)d->day);
|
2305
2321
|
} else {
|
2306
2322
|
if (d->jd >= 2447535) {
|
2307
2323
|
c = 'H';
|
@@ -2316,7 +2332,7 @@ static VALUE rhrdt_jisx0301(int argc, VALUE *argv, VALUE self) {
|
|
2316
2332
|
c = 'M';
|
2317
2333
|
year = d->year - 1867;
|
2318
2334
|
}
|
2319
|
-
len = snprintf(RSTRING_PTR(s), 128, "%c%02li.%
|
2335
|
+
len = snprintf(RSTRING_PTR(s), 128, "%c%02li.%02i.%02i", c, year, (int)d->month, (int)d->day);
|
2320
2336
|
}
|
2321
2337
|
if (len == -1 || len > 127) {
|
2322
2338
|
rb_raise(rb_eNoMemError, "in DateTime#jisx0301 (in snprintf)");
|
@@ -2354,7 +2370,7 @@ static VALUE rhrdt_next_day(int argc, VALUE *argv, VALUE self) {
|
|
2354
2370
|
break;
|
2355
2371
|
}
|
2356
2372
|
|
2357
|
-
return rhrdt__add_days(self, i);
|
2373
|
+
return rhrdt__add_days(self, (double)i);
|
2358
2374
|
}
|
2359
2375
|
|
2360
2376
|
/* call-seq:
|
@@ -2447,7 +2463,7 @@ static VALUE rhrdt_prev_day(int argc, VALUE *argv, VALUE self) {
|
|
2447
2463
|
break;
|
2448
2464
|
}
|
2449
2465
|
|
2450
|
-
return rhrdt__add_days(self, i);
|
2466
|
+
return rhrdt__add_days(self, (double)i);
|
2451
2467
|
}
|
2452
2468
|
|
2453
2469
|
/* call-seq:
|
@@ -2531,11 +2547,11 @@ static VALUE rhrdt_rfc2822(VALUE self) {
|
|
2531
2547
|
RHRDT_FILL_HMS(d)
|
2532
2548
|
|
2533
2549
|
s = rb_str_buf_new(128);
|
2534
|
-
len = snprintf(RSTRING_PTR(s), 128, "%s, %
|
2550
|
+
len = snprintf(RSTRING_PTR(s), 128, "%s, %i %s %04li %02i:%02i:%02i %+03i%02i",
|
2535
2551
|
rhrd__abbr_day_names[rhrd__jd_to_wday(d->jd)],
|
2536
|
-
d->day,
|
2552
|
+
(int)d->day,
|
2537
2553
|
rhrd__abbr_month_names[d->month],
|
2538
|
-
d->year, d->hour, d->minute, d->second, d->offset/60, abs(d->offset % 60));
|
2554
|
+
d->year, (int)d->hour, (int)d->minute, (int)d->second, d->offset/60, abs(d->offset % 60));
|
2539
2555
|
if (len == -1 || len > 127) {
|
2540
2556
|
rb_raise(rb_eNoMemError, "in DateTime#rfc2822 (in snprintf)");
|
2541
2557
|
}
|
@@ -2594,10 +2610,10 @@ static VALUE rhrdt_to_time(VALUE self) {
|
|
2594
2610
|
RHRDT_FILL_CIVIL(dt)
|
2595
2611
|
RHRDT_FILL_HMS(dt)
|
2596
2612
|
|
2597
|
-
s = dt->nanos/RHR_NANOS_PER_SECOND;
|
2613
|
+
s = (long)(dt->nanos/RHR_NANOS_PER_SECOND);
|
2598
2614
|
h = s/RHR_SECONDS_PER_HOUR;
|
2599
2615
|
m = (s % RHR_SECONDS_PER_HOUR) / 60;
|
2600
|
-
return rb_funcall(rb_funcall(rb_cTime, rhrd_id_utc, 6, LONG2NUM(dt->year), LONG2NUM(dt->month), LONG2NUM(dt->day), LONG2NUM(h), LONG2NUM(m), rb_float_new(s % 60 + (dt->nanos % RHR_NANOS_PER_SECOND)/RHR_NANOS_PER_SECONDD)), rhrd_id_localtime, 0);
|
2616
|
+
return rb_funcall(rb_funcall(rb_cTime, rhrd_id_utc, 6, LONG2NUM(dt->year), LONG2NUM(dt->month), LONG2NUM(dt->day), LONG2NUM(h), LONG2NUM(m), rb_float_new(s % 60 + (double)(dt->nanos % RHR_NANOS_PER_SECOND)/RHR_NANOS_PER_SECONDD)), rhrd_id_localtime, 0);
|
2601
2617
|
}
|
2602
2618
|
|
2603
2619
|
/* call-seq:
|
@@ -2624,7 +2640,7 @@ static VALUE rhrdt_time_to_datetime(VALUE self) {
|
|
2624
2640
|
#else
|
2625
2641
|
dt->nanos = rhrd__mod(t, RHR_SECONDS_PER_DAY) * RHR_NANOS_PER_SECOND + NUM2LONG(rb_funcall(self, rhrd_id_usec, 0)) * 1000;
|
2626
2642
|
#endif
|
2627
|
-
dt->offset = offset/60;
|
2643
|
+
dt->offset = (short)(offset/60);
|
2628
2644
|
dt->flags |= RHR_HAVE_JD | RHR_HAVE_NANOS;
|
2629
2645
|
RHR_CHECK_JD(dt);
|
2630
2646
|
return rd;
|
data/ext/date_ext/extconf.rb
CHANGED
@@ -3,4 +3,6 @@ $CFLAGS << " -DRUBY19" if RUBY_VERSION >= '1.9.0'
|
|
3
3
|
$CFLAGS << " -DRUBY186" if RUBY_VERSION < '1.8.7'
|
4
4
|
$CFLAGS << " -Wall " unless RUBY_PLATFORM =~ /solaris/
|
5
5
|
$CFLAGS << ' -g -ggdb -rdynamic -O0 -DDEBUG' if ENV['DEBUG']
|
6
|
+
$CFLAGS << " -Wconversion -Wsign-compare -Wno-unused-parameter -Wwrite-strings -Wpointer-arith -fno-common -pedantic -Wno-long-long" if ENV['STRICT']
|
7
|
+
$CFLAGS << (ENV['CFLAGS'] || '')
|
6
8
|
create_makefile("date_ext")
|
data/lib/1.8/date_ext.so
CHANGED
Binary file
|
data/lib/1.9/date_ext.so
CHANGED
Binary file
|
@@ -40,10 +40,19 @@ describe "DateTime#sec" do
|
|
40
40
|
end
|
41
41
|
|
42
42
|
describe "DateTime#sec_fraction" do
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
ruby_version_is "" ... "1.9" do
|
44
|
+
it "should be the fraction of a second as a fraction of the day" do
|
45
|
+
DateTime.new(2008, 1, 1).sec_fraction.should == 0.0
|
46
|
+
DateTime.parse('12:13:15.678900').sec_fraction.should be_close(7.85763888888889e-06, 0.0000000000001)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
ruby_version_is "1.9" do
|
51
|
+
it "should be the fraction of a second" do
|
52
|
+
DateTime.new(2008, 1, 1).sec_fraction.should == 0.0
|
53
|
+
DateTime.parse('12:13:15.678900').sec_fraction.should be_close(0.6789, 0.0000000000001)
|
54
|
+
end
|
55
|
+
end
|
47
56
|
end
|
48
57
|
|
49
58
|
describe "DateTime#zone" do
|
data/spec/datetime/parse_spec.rb
CHANGED
@@ -1,7 +1,16 @@
|
|
1
1
|
require File.expand_path('../../spec_helper', __FILE__)
|
2
2
|
|
3
|
-
describe "DateTime
|
3
|
+
describe "DateTime._parse" do
|
4
|
+
it "should return a hash of values" do
|
5
|
+
DateTime._parse("01:02:03").should == {:hour=>1, :min=>2, :sec=>3}
|
6
|
+
end
|
7
|
+
|
8
|
+
it "should have :sec_fraction entry be the fraction of second" do
|
9
|
+
DateTime._parse('12:13:15.678900')[:sec_fraction].should be_close(0.6789, 0.0000000000001)
|
10
|
+
end
|
11
|
+
end
|
4
12
|
|
13
|
+
describe "DateTime.parse" do
|
5
14
|
it "should have defaults and an optional sg value" do
|
6
15
|
DateTime.parse('2008-10-11').should == DateTime.civil(2008, 10, 11)
|
7
16
|
DateTime.parse('2008-10-11', true).should == DateTime.civil(2008, 10, 11)
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: home_run
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 63
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 2
|
10
|
+
version: 0.9.2
|
11
11
|
platform: x86-mswin32-60
|
12
12
|
authors:
|
13
13
|
- Jeremy Evans
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-
|
18
|
+
date: 2010-09-12 00:00:00 -07:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|