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