|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)1.hash.c 4.2 (Berkeley) 4/6/87";
3: #endif not lint
4:
5: #include <stdio.h>
6: #include "1.incl.h"
7: #include "1.defs.h"
8: #include"def.h"
9:
10: extern int match[], symclass[], action[], newstate[];
11: extern char symbol[];
12: long *hashtab;
13: int *value, *chain;
14:
15: extern FILE *infd;
16:
17:
18: parse()
19: {int i,j,found,current, someread;
20: char c;
21:
22: hash_init();
23: routinit();
24: line_init();
25:
26: someread = 0; /* indicates haven't read part of a routine */
27:
28: empseek(0);
29: endbuf = getline(&endline, &endchar, &endcom, & comchar);
30: if (progress && endbuf != -1) fprintf(stderr,"parsing\n");
31: while(endbuf != -1) /* getline returns -1 when no more input */
32: {
33: someread = 1;
34: if (progress > 0)
35: {
36: for (i = begline; i <= endline; i++)
37: if (!(i % progress)) fprintf(stderr,"parsing line %d\n",i);
38: }
39: current = 0;
40: for (i = 0; i < endbuf; i++)
41: {
42:
43: c = buffer[i];
44: if(c != '~')
45: {
46: found = 0;
47: if ( (current < 0 || current >= snum) && current != ABORT)
48: {
49: strerr("in parsing:","","");
50: fprintf(stderr,"line %d of file, parser in invalid state", current);
51: fprintf(stderr,"treating it as straight line code\n");
52: current = ABORT;
53: }
54: else
55: for (j = match[current]; j < match[current + 1]; j++)
56: {
57: if ((symclass[j] == 0 && c == symbol[j]) ||
58: (symclass[j] != 0 && classmatch(c,symclass[j]) ))
59: {found = 1; break;
60: }
61: }
62: if (!found)
63: {
64: error("in syntax:","","");
65: fprintf(stderr,"between lines %d and %d of file\n",begline, endline);
66: if (debug)
67: fprintf(stderr,"symbol '%c' does not match entries for state %d\n",c,current);
68: fprintf(stderr,"treating it as straight line code\n");
69: current = ABORT;
70: }
71: else if (!action[j])
72: current = newstate[j];
73: else
74: {
75: current = act(action[j],c,i);
76: if (current == nulls) current = newstate[j];
77: }
78: if (current == ABORT) break;
79: if (current == endrt)
80: {
81: return(1);
82: }
83: }
84: }
85: line_init();
86: endbuf = getline(&endline, &endchar, &endcom,&comchar);
87: }
88: if (someread) return(1);
89: else return(0);
90: }
91:
92:
93: hash_init()
94: {
95: int i;
96: hashtab = challoc(sizeof(*hashtab) * maxhash);
97: chain = challoc(sizeof(*chain) * maxhash);
98: value = challoc(sizeof(*value) * maxhash);
99: for (i = 0; i < maxhash; i++)
100: {
101: hashtab[i] = -1L;
102: value[i] = -2;
103: chain[i] = 0;
104: }
105: }
106:
107:
108: hash_check()
109: {
110: int i;
111: for (i = 0; i < maxhash; ++i)
112: if (value[i] == -2 && hashtab[i] != -1L)
113: {
114: error("in syntax; label used but does not appear as statement label:","","");
115: fprintf(stderr,"%D\n",hashtab[i]);
116: routerr = 1;
117: }
118: }
119:
120: hash_free()
121: {
122: chfree(hashtab,sizeof(*hashtab) * maxhash);
123: hashtab = 0;
124: chfree(chain,sizeof(*chain) * maxhash);
125: chain = 0;
126: chfree(value,sizeof(*value) * maxhash);
127: value = 0;
128: }
129: hash(x)
130: long x;
131: {
132: int quo, rem, hcount, temp;
133:
134: ASSERT(x >= 0L, hash);
135: quo = x/maxhash;
136: rem = x - (quo * maxhash);
137: if (quo == 0) quo = 1;
138:
139: temp = rem;
140: for (hcount=0; (hashtab[temp] != -1L) && (hashtab[temp] != x) && (hcount<maxhash); hcount++)
141: temp = (temp + quo)%maxhash;
142: if(hcount>=maxhash) faterr("hash table overflow - too many labels","","");
143: hashtab[temp] = x;
144: return(temp);
145: }
146:
147: addref(x,ptr) /* put ptr in chain for x or assign value of x to *ptr */
148: long x;
149: int *ptr;
150: {
151: int index;
152: index = hash(x);
153:
154: if (value[index] == -1)
155: { /* x already assigned value */
156: *ptr = chain[index];
157: return;
158: }
159:
160: /* add ptr to chain */
161:
162: if (chain[index] == 0)
163: *ptr = 0;
164: else
165: *ptr = chain[index];
166: chain[index] = ptr;
167: }
168:
169: fixvalue (x,ptr)
170: long x;
171: int ptr;
172: {
173: int *temp1, *temp2, index, temp0;
174: index = hash(x);
175:
176: while (index != -2)
177: { /* trace chain of linked labels */
178:
179: if (value[index] == -1)
180: {
181: error("in syntax: ","","");
182: fprintf(stderr,"attempt to redefine value of label %D between lines %d and %d\n",
183: x,begline,endline);
184: routerr = 1;
185: return;
186: }
187:
188: temp1 = &chain[index]; /* trace chain for each label */
189: while (temp1 != 0)
190: {
191: temp2 = *temp1;
192: *temp1 = ptr;
193: temp1 = temp2;
194: }
195: temp0 = index;
196: index = value[index];
197: value[temp0] = -1;
198: }
199: }
200:
201: connect(x,y)
202: long x,y;
203: {
204: int *temp, index, temp2;
205: index = hash(x);
206:
207: if (value[index] == -1)
208: fixvalue(y, chain[index]);
209: else
210: {
211: if (y == implicit)
212: { /* attach implicit chain to x chain */
213: temp = &chain[index];
214:
215: while (*temp != 0)
216: temp = *temp;
217:
218: *temp = chain[hash(y)];
219: }
220: temp2 = index; /* attach y linked labels to x linked labels */
221: while (value[temp2] >= 0)
222: temp2 = value[temp2];
223: if (y == implicit)
224: value[temp2] = value[hash(y)];
225: else
226: value[temp2] = hash(y);
227: }
228: if (y == implicit) clear(y);
229: }
230:
231:
232: clear(x)
233: long x;
234: {
235: int index;
236: index = hash(x);
237: value[index] = -2;
238: chain[index] = 0;
239: hashtab[index] = -1L;
240: }
241:
242:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.