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