}
assert_arg_to_cflags() {
- if ! add_arg_to_cflags $1 ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to CFLAGS" >&5
+ if ! add_arg_to_cflags "$1" ; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: cannot add $1 to CFLAGS" >&5
printf "%s\n" "cannot add $1 to CFLAGS" >&6; }; exit 1 ; fi
return 0
}
+if test "$ac_cv_sizeof_long" = "4" ; then
+ assert_arg_to_cflags "-D_TIME_BITS=64 -D_FILE_OFFSET_BITS=64"
+fi
+
+ac_fn_c_check_header_compile "$LINENO" "time.h" "ac_cv_header_time_h" "$ac_includes_default"
+if test "x$ac_cv_header_time_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_TIME_H 1" >>confdefs.h
+
+fi
+ac_fn_c_check_header_compile "$LINENO" "sys/time.h" "ac_cv_header_sys_time_h" "$ac_includes_default"
+if test "x$ac_cv_header_sys_time_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_SYS_TIME_H 1" >>confdefs.h
+
+fi
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking size of time_t" >&5
+printf %s "checking size of time_t... " >&6; }
+if test ${ac_cv_sizeof_time_t+y}
+then :
+ printf %s "(cached) " >&6
+else $as_nop
+ if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (time_t))" "ac_cv_sizeof_time_t" "#include <time.h>
+"
+then :
+
+else $as_nop
+ if test "$ac_cv_type_time_t" = yes; then
+ { { printf "%s\n" "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+printf "%s\n" "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (time_t)
+See \`config.log' for more details" "$LINENO" 5; }
+ else
+ ac_cv_sizeof_time_t=0
+ fi
+fi
+
+fi
+{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_time_t" >&5
+printf "%s\n" "$ac_cv_sizeof_time_t" >&6; }
+
+
+
+printf "%s\n" "#define SIZEOF_TIME_T $ac_cv_sizeof_time_t" >>confdefs.h
+
+
+if test "$use" != "mingw" ; then
+ if test "$ac_cv_sizeof_time_t" != "8" ; then
+ as_fn_error $? "Cannot define a 64 bit time_t" "$LINENO" 5
+ fi
+fi
+
+
+
#### Memory areas and alignment
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for byte order" >&5
#endif
}
-DEFUNM_NEW("LOCALTIME",object,fSlocaltime,SI,1,1,NONE,OI,OO,OO,OO,(fixnum t),"") {
+#if defined(__MINGW32__) /*FIXME range too small for maxima testsuite*/
+#undef gmtime
+#define gmtime _gmtime64
+#undef localtime
+#define localtime _localtime64
+#undef mktime
+#define mktime _mktime64
+#undef time_t
+#define time_t long long
+#endif
+
+static object
+time_t_to_object(time_t l) {
+ object x=new_bignum();
+
+ mpz_set_si(MP(x),l>>32);
+ mpz_mul_2exp(MP(x),MP(x),32);
+ mpz_add_ui(MP(x),MP(x),l&((1ULL<<32)-1));
+ return normalize_big(x);
+
+}
+
+static time_t
+object_to_time_t(object x) {
+
+ switch(type_of(x)) {
+ case t_fixnum:
+ return fix(x);
+ case t_bignum:
+ {
+ time_t h;
+ mpz_set_si(MP(big_fixnum3),1);
+ mpz_mul_2exp(MP(big_fixnum3),MP(big_fixnum3),31);
+ mpz_fdiv_qr(MP(big_fixnum1),MP(big_fixnum2),MP(x),MP(big_fixnum3));
+ massert(mpz_fits_slong_p(MP(big_fixnum1)));
+ massert(mpz_fits_slong_p(MP(big_fixnum2)));
+ h=mpz_get_si(MP(big_fixnum1));
+ h<<=31;
+ h+=mpz_get_si(MP(big_fixnum2));
+ return h;
+ }
+ default:
+ TYPE_ERROR(x,sLinteger);
+ }
+
+}
+
+DEFUNM_NEW("LOCALTIME",object,fSlocaltime,SI,1,1,NONE,OO,OO,OO,OO,(object t),"") {
+
#if defined NO_SYSTEM_TIME_ZONE /*solaris*/
return Cnil;
#else
+ time_t i=object_to_time_t(t);
+ struct tm *lt;
#if defined(__MINGW32__)
- fixnum gmt_hour=gmtime(&t)->tm_hour;
+ struct tm *gt;
+ fixnum gmt_hour;
+ massert(gt=gmtime(&i));
+ gmt_hour=gt->tm_hour;
#endif
- struct tm *lt=localtime(&t);
+ massert(lt=localtime(&i));
RETURN(11,object,
make_fixnum(lt->tm_sec),
}
-DEFUNM_NEW("GMTIME",object,fSgmtime,SI,1,1,NONE,OI,OO,OO,OO,(fixnum t),"") {
+DEFUNM_NEW("GMTIME",object,fSgmtime,SI,1,1,NONE,OO,OO,OO,OO,(object t),"") {
#if defined NO_SYSTEM_TIME_ZONE /*solaris*/
return Cnil;
#else
- struct tm *lt=gmtime(&t);
+
+ time_t i=object_to_time_t(t);
+ struct tm *gt;
+ massert(gt=gmtime(&i));
+
RETURN(11,object,
- make_fixnum(lt->tm_sec),
+ make_fixnum(gt->tm_sec),
(
- RV(make_fixnum(lt->tm_min)),
- RV(make_fixnum(lt->tm_hour)),
- RV(make_fixnum(lt->tm_mday)),
- RV(make_fixnum(lt->tm_mon)),
- RV(make_fixnum(lt->tm_year)),
- RV(make_fixnum(lt->tm_wday)),
- RV(make_fixnum(lt->tm_yday)),
- RV(make_fixnum(lt->tm_isdst)),
+ RV(make_fixnum(gt->tm_min)),
+ RV(make_fixnum(gt->tm_hour)),
+ RV(make_fixnum(gt->tm_mday)),
+ RV(make_fixnum(gt->tm_mon)),
+ RV(make_fixnum(gt->tm_year)),
+ RV(make_fixnum(gt->tm_wday)),
+ RV(make_fixnum(gt->tm_yday)),
+ RV(make_fixnum(gt->tm_isdst)),
#if defined(__MINGW32__)
RV(make_fixnum(0)),
RV(Cnil)
#else
- RV(make_fixnum(lt->tm_gmtoff)),
- RV(make_simple_string(lt->tm_zone))
+ RV(make_fixnum(gt->tm_gmtoff)),
+ RV(make_simple_string(gt->tm_zone))
#endif
));
#endif
DEFUNM_NEW("MKTIME",object,fSmktime,SI,6,6,NONE,OI,II,II,IO,(fixnum s,fixnum n,fixnum h,fixnum d,fixnum m,fixnum y),"") {
struct tm lt;
+ time_t t;
lt.tm_sec=s;
lt.tm_min=n;
lt.tm_year=y;
lt.tm_isdst=-1;
- RETURN(2,object,make_fixnum(mktime(<)),(RV(make_fixnum(lt.tm_isdst))));
+ massert((t=mktime(<))!=-1);
+ RETURN(2,object,time_t_to_object(t),(RV(make_fixnum(lt.tm_isdst))));
}