Annotation of researchv10no/cmd/trace/trace1.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.