|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1989 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Robert Paul Corbett. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted provided ! 9: * that: (1) source distributions retain this entire copyright notice and ! 10: * comment, and (2) distributions including binaries display the following ! 11: * acknowledgement: ``This product includes software developed by the ! 12: * University of California, Berkeley and its contributors'' in the ! 13: * documentation or other materials provided with the distribution and in ! 14: * all advertising materials mentioning features or use of this software. ! 15: * Neither the name of the University nor the names of its contributors may ! 16: * be used to endorse or promote products derived from this software without ! 17: * specific prior written permission. ! 18: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ! 19: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ! 20: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 21: */ ! 22: ! 23: #ifndef lint ! 24: static char sccsid[] = "@(#)symtab.c 5.3 (Berkeley) 6/1/90"; ! 25: #endif /* not lint */ ! 26: ! 27: #include "defs.h" ! 28: ! 29: /* TABLE_SIZE is the number of entries in the symbol table. */ ! 30: /* TABLE_SIZE must be a power of two. */ ! 31: ! 32: #define TABLE_SIZE 1024 ! 33: ! 34: ! 35: bucket **symbol_table; ! 36: bucket *first_symbol; ! 37: bucket *last_symbol; ! 38: ! 39: ! 40: int ! 41: hash(name) ! 42: char *name; ! 43: { ! 44: register char *s; ! 45: register int c, k; ! 46: ! 47: assert(name && *name); ! 48: s = name; ! 49: k = *s; ! 50: while (c = *++s) ! 51: k = (31*k + c) & (TABLE_SIZE - 1); ! 52: ! 53: return (k); ! 54: } ! 55: ! 56: ! 57: bucket * ! 58: make_bucket(name) ! 59: char *name; ! 60: { ! 61: register bucket *bp; ! 62: ! 63: assert(name); ! 64: bp = (bucket *) MALLOC(sizeof(bucket)); ! 65: if (bp == 0) no_space(); ! 66: bp->link = 0; ! 67: bp->next = 0; ! 68: bp->name = MALLOC(strlen(name) + 1); ! 69: if (bp->name == 0) no_space(); ! 70: bp->tag = 0; ! 71: bp->value = UNDEFINED; ! 72: bp->index = 0; ! 73: bp->prec = 0; ! 74: bp-> class = UNKNOWN; ! 75: bp->assoc = TOKEN; ! 76: ! 77: if (bp->name == 0) no_space(); ! 78: strcpy(bp->name, name); ! 79: ! 80: return (bp); ! 81: } ! 82: ! 83: ! 84: bucket * ! 85: lookup(name) ! 86: char *name; ! 87: { ! 88: register bucket *bp, **bpp; ! 89: ! 90: bpp = symbol_table + hash(name); ! 91: bp = *bpp; ! 92: ! 93: while (bp) ! 94: { ! 95: if (strcmp(name, bp->name) == 0) return (bp); ! 96: bpp = &bp->link; ! 97: bp = *bpp; ! 98: } ! 99: ! 100: *bpp = bp = make_bucket(name); ! 101: last_symbol->next = bp; ! 102: last_symbol = bp; ! 103: ! 104: return (bp); ! 105: } ! 106: ! 107: ! 108: create_symbol_table() ! 109: { ! 110: register int i; ! 111: register bucket *bp; ! 112: ! 113: symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *)); ! 114: if (symbol_table == 0) no_space(); ! 115: for (i = 0; i < TABLE_SIZE; i++) ! 116: symbol_table[i] = 0; ! 117: ! 118: bp = make_bucket("error"); ! 119: bp->index = 1; ! 120: bp->class = TERM; ! 121: ! 122: first_symbol = bp; ! 123: last_symbol = bp; ! 124: symbol_table[hash("error")] = bp; ! 125: } ! 126: ! 127: ! 128: free_symbol_table() ! 129: { ! 130: FREE(symbol_table); ! 131: symbol_table = 0; ! 132: } ! 133: ! 134: ! 135: free_symbols() ! 136: { ! 137: register bucket *p, *q; ! 138: ! 139: for (p = first_symbol; p; p = q) ! 140: { ! 141: q = p->next; ! 142: FREE(p); ! 143: } ! 144: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.