-#ifndef _hash_h_
-# define _hash_h_ 1
+#ifndef HASH_H
+# define HASH_H 1
+
+# if HAVE_CONFIG_H
+# include <config.h>
+# endif
# include <stdio.h>
-# include <stdlib.h>
# include <assert.h>
+# ifdef STDC_HEADERS
+# include <stdlib.h>
+# endif
+
+# ifndef HAVE_DECL_FREE
+void free ();
+# endif
+
+# ifndef HAVE_DECL_MALLOC
+char *malloc ();
+# endif
+
+# ifndef PARAMS
+# if defined PROTOTYPES || (defined __STDC__ && __STDC__)
+# define PARAMS(Args) Args
+# else
+# define PARAMS(Args) ()
+# endif
+# endif
+
+# define USE_OBSTACK
# ifdef USE_OBSTACK
# include "obstack.h"
# endif
-# include "xalloc.h"
-# define obstack_chunk_alloc xmalloc
+# define obstack_chunk_alloc malloc
# define obstack_chunk_free free
struct hash_ent
/* This is particularly useful to cast uses in hash_initialize of the
system free function. */
-typedef void (*Hash_key_freer_type) (void *key);
+typedef void (*Hash_key_freer_type) PARAMS((void *key));
struct HT
{
/* User-supplied function for freeing keys. It is specified in
- hash_initialize. If non-null, it is used by hash_free,
- hash_clear, and hash_rehash. You should specify `free' here
- only if you want these functions to free all of your `key'
- data. This is typically the case when your key is simply
- an auxilliary struct that you have malloc'd to aggregate
- several values. */
+ hash_initialize. If non-null, it is used by hash_free and
+ hash_clear. You should specify `free' here only if you want
+ these functions to free all of your `key' data. This is typically
+ the case when your key is simply an auxilliary struct that you
+ have malloc'd to aggregate several values. */
Hash_key_freer_type hash_key_freer;
/* User-supplied hash function that hashes entry E to an integer
in the range 0..TABLE_SIZE-1. */
- unsigned int (*hash_hash) (const void *e, unsigned int table_size);
+ unsigned int (*hash_hash) PARAMS((const void *e, unsigned int table_size));
/* User-supplied function that determines whether a new entry is
unique by comparing the new entry to entries that hashed to the
same bucket index. It should return zero for a pair of entries
that compare equal, non-zero otherwise. */
- int (*hash_key_comparator) (const void *, const void *);
+ int (*hash_key_comparator) PARAMS((const void *, const void *));
HASH_ENT **hash_table;
unsigned int hash_table_size;
typedef struct HT HT;
unsigned int
- hash_get_n_slots_used (const HT *ht);
+ hash_get_n_slots_used PARAMS((const HT *ht));
unsigned int
- hash_get_max_chain_length (HT *ht);
+ hash_get_max_chain_length PARAMS((HT *ht));
int
- hash_rehash (HT *ht, unsigned int new_table_size);
+ hash_rehash PARAMS((HT *ht, unsigned int new_table_size));
unsigned int
- hash_get_table_size (const HT *ht);
+ hash_get_table_size PARAMS((const HT *ht));
HT *
- hash_initialize (unsigned int table_size,
- void (*key_freer) (void *key),
- unsigned int (*hash) (const void *, unsigned int),
- int (*equality_tester) (const void *, const void *));
+ hash_initialize PARAMS((unsigned int table_size,
+ void (*key_freer) PARAMS((void *key)),
+ unsigned int (*hash) PARAMS((const void *,
+ unsigned int)),
+ int (*equality_tester) PARAMS((const void *,
+ const void *))));
unsigned int
- hash_get_n_keys (const HT *ht);
+ hash_get_n_keys PARAMS((const HT *ht));
int
- hash_query_in_table (const HT *ht, const void *e);
+ hash_query_in_table PARAMS((const HT *ht, const void *e));
void *
- hash_lookup (const HT *ht, const void *e);
+ hash_lookup PARAMS((const HT *ht, const void *e));
void *
- hash_insert_if_absent (HT *ht, const void *e, int *failed);
+ hash_insert_if_absent PARAMS((HT *ht,
+ const void *e,
+ int *failed));
void *
- hash_delete_if_present (HT *ht, const void *e);
+ hash_delete_if_present PARAMS((HT *ht, const void *e));
void
- hash_print_statistics (const HT *ht, FILE *stream);
+ hash_print_statistics PARAMS((const HT *ht, FILE *stream));
int
- hash_get_statistics (const HT *ht, unsigned int *n_slots_used,
- unsigned int *n_keys,
- unsigned int *max_chain_length);
+ hash_get_statistics PARAMS((const HT *ht, unsigned int *n_slots_used,
+ unsigned int *n_keys,
+ unsigned int *max_chain_length));
int
- hash_table_ok (HT *ht);
+ hash_table_ok PARAMS((HT *ht));
void
- hash_do_for_each (HT *ht, void (*f) (void *e, void *aux), void *aux);
+ hash_do_for_each PARAMS((HT *ht,
+ void (*f) PARAMS((void *e, void *aux)),
+ void *aux));
int
- hash_do_for_each_2 (HT *ht, int (*f) (void *e, void *aux), void *aux);
+ hash_do_for_each_2 PARAMS((HT *ht,
+ int (*f) PARAMS((void *e, void *aux)),
+ void *aux));
int
- hash_do_for_each_in_selected_bucket (HT *ht, const void *key,
- int (*f) (const void *bucket_key,
- void *e, void *aux),
- void *aux);
+ hash_do_for_each_in_selected_bucket PARAMS((HT *ht,
+ const void *key,
+ int (*f) PARAMS((const void *bucket_key,
+ void *e,
+ void *aux)),
+ void *aux));
void
- hash_clear (HT *ht);
+ hash_clear PARAMS((HT *ht));
void
- hash_free (HT *ht);
+ hash_free PARAMS((HT *ht));
void
- hash_get_key_list (const HT *ht, unsigned int bufsize, void **buf);
+ hash_get_key_list PARAMS((const HT *ht,
+ unsigned int bufsize,
+ void **buf));
void *
- hash_get_first (const HT *ht);
+ hash_get_first PARAMS((const HT *ht));
void *
- hash_get_next (const HT *ht, const void *e);
+ hash_get_next PARAMS((const HT *ht, const void *e));
/* This interface to hash_insert_if_absent is used frequently enough to
merit a macro here. */
-# define HASH_INSERT_NEW_ITEM(ht, item) \
+# define HASH_INSERT_NEW_ITEM(Ht, Item, Failp) \
do \
{ \
- void *already; \
- int _failed; \
- already = hash_insert_if_absent ((ht), (item), &_failed); \
- assert (already == NULL); \
- assert (!_failed); \
+ void *_already; \
+ _already = hash_insert_if_absent ((Ht), (Item), Failp); \
+ assert (_already == NULL); \
} \
while (0)
-#endif /* _hash_h_ */
+#endif /* HASH_H */