]> sjero.net Git - wget/commitdiff
[svn] Better INT_MAX and UCHAR_MAX checks.
authorhniksic <devnull@localhost>
Wed, 12 Nov 2003 00:42:09 +0000 (16:42 -0800)
committerhniksic <devnull@localhost>
Wed, 12 Nov 2003 00:42:09 +0000 (16:42 -0800)
ChangeLog
configure.in
src/ChangeLog
src/hash.c
src/utils.c

index d9e6ab2ff88c1b0f3e7cbee4b586c3dbcf914141..b7566e4de824bbddd0bc1e0691528d37cc1c5db0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2003-11-12  Hrvoje Niksic  <hniksic@xemacs.org>
+
+       * configure.in: Check for limits.h.
+
 2003-11-10  Hrvoje Niksic  <hniksic@xemacs.org>
 
        * aclocal.m4 (WGET_SOCKLEN_T): Use AC_COMPILE_IFELSE instead of
index 822cc1eb073f6ae4d0d496fe96b83e7a3178c2e7..2335ab88cfc1df47ed3ee18f4b9948fc16f00565 100644 (file)
@@ -170,7 +170,7 @@ dnl HAVE_SYS_TYPES_H, etc. before including them.
 AC_HEADER_STDC
 AC_CHECK_HEADERS(sys/types.h sys/stat.h)
 dnl Now check for the others.
-AC_CHECK_HEADERS(string.h strings.h stdarg.h unistd.h sys/time.h)
+AC_CHECK_HEADERS(string.h strings.h stdarg.h limits.h unistd.h sys/time.h)
 AC_CHECK_HEADERS(termios.h sys/ioctl.h sys/select.h utime.h sys/utime.h)
 AC_CHECK_HEADERS(stdint.h inttypes.h signal.h setjmp.h pwd.h)
 AC_HEADER_TIME
@@ -314,13 +314,15 @@ if test x"$with_ssl" != x"no"; then
     CPPFLAGS="$SSL_INCLUDES $wget_save_CPPFLAGS"
 
     AC_MSG_CHECKING([for includes])
-
-    AC_TRY_CPP([#include <openssl/ssl.h>
+    AC_COMPILE_IFELSE([
+#include <openssl/ssl.h>
 #include <openssl/rsa.h>
-],
-      AC_MSG_RESULT(found); ssl_found_includes=yes,
+    ], [
+      AC_MSG_RESULT(found)
+      ssl_found_includes=yes
+    ], [
       AC_MSG_RESULT([not found])
-    )
+    ])
 
     if test x"$ssl_found_includes" = xno; then
       continue
index bf6919b3f077f4890c4ccbc664ef59b215771523..b41a146ba8d9e5e1249b276ad9d9b53b318b7ef9 100644 (file)
@@ -1,3 +1,9 @@
+2003-11-12  Hrvoje Niksic  <hniksic@xemacs.org>
+
+       * utils.c: Use limits.h only where available.
+
+       * hash.c: Use INVALID_PTR and INVALID_PTR_BYTE.  Include limits.h.
+
 2003-11-11  Hrvoje Niksic  <hniksic@xemacs.org>
 
        * main.c: Added options --inet4-only and --inet6-only.
index ae9ed642ac3b70bee24f9d86984db5529478abf3..af5cf7a2c20338d1483e16fc7b126400d8695d3c 100644 (file)
@@ -35,7 +35,10 @@ so, delete this exception statement from your version.  */
 # include <string.h>
 #else
 # include <strings.h>
-#endif /* HAVE_STRING_H */
+#endif
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
 #include <stdlib.h>
 #include <assert.h>
 
@@ -158,12 +161,25 @@ struct hash_table {
                                   the prime table. */
 };
 
-/* We use all-bit-set marker to mean that a mapping is empty.  It is
-   (hopefully) illegal as a pointer, and it allows the users to use
-   NULL (as well as any non-negative integer) as key.  */
+/* We use the all-bits-set constant (INVALID_PTR) marker to mean that
+   a mapping is empty.  It is unaligned and therefore illegal as a
+   pointer.  INVALID_PTR_BYTE (0xff) is the one-byte value used to
+   initialize the mappings array as empty.
+
+   The all-bits-set value is a better choice than NULL because it
+   allows the use of NULL/0 keys.  Since the keys are either integers
+   or pointers, the only key that cannot be used is the integer value
+   -1.  This is acceptable because it still allows the use of
+   nonnegative integer keys.  */
+
+#define INVALID_PTR ((void *) ~(unsigned long)0)
+#ifndef UCHAR_MAX
+# define UCHAR_MAX 0xff
+#endif
+#define INVALID_PTR_BYTE UCHAR_MAX
 
