I've confirmed that the integer size issues are the reason for the hash
target failure on 64-bit platforms. Initial testing of a SpamProbe
package I compiled seems to indicate that making these the appropriate
types fixes the issue.

I've attached a suggested patch. It uses stdint.h to get portable 32-bit
 wide integer types so it should be platform independent. Compiles fine
under gcc and although stdint.h is C99, it also appear to be POSIX
mandated and I guess it should compile fine under non-gcc compilers as
well without needing any C99 related flags.

Francis
diff -Nur spamprobe-1.4d/src/database/WordArray.h spamprobe-1.4d.new/src/database/WordArray.h
--- spamprobe-1.4d/src/database/WordArray.h	2006-11-17 07:24:48.000000000 +0000
+++ spamprobe-1.4d.new/src/database/WordArray.h	2010-01-10 22:28:02.254603603 +0000
@@ -31,6 +31,8 @@
 #ifndef _WordArray_h
 #define _WordArray_h
 
+#include <stdint.h>
+
 class WordData;
 
 class WordArray
@@ -47,7 +49,7 @@
     FLAGS_SIZE = 2,
   };
 
-  typedef unsigned long key_t;
+  typedef uint32_t key_t;
 
   void reset(char *buffer,
              int num_words);
diff -Nur spamprobe-1.4d/src/includes/hash.h spamprobe-1.4d.new/src/includes/hash.h
--- spamprobe-1.4d/src/includes/hash.h	2006-11-17 07:14:30.000000000 +0000
+++ spamprobe-1.4d.new/src/includes/hash.h	2010-01-10 22:29:00.482854758 +0000
@@ -10,11 +10,13 @@
 #ifndef _jenkinshash_h
 #define _jenkinshash_h
 
+#include <stdint.h>
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-typedef  unsigned long  int  ub4;   /* unsigned 4-byte quantities */
+typedef             uint32_t ub4;   /* unsigned 4-byte quantities */
 typedef  unsigned       char ub1;   /* unsigned 1-byte quantities */
 
 #define hashsize(n) ((ub4)1<<(n))

Reply via email to