|
|
1.1 root 1: #include <stdio.h>
2: #include "trace.h"
3: #include "trace.d"
4:
5: extern struct QUEUE **head, **tail;
6: extern int *qsize, nrqs, level, maxreached;
7: extern double iseen, ireseen, zapper;
8: extern double tryswiff, noswiff, cannot;
9: char *Realloc(), *Emalloc(), *Smalloc(), *emalloc();
10:
11: struct HTABLE {
12: struct STATE **index; /* index [h] [ibound] */
13: short ibound; /* nr of available slots */
14: short nr; /* nr of occupied slots */
15: } oldstates[NOTOOBIG+1]; /* index of hash values */
16:
17: int hbound=0, hlast=0;
18:
19: growindex(h)
20: { int nsz = (int) oldstates[h].ibound + 8;
21:
22: if (nsz == 8)
23: oldstates[h].index = (struct STATE **)
24: Emalloc(nsz * sizeof(struct STATE *));
25: else
26: oldstates[h].index = (struct STATE **)
27: Realloc(oldstates[h].index, nsz * sizeof(struct STATE *));
28:
29: oldstates[h].ibound = (short) nsz;
30: }
31:
32: initable()
33: { register int i;
34:
35: for (i = 0; i < NOTOOBIG+1; i++)
36: { oldstates[i].nr = 0;
37: oldstates[i].ibound = 0;
38: }
39: hbound = NOTOOBIG+1;
40: }
41:
42: insert(h, pnt) /* enter state pointer into the table at hash value h */
43: struct STATE *pnt;
44: { short cin;
45:
46: if (h >= hbound)
47: { fprintf(stderr, "h %d, hbound %d, NOTOOBIG %d\n",h,hbound,NOTOOBIG);
48: whoops("cannot happen - insert");
49: }
50: cin = oldstates[h].nr++;
51: iseen += (double) 1;
52:
53: if (cin >= oldstates[h].ibound)
54: growindex(h);
55:
56: oldstates[h].index[cin] = pnt;
57: }
58:
59: mark(stt, vis)
60: struct STATE *stt;
61: struct VISIT *vis;
62: {
63: vis->prop.countme = 0;
64: vis->depth |= ANALYZED;
65: }
66:
67: relink(vis)
68: struct VISIT *vis;
69: { struct CONTS *inqtable();
70: register int i, j, k;
71:
72: for (i = j = k = 0; i < nrqs ; i++)
73: if (qsize[i] > 0)
74: { j++;
75: k += (1 << i);
76: }
77: vis->howmany = k;
78:
79: if (zapper == 0) /* grow without bound */
80: vis->c = (struct CONTS **)
81: Smalloc(j * sizeof(struct CONTS *));
82: else
83: vis->c = (struct CONTS **)
84: emalloc(j * sizeof(struct CONTS *));
85:
86: for (i = k = 0; i < nrqs; i++)
87: { if (qsize[i] == 0)
88: continue;
89:
90: vis->c[k++] = inqtable(i);
91: }
92: }
93:
94: member(h) { return (h < hbound) ? oldstates[h].nr : 0; }
95:
96: struct STATE *
97: giveme(h, n)
98: { int m = n - 1;
99: if (h >= hbound || oldstates[h].nr <= m || oldstates[h].index[m] == NULL)
100: whoops("cannot happen - giveme");
101:
102: return oldstates[h].index[m];
103: }
104:
105: struct VISIT *
106: findany(avoid)
107: struct STATE *avoid;
108: { register int i, j;
109: struct VISIT *try, *pickstate();
110:
111: for (i = (hlast+1)%hbound; i != hlast; i++, i %= hbound)
112: for (j = 0; j < oldstates[i].nr; j++)
113: if (oldstates[i].index[j] != avoid
114: && (try = pickstate(oldstates[i].index[j])) != NULL)
115: { hlast = i;
116: return try;
117: }
118:
119: cannot += (double) 1; /* couldn't find a victim */
120: try = (struct VISIT *) Smalloc(sizeof(struct VISIT));
121: try->next = NULL;
122:
123: return try;
124: }
125:
126: struct VISIT *
127: findastate(avoid)
128: struct STATE *avoid;
129: { struct VISIT *try = NULL;
130: struct VISIT *findany(), *picknown();
131: struct Swiffle *unswiffle(), *trs;
132:
133: if (ireseen < zapper || zapper == 0)
134: { try = (struct VISIT *) Smalloc(sizeof(struct VISIT));
135: try->next = NULL;
136: return try;
137: }
138: tryswiff += (double) 1;
139: if ((trs = unswiffle(avoid)) != NULL
140: && (try = picknown(trs->st, trs->vi)) != NULL)
141: return try;
142: noswiff += (double) 1;
143:
144: return findany(avoid);
145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.