home_run 0.9.1 → 0.9.2
Sign up to get free protection for your applications and to get access to all the features.
- 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/spec/datetime/accessor_spec.rb +13 -4
- data/spec/datetime/parse_spec.rb +10 -1
- metadata +52 -52
data/CHANGELOG
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
=== 0.9.2 (2010-09-13)
|
2
|
+
|
3
|
+
* Make DateTime#sec_fraction on ruby 1.9 to be compatible with 1.9 stdlib (jeremyevans)
|
4
|
+
|
5
|
+
* Remove the use of the %hhi sprintf format specifier, for greater standards compatibility (jeremyevans)
|
6
|
+
|
7
|
+
* Fix a bug where the same symbol was present in multiple objects, causing build failures with -fno-common (jeremyevans) (#10)
|
8
|
+
|
1
9
|
=== 0.9.1 (2010-09-01)
|
2
10
|
|
3
11
|
* Fix strptime for %Y%m%d and similar formats (jeremyevans) (#9)
|
data/README.rdoc
CHANGED
@@ -78,9 +78,6 @@ and 1.9.
|
|
78
78
|
|
79
79
|
== Installing into site_ruby
|
80
80
|
|
81
|
-
This is only necessary on ruby 1.8, as on ruby 1.9, gem directories
|
82
|
-
come before the standard library directories in the load path.
|
83
|
-
|
84
81
|
After installing the gem:
|
85
82
|
|
86
83
|
home_run --install
|
@@ -94,9 +91,6 @@ If you ever want to uninstall from site_ruby:
|
|
94
91
|
|
95
92
|
== Running without installing into site_ruby
|
96
93
|
|
97
|
-
Just like installing into site_ruby, this should only be necessary
|
98
|
-
on ruby 1.8.
|
99
|
-
|
100
94
|
If you don't want to install into site_ruby, you can use home_run's
|
101
95
|
Date/DateTime classes for specific programs by running your script
|
102
96
|
using home_run:
|
@@ -118,7 +112,9 @@ date, you can end up with situations where the Date instances created
|
|
118
112
|
before the require use the standard library version of Date, while the
|
119
113
|
Date instances created after the require use this library's version.
|
120
114
|
However, in some cases (such as on Heroku), this is the only way to
|
121
|
-
easily use this library.
|
115
|
+
easily use this library. If you need to do this and you are using
|
116
|
+
Rails 3, make sure you require home_run before rails/all in
|
117
|
+
config/application.rb.
|
122
118
|
|
123
119
|
== Running the specs
|
124
120
|
|
data/ext/date_ext/date_ext.c
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
#include <ctype.h>
|
2
2
|
#include "date_ext.h"
|
3
3
|
|
4
|
+
#ifdef RHR_ENCODING
|
5
|
+
int rhrd_encoding_index;
|
6
|
+
#endif
|
7
|
+
|
4
8
|
const unsigned char rhrd_days_in_month[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
5
9
|
const long rhrd_cumulative_days_in_month[13] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
|
6
10
|
const unsigned char rhrd_yday_to_month[366] = {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12};
|
@@ -111,7 +115,7 @@ long rhrd__mod(long a, long b) {
|
|
111
115
|
/* Same as above but for long long dividend. */
|
112
116
|
long rhrd__modll(long long a, long b) {
|
113
117
|
long c;
|
114
|
-
c = a % b;
|
118
|
+
c = (long)(a % b);
|
115
119
|
if (c < 0) {
|
116
120
|
c += b;
|
117
121
|
}
|
@@ -189,12 +193,12 @@ void rhrd__jd_to_civil(rhrd_t *date) {
|
|
189
193
|
c = (long)floor((b - 122.1) / 365.25);
|
190
194
|
d = (long)floor(365.25 * c);
|
191
195
|
e = (long)floor((b - d) / 30.6001);
|
192
|
-
date->day = b - d - (long)floor(30.6001 * e);
|
196
|
+
date->day = (unsigned char)(b - d - (long)floor(30.6001 * e));
|
193
197
|
if (e <= 13) {
|
194
|
-
date->month = e - 1;
|
198
|
+
date->month = (unsigned char)(e - 1);
|
195
199
|
date->year = c - 4716;
|
196
200
|
} else {
|
197
|
-
date->month = e - 13;
|
201
|
+
date->month = (unsigned char)(e - 13);
|
198
202
|
date->year = c - 4715;
|
199
203
|
}
|
200
204
|
date->flags |= RHR_HAVE_CIVIL;
|
@@ -318,13 +322,13 @@ VALUE rhrd__add_months(VALUE self, long n) {
|
|
318
322
|
n = rhrd__safe_add_long(n, (long)(d->month));
|
319
323
|
if(n > 1 && n <= 12) {
|
320
324
|
newd->year = d->year;
|
321
|
-
newd->month = n;
|
325
|
+
newd->month = (unsigned char)n;
|
322
326
|
} else {
|
323
327
|
x = n / 12;
|
324
328
|
n = n % 12;
|
325
329
|
if (n <= 0) {
|
326
330
|
newd->year = d->year + x - 1;
|
327
|
-
newd->month = n + 12;
|
331
|
+
newd->month = (unsigned char)(n + 12);
|
328
332
|
} else {
|
329
333
|
newd->year = d->year + x;
|
330
334
|
newd->month = (unsigned char)n;
|
@@ -405,7 +409,7 @@ void rhrd__fill_commercial(rhrd_t *d) {
|
|
405
409
|
rhrd__jd_to_civil(&n);
|
406
410
|
a = n.year;
|
407
411
|
d->year = d->jd >= rhrd__commercial_to_jd(a + 1, 1, 1) ? a + 1 : a;
|
408
|
-
d->month = 1 + (d->jd - rhrd__commercial_to_jd(d->year, 1, 1)) / 7;
|
412
|
+
d->month = (unsigned char)(1 + (d->jd - rhrd__commercial_to_jd(d->year, 1, 1)) / 7);
|
409
413
|
d->day = (unsigned char)rhrd__jd_to_cwday(d->jd);
|
410
414
|
}
|
411
415
|
|
@@ -519,7 +523,7 @@ long long rhrd__jd_to_unix(long long jd) {
|
|
519
523
|
* julian date, losing any information about
|
520
524
|
* fractional days. */
|
521
525
|
long rhrd__unix_to_jd(long long t) {
|
522
|
-
return t/RHR_SECONDS_PER_DAY + RHR_UNIX_EPOCH;
|
526
|
+
return (long)(t/RHR_SECONDS_PER_DAY + RHR_UNIX_EPOCH);
|
523
527
|
}
|
524
528
|
|
525
529
|
/* Fill the given rhrt_d's jd field based on the
|
@@ -527,7 +531,7 @@ long rhrd__unix_to_jd(long long t) {
|
|
527
531
|
void rhrd__today(rhrd_t * d) {
|
528
532
|
VALUE t;
|
529
533
|
t = rb_funcall(rb_cTime, rhrd_id_now, 0);
|
530
|
-
d->jd = rhrd__unix_to_jd(NUM2LONG(rb_funcall(t, rhrd_id_to_i, 0)) + NUM2LONG(rb_funcall(t, rhrd_id_utc_offset, 0)));
|
534
|
+
d->jd = rhrd__unix_to_jd((long long)NUM2LONG(rb_funcall(t, rhrd_id_to_i, 0)) + NUM2LONG(rb_funcall(t, rhrd_id_utc_offset, 0)));
|
531
535
|
d->flags |= RHR_HAVE_JD;
|
532
536
|
RHR_CHECK_JD(d);
|
533
537
|
}
|
@@ -644,7 +648,7 @@ int rhrd__fill_from_hash(rhrd_t *d, VALUE hash) {
|
|
644
648
|
if(!rhrd__valid_commercial(d, d->year, 1, NUM2LONG(rwday), RHR_NO_RAISE)) {
|
645
649
|
return 1;
|
646
650
|
}
|
647
|
-
d->flags &= ~RHR_HAVE_CIVIL;
|
651
|
+
d->flags &= (unsigned char)~RHR_HAVE_CIVIL;
|
648
652
|
return 0;
|
649
653
|
} else if (RTEST(rwnum0)) {
|
650
654
|
d->jd = rhrd__weeknum_to_jd(year, NUM2LONG(rwnum0), RTEST(rwday) ? NUM2LONG(rwday) : (RTEST(rcwday) ? rhrd__mod(NUM2LONG(rcwday), 7) : 0), 0);
|
@@ -693,7 +697,7 @@ int rhrd__fill_from_hash(rhrd_t *d, VALUE hash) {
|
|
693
697
|
wday = NUM2LONG(rwday);
|
694
698
|
rhrd__today(d);
|
695
699
|
d->jd += wday - rhrd__jd_to_wday(d->jd);
|
696
|
-
d->flags &= ~RHR_HAVE_CIVIL;
|
700
|
+
d->flags &= (unsigned char)~RHR_HAVE_CIVIL;
|
697
701
|
return 0;
|
698
702
|
} else {
|
699
703
|
return -1;
|
@@ -774,19 +778,19 @@ VALUE rhrd__strftime(rhrdt_t *d, const char * fmt, int fmt_len) {
|
|
774
778
|
cp += sprintf(str + cp, "%s", rhrd__month_names[d->month]);
|
775
779
|
break;
|
776
780
|
case 'c':
|
777
|
-
cp += sprintf(str + cp, "%s %s %
|
781
|
+
cp += sprintf(str + cp, "%s %s %2i %02i:%02i:%02i %04li", rhrd__abbr_day_names[rhrd__jd_to_wday(d->jd)], rhrd__abbr_month_names[d->month], (int)d->day, (int)d->hour, (int)d->minute, (int)d->second, d->year);
|
778
782
|
break;
|
779
783
|
case 'C':
|
780
784
|
cp += sprintf(str + cp, "%02li", d->year / 100);
|
781
785
|
break;
|
782
786
|
case 'd':
|
783
|
-
cp += sprintf(str + cp, "%
|
787
|
+
cp += sprintf(str + cp, "%02i", (int)d->day);
|
784
788
|
break;
|
785
789
|
case 'e':
|
786
|
-
cp += sprintf(str + cp, "%
|
790
|
+
cp += sprintf(str + cp, "%2i", (int)d->day);
|
787
791
|
break;
|
788
792
|
case 'F':
|
789
|
-
cp += sprintf(str + cp, "%04li-%
|
793
|
+
cp += sprintf(str + cp, "%04li-%02i-%02i", d->year, (int)d->month, (int)d->day);
|
790
794
|
break;
|
791
795
|
case 'g':
|
792
796
|
cp += sprintf(str + cp, "%02li", cd.year % 100);
|
@@ -795,28 +799,28 @@ VALUE rhrd__strftime(rhrdt_t *d, const char * fmt, int fmt_len) {
|
|
795
799
|
cp += sprintf(str + cp, "%04li", cd.year);
|
796
800
|
break;
|
797
801
|
case 'H':
|
798
|
-
cp += sprintf(str + cp, "%
|
802
|
+
cp += sprintf(str + cp, "%02i", (int)d->hour);
|
799
803
|
break;
|
800
804
|
case 'I':
|
801
|
-
cp += sprintf(str + cp, "%
|
805
|
+
cp += sprintf(str + cp, "%02i", (int)((d->hour == 12 || d->hour == 0) ? 12 : d->hour % 12));
|
802
806
|
break;
|
803
807
|
case 'j':
|
804
808
|
cp += sprintf(str + cp, "%03li", rhrd__ordinal_day(d->year, d->month, d->day));
|
805
809
|
break;
|
806
810
|
case 'k':
|
807
|
-
cp += sprintf(str + cp, "%
|
811
|
+
cp += sprintf(str + cp, "%2i", (int)(d->hour));
|
808
812
|
break;
|
809
813
|
case 'l':
|
810
|
-
cp += sprintf(str + cp, "%
|
814
|
+
cp += sprintf(str + cp, "%2i", (int)((d->hour == 12 || d->hour == 0) ? 12 : d->hour % 12));
|
811
815
|
break;
|
812
816
|
case 'L':
|
813
817
|
cp += sprintf(str + cp, "%03" PRId64, (d->nanos % RHR_NANOS_PER_SECOND)/1000000);
|
814
818
|
break;
|
815
819
|
case 'm':
|
816
|
-
cp += sprintf(str + cp, "%
|
820
|
+
cp += sprintf(str + cp, "%02i", (int)(d->month));
|
817
821
|
break;
|
818
822
|
case 'M':
|
819
|
-
cp += sprintf(str + cp, "%
|
823
|
+
cp += sprintf(str + cp, "%02i", (int)(d->minute));
|
820
824
|
break;
|
821
825
|
case 'N':
|
822
826
|
cp += sprintf(str + cp, "%09" PRId64, (d->nanos % RHR_NANOS_PER_SECOND));
|
@@ -831,38 +835,38 @@ VALUE rhrd__strftime(rhrdt_t *d, const char * fmt, int fmt_len) {
|
|
831
835
|
cp += sprintf(str + cp, d->hour >= 12 ? "pm" : "am");
|
832
836
|
break;
|
833
837
|
case 'Q':
|
834
|
-
cp += sprintf(str + cp, "%" PRId64, rhrd__jd_to_unix(d->jd) * 1000 + d->nanos/RHR_NANOS_PER_MILLISECOND - d->offset * 60000);
|
838
|
+
cp += sprintf(str + cp, "%" PRId64, rhrd__jd_to_unix((long long)d->jd) * 1000 + d->nanos/RHR_NANOS_PER_MILLISECOND - d->offset * 60000);
|
835
839
|
break;
|
836
840
|
case 'r':
|
837
|
-
cp += sprintf(str + cp, "%
|
841
|
+
cp += sprintf(str + cp, "%2i:%02i:%02i %s", (int)((d->hour == 12 || d->hour == 0) ? 12 : d->hour % 12), (int)d->minute, (int)d->second, d->hour >= 12 ? "PM" : "AM");
|
838
842
|
break;
|
839
843
|
case 'R':
|
840
|
-
cp += sprintf(str + cp, "%
|
844
|
+
cp += sprintf(str + cp, "%02i:%02i", (int)d->hour, (int)d->minute);
|
841
845
|
break;
|
842
846
|
case 's':
|
843
|
-
cp += sprintf(str + cp, "%" PRId64, rhrd__jd_to_unix(d->jd) + d->nanos/RHR_NANOS_PER_SECOND - d->offset * 60);
|
847
|
+
cp += sprintf(str + cp, "%" PRId64, rhrd__jd_to_unix((long long)d->jd) + d->nanos/RHR_NANOS_PER_SECOND - d->offset * 60);
|
844
848
|
break;
|
845
849
|
case 'S':
|
846
|
-
cp += sprintf(str + cp, "%
|
850
|
+
cp += sprintf(str + cp, "%02i", (int)d->second);
|
847
851
|
break;
|
848
852
|
case 't':
|
849
853
|
cp += sprintf(str + cp, "\t");
|
850
854
|
break;
|
851
855
|
case 'X':
|
852
856
|
case 'T':
|
853
|
-
cp += sprintf(str + cp, "%
|
857
|
+
cp += sprintf(str + cp, "%02i:%02i:%02i", (int)d->hour, (int)d->minute, (int)d->second);
|
854
858
|
break;
|
855
859
|
case 'u':
|
856
|
-
cp += sprintf(str + cp, "%
|
860
|
+
cp += sprintf(str + cp, "%i", (int)cd.day);
|
857
861
|
break;
|
858
862
|
case 'U':
|
859
863
|
cp += sprintf(str + cp, "%li", rhrd__jd_to_weeknum(d->jd, 0));
|
860
864
|
break;
|
861
865
|
case 'v':
|
862
|
-
cp += sprintf(str + cp, "%
|
866
|
+
cp += sprintf(str + cp, "%2i-%s-%04li", (int)d->day, rhrd__abbr_month_names[d->month], d->year);
|
863
867
|
break;
|
864
868
|
case 'V':
|
865
|
-
cp += sprintf(str + cp, "%
|
869
|
+
cp += sprintf(str + cp, "%02i", (int)cd.month);
|
866
870
|
break;
|
867
871
|
case 'w':
|
868
872
|
cp += sprintf(str + cp, "%li", rhrd__jd_to_wday(d->jd));
|
@@ -872,7 +876,7 @@ VALUE rhrd__strftime(rhrdt_t *d, const char * fmt, int fmt_len) {
|
|
872
876
|
break;
|
873
877
|
case 'D':
|
874
878
|
case 'x':
|
875
|
-
cp += sprintf(str + cp, "%
|
879
|
+
cp += sprintf(str + cp, "%02i/%02i/%02li", (int)d->month, (int)d->day, d->year % 100);
|
876
880
|
break;
|
877
881
|
case 'y':
|
878
882
|
cp += sprintf(str + cp, "%02li", d->year % 100);
|
@@ -887,7 +891,7 @@ VALUE rhrd__strftime(rhrdt_t *d, const char * fmt, int fmt_len) {
|
|
887
891
|
cp += sprintf(str + cp, "%+03i:%02i", d->offset/60, abs(d->offset % 60));
|
888
892
|
break;
|
889
893
|
case '+':
|
890
|
-
cp += sprintf(str + cp, "%s %s %
|
894
|
+
cp += sprintf(str + cp, "%s %s %2i %02i:%02i:%02i %+03i:%02i %04li", rhrd__abbr_day_names[rhrd__jd_to_wday(d->jd)], rhrd__abbr_month_names[d->month], (int)d->day, (int)d->hour, (int)d->minute, (int)d->second, d->offset/60, abs(d->offset % 60), d->year);
|
891
895
|
break;
|
892
896
|
default:
|
893
897
|
str[cp] = c;
|
@@ -973,9 +977,9 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
|
|
973
977
|
break;
|
974
978
|
case 'A':
|
975
979
|
for(i = 0; i < 7; i++) {
|
976
|
-
scan_len = strlen(rhrd__day_names[i]);
|
980
|
+
scan_len = (int)strlen(rhrd__day_names[i]);
|
977
981
|
if (pos + scan_len <= len) {
|
978
|
-
if(strncasecmp(str + pos, rhrd__day_names[i], scan_len) == 0) {
|
982
|
+
if(strncasecmp(str + pos, rhrd__day_names[i], (size_t)scan_len) == 0) {
|
979
983
|
wday = i;
|
980
984
|
break;
|
981
985
|
}
|
@@ -1006,9 +1010,9 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
|
|
1006
1010
|
break;
|
1007
1011
|
case 'B':
|
1008
1012
|
for(i = 1; i < 13; i++) {
|
1009
|
-
scan_len = strlen(rhrd__month_names[i]);
|
1013
|
+
scan_len = (int)strlen(rhrd__month_names[i]);
|
1010
1014
|
if (pos + scan_len <= len) {
|
1011
|
-
if(strncasecmp(str + pos, rhrd__month_names[i], scan_len) == 0) {
|
1015
|
+
if(strncasecmp(str + pos, rhrd__month_names[i], (size_t)scan_len) == 0) {
|
1012
1016
|
month = i;
|
1013
1017
|
break;
|
1014
1018
|
}
|
@@ -1095,7 +1099,7 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
|
|
1095
1099
|
if (sscanf(str + pos, "%03ld%n", &sec_fraction_num, &scan_len) != 1) {
|
1096
1100
|
return Qnil;
|
1097
1101
|
}
|
1098
|
-
sec_fraction = sec_fraction_num/pow(10, scan_len);
|
1102
|
+
sec_fraction = sec_fraction_num/pow(10.0, (double)scan_len);
|
1099
1103
|
state |= RHRR_SEC_FRACTION_SET;
|
1100
1104
|
break;
|
1101
1105
|
case 'm':
|
@@ -1128,7 +1132,7 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
|
|
1128
1132
|
if (sscanf(str + pos, "%09ld%n", &sec_fraction_num, &scan_len) != 1) {
|
1129
1133
|
return Qnil;
|
1130
1134
|
}
|
1131
|
-
sec_fraction = sec_fraction_num/pow(10, scan_len);
|
1135
|
+
sec_fraction = sec_fraction_num/pow(10.0, (double)scan_len);
|
1132
1136
|
state |= RHRR_SEC_FRACTION_SET;
|
1133
1137
|
break;
|
1134
1138
|
case 'P':
|
@@ -1418,7 +1422,7 @@ VALUE rhrd__strptime(VALUE rstr, const char *fmt_str, long fmt_len) {
|
|
1418
1422
|
}
|
1419
1423
|
if(state & RHRR_UNIXM_SET) {
|
1420
1424
|
rb_hash_aset(hash, rhrd_sym_seconds, LL2NUM(milliseconds/1000));
|
1421
|
-
rb_hash_aset(hash, rhrd_sym_sec_fraction, rb_float_new((milliseconds % 1000)/1000.0));
|
1425
|
+
rb_hash_aset(hash, rhrd_sym_sec_fraction, rb_float_new((double)(milliseconds % 1000)/1000.0));
|
1422
1426
|
}
|
1423
1427
|
if(RTEST(zone)) {
|
1424
1428
|
rb_hash_aset(hash, rhrd_sym_zone, zone);
|
@@ -2000,7 +2004,7 @@ VALUE rhrd_s_zone_to_diff(VALUE klass, VALUE str) {
|
|
2000
2004
|
v = rb_funcall(str, rhrd_id_split, 1, rhrd_re_comma_period);
|
2001
2005
|
e = rb_ary_entry(v, 1);
|
2002
2006
|
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);
|
2007
|
+
+ ((NUM2LONG(rb_funcall(e, rhrd_id_to_i, 0)) * RHR_SECONDS_PER_HOUR) / (long)pow(10.0, (double)RSTRING_LEN(rb_str_to_str(e))))) * offset);
|
2004
2008
|
}
|
2005
2009
|
}
|
2006
2010
|
switch (len) {
|
@@ -2067,10 +2071,10 @@ static VALUE rhrd_asctime(VALUE self) {
|
|
2067
2071
|
RHR_FILL_JD(d)
|
2068
2072
|
|
2069
2073
|
s = rb_str_buf_new(128);
|
2070
|
-
len = snprintf(RSTRING_PTR(s), 128, "%s %s %
|
2074
|
+
len = snprintf(RSTRING_PTR(s), 128, "%s %s %2i 00:00:00 %04li",
|
2071
2075
|
rhrd__abbr_day_names[rhrd__jd_to_wday(d->jd)],
|
2072
2076
|
rhrd__abbr_month_names[d->month],
|
2073
|
-
d->day,
|
2077
|
+
(int)d->day,
|
2074
2078
|
d->year);
|
2075
2079
|
if (len == -1 || len > 127) {
|
2076
2080
|
rb_raise(rb_eNoMemError, "in Date#asctime (in snprintf)");
|
@@ -2283,8 +2287,8 @@ static VALUE rhrd_inspect(VALUE self) {
|
|
2283
2287
|
RHR_FILL_CIVIL(d)
|
2284
2288
|
|
2285
2289
|
s = rb_str_buf_new(128);
|
2286
|
-
len = snprintf(RSTRING_PTR(s), 128, "#<Date %04li-%
|
2287
|
-
d->year, d->month, d->day);
|
2290
|
+
len = snprintf(RSTRING_PTR(s), 128, "#<Date %04li-%02i-%02i>",
|
2291
|
+
d->year, (int)d->month, (int)d->day);
|
2288
2292
|
if (len == -1 || len > 127) {
|
2289
2293
|
rb_raise(rb_eNoMemError, "in Date#inspect (in snprintf)");
|
2290
2294
|
}
|
@@ -2617,8 +2621,8 @@ static VALUE rhrd_to_s(VALUE self) {
|
|
2617
2621
|
RHR_FILL_CIVIL(d)
|
2618
2622
|
|
2619
2623
|
s = rb_str_buf_new(128);
|
2620
|
-
len = snprintf(RSTRING_PTR(s), 128, "%04li-%
|
2621
|
-
d->year, d->month, d->day);
|
2624
|
+
len = snprintf(RSTRING_PTR(s), 128, "%04li-%02i-%02i",
|
2625
|
+
d->year, (int)d->month, (int)d->day);
|
2622
2626
|
if (len == -1 || len > 127) {
|
2623
2627
|
rb_raise(rb_eNoMemError, "in Date#to_s (in snprintf)");
|
2624
2628
|
}
|
@@ -2784,7 +2788,7 @@ static VALUE rhrd_op_minus(VALUE self, VALUE other) {
|
|
2784
2788
|
RHR_FILL_JD(d)
|
2785
2789
|
RHRDT_FILL_JD(newdt)
|
2786
2790
|
RHRDT_FILL_NANOS(newdt)
|
2787
|
-
return rb_float_new(d->jd - (newdt->jd + newdt->nanos/RHR_NANOS_PER_DAYD));
|
2791
|
+
return rb_float_new(d->jd - (newdt->jd + (double)newdt->nanos/RHR_NANOS_PER_DAYD));
|
2788
2792
|
}
|
2789
2793
|
if (RTEST((rb_obj_is_kind_of(other, rhrd_class)))) {
|
2790
2794
|
Data_Get_Struct(other, rhrd_t, newd);
|
@@ -3139,9 +3143,9 @@ static VALUE rhrd_httpdate(VALUE self) {
|
|
3139
3143
|
RHR_FILL_JD(d)
|
3140
3144
|
|
3141
3145
|
s = rb_str_buf_new(128);
|
3142
|
-
len = snprintf(RSTRING_PTR(s), 128, "%s, %
|
3146
|
+
len = snprintf(RSTRING_PTR(s), 128, "%s, %02i %s %04li 00:00:00 GMT",
|
3143
3147
|
rhrd__abbr_day_names[rhrd__jd_to_wday(d->jd)],
|
3144
|
-
d->day,
|
3148
|
+
(int)d->day,
|
3145
3149
|
rhrd__abbr_month_names[d->month],
|
3146
3150
|
d->year);
|
3147
3151
|
if (len == -1 || len > 127) {
|
@@ -3172,7 +3176,7 @@ static VALUE rhrd_jisx0301(VALUE self) {
|
|
3172
3176
|
|
3173
3177
|
s = rb_str_buf_new(128);
|
3174
3178
|
if (d->jd < 2405160) {
|
3175
|
-
len = snprintf(RSTRING_PTR(s), 128, "%04li-%
|
3179
|
+
len = snprintf(RSTRING_PTR(s), 128, "%04li-%02i-%02i", d->year, (int)d->month, (int)d->day);
|
3176
3180
|
} else {
|
3177
3181
|
if (d->jd >= 2447535) {
|
3178
3182
|
c = 'H';
|
@@ -3187,7 +3191,7 @@ static VALUE rhrd_jisx0301(VALUE self) {
|
|
3187
3191
|
c = 'M';
|
3188
3192
|
year = d->year - 1867;
|
3189
3193
|
}
|
3190
|
-
len = snprintf(RSTRING_PTR(s), 128, "%c%02li.%
|
3194
|
+
len = snprintf(RSTRING_PTR(s), 128, "%c%02li.%02i.%02i", c, year, (int)d->month, (int)d->day);
|
3191
3195
|
}
|
3192
3196
|
if (len == -1 || len > 127) {
|
3193
3197
|
rb_raise(rb_eNoMemError, "in Date#jisx0301 (in snprintf)");
|
@@ -3394,9 +3398,9 @@ static VALUE rhrd_rfc2822(VALUE self) {
|
|
3394
3398
|
RHR_FILL_JD(d)
|
3395
3399
|
|
3396
3400
|
s = rb_str_buf_new(128);
|
3397
|
-
len = snprintf(RSTRING_PTR(s), 128, "%s, %
|
3401
|
+
len = snprintf(RSTRING_PTR(s), 128, "%s, %i %s %04li 00:00:00 +0000",
|
3398
3402
|
rhrd__abbr_day_names[rhrd__jd_to_wday(d->jd)],
|
3399
|
-
d->day,
|
3403
|
+
(int)d->day,
|
3400
3404
|
rhrd__abbr_month_names[d->month],
|
3401
3405
|
d->year);
|
3402
3406
|
if (len == -1 || len > 127) {
|
@@ -3423,7 +3427,7 @@ static VALUE rhrd_rfc3339(VALUE self) {
|
|
3423
3427
|
RHR_FILL_CIVIL(d)
|
3424
3428
|
|
3425
3429
|
s = rb_str_buf_new(128);
|
3426
|
-
len = snprintf(RSTRING_PTR(s), 128, "%04li-%
|
3430
|
+
len = snprintf(RSTRING_PTR(s), 128, "%04li-%02i-%02iT00:00:00+00:00", d->year, (int)d->month, (int)d->day);
|
3427
3431
|
if (len == -1 || len > 127) {
|
3428
3432
|
rb_raise(rb_eNoMemError, "in Date#rfc3339 (in snprintf)");
|
3429
3433
|
}
|
@@ -3697,11 +3701,11 @@ static VALUE rhrd_s_day_fraction_to_time(VALUE klass, VALUE rf) {
|
|
3697
3701
|
int h, m, s;
|
3698
3702
|
|
3699
3703
|
f = NUM2DBL(rf) * 24;
|
3700
|
-
h = floor(f);
|
3704
|
+
h = (int)floor(f);
|
3701
3705
|
f = (f - h) * 60;
|
3702
|
-
m = floor(f);
|
3706
|
+
m = (int)floor(f);
|
3703
3707
|
f = (f - m) * 60;
|
3704
|
-
s = floor(f);
|
3708
|
+
s = (int)floor(f);
|
3705
3709
|
f = (f - s)/RHR_SECONDS_PER_DAY;
|
3706
3710
|
return rb_ary_new3(4, LONG2NUM(h), LONG2NUM(m), LONG2NUM(s), rb_float_new(f));
|
3707
3711
|
}
|
@@ -4109,7 +4113,7 @@ void Init_date_ext(void) {
|
|
4109
4113
|
rb_ary_push(rhrd_monthnames, Qnil);
|
4110
4114
|
rb_ary_push(rhrd_abbr_monthnames, Qnil);
|
4111
4115
|
for(i = 1; i < 13; i++) {
|
4112
|
-
rb_ary_push(rhrd_monthnames, rb_str_new2(rhrd__month_names[i]));
|
4116
|
+
rb_ary_push(rhrd_monthnames, rb_str_new2((const char *)rhrd__month_names[i]));
|
4113
4117
|
rb_ary_push(rhrd_abbr_monthnames, rb_str_new2(rhrd__abbr_month_names[i]));
|
4114
4118
|
}
|
4115
4119
|
|
@@ -4299,9 +4303,9 @@ void Init_date_ext(void) {
|
|
4299
4303
|
/* Define some static regexps. The 1 for the options makes
|
4300
4304
|
* it case insensitive, as I don't want to deal with including
|
4301
4305
|
* the ruby regex header just to get it. */
|
4302
|
-
rhrd_zone_re = rb_reg_new(rhrd__zone_re_str, strlen(rhrd__zone_re_str), 1);
|
4303
|
-
rhrd_zone_dst_re = rb_reg_new(rhrd__zone_dst_re_str, strlen(rhrd__zone_dst_re_str), 1);
|
4304
|
-
rhrd_zone_sign_re = rb_reg_new(rhrd__zone_sign_re_str, strlen(rhrd__zone_sign_re_str), 1);
|
4306
|
+
rhrd_zone_re = rb_reg_new(rhrd__zone_re_str, (int)strlen(rhrd__zone_re_str), 1);
|
4307
|
+
rhrd_zone_dst_re = rb_reg_new(rhrd__zone_dst_re_str, (int)strlen(rhrd__zone_dst_re_str), 1);
|
4308
|
+
rhrd_zone_sign_re = rb_reg_new(rhrd__zone_sign_re_str, (int)strlen(rhrd__zone_sign_re_str), 1);
|
4305
4309
|
rhrd_re_comma_period = rb_reg_new("[,.]", 4, 0);
|
4306
4310
|
|
4307
4311
|
/* Register global variables with Garbage collector, so users
|
data/ext/date_ext/date_ext.h
CHANGED
@@ -119,7 +119,6 @@ so that no calculations can overflow.
|
|
119
119
|
#define RHRDT_FILL_NANOS(d) if (!((d)->flags & RHR_HAVE_NANOS)) { rhrdt__hms_to_nanos(d); }
|
120
120
|
|
121
121
|
#ifdef RHR_ENCODING
|
122
|
-
int rhrd_encoding_index;
|
123
122
|
#define RHR_ASCII_ENCODING(s) s = rb_enc_associate_index(s, rhrd_encoding_index); \
|
124
123
|
if(rb_default_internal_encoding()) {s = rb_str_export_to_enc(s, rb_default_internal_encoding());}
|
125
124
|
#else
|
@@ -135,7 +134,7 @@ int rhrd_encoding_index;
|
|
135
134
|
#define RHR_SPACE_SHIP(x, l, r) if (l < r) { x = -1; } else if (l == r) { x = 0; } else { x = 1; }
|
136
135
|
|
137
136
|
#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);}
|
138
|
-
#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 = %
|
137
|
+
#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 = %i, day = %i", d->year, (int)d->month, (int)d->day);}
|
139
138
|
|
140
139
|
#define RHR_CACHED_IV(self, iv) VALUE v = rb_ivar_get(self, iv); if (RTEST(v)) {return v;}
|
141
140
|
|