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