break out special local mail processing (e.g., mapping to the
[unix-history] / usr / src / usr.bin / yacc / symtab.c
CommitLineData
92ec8d3b
KB
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 *
6ecf3d85 8 * %sccs.include.redist.c%
92ec8d3b
KB
9 */
10
11#ifndef lint
6ecf3d85 12static char sccsid[] = "@(#)symtab.c 5.3 (Berkeley) %G%";
92ec8d3b
KB
13#endif /* not lint */
14
15#include "defs.h"
16
17/* TABLE_SIZE is the number of entries in the symbol table. */
18/* TABLE_SIZE must be a power of two. */
19
20#define TABLE_SIZE 1024
21
22
23bucket **symbol_table;
24bucket *first_symbol;
25bucket *last_symbol;
26
27
28int
29hash(name)
30char *name;
31{
32 register char *s;
33 register int c, k;
34
35 assert(name && *name);
36 s = name;
37 k = *s;
38 while (c = *++s)
39 k = (31*k + c) & (TABLE_SIZE - 1);
40
41 return (k);
42}
43
44
45bucket *
46make_bucket(name)
47char *name;
48{
49 register bucket *bp;
50
51 assert(name);
52 bp = (bucket *) MALLOC(sizeof(bucket));
53 if (bp == 0) no_space();
54 bp->link = 0;
55 bp->next = 0;
56 bp->name = MALLOC(strlen(name) + 1);
3e83b7de 57 if (bp->name == 0) no_space();
92ec8d3b
KB
58 bp->tag = 0;
59 bp->value = UNDEFINED;
60 bp->index = 0;
61 bp->prec = 0;
62 bp-> class = UNKNOWN;
63 bp->assoc = TOKEN;
64
65 if (bp->name == 0) no_space();
66 strcpy(bp->name, name);
67
68 return (bp);
69}
70
71
72bucket *
73lookup(name)
74char *name;
75{
76 register bucket *bp, **bpp;
77
78 bpp = symbol_table + hash(name);
79 bp = *bpp;
80
81 while (bp)
82 {
83 if (strcmp(name, bp->name) == 0) return (bp);
84 bpp = &bp->link;
85 bp = *bpp;
86 }
87
88 *bpp = bp = make_bucket(name);
89 last_symbol->next = bp;
90 last_symbol = bp;
91
92 return (bp);
93}
94
95
96create_symbol_table()
97{
98 register int i;
99 register bucket *bp;
100
3e83b7de
KB
101 symbol_table = (bucket **) MALLOC(TABLE_SIZE*sizeof(bucket *));
102 if (symbol_table == 0) no_space();
92ec8d3b
KB
103 for (i = 0; i < TABLE_SIZE; i++)
104 symbol_table[i] = 0;
105
106 bp = make_bucket("error");
107 bp->index = 1;
108 bp->class = TERM;
109
110 first_symbol = bp;
111 last_symbol = bp;
112 symbol_table[hash("error")] = bp;
113}
114
115
116free_symbol_table()
117{
118 FREE(symbol_table);
119 symbol_table = 0;
120}
121
122
123free_symbols()
124{
125 register bucket *p, *q;
126
127 for (p = first_symbol; p; p = q)
128 {
129 q = p->next;
130 FREE(p);
131 }
132}