From 6f3dbca0c545842ba17d1fe9b393abb110efe8f2 Mon Sep 17 00:00:00 2001 From: hniksic Date: Tue, 11 Nov 2003 16:42:09 -0800 Subject: [PATCH] [svn] Better INT_MAX and UCHAR_MAX checks. --- ChangeLog | 4 ++++ configure.in | 14 ++++++++------ src/ChangeLog | 6 ++++++ src/hash.c | 41 ++++++++++++++++++++++++++++------------- src/utils.c | 13 +++++++++---- 5 files changed, 55 insertions(+), 23 deletions(-) diff --git a/ChangeLog b/ChangeLog index d9e6ab2f..b7566e4d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2003-11-12 Hrvoje Niksic + + * configure.in: Check for limits.h. + 2003-11-10 Hrvoje Niksic * aclocal.m4 (WGET_SOCKLEN_T): Use AC_COMPILE_IFELSE instead of diff --git a/configure.in b/configure.in index 822cc1eb..2335ab88 100644 --- a/configure.in +++ b/configure.in @@ -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 + AC_COMPILE_IFELSE([ +#include #include -], - 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 diff --git a/src/ChangeLog b/src/ChangeLog index bf6919b3..b41a146b 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,9 @@ +2003-11-12 Hrvoje Niksic + + * 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 * main.c: Added options --inet4-only and --inet6-only. diff --git a/src/hash.c b/src/hash.c index ae9ed642..af5cf7a2 100644 --- a/src/hash.c +++ b/src/hash.c @@ -35,7 +35,10 @@ so, delete this exception statement from your version. */ # include #else # include -#endif /* HAVE_STRING_H */ +#endif +#ifdef HAVE_LIMITS_H +# include +#endif #include #include @@ -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; } diff --git a/src/utils.c b/src/utils.c index 343e110e..36542c9e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -46,7 +46,9 @@ so, delete this exception statement from your version. */ #ifdef HAVE_PWD_H # include #endif -#include +#ifdef HAVE_LIMITS_H +# include +#endif #ifdef HAVE_UTIME_H # include #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' -- 2.39.2