|
|
1.1 root 1: #include <stdio.h>
2: #include "pret.h"
3:
4: struct FORMALS {
5: char name[MAXNAME];
6: int typefs; /* qset or pvar (default) */
7: int tag; /* id */
8: char used; /* reference count */
9: char reset; /* default type overwritten */
10: struct FORMALS *nxtpar;
11: };
12:
13: struct {
14: char name[MAXNAME];
15: int status;
16: int nrparams;
17: int nrstates;
18: int unreach;
19: struct FORMALS *params; /* formal parameters */
20: } reftable[MAXPROC];
21:
22: int nrrefs = 0;
23:
24: extern int anyerror, pid, rid, assertion, inertion;
25: extern char qsetname[MAXNAME];
26:
27: refsize(n, m, k)
28: { reftable[n].nrstates = m;
29: reftable[n].unreach = k;
30: }
31:
32: reorder()
33: { int i, j, N, M;
34: struct FORMALS * hook;
35:
36: if (rid == NONE)
37: return;
38: /*
39: * make sure that formal msg parameters
40: * are numbered in the order in which they
41: * will be pushed onto the call stack in trace.c
42: */
43:
44: j = reftable[rid].nrparams;
45: hook = reftable[rid].params;
46:
47: for (i = N = M = 0; i < j; i++)
48: { if (hook->typefs == ISQ || hook->typefs == ISQN)
49: N = renumqset(hook->tag, N);
50: else
51: hook->tag = M++;
52:
53: hook = hook->nxtpar;
54: }
55: }
56:
57: newreftask(str, mask)
58: char *str;
59: { register int i;
60:
61: for (i = 0; i < nrrefs; i++)
62: if (strcmp(str, reftable[i].name) == 0)
63: break;
64: if (i == nrrefs)
65: { if (nrrefs >= MAXPROC)
66: whoops("too many procedures");
67: if (mask == RFR)
68: yyerror("undeclared procedure, %s", str);
69:
70: reftable[i].status = 0;
71: reftable[i].nrparams = 0;
72: reftable[i].nrstates = 0;
73: reftable[i].unreach = 0;
74: strcpy(reftable[nrrefs++].name, str);
75: } else
76: { if (mask == DCL && (reftable[i].status & DCL))
77: yyerror("procedure redeclared, %s", str);
78: if (mask == RFR && rid == i)
79: yyerror("recursive procedure, %s", str);
80: }
81: reftable[i].status |= mask;
82:
83: return i;
84: }
85:
86: struct FORMALS *
87: newparunit(str, nn, tp, ins)
88: char *str;
89: { struct FORMALS * try = (struct FORMALS *)
90: Emalloc ( sizeof(struct FORMALS) );
91:
92: try->used = 0;
93: try->reset = 0;
94:
95: strcpy(try->name, str);
96:
97: try->typefs = tp;
98: try->nxtpar = NULL;
99:
100: try->tag = nn;
101: if (!ins)
102: yyerror("unspecified parameter, %s", str);
103:
104: return try;
105: }
106:
107: addFpar(to, stri, n, vt, ins)
108: char *stri;
109: { struct FORMALS *hook;
110: int N = reftable[to].nrparams;
111: int i = N;
112:
113: if (N == 0)
114: { reftable[to].params = newparunit(stri, n, vt, ins);
115: reftable[to].nrparams++;
116: } else
117: { hook = reftable[to].params;
118: for (i = 0; i < N; i++, hook = hook->nxtpar)
119: { if (strcmp(hook->name, stri) == 0)
120: { if (ins || hook->reset == 1)
121: yyerror("name clash, %s", stri);
122:
123: hook->tag = n;
124: hook->typefs = vt;
125: hook->reset = 1;
126: break;
127: }
128: if (hook->nxtpar == NULL)
129: { hook->nxtpar = newparunit(stri, n, vt, ins);
130: reftable[to].nrparams++;
131: i++;
132: break;
133: } } }
134:
135: return i;
136: }
137:
138: Fparname(str, which, vt, hit, how, qind)
139: char *str;
140: { int i, j, k;
141: struct FORMALS * hook = reftable[which].params;
142:
143: for (i = 0, j = reftable[which].nrparams; i < j; i++)
144: { if (strcmp(str, hook->name) == 0 && hook->typefs == vt)
145: break;
146: if (hook->typefs == ISQ || hook->typefs == ISQN)
147: { switch (vt) {
148: case ISM:
149: if (hook->tag == hit
150: && (k = inqset(hook->tag, str, how, qind)) != -1)
151: return k;
152: break;
153: case ISQ:
154: if (matchowner(hook->tag, str, how, qind))
155: return hook->tag; /* id of qset */
156: break;
157: } }
158: hook = hook->nxtpar;
159: }
160: if (i == j || (vt == ISM && hook->tag != hit))
161: return -1;
162:
163: hook->used |= how;
164:
165: if (vt == ISV)
166: return hook->tag;
167:
168: return i;
169: }
170:
171: checkrefs()
172: { int i;
173: if (nrrefs == 0)
174: return;
175: for (i = 0; i < nrrefs; i++)
176: if (reftable[i].status == DCL)
177: { if (strcmp(reftable[i].name, " assert") != 0
178: && strcmp(reftable[i].name, " error") != 0)
179: printf("%s: unused procedure\n", reftable[i].name);
180: } else if (reftable[i].status == RFR)
181: printf("%s: undeclared procedure\n", reftable[i].name);
182: }
183:
184: numrefs(fd)
185: FILE *fd;
186: { extern int linecode;
187: fprintf(fd, "%d linecode\n", linecode);
188: fprintf(fd, "%d procedures ", nrrefs);
189: fprintf(fd, "(assert %d/%d)\n", assertion, inertion);
190: }
191:
192: parrefs(n, m)
193: { int i;
194: if ((i = reftable[m].nrparams - n) == 0)
195: return;
196: if (i > 0)
197: yyerror("missing parameters, %s", reftable[m].name);
198: else
199: yyerror("too many parameters, %s", reftable[m].name);
200: }
201:
202: isdigit(c) { return (c >= '0' && c <= '9'); }
203:
204: addAspecial(val, which, pn)
205: { struct FORMALS * hook = reftable[which].params;
206: int i;
207:
208: if (pn >= reftable[which].nrparams || pn < 0)
209: return;
210:
211: for (i = 0; i < pn; i++)
212: if ((hook = hook->nxtpar) == NULL)
213: whoops("cannot happen - addAspecial");
214:
215: switch (hook->typefs)
216: { case ISQN:
217: case ISQ: yyerror("mismatched parameter, %s", "queue or qset");
218: break;
219: case ISV: callentry(ISV, val);
220: break;
221: default : whoops("cannot happen - addAspecial");
222: }
223: }
224:
225: addApars(what, which, pn, index)
226: char *what;
227: { struct FORMALS * hook = reftable[which].params;
228: int val, hit, x;
229:
230: if (pn >= reftable[which].nrparams || pn < 0)
231: return;
232:
233: for (x = 0; x < pn; x++)
234: if ((hook = hook->nxtpar) == NULL)
235: whoops("cannot happen - formals");
236:
237: switch (hook->typefs)
238: { case ISQN:
239: val = newqset(what, what, 0, index);
240: x = matchset(val, hook->tag);
241: hit = qsetowner(val, x); /* find queue-id */
242: callentry(ISQ, hit); /* enter queue-id */
243: callist(val, hit); /* enter messages */
244: break;
245: case ISQ: val = newqset(what, "", RFR, index);
246: x = matchset(val, hook->tag);
247: hit = qsetowner(val, x); /* find queue-id */
248: callentry(ISQ, hit); /* enter queue-id */
249: callist(val, hit); /* enter messages */
250: break;
251: case ISV: val = addvarname(what, RFR, NONE, index, 0);
252: callentry(ISV, val);
253: break;
254: default : whoops("cannot happen - addApars");
255: }
256: }
257:
258: listrefs()
259: { int i, k;
260:
261: for (i = 0; i < nrrefs; i++)
262: { printf("\t%2d\t%s, ", i+1, reftable[i].name);
263: for (k = strlen(reftable[i].name)+1; k < 10; k++)
264: putchar(' ');
265: k = reftable[i].nrstates;
266: printf("%d state%s", k, (k!=1)?"s":"");
267: if ((k = reftable[i].unreach) > 0)
268: printf(" (%d unreachable state%s)", k, (k>1)?"s":"");
269: putchar('\n');
270: }
271: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.