improve behaviour under VPC, fixes from nicolas tittley.
[minix.git] / commands / byacc / symtab.c
blobc7c6ac03a793154889287a5101a2779e55813878
1 #include "defs.h"
4 /* TABLE_SIZE is the number of entries in the symbol table. */
5 /* TABLE_SIZE must be a power of two. */
7 #define TABLE_SIZE 1024
10 bucket **symbol_table;
11 bucket *first_symbol;
12 bucket *last_symbol;
15 int
16 hash(name)
17 char *name;
19 register char *s;
20 register int c, k;
22 assert(name && *name);
23 s = name;
24 k = *s;
25 while (c = *++s)
26 k = (31*k + c) & (TABLE_SIZE - 1);
28 return (k);
32 bucket *
33 make_bucket(name)
34 char *name;
36 register bucket *bp;
38 assert(name);
39 bp = (bucket *) MALLOC(sizeof(bucket));
40 if (bp == 0) no_space();
41 bp->link = 0;
42 bp->next = 0;
43 bp->name = MALLOC(strlen(name) + 1);
44 if (bp->name == 0) no_space();
45 bp->tag = 0;
46 bp->value = UNDEFINED;
47 bp->index = 0;
48 bp->prec = 0;
49 bp-> class = UNKNOWN;
50 bp->assoc = TOKEN;
52 if (bp->name == 0) no_space();
53 strcpy(bp->name, name);
55 return (bp);
59 bucket *
60 lookup(name)
61 char *name;
63 register bucket *bp, **bpp;
65 bpp = symbol_table + hash(name);
66 bp = *bpp;
68 while (bp)
70 if (strcmp(name, bp->name) == 0) return (bp);
71 bpp = &bp->link;
72 bp = *bpp;
75 *bpp = bp = make_bucket(name);
76 last_symbol->next = bp;
77 last_symbol = bp;
79 return (bp);
83 create_symbol_table()
85 register int i;
86 register bucket *bp;
88 symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
89 if (symbol_table == 0) no_space();
90 for (i = 0; i < TABLE_SIZE; i++)
91 symbol_table[i] = 0;
93 bp = make_bucket("error");
94 bp->index = 1;
95 bp->class = TERM;
97 first_symbol = bp;
98 last_symbol = bp;
99 symbol_table[hash("error")] = bp;
103 free_symbol_table()
105 FREE(symbol_table);
106 symbol_table = 0;
110 free_symbols()
112 register bucket *p, *q;
114 for (p = first_symbol; p; p = q)
116 q = p->next;
117 FREE(p);