aboutsummaryrefslogtreecommitdiffstats
path: root/hash.h
diff options
context:
space:
mode:
authorAkinori Ito <aito@eie.yz.yamagata-u.ac.jp>2001-11-08 05:14:08 +0000
committerAkinori Ito <aito@eie.yz.yamagata-u.ac.jp>2001-11-08 05:14:08 +0000
commit68a07bf03b7624c9924065cce9ffa45497225834 (patch)
treec2adb06a909a8594445e4a3f8587c4bad46e3ecd /hash.h
downloadw3m-68a07bf03b7624c9924065cce9ffa45497225834.tar.gz
w3m-68a07bf03b7624c9924065cce9ffa45497225834.zip
Initial revision
Diffstat (limited to '')
-rw-r--r--hash.h82
1 files changed, 82 insertions, 0 deletions
diff --git a/hash.h b/hash.h
new file mode 100644
index 0000000..226b720
--- /dev/null
+++ b/hash.h
@@ -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 */