diff options
| -rw-r--r-- | src/time.c | 66 |
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); } |
