summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-time/src
diff options
context:
space:
mode:
Diffstat (limited to 'mrbgems/mruby-time/src')
-rw-r--r--mrbgems/mruby-time/src/time.c44
1 files changed, 23 insertions, 21 deletions
diff --git a/mrbgems/mruby-time/src/time.c b/mrbgems/mruby-time/src/time.c
index c6680056a..e76e11649 100644
--- a/mrbgems/mruby-time/src/time.c
+++ b/mrbgems/mruby-time/src/time.c
@@ -11,12 +11,11 @@
#include <mruby.h>
#include <mruby/class.h>
#include <mruby/data.h>
+#include <mruby/numeric.h>
#include <mruby/time.h>
#include <mruby/string.h>
-#ifndef MRB_DISABLE_STDIO
-#include <stdio.h>
-#else
+#ifdef MRB_DISABLE_STDIO
#include <string.h>
#endif
@@ -76,11 +75,6 @@ double round(double x) {
/* define following macro to use probably faster timegm() on the platform */
/* #define USE_SYSTEM_TIMEGM */
-/* time_t */
-/* If your platform supports time_t as uint (e.g. uint32_t, uint64_t), */
-/* uncomment following macro. */
-/* #define MRB_TIME_T_UINT */
-
/** end of Time class configuration */
#ifndef NO_GETTIMEOFDAY
@@ -214,15 +208,22 @@ typedef mrb_int mrb_sec;
#define mrb_sec_value(mrb, sec) mrb_fixnum_value(sec)
#endif
-#ifdef MRB_TIME_T_UINT
-typedef uint64_t mrb_time_int;
-# define MRB_TIME_MIN 0
-# define MRB_TIME_MAX (sizeof(time_t) <= 4 ? UINT32_MAX : UINT64_MAX)
-#else
-typedef int64_t mrb_time_int;
-# define MRB_TIME_MIN (sizeof(time_t) <= 4 ? INT32_MIN : INT64_MIN)
-# define MRB_TIME_MAX (sizeof(time_t) <= 4 ? INT32_MAX : INT64_MAX)
-#endif
+#define MRB_TIME_T_UINT (~(time_t)0 > 0)
+#define MRB_TIME_MIN ( \
+ MRB_TIME_T_UINT ? 0 : \
+ (sizeof(time_t) <= 4 ? INT32_MIN : INT64_MIN) \
+)
+#define MRB_TIME_MAX ( \
+ MRB_TIME_T_UINT ? (sizeof(time_t) <= 4 ? UINT32_MAX : UINT64_MAX) : \
+ (sizeof(time_t) <= 4 ? INT32_MAX : INT64_MAX) \
+)
+
+static mrb_bool
+fixable_time_t_p(time_t v)
+{
+ if (MRB_INT_MIN <= MRB_TIME_MIN && MRB_TIME_MAX <= MRB_INT_MAX) return TRUE;
+ return FIXABLE(v);
+}
static time_t
mrb_to_time_t(mrb_state *mrb, mrb_value obj, time_t *usec)
@@ -236,7 +237,7 @@ mrb_to_time_t(mrb_state *mrb, mrb_value obj, time_t *usec)
mrb_float f = mrb_float(obj);
mrb_check_num_exact(mrb, f);
- if (f > (mrb_float)MRB_TIME_MAX || (mrb_float)MRB_TIME_MIN > f) {
+ if (f >= ((mrb_float)MRB_TIME_MAX-1.0) || f < ((mrb_float)MRB_TIME_MIN+1.0)) {
goto out_of_range;
}
@@ -255,7 +256,8 @@ mrb_to_time_t(mrb_state *mrb, mrb_value obj, time_t *usec)
{
mrb_int i = mrb_int(mrb, obj);
- if ((mrb_time_int)i > MRB_TIME_MAX || MRB_TIME_MIN > i) {
+ if ((MRB_INT_MAX > MRB_TIME_MAX && i > 0 && i > (mrb_int)MRB_TIME_MAX) ||
+ (MRB_TIME_MIN > MRB_INT_MIN && MRB_TIME_MIN > i)) {
goto out_of_range;
}
@@ -868,7 +870,7 @@ mrb_time_to_i(mrb_state *mrb, mrb_value self)
tm = time_get_ptr(mrb, self);
#ifndef MRB_WITHOUT_FLOAT
- if (tm->sec > MRB_INT_MAX || tm->sec < MRB_INT_MIN) {
+ if (!fixable_time_t_p(tm->sec)) {
return mrb_float_value(mrb, (mrb_float)tm->sec);
}
#endif
@@ -884,7 +886,7 @@ mrb_time_usec(mrb_state *mrb, mrb_value self)
tm = time_get_ptr(mrb, self);
#ifndef MRB_WITHOUT_FLOAT
- if (tm->usec > MRB_INT_MAX || tm->usec < MRB_INT_MIN) {
+ if (!fixable_time_t_p(tm->usec)) {
return mrb_float_value(mrb, (mrb_float)tm->usec);
}
#endif