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) 6/7/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: }
Defined functions
stab
defined in line
40; used 13 times
Defined variables
Defined macros