build: don't assume uintmax_t is 64 bits
authorPádraig Brady <P@draigBrady.com>
Tue, 30 Oct 2012 02:15:36 +0000 (02:15 +0000)
committerPádraig Brady <P@draigBrady.com>
Sun, 4 Nov 2012 00:49:04 +0000 (00:49 +0000)
This was not seen to be an issue in practise,
but to make the code more robust, don't assume
uintmax_t is 64 bits.

* src/factor.c (W_TYPE_SIZE): Define based on integer limits.
* src/make-prime-list.c (output_primes): Define format width
based on integer limits.

src/factor.c
src/make-prime-list.c

index be5a36c..1d66717 100644 (file)
 #if USE_LONGLONG_H
 
 /* Make definitions for longlong.h to make it do what it can do for us */
-# define W_TYPE_SIZE 64          /* bitcount for uintmax_t */
+
+/* bitcount for uintmax_t */
+#if UINTMAX_MAX == UINT32_MAX
+# define W_TYPE_SIZE 32
+#elif UINTMAX_MAX == UINT64_MAX
+# define W_TYPE_SIZE 64
+#elif UINTMAX_MAX == UINT128_MAX
+# define W_TYPE_SIZE 128
+#endif
+
 # define UWtype  uintmax_t
 # define UHWtype unsigned long int
 # undef UDWtype
index 98eef8f..a4c0a3b 100644 (file)
@@ -78,12 +78,20 @@ output_primes (const struct prime *primes, unsigned nprimes)
       exit (EXIT_FAILURE);
     }
 
+#if UINTMAX_MAX == UINT32_MAX
+# define SZ "8" /* 8 hex digits.  */
+#elif UINTMAX_MAX == UINT64_MAX
+# define SZ "16" /* 16 hex digits.  */
+#elif UINTMAX_MAX == UINT128_MAX
+# define SZ "32" /* 32 hex digits.  */
+#endif
+
   for (i = 0, p = 2; i < nprimes; i++)
     {
       unsigned int d8 = i + 8 < nprimes ? primes[i + 8].p - primes[i].p : 0xff;
       if (255 < d8) /* this happens at 668221 */
         abort ();
-      printf ("P (%2u, %3u, 0x%016"PRIxMAX"%s, 0x%016"PRIxMAX"%s) /* %d */\n",
+      printf ("P (%2u, %3u, 0x%0"SZ PRIxMAX"%s, 0x%0"SZ PRIxMAX"%s) /* %d */\n",
               primes[i].p - p, d8,
               primes[i].pinv, suffix,
               primes[i].lim, suffix, primes[i].p);