00001
00002
00003
00004 #ifndef HASH_H_
00005 #define HASH_H_
00006
00007 typedef struct entry entry;
00008
00009
00010
00011 typedef struct {
00012 union {
00013 void *p;
00014 int i;
00015 };
00016 void *key;
00017 size_t lkey;
00018 } data_u;
00019
00020 struct entry {
00021 data_u data;
00022 unsigned long hashval;
00023 entry *next;
00024 };
00025
00026 typedef struct {
00027 unsigned long size,
00028 frontmask,
00029 fullmask,
00030 space,
00031 nelem;
00032 void (*freedata)(void *data);
00033 entry **tab;
00034
00035 unsigned long (*hashfunction)(const void *t, const size_t len);
00036 } hashtab;
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));
00060
00061 #endif