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