From: Paul Eggert Date: Mon, 7 Jul 2003 23:12:25 +0000 (+0000) Subject: * mktime.c: Fix some boundary cases and remove need for floating point. X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c0dec92e172398fee68192aed4f20cc2781c4406;p=pspp * mktime.c: Fix some boundary cases and remove need for floating point. --- diff --git a/lib/ChangeLog b/lib/ChangeLog index 2660556645..feb12ae5bb 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,58 @@ +2003-07-07 Paul Eggert + + * mktime.c: Fix some boundary cases and remove need for floating point. + + Issue a compile-time diagnostic if time_t is floating point, or if + two's complement arithmetic is not in effect, or if arithmetic + right shift does not propagate the sign. These assumptions were + all in the original code but they weren't checked. + + (TIME_T_MIDPOINT, verify): New macros. + (__isleap): Remove; it has integer overflow problems. + (leapyear): New function, without those problems. + (ydhms_tm_diff): Remove; splitting into two parts. + (ydhms_diff): New function, containing the arithmetic part of + the old ydhms_tm_diff function. Issue a compile-time + diagnostic if we are not using C99 integer division. + Avoid casts when possible. + (guess_time_tm): New function, containing the checking part of + the old ydhms_tm_diff function. Return the new value, rather than + the difference between it and the old. Accept a new argument T + so that *T specifies the old value. Check for overflow in the result. + + (__mktime_internal): Use a time_t offset, not a long int offset. + This undoes the 2003-06-04 change, which is no longer needed now + that we have better overflow checking. + (localtime_offset): Likewise. + + (__mktime_internal): Avoid harmful overflow on hosts where time_t + and long are 64-bit but int is only 32-bit. + (ydhms_diff): Use long int to store year1 and yday1. + Issue a compile-time diagnostic if long int is not wide enough. + + (__mktime_internal): Use long int to store adjusted year and yday. + Use plain C rather than preprocessor commands, if that doesn't + affect efficiency. + Check for overflow (and try to repair) after each probe + rather than checking only at the very end. This avoids some bugs + (e.g., southern hemisphere, behind GMT, and GMT offset at minimum time + does not equal GMT offset at maximum time). + Use integer to check for overflow rather than floating point; this + is more portable to non-IEEE hosts, and is a tad faster. + When we detect that we are oscillating between two values, + don't check whether tm_isdst has the requested value, since + we already know the answer. When tm_isdst has the wrong value, + use a different heuristic to find the right one, based on the + extreme values actually observed in practice in tz2003a, + rather than the (overly optimistic) "previous 3 calendar quarters". + + (not_equal_tm, print_tm, check_result): Use "const T" rather than + "T const" to accommodate glibc style. + (check_result): Use less-confusing report format. "long" -> "long int. + (main): Likewise. + Don't loop if the iteration overflows time_t. + Allow a negative step in the iteration. + 2003-07-01 Paul Eggert * xreadlink.c: Include unconditionally, instead of @@ -106,6 +161,11 @@ 2003-06-05 Paul Eggert + * mktime.c (__mktime_internal): When resolving a tm_isdst + mismatch, look in future quarters as well as past. This fixes a + bug when processing fall-backwards gaps immediately after a long + period of daylight-saving time. + * mktime.c: Assume freestanding C89 or better. (HAVE_LIMITS_H): Remove. Assume it's 1. (__P): Remove; not used.