-#define NON_EMPTY(mp) (mp->key != (void *)~(unsigned long)0)
-#define MARK_AS_EMPTY(mp) (mp->key = (void *)~(unsigned long)0)
+#define NON_EMPTY(mp) ((mp)->key != INVALID_PTR)
+#define MARK_AS_EMPTY(mp) ((mp)->key = INVALID_PTR)
 
 /* "Next" mapping is the mapping after MP, but wrapping back to
    MAPPINGS when MP would reach MAPPINGS+SIZE.  */
@@ -178,9 +194,8 @@ struct hash_table {
    being HASHFUN.  */
 #define HASH_POSITION(key, hashfun, size) ((hashfun) (key) % size)
 
-/* Find a prime near, but greather than or equal to SIZE.  Of course,
-   the primes are not calculated, but looked up from a table.  The
-   table does not contain all primes in range, just a selection useful
+/* Find a prime near, but greather than or equal to SIZE.  The primes
+   are looked up from a table with a selection of primes convenient
    for this purpose.
 
    PRIME_OFFSET is a minor optimization: it specifies start position
@@ -273,8 +288,8 @@ hash_table_new (int items,
 
   ht->mappings = xnew_array (struct mapping, ht->size);
   /* Mark mappings as empty.  We use 0xff rather than 0 to mark empty
-     keys because it allows us to store NULL keys to the table.  */
-  memset (ht->mappings, 0xff, size * sizeof (struct mapping));
+     keys because it allows us to use NULL/0 as keys.  */
+  memset (ht->mappings, INVALID_PTR_BYTE, size * sizeof (struct mapping));
 
   ht->count = 0;
 
@@ -378,7 +393,7 @@ grow_hash_table (struct hash_table *ht)
   ht->resize_threshold = newsize * HASH_MAX_FULLNESS;
 
   mappings = xnew_array (struct mapping, newsize);
-  memset (mappings, 0xff, newsize * sizeof (struct mapping));
+  memset (mappings, INVALID_PTR_BYTE, newsize * sizeof (struct mapping));
   ht->mappings = mappings;
 
   for (mp = old_mappings; mp < old_end; mp++)
@@ -480,7 +495,7 @@ hash_table_remove (struct hash_table *ht, const void *key)
 void
 hash_table_clear (struct hash_table *ht)
 {
-  memset (ht->mappings, 0xff, ht->size * sizeof (struct mapping));
+  memset (ht->mappings, INVALID_PTR_BYTE, ht->size * sizeof (struct mapping));
   ht->count = 0;
 }
 
index 343e110eda08e159f743b7994322156c0c05189e..36542c9e3e6a3e201f2b0825f2d34373629f3dc2 100644 (file)
@@ -46,7 +46,9 @@ so, delete this exception statement from your version.  */
 #ifdef HAVE_PWD_H
 # include <pwd.h>
 #endif
-#include <limits.h>
+#ifdef HAVE_LIMITS_H
+# include <limits.h>
+#endif
 #ifdef HAVE_UTIME_H
 # include <utime.h>
 #endif
@@ -1147,10 +1149,13 @@ numdigit (long number)
   return cnt;
 }
 
-/* A half-assed implementation of INT_MAX on machines that don't
-   bother to define one. */
+/* Attempt to calculate INT_MAX on machines that don't bother to
+   define it. */
 #ifndef INT_MAX
-# define INT_MAX ((int) ~((unsigned)1 << 8 * sizeof (int) - 1))
+# ifndef CHAR_BIT
+#  define CHAR_BIT 8
+# endif
+# define INT_MAX ((int) ~((unsigned)1 << CHAR_BIT * sizeof (int) - 1))
 #endif
 
 #define ONE_DIGIT(figure) *p++ = n / (figure) + '0'