summaryrefslogtreecommitdiff
path: root/lib/strtol.c
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2005-03-15 00:40:17 +0000
committerPaul Eggert <eggert@cs.ucla.edu>2005-03-15 00:40:17 +0000
commit53d430be4ed31bb7ad94fa2b7676ecc889d447e2 (patch)
treedea23dc12eeb3a5d6108f58ee0b10cd984c1e005 /lib/strtol.c
parent2f82566ff2228a7d96d58d378fb6070d849124f1 (diff)
downloadcoreutils-53d430be4ed31bb7ad94fa2b7676ecc889d447e2.tar.xz
Sync mktime.c and strtol.c macros from intprops.h.
Diffstat (limited to 'lib/strtol.c')
-rw-r--r--lib/strtol.c30
1 files changed, 19 insertions, 11 deletions
diff --git a/lib/strtol.c b/lib/strtol.c
index a95a76508..e4b0a2f24 100644
--- a/lib/strtol.c
+++ b/lib/strtol.c
@@ -127,24 +127,32 @@ extern int errno;
/* The extra casts in the following macros work around compiler bugs,
e.g., in Cray C 5.0.3.0. */
+/* True if negative values of the signed integer type T use twos
+ complement, ones complement, or signed magnitude representation,
+ respectively. Much GNU code assumes twos complement, but some
+ people like to be portable to all possible C hosts. */
+#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. */
-# ifndef TYPE_SIGNED
-# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
-# endif
+# define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
/* The maximum and minimum values for the integer type T. These
macros have undefined behavior if T is signed and has padding bits
(i.e., bits that do not contribute to the value), or if T uses
signed-magnitude representation. If this is a problem for you,
please let us know how to fix it for your host. */
-# ifndef TYPE_MINIMUM
-# define TYPE_MINIMUM(t) ((t) (TYPE_SIGNED (t) \
- ? ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1) \
- : (t) 0))
-# endif
-# ifndef TYPE_MAXIMUM
-# define TYPE_MAXIMUM(t) ((t) (~ (t) 0 - TYPE_MINIMUM (t)))
-# endif
+# define TYPE_MINIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) 0 \
+ : TYPE_SIGNED_MAGNITUDE (t) \
+ ? ~ (t) 0 \
+ : ~ (t) 0 << (sizeof (t) * CHAR_BIT - 1)))
+# define TYPE_MAXIMUM(t) \
+ ((t) (! TYPE_SIGNED (t) \
+ ? (t) -1 \
+ : ~ (~ (t) 0 << (sizeof (t) * CHAR_BIT - 1))))
# ifndef ULONG_LONG_MAX
# define ULONG_LONG_MAX TYPE_MAXIMUM (unsigned long long)