13e12c5d1SDavid du Colombier #include "mk.h"
23e12c5d1SDavid du Colombier
33e12c5d1SDavid du Colombier #define NHASH 4099
43e12c5d1SDavid du Colombier #define HASHMUL 79L /* this is a good value */
53e12c5d1SDavid du Colombier static Symtab *hash[NHASH];
63e12c5d1SDavid du Colombier
73e12c5d1SDavid du Colombier void
syminit(void)83e12c5d1SDavid du Colombier syminit(void)
93e12c5d1SDavid du Colombier {
103e12c5d1SDavid du Colombier Symtab **s, *ss;
113e12c5d1SDavid du Colombier
123e12c5d1SDavid du Colombier for(s = hash; s < &hash[NHASH]; s++){
133e12c5d1SDavid du Colombier for(ss = *s; ss; ss = ss->next)
143e12c5d1SDavid du Colombier free((char *)ss);
153e12c5d1SDavid du Colombier *s = 0;
163e12c5d1SDavid du Colombier }
173e12c5d1SDavid du Colombier }
183e12c5d1SDavid du Colombier
193e12c5d1SDavid du Colombier Symtab *
symlook(char * sym,int space,void * install)207dd7cddfSDavid du Colombier symlook(char *sym, int space, void *install)
213e12c5d1SDavid du Colombier {
223e12c5d1SDavid du Colombier long h;
233e12c5d1SDavid du Colombier char *p;
243e12c5d1SDavid du Colombier Symtab *s;
253e12c5d1SDavid du Colombier
263e12c5d1SDavid du Colombier for(p = sym, h = space; *p; h += *p++)
273e12c5d1SDavid du Colombier h *= HASHMUL;
283e12c5d1SDavid du Colombier if(h < 0)
293e12c5d1SDavid du Colombier h = ~h;
303e12c5d1SDavid du Colombier h %= NHASH;
313e12c5d1SDavid du Colombier for(s = hash[h]; s; s = s->next)
323e12c5d1SDavid du Colombier if((s->space == space) && (strcmp(s->name, sym) == 0))
333e12c5d1SDavid du Colombier return(s);
343e12c5d1SDavid du Colombier if(install == 0)
357dd7cddfSDavid du Colombier return(0);
363e12c5d1SDavid du Colombier s = (Symtab *)Malloc(sizeof(Symtab));
373e12c5d1SDavid du Colombier s->space = space;
383e12c5d1SDavid du Colombier s->name = sym;
39*4de34a7eSDavid du Colombier s->u.ptr = install;
403e12c5d1SDavid du Colombier s->next = hash[h];
413e12c5d1SDavid du Colombier hash[h] = s;
423e12c5d1SDavid du Colombier return(s);
433e12c5d1SDavid du Colombier }
443e12c5d1SDavid du Colombier
453e12c5d1SDavid du Colombier void
symdel(char * sym,int space)463e12c5d1SDavid du Colombier symdel(char *sym, int space)
473e12c5d1SDavid du Colombier {
483e12c5d1SDavid du Colombier long h;
493e12c5d1SDavid du Colombier char *p;
503e12c5d1SDavid du Colombier Symtab *s, *ls;
513e12c5d1SDavid du Colombier
523e12c5d1SDavid du Colombier /* multiple memory leaks */
533e12c5d1SDavid du Colombier
543e12c5d1SDavid du Colombier for(p = sym, h = space; *p; h += *p++)
553e12c5d1SDavid du Colombier h *= HASHMUL;
563e12c5d1SDavid du Colombier if(h < 0)
573e12c5d1SDavid du Colombier h = ~h;
583e12c5d1SDavid du Colombier h %= NHASH;
593e12c5d1SDavid du Colombier for(s = hash[h], ls = 0; s; ls = s, s = s->next)
603e12c5d1SDavid du Colombier if((s->space == space) && (strcmp(s->name, sym) == 0)){
613e12c5d1SDavid du Colombier if(ls)
623e12c5d1SDavid du Colombier ls->next = s->next;
633e12c5d1SDavid du Colombier else
643e12c5d1SDavid du Colombier hash[h] = s->next;
653e12c5d1SDavid du Colombier free((char *)s);
663e12c5d1SDavid du Colombier }
673e12c5d1SDavid du Colombier }
683e12c5d1SDavid du Colombier
693e12c5d1SDavid du Colombier void
symtraverse(int space,void (* fn)(Symtab *))703e12c5d1SDavid du Colombier symtraverse(int space, void (*fn)(Symtab*))
713e12c5d1SDavid du Colombier {
723e12c5d1SDavid du Colombier Symtab **s, *ss;
733e12c5d1SDavid du Colombier
743e12c5d1SDavid du Colombier for(s = hash; s < &hash[NHASH]; s++)
753e12c5d1SDavid du Colombier for(ss = *s; ss; ss = ss->next)
763e12c5d1SDavid du Colombier if(ss->space == space)
773e12c5d1SDavid du Colombier (*fn)(ss);
783e12c5d1SDavid du Colombier }
793e12c5d1SDavid du Colombier
803e12c5d1SDavid du Colombier void
symstat(void)813e12c5d1SDavid du Colombier symstat(void)
823e12c5d1SDavid du Colombier {
833e12c5d1SDavid du Colombier Symtab **s, *ss;
843e12c5d1SDavid du Colombier int n;
853e12c5d1SDavid du Colombier int l[1000];
863e12c5d1SDavid du Colombier
873e12c5d1SDavid du Colombier memset((char *)l, 0, sizeof(l));
883e12c5d1SDavid du Colombier for(s = hash; s < &hash[NHASH]; s++){
893e12c5d1SDavid du Colombier for(ss = *s, n = 0; ss; ss = ss->next)
903e12c5d1SDavid du Colombier n++;
913e12c5d1SDavid du Colombier l[n]++;
923e12c5d1SDavid du Colombier }
933e12c5d1SDavid du Colombier for(n = 0; n < 1000; n++)
947dd7cddfSDavid du Colombier if(l[n]) Bprint(&bout, "%d of length %d\n", l[n], n);
953e12c5d1SDavid du Colombier }
96