xref: /plan9/sys/src/cmd/mk/symtab.c (revision 4de34a7edde43207e841ec91ecd12e6cf5f5ebe7)
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