|
|
1.1 root 1: #include "stdio.h"
2: #include "trace.h"
3: #include "trace.d"
4:
5: extern char lockplus, prefix, ignvars, ignques;
6: extern char mask[MAXPROC];
7:
8: extern struct QUEUE *s_last;
9: extern int *processes, *globvars, *state;
10: extern int nrprocs, nrrefs, nrvars, level;
11: extern double zapper;
12: extern long loopsf, zapped;
13: extern struct PROCSTACK **procstack;
14: extern struct VARPARS *procpars;
15:
16: double iseen = 0;
17: double ireseen = 0;
18:
19: struct VISIT *lastvisit;
20: struct STATE *giveme(), *setstate();
21: char *Smalloc(), *emalloc();
22:
23: struct STATE *
24: inloop()
25: { struct STATE *tmp;
26: register struct VISIT *hook;
27: register int i, x; char aa;
28: int h = hashvalue();
29:
30: for (x = member(h); x > 0; x--)
31: { tmp = giveme(h, x);
32: hook = tmp->next;
33: if (samestate(tmp))
34: { for (i = tmp->nrvisits; i >= 1; i--, hook = hook->next)
35: {
36: if (hook->analyzed)
37: { if (ignques || Queuesmatch(hook))
38: { if (prefix)
39: output("prefix: ", 0);
40: return NULL;
41: }
42: } else
43: { if (Queuesmatch(hook))
44: { loopsf++;
45: aa = assertholds();
46: if (aa == 0 || lockplus)
47: putloop(hook->prop.h, aa);
48: return NULL;
49: }
50: } }
51: return setstate(tmp, h);
52: }
53: }
54: return setstate((struct STATE *) NULL, h);
55: }
56:
57: cmplvars(one, two)
58: struct LOCVARS *one;
59: struct VARPARS *two;
60: { int i;
61:
62: if (one->nrlvars != two->nrlvars)
63: whoops("cannot happen - cmplocal");
64:
65: for (i = 0; i < one->nrlvars; i++)
66: if (one->lvarvals[i] != two->lvarvals[i])
67: return 0;
68:
69: return 1;
70: }
71:
72: cmplocals(one, two)
73: struct VARPARS *one, *two;
74: { int i;
75:
76: if (one->nrlvars != two->nrlvars)
77: whoops("cannot happen - cmplocal");
78:
79: for (i = 0; i < one->nrlvars; i++)
80: if (one->lvarvals[i] != two->lvarvals[i])
81: return 0;
82:
83: return 1;
84: }
85:
86: cmparams(one, two)
87: struct VARPARS *one, *two;
88: { register int i;
89:
90: if (one->nrms != two->nrms || one->nrvs != two->nrvs)
91: whoops("cannot happen - cmparams");
92:
93: for (i = 0; i < one->nrms; i++)
94: if (one->ms[i] != two->ms[i])
95: return 0;
96: for (i = 0; i < one->nrvs; i++)
97: if (one->vs[i] != two->vs[i])
98: return 0;
99:
100: return 1;
101: }
102:
103: cmpstacks(older, newer)
104: struct PROCSTACK *older, *newer;
105: { struct PROCSTACK *tmp1 = older;
106: struct PROCSTACK *tmp2 = newer;
107:
108: while (tmp2 != NULL)
109: {
110: if (tmp1->uptable != tmp2->uptable
111: || tmp1->uptransf != tmp2->uptransf)
112: return 0;
113:
114: if (cmplocals(tmp1->varparsaved, tmp2->varparsaved) == 0
115: || cmparams (tmp1->varparsaved, tmp2->varparsaved) == 0)
116: return 0;
117:
118: tmp1 = tmp1->follow;
119: tmp2 = tmp2->follow;
120: }
121: return 1;
122: }
123:
124: samestate(at)
125: struct STATE *at;
126: { register int i;
127:
128: for (i = 0; i < nrprocs; i++)
129: { if (mask[i])
130: continue;
131:
132: if (at->trip[i].prev != (short) state[i]
133: || at->trip[i].pmap != (short) processes[i])
134: return 0;
135: if (ignvars == 0
136: && (cmplvars(at->l_vars[i], &(procpars[i])) == 0 ||
137: (nrrefs > 0 && cmpstacks(at->traceback[i], procstack[i]) == 0)
138: ))
139: return 0;
140: }
141:
142: if (!ignvars)
143: for (i = 0; i < nrvars; i++)
144: if (at->g_vars[i] != (short) globvars[i])
145: return 0;
146:
147: return 1;
148: }
149:
150: cpylvars(into, from)
151: struct LOCVARS *into;
152: struct VARPARS *from;
153: { register int i;
154:
155: into->nrlvars = from->nrlvars;
156: into->lvarvals = (short *)
157: Smalloc(from->nrlvars * sizeof(short));
158: for (i = 0; i < from->nrlvars; i++)
159: into->lvarvals[i] = from->lvarvals[i];
160: }
161:
162: cpylocals(into, from)
163: struct VARPARS *into, *from;
164: { register int i;
165:
166: into->nrlvars = from->nrlvars;
167: into->lvarvals = (short *)
168: Smalloc(from->nrlvars * sizeof(short));
169: for (i = 0; i < from->nrlvars; i++)
170: into->lvarvals[i] = from->lvarvals[i];
171: }
172:
173: cpyparams(into, from)
174: struct VARPARS *into, *from;
175: { int i;
176:
177: into->nrms = from->nrms;
178: into->ms = (short *)
179: Smalloc(from->nrms * sizeof(short));
180: for (i = 0; i < from->nrms; i++)
181: into->ms[i] = from->ms[i];
182:
183: into->nrvs = from->nrvs;
184: into->vs = (short *)
185: Smalloc(from->nrvs * sizeof(short));
186: for (i = 0; i < from->nrvs; i++)
187: into->vs[i] = from->vs[i];
188: }
189:
190: cpystacks(left, right)
191: struct PROCSTACK *left, *right;
192: { struct PROCSTACK *into = left;
193: struct PROCSTACK *from = right;
194:
195: while (from != NULL)
196: { into->varparsaved = (struct VARPARS *)
197: Smalloc(sizeof(struct VARPARS));
198:
199: cpylocals(into->varparsaved, from->varparsaved);
200: cpyparams(into->varparsaved, from->varparsaved);
201:
202: into->uptable = from->uptable;
203: into->uptransf = from->uptransf;
204:
205: if ((from = from->follow) != NULL)
206: { into->follow = (struct PROCSTACK *)
207: Smalloc(sizeof(struct PROCSTACK));
208: into = into->follow;
209: } }
210: }
211:
212: struct STATE *
213: newstate(pha)
214: int pha;
215: { struct STATE *hook;
216: int i;
217: struct VISIT *findastate();
218:
219: hook = (struct STATE *)
220: Smalloc(sizeof(struct STATE));
221: hook->trip = (struct TUPLE *)
222: Smalloc(nrprocs * sizeof(struct TUPLE));
223:
224: if (!ignvars)
225: { hook->l_vars = (struct LOCVARS **)
226: Smalloc(nrprocs * sizeof(struct LOCVARS *));
227:
228: hook->g_vars = (short *)
229: Smalloc(nrvars * sizeof(short));
230: for (i = 0; i < nrvars; i++)
231: hook->g_vars[i] = (short) globvars[i];
232:
233: if (nrrefs > 0)
234: hook->traceback = (struct PROCSTACK **)
235: Smalloc(nrprocs * sizeof(struct PROCSTACK *));
236: }
237:
238: for (i = 0; i < nrprocs; i++)
239: { hook->trip[i].prev = (short) state[i];
240: hook->trip[i].pmap = (short) processes[i];
241:
242: if (!ignvars)
243: { hook->l_vars[i] = (struct LOCVARS *)
244: Smalloc(sizeof(struct LOCVARS));
245:
246: cpylvars(hook->l_vars[i], &(procpars[i]));
247:
248: if (nrrefs > 0)
249: { if (procstack[i] != NULL)
250: { hook->traceback[i] = (struct PROCSTACK *)
251: Smalloc(sizeof(struct PROCSTACK));
252:
253: cpystacks(hook->traceback[i], procstack[i]);
254: } else
255: hook->traceback[i] = NULL;
256: } } }
257:
258: hook->hash = (short) pha;
259: hook->nrvisits = 1;
260: hook->next = findastate(hook);
261:
262: insert(pha, hook); /* make index in hash table */
263:
264: return hook;
265: }
266:
267: struct VISIT *
268: oldstate(where)
269: struct STATE *where;
270: { struct VISIT *tmp;
271: struct VISIT *findastate();
272: int i;
273:
274: if (where->nrvisits > 0)
275: { tmp = where->next;
276: for (i = where->nrvisits; i > 1; i--)
277: tmp = tmp->next;
278:
279: if (tmp == NULL)
280: whoops("cannot happen - oldstate");
281:
282: tmp->next = findastate(where);
283: where->nrvisits += 1;
284: ireseen += (double)1;
285:
286: return tmp->next;
287: } else
288: { where->next = findastate(where);
289: where->nrvisits = 1;
290: ireseen += (double)1;
291:
292: return where->next;
293: }
294: }
295:
296: struct STATE *
297: setstate(where, ha)
298: struct STATE *where;
299: { struct STATE *tmp;
300: struct VISIT *work;
301:
302: if (where == NULL)
303: { tmp = newstate(ha);
304: work = tmp->next;
305: } else
306: { tmp = where;
307: work = oldstate(where);
308: }
309:
310: work->prop.h = (struct STUFF *) emalloc( sizeof(struct STUFF) );
311: work->prop.h->s = s_last;
312: work->analyzed = 0;
313:
314: lastvisit = work;
315: relink(work);
316:
317: return tmp;
318: }
319:
320: struct VISIT *
321: pickstate(at)
322: struct STATE *at;
323: { struct VISIT *latter = NULL;
324: register struct VISIT *hook = at->next;
325: register int i;
326:
327: for (i = at->nrvisits; i >= 1; i--, hook = hook->next)
328: { if (hook->analyzed == 1)
329: {
330: if (latter == NULL)
331: at->next = hook->next;
332: else
333: latter->next = hook->next;
334:
335: efree(hook->prop.c);
336:
337: at->nrvisits -= 1;
338: zapped++;
339: return hook;
340: }
341: latter = hook;
342: }
343: return NULL;
344: }
345:
346: struct VISIT *
347: picknown(at, want)
348: struct STATE *at;
349: struct VISIT *want;
350: { struct VISIT *latter = NULL;
351: register struct VISIT *hook = at->next;
352: register int i, j = at->nrvisits;
353:
354: for (i = 0; i < j; i++, hook = hook->next)
355: { if (hook == want)
356: break;
357: latter = hook;
358: }
359: if (i == j)
360: whoops("cannot happen - picknown");
361:
362: if (latter == NULL)
363: at->next = hook->next;
364: else
365: latter->next = hook->next;
366:
367: efree(hook->prop.c);
368: at->nrvisits -= 1;
369: zapped++;
370:
371: return hook;
372: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.