|
|
1.1 root 1: #include <stdio.h>
2: #include "pret.h"
3:
4: struct {
5: char name[MAXNAME];
6: int status;
7: int initval;
8: int index; /* set if used as array */
9: int width; /* in bits: for supertrace */
10: } vartbl[MANY];
11:
12: struct {
13: int m; /* index of basename in vartbl */
14: int n; /* reference to the index */
15: } ivartbl[MANY];
16: int realnrvars=0;
17:
18: struct {
19: int m; /* index of basename in globvartbl */
20: int n; /* reference to the index */
21: } igvartbl[MANY];
22: int realgvars=0;
23:
24: struct {
25: char name[MAXNAME];
26: int status;
27: int initval;
28: int index;
29: int width;
30: } globvartbl[MANY];
31:
32: int nrvars = 0;
33: int nrglobvars = 0;
34: int varwidths = 0;
35:
36: extern char procname[MAXNAME];
37: extern char refname[MAXNAME];
38: extern int anyerror, pid, rid;
39:
40: reallocal(m, n)
41: { int i;
42: for (i = 0; i < realnrvars; i++)
43: if (ivartbl[i].m == m && ivartbl[i].n == n)
44: return i;
45: if ((i = realnrvars++) >= MANY)
46: whoops("reallocal overflow");
47: ivartbl[i].n = n;
48: ivartbl[i].m = m;
49: return i;
50: }
51:
52: realglobal(m, n)
53: { int i;
54: for (i = 0; i < realgvars; i++)
55: if (igvartbl[i].m == m && igvartbl[i].n == n)
56: return i;
57: if ((i = realgvars++) >= MANY)
58: whoops("realglobal overflow");
59: igvartbl[i].n = n;
60: igvartbl[i].m = m;
61: return i;
62: }
63:
64: twiddle(suff)
65: char *suff;
66: { int i; extern int extras;
67:
68: for (i = 0; i < nrvars; i++)
69: if (strcmp(vartbl[i].name, suff) == 0)
70: { vartbl[i].initval++;
71: return;
72: }
73: whoops("cannot happen, twiddle");
74: }
75:
76: isarrayvar(suff)
77: char *suff;
78: { int i;
79:
80: for (i = 0; i < nrvars; i++)
81: if (strcmp(vartbl[i].name, suff) == 0
82: && vartbl[i].index != NONE)
83: return 1;
84: for (i = 0; i < nrglobvars; i++)
85: if (strcmp(globvartbl[i].name, suff) == 0
86: && globvartbl[i].index != NONE)
87: return 1;
88: return 0;
89: }
90:
91: looklocal(suff, how, index)
92: char *suff;
93: { int i;
94:
95: for (i = 0; i < nrvars; i++)
96: if (strcmp(vartbl[i].name, suff) == 0)
97: { vartbl[i].status |= how;
98: break;
99: }
100:
101: if (i != nrvars && how == DCL)
102: yyerror("local variable redeclared, %s", suff);
103:
104: if (i != nrvars && how == RFR && index != vartbl[i].index
105: && (index == NONE || vartbl[i].index == NONE))
106: yyerror("local variable array indexing error, %s", suff);
107: return i;
108: }
109:
110: lookglobal(suff, how, index)
111: char *suff;
112: { int i;
113:
114: for (i = 0; i < nrglobvars; i++)
115: if (strcmp(globvartbl[i].name, suff) == 0)
116: { globvartbl[i].status |= how;
117: break;
118: }
119:
120: if (pid == NONE && rid == NONE && i != nrglobvars && how == DCL)
121: yyerror("global variable redeclared, %s", suff);
122:
123: if (i != nrglobvars && how == RFR && index != globvartbl[i].index
124: && (index == NONE || globvartbl[i].index == NONE))
125: yyerror("global variable array indexing error, %s", suff);
126: return i;
127: }
128:
129: putlocal(what, ival, how, index, width)
130: char *what;
131: { int i;
132:
133: if ((i = nrvars++) >= MANY)
134: whoops("too many variables");
135:
136: strcpy(vartbl[i].name, what);
137: vartbl[i].initval = ival;
138: vartbl[i].status = how;
139: vartbl[i].index = index;
140: vartbl[i].width = width;
141: if (index != NONE && ival != NONE)
142: { fprintf(stderr,"error: no automatic initialization");
143: fprintf(stderr, " of array `%s'\n",what);
144: anyerror++;
145: }
146: if (width != 0) varwidths=1;
147: return (MANY + i);
148: }
149:
150: putglobal(what, ival, how, index, width)
151: char *what;
152: { int i;
153:
154: if ((i = nrglobvars++) >= MANY)
155: whoops("too many variables");
156: strcpy(globvartbl[i].name, what);
157: globvartbl[i].initval = ival;
158: globvartbl[i].status = how;
159: globvartbl[i].index = index;
160: globvartbl[i].width = width;
161: if (index != NONE && ival != NONE)
162: { fprintf(stderr,"error: no automatic initialization");
163: fprintf(stderr, " of array `%s'\n",what);
164: anyerror++;
165: }
166: if (width != 0) varwidths=1;
167:
168: return i;
169: }
170: /*
171: * arrays are merely patched in for now
172: */
173: addvarname(what, how, ival, index, width)
174: char *what;
175: {
176: int i, islocal = (rid != NONE || pid != NONE);
177:
178: if (rid != NONE && (i = Fparname(what, rid, ISV, NONE, how, index)) != -1)
179: return (2*MANY + i);
180: /* formal parameter may not be an array reference */
181:
182: if (islocal && (i = looklocal(what, how, index)) < nrvars)
183: return (MANY + reallocal(i, index));
184: if ((i = lookglobal(what, how, index)) < nrglobvars)
185: return realglobal(i, index);
186:
187: if (how == RFR)
188: yyerror("undeclared variable, %s", what);
189: if (islocal)
190: return putlocal(what, ival, how, index, width);
191:
192: return putglobal(what, ival, how, index, width);
193: }
194:
195: checklocvars()
196: { int i;
197:
198: for (i = 0; i < nrvars; i++)
199: if (vartbl[i].status == DCL)
200: { printf("%s: ", (pid != NONE)?procname:refname);
201: printf("pvar %s is never used\n", vartbl[i].name);
202: }
203: }
204:
205: checkglobvars()
206: { int i;
207:
208: for (i = 0; i < nrglobvars; i++)
209: if (globvartbl[i].status == DCL)
210: { printf("global: ");
211: printf("pvar %s is never used\n", globvartbl[i].name);
212: }
213: }
214:
215: numglobvars(fd)
216: FILE *fd;
217: { int i;
218:
219: fprintf(fd, "%d g-variables: ", nrglobvars);
220: for (i = 0; i < nrglobvars; i++)
221: fprintf(fd, "%d/%d,", globvartbl[i].initval, globvartbl[i].index);
222: putc('\n', fd);
223: if (varwidths)
224: { fprintf(fd, "%d g-widths: ", nrglobvars);
225: for (i = 0; i < nrglobvars; i++)
226: fprintf(fd, "%d,", globvartbl[i].width);
227: putc('\n', fd);
228: }
229: fprintf(fd, "%d g-uses: ", realgvars);
230: for (i = 0; i < realgvars; i++)
231: fprintf(fd, "%d/%d,", igvartbl[i].m, igvartbl[i].n);
232: putc('\n', fd);
233: }
234:
235: numlocvars(fd)
236: FILE *fd;
237: { int i;
238:
239: fprintf(fd, "%d l-variables: ", nrvars);
240: for (i = 0; i < nrvars; i++)
241: fprintf(fd, "%d/%d,", vartbl[i].initval, vartbl[i].index);
242: putc('\n', fd);
243: if (varwidths)
244: { fprintf(fd, "%d l-widths: ", nrvars);
245: for (i = 0; i < nrvars; i++)
246: fprintf(fd, "%d,", vartbl[i].width);
247: putc('\n', fd);
248: }
249:
250: fprintf(fd, "%d l-uses: ", realnrvars);
251: for (i = 0; i < realnrvars; i++)
252: fprintf(fd, "%d/%d,", ivartbl[i].m, ivartbl[i].n);
253: putc('\n', fd);
254: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.