diff options
author | Akinori Ito <aito@eie.yz.yamagata-u.ac.jp> | 2001-11-08 05:14:08 +0000 |
---|---|---|
committer | Akinori Ito <aito@eie.yz.yamagata-u.ac.jp> | 2001-11-08 05:14:08 +0000 |
commit | 68a07bf03b7624c9924065cce9ffa45497225834 (patch) | |
tree | c2adb06a909a8594445e4a3f8587c4bad46e3ecd /hash.h | |
download | w3m-68a07bf03b7624c9924065cce9ffa45497225834.tar.gz w3m-68a07bf03b7624c9924065cce9ffa45497225834.zip |
Initial revision
Diffstat (limited to 'hash.h')
-rw-r--r-- | hash.h | 82 |
1 files changed, 82 insertions, 0 deletions
@@ -0,0 +1,82 @@ +#ifndef HASH_H +#define HASH_H + +/* hash table */ + +#define defhash(keytype,type,sym) \ +typedef struct HashItem_##sym { \ + keytype key; \ + type value; \ + struct HashItem_##sym *next; \ +} HashItem_##sym; \ +typedef struct Hash_##sym { \ + int size; \ + struct HashItem_##sym **tab; \ +} Hash_##sym; \ +extern Hash_##sym *newHash_##sym(int size); \ +extern void putHash_##sym(Hash_##sym *t, keytype key, type value); \ +extern type getHash_##sym(Hash_##sym *t, keytype key, type failval); + +defhash(char *, int, si) +defhash(char *, char *, ss) +defhash(char *, void *, hist) +#define defhashfunc(keytype,type,sym) \ +Hash_##sym * \ +newHash_##sym(int size)\ +{\ + struct Hash_##sym *hash;\ + int i;\ +\ + hash = (Hash_##sym*)GC_malloc(sizeof(Hash_##sym));\ + hash->size = size;\ + hash->tab = (HashItem_##sym**)GC_malloc(size*sizeof(HashItem_##sym*));\ + for (i = 0; i < size; i++)\ + hash->tab[i] = NULL;\ + return hash;\ +}\ +\ +static HashItem_##sym* \ +lookupHash_##sym(Hash_##sym *t, keytype key, int *hashval_return)\ +{\ + HashItem_##sym *hi;\ +\ + *hashval_return = hashfunc(key)%t->size;\ + for (hi = t->tab[*hashval_return]; hi != NULL; hi = hi->next) {\ + if (keycomp(hi->key,key))\ + return hi;\ + }\ + return NULL;\ +}\ +\ +void \ +putHash_##sym(Hash_##sym *t, keytype key, type value)\ +{\ + int h;\ + HashItem_##sym *hi;\ +\ + hi = lookupHash_##sym(t,key,&h);\ + if (hi) {\ + hi->value = value;\ + return;\ + }\ +\ + hi = (HashItem_##sym*)GC_malloc(sizeof(HashItem_##sym));\ + hi->key = key;\ + hi->value = value;\ + hi->next = t->tab[h];\ + t->tab[h] = hi;\ +}\ +\ +type \ +getHash_##sym(Hash_##sym *t, keytype key, type failval)\ +{\ + int h;\ + HashItem_##sym *hi;\ +\ + hi = lookupHash_##sym(t,key,&h);\ + if (hi == NULL)\ + return failval;\ + return hi->value;\ +} + +#endif /* not HASH_H */ |