From d40e8bd6d7956f757bffd34c7288fd996e617c1e Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Thu, 31 Oct 2019 19:38:03 -0700 Subject: lib: don't assume time_t is signed. We introduce the function c_time to convert a Lisp integer to time_t, and num_time to do the reverse conversion. The FFI type time-t already does this right. (See registration of time-t in ffi_init_extra_types). * hash.c (gen_hash_seed): The first value out of time_sec_usec corresponds to a time_t value. We now convert this to C number using c_time rather than c_num. Also, while we are touching this code, the microseconds value can convert directly to ucnum with c_unum. * lib.c (time_sec_usec): Use num_time for seconds. (time_string_local, time_string_utc, time_fields_local, time_fields_utc, time_struct_local, time_struct_utc): Use c_time. (make_time_impl, time_parse_utc): Use num_time instead of num. * signal.h (getitimer_wrap, setitimer_wrap): Convert tv_sec members of struct timeval using c_time and num_time. * sysif.c (c_time, num_time): New functions. (stat_to_struct): Convert st_atime, st_mtime and st_ctime to Lisp using num_time instead of num. * sysif.c (c_time, num_time): Declared. --- signal.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) (limited to 'signal.c') diff --git a/signal.c b/signal.c index 245e2cc7..a5f91ccd 100644 --- a/signal.c +++ b/signal.c @@ -40,6 +40,7 @@ #endif #include "lib.h" #include "gc.h" +#include "sysif.h" #include "signal.h" #include "unwind.h" #include "eval.h" @@ -396,8 +397,8 @@ val getitimer_wrap(val which) if (getitimer(c_num(which), &itv) < 0) return nil; - return list(tv_to_usec(num(itv.it_interval.tv_sec), num(itv.it_interval.tv_usec)), - tv_to_usec(num(itv.it_value.tv_sec), num(itv.it_value.tv_usec)), + return list(tv_to_usec(num_time(itv.it_interval.tv_sec), num(itv.it_interval.tv_usec)), + tv_to_usec(num_time(itv.it_value.tv_sec), num(itv.it_value.tv_usec)), nao); } @@ -406,16 +407,16 @@ val setitimer_wrap(val which, val interval, val currval) struct itimerval itn, itv; const val meg = num_fast(1000000); - itn.it_interval.tv_sec = c_num(trunc(interval, meg)); + itn.it_interval.tv_sec = c_time(trunc(interval, meg)); itn.it_interval.tv_usec = c_num(mod(interval, meg)); - itn.it_value.tv_sec = c_num(trunc(currval, meg)); + itn.it_value.tv_sec = c_time(trunc(currval, meg)); itn.it_value.tv_usec = c_num(mod(currval, meg)); if (setitimer(c_num(which), &itn, &itv) < 0) return nil; - return list(tv_to_usec(num(itv.it_interval.tv_sec), num(itv.it_interval.tv_usec)), - tv_to_usec(num(itv.it_value.tv_sec), num(itv.it_value.tv_usec)), + return list(tv_to_usec(num_time(itv.it_interval.tv_sec), num(itv.it_interval.tv_usec)), + tv_to_usec(num_time(itv.it_value.tv_sec), num(itv.it_value.tv_usec)), nao); } -- cgit v1.2.3