[svn] Better INT_MAX and UCHAR_MAX checks.

This commit is contained in:
hniksic 2003-11-11 16:42:09 -08:00
parent 244efb6e50
commit 6f3dbca0c5
5 changed files with 55 additions and 23 deletions

View File

@ -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

View 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

View 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.

View 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.
#define NON_EMPTY(mp) (mp->key != (void *)~(unsigned long)0)
#define MARK_AS_EMPTY(mp) (mp->key = (void *)~(unsigned long)0)
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 != 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;
}

View 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'