summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro Matsumoto <[email protected]>2012-06-03 15:05:18 +0900
committerYukihiro Matsumoto <[email protected]>2012-06-03 15:05:18 +0900
commit48ff4f2d36de313591f222708eaf43260a4d39df (patch)
tree556565508662c5fc16529f9bf6e26e33eb3ec3a8
parente88e30524ee878bf0bbf665c1a6bea11a60f07d4 (diff)
downloadmruby-48ff4f2d36de313591f222708eaf43260a4d39df.tar.gz
mruby-48ff4f2d36de313591f222708eaf43260a4d39df.zip
time - time should not return time, but number
-rw-r--r--src/time.c66
1 files changed, 38 insertions, 28 deletions
diff --git a/src/time.c b/src/time.c
index 63b763a08..516365da5 100644
--- a/src/time.c
+++ b/src/time.c
@@ -136,13 +136,13 @@ mrb_time_update_datetime(struct mrb_time *self)
{
struct tm *aid;
- if(self->timezone == MRB_TIMEZONE_UTC) {
+ if (self->timezone == MRB_TIMEZONE_UTC) {
aid = gmtime_r(&self->sec, &self->datetime);
}
else {
aid = localtime_r(&self->sec, &self->datetime);
}
- if(!aid) return NULL;
+ if (!aid) return NULL;
#ifdef NO_GMTIME_R
self->datetime = *aid; // copy data
#endif
@@ -339,7 +339,7 @@ mrb_time_plus(mrb_state *mrb, mrb_value self)
mrb_get_args(mrb, "f", &f);
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
f += tm->sec;
f += (mrb_float)tm->usec / 1.0e6;
return mrb_time_make(mrb, mrb_obj_class(mrb, self), f, tm->timezone);
@@ -349,14 +349,24 @@ static mrb_value
mrb_time_minus(mrb_state *mrb, mrb_value self)
{
mrb_float f;
- struct mrb_time *tm;
+ mrb_value other;
+ struct mrb_time *tm, *tm2;
- mrb_get_args(mrb, "f", &f);
+ mrb_get_args(mrb, "o", &other);
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
- f -= tm->sec;
- f -= (mrb_float)tm->usec / 1.0e6;
- return mrb_time_make(mrb, mrb_obj_class(mrb, self), f, tm->timezone);
+ if (!tm) return mrb_nil_value();
+
+ tm2 = mrb_get_datatype(mrb, other, &mrb_time_type);
+ if (tm2) {
+
+ f = (mrb_float)(tm->sec - tm2->sec)
+ + (mrb_float)(tm->usec - tm2->usec) / 1.0e6;
+ return mrb_float_value(f);
+ }
+ else {
+ mrb_get_args(mrb, "f", &f);
+ return mrb_time_make(mrb, mrb_obj_class(mrb, self), f, tm->timezone);
+ }
}
/* 15.2.19.7.30 */
@@ -367,7 +377,7 @@ mrb_time_wday(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_wday);
}
@@ -379,7 +389,7 @@ mrb_time_yday(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_check_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_yday);
}
@@ -391,7 +401,7 @@ mrb_time_year(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_year + 1900);
}
@@ -403,9 +413,9 @@ mrb_time_zone(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
- if(tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value();
- if(tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
+ if (tm->timezone <= MRB_TIMEZONE_NONE) return mrb_nil_value();
+ if (tm->timezone >= MRB_TIMEZONE_LAST) return mrb_nil_value();
return mrb_str_new_cstr(mrb, timezone_names[tm->timezone]);
}
@@ -419,7 +429,7 @@ mrb_time_asctime(mrb_state *mrb, mrb_value self)
char buf[256];
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
d = &tm->datetime;
snprintf(buf, 256, "%s %s %02d %02d:%02d:%02d %s%d",
wday_names[d->tm_wday], mon_names[d->tm_mon], d->tm_mday,
@@ -437,7 +447,7 @@ mrb_time_day(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_mday);
}
@@ -450,7 +460,7 @@ mrb_time_dstp(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_bool_value(tm->datetime.tm_isdst);
}
@@ -462,7 +472,7 @@ mrb_time_hour(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_hour);
}
@@ -520,7 +530,7 @@ mrb_time_localtime(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return self;
+ if (!tm) return self;
tm->timezone = MRB_TIMEZONE_LOCAL;
mrb_time_update_datetime(tm);
return self;
@@ -534,7 +544,7 @@ mrb_time_mday(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_mday);
}
@@ -546,7 +556,7 @@ mrb_time_min(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_min);
}
@@ -558,7 +568,7 @@ mrb_time_mon(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_mon + 1);
}
@@ -570,7 +580,7 @@ mrb_time_sec(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->datetime.tm_sec);
}
@@ -583,7 +593,7 @@ mrb_time_to_f(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_float_value((mrb_float)tm->sec + (mrb_float)tm->usec/1.0e6);
}
@@ -595,7 +605,7 @@ mrb_time_to_i(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->sec);
}
@@ -607,7 +617,7 @@ mrb_time_usec(mrb_state *mrb, mrb_value self)
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_fixnum_value(tm->usec);
}
@@ -633,7 +643,7 @@ mrb_time_utcp(mrb_state *mrb, mrb_value self)
{
struct mrb_time *tm;
tm = mrb_get_datatype(mrb, self, &mrb_time_type);
- if(!tm) return mrb_nil_value();
+ if (!tm) return mrb_nil_value();
return mrb_bool_value(tm->timezone == MRB_TIMEZONE_UTC);
}