symtab.c revision 268899
1258717Savg/* $Id: symtab.c,v 1.11 2014/03/26 00:17:09 Tom.Shields Exp $ */
2258717Savg
3258717Savg#include "defs.h"
4258717Savg
5258717Savg/* TABLE_SIZE is the number of entries in the symbol table. */
6258717Savg/* TABLE_SIZE must be a power of two.			    */
7258717Savg
8258717Savg#define	TABLE_SIZE 1024
9258717Savg
10258717Savgstatic bucket **symbol_table = 0;
11258717Savgbucket *first_symbol;
12258717Savgbucket *last_symbol;
13258717Savg
14258717Savgstatic int
15258717Savghash(const char *name)
16258717Savg{
17258717Savg    const char *s;
18258717Savg    int c, k;
19258717Savg
20258717Savg    assert(name && *name);
21258717Savg    s = name;
22258717Savg    k = *s;
23258717Savg    while ((c = *++s) != 0)
24258717Savg	k = (31 * k + c) & (TABLE_SIZE - 1);
25258717Savg
26265740Sdelphij    return (k);
27258717Savg}
28258717Savg
29258717Savgbucket *
30258717Savgmake_bucket(const char *name)
31258717Savg{
32258717Savg    bucket *bp;
33258717Savg
34258717Savg    assert(name != 0);
35258717Savg
36273193Sdelphij    bp = TMALLOC(bucket, 1);
37258717Savg    NO_SPACE(bp);
38258717Savg
39258717Savg    bp->link = 0;
40258717Savg    bp->next = 0;
41258717Savg
42258717Savg    bp->name = TMALLOC(char, strlen(name) + 1);
43258717Savg    NO_SPACE(bp->name);
44258717Savg
45258717Savg    bp->tag = 0;
46258717Savg    bp->value = UNDEFINED;
47258717Savg    bp->index = 0;
48258717Savg    bp->prec = 0;
49258717Savg    bp->class = UNKNOWN;
50258717Savg    bp->assoc = TOKEN;
51258717Savg#if defined(YYBTYACC)
52258717Savg    bp->args = -1;
53258717Savg    bp->argnames = 0;
54258717Savg    bp->argtags = 0;
55258717Savg    bp->destructor = 0;
56258717Savg#endif
57258717Savg    strcpy(bp->name, name);
58258717Savg
59258717Savg    return (bp);
60258717Savg}
61258717Savg
62258717Savgbucket *
63265740Sdelphijlookup(const char *name)
64258717Savg{
65258717Savg    bucket *bp, **bpp;
66258717Savg
67258717Savg    bpp = symbol_table + hash(name);
68258717Savg    bp = *bpp;
69258717Savg
70258717Savg    while (bp)
71258717Savg    {
72258717Savg	if (strcmp(name, bp->name) == 0)
73258717Savg	    return (bp);
74258717Savg	bpp = &bp->link;
75258717Savg	bp = *bpp;
76258717Savg    }
77258717Savg
78258717Savg    *bpp = bp = make_bucket(name);
79258717Savg    last_symbol->next = bp;
80258717Savg    last_symbol = bp;
81258717Savg
82265740Sdelphij    return (bp);
83258717Savg}
84269773Sdelphij
85258717Savgvoid
86258717Savgcreate_symbol_table(void)
87258717Savg{
88258717Savg    int i;
89258717Savg    bucket *bp;
90258717Savg
91258717Savg    symbol_table = TMALLOC(bucket *, TABLE_SIZE);
92258717Savg    NO_SPACE(symbol_table);
93258717Savg
94258717Savg    for (i = 0; i < TABLE_SIZE; i++)
95258717Savg	symbol_table[i] = 0;
96258717Savg
97265740Sdelphij    bp = make_bucket("error");
98258717Savg    bp->index = 1;
99269773Sdelphij    bp->class = TERM;
100258717Savg
101258717Savg    first_symbol = bp;
102258717Savg    last_symbol = bp;
103258717Savg    symbol_table[hash("error")] = bp;
104258717Savg}
105258717Savg
106258717Savgvoid
107258717Savgfree_symbol_table(void)
108258717Savg{
109258717Savg    FREE(symbol_table);
110258717Savg    symbol_table = 0;
111258717Savg}
112258717Savg
113258717Savgvoid
114258717Savgfree_symbols(void)
115258717Savg{
116258717Savg    bucket *p, *q;
117258717Savg
118258717Savg    for (p = first_symbol; p; p = q)
119258717Savg    {
120258717Savg	q = p->next;
121258717Savg	FREE(p);
122258717Savg    }
123258717Savg}
124258717Savg