diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2012-03-16 03:00:48 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2012-05-23 14:36:24 -0700 |
commit | 68605433483b08e8a31541d833bf92ff3ecad75c (patch) | |
tree | 393f517cda29f215bd11cde8204be5c7f8049ce4 | |
parent | 03cf7fe31be5964707a54ed82969b9c181f8dd99 (diff) | |
download | glibc-68605433483b08e8a31541d833bf92ff3ecad75c.tar glibc-68605433483b08e8a31541d833bf92ff3ecad75c.tar.gz glibc-68605433483b08e8a31541d833bf92ff3ecad75c.tar.bz2 glibc-68605433483b08e8a31541d833bf92ff3ecad75c.zip |
mktime: remove incorrect attempt at unusual arithmetics
* time/mktime.c (TYPE_ONES_COMPLEMENT, TYPE_SIGNED_MAGNITUDE): Remove.
The code didn't really work on such machines anyway.
(TYPE_MINIMUM): Assume two's complement.
(twos_complement_arithmetic): Verify that long_int and time_t
are two's complement (or unsigned, in the latter case).
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | time/mktime.c | 15 |
2 files changed, 13 insertions, 9 deletions
@@ -1,5 +1,12 @@ 2012-05-23 Paul Eggert <eggert@cs.ucla.edu> + mktime: remove incorrect attempt at unusual arithmetics + * time/mktime.c (TYPE_ONES_COMPLEMENT, TYPE_SIGNED_MAGNITUDE): Remove. + The code didn't really work on such machines anyway. + (TYPE_MINIMUM): Assume two's complement. + (twos_complement_arithmetic): Verify that long_int and time_t + are two's complement (or unsigned, in the latter case). + mktime: check signed shifts on long_int and time_t, too * time/mktime.c (SHR): Check that shifts work as desired on the types long_int and time_t too, as SHR is used on diff --git a/time/mktime.c b/time/mktime.c index 5144987708..652a0f2d4a 100644 --- a/time/mktime.c +++ b/time/mktime.c @@ -104,12 +104,8 @@ verify (long_int_is_wide_enough, INT_MAX == INT_MAX * (long_int) 2 / 2); #define TYPE_IS_INTEGER(t) ((t) 1.5 == 1) /* True if negative values of the signed integer type T use two's - complement, ones' complement, or signed magnitude representation, - respectively. Much GNU code assumes two's complement, but some - people like to be portable to all possible C hosts. */ + complement, or if T is an unsigned integer type. */ #define TYPE_TWOS_COMPLEMENT(t) ((t) ~ (t) 0 == (t) -1) -#define TYPE_ONES_COMPLEMENT(t) ((t) ~ (t) 0 == 0) -#define TYPE_SIGNED_MAGNITUDE(t) ((t) ~ (t) 0 < (t) -1) /* True if the arithmetic type T is signed. */ #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1)) @@ -121,9 +117,7 @@ verify (long_int_is_wide_enough, INT_MAX == INT_MAX * (long_int) 2 / 2); #define TYPE_MINIMUM(t) \ ((t) (! TYPE_SIGNED (t) \ ? (t) 0 \ - : TYPE_SIGNED_MAGNITUDE (t) \ - ? ~ (t) 0 \ - : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))) + : ~ TYPE_MAXIMUM (t))) #define TYPE_MAXIMUM(t) \ ((t) (! TYPE_SIGNED (t) \ ? (t) -1 \ @@ -138,7 +132,10 @@ verify (long_int_is_wide_enough, INT_MAX == INT_MAX * (long_int) 2 / 2); #define TIME_T_MIDPOINT (SHR (TIME_T_MIN + TIME_T_MAX, 1) + 1) verify (time_t_is_integer, TYPE_IS_INTEGER (time_t)); -verify (twos_complement_arithmetic, TYPE_TWOS_COMPLEMENT (int)); +verify (twos_complement_arithmetic, + (TYPE_TWOS_COMPLEMENT (int) + && TYPE_TWOS_COMPLEMENT (long_int) + && TYPE_TWOS_COMPLEMENT (time_t))); #define EPOCH_YEAR 1970 #define TM_YEAR_BASE 1900 |