00001
00002
00003
00004 #ifndef HASH_H
00005 #define HASH_H
00006 typedef struct entry entry;
00007
00008
00009
00010 typedef struct {
00011 union {
00012 void *p;
00013 int i;
00014 };
00015 void *key;
00016 size_t lkey;
00017 } data_u;
00018
00019 struct entry {
00020 data_u data;
00021 unsigned long hashval;
00022 entry *next;
00023 };
00024
00025 typedef struct {
00026 unsigned long size,
00027 frontmask,
00028 fullmask,
00029 space,
00030 nelem;
00031 void (*freedata)(void *data);
00032 entry **tab;
00033
00034 unsigned long (*hashfunction)(const void *t, const size_t len);
00035 } hashtab;
00036 #endif
00037
00038
00039 extern hashtab *newhash(void (*freedata)(void *));
00040
00041
00042 extern void freehash(hashtab *table);
00043
00044
00045 extern data_u *lookup(const void *key, size_t lkey, const hashtab *table);
00046
00047
00048 extern data_u *addentry(const void *key, size_t lkey, hashtab *table, int *exists);
00049
00050
00051 extern int maxchain(const hashtab *table);
00052
00053
00054 extern unsigned long makelist(const hashtab *table, data_u **list,
00055 const unsigned long nlist, int (*maskfun)(data_u *dat));
00056
00057
00058 extern unsigned long makeplist(const hashtab *table, void **list,
00059 const unsigned long nlist, int (*maskfun)(data_u *dat));