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