Always signal an error if time returns -1. Not uses errno-error as

only few systems set errno if mktime fails.
This commit is contained in:
mainzelm 2002-02-26 10:53:32 +00:00
parent 11972910cd
commit 13dabb8f4e
2 changed files with 18 additions and 20 deletions

View File

@ -113,6 +113,7 @@
(if (pair? args)
(if (null? (cdr args))
(let ((date (check-arg date? (car args) time)))
(let ((err?.time
(%date->time (date:seconds date)
(date:minute date)
(date:hour date)
@ -121,7 +122,10 @@
(date:year date)
(date:tz-name date) ; #f or string
(date:tz-secs date) ; #f or int
(date:summer? date)))
(date:summer? date))))
(if (car err?.time)
(error "Error converting date to time." args)
(cdr err?.time))))
(error "Too many arguments to TIME procedure" args))
(%time))) ; Fast path for (time).

View File

@ -224,7 +224,7 @@ s48_value date2time(s48_value sec, s48_value min, s48_value hour,
{
time_t t;
struct tm d;
int err = 0;
d.tm_sec = s48_extract_fixnum (sec);
d.tm_min = s48_extract_fixnum (min);
d.tm_hour = s48_extract_fixnum (hour);
@ -238,12 +238,8 @@ s48_value date2time(s48_value sec, s48_value min, s48_value hour,
environ = utc_env; /* time temporarily. */
tzset(); /* NetBSD, SunOS POSIX-noncompliance requires this. */
d.tm_isdst = 0; /* FreeBSD, at least, needs this or it sulks. */
errno = 0;
t = mktime(&d);
/* t == -1 => you probably have an error. */
if ((t == -1) && (errno != 0))
/* Sorry, we only have a version with 5 arguments..*/
s48_raise_os_error_5 (errno, sec, min, hour, mday, month);
if (t == -1) err = 1;
t -= s48_extract_fixnum(tz_secs);
environ = oldenv;
}
@ -260,8 +256,7 @@ s48_value date2time(s48_value sec, s48_value min, s48_value hour,
d.tm_isdst = -1;
t = mktime(&d);
if ((t == -1) && (errno != 0))
s48_raise_os_error_5 (errno, sec, min, hour, mday, month);
if (t == -1) err = 1;
revert_env(oldenv);
}
@ -270,11 +265,10 @@ s48_value date2time(s48_value sec, s48_value min, s48_value hour,
errno = 0;
d.tm_isdst = -1;
t = mktime(&d);
if ((t == -1) && (errno != 0))
s48_raise_os_error_5 (errno, sec, min, hour, mday, month);
if (t == -1) err = 1;
}
return s48_enter_integer(t);
return s48_cons (err ? S48_TRUE : S48_FALSE, s48_enter_integer(t));
}