#include <stdio.h> #define HASHSIZE 101 struct nlist { /*table entry*/ struct nlist *next; /*next entry in chain */ char *name; /* defined name */ char *defn; /* replacement text */ }; static struct nlist *hashtable[HASHSIZE]; /* pointer table */ /************************************************************************/ /* hash : form hash value for string s /************************************************************************/ unsigned hash( char *s ){ unsigned hashval; for (hashval = 0; *s != '\0' ; s ++) { hashval = *s + 31 * hashval; } return hashval % HASHSIZE; } /************************************************************************/ /* lookup : look for s in hashtab /************************************************************************/ struct nlist *lookup(char *s){ struct nlist *np; for (np = hashtable[hash(s)]; np != NULL; np = np->next) { if (strcmp(s, np->name) == 0) { return np;/* found */ } } return NULL; } char *strdup(char *); /************************************************************************/ /* install : put (name, defn ) in hashtable /************************************************************************/ struct nlist *install(char *name, char *defn){ struct nlist *np; unsigned hashval; if ((np = lookup(name)) == NULL) {/* not found*/ np = (struct nlist *)malloc(sizeof(struct nlist)); if (np == NULL || (np->name = strdup(name) ) == NULL) { return NULL; } hashval = hash(name); np->next = hashtable[hashval]; hashtable[hashval] = np; }else{ free((void*)np->defn); } if ((np->defn = strdup(defn)) == NULL) { return NULL; } return np; }; void printNode(struct nlist *np){ if (np != NULL) { printf("#define %s %s\t", np->name, np->defn); printNode(np->next); } } void print(){ int i = 0; for(; i < HASHSIZE; i ++){ printNode(hashtable[i]); printf("\n"); } } int main(){ install("a", "1"); print(); return 0; }