|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include "pret.h" ! 3: #include "pret.d" ! 4: ! 5: struct COL column[MANY]; ! 6: struct ROW row[MANY]; ! 7: ! 8: struct ENTRY *rowtail; ! 9: struct ENTRY *coltail; ! 10: struct ENTRY *base; /* base of transition table */ ! 11: ! 12: struct ENTRY *newentry(); ! 13: struct PILAR *newunit(); ! 14: ! 15: int nrrows = 0; /* raw nr of rows (incremented by addrow() */ ! 16: int nrcols = 0; /* number of columns per table */ ! 17: int redrows = 0; /* reduced nr of rows (set by remap() */ ! 18: int extras = 0; /* counts replicated processes */ ! 19: ! 20: extern char procname[MAXNAME], refname[MAXNAME]; ! 21: extern int anyerror, pid, rid, curstate, lastloop; ! 22: ! 23: struct ENTRY * ! 24: find(R, C) ! 25: { register int i; ! 26: register int r = R; ! 27: register int c = C; ! 28: register struct ENTRY *here = base; ! 29: ! 30: if (r >= nrrows || c >= nrcols || r < 0 || c < 0) ! 31: whoops ("bad table index"); ! 32: for (i = 0; i < r; i++) ! 33: here = here->nextrow; ! 34: for (i = 0; i < c; i++) ! 35: here = here->nextcol; ! 36: return here; ! 37: } ! 38: ! 39: getrowname(where, which) ! 40: char *where; ! 41: { strcpy(where, row[which].name); ! 42: } ! 43: ! 44: setrowname(which) ! 45: { char stro[256]; ! 46: extern linenumber; ! 47: extern char filename[]; ! 48: ! 49: sprintf(stro, "%d/%d:%s", linenumber, nrrows, filename); ! 50: strcpy(row[which].name, stro); ! 51: } ! 52: ! 53: deadlabels() ! 54: { register int i; ! 55: for (i = 0; i < nrrows; i++) ! 56: switch(row[i].refcount) ! 57: { case ADR: printf("%s: undeclared label\n", row[i].name); ! 58: anyerror++; ! 59: break; ! 60: case DCL: printf("%s: unused label\n", row[i].name); ! 61: break; ! 62: case ADR+DCL: ! 63: break; ! 64: default: whoops("cannot happen - label"); ! 65: } ! 66: } ! 67: ! 68: remap() ! 69: { register int i, j; ! 70: ! 71: for (i = j = 0; i < nrrows; i++) ! 72: if (row[i].mapping == NOSTATE) ! 73: row[i].maptwo = j++; ! 74: redrows = j; ! 75: } ! 76: ! 77: purgerows(how) ! 78: { int i; extern int linecode, assertion, inertion; ! 79: ! 80: for (i = 0; i < nrrows; i++) ! 81: { row[i].mapping = NOSTATE; ! 82: row[i].maptwo = i; ! 83: } ! 84: redrows = nrrows; ! 85: /* -> bug if (!linecode) */ ! 86: if (!linecode || rid==assertion || rid==inertion) ! 87: transitrows(); /* remove dummy transitions */ ! 88: remap(); ! 89: ! 90: if (!linecode && !how) ! 91: { minimize(); ! 92: remap(); ! 93: } ! 94: } ! 95: ! 96: target(y) ! 97: { int i = 0; ! 98: int x = y; ! 99: while (row[x].mapping != NOSTATE) ! 100: { x = row[x].mapping; ! 101: if (i++ > nrrows) ! 102: { printf("%s: ", (pid == NONE) ? procname : refname); ! 103: whoops("contains unconditional, infinite loop"); ! 104: } ! 105: } ! 106: return x; ! 107: } ! 108: ! 109: enterowname(how, stri, bang) ! 110: char *stri, bang; ! 111: { register int i; ! 112: char stro[256]; ! 113: extern int linenumber; ! 114: extern char filename[]; ! 115: ! 116: switch(how) { ! 117: case LAB: sprintf(stro, "%s: %s", stri, filename); ! 118: for (i = 0; i < nrrows; i++) ! 119: if (strcmp(stro, row[i].name) == 0) ! 120: break; ! 121: ! 122: if (i < nrrows) ! 123: { if (bang == DCL && (row[i].refcount & DCL)) ! 124: { fprintf(stderr, "%d/%d %s %s\n", ! 125: i, nrrows, stro, row[i].name); ! 126: yyerror("label redeclared, %s", stro); ! 127: }else ! 128: row[i].refcount |= bang; ! 129: break; ! 130: } else ! 131: { addrow(); ! 132: row[i].refcount = bang; ! 133: row[i].labeled = 0; ! 134: strcpy(row[i].name, stro); ! 135: } ! 136: break; ! 137: case NEW: i = nrrows; ! 138: sprintf(stro, "%d/%d:%s", linenumber, i, filename); ! 139: addrow(); ! 140: row[i].refcount = bang; ! 141: row[i].labeled = 0; ! 142: strcpy(row[i].name, stro); ! 143: break; ! 144: case OLD: for (i = 0; i < nrrows; i++) ! 145: if (strcmp(stri, row[i].name) == 0) ! 146: break; ! 147: if (i == nrrows) ! 148: whoops("cannot happen - rows"); ! 149: break; ! 150: } ! 151: return i; ! 152: } ! 153: ! 154: labelrow(n) ! 155: { ! 156: if (n < 0 || n >= nrrows) ! 157: whoops("cannot happen - labelrow"); ! 158: row[n].labeled = 1; ! 159: ! 160: } ! 161: ! 162: deadrows(p, r) ! 163: { register int i, j, k; ! 164: struct ENTRY *it; ! 165: struct PILAR *at; ! 166: char fld[128]; ! 167: extern int nrprocs; ! 168: ! 169: for (i = 0; i < nrrows; i++) ! 170: row[i].reached = 0; ! 171: ! 172: for (i = 0; i < nrrows; i++) ! 173: { if (row[i].mapping != NOSTATE) ! 174: continue; ! 175: it = find(i, 0); ! 176: for (j = 0; j < nrcols; j++, it = it->nextcol) ! 177: { at = it->pilar; ! 178: do ! 179: { if (at->transf != NOSTATE) ! 180: { k = target(at->transf); ! 181: if (k != i) ! 182: row[k].reached = 1; ! 183: } ! 184: at = at->nxtp; ! 185: } while (at != NULL); ! 186: } } ! 187: ! 188: fld[0] = '\0'; ! 189: for (i = k = 0; i < nrrows; i++) ! 190: { if (row[i].mapping != NOSTATE) ! 191: continue; ! 192: if (row[i].reached == 0 && row[i].maptwo != 0) ! 193: { j = strlen(fld); k++; ! 194: sprintf(&fld[j], "%d, ", row[i].maptwo); ! 195: } } ! 196: ! 197: if (p == NONE) ! 198: refsize(r, redrows, k); ! 199: else ! 200: procsize(p, redrows, k); ! 201: } ! 202: ! 203: deadends(tb) ! 204: FILE *tb; ! 205: { register int i, j, x; ! 206: struct ENTRY *it; ! 207: struct PILAR *at; ! 208: char field[256]; ! 209: int nrdeads = 0; ! 210: ! 211: if (nrrows == 0) ! 212: return; ! 213: ! 214: field[0] = '\0'; ! 215: for (i = 0; i < nrrows; i++) ! 216: { if (row[i].mapping != NOSTATE) ! 217: continue; ! 218: it = find(i, 0); ! 219: for (j = 0; j < nrcols; j++, it = it->nextcol) ! 220: { for (at = it->pilar; at != NULL; at = at->nxtp) ! 221: if (at->transf != NOSTATE) ! 222: break; ! 223: if (at != NULL) ! 224: break; ! 225: } ! 226: if (j == nrcols) ! 227: { x = strlen(field); ! 228: sprintf(&field[x], "%d,", row[i].maptwo); ! 229: nrdeads++; ! 230: } } ! 231: if ((i = lastloop) >= 0) ! 232: { if (i >= nrrows || row[i].mapping != NOSTATE) ! 233: whoops("cannot happen - deadends"); ! 234: x = strlen(field); ! 235: sprintf(&field[x], "%d,", row[i].maptwo); ! 236: nrdeads++; ! 237: } ! 238: fprintf(tb, "ENDSTATES %d: %s\n", nrdeads, field); ! 239: } ! 240: ! 241: transitrows() ! 242: { register int i, j; ! 243: struct ENTRY *here, *there; ! 244: /* maintain row 0 as initial state */ ! 245: here = base->nextrow; ! 246: for (i = 1; i < nrrows; i++, here = here->nextrow) ! 247: { if (here->nrpils != 1 || here->pilar->code != NONE) ! 248: continue; ! 249: ! 250: there = here->nextcol; ! 251: for (j = 1; j < nrcols; j++, there = there->nextcol) ! 252: if (there->nrpils != 0) ! 253: break; ! 254: if (j == nrcols) ! 255: { row[i].mapping = here->pilar->transf; ! 256: row[here->pilar->transf].labeled |= row[i].labeled; ! 257: } } ! 258: } ! 259: ! 260: entercolname(val, what) ! 261: { register int i; ! 262: ! 263: for (i = 0; i < nrcols; i++) ! 264: if (column[i].ccode == val && column[i].coltype == what) ! 265: break; ! 266: if (i == nrcols) ! 267: { addcol(); ! 268: column[i].ccode = val; ! 269: column[i].coltype = what; ! 270: } ! 271: return i; ! 272: } ! 273: ! 274: addrow() ! 275: { register i = nrcols; ! 276: struct ENTRY *lastcol, *thiscol; ! 277: char uni[32]; ! 278: ! 279: if (nrcols == 0) ! 280: { rowtail = coltail = base = newentry(); ! 281: sprintf(uni, "%4d", curstate); ! 282: column[0].ccode = -1; ! 283: column[0].coltype = SPN; ! 284: strcpy(row[0].name, uni); ! 285: nrrows = nrcols = 1; ! 286: } else ! 287: { if (nrrows == MANY) ! 288: whoops("too many rows"); ! 289: lastcol = rowtail; ! 290: rowtail = thiscol = lastcol->nextrow = newentry(); ! 291: for (--i; i > 0; i--) ! 292: { thiscol = thiscol->nextcol = newentry(); ! 293: lastcol = lastcol->nextcol; ! 294: lastcol->nextrow = thiscol; ! 295: } ! 296: nrrows++; ! 297: } ! 298: } ! 299: ! 300: addcol() ! 301: { register int i = nrrows; ! 302: struct ENTRY *lstrow, *thisrow; ! 303: ! 304: if (nrcols == 0) ! 305: whoops("cannot happen - columns"); ! 306: else ! 307: { lstrow = coltail; ! 308: coltail = thisrow = lstrow->nextcol = newentry(); ! 309: if (nrcols++ == MANY) ! 310: whoops("too many columns"); ! 311: for (--i; i > 0; i--) ! 312: { thisrow = thisrow->nextrow = newentry(); ! 313: lstrow = lstrow->nextrow; ! 314: lstrow->nextcol = thisrow; ! 315: } } ! 316: } ! 317: ! 318: setrans(r, c, tr, to) ! 319: { struct ENTRY *ft; ! 320: struct PILAR *pt; ! 321: int i; ! 322: ft = find(r, c); ! 323: pt = ft->pilar; ! 324: for (i = ft->nrpils++; i > 0; i--) ! 325: pt = pt->nxtp; ! 326: ! 327: pt->code = to; ! 328: pt->transf = tr; ! 329: ! 330: pt->nxtp = newunit(); ! 331: } ! 332: ! 333: badstates(tb) ! 334: FILE *tb; ! 335: { struct ENTRY *this, *that; ! 336: struct PILAR *at; ! 337: int i, k, x, nrbads = 0, nrlabs = 0; ! 338: char field[512], labfield[512]; ! 339: ! 340: if (nrrows == 0) ! 341: return; ! 342: ! 343: labfield[0] = field[0] = '\0'; ! 344: for (i = 0, this = base; this != NULL; this = this->nextrow, i++) ! 345: { if (row[i].mapping != NOSTATE) ! 346: continue; ! 347: ! 348: if (row[i].labeled) ! 349: { sprintf(&labfield[strlen(labfield)], "%d,", row[i].maptwo); ! 350: nrlabs++; ! 351: } ! 352: that = find(i, 0); ! 353: for (k = 0; k < nrcols; k++, that = that->nextcol) ! 354: { if (!SPNT(column[k].coltype)) ! 355: continue; ! 356: ! 357: for (at = that->pilar, x = 0; at != NULL; at = at->nxtp) ! 358: { if (at->transf == NOSTATE) ! 359: continue; ! 360: x++; break; ! 361: } ! 362: if (x > 0) ! 363: { sprintf(&field[strlen(field)],"%d,",row[i].maptwo); ! 364: nrbads++; ! 365: break; ! 366: } } ! 367: } ! 368: fprintf(tb, "BADSTATES %d: %s\n", nrbads, field); ! 369: fprintf(tb, "LABSTATES %d: %s\n", nrlabs, labfield); ! 370: } ! 371: ! 372: dumpforw(tb) ! 373: FILE *tb; ! 374: { struct ENTRY *this, *that; ! 375: struct PILAR *at; ! 376: char field[256]; ! 377: int i, j, k, x, y; extern int linecode; ! 378: ! 379: if (pid == NONE) ! 380: fprintf(tb, "%s %d:", "REF", rid); ! 381: else ! 382: fprintf(tb, "%s %d:", "PROC", pid+extras); ! 383: ! 384: fprintf(tb, "%d/%d:", redrows, nrcols); ! 385: for (i = 0; i < nrcols; i++) ! 386: fprintf(tb, "%d(%d),", column[i].ccode, column[i].coltype); ! 387: putc('\n', tb); ! 388: ! 389: for (i = 0, this = base; this != NULL; this = this->nextrow, i++) ! 390: { if (row[i].mapping != NOSTATE) ! 391: continue; ! 392: ! 393: that = find(i, 0); ! 394: for (k = 0; k < nrcols; k++, that = that->nextcol) ! 395: { y = 0; field[0] = '\0'; ! 396: for (at = that->pilar; at != NULL; at = at->nxtp) ! 397: { if (at->transf == NOSTATE) ! 398: continue; ! 399: ! 400: j = row[ target(at->transf) ].maptwo; ! 401: ! 402: if ((x = strlen(field)) > 200) ! 403: whoops("string overflow"); ! 404: ! 405: sprintf(&field[x], "[%d,%d]", j, at->code); ! 406: y++; ! 407: } ! 408: ! 409: if (y > 0) ! 410: { fprintf(tb, "%d/%d ", row[i].maptwo, k); ! 411: fprintf(tb, "(%d) %s\n", y, field); ! 412: } } } ! 413: fprintf(tb, "0/0 (0)\n"); ! 414: ! 415: if (linecode) ! 416: { fprintf(tb, "rownames:\n"); ! 417: for (i = 0; i < redrows; i++) ! 418: fprintf(tb, "%s\n", row[i].name); ! 419: } ! 420: } ! 421: ! 422: wrapup(r, p, tb, np, vb) ! 423: FILE *tb; ! 424: { ! 425: int i; ! 426: extern struct PROCTABLE proctable[MAXPROC]; ! 427: ! 428: purgerows(np); ! 429: dumpforw(tb); ! 430: deadends(tb); ! 431: badstates(tb); ! 432: putcalls(tb); ! 433: numlocvars(tb); ! 434: ! 435: if (r == NONE) ! 436: for (i = 1; i < proctable[p].replic; i++) ! 437: { extras++; ! 438: twiddle("_PROCID"); ! 439: dumpforw(tb); ! 440: deadends(tb); ! 441: badstates(tb); ! 442: putcalls(tb); ! 443: numlocvars(tb); ! 444: } ! 445: ! 446: if (vb) ! 447: { deadrows(p, r); ! 448: deadlabels(); ! 449: } ! 450: ! 451: release(); ! 452: scrapcalltable(); ! 453: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.