|
|
1.1 root 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: syminit()
8: {
9: register Symtab **s, *ss;
10:
11: for(s = hash; s < &hash[NHASH]; s++){
12: for(ss = *s; ss; ss = ss->next)
13: free((char *)ss);
14: *s = 0;
15: }
16: }
17:
18: Symtab *
19: symlook(sym, space, install)
20: char *sym;
21: char *install;
22: {
23: register long h;
24: register char *p;
25: register Symtab *s;
26:
27: for(p = sym, h = space; *p; h += *p++)
28: h *= HASHMUL;
29: if(h < 0)
30: h = ~h;
31: h %= NHASH;
32: for(s = hash[h]; s; s = s->next)
33: if((s->space == space) && (strcmp(s->name, sym) == 0))
34: return(s);
35: if(install == 0)
36: return((Symtab *)0);
37: s = (Symtab *)Malloc(sizeof(Symtab));
38: s->space = space;
39: s->name = sym;
40: s->value = install;
41: s->next = hash[h];
42: hash[h] = s;
43: return(s);
44: }
45:
46: symdel(sym, space)
47: char *sym;
48: {
49: register long h;
50: register char *p;
51: register Symtab *s, *ls;
52:
53: for(p = sym, h = space; *p; h += *p++)
54: h *= HASHMUL;
55: if(h < 0)
56: h = ~h;
57: h %= NHASH;
58: for(s = hash[h], ls = 0; s; ls = s, s = s->next)
59: if((s->space == space) && (strcmp(s->name, sym) == 0)){
60: if(ls)
61: ls->next = s->next;
62: else
63: hash[h] = s->next;
64: free((char *)s);
65: }
66: }
67:
68: symtraverse(space, fn)
69: void (*fn)();
70: {
71: register Symtab **s, *ss;
72:
73: for(s = hash; s < &hash[NHASH]; s++)
74: for(ss = *s; ss; ss = ss->next)
75: if(ss->space == space)
76: (*fn)(ss);
77: }
78:
79: symstat()
80: {
81: register Symtab **s, *ss;
82: register n;
83: int l[1000];
84:
85: memset((char *)l, 0, sizeof(l));
86: for(s = hash; s < &hash[NHASH]; s++){
87: for(ss = *s, n = 0; ss; ss = ss->next)
88: n++;
89: l[n]++;
90: }
91: for(n = 0; n < 1000; n++)
92: if(l[n]) Fprint(1, "%ld of length %d\n", l[n], n);
93: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.