Ken Pizzini <tz.@explicate.org> writes:
On one of my ia386 systems which uses $ gcc -v 2>&1 | grep version gcc version 3.3.6 (Gentoo 3.3.6, ssp-3.3.6-1.0, pie-8.7.8) there is no LLONG_MAX defined in stdint.h, but INT64_MAX is defined.
Well, LLONG_MAX would be in limits.h, not stdint.h. But I checked a x86 GNU/Linux host and I see now that in this environment, LLONG_MAX is not defined, because GCC's <limits.h> has something like this: #if __STDC_VERSION__ >= 199901L # define LLONG_MAX __LONG_LONG_MAX__ #endif and GCC by default doesn't set __STDC_VERSION__ to 199901L, even though it has 'long long' (because it doesn't fully support all of C99). Also, I noticed that this environment has had stdint.h for quite some time, but our current method of guessing HAVE_STDINT_H misses this. GNU/Linux is a pretty common case these days. Here's a patch to private.h that should fix both glitches, so that the tz code works even with pre-C99 GCC and glibc implementations (the usual case today). This patch assumes my earlier patches to private.h. --- private.h 2006/02/23 06:18:32 2006.2.0.5 +++ private.h 2006/02/23 21:16:15 2006.2.0.7 @@ -48,10 +48,6 @@ static char privatehid[] = "@(#)private. #define HAVE_SETTIMEOFDAY 3 #endif /* !defined HAVE_SETTIMEOFDAY */ -#ifndef HAVE_STDINT_H -#define HAVE_STDINT_H (199901 <= __STDC_VERSION__) -#endif /* !defined HAVE_STDINT_H */ - #ifndef HAVE_STRERROR #define HAVE_STRERROR 1 #endif /* !defined HAVE_STRERROR */ @@ -128,20 +124,30 @@ static char privatehid[] = "@(#)private. /* Unlike <ctype.h>'s isdigit, this also works if c < 0 | c > UCHAR_MAX. */ #define is_digit(c) ((unsigned)(c) - '0' <= 9) +/* Define HAVE_STDINT_H's default value here, rather than at the + start, since __GLIBC__'s value depends on previously-included + files. (glibc 2.1 and later have stdint.h, even with pre-C99 + compilers.) */ +#ifndef HAVE_STDINT_H +#define HAVE_STDINT_H \ + (199901 <= __STDC_VERSION__ || 2 < (__GLIBC__ + (0 < __GLIBC_MINOR__))) +#endif /* !defined HAVE_STDINT_H */ + #if HAVE_STDINT_H #include <stdint.h> #endif /* !HAVE_STDINT_H */ #ifndef INT_FAST64_MAX -#ifdef LLONG_MAX +/* Pre-C99 GCC compilers define __LONG_LONG_MAX__ instead of LLONG_MAX. */ +#if defined LLONG_MAX || defined __LONG_LONG_MAX__ typedef long long int_fast64_t; -#else /* !defined LLONG_MAX */ +#else /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */ #if (LONG_MAX >> 31) < 0xffffffff Please use a compiler that supports a 64-bit integer type (or wider); you may need to compile with "-DHAVE_STDINT_H". #endif /* (LONG_MAX >> 31) < 0xffffffff */ typedef long int_fast64_t; -#endif /* !defined LLONG_MAX */ +#endif /* ! (defined LLONG_MAX || defined __LONG_LONG_MAX__) */ #endif /* !defined INT_FAST64_MAX */ #ifndef INT32_MAX