00001 #include "defs.h" 00002 00003 00004 /* TABLE_SIZE is the number of entries in the symbol table. */ 00005 /* TABLE_SIZE must be a power of two. */ 00006 00007 #define TABLE_SIZE 1024 00008 00009 00010 bucket **symbol_table; 00011 bucket *first_symbol; 00012 bucket *last_symbol; 00013 00014 00015 int 00016 hash(name) 00017 char *name; 00018 { 00019 register char *s; 00020 register int c, k; 00021 00022 assert(name && *name); 00023 s = name; 00024 k = *s; 00025 while (c = *++s) 00026 k = (31*k + c) & (TABLE_SIZE - 1); 00027 00028 return (k); 00029 } 00030 00031 00032 bucket * 00033 make_bucket(name) 00034 char *name; 00035 { 00036 register bucket *bp; 00037 00038 assert(name); 00039 bp = (bucket *) MALLOC(sizeof(bucket)); 00040 if (bp == 0) no_space(); 00041 bp->link = 0; 00042 bp->next = 0; 00043 bp->name = MALLOC(strlen(name) + 1); 00044 if (bp->name == 0) no_space(); 00045 bp->tag = 0; 00046 bp->value = UNDEFINED; 00047 bp->index = 0; 00048 bp->prec = 0; 00049 bp-> class = UNKNOWN; 00050 bp->assoc = TOKEN; 00051 00052 if (bp->name == 0) no_space(); 00053 strcpy(bp->name, name); 00054 00055 return (bp); 00056 } 00057 00058 00059 bucket * 00060 lookup(name) 00061 char *name; 00062 { 00063 register bucket *bp, **bpp; 00064 00065 bpp = symbol_table + hash(name); 00066 bp = *bpp; 00067 00068 while (bp) 00069 { 00070 if (strcmp(name, bp->name) == 0) return (bp); 00071 bpp = &bp->link; 00072 bp = *bpp; 00073 } 00074 00075 *bpp = bp = make_bucket(name); 00076 last_symbol->next = bp; 00077 last_symbol = bp; 00078 00079 return (bp); 00080 } 00081 00082 00083 create_symbol_table() 00084 { 00085 register int i; 00086 register bucket *bp; 00087 00088 symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *)); 00089 if (symbol_table == 0) no_space(); 00090 for (i = 0; i < TABLE_SIZE; i++) 00091 symbol_table[i] = 0; 00092 00093 bp = make_bucket("error"); 00094 bp->index = 1; 00095 bp->class = TERM; 00096 00097 first_symbol = bp; 00098 last_symbol = bp; 00099 symbol_table[hash("error")] = bp; 00100 } 00101 00102 00103 free_symbol_table() 00104 { 00105 FREE(symbol_table); 00106 symbol_table = 0; 00107 } 00108 00109 00110 free_symbols() 00111 { 00112 register bucket *p, *q; 00113 00114 for (p = first_symbol; p; p = q) 00115 { 00116 q = p->next; 00117 FREE(p); 00118 } 00119 }
1.4.6