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

unix.superglobalmegacorp.com

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