xref: /original-bsd/usr.sbin/sendmail/src/stab.c (revision f238860a)
1 /*
2 **  Sendmail
3 **  Copyright (c) 1983  Eric P. Allman
4 **  Berkeley, California
5 **
6 **  Copyright (c) 1983 Regents of the University of California.
7 **  All rights reserved.  The Berkeley software License Agreement
8 **  specifies the terms and conditions for redistribution.
9 */
10 
11 #ifndef lint
12 static char	SccsId[] = "@(#)stab.c	5.2 (Berkeley) 06/07/85";
13 #endif not lint
14 
15 # include "sendmail.h"
16 
17 /*
18 **  STAB -- manage the symbol table
19 **
20 **	Parameters:
21 **		name -- the name to be looked up or inserted.
22 **		type -- the type of symbol.
23 **		op -- what to do:
24 **			ST_ENTER -- enter the name if not
25 **				already present.
26 **			ST_FIND -- find it only.
27 **
28 **	Returns:
29 **		pointer to a STAB entry for this name.
30 **		NULL if not found and not entered.
31 **
32 **	Side Effects:
33 **		can update the symbol table.
34 */
35 
36 # define STABSIZE	400
37 
38 static STAB	*SymTab[STABSIZE];
39 
40 STAB *
41 stab(name, type, op)
42 	char *name;
43 	int type;
44 	int op;
45 {
46 	register STAB *s;
47 	register STAB **ps;
48 	extern bool sameword();
49 	register int hfunc;
50 	register char *p;
51 	extern char lower();
52 
53 # ifdef DEBUG
54 	if (tTd(36, 5))
55 		printf("STAB: %s %d ", name, type);
56 # endif DEBUG
57 
58 	/*
59 	**  Compute the hashing function
60 	**
61 	**	We could probably do better....
62 	*/
63 
64 	hfunc = type;
65 	for (p = name; *p != '\0'; p++)
66 		hfunc = (((hfunc << 7) | lower(*p)) & 077777) % STABSIZE;
67 
68 # ifdef DEBUG
69 	if (tTd(36, 9))
70 		printf("(hfunc=%d) ", hfunc);
71 # endif DEBUG
72 
73 	ps = &SymTab[hfunc];
74 	while ((s = *ps) != NULL && (!sameword(name, s->s_name) || s->s_type != type))
75 		ps = &s->s_next;
76 
77 	/*
78 	**  Dispose of the entry.
79 	*/
80 
81 	if (s != NULL || op == ST_FIND)
82 	{
83 # ifdef DEBUG
84 		if (tTd(36, 5))
85 		{
86 			if (s == NULL)
87 				printf("not found\n");
88 			else
89 			{
90 				long *lp = (long *) s->s_class;
91 
92 				printf("type %d val %lx %lx %lx %lx\n",
93 					s->s_type, lp[0], lp[1], lp[2], lp[3]);
94 			}
95 		}
96 # endif DEBUG
97 		return (s);
98 	}
99 
100 	/*
101 	**  Make a new entry and link it in.
102 	*/
103 
104 # ifdef DEBUG
105 	if (tTd(36, 5))
106 		printf("entered\n");
107 # endif DEBUG
108 
109 	/* make new entry */
110 	s = (STAB *) xalloc(sizeof *s);
111 	bzero((char *) s, sizeof *s);
112 	s->s_name = newstr(name);
113 	makelower(s->s_name);
114 	s->s_type = type;
115 
116 	/* link it in */
117 	*ps = s;
118 
119 	return (s);
120 }
121