|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Eric P. Allman
3: * Copyright (c) 1988 Regents of the University of California.
4: * All rights reserved.
5: *
6: * Redistribution and use in source and binary forms are permitted
7: * provided that the above copyright notice and this paragraph are
8: * duplicated in all such forms and that any documentation,
9: * advertising materials, and other materials related to such
10: * distribution and use acknowledge that the software was developed
11: * by the University of California, Berkeley. The name of the
12: * University may not be used to endorse or promote products derived
13: * from this software without specific prior written permission.
14: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
15: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
16: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
17: */
18:
19: #ifndef lint
20: static char sccsid[] = "@(#)stab.c 5.5 (Berkeley) 6/30/88";
21: #endif /* not lint */
22:
23: # include "sendmail.h"
24:
25: /*
26: ** STAB -- manage the symbol table
27: **
28: ** Parameters:
29: ** name -- the name to be looked up or inserted.
30: ** type -- the type of symbol.
31: ** op -- what to do:
32: ** ST_ENTER -- enter the name if not
33: ** already present.
34: ** ST_FIND -- find it only.
35: **
36: ** Returns:
37: ** pointer to a STAB entry for this name.
38: ** NULL if not found and not entered.
39: **
40: ** Side Effects:
41: ** can update the symbol table.
42: */
43:
44: # define STABSIZE 400
45:
46: static STAB *SymTab[STABSIZE];
47:
48: STAB *
49: stab(name, type, op)
50: char *name;
51: int type;
52: int op;
53: {
54: register STAB *s;
55: register STAB **ps;
56: register int hfunc;
57: register char *p;
58: extern char lower();
59:
60: # ifdef DEBUG
61: if (tTd(36, 5))
62: printf("STAB: %s %d ", name, type);
63: # endif DEBUG
64:
65: /*
66: ** Compute the hashing function
67: **
68: ** We could probably do better....
69: */
70:
71: hfunc = type;
72: for (p = name; *p != '\0'; p++)
73: hfunc = (((hfunc << 7) | lower(*p)) & 077777) % STABSIZE;
74:
75: # ifdef DEBUG
76: if (tTd(36, 9))
77: printf("(hfunc=%d) ", hfunc);
78: # endif DEBUG
79:
80: ps = &SymTab[hfunc];
81: while ((s = *ps) != NULL && (strcasecmp(name, s->s_name) || s->s_type != type))
82: ps = &s->s_next;
83:
84: /*
85: ** Dispose of the entry.
86: */
87:
88: if (s != NULL || op == ST_FIND)
89: {
90: # ifdef DEBUG
91: if (tTd(36, 5))
92: {
93: if (s == NULL)
94: printf("not found\n");
95: else
96: {
97: long *lp = (long *) s->s_class;
98:
99: printf("type %d val %lx %lx %lx %lx\n",
100: s->s_type, lp[0], lp[1], lp[2], lp[3]);
101: }
102: }
103: # endif DEBUG
104: return (s);
105: }
106:
107: /*
108: ** Make a new entry and link it in.
109: */
110:
111: # ifdef DEBUG
112: if (tTd(36, 5))
113: printf("entered\n");
114: # endif DEBUG
115:
116: /* make new entry */
117: s = (STAB *) xalloc(sizeof *s);
118: bzero((char *) s, sizeof *s);
119: s->s_name = newstr(name);
120: makelower(s->s_name);
121: s->s_type = type;
122:
123: /* link it in */
124: *ps = s;
125:
126: return (s);
127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.