changeset 4418:f281691fdb0b

* mktime.c: Fix some boundary cases and remove need for floating point.
author Paul Eggert <eggert@cs.ucla.edu>
date Mon, 07 Jul 2003 23:12:25 +0000
parents 5cf298f2f367
children 9b828c973b9d
files lib/ChangeLog
diffstat 1 files changed, 60 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/lib/ChangeLog
+++ b/lib/ChangeLog
@@ -1,3 +1,58 @@
+2003-07-07  Paul Eggert  <eggert@twinsun.com>
+
+	* 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  <eggert@twinsun.com>
 
 	* xreadlink.c: Include <sys/types.h> unconditionally, instead of
@@ -106,6 +161,11 @@
 
 2003-06-05  Paul Eggert  <eggert@twinsun.com>
 
+	* 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.