source: trunk/third/sendmail/src/stab.c @ 12554

Revision 12554, 3.8 KB checked in by danw, 26 years ago (diff)
This commit was generated by cvs2svn to compensate for changes in r12553, which included commits to RCS files with non-trunk default branches.
Line 
1/*
2 * Copyright (c) 1998 Sendmail, Inc.  All rights reserved.
3 * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
4 * Copyright (c) 1988, 1993
5 *      The Regents of the University of California.  All rights reserved.
6 *
7 * By using this file, you agree to the terms and conditions set
8 * forth in the LICENSE file which can be found at the top level of
9 * the sendmail distribution.
10 *
11 */
12
13#ifndef lint
14static char sccsid[] = "@(#)stab.c      8.19 (Berkeley) 5/19/1998";
15#endif /* not lint */
16
17# include "sendmail.h"
18
19/*
20**  STAB -- manage the symbol table
21**
22**      Parameters:
23**              name -- the name to be looked up or inserted.
24**              type -- the type of symbol.
25**              op -- what to do:
26**                      ST_ENTER -- enter the name if not
27**                              already present.
28**                      ST_FIND -- find it only.
29**
30**      Returns:
31**              pointer to a STAB entry for this name.
32**              NULL if not found and not entered.
33**
34**      Side Effects:
35**              can update the symbol table.
36*/
37
38# define STABSIZE       2003
39
40static STAB     *SymTab[STABSIZE];
41
42STAB *
43stab(name, type, op)
44        char *name;
45        int type;
46        int op;
47{
48        register STAB *s;
49        register STAB **ps;
50        register int hfunc;
51        register char *p;
52        int len;
53        extern char lower __P((char));
54
55        if (tTd(36, 5))
56                printf("STAB: %s %d ", name, type);
57
58        /*
59        **  Compute the hashing function
60        */
61
62        hfunc = type;
63        for (p = name; *p != '\0'; p++)
64                hfunc = ((hfunc << 1) ^ (lower(*p) & 0377)) % STABSIZE;
65
66        if (tTd(36, 9))
67                printf("(hfunc=%d) ", hfunc);
68
69        ps = &SymTab[hfunc];
70        if (type == ST_MACRO || type == ST_RULESET)
71        {
72                while ((s = *ps) != NULL &&
73                       (s->s_type != type || strcmp(name, s->s_name)))
74                        ps = &s->s_next;
75        }
76        else
77        {
78                while ((s = *ps) != NULL &&
79                       (s->s_type != type || strcasecmp(name, s->s_name)))
80                        ps = &s->s_next;
81        }
82
83        /*
84        **  Dispose of the entry.
85        */
86
87        if (s != NULL || op == ST_FIND)
88        {
89                if (tTd(36, 5))
90                {
91                        if (s == NULL)
92                                printf("not found\n");
93                        else
94                        {
95                                long *lp = (long *) s->s_class;
96
97                                printf("type %d val %lx %lx %lx %lx\n",
98                                        s->s_type, lp[0], lp[1], lp[2], lp[3]);
99                        }
100                }
101                return (s);
102        }
103
104        /*
105        **  Make a new entry and link it in.
106        */
107
108        if (tTd(36, 5))
109                printf("entered\n");
110
111        /* determine size of new entry */
112#if _FFR_MEMORY_MISER
113        switch (type)
114        {
115          case ST_CLASS:
116                len = sizeof s->s_class;
117                break;
118
119          case ST_ADDRESS:
120                len = sizeof s->s_address;
121                break;
122
123          case ST_MAILER:
124                len = sizeof s->s_mailer;
125
126          case ST_ALIAS:
127                len = sizeof s->s_alias;
128                break;
129
130          case ST_MAPCLASS:
131                len = sizeof s->s_mapclass;
132                break;
133
134          case ST_MAP:
135                len = sizeof s->s_map;
136                break;
137
138          case ST_HOSTSIG:
139                len = sizeof s->s_hostsig;
140                break;
141
142          case ST_NAMECANON:
143                len = sizeof s->s_namecanon;
144                break;
145
146          case ST_MACRO:
147                len = sizeof s->s_macro;
148                break;
149
150          case ST_RULESET:
151                len = sizeof s->s_ruleset;
152                break;
153
154          case ST_SERVICE:
155                len = sizeof s->s_service;
156                break;
157
158          case ST_HEADER:
159                len = sizeof s->s_header;
160                break;
161
162          default:
163                if (type >= ST_MCI)
164                        len = sizeof s->s_mci;
165                else
166                {
167                        syserr("stab: unknown symbol type %d", type);
168                        len = sizeof s->s_value;
169                }
170                break;
171        }
172        len += sizeof *s - sizeof s->s_value;
173#else
174        len = sizeof *s;
175#endif
176
177        /* make new entry */
178        s = (STAB *) xalloc(len);
179        bzero((char *) s, len);
180        s->s_name = newstr(name);
181        s->s_type = type;
182        s->s_len = len;
183
184        /* link it in */
185        *ps = s;
186
187        return (s);
188}
189/*
190**  STABAPPLY -- apply function to all stab entries
191**
192**      Parameters:
193**              func -- the function to apply.  It will be given one
194**                      parameter (the stab entry).
195**              arg -- an arbitrary argument, passed to func.
196**
197**      Returns:
198**              none.
199*/
200
201void
202stabapply(func, arg)
203        void (*func)__P((STAB *, int));
204        int arg;
205{
206        register STAB **shead;
207        register STAB *s;
208
209        for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++)
210        {
211                for (s = *shead; s != NULL; s = s->s_next)
212                {
213                        if (tTd(36, 90))
214                                printf("stabapply: trying %d/%s\n",
215                                        s->s_type, s->s_name);
216                        func(s, arg);
217                }
218        }
219}
Note: See TracBrowser for help on using the repository browser.