1264803Sbapt/* $Id: symtab.c,v 1.11 2014/03/26 00:17:09 Tom.Shields Exp $ */
2234949Sbapt
3234949Sbapt#include "defs.h"
4234949Sbapt
5234949Sbapt/* TABLE_SIZE is the number of entries in the symbol table. */
6234949Sbapt/* TABLE_SIZE must be a power of two.			    */
7234949Sbapt
8234949Sbapt#define	TABLE_SIZE 1024
9234949Sbapt
10234949Sbaptstatic bucket **symbol_table = 0;
11234949Sbaptbucket *first_symbol;
12234949Sbaptbucket *last_symbol;
13234949Sbapt
14234949Sbaptstatic int
15234949Sbapthash(const char *name)
16234949Sbapt{
17234949Sbapt    const char *s;
18234949Sbapt    int c, k;
19234949Sbapt
20234949Sbapt    assert(name && *name);
21234949Sbapt    s = name;
22234949Sbapt    k = *s;
23234949Sbapt    while ((c = *++s) != 0)
24234949Sbapt	k = (31 * k + c) & (TABLE_SIZE - 1);
25234949Sbapt
26234949Sbapt    return (k);
27234949Sbapt}
28234949Sbapt
29234949Sbaptbucket *
30234949Sbaptmake_bucket(const char *name)
31234949Sbapt{
32234949Sbapt    bucket *bp;
33234949Sbapt
34234949Sbapt    assert(name != 0);
35234949Sbapt
36240517Sbapt    bp = TMALLOC(bucket, 1);
37234949Sbapt    NO_SPACE(bp);
38234949Sbapt
39234949Sbapt    bp->link = 0;
40234949Sbapt    bp->next = 0;
41234949Sbapt
42240517Sbapt    bp->name = TMALLOC(char, strlen(name) + 1);
43234949Sbapt    NO_SPACE(bp->name);
44234949Sbapt
45234949Sbapt    bp->tag = 0;
46234949Sbapt    bp->value = UNDEFINED;
47234949Sbapt    bp->index = 0;
48234949Sbapt    bp->prec = 0;
49234949Sbapt    bp->class = UNKNOWN;
50234949Sbapt    bp->assoc = TOKEN;
51264803Sbapt#if defined(YYBTYACC)
52264803Sbapt    bp->args = -1;
53264803Sbapt    bp->argnames = 0;
54264803Sbapt    bp->argtags = 0;
55264803Sbapt    bp->destructor = 0;
56264803Sbapt#endif
57234949Sbapt    strcpy(bp->name, name);
58234949Sbapt
59234949Sbapt    return (bp);
60234949Sbapt}
61234949Sbapt
62234949Sbaptbucket *
63234949Sbaptlookup(const char *name)
64234949Sbapt{
65234949Sbapt    bucket *bp, **bpp;
66234949Sbapt
67234949Sbapt    bpp = symbol_table + hash(name);
68234949Sbapt    bp = *bpp;
69234949Sbapt
70234949Sbapt    while (bp)
71234949Sbapt    {
72234949Sbapt	if (strcmp(name, bp->name) == 0)
73234949Sbapt	    return (bp);
74234949Sbapt	bpp = &bp->link;
75234949Sbapt	bp = *bpp;
76234949Sbapt    }
77234949Sbapt
78234949Sbapt    *bpp = bp = make_bucket(name);
79234949Sbapt    last_symbol->next = bp;
80234949Sbapt    last_symbol = bp;
81234949Sbapt
82234949Sbapt    return (bp);
83234949Sbapt}
84234949Sbapt
85234949Sbaptvoid
86234949Sbaptcreate_symbol_table(void)
87234949Sbapt{
88234949Sbapt    int i;
89234949Sbapt    bucket *bp;
90234949Sbapt
91240517Sbapt    symbol_table = TMALLOC(bucket *, TABLE_SIZE);
92234949Sbapt    NO_SPACE(symbol_table);
93234949Sbapt
94234949Sbapt    for (i = 0; i < TABLE_SIZE; i++)
95234949Sbapt	symbol_table[i] = 0;
96234949Sbapt
97234949Sbapt    bp = make_bucket("error");
98234949Sbapt    bp->index = 1;
99234949Sbapt    bp->class = TERM;
100234949Sbapt
101234949Sbapt    first_symbol = bp;
102234949Sbapt    last_symbol = bp;
103234949Sbapt    symbol_table[hash("error")] = bp;
104234949Sbapt}
105234949Sbapt
106234949Sbaptvoid
107234949Sbaptfree_symbol_table(void)
108234949Sbapt{
109234949Sbapt    FREE(symbol_table);
110234949Sbapt    symbol_table = 0;
111234949Sbapt}
112234949Sbapt
113234949Sbaptvoid
114234949Sbaptfree_symbols(void)
115234949Sbapt{
116234949Sbapt    bucket *p, *q;
117234949Sbapt
118234949Sbapt    for (p = first_symbol; p; p = q)
119234949Sbapt    {
120234949Sbapt	q = p->next;
121234949Sbapt	FREE(p);
122234949Sbapt    }
123234949Sbapt}
124