symtab.c revision 240517
1240517Sbapt/* $Id: symtab.c,v 1.10 2012/05/26 15:16:12 tom 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; 51234949Sbapt strcpy(bp->name, name); 52234949Sbapt 53234949Sbapt return (bp); 54234949Sbapt} 55234949Sbapt 56234949Sbaptbucket * 57234949Sbaptlookup(const char *name) 58234949Sbapt{ 59234949Sbapt bucket *bp, **bpp; 60234949Sbapt 61234949Sbapt bpp = symbol_table + hash(name); 62234949Sbapt bp = *bpp; 63234949Sbapt 64234949Sbapt while (bp) 65234949Sbapt { 66234949Sbapt if (strcmp(name, bp->name) == 0) 67234949Sbapt return (bp); 68234949Sbapt bpp = &bp->link; 69234949Sbapt bp = *bpp; 70234949Sbapt } 71234949Sbapt 72234949Sbapt *bpp = bp = make_bucket(name); 73234949Sbapt last_symbol->next = bp; 74234949Sbapt last_symbol = bp; 75234949Sbapt 76234949Sbapt return (bp); 77234949Sbapt} 78234949Sbapt 79234949Sbaptvoid 80234949Sbaptcreate_symbol_table(void) 81234949Sbapt{ 82234949Sbapt int i; 83234949Sbapt bucket *bp; 84234949Sbapt 85240517Sbapt symbol_table = TMALLOC(bucket *, TABLE_SIZE); 86234949Sbapt NO_SPACE(symbol_table); 87234949Sbapt 88234949Sbapt for (i = 0; i < TABLE_SIZE; i++) 89234949Sbapt symbol_table[i] = 0; 90234949Sbapt 91234949Sbapt bp = make_bucket("error"); 92234949Sbapt bp->index = 1; 93234949Sbapt bp->class = TERM; 94234949Sbapt 95234949Sbapt first_symbol = bp; 96234949Sbapt last_symbol = bp; 97234949Sbapt symbol_table[hash("error")] = bp; 98234949Sbapt} 99234949Sbapt 100234949Sbaptvoid 101234949Sbaptfree_symbol_table(void) 102234949Sbapt{ 103234949Sbapt FREE(symbol_table); 104234949Sbapt symbol_table = 0; 105234949Sbapt} 106234949Sbapt 107234949Sbaptvoid 108234949Sbaptfree_symbols(void) 109234949Sbapt{ 110234949Sbapt bucket *p, *q; 111234949Sbapt 112234949Sbapt for (p = first_symbol; p; p = q) 113234949Sbapt { 114234949Sbapt q = p->next; 115234949Sbapt FREE(p); 116234949Sbapt } 117234949Sbapt} 118