Annotation of researchv10no/cmd/trace/trace1.c, revision 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.