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