-/* Convert string representation of a number into an uintmax_t value.
- Copyright 2001 Free Software Foundation, Inc.
+/* Convert string representation of a number into an intmax_t value.
+ Copyright 1999, 2001 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
# endif
#endif
-#ifdef STRTOUXMAX_UNSIGNED
+/* Verify a requirement at compile-time (unlike assert, which is runtime). */
+#define verify(name, assertion) struct name { char a[(assertion) ? 1 : -1]; }
+
+#ifdef UNSIGNED
# ifndef HAVE_DECL_STRTOUL
"this configure-time declaration test was not run"
# endif
# endif
#endif
-#ifndef STRTOUXMAX_UNSIGNED
-# define strtoumax strtoimax
-# define uintmax_t intmax_t
-# define strtoull strtoll
-# define strtoul strtol
+#ifdef UNSIGNED
+# define INT uintmax_t
+# define strtoimax strtoumax
+# define strtol strtoul
+# define strtoll strtoull
+#else
+# define INT intmax_t
#endif
-uintmax_t
-strtoumax (char const *ptr, char **endptr, int base)
+INT
+strtoimax (char const *ptr, char **endptr, int base)
{
-#define USE_IF_EQUIVALENT(function) \
- if (sizeof (uintmax_t) == sizeof function (ptr, endptr, base)) \
- return function (ptr, endptr, base);
-
#if HAVE_UNSIGNED_LONG_LONG
- USE_IF_EQUIVALENT (strtoull)
-#endif
-
- USE_IF_EQUIVALENT (strtoul)
+ verify (size_is_that_of_long_or_long_long,
+ (sizeof (INT) == sizeof strtol (ptr, endptr, base)
+ || sizeof (INT) == sizeof strtoll (ptr, endptr, base)));
- abort ();
-}
+ if (sizeof (INT) != sizeof strtol (ptr, endptr, base))
+ return strtoll (ptr, endptr, base);
+#else
+ verify (size_is_that_of_long,
+ sizeof (INT) == sizeof strtol (ptr, endptr, base));
+#endif
-#ifdef TESTING
-# include <stdio.h>
-int
-main ()
-{
- char *p, *endptr;
- printf ("sizeof xintmax_t: %d\n", sizeof (uintmax_t));
- printf ("sizeof strtoxll(): %d\n", sizeof strtoull(p, &endptr, 10));
- printf ("sizeof strtoxl(): %d\n", sizeof strtoul(p, &endptr, 10));
- exit (0);
+ return strtol (ptr, endptr, base);
}
-#endif