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 */