]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/mk/symtab.c
merge
[plan9front.git] / sys / src / cmd / mk / symtab.c
1 #include        "mk.h"
2
3 #define NHASH   4099
4 #define HASHMUL 79L     /* this is a good value */
5 static Symtab *hash[NHASH];
6
7 Symtab *
8 symlook(char *sym, int space, void *install)
9 {
10         long h;
11         char *p;
12         Symtab *s;
13
14         for(p = sym, h = space; *p; h += *p++)
15                 h *= HASHMUL;
16         if(h < 0)
17                 h = ~h;
18         h %= NHASH;
19         for(s = hash[h]; s; s = s->next)
20                 if((s->space == space) && (strcmp(s->name, sym) == 0))
21                         return(s);
22         if(install == 0)
23                 return(0);
24         s = (Symtab *)Malloc(sizeof(Symtab));
25         s->space = space;
26         s->name = sym;
27         s->u.ptr = install;
28         s->next = hash[h];
29         hash[h] = s;
30         return(s);
31 }
32
33 void
34 symtraverse(int space, void (*fn)(Symtab*))
35 {
36         Symtab **s, *ss;
37
38         for(s = hash; s < &hash[NHASH]; s++)
39                 for(ss = *s; ss; ss = ss->next)
40                         if(ss->space == space)
41                                 (*fn)(ss);
42 }