-/* Global assumptions:
- - ANSI C
- - a certain amount of library support, at least <stdlib.h>
- - C ints are at least 32-bits long
- */
-
-/* Things to do:
- - add a sample do_all function for listing the hash table.
- */
+/* A generic hash table package. */
#include <stdio.h>
#include <stdlib.h>
#include "hash.h"
#ifdef USE_OBSTACK
-/* This macro assumes that there is an HT with an initialized
- HT_OBSTACK in scope. */
-# define ZALLOC(n) obstack_alloc (&(ht->ht_obstack), (n))
+# define ZALLOC(Ht, N) obstack_alloc (&(ht->ht_obstack), (N))
#else
-# define ZALLOC(n) malloc ((n))
+# define ZALLOC(Ht, N) malloc ((N))
#endif
#define BUCKET_HEAD(ht, idx) ((ht)->hash_table[(idx)])
-static void hash_free_0 (HT *, int);
-
static int
is_prime (candidate)
unsigned long candidate;
}
else
{
- new = (HASH_ENT *) ZALLOC (sizeof (HASH_ENT));
+ new = (HASH_ENT *) ZALLOC (ht, sizeof (HASH_ENT));
}
return new;
}
return ht->hash_n_slots_used;
}
+/* Free all storage associated with HT that functions in this package
+ have allocated. If a key_freer function has been supplied (when HT
+ was created), this function applies it to the key of each entry before
+ freeing that entry. */
+
+static void
+hash_free_0 (HT *ht, int free_user_data)
+{
+ if (free_user_data && ht->hash_key_freer != NULL)
+ {
+ unsigned int i;
+
+ for (i = 0; i < ht->hash_table_size; i++)
+ {
+ HASH_ENT *p;
+ HASH_ENT *next;
+
+ for (p = BUCKET_HEAD (ht, i); p; p = next)
+ {
+ next = p->next;
+ ht->hash_key_freer (p->key);
+ }
+ }
+ }
+
+#ifdef USE_OBSTACK
+ obstack_free (&(ht->ht_obstack), NULL);
+#else
+ {
+ unsigned int i;
+ for (i = 0; i < ht->hash_table_size; i++)
+ {
+ HASH_ENT *p;
+ HASH_ENT *next;
+
+ for (p = BUCKET_HEAD (ht, i); p; p = next)
+ {
+ next = p->next;
+ free (p);
+ }
+ }
+ }
+#endif
+ ht->hash_free_entry_list = NULL;
+ free (ht->hash_table);
+}
+
/* FIXME-comment */
int
- if KEY_COMPARATOR or HASH is null
- if it was unable to allocate sufficient storage for the hash table
- if WHEN_TO_REHASH is zero or negative
- Otherwise it returns zero.
-
- FIXME: tell what happens to any existing hash table when this
- function is called (e.g. a second time). */
+ Otherwise it returns zero. */
HT *
hash_initialize (unsigned int candidate_table_size,
ht->hash_dirty_max_chain_length = 0;
}
-/* Free all storage associated with HT that functions in this package
- have allocated. If a key_freer function has been supplied (when HT
- was created), this function applies it to the key of each entry before
- freeing that entry. */
-
-static void
-hash_free_0 (HT *ht, int free_user_data)
-{
- if (free_user_data && ht->hash_key_freer != NULL)
- {
- unsigned int i;
-
- for (i = 0; i < ht->hash_table_size; i++)
- {
- HASH_ENT *p;
- HASH_ENT *next;
-
- for (p = BUCKET_HEAD (ht, i); p; p = next)
- {
- next = p->next;
- ht->hash_key_freer (p->key);
- }
- }
- }
-
-#ifdef USE_OBSTACK
- obstack_free (&(ht->ht_obstack), NULL);
-#else
- {
- unsigned int i;
- for (i = 0; i < ht->hash_table_size; i++)
- {
- HASH_ENT *p;
- HASH_ENT *next;
-
- for (p = BUCKET_HEAD (ht, i); p; p = next)
- {
- next = p->next;
- free (p);
- }
- }
- }
-#endif
- ht->hash_free_entry_list = NULL;
- free (ht->hash_table);
-}
-
void
hash_free (HT *ht)
{