|
|
1.1 root 1: /* Symbol table manager for Bison,
2: Copyright (C) 1984, 1989 Free Software Foundation, Inc.
3:
4: This file is part of Bison, the GNU Compiler Compiler.
5:
6: Bison is free software; you can redistribute it and/or modify
7: it under the terms of the GNU General Public License as published by
8: the Free Software Foundation; either version 2, or (at your option)
9: any later version.
10:
11: Bison is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14: GNU General Public License for more details.
15:
16: You should have received a copy of the GNU General Public License
17: along with Bison; see the file COPYING. If not, write to
18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
19:
20:
21: #include <stdio.h>
22: #include "system.h"
23: #include "new.h"
24: #include "symtab.h"
25: #include "gram.h"
26:
27:
28: bucket **symtab;
29: bucket *firstsymbol;
30: bucket *lastsymbol;
31:
32:
33:
34: int
35: hash(key)
36: char *key;
37: {
38: register char *cp;
39: register int k;
40:
41: cp = key;
42: k = 0;
43: while (*cp)
44: k = ((k << 1) ^ (*cp++)) & 0x3fff;
45:
46: return (k % TABSIZE);
47: }
48:
49:
50:
51: char *
52: copys(s)
53: char *s;
54: {
55: register int i;
56: register char *cp;
57: register char *result;
58:
59: i = 1;
60: for (cp = s; *cp; cp++)
61: i++;
62:
63: result = xmalloc((unsigned int)i);
64: strcpy(result, s);
65: return (result);
66: }
67:
68:
69: void
70: tabinit()
71: {
72: /* register int i; JF unused */
73:
74: symtab = NEW2(TABSIZE, bucket *);
75:
76: firstsymbol = NULL;
77: lastsymbol = NULL;
78: }
79:
80:
81: bucket *
82: getsym(key)
83: char *key;
84: {
85: register int hashval;
86: register bucket *bp;
87: register int found;
88:
89: hashval = hash(key);
90: bp = symtab[hashval];
91:
92: found = 0;
93: while (bp != NULL && found == 0)
94: {
95: if (strcmp(key, bp->tag) == 0)
96: found = 1;
97: else
98: bp = bp->link;
99: }
100:
101: if (found == 0)
102: {
103: nsyms++;
104:
105: bp = NEW(bucket);
106: bp->link = symtab[hashval];
107: bp->next = NULL;
108: bp->tag = copys(key);
109: bp->class = SUNKNOWN;
110:
111: if (firstsymbol == NULL)
112: {
113: firstsymbol = bp;
114: lastsymbol = bp;
115: }
116: else
117: {
118: lastsymbol->next = bp;
119: lastsymbol = bp;
120: }
121:
122: symtab[hashval] = bp;
123: }
124:
125: return (bp);
126: }
127:
128:
129: void
130: free_symtab()
131: {
132: register int i;
133: register bucket *bp,*bptmp;/* JF don't use ptr after free */
134:
135: for (i = 0; i < TABSIZE; i++)
136: {
137: bp = symtab[i];
138: while (bp)
139: {
140: bptmp = bp->link;
141: #if 0 /* This causes crashes because one string can appear more than once. */
142: if (bp->type_name)
143: FREE(bp->type_name);
144: #endif
145: FREE(bp);
146: bp = bptmp;
147: }
148: }
149: FREE(symtab);
150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.