On Sat, Jun 26, 2010 at 05:25:31AM +0200, Joerg Sonnenberger wrote: > On Sat, Jun 26, 2010 at 05:11:39AM +0200, Alistair Crooks wrote: > > On Sat, Jun 26, 2010 at 01:32:05AM +0200, Joerg Sonnenberger wrote: > > > On Fri, Jun 25, 2010 at 11:54:32PM +0200, Alistair Crooks wrote: > > > > Even in C99, the "%lu" method will work unless size_t is bigger > > > > than > > > > unsigned long *and* the value being printed exceeds ULONG_MAX, > > > > which > > > > is unlikely to happen in practice. > > > > Please get the attributions right - I was quoting that text. > > > > > Actually, it doesn't. This method breaks as soon as size_t != u_long and > > > might only work in a few edge cases like the size_t being the last > > > argument and the byte order is Little Endian. This is worse because IIRC > > > Microsoft decided to use IL32LLP64 or something similarly fancy. > > > > Can you give us a reference to this, please? > > E.g. > http://stackoverflow.com/questions/384502/what-is-the-bit-size-of-long-on-64-bit-windows > and the MSDN reference inside. > > > > A more portable approach with autoconf can be found in pkg_install, look > > > for MISSING_SIZE_T_SUPPORT and the corresponding AC_CHECK_SIZEOF calls > > > in configure.ac. > > > > Hmmm, I see this in configure.ac - > > > > AC_CHECK_SIZEOF(int) > > AC_CHECK_SIZEOF(long) > > AC_CHECK_SIZEOF(long long) > > AC_CHECK_SIZEOF(size_t, [#include <stdlib.h>]) > > ...compute the sizes to not depend on SIZE_MAX (which would simplify the > logic a lot). > > > and > > > > case $host in > > *-*-hpux*) > > AC_DEFINE(MISSING_SIZE_T_SUPPORT) > > AH_TEMPLATE([MISSING_SIZE_T_SUPPORT], [ > > Define to 1 if the `z' modifider for printf is missing. > > ]) > > ;; > > esac > > The only platform for pkgsrc purposes ATM which lacks the %z support.
It would be better to make this a check which is size_t dependent, rather than platform-dependent. > > and > > > > #ifndef MISSING_SIZE_T_SUPPORT > > # define PRIzu "zu" > > #elif SIZEOF_SIZE_T == SIZEOF_INT > > # define PRIzu "u" > > #elif SIZEOF_SIZE_T == SIZEOF_LONG > > # define PRIzu "lu" > > #elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG > > # define PRIzu "llu" > > #else > > # errror "Unknown size_t size" > > #endif > > > > Not quite what I'd been expecting, though, from the glowing description > > above. > > It would be simpler if SIZE_MAX support can be assumed. In that case it > would boil down to > #if SIZE_MAX == INT_MAX > #define PRIzu "u" > #elif SIZE_MAX == LONG_MAX > #define PRIzu "lu" > #else SIZE_MAX == LLONG_MAX > #define PRIzu "llu" > #endif That is even worse, though. I still don't understand why autoconf is passing C pre-processor directives down. #if sizeof(size_t) == sizeof(int) ... #elif sizeof(size_t) == sizeof(long) ... #endif directly in the code is much more readable. Regards, Alistair