ref: 5c1feb0ef0b795e5de71e956f9ccddcd5c4b7f21
dir: /sys/src/cmd/mk/symtab.c/
#include "mk.h" #define NHASH 4099 #define HASHMUL 79L /* this is a good value */ static Symtab *hash[NHASH]; Symtab * symlook(char *sym, int space, void *install) { long h; char *p; Symtab *s; for(p = sym, h = space; *p; h += *p++) h *= HASHMUL; if(h < 0) h = ~h; h %= NHASH; for(s = hash[h]; s; s = s->next) if((s->space == space) && (strcmp(s->name, sym) == 0)) return(s); if(install == 0) return(0); s = (Symtab *)Malloc(sizeof(Symtab)); s->space = space; s->name = sym; s->u.ptr = install; s->next = hash[h]; hash[h] = s; return(s); } void symtraverse(int space, void (*fn)(Symtab*)) { Symtab **s, *ss; for(s = hash; s < &hash[NHASH]; s++) for(ss = *s; ss; ss = ss->next) if(ss->space == space) (*fn)(ss); }