mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
fix of ext/date/date_core.
* ext/date/date_core.c (DateTimeData): should not use bare 'long long' and 'long double', which are not defined by C89. * ext/date/date_core.c (dt_lite_plus): get rid of overflow at casting down double to integer. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31039 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
29246c34eb
commit
35c9d383a9
2 changed files with 17 additions and 29 deletions
|
@ -14,13 +14,6 @@
|
|||
#include RUBY_EXTCONF_H
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FLOORL
|
||||
#define floorl(x) ((long double)floor((double)(x)))
|
||||
#endif
|
||||
#ifndef HAVE_ROUNDL
|
||||
#define roundl(x) ((long double)round((double)(x)))
|
||||
#endif
|
||||
|
||||
#define LIGHT_MODE (1 << 0)
|
||||
#define HAVE_JD (1 << 1)
|
||||
#define HAVE_DF (1 << 2)
|
||||
|
@ -89,7 +82,7 @@ union DateTimeData
|
|||
unsigned flags;
|
||||
long jd; /* as utc */
|
||||
int df; /* as utc, in secs */
|
||||
long long sf; /* in nano secs */
|
||||
long sf; /* in nano secs */
|
||||
int of; /* in secs */
|
||||
double sg;
|
||||
/* decoded as local */
|
||||
|
@ -1699,8 +1692,8 @@ minus_dd(VALUE self, VALUE other)
|
|||
|
||||
if (light_mode_p(adat) &&
|
||||
light_mode_p(bdat)) {
|
||||
long d;
|
||||
int df, sf;
|
||||
long d, sf;
|
||||
int df;
|
||||
VALUE r;
|
||||
|
||||
get_dt_jd(adat);
|
||||
|
@ -2075,7 +2068,7 @@ d_right_cache(VALUE self)
|
|||
|
||||
inline static VALUE
|
||||
dt_lite_s_new_internal(VALUE klass, long jd, int df,
|
||||
long long sf, int of, double sg,
|
||||
long sf, int of, double sg,
|
||||
int y, int m, int d,
|
||||
int h, int min, int s,
|
||||
unsigned flags)
|
||||
|
@ -2103,7 +2096,7 @@ dt_lite_s_new_internal(VALUE klass, long jd, int df,
|
|||
|
||||
static VALUE
|
||||
dt_lite_s_new_internal_wo_civil(VALUE klass, long jd, int df,
|
||||
long long sf, int of, double sg,
|
||||
long sf, int of, double sg,
|
||||
unsigned flags)
|
||||
{
|
||||
return dt_lite_s_new_internal(klass, jd, df, sf, of, sg,
|
||||
|
@ -2443,12 +2436,11 @@ datetime_s_now(int argc, VALUE *argv, VALUE klass)
|
|||
struct timespec ts;
|
||||
#else
|
||||
struct timeval tv;
|
||||
time_t sec;
|
||||
#endif
|
||||
time_t sec;
|
||||
struct tm tm;
|
||||
long y;
|
||||
long y, sf;
|
||||
int m, d, h, min, s, of;
|
||||
long long sf;
|
||||
|
||||
rb_scan_args(argc, argv, "01", &vsg);
|
||||
|
||||
|
@ -2460,13 +2452,13 @@ datetime_s_now(int argc, VALUE *argv, VALUE klass)
|
|||
#ifdef HAVE_CLOCK_GETTIME
|
||||
if (clock_gettime(CLOCK_REALTIME, &ts) == -1)
|
||||
rb_sys_fail("clock_gettime");
|
||||
localtime_r(&ts.tv_sec, &tm);
|
||||
sec = ts.tv_sec;
|
||||
#else
|
||||
if (gettimeofday(&tv, NULL) == -1)
|
||||
rb_sys_fail("gettimeofday");
|
||||
sec = tv.tv_sec;
|
||||
localtime_r(&sec, &tm);
|
||||
#endif
|
||||
localtime_r(&sec, &tm);
|
||||
|
||||
y = tm.tm_year + 1900;
|
||||
m = tm.tm_mon + 1;
|
||||
|
@ -2975,10 +2967,9 @@ dt_lite_plus(VALUE self, VALUE other)
|
|||
break;
|
||||
case T_FLOAT:
|
||||
{
|
||||
long jd, df;
|
||||
long long sf;
|
||||
long double o;
|
||||
int s;
|
||||
long sf;
|
||||
double jd, o, tmp;
|
||||
int s, df;
|
||||
|
||||
get_dt1(self);
|
||||
get_dt_jd(dat);
|
||||
|
@ -2994,13 +2985,12 @@ dt_lite_plus(VALUE self, VALUE other)
|
|||
else
|
||||
s = +1;
|
||||
|
||||
jd = (long)floorl(o);
|
||||
o = o - jd;
|
||||
o = modf(o, &jd);
|
||||
o *= DAY_IN_SECONDS;
|
||||
df = (long)floorl(o);
|
||||
o = o - df;
|
||||
o = modf(o, &tmp);
|
||||
df = (int)tmp;
|
||||
o *= SECOND_IN_NANOSECONDS;
|
||||
sf = (long)roundl(o);
|
||||
sf = (long)round(o);
|
||||
|
||||
if (s < 0) {
|
||||
jd = -jd;
|
||||
|
@ -3032,7 +3022,7 @@ dt_lite_plus(VALUE self, VALUE other)
|
|||
|
||||
if (LIGHTABLE_JD(jd) && jd >= dat->l.sg)
|
||||
return dt_lite_s_new_internal(CLASS_OF(self),
|
||||
jd,
|
||||
(long)jd,
|
||||
df,
|
||||
sf,
|
||||
dat->l.of,
|
||||
|
|
|
@ -1,4 +1,2 @@
|
|||
require 'mkmf'
|
||||
have_func('floorl', 'math.h')
|
||||
have_func('roundl', 'math.h')
|
||||
create_makefile('date_core')
|
||||
|
|
Loading…
Add table
Reference in a new issue