xref: /csrg-svn/usr.sbin/sendmail/src/stab.c (revision 68839)
122713Sdist /*
2*68839Seric  * Copyright (c) 1983, 1995 Eric P. Allman
362532Sbostic  * Copyright (c) 1988, 1993
462532Sbostic  *	The Regents of the University of California.  All rights reserved.
533731Sbostic  *
642829Sbostic  * %sccs.include.redist.c%
733731Sbostic  */
822713Sdist 
922713Sdist #ifndef lint
10*68839Seric static char sccsid[] = "@(#)stab.c	8.2 (Berkeley) 04/21/95";
1133731Sbostic #endif /* not lint */
1222713Sdist 
134057Seric # include "sendmail.h"
144057Seric 
154057Seric /*
164057Seric **  STAB -- manage the symbol table
174057Seric **
184057Seric **	Parameters:
194057Seric **		name -- the name to be looked up or inserted.
204103Seric **		type -- the type of symbol.
214057Seric **		op -- what to do:
224057Seric **			ST_ENTER -- enter the name if not
234057Seric **				already present.
244057Seric **			ST_FIND -- find it only.
254057Seric **
264057Seric **	Returns:
274057Seric **		pointer to a STAB entry for this name.
284057Seric **		NULL if not found and not entered.
294057Seric **
304057Seric **	Side Effects:
314057Seric **		can update the symbol table.
324057Seric */
334057Seric 
344151Seric # define STABSIZE	400
354057Seric 
364151Seric static STAB	*SymTab[STABSIZE];
374151Seric 
384057Seric STAB *
stab(name,type,op)394103Seric stab(name, type, op)
404057Seric 	char *name;
414103Seric 	int type;
424057Seric 	int op;
434057Seric {
444151Seric 	register STAB *s;
454151Seric 	register STAB **ps;
464151Seric 	register int hfunc;
474151Seric 	register char *p;
484319Seric 	extern char lower();
494057Seric 
507677Seric 	if (tTd(36, 5))
514103Seric 		printf("STAB: %s %d ", name, type);
524075Seric 
534151Seric 	/*
544151Seric 	**  Compute the hashing function
554151Seric 	**
564151Seric 	**	We could probably do better....
574151Seric 	*/
584151Seric 
594151Seric 	hfunc = type;
604151Seric 	for (p = name; *p != '\0'; p++)
614446Seric 		hfunc = (((hfunc << 7) | lower(*p)) & 077777) % STABSIZE;
624151Seric 
637677Seric 	if (tTd(36, 9))
644151Seric 		printf("(hfunc=%d) ", hfunc);
654151Seric 
664151Seric 	ps = &SymTab[hfunc];
6733725Sbostic 	while ((s = *ps) != NULL && (strcasecmp(name, s->s_name) || s->s_type != type))
684057Seric 		ps = &s->s_next;
694151Seric 
704151Seric 	/*
714151Seric 	**  Dispose of the entry.
724151Seric 	*/
734151Seric 
744057Seric 	if (s != NULL || op == ST_FIND)
754075Seric 	{
767677Seric 		if (tTd(36, 5))
774075Seric 		{
784075Seric 			if (s == NULL)
794075Seric 				printf("not found\n");
804075Seric 			else
8110690Seric 			{
8210690Seric 				long *lp = (long *) s->s_class;
8310690Seric 
8410690Seric 				printf("type %d val %lx %lx %lx %lx\n",
8510690Seric 					s->s_type, lp[0], lp[1], lp[2], lp[3]);
8610690Seric 			}
874075Seric 		}
884057Seric 		return (s);
894075Seric 	}
904057Seric 
914151Seric 	/*
924151Seric 	**  Make a new entry and link it in.
934151Seric 	*/
944151Seric 
957677Seric 	if (tTd(36, 5))
964075Seric 		printf("entered\n");
974075Seric 
984057Seric 	/* make new entry */
994057Seric 	s = (STAB *) xalloc(sizeof *s);
10016882Seric 	bzero((char *) s, sizeof *s);
1014057Seric 	s->s_name = newstr(name);
1024058Seric 	makelower(s->s_name);
1034103Seric 	s->s_type = type;
1044057Seric 
1054151Seric 	/* link it in */
1064057Seric 	*ps = s;
1074057Seric 
1084057Seric 	return (s);
1094057Seric }
11060491Seric /*
11160491Seric **  STABAPPLY -- apply function to all stab entries
11260491Seric **
11360491Seric **	Parameters:
11460491Seric **		func -- the function to apply.  It will be given one
11560491Seric **			parameter (the stab entry).
11660537Seric **		arg -- an arbitrary argument, passed to func.
11760491Seric **
11860491Seric **	Returns:
11960491Seric **		none.
12060491Seric */
12160491Seric 
12260491Seric void
12360537Seric stabapply(func, arg)
12460537Seric 	void (*func)__P((STAB *, int));
12560537Seric 	int arg;
12660491Seric {
12760491Seric 	register STAB **shead;
12860491Seric 	register STAB *s;
12960491Seric 
13060491Seric 	for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++)
13160491Seric 	{
13260491Seric 		for (s = *shead; s != NULL; s = s->s_next)
13360537Seric 		{
13460537Seric 			if (tTd(38, 90))
13560537Seric 				printf("stabapply: trying %d/%s\n",
13660537Seric 					s->s_type, s->s_name);
13760537Seric 			func(s, arg);
13860537Seric 		}
13960491Seric 	}
14060491Seric }
141