|
|
@ -48,38 +48,38 @@ typedef unsigned int hashval_t; |
|
|
/* Callback function pointer types. */ |
|
|
/* Callback function pointer types. */ |
|
|
|
|
|
|
|
|
/* Calculate hash of a table entry. */ |
|
|
/* Calculate hash of a table entry. */ |
|
|
typedef hashval_t (*htab_hash) PARAMS ((const void *)); |
|
|
typedef hashval_t (*htab_hash) (const void *); |
|
|
|
|
|
|
|
|
/* Compare a table entry with a possible entry. The entry already in
|
|
|
/* Compare a table entry with a possible entry. The entry already in
|
|
|
the table always comes first, so the second element can be of a |
|
|
the table always comes first, so the second element can be of a |
|
|
different type (but in this case htab_find and htab_find_slot |
|
|
different type (but in this case htab_find and htab_find_slot |
|
|
cannot be used; instead the variants that accept a hash value |
|
|
cannot be used; instead the variants that accept a hash value |
|
|
must be used). */ |
|
|
must be used). */ |
|
|
typedef int (*htab_eq) PARAMS ((const void *, const void *)); |
|
|
typedef int (*htab_eq) (const void *, const void *); |
|
|
|
|
|
|
|
|
/* Cleanup function called whenever a live element is removed from
|
|
|
/* Cleanup function called whenever a live element is removed from
|
|
|
the hash table. */ |
|
|
the hash table. */ |
|
|
typedef void (*htab_del) PARAMS ((void *)); |
|
|
typedef void (*htab_del) (void *); |
|
|
|
|
|
|
|
|
/* Function called by htab_traverse for each live element. The first
|
|
|
/* Function called by htab_traverse for each live element. The first
|
|
|
arg is the slot of the element (which can be passed to htab_clear_slot |
|
|
arg is the slot of the element (which can be passed to htab_clear_slot |
|
|
if desired), the second arg is the auxiliary pointer handed to |
|
|
if desired), the second arg is the auxiliary pointer handed to |
|
|
htab_traverse. Return 1 to continue scan, 0 to stop. */ |
|
|
htab_traverse. Return 1 to continue scan, 0 to stop. */ |
|
|
typedef int (*htab_trav) PARAMS ((void **, void *)); |
|
|
typedef int (*htab_trav) (void **, void *); |
|
|
|
|
|
|
|
|
/* Memory-allocation function, with the same functionality as calloc().
|
|
|
/* Memory-allocation function, with the same functionality as calloc().
|
|
|
Iff it returns NULL, the hash table implementation will pass an error |
|
|
Iff it returns NULL, the hash table implementation will pass an error |
|
|
code back to the user, so if your code doesn't handle errors, |
|
|
code back to the user, so if your code doesn't handle errors, |
|
|
best if you use xcalloc instead. */ |
|
|
best if you use xcalloc instead. */ |
|
|
typedef PTR (*htab_alloc) PARAMS ((size_t, size_t)); |
|
|
typedef PTR (*htab_alloc) (size_t, size_t); |
|
|
|
|
|
|
|
|
/* We also need a free() routine. */ |
|
|
/* We also need a free() routine. */ |
|
|
typedef void (*htab_free) PARAMS ((PTR)); |
|
|
typedef void (*htab_free) (PTR); |
|
|
|
|
|
|
|
|
/* Memory allocation and deallocation; variants which take an extra
|
|
|
/* Memory allocation and deallocation; variants which take an extra
|
|
|
argument. */ |
|
|
argument. */ |
|
|
typedef PTR (*htab_alloc_with_arg) PARAMS ((void *, size_t, size_t)); |
|
|
typedef PTR (*htab_alloc_with_arg) (void *, size_t, size_t); |
|
|
typedef void (*htab_free_with_arg) PARAMS ((void *, void *)); |
|
|
typedef void (*htab_free_with_arg) (void *, void *); |
|
|
|
|
|
|
|
|
/* Hash tables are of the following type. The structure
|
|
|
/* Hash tables are of the following type. The structure
|
|
|
(implementation) of this type is not needed for using the hash |
|
|
(implementation) of this type is not needed for using the hash |
|
|
@ -139,45 +139,43 @@ enum insert_option {NO_INSERT, INSERT}; |
|
|
|
|
|
|
|
|
/* The prototypes of the package functions. */ |
|
|
/* The prototypes of the package functions. */ |
|
|
|
|
|
|
|
|
extern htab_t htab_create_alloc PARAMS ((size_t, htab_hash, |
|
|
extern htab_t htab_create_alloc (size_t, htab_hash, |
|
|
htab_eq, htab_del, |
|
|
htab_eq, htab_del, |
|
|
htab_alloc, htab_free)); |
|
|
htab_alloc, htab_free); |
|
|
|
|
|
|
|
|
extern htab_t htab_create_alloc_ex PARAMS ((size_t, htab_hash, |
|
|
extern htab_t htab_create_alloc_ex (size_t, htab_hash, |
|
|
htab_eq, htab_del, |
|
|
htab_eq, htab_del, |
|
|
PTR, htab_alloc_with_arg, |
|
|
PTR, htab_alloc_with_arg, |
|
|
htab_free_with_arg)); |
|
|
htab_free_with_arg); |
|
|
|
|
|
|
|
|
/* Backward-compatibility functions. */ |
|
|
/* Backward-compatibility functions. */ |
|
|
extern htab_t htab_create PARAMS ((size_t, htab_hash, htab_eq, htab_del)); |
|
|
extern htab_t htab_create (size_t, htab_hash, htab_eq, htab_del); |
|
|
extern htab_t htab_try_create PARAMS ((size_t, htab_hash, htab_eq, htab_del)); |
|
|
extern htab_t htab_try_create (size_t, htab_hash, htab_eq, htab_del); |
|
|
|
|
|
|
|
|
extern void htab_set_functions_ex PARAMS ((htab_t, htab_hash, |
|
|
extern void htab_set_functions_ex (htab_t, htab_hash, |
|
|
htab_eq, htab_del, |
|
|
htab_eq, htab_del, |
|
|
PTR, htab_alloc_with_arg, |
|
|
PTR, htab_alloc_with_arg, |
|
|
htab_free_with_arg)); |
|
|
htab_free_with_arg); |
|
|
|
|
|
|
|
|
extern void htab_delete PARAMS ((htab_t)); |
|
|
extern void htab_delete (htab_t); |
|
|
extern void htab_empty PARAMS ((htab_t)); |
|
|
extern void htab_empty (htab_t); |
|
|
|
|
|
|
|
|
extern PTR htab_find PARAMS ((htab_t, const void *)); |
|
|
extern PTR htab_find (htab_t, const void *); |
|
|
extern PTR *htab_find_slot PARAMS ((htab_t, const void *, |
|
|
extern PTR *htab_find_slot (htab_t, const void *, enum insert_option); |
|
|
enum insert_option)); |
|
|
extern PTR htab_find_with_hash (htab_t, const void *, hashval_t); |
|
|
extern PTR htab_find_with_hash PARAMS ((htab_t, const void *, |
|
|
extern PTR *htab_find_slot_with_hash (htab_t, const void *, |
|
|
hashval_t)); |
|
|
hashval_t, |
|
|
extern PTR *htab_find_slot_with_hash PARAMS ((htab_t, const void *, |
|
|
enum insert_option); |
|
|
hashval_t, |
|
|
extern void htab_clear_slot (htab_t, void **); |
|
|
enum insert_option)); |
|
|
extern void htab_remove_elt (htab_t, void *); |
|
|
extern void htab_clear_slot PARAMS ((htab_t, void **)); |
|
|
extern void htab_remove_elt_with_hash (htab_t, void *, hashval_t); |
|
|
extern void htab_remove_elt PARAMS ((htab_t, void *)); |
|
|
|
|
|
extern void htab_remove_elt_with_hash PARAMS ((htab_t, void *, hashval_t)); |
|
|
extern void htab_traverse (htab_t, htab_trav, void *); |
|
|
|
|
|
extern void htab_traverse_noresize (htab_t, htab_trav, void *); |
|
|
extern void htab_traverse PARAMS ((htab_t, htab_trav, void *)); |
|
|
|
|
|
extern void htab_traverse_noresize PARAMS ((htab_t, htab_trav, void *)); |
|
|
extern size_t htab_size (htab_t); |
|
|
|
|
|
extern size_t htab_elements (htab_t); |
|
|
extern size_t htab_size PARAMS ((htab_t)); |
|
|
extern double htab_collisions (htab_t); |
|
|
extern size_t htab_elements PARAMS ((htab_t)); |
|
|
|
|
|
extern double htab_collisions PARAMS ((htab_t)); |
|
|
|
|
|
|
|
|
|
|
|
/* A hash function for pointers. */ |
|
|
/* A hash function for pointers. */ |
|
|
extern htab_hash htab_hash_pointer; |
|
|
extern htab_hash htab_hash_pointer; |
|
|
@ -186,10 +184,10 @@ extern htab_hash htab_hash_pointer; |
|
|
extern htab_eq htab_eq_pointer; |
|
|
extern htab_eq htab_eq_pointer; |
|
|
|
|
|
|
|
|
/* A hash function for null-terminated strings. */ |
|
|
/* A hash function for null-terminated strings. */ |
|
|
extern hashval_t htab_hash_string PARAMS ((const PTR)); |
|
|
extern hashval_t htab_hash_string (const PTR); |
|
|
|
|
|
|
|
|
/* An iterative hash function for arbitrary data. */ |
|
|
/* An iterative hash function for arbitrary data. */ |
|
|
extern hashval_t iterative_hash PARAMS ((const PTR, size_t, hashval_t)); |
|
|
extern hashval_t iterative_hash (const PTR, size_t, hashval_t); |
|
|
/* Shorthand for hashing something with an intrinsic size. */ |
|
|
/* Shorthand for hashing something with an intrinsic size. */ |
|
|
#define iterative_hash_object(OB,INIT) iterative_hash (&OB, sizeof (OB), INIT) |
|
|
#define iterative_hash_object(OB,INIT) iterative_hash (&OB, sizeof (OB), INIT) |
|
|
|
|
|
|
|
|
|