Blame


1 76193d7c 2003-09-30 devnull #include "mk.h"
2 76193d7c 2003-09-30 devnull
3 76193d7c 2003-09-30 devnull #define NHASH 4099
4 76193d7c 2003-09-30 devnull #define HASHMUL 79L /* this is a good value */
5 76193d7c 2003-09-30 devnull static Symtab *hash[NHASH];
6 76193d7c 2003-09-30 devnull
7 76193d7c 2003-09-30 devnull void
8 76193d7c 2003-09-30 devnull syminit(void)
9 76193d7c 2003-09-30 devnull {
10 3300f9cd 2005-01-15 devnull Symtab **s, *ss, *next;
11 76193d7c 2003-09-30 devnull
12 76193d7c 2003-09-30 devnull for(s = hash; s < &hash[NHASH]; s++){
13 3300f9cd 2005-01-15 devnull for(ss = *s; ss; ss = next){
14 3300f9cd 2005-01-15 devnull next = ss->next;
15 76193d7c 2003-09-30 devnull free((char *)ss);
16 3300f9cd 2005-01-15 devnull }
17 76193d7c 2003-09-30 devnull *s = 0;
18 76193d7c 2003-09-30 devnull }
19 76193d7c 2003-09-30 devnull }
20 76193d7c 2003-09-30 devnull
21 76193d7c 2003-09-30 devnull Symtab *
22 76193d7c 2003-09-30 devnull symlook(char *sym, int space, void *install)
23 76193d7c 2003-09-30 devnull {
24 76193d7c 2003-09-30 devnull long h;
25 76193d7c 2003-09-30 devnull char *p;
26 76193d7c 2003-09-30 devnull Symtab *s;
27 76193d7c 2003-09-30 devnull
28 76193d7c 2003-09-30 devnull for(p = sym, h = space; *p; h += *p++)
29 76193d7c 2003-09-30 devnull h *= HASHMUL;
30 76193d7c 2003-09-30 devnull if(h < 0)
31 76193d7c 2003-09-30 devnull h = ~h;
32 76193d7c 2003-09-30 devnull h %= NHASH;
33 76193d7c 2003-09-30 devnull for(s = hash[h]; s; s = s->next)
34 76193d7c 2003-09-30 devnull if((s->space == space) && (strcmp(s->name, sym) == 0))
35 76193d7c 2003-09-30 devnull return(s);
36 76193d7c 2003-09-30 devnull if(install == 0)
37 76193d7c 2003-09-30 devnull return(0);
38 76193d7c 2003-09-30 devnull s = (Symtab *)Malloc(sizeof(Symtab));
39 76193d7c 2003-09-30 devnull s->space = space;
40 76193d7c 2003-09-30 devnull s->name = sym;
41 3fe9465a 2006-04-20 devnull s->u.ptr = install;
42 76193d7c 2003-09-30 devnull s->next = hash[h];
43 76193d7c 2003-09-30 devnull hash[h] = s;
44 76193d7c 2003-09-30 devnull return(s);
45 76193d7c 2003-09-30 devnull }
46 76193d7c 2003-09-30 devnull
47 76193d7c 2003-09-30 devnull void
48 76193d7c 2003-09-30 devnull symdel(char *sym, int space)
49 76193d7c 2003-09-30 devnull {
50 76193d7c 2003-09-30 devnull long h;
51 76193d7c 2003-09-30 devnull char *p;
52 76193d7c 2003-09-30 devnull Symtab *s, *ls;
53 76193d7c 2003-09-30 devnull
54 76193d7c 2003-09-30 devnull /* multiple memory leaks */
55 76193d7c 2003-09-30 devnull
56 76193d7c 2003-09-30 devnull for(p = sym, h = space; *p; h += *p++)
57 76193d7c 2003-09-30 devnull h *= HASHMUL;
58 76193d7c 2003-09-30 devnull if(h < 0)
59 76193d7c 2003-09-30 devnull h = ~h;
60 76193d7c 2003-09-30 devnull h %= NHASH;
61 76193d7c 2003-09-30 devnull for(s = hash[h], ls = 0; s; ls = s, s = s->next)
62 76193d7c 2003-09-30 devnull if((s->space == space) && (strcmp(s->name, sym) == 0)){
63 76193d7c 2003-09-30 devnull if(ls)
64 76193d7c 2003-09-30 devnull ls->next = s->next;
65 76193d7c 2003-09-30 devnull else
66 76193d7c 2003-09-30 devnull hash[h] = s->next;
67 76193d7c 2003-09-30 devnull free((char *)s);
68 76193d7c 2003-09-30 devnull }
69 76193d7c 2003-09-30 devnull }
70 76193d7c 2003-09-30 devnull
71 76193d7c 2003-09-30 devnull void
72 76193d7c 2003-09-30 devnull symtraverse(int space, void (*fn)(Symtab*))
73 76193d7c 2003-09-30 devnull {
74 76193d7c 2003-09-30 devnull Symtab **s, *ss;
75 76193d7c 2003-09-30 devnull
76 76193d7c 2003-09-30 devnull for(s = hash; s < &hash[NHASH]; s++)
77 76193d7c 2003-09-30 devnull for(ss = *s; ss; ss = ss->next)
78 76193d7c 2003-09-30 devnull if(ss->space == space)
79 76193d7c 2003-09-30 devnull (*fn)(ss);
80 76193d7c 2003-09-30 devnull }
81 76193d7c 2003-09-30 devnull
82 76193d7c 2003-09-30 devnull void
83 76193d7c 2003-09-30 devnull symstat(void)
84 76193d7c 2003-09-30 devnull {
85 76193d7c 2003-09-30 devnull Symtab **s, *ss;
86 76193d7c 2003-09-30 devnull int n;
87 76193d7c 2003-09-30 devnull int l[1000];
88 76193d7c 2003-09-30 devnull
89 76193d7c 2003-09-30 devnull memset((char *)l, 0, sizeof(l));
90 76193d7c 2003-09-30 devnull for(s = hash; s < &hash[NHASH]; s++){
91 76193d7c 2003-09-30 devnull for(ss = *s, n = 0; ss; ss = ss->next)
92 76193d7c 2003-09-30 devnull n++;
93 76193d7c 2003-09-30 devnull l[n]++;
94 76193d7c 2003-09-30 devnull }
95 76193d7c 2003-09-30 devnull for(n = 0; n < 1000; n++)
96 76193d7c 2003-09-30 devnull if(l[n]) Bprint(&bout, "%ld of length %d\n", l[n], n);
97 76193d7c 2003-09-30 devnull }