| 1 | /* htab.h - Structures and declarations needed for table hashing */ |
|---|
| 2 | |
|---|
| 3 | #ifndef __HTAB_H |
|---|
| 4 | #define __HTAB_H |
|---|
| 5 | |
|---|
| 6 | |
|---|
| 7 | #define HTAB_UPSCALE 4 |
|---|
| 8 | #define HTAB_DOWNSCALE 2 |
|---|
| 9 | |
|---|
| 10 | typedef struct hashentry HASHENT; |
|---|
| 11 | /** A hash table entry. |
|---|
| 12 | */ |
|---|
| 13 | struct hashentry { |
|---|
| 14 | struct hashentry *next; /**< Pointer to next entry */ |
|---|
| 15 | void *data; /**< Data for this entry */ |
|---|
| 16 | char *key; /**< Key for this entry */ |
|---|
| 17 | }; |
|---|
| 18 | |
|---|
| 19 | #define HASHENT_SIZE (sizeof(HASHENT)) |
|---|
| 20 | |
|---|
| 21 | typedef struct hashtable HASHTAB; |
|---|
| 22 | /** A hash table. |
|---|
| 23 | */ |
|---|
| 24 | struct hashtable { |
|---|
| 25 | int hashsize; /**< Size of hash table */ |
|---|
| 26 | int mask; /**< Mask for entries in table */ |
|---|
| 27 | int entries; /**< Number of entries stored */ |
|---|
| 28 | HASHENT **buckets; /**< Pointer to pointer to entries */ |
|---|
| 29 | int last_hval; /**< State for hashfirst & hashnext. */ |
|---|
| 30 | HASHENT *last_entry; /**< State for hashfirst & hashnext. */ |
|---|
| 31 | int entry_size; /**< Size of each entry */ |
|---|
| 32 | void (*free_data) (void *); /**< Function to call on data when deleting |
|---|
| 33 | a entry. */ |
|---|
| 34 | }; |
|---|
| 35 | |
|---|
| 36 | #define get_hashmask(x) hash_getmask(x) |
|---|
| 37 | #define hashinit(x,y, z) hash_init(x,y, z, NULL) |
|---|
| 38 | #define hashfind(key,tab) hash_value(hash_find(tab,key)) |
|---|
| 39 | #define hashadd(key,data,tab) hash_add(tab,key,data, 0) |
|---|
| 40 | #define hashadds(key, data, tab, size) hash_add(tab, key, data, size) |
|---|
| 41 | #define hashdelete(key,tab) hash_delete(tab,hash_find(tab,key)) |
|---|
| 42 | #define hashflush(tab, size) hash_flush(tab,size) |
|---|
| 43 | #define hashfree(tab) hash_flush(tab, 0) |
|---|
| 44 | extern int hash_getmask(int *size); |
|---|
| 45 | extern void hash_init(HASHTAB *htab, int size, int data_size, void (*)(void *)); |
|---|
| 46 | extern HASHENT *hash_find(HASHTAB *htab, const char *key); |
|---|
| 47 | extern void *hash_value(HASHENT *entry); |
|---|
| 48 | extern char *hash_key(HASHENT *entry); |
|---|
| 49 | extern void hash_resize(HASHTAB *htab, int size); |
|---|
| 50 | extern int hash_add |
|---|
| 51 | (HASHTAB *htab, const char *key, void *hashdata, int extra_size); |
|---|
| 52 | extern void hash_delete(HASHTAB *htab, HASHENT *entry); |
|---|
| 53 | extern void hash_flush(HASHTAB *htab, int size); |
|---|
| 54 | extern void *hash_firstentry(HASHTAB *htab); |
|---|
| 55 | extern void *hash_nextentry(HASHTAB *htab); |
|---|
| 56 | extern char *hash_firstentry_key(HASHTAB *htab); |
|---|
| 57 | extern char *hash_nextentry_key(HASHTAB *htab); |
|---|
| 58 | extern void hash_stats_header(dbref player); |
|---|
| 59 | extern void hash_stats(dbref player, HASHTAB *htab, const char *hashname); |
|---|
| 60 | #endif |
|---|