1
/* $Id: hash.h,v 1.6 2003/09/24 18:48:59 ukai Exp $ */
7
#define defhash(keytype,type,sym) \
8
typedef struct HashItem_##sym { \
11
struct HashItem_##sym *next; \
13
typedef struct Hash_##sym { \
15
struct HashItem_##sym **tab; \
17
extern Hash_##sym *newHash_##sym(int size); \
18
extern void putHash_##sym(Hash_##sym *t, keytype key, type value); \
19
extern type getHash_##sym(Hash_##sym *t, keytype key, type failval);
21
defhash(char *, int, si)
22
defhash(char *, char *, ss)
23
defhash(char *, void *, sv)
24
defhash(int, void *, iv)
25
#define defhashfunc(keytype,type,sym) \
27
newHash_##sym(int size)\
29
struct Hash_##sym *hash;\
32
hash = (Hash_##sym*)GC_malloc(sizeof(Hash_##sym));\
34
hash->tab = (HashItem_##sym**)GC_malloc(size*sizeof(HashItem_##sym*));\
35
for (i = 0; i < size; i++)\
40
static HashItem_##sym* \
41
lookupHash_##sym(Hash_##sym *t, keytype key, int *hashval_return)\
45
*hashval_return = hashfunc(key)%t->size;\
46
for (hi = t->tab[*hashval_return]; hi != NULL; hi = hi->next) {\
47
if (keycomp(hi->key,key))\
54
putHash_##sym(Hash_##sym *t, keytype key, type value)\
59
hi = lookupHash_##sym(t,key,&h);\
65
hi = (HashItem_##sym*)GC_malloc(sizeof(HashItem_##sym));\
68
hi->next = t->tab[h];\
73
getHash_##sym(Hash_##sym *t, keytype key, type failval)\
78
hi = lookupHash_##sym(t,key,&h);\
83
#define defhashfunc_i(keytype,type,sym) \
85
newHash_##sym(int size)\
87
struct Hash_##sym *hash;\
90
hash = (Hash_##sym*)GC_malloc(sizeof(Hash_##sym));\
92
hash->tab = (HashItem_##sym**)GC_malloc(size*sizeof(HashItem_##sym*));\
93
for (i = 0; i < size; i++)\
98
static HashItem_##sym* \
99
lookupHash_##sym(Hash_##sym *t, keytype key, int *hashval_return)\
103
*hashval_return = key%t->size;\
104
for (hi = t->tab[*hashval_return]; hi != NULL; hi = hi->next) {\
112
putHash_##sym(Hash_##sym *t, keytype key, type value)\
117
hi = lookupHash_##sym(t,key,&h);\
123
hi = (HashItem_##sym*)GC_malloc(sizeof(HashItem_##sym));\
126
hi->next = t->tab[h];\
131
getHash_##sym(Hash_##sym *t, keytype key, type failval)\
136
hi = lookupHash_##sym(t,key,&h);\
141
#endif /* not HASH_H */