|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <signal.h> ! 3: #include "trace.h" ! 4: #include "trace.d" ! 5: ! 6: #if 0 ! 7: #define debug(s1, s2, s3, s4, s5) printf(s1, s2, s3, s4, s5) ! 8: #else ! 9: #define debug(s1, s2, s3, s4, s5) ! 10: #endif ! 11: ! 12: struct TBL *tbl; ! 13: struct LBT *lbt; ! 14: struct MBOX *mbox; ! 15: struct MNAME *fullname; ! 16: ! 17: struct REVPOL **expr; ! 18: struct PROCSTACK **procstack; ! 19: ! 20: struct VARPARS *procpars; ! 21: struct TBLPARS *tblpars; ! 22: ! 23: struct LOCVARS *tblvars; ! 24: ! 25: struct TBLPARS *tablpars; ! 26: ! 27: struct QUEUE **starter, **head, **tail; ! 28: struct QUEUE *s_first, *s_last; ! 29: ! 30: /* ! 31: * reftasks : mapping of logic reftask id to table number ! 32: * processes: mapping of logic process id to table number ! 33: * basics : initial process table ! 34: * mask : masks off processes from the state information ! 35: */ ! 36: ! 37: int *state, *reftasks, *processes, *basics; ! 38: int *qsize, *globvars, *inits, *xob; ! 39: ! 40: /* ! 41: * the state-set of an assertion table is mapped ! 42: * onto the global variables (to simplify state checking) ! 43: * the first global that is an element from the state set ! 44: * is given by integer `abase' ! 45: */ ! 46: ! 47: int abase = -1; /* base of assertion table state set */ ! 48: int ebase = -1; /* base of error table state set */ ! 49: int assertbl = -1; /* table used for assertion checking */ ! 50: int errortbl = -1; /* table used for assertion checking */ ! 51: ! 52: char mask[MAXPROC]; /* is set before nrprocs is read */ ! 53: ! 54: int QMAX; /* max qsize per queue */ ! 55: ! 56: int maxcol = 0; ! 57: int nrtbl = 0; ! 58: int nrqs = 0; ! 59: int nrrefs = 0; ! 60: int nrprocs = 0; ! 61: int nrinit = 0; /* length initial string */ ! 62: int nrvars = 0; ! 63: int nexpr = 0; ! 64: int nrmesgs = 0; ! 65: int msgbase = -1; ! 66: int maxlevel = -1; ! 67: int maxreached = -1; ! 68: ! 69: char qoverride = 0; ! 70: char noshortcut = 0; /* disable timeout heuristics */ ! 71: char prbyq = 0; /* controls output format */ ! 72: char blast = 0; /* very quick and very dirty mode */ ! 73: char qandirty = 0; /* quick and dirty mode */ ! 74: char lockplus = 0; /* report both buffer locks and loops */ ! 75: char firstlock = 0; /* stop at first buffer lock found */ ! 76: char maxxed = 0; /* bound on search depth */ ! 77: char prefix = 0; /* print all prefixes too */ ! 78: char timedd = 0; /* verbose mode */ ! 79: char completed = 0; /* not interrupted */ ! 80: char ignvars = 0; /* variable values ignored in state checking */ ! 81: char ignques = 0; /* queue states are ignored idem */ ! 82: char sensible = 0; /* default mode: sensible partial search */ ! 83: char muststore = 0; /* must perform loop check and store state */ ! 84: ! 85: double zapper = (double) 30720; /* 30 x 1024 */ ! 86: ! 87: long zapped = 0; ! 88: long locksf = 0; ! 89: long loopsf = 0; ! 90: long normf = 0; ! 91: long callno = 0; ! 92: ! 93: int *effnrstates; /* effective nr of table states per process */ ! 94: int aperiod = 120; ! 95: ! 96: char * topofmem; ! 97: char * sbrk(); ! 98: ! 99: FILE *mb; ! 100: char *Smalloc(); ! 101: ! 102: extern double iseen, ireseen; ! 103: ! 104: onalarm() ! 105: { struct { ! 106: long u; ! 107: long p; ! 108: long chld_usrt; ! 109: long chld_syst; ! 110: } tim; ! 111: ! 112: float t; ! 113: times(&tim); ! 114: t = (float) (tim.u + tim.p)/ (float) 60.0; ! 115: ! 116: if (++callno%10 == 1) ! 117: { fprintf(stderr, " seconds depth states"); ! 118: fprintf(stderr, " zapped terms loops locks memory\n"); ! 119: } ! 120: fprintf(stderr, "%8.2f %6d", t, maxreached); ! 121: fprintf(stderr, " %6g %7ld", iseen+ireseen, zapped); ! 122: fprintf(stderr, " %5ld", normf); ! 123: fprintf(stderr, " %5ld %5ld %7u\n", loopsf, locksf, sbrk(0) - topofmem); ! 124: signal(SIGALRM, onalarm); ! 125: alarm(aperiod); ! 126: ! 127: return; ! 128: } ! 129: ! 130: postlude() ! 131: { struct { ! 132: long u; ! 133: long p; ! 134: long chld_usrt; ! 135: long chld_syst; ! 136: } tim; ! 137: extern double COUNT; ! 138: ! 139: float u, s; ! 140: ! 141: fflush(stdout); ! 142: ! 143: if (!completed) ! 144: fprintf(stderr, "trace: interrupted\n"); ! 145: ! 146: if (timedd) ! 147: { times(&tim); ! 148: u = (float) tim.u / (float) 60.0; ! 149: s = (float) tim.p / (float) 60.0; ! 150: ! 151: fprintf(stderr, "\ttime: %.2fs u + ", u); ! 152: fprintf(stderr, "%.2fs sys = %.2fs\n\n", s, u+s); ! 153: fprintf(stderr, "\t%g states, %ld zapped, ", iseen+ireseen, zapped); ! 154: fprintf(stderr, "\t%g edges traversed\n", COUNT); ! 155: ! 156: fprintf(stderr, "\tsearch depth reached: %d; ", maxreached); ! 157: fprintf(stderr, "memory used: %u\n", sbrk(0) - topofmem ); ! 158: ! 159: fprintf(stderr, "\tfound: %ld loops,", loopsf); ! 160: fprintf(stderr, " %ld locks, and", locksf); ! 161: fprintf(stderr, " %ld terminating executions\n", normf); ! 162: } ! 163: exit(completed == 0); ! 164: } ! 165: ! 166: wisdom() ! 167: { ! 168: if (sensible) ! 169: { timedd = prbyq = firstlock = qandirty= 1; ! 170: fprintf(stderr, "default search: "); ! 171: fprintf(stderr, "-vxjfqm %d %d\n", QMAX, maxlevel); ! 172: } else ! 173: { fprintf(stderr, "%s", (blast) ? "blastsearch, " : ""); ! 174: fprintf(stderr, "%s", (!blast && qandirty) ? "quicksearch, " : ""); ! 175: fprintf(stderr, "%s", (!qandirty) ? "fullsearch, " : ""); ! 176: fprintf(stderr, "depth bound %d\n", maxlevel); ! 177: } ! 178: } ! 179: ! 180: main(argc, argv) ! 181: int argc; char **argv; ! 182: { char c; ! 183: int j; ! 184: int i = 1; ! 185: int base = 3; ! 186: ! 187: for (j = 0; j < MAXPROC; j++) ! 188: mask[j] = 0; ! 189: ! 190: if (argc > 1 && argv[1][0] == '-') ! 191: { while ((c = argv[1][i++]) != '\0') ! 192: switch (c) { ! 193: case 'a': prefix = 1; break; ! 194: case 'b': blast = qandirty = 1; break; ! 195: case 'c': if (argc >= base) ! 196: { sscanf(argv[base-1], "%d", &j); ! 197: base++; ! 198: } else ! 199: usage("missing argument for `c' flag"); ! 200: prbyq = firstlock = lockplus = timedd = 1; ! 201: switch (j) { ! 202: case 0: blast = qandirty = 1; ! 203: break; ! 204: case 1: maxxed = 3; /* fall through */ ! 205: case 2: qandirty = 1; ! 206: break; ! 207: case 3: maxxed = 2; break; /* 1{ x effnr */ ! 208: case 4: maxxed = 3; /* 2 x effnr */ ! 209: case 5: break; /* 8 x effnr */ ! 210: default: usage("unknown validation class"); ! 211: } ! 212: break; ! 213: case 'f': prbyq = 1; break; ! 214: case 'F': prbyq = 2; break; ! 215: case 'i': ignvars = 1; break; ! 216: case 'j': firstlock = 1; break; ! 217: case 'k': if (argc >= base) ! 218: { sscanf(argv[base-1], "%d", &j); ! 219: zapper = (double) (j * 1024); ! 220: base++; ! 221: } else ! 222: usage("missing argument for `k' flag"); ! 223: break; ! 224: case 'L': if (argc >= base) ! 225: { sscanf(argv[base-1], "%d", &j); ! 226: zapper = (double) ((j > 0) ? j : 1); ! 227: base++; ! 228: } else ! 229: usage("missing argument for `k' flag"); ! 230: break; ! 231: case 'l': lockplus = 1; break; ! 232: case 'm': maxxed = 1; ! 233: if (argc >= base) ! 234: { sscanf(argv[base-1], "%d", &maxlevel); ! 235: base++; ! 236: } else ! 237: usage("missing argument for `m' flag"); ! 238: break; ! 239: case 'n': noshortcut = 1; break; ! 240: case 'q': qoverride = 1; ! 241: if (argc >= base) ! 242: { sscanf(argv[base-1], "%d", &QMAX); ! 243: base++; ! 244: } else ! 245: usage("missing argument for `q' flag"); ! 246: break; ! 247: case 'r': if (argc >= base) ! 248: { sscanf(argv[base-1], "%d", &j); ! 249: base++; ! 250: } else ! 251: usage("missing argument for `r' flag"); ! 252: signal(SIGALRM, postlude); ! 253: aperiod = 0; ! 254: alarm(j*60); ! 255: break; ! 256: case 'R': if (argc >= base) ! 257: { sscanf(argv[base-1], "%d", &j); ! 258: base++; ! 259: } else ! 260: usage("missing argument for `R' flag"); ! 261: aperiod = j*60; ! 262: break; ! 263: case 's': setup(); showtables(); exit(0); ! 264: break; ! 265: case 't': if (argc >= base) ! 266: { sscanf(argv[base-1], "%d", &j); ! 267: if (j >= 0 && j < MAXPROC) ! 268: mask[j] = 1; ! 269: else ! 270: usage("illegal table number"); ! 271: base++; ! 272: } else ! 273: usage("missing argument for `t' flag"); ! 274: break; ! 275: case 'v': timedd = 1; break; ! 276: case 'x': qandirty = 1; break; ! 277: case 'y': ignques = 1; break; ! 278: case 'z': sensible = 1; break; ! 279: default : usage("unknown option"); ! 280: } ! 281: } else ! 282: sensible = 1; ! 283: ! 284: if (sensible && !qoverride) ! 285: { qoverride = 1; ! 286: QMAX = 2; ! 287: } ! 288: setup(); ! 289: ! 290: init(); ! 291: topofmem = sbrk(0); ! 292: ! 293: if (maxxed != 1) ! 294: { ! 295: if (sensible && maxxed != 0) ! 296: whoops("sorry, cannot combine options 'z' and 'c'"); ! 297: ! 298: for (j = maxlevel = 0; j < nrprocs; j++) ! 299: maxlevel += effnrstates[processes[j]]; ! 300: ! 301: switch (maxxed) { ! 302: case 3: maxlevel *= 2; break; ! 303: case 2: maxlevel = (3*maxlevel)/2; break; ! 304: case 0: if (sensible) ! 305: maxlevel *= 2; ! 306: else ! 307: maxlevel *= 8; /* avoid pathetic cases */ ! 308: break; ! 309: default: whoops("cannot happen - main"); ! 310: } ! 311: maxxed = 1; ! 312: } ! 313: inilookup(); /* requires maxlevel to be set first */ ! 314: if (aperiod > 0) ! 315: { signal(SIGALRM, onalarm); ! 316: alarm(aperiod); ! 317: } signal(SIGINT, postlude); ! 318: ! 319: wisdom(); ! 320: muststore = 1; ! 321: FSE(0); ! 322: completed = 1; ! 323: postlude(); ! 324: } ! 325: ! 326: setup() ! 327: { ! 328: if ((mb = fopen("pret.out", "r")) == NULL) ! 329: { fprintf(stderr, "no file `pret.out'\n"); ! 330: exit(1); ! 331: } ! 332: ! 333: getglobals(); ! 334: gettables(); ! 335: getexprs(); ! 336: ! 337: fclose(mb); ! 338: } ! 339: ! 340: getglobals() ! 341: { register int i, j; ! 342: int a, b, c, x, y, z; ! 343: ! 344: a = fscanf(mb, "%d reftasks (assert %d/%d)\n", &x, &assertbl, &errortbl); ! 345: if (a != 3) ! 346: badinput("reftasks"); ! 347: if (fscanf(mb, "%d processes\n", &y) != 1) ! 348: badinput("processes"); ! 349: if (fscanf(mb, "%d queues:\n", &z) != 1) ! 350: badinput("queues"); ! 351: ! 352: debug("%d procs, %d functions, %d queues, assert %d\n", y, x, z, assertbl); ! 353: ! 354: nrtbl = x + y; ! 355: nrqs = z; ! 356: alloc1(x, y, z); ! 357: ! 358: getmesnames(); ! 359: ! 360: for (i = 0; i < z; i++) ! 361: { if (fscanf(mb, "%s\t%d/%d/%d: ", mbox[i].qname, &b, &a, &c) != 4) ! 362: badinput("queue sorts"); ! 363: ! 364: alloc2(i, c, a, b); ! 365: ! 366: for (j = 0; j < c; j++) ! 367: { fscanf(mb, "%d,", &b); ! 368: xob[b] = i; ! 369: } ! 370: ! 371: } ! 372: ! 373: if (fscanf(mb, "%d inits:\n", &nrinit) != 1) ! 374: badinput("queue inits"); ! 375: ! 376: alloc3(nrinit); ! 377: for (i = 0; i < nrinit; i++) ! 378: fscanf(mb, "%d,", &(inits[i])); ! 379: ! 380: if (fscanf(mb, "%d g-variables: ", &nrvars) != 1) ! 381: badinput("g-variables"); ! 382: ! 383: alloc4(nrvars); ! 384: ! 385: for (i = 0; i < nrvars; i++) ! 386: if (fscanf(mb, "%d,", &a) != 1) ! 387: badinput("g-var-inits"); ! 388: else ! 389: { if ((b = determine(a)) == 1 || b == 2) ! 390: badinput("g-var bad init"); ! 391: else ! 392: globvars[i] = (short) a; ! 393: } ! 394: } ! 395: ! 396: getmesnames() ! 397: { register int i; ! 398: if (fscanf(mb, "%d messages, base %d:\n", &nrmesgs, &msgbase) != 2) ! 399: badinput("messages"); ! 400: ! 401: alloc45(nrmesgs); ! 402: ! 403: for (i = 0; i < nrmesgs; i++) ! 404: if (fscanf(mb, "%s ", fullname[i].mname) != 1) ! 405: badinput("mesg"); ! 406: } ! 407: ! 408: gettables() ! 409: { register int i, j; ! 410: int a, b, c, d; ! 411: char name[32]; ! 412: ! 413: processes[0] = -1; ! 414: for (i = 0; i < nrtbl; i++) ! 415: { if ((j = fscanf(mb, "%s %d:%d/%d:", name, &a, &b, &c)) != 4) ! 416: { printf("matched %d: %s %d\n", j, name, a); ! 417: badinput("table header"); ! 418: } ! 419: ! 420: debug("table %d: %s (%d) ", i, name, a, 0); ! 421: debug("r/c: %d/%d\n", b, c, 0, 0); ! 422: ! 423: if ((tbl[i].nrrows = b) == 0) ! 424: badinput("empty table"); ! 425: tbl[i].nrcols = c; ! 426: ! 427: if (strcmp(name, "REF") == 0) ! 428: { reftasks[a] = i; ! 429: nrrefs++; ! 430: } else ! 431: { processes[a] = basics[a] = i; ! 432: nrprocs++; ! 433: effnrstates[i] = b; ! 434: } ! 435: ! 436: if (b > 0) ! 437: { alloc5(i); ! 438: for (j = 0; j < c; j++) ! 439: { if (fscanf(mb, "%d(%d),", &b, &d) != 2) ! 440: badinput("column header"); ! 441: ! 442: debug("%d(%d),\n", b, d, 0, 0); ! 443: ! 444: tbl[i].coltyp[j] = d; ! 445: tbl[i].colmap[j] = b; ! 446: if (d != FCT && d != SPN && d != CND) ! 447: tbl[i].colorg[j] = whichq(b); ! 448: else ! 449: tbl[i].colorg[j] = -1; ! 450: } ! 451: getrows(i); ! 452: getspecials(i); ! 453: getcalls(i); ! 454: getparams(a, i); ! 455: getlocvars(a, i); ! 456: } } } ! 457: ! 458: getrows(nn) ! 459: { int a, b, c; ! 460: int n = nn; ! 461: ! 462: for (;;) ! 463: { if (fscanf(mb, "%d/%d (%d) ", &a, &b, &c) != 3) ! 464: badinput("row"); ! 465: ! 466: if (a == 0 && b == 0 && c == 0) ! 467: break; ! 468: ! 469: ! 470: debug("row %d, col %d, size %d:\n", a, b, c, 0); ! 471: ! 472: if (c == 0) ! 473: continue; ! 474: ! 475: tbl[n].deadrow[a] = 0; ! 476: getentries(n, a, b, c); ! 477: } ! 478: } ! 479: ! 480: getentries(nn, m, p, q) ! 481: { register int i; ! 482: int x, y; ! 483: int n = nn; ! 484: ! 485: tbl[n].ptr[m][p].nrpils = (short) q; ! 486: ! 487: alloc6(n, m, p, q); ! 488: ! 489: for (i = 0; i < q; i++) ! 490: { if (fscanf(mb, "[%d,%d] ", &x, &y) != 2) ! 491: badinput("table entry"); ! 492: tbl[n].ptr[m][p].one[i].transf = (short) x; ! 493: tbl[n].ptr[m][p].one[i].valtrans = (short) y; ! 494: ! 495: debug("\t[%d,%d] \n", x, y, 0, 0); ! 496: } ! 497: } ! 498: ! 499: getspecials(in) ! 500: { register int i; ! 501: int n, m; ! 502: char stri[64]; ! 503: if (fscanf(mb, "ENDSTATES %d: ", &n) != 1) ! 504: badinput("endstates"); ! 505: ! 506: for (i = 0; i < n; i++) ! 507: { if (fscanf(mb, "%d,", &m) != 1 || m < 0 || m >= tbl[in].nrrows) ! 508: badinput("endstate"); ! 509: tbl[in].endrow[m] = 1; ! 510: } ! 511: if ((m = fscanf(mb, "%s %d: ", stri, &n)) != 2 || ! 512: strcmp(stri, "BADSTATES") != 0) ! 513: { printf("read %s %d\n", stri, n); ! 514: badinput("badstates"); ! 515: } ! 516: ! 517: for (i = 0; i < n; i++) ! 518: { if (fscanf(mb, "%d,", &m) != 1 || m < 0 || m >= tbl[in].nrrows) ! 519: badinput("badstate"); ! 520: tbl[in].badrow[m] = 1; ! 521: } ! 522: ! 523: if ((m = fscanf(mb, "%s %d: ", stri, &n)) != 2 || ! 524: strcmp(stri, "LABSTATES") != 0) ! 525: { printf("read %s %d\n", stri, n); ! 526: badinput("labstates"); ! 527: } ! 528: ! 529: for (i = 0; i < n; i++) ! 530: { if (fscanf(mb, "%d,", &m) != 1 || m < 0 || m >= tbl[in].nrrows) ! 531: badinput("labstate"); ! 532: tbl[in].labrow[m] = 1; ! 533: } ! 534: } ! 535: ! 536: getparams(pr, tb) ! 537: { int n, m; ! 538: char stri[64]; ! 539: if (fscanf(mb, "%s %d/%d", stri, &n, &m) != 3) ! 540: { printf("read %s %d/%d\n", stri, n, m); ! 541: badinput("parameters"); ! 542: } ! 543: ! 544: tblpars[tb].nrms = (short) n; /* required sizes */ ! 545: tblpars[tb].nrvs = (short) m; ! 546: ! 547: if (processes[pr] == tb) ! 548: alloc8(pr, 2*n, 2*m); /* avalaible sizes */ ! 549: ! 550: debug("longest callist proc/ref %d(%d) (m/v): %d/%d\n", pr, tb, n, m); ! 551: } ! 552: ! 553: getlocvars(p, tb) ! 554: { register int i; ! 555: int n, m; ! 556: if (fscanf(mb, "%d l-variables: ", &n) != 1) ! 557: badinput("l-variables"); ! 558: ! 559: if (processes[p] != tb) ! 560: { tblvars[tb].nrlvars = (short) n; /* required size */ ! 561: if (n > 0) ! 562: tblvars[tb].lvarvals = (short *) ! 563: Smalloc(n * sizeof(short)); ! 564: for (i = 0; i < n; i++) ! 565: if (fscanf(mb, "%d,", &m) != 1) ! 566: badinput("l-vars"); ! 567: else ! 568: tblvars[tb].lvarvals[i] = (short) m; ! 569: } else ! 570: { tablpars[p].nrlvars = (short) (2*n); /* available size */ ! 571: procpars[p].nrlvars = (short) n; /* actually used */ ! 572: if (n > 0) ! 573: procpars[p].lvarvals = (short *) ! 574: Emalloc((2*n) * sizeof(short)); ! 575: for (i = 0; i < n; i++) ! 576: if (fscanf(mb, "%d,", &m) != 1) ! 577: badinput("lvar-inits"); ! 578: else ! 579: procpars[p].lvarvals[i] = (short) m; ! 580: } ! 581: } ! 582: ! 583: getcalls(in) ! 584: { register int i, j; ! 585: int k, n, m, a, b, N; ! 586: char stri[64]; ! 587: if (fscanf(mb, "%s %d", stri, &n) != 2) /* FCTS */ ! 588: { printf("read %s %d\n", stri, n); ! 589: badinput("function calls"); ! 590: } ! 591: alloc9(in, n); ! 592: for (i = 0, N = n; i < N; i++) ! 593: { if (fscanf(mb, "%d-%d/%d: ", &n, &m, &k) != 3) ! 594: badinput("fct call"); ! 595: ! 596: alloc10(in, i, n, m, k); ! 597: ! 598: effnrstates[in] += tbl[reftasks[n]].nrrows; ! 599: ! 600: for (j = m+k, a = b = 0; j > 0; j--) ! 601: { if (fscanf(mb, "%d/%d", &n, &m) != 2) ! 602: badinput("fct call entry"); ! 603: if (n == 0) ! 604: tbl[in].calls[i].ms[a++] = (short) m; ! 605: else ! 606: tbl[in].calls[i].vs[b++] = (short) m; ! 607: } } ! 608: } ! 609: ! 610: getexprs() ! 611: { int i, j, a, b, c; ! 612: char name[32]; ! 613: ! 614: if (fscanf(mb, "%s %d\n", name, &nexpr) != 2) ! 615: badinput("nexpr"); ! 616: if (strcmp(name, "EXPR") != 0) ! 617: badinput("expressions"); ! 618: ! 619: expr = (struct REVPOL **) ! 620: Smalloc(nexpr * sizeof(struct REVPOL *)); ! 621: ! 622: for (i = 0; i < nexpr; i++) ! 623: { fscanf(mb, "%d: ", &a); ! 624: ! 625: expr[i] = (struct REVPOL *) ! 626: Smalloc(a * sizeof(struct REVPOL)); ! 627: ! 628: for (j = 0; j < a; j++) ! 629: { fscanf(mb, "%d/%d: %d\n", &b, &c); ! 630: expr[i][j].toktyp = b; ! 631: expr[i][j].tokval = c; ! 632: } } ! 633: } ! 634: ! 635: showtables() ! 636: { register int i, j; ! 637: int k, n, m; ! 638: char table[2*MAXPROC][64]; ! 639: ! 640: for (i = 0; i < nrprocs; i++) ! 641: { j = processes[i]; ! 642: sprintf(table[j], "process %d", i); ! 643: } ! 644: for (i = 0; i < nrrefs; i++) ! 645: { j = reftasks[i]; ! 646: sprintf(table[j], "reftask %d", i); ! 647: } ! 648: ! 649: for (i = 0; i < nrtbl; i++) ! 650: { ! 651: printf("\n%s (table %d):\n \t", table[i], i); ! 652: for (k = 0; k < tbl[i].nrcols; k++) ! 653: { switch(tbl[i].coltyp[k]) { ! 654: case INP: printf("I:"); break; ! 655: case DFL: printf("D:"); break; ! 656: case TMO: printf("T:"); break; ! 657: case OUTP: printf("O:"); break; ! 658: case SPN: printf("S:"); break; ! 659: case CND: printf("C:"); break; ! 660: case FCT: printf("F:"); break; ! 661: } ! 662: printf("%d/%d\t", tbl[i].colmap[k], tbl[i].colorg[k]); ! 663: } ! 664: ! 665: for (j = 0; j < tbl[i].nrrows; j++) ! 666: { printf("\n%3d\t", j); ! 667: for (k = 0; k < tbl[i].nrcols; k++) ! 668: { if (tbl[i].ptr[j][k].nrpils > 0) ! 669: { n = (int) tbl[i].ptr[j][k].one[0].transf; ! 670: m = (int) tbl[i].ptr[j][k].one[0].valtrans; ! 671: printf("%d(%d)", n, m); ! 672: } ! 673: if (tbl[i].ptr[j][k].nrpils > 1) ! 674: putchar('+'); ! 675: putchar('\t'); ! 676: } ! 677: } } ! 678: putchar('\n'); ! 679: } ! 680: ! 681: whichq(n) ! 682: { int i; ! 683: if (n < 0 || n >= MANY) ! 684: return -1; ! 685: ! 686: if ((i = xob[n]) == -1) ! 687: badinput("mbox sort incomplete"); ! 688: ! 689: return i; ! 690: } ! 691: ! 692: init() ! 693: { register int i, m; ! 694: state = (int *) ! 695: Smalloc(nrprocs * sizeof(int)); ! 696: qsize = (int *) ! 697: Smalloc(nrqs * sizeof(int)); ! 698: head = (struct QUEUE **) ! 699: Smalloc(nrqs * sizeof(struct QUEUE *)); ! 700: tail = (struct QUEUE **) ! 701: Smalloc(nrqs * sizeof(struct QUEUE *)); ! 702: starter = (struct QUEUE **) ! 703: Smalloc(nrqs * sizeof(struct QUEUE *)); ! 704: ! 705: ! 706: for (i = 0; i < nrqs; i++) ! 707: { starter[i] = (struct QUEUE *) ! 708: Smalloc(sizeof(struct QUEUE)); ! 709: starter[i]->next = NULL; ! 710: qsize[i] = 0; ! 711: head[i] = tail[i] = starter[i]; ! 712: } ! 713: ! 714: decode(); ! 715: initable(); /* do not change the order of inits */ ! 716: iniqtable(); ! 717: inihash(); ! 718: ! 719: for (i = 0; i < nrprocs; i++) ! 720: { state[i] = 0; ! 721: procstack[i] = NULL; ! 722: ! 723: lbt[i].mapcol = (int *) ! 724: Smalloc(maxcol * sizeof(int)); ! 725: lbt[i].orgcol = (int *) ! 726: Smalloc(maxcol * sizeof(int)); ! 727: fiddler(i); ! 728: } ! 729: ! 730: s_last = NULL; ! 731: ! 732: for (i = 0; i < nrinit; i++) ! 733: { m = inits[i]; ! 734: if (send(m, whichq(m), NONE, NONE) == 0) ! 735: badinput("qsize too small for initial string..."); ! 736: } ! 737: if (assertbl != NONE) ! 738: { assertbl = reftasks[assertbl]; ! 739: ! 740: abase = nrvars; ! 741: nrvars += tbl[assertbl].nrrows; ! 742: ! 743: if (abase > 0) ! 744: globvars = (int *) ! 745: Realloc(globvars, nrvars * sizeof(int)); ! 746: else ! 747: globvars = (int *) ! 748: Smalloc(nrvars * sizeof(int)); ! 749: ! 750: globvars[abase] = 1; ! 751: for (i = abase+1; i < nrvars; i++) ! 752: globvars[i] = 0; ! 753: } ! 754: if (errortbl != NONE) ! 755: { errortbl = reftasks[errortbl]; ! 756: ! 757: ebase = nrvars; ! 758: nrvars += tbl[errortbl].nrrows; ! 759: ! 760: if (ebase > 0) ! 761: globvars = (int *) ! 762: Realloc(globvars, nrvars * sizeof(int)); ! 763: else ! 764: globvars = (int *) ! 765: Smalloc(nrvars * sizeof(int)); ! 766: ! 767: globvars[ebase] = 1; ! 768: for (i = ebase+1; i < nrvars; i++) ! 769: globvars[i] = 0; ! 770: } ! 771: } ! 772: ! 773: decode() ! 774: { int i, j, m; ! 775: ! 776: for (i = 0; i < nrvars; i++) ! 777: { m = convert(globvars[i], NONE); ! 778: globvars[i] = (short) m; ! 779: } ! 780: for (i = 0; i < nrprocs; i++) ! 781: for (j = 0; j < procpars[i].nrlvars; j++) ! 782: { m = convert(procpars[i].lvarvals[j], i); ! 783: procpars[i].lvarvals[j] = (short) m; ! 784: } ! 785: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.