Annotation of researchv10no/cmd/pret/Pret, revision 1.1

1.1     ! root        1: # To unbundle, sh this file
        !             2: echo makefile 1>&2
        !             3: sed 's/.//' >makefile <<'//GO.SYSIN DD makefile'
        !             4: -CC = cc
        !             5: -YFLAGS = -dDv
        !             6: -CFLAGS = -g
        !             7: -OBJS = pret.o pret1.o pret2.o pret3.o pret4.o pret6.o pret7.o pret8.o pret9.o pret0.o pretlex.o
        !             8: -
        !             9: -#     FILES:
        !            10: -#             pret.y  -       yacc parser
        !            11: -#             pret.h  -       constants and macros
        !            12: -#             pret.d  -       internal representation of the tables
        !            13: -#             pret0.c  -      reduction of the state machines
        !            14: -#             pret1.c -       qsets
        !            15: -#             pret2.c -       operations on rows and columns
        !            16: -#             pret3.c -       procedures
        !            17: -#             pret4.c -       processes
        !            18: -#             pret6.c -       queues and messages
        !            19: -#             pret7.c -       memory allocation
        !            20: -#             pret8.c -       variables
        !            21: -#             pret9.c -       parameters
        !            22: -#             pret.expr.c -   expressions
        !            23: -#             pretlex.c       lexical analyzer
        !            24: -
        !            25: -pret: $(OBJS) pret.h pret.d
        !            26: -      $(CC) $(CFLAGS) $(OBJS) -lln -o pret
        !            27: -
        !            28: -pret.o:       pret.y pret.expr.c
        !            29: -
        !            30: -pretlex.o:    pretlex.l x.tab.h
        !            31: -      lex pretlex.l
        !            32: -      $(CC) $(CFLAGS) -c lex.yy.c
        !            33: -      rm lex.yy.c
        !            34: -      mv lex.yy.o pretlex.o
        !            35: -
        !            36: -x.tab.h:      y.tab.h
        !            37: -      -cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h
        !            38: -
        !            39: -clean:
        !            40: -      rm -f *.o [xy].tab.[ch] y.output pret.out pret.err pret.tmp core a.out
        !            41: -
        !            42: -install:
        !            43: -      cp pret /usr/bin
        !            44: //GO.SYSIN DD makefile
        !            45: echo pret.d 1>&2
        !            46: sed 's/.//' >pret.d <<'//GO.SYSIN DD pret.d'
        !            47: -      /*
        !            48: -      ** 3-dimensional table:
        !            49: -      **      one row per state
        !            50: -      **      one column per event
        !            51: -      **      one `pilar' per possible response
        !            52: -      */
        !            53: -
        !            54: - struct ENTRY {
        !            55: -      int nrpils;             /* size of pilar stack */
        !            56: -      struct PILAR *pilar;
        !            57: -      struct ENTRY *nextrow;
        !            58: -      struct ENTRY *nextcol;
        !            59: - };
        !            60: - struct PILAR {
        !            61: -      int transf;             /* row transition function   */
        !            62: -      int code;               /* output message or bltin index */
        !            63: -      struct PILAR *nxtp;     /* last pilar points to NULL */
        !            64: - };
        !            65: -
        !            66: - struct COL {
        !            67: -      int coltype;            /* msg, spont, tau, default, task, condition */
        !            68: -      int ccode;
        !            69: - };
        !            70: -
        !            71: - struct ROW {
        !            72: -      char name[256];         /* can be composite name   */
        !            73: -      char reached;           /* is row reachable ?      */
        !            74: -      char refcount;          /* label reference index   */
        !            75: -      char labeled;           /* start of do-loop or label */
        !            76: -      int mapping;            /* indicates transit rows  */
        !            77: -      int maptwo;             /* renumbers reduced table */
        !            78: - };
        !            79: //GO.SYSIN DD pret.d
        !            80: echo pret.expr.c 1>&2
        !            81: sed 's/.//' >pret.expr.c <<'//GO.SYSIN DD pret.expr.c'
        !            82: -#define DEBUG  0
        !            83: -
        !            84: -#define setv   1
        !            85: -#define addeq  2
        !            86: -#define subeq  3
        !            87: -#define muleq  4
        !            88: -#define diveq  5
        !            89: -#define modeq  6
        !            90: -#define plus   7
        !            91: -#define minus  8
        !            92: -#define times  9
        !            93: -#define div   10
        !            94: -#define mod   11
        !            95: -#define power 12
        !            96: -#define uminus        13
        !            97: -#define gt    14
        !            98: -#define lt    15
        !            99: -#define ge    16
        !           100: -#define le    17
        !           101: -#define eq    18
        !           102: -#define ne    19
        !           103: -#define land  20
        !           104: -#define lor   21
        !           105: -#define lnot  22
        !           106: -#define princ 23
        !           107: -#define prdec 24
        !           108: -#define poinc 25
        !           109: -#define podec 26
        !           110: -
        !           111: -#define OP    0
        !           112: -#define NM    1
        !           113: -
        !           114: -#define unary(c)      (c == uminus || c == lnot || c >= princ)
        !           115: -#define binary(c)     !unary(c)
        !           116: -
        !           117: -struct REVPOL {
        !           118: -      char toktyp;
        !           119: -      short tokval;
        !           120: -} *parsed;
        !           121: -
        !           122: -int prs = 0;
        !           123: -extern int verbose;
        !           124: -char * Emalloc();
        !           125: -
        !           126: -pushnm(tok)
        !           127: -{     if (prs >= EXPRMAX)
        !           128: -              whoops("expression too long");
        !           129: -      parsed[prs].toktyp = NM;
        !           130: -      parsed[prs++].tokval = tok;
        !           131: -}
        !           132: -
        !           133: -pushop(tok)
        !           134: -{     if (prs >= EXPRMAX)
        !           135: -              whoops("expression too long");
        !           136: -      parsed[prs].toktyp = OP;
        !           137: -      parsed[prs++].tokval = tok;
        !           138: -}
        !           139: -
        !           140: -struct Node *
        !           141: -newnode(ntyp, nval, left, right)
        !           142: -      struct Node *left, *right;
        !           143: -{
        !           144: -      struct Node *try;
        !           145: -
        !           146: -      try = (struct Node *) Emalloc(sizeof(struct Node));
        !           147: -      try->ntyp = ntyp;
        !           148: -      try->nval = nval;
        !           149: -      try->left = left;
        !           150: -      try->right = right;
        !           151: -      return try;
        !           152: -}
        !           153: -
        !           154: -makeexpr(n)
        !           155: -{     pushexpr(n);
        !           156: -      return -(2 + addrevpol());
        !           157: -}
        !           158: -
        !           159: -pushexpr(n)
        !           160: -      struct Node *n;
        !           161: -{
        !           162: -      if (n == NULL) return;
        !           163: -      switch (n->ntyp) {
        !           164: -      case NM: pushnm(n->nval); break;
        !           165: -      case OP: pushexpr(n->left); pushexpr(n->right); pushop(n->nval); break;
        !           166: -      default: whoops("unknown node type");
        !           167: -      }
        !           168: -}
        !           169: -
        !           170: -struct {
        !           171: -      short n;
        !           172: -      struct REVPOL *p;
        !           173: -} revpols[MANY];
        !           174: -
        !           175: -int npols = 0;
        !           176: -
        !           177: -numexps(fd)
        !           178: -      FILE *fd;
        !           179: -{ int i, j;
        !           180: -  struct REVPOL *p;
        !           181: -
        !           182: -      fprintf(fd, "EXPR %d\n", npols);
        !           183: -      for (i = 0; i < npols; i++)
        !           184: -      {       fprintf(fd, "%d: ", revpols[i].n);
        !           185: -              p = revpols[i].p;
        !           186: -              for (j = (revpols[i].n)-1; j >= 0; j--)
        !           187: -                      fprintf(fd, "%d/%d ", p[j].toktyp, p[j].tokval);
        !           188: -              putc('\n', fd);
        !           189: -}     }
        !           190: -
        !           191: -findsame(a)
        !           192: -{     struct REVPOL *p, *q;
        !           193: -      int k = revpols[a].n;
        !           194: -      int i, j;
        !           195: -
        !           196: -      q = revpols[a].p;
        !           197: -      for (i = 0; i < npols; i++)
        !           198: -      {       if (revpols[i].n != revpols[a].n)
        !           199: -                      continue;
        !           200: -              p = revpols[i].p;
        !           201: -              for (j = 0; j < k; j++)
        !           202: -                      if (p[j].toktyp != q[j].toktyp
        !           203: -                      ||  p[j].tokval != q[j].tokval)
        !           204: -                              break;
        !           205: -              if (j == k)
        !           206: -                      break;
        !           207: -      }
        !           208: -      return i;
        !           209: -}
        !           210: -
        !           211: -addrevpol()
        !           212: -{ int i;
        !           213: -  int retval;
        !           214: -
        !           215: -      if (npols >= MANY)
        !           216: -              whoops("too many expressions");
        !           217: -
        !           218: -      revpols[npols].n = prs;
        !           219: -      revpols[npols].p = parsed;
        !           220: -
        !           221: -      if ((retval = findsame(npols)) == npols)
        !           222: -              npols++;
        !           223: -
        !           224: -#if 0
        !           225: -      printf("exp(%d): ", prs);
        !           226: -      for (i = prs-1; i >= 0; i--)
        !           227: -      {       if (parsed[i].toktyp == NM)
        !           228: -              {       printf("%d ", parsed[i].tokval);
        !           229: -                      continue;
        !           230: -              }
        !           231: -              switch(parsed[i].tokval) {
        !           232: -              case setv:      printf("= "); break;
        !           233: -              case addeq:     printf("+= "); break;
        !           234: -              case subeq:     printf("-= "); break;
        !           235: -              case muleq:     printf("*= "); break;
        !           236: -              case diveq:     printf("/= "); break;
        !           237: -              case modeq:     printf("%= "); break;
        !           238: -              case plus:      printf("+ "); break;
        !           239: -              case minus:     printf("- "); break;
        !           240: -              case times:     printf("* "); break;
        !           241: -              case div:       printf("/ "); break;
        !           242: -              case mod:       printf("% "); break;
        !           243: -              case power:     printf("^ "); break;
        !           244: -              case uminus:    printf(".- "); break;
        !           245: -              case gt:        printf("> "); break;
        !           246: -              case lt:        printf("< "); break;
        !           247: -              case ge:        printf(">= "); break;
        !           248: -              case le:        printf("<= "); break;
        !           249: -              case eq:        printf("== "); break;
        !           250: -              case ne:        printf("!= "); break;
        !           251: -              case land:      printf("&& "); break;
        !           252: -              case lor:       printf("|| "); break;
        !           253: -              case lnot:      printf("! "); break;
        !           254: -              case princ:     printf("++. "); break;
        !           255: -              case prdec:     printf("--. "); break;
        !           256: -              case poinc:     printf(".++ "); break;
        !           257: -              case podec:     printf(".-- "); break;
        !           258: -              default:        fprintf(stderr, "%d", parsed[i].tokval);
        !           259: -                              whoops("unknown operator");
        !           260: -              }
        !           261: -      }
        !           262: -      putchar('\n');
        !           263: -#endif
        !           264: -      parsed = (struct REVPOL *) Emalloc(EXPRMAX * sizeof(struct REVPOL));
        !           265: -      prs = 0;
        !           266: -
        !           267: -      return retval;
        !           268: -}
        !           269: //GO.SYSIN DD pret.expr.c
        !           270: echo pret.h 1>&2
        !           271: sed 's/.//' >pret.h <<'//GO.SYSIN DD pret.h'
        !           272: -#define NORM  0       /* normal  message */
        !           273: -#define INITM 1       /* initial message */
        !           274: -
        !           275: -#define SND   2
        !           276: -#define RCV   4
        !           277: -#define SAR   6
        !           278: -#define RFR   1
        !           279: -#define DCL   2
        !           280: -#define RAD   3
        !           281: -#define ADR   4
        !           282: -#define DAR   6
        !           283: -
        !           284: -#define MAXNAME       32      /* max available composite namelength */
        !           285: -#define MAXPROC       16      /* max number of processes */
        !           286: -#define MANY  512     /* max nr of distinct rows or names */
        !           287: -#define MAXDEPTH 32   /* max nesting depth of if's and do's */
        !           288: -#define EXPRMAX       64
        !           289: -#define NOSTATE -1    /* default state */
        !           290: -
        !           291: -#define SOME   1      /* not none */
        !           292: -#define NONE  -1      /* default signal */
        !           293: -#define NEW   -1
        !           294: -#define OLD   0
        !           295: -#define LAB   1
        !           296: -
        !           297: -#define ISM   0       /* message variable   */
        !           298: -#define ISQ   1       /* queue-set variable */
        !           299: -#define ISV   2       /* protocol variable  */
        !           300: -#define ISQN  3       /* queuename variable */
        !           301: -
        !           302: -                      /* types of transitions: */
        !           303: -#define INP   10              /* recv specific message */
        !           304: -#define DFL   11              /* default input from q  */
        !           305: -#define TMO   12              /* transition on timeout */
        !           306: -#define OUTP  13              /* append message to a q */
        !           307: -#define SPN   14              /* builtin call or transit state */
        !           308: -#define CND   15              /* conditional   */
        !           309: -#define FCT   16              /* function call */
        !           310: -
        !           311: -                              /* `builtins:' */
        !           312: -#define INCR  16              /* increment   */
        !           313: -#define DECR  17              /* decrement   */
        !           314: -#define SUBT  18              /* subtract    */
        !           315: -#define ADDT  19              /* add         */
        !           316: -#define SETV  32              /* set:     =  */
        !           317: -#define ISEQ  256             /* compare: == */
        !           318: -#define NTEQ  257             /* !=          */
        !           319: -#define GREQ  258             /* >=          */
        !           320: -#define SMEQ  259             /* <=          */
        !           321: -#define GRNQ  260             /* >           */
        !           322: -#define SMNQ  261             /* <           */
        !           323: -
        !           324: -#define SPNT(u)       (u == TMO || u == OUTP)
        !           325: -
        !           326: -struct QTABLE {
        !           327: -      char name[MAXNAME];
        !           328: -      short status;
        !           329: -      short limit;
        !           330: -      short owner;
        !           331: -      int multiple;
        !           332: -      unsigned char magic;
        !           333: -};
        !           334: -
        !           335: -#define BASEVAL       MAXPROC         /* base value for coding messages */
        !           336: -#define NQUEUES       2*MAXPROC       /* maximum number of queues */
        !           337: -
        !           338: -struct PROCTABLE {
        !           339: -      char name[MAXNAME];
        !           340: -      int nrstates;
        !           341: -      int unreach;
        !           342: -      int replic;
        !           343: -};
        !           344: //GO.SYSIN DD pret.h
        !           345: echo pret.y 1>&2
        !           346: sed 's/.//' >pret.y <<'//GO.SYSIN DD pret.y'
        !           347: -%{
        !           348: -#include <stdio.h>
        !           349: -#include "pret.h"
        !           350: -#include "pret.d"
        !           351: -
        !           352: -#define YYDEBUG 1
        !           353: -
        !           354: -struct Node {
        !           355: -      int ntyp;       /* OP ~ nval&left&right, NM ~ val */
        !           356: -      int nval;
        !           357: -      struct Node *left, *right;
        !           358: -};
        !           359: -
        !           360: -extern struct Node *newnode();
        !           361: -
        !           362: -struct PARS {
        !           363: -      int home;
        !           364: -      int dest;
        !           365: -      int bpnt;
        !           366: -} ties[MAXDEPTH];
        !           367: -
        !           368: -FILE *tb;                             /* temp file to store tables */
        !           369: -
        !           370: -char procname[MAXNAME], refname[MAXNAME], qsetname[MAXNAME];
        !           371: -char str[256], filename[256];
        !           372: -char strings[MANY][MAXNAME];
        !           373: -extern char yytext[];
        !           374: -extern struct QTABLE qtable[NQUEUES];
        !           375: -extern int varwidths;
        !           376: -int nnames = 0;
        !           377: -int linenumber = 1;
        !           378: -int linecode = 0;     /* include source code references  */
        !           379: -int nest = 0;         /* nesting level of comments (lex) */
        !           380: -int anyerror = 0;
        !           381: -
        !           382: -int pid = NONE;       /* process number  */
        !           383: -int qid = NONE;       /* queue number    */
        !           384: -int rid = NONE;       /* template number when defined */
        !           385: -int sid = NONE;       /* qset number     */
        !           386: -int nid = NONE;       /* template number when refered */
        !           387: -int cid = NONE;       /* index in call table          */
        !           388: -int qind, qisz;               /* queue's initial string size  */
        !           389: -int parnum;           /* counts actual parameters     */
        !           390: -int assertion = -1;   /* id of assertion table, if any */
        !           391: -int inertion = -1;    /* id of error table, if any */
        !           392: -int vartype, inside;
        !           393: -int n, m, from, xx, zz;
        !           394: -int soo = 0;          /* start of optionlist */
        !           395: -int curstate = 0;
        !           396: -int curdepth = 0;
        !           397: -int lastloop = -1;
        !           398: -
        !           399: -int verbose = 0;
        !           400: -int nopurge = 0;
        !           401: -
        !           402: -checknames()
        !           403: -{
        !           404: -      checkrefs();
        !           405: -      checkglobvars();
        !           406: -      checkqs();
        !           407: -}
        !           408: -
        !           409: -putglobals(fd)
        !           410: -      FILE *fd;
        !           411: -{
        !           412: -      numrefs(fd);
        !           413: -      numprocs(fd);
        !           414: -      numsorts(fd);
        !           415: -      numinits(fd);
        !           416: -      numglobvars(fd);
        !           417: -}
        !           418: -
        !           419: -puttables(fd1)
        !           420: -      FILE *fd1;
        !           421: -{     FILE *fd2;
        !           422: -      char buffer[MANY];
        !           423: -      int howmuch;
        !           424: -
        !           425: -      if ((fd2 = fopen("pret.tmp", "r")) == NULL)
        !           426: -              whoops("cannot find pret.tmp");
        !           427: -
        !           428: -      while ((howmuch = fread(buffer, sizeof(*buffer), MANY, fd2)) > 0)
        !           429: -              fwrite(buffer, sizeof(*buffer), howmuch, fd1);
        !           430: -
        !           431: -      fclose(fd2);
        !           432: -      unlink("pret.tmp");
        !           433: -}
        !           434: -
        !           435: -makebin()
        !           436: -{     FILE *fd;
        !           437: -
        !           438: -      if ((fd = fopen((anyerror)?"pret.err":"pret.out", "w")) == NULL)
        !           439: -              whoops("cannot create output file");
        !           440: -
        !           441: -      putglobals(fd);
        !           442: -      puttables(fd);
        !           443: -      numexps(fd);
        !           444: -      fclose(fd);
        !           445: -      if (anyerror)
        !           446: -              fprintf(stderr, "output written to `pret.err'\n");
        !           447: -}
        !           448: -
        !           449: -transfer(cl, tg)
        !           450: -{     int i = curstate;
        !           451: -      curstate = enterowname(NEW, "", DAR);
        !           452: -      setrans(i, cl, curstate, tg);
        !           453: -}
        !           454: -
        !           455: -#include "pret.expr.c"
        !           456: -
        !           457: -%}
        !           458: -%union{
        !           459: -      int resu;
        !           460: -      struct Node *node;
        !           461: -}
        !           462: -
        !           463: -%type <resu>  PREIO INDEX QINDEX IMPORT ASGN ASGN
        !           464: -%type <node>  expr VARNAME
        !           465: -%token        <resu>  NAME VALUE ARNAME QSNAME
        !           466: -
        !           467: -%start                PROT_SPEC
        !           468: -%token                ASSERT ERROR
        !           469: -%token                PROCESS PBEGIN END IF FI DO OD
        !           470: -%token                timeout skip BREAK DEFAULT GOTO
        !           471: -%token                FLAG ARROW SEMICOLON COLON
        !           472: -%token                QUEUES QSET PVAR MESG
        !           473: -%right                '=' ADDEQ SUBEQ MULEQ DIVEQ MODEQ
        !           474: -%left         OR
        !           475: -%left         AND
        !           476: -%left         GT GE LT LE EQ NE
        !           477: -%left         '+' '-'
        !           478: -%left         '*' '/' '%'
        !           479: -%left         UNARYMINUS NOT INC DEC
        !           480: -%right                '^'
        !           481: -
        !           482: -%%
        !           483: -
        !           484: -PROT_SPEC     :       ONEMODULE
        !           485: -              |       PROT_SPEC ONEMODULE
        !           486: -              ;
        !           487: -
        !           488: -ONEMODULE     :       PROC_SPEC
        !           489: -              |       TASK_SPEC
        !           490: -              |       ONEDECL
        !           491: -              |       REQUIREMENT
        !           492: -              ;
        !           493: -
        !           494: -PROC_SPEC     :       PROCESS NAME QINDEX
        !           495: -                      {       strcpy(procname, strings[$2]);
        !           496: -                              pid = newprocname(strings[$2], $3);
        !           497: -                      }
        !           498: -                      PBEGIN ANYDECLS
        !           499: -                      { extern int extras;
        !           500: -                        int ival;
        !           501: -                              curstate = enterowname(NEW, "", DAR);
        !           502: -                              newcalltable();
        !           503: -                              ival = 3*MANY+pid+extras;
        !           504: -                              addvarname("_PROCID", (DCL|RFR), ival, NONE, 0);
        !           505: -                      }
        !           506: -                      SEQUENCE END
        !           507: -                      {       wrapup(NONE, pid, tb, nopurge, verbose);
        !           508: -                              pid = NONE;
        !           509: -                              strcpy(procname, "_");
        !           510: -                      }
        !           511: -              ;
        !           512: -
        !           513: -ANYDECLS      :       /* empty */
        !           514: -              |       DECLS
        !           515: -              ;
        !           516: -DECLS         :       ONEDECL
        !           517: -              |       DECLS ONEDECL
        !           518: -              ;
        !           519: -
        !           520: -ONEDECL               :       QDECLS
        !           521: -              |       VARDECLS
        !           522: -              ;
        !           523: -/*
        !           524: - *    QUEUES
        !           525: - *      ======
        !           526: - */
        !           527: -
        !           528: -QDECLS                :       QUEUES QDECL SEPARATOR
        !           529: -              ;
        !           530: -QDECL         :       ONEQ
        !           531: -              |       QNAMELIST
        !           532: -              ;
        !           533: -
        !           534: -ONEQ          :       NAME QINDEX '='
        !           535: -                      {       if ($2 == NONE || (qisz=$2) <= 0)
        !           536: -                              yyerror("illegal queue size, %s", strings[$1]);
        !           537: -                              qid = newqname(strings[$1], DCL, qisz, NONE);
        !           538: -                      }
        !           539: -                      PBEGIN MNAMELIST END
        !           540: -              ;
        !           541: -
        !           542: -/*
        !           543: - *    VARIABLES and QUEUESETS
        !           544: - *      =======================
        !           545: - */
        !           546: -
        !           547: -VARDECLS      :       PVAR VNAMELIST  SEPARATOR
        !           548: -              |       QSET QSETDECL SEPARATOR
        !           549: -              ;
        !           550: -
        !           551: -QINDEX                :       /* empty */     { $$ = NONE; }
        !           552: -              |       '[' VALUE ']'   { $$ =   $2; }
        !           553: -              ;
        !           554: -
        !           555: -QSETDECL      :       NAME PBEGIN NAME QINDEX COLON
        !           556: -                      {       xx = newqname(strings[$3], RFR, NONE, $4);
        !           557: -                              sid = newqset(strings[$1], strings[$3], DCL, $4);
        !           558: -                      }
        !           559: -                      SNAMELIST END
        !           560: -                      {       closeqset(sid);
        !           561: -                      }
        !           562: -              ;
        !           563: -/*
        !           564: - *    PROCEDURES
        !           565: - *      ==========
        !           566: - */
        !           567: -
        !           568: -TASK_SPEC     :       NAME
        !           569: -                      {       rid = newreftask(strings[$1], DCL);
        !           570: -                              curstate = enterowname(NEW, "", DAR);
        !           571: -                              strcpy(refname, strings[$1]);
        !           572: -                              newcalltable();
        !           573: -                              vartype = ISV;
        !           574: -                              inside = 1;
        !           575: -                      }
        !           576: -                      '(' ANYPARAMS ')'
        !           577: -                      {       inside = 0;
        !           578: -                      }
        !           579: -                      ANYPARTYPES
        !           580: -                      {       reorder();      /* renumber formal parameters */
        !           581: -                      }
        !           582: -                      PBEGIN
        !           583: -                      ANYDECLS
        !           584: -                      SEQUENCE
        !           585: -                      END
        !           586: -                      {       wrapup(rid, NONE, tb, nopurge, verbose);
        !           587: -                              strcpy(refname, "_");
        !           588: -                              rid = NONE;
        !           589: -                      }
        !           590: -              ;
        !           591: -
        !           592: -ANYPARAMS     :       /* empty */
        !           593: -              |       PNAMELIST
        !           594: -              |       error
        !           595: -                      {       yyerror("bad namelist", "");
        !           596: -                      }
        !           597: -
        !           598: -              ;
        !           599: -
        !           600: -ANYPARTYPES   :       /* empty */
        !           601: -              |       PARTYPES
        !           602: -              |       error
        !           603: -                      {       yyerror("bad parameterlist", "");
        !           604: -                      }
        !           605: -              ;
        !           606: -
        !           607: -PARTYPES      :       ONEPARTYPE SEMICOLON
        !           608: -              |       PARTYPES ONEPARTYPE SEMICOLON
        !           609: -              ;
        !           610: -ONEPARTYPE    :       PVAR
        !           611: -                      {       vartype = ISV;
        !           612: -                      }
        !           613: -                      PNAMELIST
        !           614: -              |       QSET NAME PBEGIN NAME COLON
        !           615: -                      {       strcpy(qsetname, strings[$2]);
        !           616: -                              sid = newqset(strings[$2], strings[$4], DCL, NONE);
        !           617: -                              qid = addFpar(rid, strings[$2], sid, ISQ, inside);
        !           618: -                              vartype = ISM;
        !           619: -                      }
        !           620: -                      PNAMELIST END
        !           621: -                      {       qid = NONE;
        !           622: -                              closeqset(sid);
        !           623: -                      }
        !           624: -              ;
        !           625: -/*
        !           626: - *    REQUIREMENTS
        !           627: - *    ============
        !           628: - */
        !           629: -REQUIREMENT   :       ASSERT
        !           630: -                      PBEGIN
        !           631: -                      {       rid = newreftask(" assert", DCL);
        !           632: -                              assertion = rid;
        !           633: -                              curstate = enterowname(NEW, "", DAR);
        !           634: -                              strcpy(refname, " assert");
        !           635: -                              newcalltable();
        !           636: -                      }
        !           637: -                      _SEQUENCE
        !           638: -                      END
        !           639: -                      {       wrapup(rid, NONE, tb, nopurge, verbose);
        !           640: -                              strcpy(refname, "_");
        !           641: -                              rid = NONE;
        !           642: -                              lastloop = -1;
        !           643: -                      }
        !           644: -              |       ERROR
        !           645: -                      PBEGIN
        !           646: -                      {       rid = newreftask(" error", DCL);
        !           647: -                              inertion = rid;
        !           648: -                              curstate = enterowname(NEW, "", DAR);
        !           649: -                              strcpy(refname, " error");
        !           650: -                              newcalltable();
        !           651: -                      }
        !           652: -                      _SEQUENCE
        !           653: -                      END
        !           654: -                      {       wrapup(rid, NONE, tb, nopurge, verbose);
        !           655: -                              strcpy(refname, "_");
        !           656: -                              rid = NONE;
        !           657: -                              lastloop = -1;
        !           658: -                      }
        !           659: -              ;
        !           660: -_SEQUENCE     :       _STMNT
        !           661: -              |       _SEQUENCE SEPARATOR _STMNT
        !           662: -              ;
        !           663: -
        !           664: -_STMNT                :       skip            { lastloop = -1; }
        !           665: -              |       _SELECT         { lastloop = -1; }
        !           666: -              |       _CYCLE
        !           667: -              |       SEND            { lastloop = -1; }
        !           668: -              |       GUARD           { lastloop = -1; }
        !           669: -              |       STRUCTGOTO      { lastloop = -1; }
        !           670: -              |       error
        !           671: -                      {       yyerror("illegal assertion statement, %s", yytext);
        !           672: -                      }
        !           673: -              ;
        !           674: -_SELECT               :       IF
        !           675: -                      {       if (++curdepth == MAXDEPTH)
        !           676: -                                      whoops("nesting too deep");
        !           677: -
        !           678: -                              ties[curdepth].home = curstate;
        !           679: -                              ties[curdepth].dest = enterowname(NEW, "", DAR);
        !           680: -                              ties[curdepth].bpnt =
        !           681: -                                      (curdepth > 1) ? ties[curdepth-1].bpnt : -1;
        !           682: -                      }
        !           683: -                      _OPTIONLIST FI
        !           684: -                      {       setrowname(ties[curdepth].dest);
        !           685: -                              curstate = ties[curdepth--].dest;
        !           686: -                      }
        !           687: -              ;
        !           688: -
        !           689: -_CYCLE                :       DO
        !           690: -                      {       if (curdepth++ == MAXDEPTH)
        !           691: -                                      whoops("nesting too deep");
        !           692: -
        !           693: -                              labelrow(curstate);
        !           694: -                              ties[curdepth].home = curstate;
        !           695: -                              ties[curdepth].dest = curstate;
        !           696: -                              ties[curdepth].bpnt = enterowname(NEW, "", DAR);
        !           697: -                      }
        !           698: -                      _OPTIONLIST OD
        !           699: -                      {       lastloop = ties[curdepth].home;
        !           700: -                              setrowname(ties[curdepth].bpnt);
        !           701: -                              curstate = ties[curdepth--].bpnt;
        !           702: -                      }
        !           703: -              ;
        !           704: -_OPTIONLIST   :       _ONEOPTION
        !           705: -              |       _ONEOPTION _OPTIONLIST
        !           706: -              ;
        !           707: -
        !           708: -_ONEOPTION    :       FLAG _SEQUENCE
        !           709: -                      {       getrowname(str, ties[curdepth].dest);
        !           710: -                              from = curstate;
        !           711: -                              curstate = enterowname(OLD, str, DAR);
        !           712: -                              setrans(from, 0, curstate, NONE);
        !           713: -                              curstate = ties[curdepth].home;
        !           714: -                      }
        !           715: -              ;
        !           716: -/*
        !           717: - *    NAMELISTS
        !           718: - *    =========
        !           719: - */
        !           720: -
        !           721: -ANAMELIST     :       ANAME
        !           722: -              |       ANAMELIST ',' ANAME
        !           723: -              ;
        !           724: -MNAMELIST     :       MNAME
        !           725: -              |       MNAMELIST ',' MNAME
        !           726: -              ;
        !           727: -PNAMELIST     :       PNAME
        !           728: -              |       PNAMELIST ',' PNAME
        !           729: -              ;
        !           730: -QNAMELIST     :       QNAME
        !           731: -              |       QNAMELIST ',' QNAME
        !           732: -              ;
        !           733: -SNAMELIST     :       SNAME
        !           734: -              |       SNAMELIST ',' SNAME
        !           735: -              ;
        !           736: -VNAMELIST     :       VNAME
        !           737: -              |       VNAMELIST ',' VNAME
        !           738: -              ;
        !           739: -/*
        !           740: - *    NAMES
        !           741: - *    =====
        !           742: - */
        !           743: -
        !           744: -ANAME         :       QSNAME { addApars(strings[$1], nid, parnum++, NONE); }
        !           745: -              |       expr   { addAspecial(makeexpr($1), nid, parnum++);   }
        !           746: -              ;
        !           747: -MNAME         :       NAME
        !           748: -                      {       qtable[qid].status |= ADR;
        !           749: -                              addmsg(strings[$1], qid, SND, INITM, NONE);
        !           750: -                              if (--qisz < 0)
        !           751: -                              yyerror("queue overfilled, %s", strings[$1]);
        !           752: -                      }
        !           753: -              ;
        !           754: -PNAME         :       NAME
        !           755: -                      {       if (vartype == ISM)
        !           756: -                              addsetname(strings[$1], sid, 1);
        !           757: -                              else
        !           758: -                              addFpar(rid, strings[$1], qid, vartype, inside);
        !           759: -                      }
        !           760: -              ;
        !           761: -QNAME         :       NAME '[' VALUE ']'
        !           762: -                      {       if ((qisz = $3) <= 0)
        !           763: -                              yyerror("illegal queue size, %s", strings[$1]);
        !           764: -                              newqname(strings[$1], DCL, $3, NONE);
        !           765: -                      }
        !           766: -              |       NAME '[' VALUE ']' '[' VALUE ']'
        !           767: -                      {       if ((qisz = $6) <= 0)
        !           768: -                              yyerror("illegal queue size, %s", strings[$1]);
        !           769: -                              newqname(strings[$1], DCL, qisz, $3);
        !           770: -                      }
        !           771: -              ;
        !           772: -SNAME         :       NAME            { addsetname(strings[$1], sid, 0); }
        !           773: -              ;
        !           774: -VNAME         :       NAME QINDEX
        !           775: -                      {       addvarname(strings[$1], DCL, NONE, $2, 0);
        !           776: -                      }
        !           777: -              |       NAME QINDEX '=' expr
        !           778: -                      {       addvarname(strings[$1], DCL, makeexpr($4), $2, 0);
        !           779: -                      }
        !           780: -              |       NAME QINDEX COLON VALUE
        !           781: -                      {       addvarname(strings[$1], DCL, NONE, $2, $4);
        !           782: -                      }
        !           783: -              ;
        !           784: -/*
        !           785: - *    CODE
        !           786: - *    ====
        !           787: - */
        !           788: -
        !           789: -SEQUENCE      :       STMNT
        !           790: -                      {       soo = 0;
        !           791: -                      }
        !           792: -              |       SEQUENCE SEPARATOR STMNT
        !           793: -                      {       soo = 0;
        !           794: -                      }
        !           795: -              ;
        !           796: -
        !           797: -STMNT         :       skip
        !           798: -                      {       if (soo)        /* only if used as a guard */
        !           799: -                                      transfer(0, NONE);
        !           800: -                      }
        !           801: -              |       SELECT
        !           802: -              |       CYCLE
        !           803: -              |       SEND
        !           804: -              |       GUARD
        !           805: -              |       JUMP
        !           806: -              |       LABEL STMNT
        !           807: -              |       TEMPLATE
        !           808: -              |       BUILTIN
        !           809: -              |       CONDITIONAL
        !           810: -              |       END
        !           811: -                      {       yyerror("expecting a statement", "");
        !           812: -                              whoops("exit");
        !           813: -                      }
        !           814: -              ;
        !           815: -
        !           816: -SELECT                :       IF
        !           817: -                      {       if (++curdepth == MAXDEPTH)
        !           818: -                                      whoops("nesting too deep");
        !           819: -
        !           820: -                              ties[curdepth].home = curstate;
        !           821: -                              ties[curdepth].dest = enterowname(NEW, "", DAR);
        !           822: -                              ties[curdepth].bpnt =
        !           823: -                                      (curdepth>1) ? ties[curdepth-1].bpnt : -1;
        !           824: -                      }
        !           825: -                      OPTIONLIST FI
        !           826: -                      {       setrowname(ties[curdepth].dest);
        !           827: -                              curstate = ties[curdepth--].dest;
        !           828: -                      }
        !           829: -              ;
        !           830: -
        !           831: -CYCLE         :       DO
        !           832: -                      {       if (curdepth++ == MAXDEPTH)
        !           833: -                                      whoops("nesting too deep");
        !           834: -
        !           835: -                              labelrow(curstate);
        !           836: -                              ties[curdepth].home = curstate;
        !           837: -                              ties[curdepth].dest = curstate;
        !           838: -                              ties[curdepth].bpnt = enterowname(NEW, "", DAR);
        !           839: -                      }
        !           840: -                      OPTIONLIST OD
        !           841: -                      {       setrowname(ties[curdepth].bpnt);
        !           842: -                              curstate = ties[curdepth--].bpnt;
        !           843: -                      }
        !           844: -              ;
        !           845: -
        !           846: -OPTIONLIST    :       ONEOPTION
        !           847: -              |       ONEOPTION OPTIONLIST
        !           848: -              ;
        !           849: -
        !           850: -ONEOPTION     :       FLAG
        !           851: -                      {       soo = 1;        /* start of an option string */
        !           852: -                      }
        !           853: -                      SEQUENCE
        !           854: -                      {       getrowname(str, ties[curdepth].dest);
        !           855: -                              from = curstate;
        !           856: -                              curstate = enterowname(OLD, str, DAR);
        !           857: -                              setrans(from, 0, curstate, NONE);
        !           858: -                              curstate = ties[curdepth].home;
        !           859: -                      }
        !           860: -              ;
        !           861: -
        !           862: -INDEX         :       /* empty */     { $$ = NONE; }
        !           863: -              |       '[' expr ']'    { $$ = makeexpr($2); }
        !           864: -              ;
        !           865: -
        !           866: -PREIO         :       NAME INDEX
        !           867: -                      {       strcpy(str, strings[$1]); /* swivel away name */
        !           868: -                              $$ = $2;
        !           869: -                      }
        !           870: -              ;
        !           871: -
        !           872: -SEND          :       PREIO NOT NAME EXPORT
        !           873: -                      {       xx = newqname(str, ADR, NONE, $1);
        !           874: -                              zz = addmsg(strings[$3], xx, SND, NORM, $1);
        !           875: -                              n = entercolname(zz, OUTP);
        !           876: -                              transfer(n, m);
        !           877: -                      }
        !           878: -              ;
        !           879: -
        !           880: -EXPORT        :               /* empty */     { m = NONE; }
        !           881: -              |       '(' expr ')'    { m = makeexpr($2); }
        !           882: -              ;
        !           883: -
        !           884: -GUARD         :       PREIO '?' timeout
        !           885: -                      { int x;
        !           886: -                              xx = newqname(str, RFR, NONE, $1);
        !           887: -                              x = addmsg(" tau", xx, SAR, NORM, $1);
        !           888: -                              /*
        !           889: -                              ** the leading space is to avoid
        !           890: -                              ** clashes with a user name `tau',
        !           891: -                              ** e.g. in a formal parameter list
        !           892: -                              */
        !           893: -                              n = entercolname(x, TMO);
        !           894: -                              transfer(n, NONE);
        !           895: -                      }
        !           896: -              |       PREIO '?' NAME IMPORT
        !           897: -                      {       xx = newqname(str, RFR, NONE, $1);
        !           898: -                              zz = addmsg(strings[$3], xx, RCV, NORM, $1);
        !           899: -                              n = entercolname(zz, INP);
        !           900: -                              transfer(n, $4);
        !           901: -                      }
        !           902: -              |       PREIO '?' DEFAULT IMPORT
        !           903: -                      {       xx = newqname(str, RFR, NONE, $1);
        !           904: -                              zz = addmsg(" any", xx, SAR, NORM, $1);
        !           905: -                              n = entercolname(zz, DFL);
        !           906: -                              transfer(n, $4);
        !           907: -                      }
        !           908: -              ;
        !           909: -
        !           910: -IMPORT        :               /* empty */
        !           911: -                      {       $$ = NONE;
        !           912: -                      }
        !           913: -              |       '(' ARNAME INDEX ')'
        !           914: -                      {       $$ = addvarname(strings[$2], RFR, NONE, $3, 0);
        !           915: -                      }
        !           916: -              |       '(' NAME ')'
        !           917: -                      {       $$ = addvarname(strings[$2], RFR, NONE, NONE, 0);
        !           918: -                      }
        !           919: -              |       '(' VALUE ')'
        !           920: -                      {       yyerror("importing into constant", "");
        !           921: -                      }
        !           922: -              ;
        !           923: - 
        !           924: -SEPARATOR     :       ARROW
        !           925: -              |       SEMICOLON
        !           926: -              |       error
        !           927: -                      {       yyerror("expecting a stmnt separator", "");
        !           928: -                      }
        !           929: -              ;
        !           930: -
        !           931: -JUMP          :       GOTO NAME
        !           932: -                      {       from = curstate;
        !           933: -                              curstate = enterowname(LAB, strings[$2], ADR);
        !           934: -                              setrans(from, 0, curstate, NONE);
        !           935: -                              curstate = enterowname(NEW, "", DAR);
        !           936: -                      }
        !           937: -              |       STRUCTGOTO
        !           938: -              ;
        !           939: -
        !           940: -STRUCTGOTO    :       BREAK
        !           941: -                      { int i;
        !           942: -                              from = curstate;
        !           943: -                              i = ties[curdepth].bpnt;
        !           944: -
        !           945: -                              if (curdepth == 0 || i == -1)
        !           946: -                                      whoops("illegal break statement");
        !           947: -
        !           948: -                              getrowname(str, i);
        !           949: -                              curstate = enterowname(OLD, str, DAR);
        !           950: -                              setrans(from, 0, curstate, NONE);
        !           951: -                              curstate = enterowname(NEW, "", DAR);
        !           952: -                      }
        !           953: -              ;
        !           954: -
        !           955: -TEMPLATE      :       NAME
        !           956: -                      {       nid = newreftask(strings[$1], RFR);
        !           957: -                              parnum = 0; qid = sid = NONE;
        !           958: -                              cid = newcall(nid);
        !           959: -                      }
        !           960: -                      '(' ANYACTUALS ')'
        !           961: -                      { int x;
        !           962: -                              parrefs(parnum, nid);
        !           963: -                              x = entercolname(cid, FCT);
        !           964: -                              transfer(x, NONE);
        !           965: -                      }
        !           966: -              ;
        !           967: -
        !           968: -ANYACTUALS    :       /* empty */
        !           969: -              |       ANAMELIST
        !           970: -              ;
        !           971: -
        !           972: -CONDITIONAL   :       '(' expr ')'
        !           973: -                      {       transfer(entercolname(makeexpr($2), CND), NONE);
        !           974: -                      }
        !           975: -              ;
        !           976: -
        !           977: -VARNAME               :       ARNAME INDEX
        !           978: -                      {       m = addvarname(strings[$1], RFR, NONE, $2, 0);
        !           979: -                              $$ = newnode(NM, m, NULL, NULL);
        !           980: -                      }
        !           981: -              |       NAME
        !           982: -                      {       m = addvarname(strings[$1], RFR, NONE, NONE, 0);
        !           983: -                              $$ = newnode(NM, m, NULL, NULL);
        !           984: -                      }
        !           985: -              ;
        !           986: -
        !           987: -BUILTIN               :       VARNAME ASGN expr
        !           988: -                      {       m = makeexpr(newnode(OP, $2, $1, $3));
        !           989: -                              transfer(0, m);
        !           990: -                      }
        !           991: -              |       VARNAME INC 
        !           992: -                      {       m = makeexpr(newnode(OP, poinc, $1, NULL));
        !           993: -                              transfer(0, m);
        !           994: -                      }
        !           995: -              |       VARNAME DEC
        !           996: -                      {       m = makeexpr(newnode(OP, podec, $1, NULL));
        !           997: -                              transfer(0, m);
        !           998: -                      }
        !           999: -              ;
        !          1000: -
        !          1001: -ASGN          :       '='     { $$ =  setv; }
        !          1002: -              |       ADDEQ   { $$ = addeq; }
        !          1003: -              |       SUBEQ   { $$ = subeq; }
        !          1004: -              |       MULEQ   { $$ = muleq; }
        !          1005: -              |       DIVEQ   { $$ = diveq; }
        !          1006: -              |       MODEQ   { $$ = modeq; }
        !          1007: -              ;
        !          1008: -
        !          1009: -expr          :       expr '+' expr { $$ = newnode(OP, plus, $1, $3); }
        !          1010: -              |       expr '-' expr { $$ = newnode(OP, minus, $1, $3); }
        !          1011: -              |       expr '*' expr { $$ = newnode(OP, times, $1, $3); }
        !          1012: -              |       expr '/' expr { $$ = newnode(OP, div, $1, $3); }
        !          1013: -              |       expr '%' expr { $$ = newnode(OP, mod, $1, $3); }
        !          1014: -              |       expr '^' expr { $$ = newnode(OP, power, $1, $3); }
        !          1015: -              |       expr GT expr { $$ = newnode(OP, gt, $1, $3); }
        !          1016: -              |       expr GE expr { $$ = newnode(OP, ge, $1, $3); }
        !          1017: -              |       expr LT expr { $$ = newnode(OP, lt, $1, $3); }
        !          1018: -              |       expr LE expr { $$ = newnode(OP, le, $1, $3); }
        !          1019: -              |       expr EQ expr { $$ = newnode(OP, eq, $1, $3); }
        !          1020: -              |       expr NE expr { $$ = newnode(OP, ne, $1, $3); }
        !          1021: -              |       expr AND expr { $$ = newnode(OP, land, $1, $3); }
        !          1022: -              |       expr OR expr { $$ = newnode(OP, lor, $1, $3); }
        !          1023: -              |       '-' expr %prec UNARYMINUS
        !          1024: -                      {       $$ = newnode(OP, uminus, $2, NULL); }
        !          1025: -              |       NOT expr
        !          1026: -                      {       $$ = newnode(OP, lnot, $2, NULL); }
        !          1027: -              |       VALUE
        !          1028: -                      {       $$ = newnode(NM, $1+3*MANY, NULL, NULL); }
        !          1029: -              |       ARNAME INDEX
        !          1030: -                      {       m = addvarname(strings[$1], RFR, NONE, $2, 0);
        !          1031: -                              $$ = newnode(NM, m, NULL, NULL);
        !          1032: -                      }
        !          1033: -              |       NAME
        !          1034: -                      {       m = addvarname(strings[$1], RFR, NONE, NONE, 0);
        !          1035: -                              $$ = newnode(NM, m, NULL, NULL);
        !          1036: -                      }
        !          1037: -              |       '(' expr ')' { $$ = $2; }
        !          1038: -              ;
        !          1039: -
        !          1040: -LABEL         :       NAME COLON
        !          1041: -                      {       from = curstate;
        !          1042: -                              curstate = enterowname(LAB, strings[$1], DCL);
        !          1043: -                              labelrow(curstate);
        !          1044: -                              setrans(from, 0, curstate, NONE);
        !          1045: -                      }
        !          1046: -              ;
        !          1047: -%%
        !          1048: -
        !          1049: -extern FILE *yyin;
        !          1050: -
        !          1051: -main(argc, argv)
        !          1052: -      char **argv;
        !          1053: -{
        !          1054: -      int base = 1, i = 1;
        !          1055: -      char c, buff[256];
        !          1056: -      char outfile[32];
        !          1057: -
        !          1058: -      if (argc > base && argv[1][0] == '-')
        !          1059: -      {       while ((c = argv[1][i++]) != '\0')
        !          1060: -                      switch (c) {
        !          1061: -                      case 's': varwidths = 1; break;
        !          1062: -                      case 'v': verbose = 1; break;
        !          1063: -                      case 'n': nopurge = 1; break;
        !          1064: -                      case 'l': linecode = 1; break;
        !          1065: -                      default : fprintf(stderr, "usage: pret [-vsnl] file\n");
        !          1066: -                                fprintf(stderr, "\tv - verbose\n");
        !          1067: -                                fprintf(stderr, "\ts - supertrace format\n");
        !          1068: -                                fprintf(stderr, "\tn - no minimization\n");
        !          1069: -                                fprintf(stderr, "\tl - enables linecode\n");
        !          1070: -                                exit(1);
        !          1071: -                      }
        !          1072: -              base++;
        !          1073: -      }
        !          1074: -      if (argc <= base)
        !          1075: -      {       fprintf(stderr, "usage: pret [-vnl] file\n");
        !          1076: -              exit(1);
        !          1077: -
        !          1078: -      }
        !          1079: -      if ((tb = fopen("pret.tmp", "w")) == NULL)
        !          1080: -              whoops("cannot create pret.tmp\n");
        !          1081: -
        !          1082: -      strcpy(procname, "_");
        !          1083: -      strcpy(refname, "_");
        !          1084: -      unlink("pret.out");
        !          1085: -      unlink("pret.err");
        !          1086: -
        !          1087: -      if (argc > base)
        !          1088: -      {       strcpy(filename, argv[base]);
        !          1089: -
        !          1090: -              mktemp(strcpy(outfile, "/tmp/trans.XXXXXX"));
        !          1091: -              sprintf(buff, "/lib/cpp %s > %s", filename, outfile);
        !          1092: -
        !          1093: -              if (system(buff))
        !          1094: -              {       unlink(outfile);
        !          1095: -                      exit(1);
        !          1096: -              } else
        !          1097: -                      if ((yyin = fopen(outfile, "r")) == NULL)
        !          1098: -                      {       printf("cannot open %s\n", outfile);
        !          1099: -                              whoops("aborting");
        !          1100: -                      }
        !          1101: -              unlink(outfile);
        !          1102: -      }
        !          1103: -      parsed = (struct REVPOL *)
        !          1104: -              Emalloc(EXPRMAX * sizeof(struct REVPOL));
        !          1105: -      prs = 0;
        !          1106: -
        !          1107: -      yyparse();
        !          1108: -      prepsorts();
        !          1109: -      checknames();
        !          1110: -      fclose(tb);
        !          1111: -      chatter();
        !          1112: -      makebin();
        !          1113: -      exit(0);
        !          1114: -}
        !          1115: -
        !          1116: -newstring(str)
        !          1117: -      char *str;
        !          1118: -{     register int i;
        !          1119: -
        !          1120: -      for (i = 0; i < nnames; i++)
        !          1121: -              if (strcmp(str, strings[i]) == 0)
        !          1122: -                      return i;
        !          1123: -      if (++nnames >= MANY)
        !          1124: -              yyerror("symbol table overflow, %s", str);
        !          1125: -      strncpy(strings[i], str, MAXNAME-1);
        !          1126: -      return i;
        !          1127: -}
        !          1128: //GO.SYSIN DD pret.y
        !          1129: echo pret0.c 1>&2
        !          1130: sed 's/.//' >pret0.c <<'//GO.SYSIN DD pret0.c'
        !          1131: -#include <stdio.h>
        !          1132: -#include "pret.h"
        !          1133: -#include "pret.d"
        !          1134: -
        !          1135: -#define DEBUG6        0
        !          1136: -#define DEBUG7        0
        !          1137: -
        !          1138: -extern struct COL column[MANY];
        !          1139: -extern struct ROW row[MANY];
        !          1140: -extern int nrrows, nrcols, redrows;
        !          1141: -
        !          1142: -struct ENTRY * find();
        !          1143: -char * Emalloc();
        !          1144: -
        !          1145: -char  **triangle;
        !          1146: -short **successor;
        !          1147: -short *tmpsucc;
        !          1148: -int *unmap;           /* reverses maptwo values to original row numbers */
        !          1149: -
        !          1150: -MAP(x)
        !          1151: -{ int y = row[x].maptwo;      /* gives a value between 0 and redrows    */
        !          1152: -
        !          1153: -      unmap[y] = x;
        !          1154: -      return y;
        !          1155: -}
        !          1156: -
        !          1157: -minimize()
        !          1158: -{ int i, j;
        !          1159: -  int n = redrows;
        !          1160: -
        !          1161: -      unmap = (int *)
        !          1162: -              Emalloc( n * sizeof (int) );
        !          1163: -      triangle = (char **)
        !          1164: -              Emalloc( n * sizeof (char *) );
        !          1165: -      /*
        !          1166: -      ** allocate a triangle of states
        !          1167: -      ** triangle[i][j] == 1
        !          1168: -      ** will indicate that the states i and j are
        !          1169: -      ** in the same equivalence class
        !          1170: -      ** initially, claim all pairs to be equivalent
        !          1171: -      */
        !          1172: -
        !          1173: -      for (i = 1; i < n; i++)
        !          1174: -      {       triangle[i] = (char *)
        !          1175: -                      Emalloc(i * sizeof (char));
        !          1176: -              for (j = 0; j < i; j++)
        !          1177: -                      triangle[i][j] = 1;
        !          1178: -      }
        !          1179: -      tmpsucc = (short *)
        !          1180: -              Emalloc( n * sizeof (short));
        !          1181: -      successor = (short **)
        !          1182: -              Emalloc( n * sizeof (short *) );
        !          1183: -
        !          1184: -      for (i = 0; i < n; i++)
        !          1185: -      {       successor[i] = (short *)
        !          1186: -                      Emalloc(n * sizeof (short));
        !          1187: -              for (j = 0; j < n; j++)
        !          1188: -                      successor[i][j] = 0;
        !          1189: -      }
        !          1190: -      partition();
        !          1191: -
        !          1192: -#if DEBUG6
        !          1193: -      putriangle();
        !          1194: -#endif
        !          1195: -      squash();
        !          1196: -
        !          1197: -      for (i = 1; i < n; i++)
        !          1198: -              free(triangle[i]);
        !          1199: -      free(triangle);
        !          1200: -      free(unmap);
        !          1201: -}
        !          1202: -
        !          1203: -/*
        !          1204: -newgeneration()
        !          1205: -{ register int i,j;
        !          1206: -
        !          1207: -      for (j = 0; j < n; i++)
        !          1208: -              tmpsucc[j] = 0;
        !          1209: -      for (i = 0; i < n; i++)
        !          1210: -      {       for (j = 0; j < n; j++)
        !          1211: -                      addkids(successor[i][j]);
        !          1212: -              for (j = 0; j < n; j++)
        !          1213: -              {       successor[i][j] = tmpsucc[j];
        !          1214: -                      tmpsucc[i] = 0;
        !          1215: -              }
        !          1216: -      }
        !          1217: -}
        !          1218: -
        !          1219: -addkids(whosekids)
        !          1220: -{ register int h,k,x,y;
        !          1221: -  struct ENTRY *one = find(i, 0);
        !          1222: -  struct ENTRY *two = find(j, 0);
        !          1223: -  struct PILAR *a;
        !          1224: -
        !          1225: -
        !          1226: -      for (k = 0; k < nrcols; k++)
        !          1227: -      {       for (h = 0; h < one->nrpils; h++)
        !          1228: -              {       a = one->pilar;
        !          1229: -
        !          1230: -                      tmpsucc[target(a->transf)] = 1;
        !          1231: -
        !          1232: -                      a = a->nxtp;
        !          1233: -              }
        !          1234: -              one = one->nextcol;
        !          1235: -              two = two->nextcol;
        !          1236: -      }
        !          1237: -}
        !          1238: -*/
        !          1239: -
        !          1240: -partition()
        !          1241: -{ register int i, j, K;
        !          1242: -  int anychange = 1;
        !          1243: -
        !          1244: -      /*
        !          1245: -      ** recursively scan through the
        !          1246: -      ** triangle to find non-equivalent pairs
        !          1247: -      ** until pi(1) -> pi(k) == pi(k-1)
        !          1248: -      */
        !          1249: -
        !          1250: -      for (K = 1; anychange == 1; K++)
        !          1251: -      {       anychange = 0;
        !          1252: -#if DEBUG7
        !          1253: -              printf("%d Equivalence:\n", K);
        !          1254: -#endif DEBUG7
        !          1255: -              for (i = nrrows-1; i > 0; i--)
        !          1256: -              {       if (row[i].mapping != NOSTATE)
        !          1257: -                              continue;
        !          1258: -
        !          1259: -                      for (j = 0; j < i; j++)
        !          1260: -                      {       if (row[j].mapping != NOSTATE
        !          1261: -                              ||  triangle[MAP(i)][MAP(j)] == 0)
        !          1262: -                                      continue;
        !          1263: -
        !          1264: -                              if ( !equiv(K, i, j) )
        !          1265: -                              {       triangle[MAP(i)][MAP(j)] = 0;
        !          1266: -                                      anychange = 1;
        !          1267: -                              }
        !          1268: -#if DEBUG7
        !          1269: -                              else
        !          1270: -                              {       printf("\tstates: %2d,", MAP(i));
        !          1271: -                                      printf("%2d\n", MAP(j));
        !          1272: -                              }
        !          1273: -#endif DEBUG7
        !          1274: -}     }       }       }
        !          1275: -
        !          1276: -#if DEBUG6
        !          1277: -putriangle()
        !          1278: -{ int i, j;
        !          1279: -  int n = redrows;
        !          1280: -  int cn = 0;
        !          1281: -  char * class = (char *) Emalloc (n * sizeof (char) );
        !          1282: -
        !          1283: -      for (i = 0; i < n; i++)
        !          1284: -              class[i] = 0;
        !          1285: -      
        !          1286: -      for (i = 1; i < n; i++)
        !          1287: -      for (j = 0; j < i; j++)
        !          1288: -              if ( triangle[i][j] )
        !          1289: -              {       if (class[i] == 0 && class[j] == 0)
        !          1290: -                              class[i] = class[j] = ++cn;
        !          1291: -                      else if (class[i] != 0)
        !          1292: -                              class[j] = class[i];
        !          1293: -                      else if (class[j] != 0)
        !          1294: -                              class[i] = class[j];
        !          1295: -                      else
        !          1296: -                              whoops("cannot happen, classes");
        !          1297: -              }
        !          1298: -
        !          1299: -      for (i = 1; i <= cn; i++)
        !          1300: -      {       printf("class %2d: ", i);
        !          1301: -              for (j = 0; j < n; j++)
        !          1302: -                      if (class[j] == i)
        !          1303: -                              printf("%d,", j);
        !          1304: -              printf("\n\n");
        !          1305: -      }
        !          1306: -
        !          1307: -      free(class);
        !          1308: -}
        !          1309: -#endif
        !          1310: -
        !          1311: -squash()
        !          1312: -{ int i, j;
        !          1313: -  int n = redrows;
        !          1314: -      for (i = 1; i < n; i++)
        !          1315: -      for (j = 0; j < i; j++)
        !          1316: -              if ( triangle[i][j] )
        !          1317: -              {       row[unmap[i]].mapping = unmap[j];
        !          1318: -                      row[unmap[j]].labeled |= row[unmap[i]].labeled;
        !          1319: -              }
        !          1320: -}
        !          1321: -
        !          1322: -outequiv(A, B)
        !          1323: -      struct ENTRY *A, *B;
        !          1324: -{ struct PILAR *at = A->pilar;
        !          1325: -  struct PILAR *it = B->pilar;
        !          1326: -
        !          1327: -      /*
        !          1328: -      ** don't look at the at->transf's, 
        !          1329: -      ** equal columns implicitly give
        !          1330: -      ** equal inputs or outputs, so
        !          1331: -      ** just compare the cargo codes
        !          1332: -      */
        !          1333: -
        !          1334: -      while (it != NULL && at != NULL)
        !          1335: -      {       if (at->code != it->code)
        !          1336: -                      break;
        !          1337: -
        !          1338: -              at = at->nxtp;
        !          1339: -              it = it->nxtp;
        !          1340: -      }
        !          1341: -
        !          1342: -      return (it == NULL && at == NULL);
        !          1343: -}
        !          1344: -
        !          1345: -equiv(K, i, j)
        !          1346: -{ int h, k, x, y, z;
        !          1347: -  struct ENTRY *one = find(i, 0);
        !          1348: -  struct ENTRY *two = find(j, 0);
        !          1349: -  struct PILAR *a, *b;
        !          1350: -
        !          1351: -      if (one->nrpils != two->nrpils)
        !          1352: -              return 0;
        !          1353: -
        !          1354: -      if (K == 1)
        !          1355: -      {       for (k = 0; k < nrcols; k++)
        !          1356: -              {       if ( !outequiv(one, two) )
        !          1357: -                              return 0;
        !          1358: -
        !          1359: -                      one = one->nextcol;
        !          1360: -                      two = two->nextcol;
        !          1361: -              }
        !          1362: -      } else
        !          1363: -              for (k = 0; k < nrcols; k++)
        !          1364: -              {       a = one->pilar;
        !          1365: -                      b = two->pilar;
        !          1366: -                      for (h = 0; h < one->nrpils; h++)
        !          1367: -                      {
        !          1368: -                              x = target(a->transf);
        !          1369: -                              y = target(b->transf);
        !          1370: -                              x = MAP(x); y = MAP(y);
        !          1371: -                              if (y > x) { z=x; x=y; y=z; }
        !          1372: -                              if (x != y && triangle[x][y] == 0)
        !          1373: -                                      return 0;
        !          1374: -
        !          1375: -                              a = a->nxtp;
        !          1376: -                              b = b->nxtp;
        !          1377: -                      }
        !          1378: -                      one = one->nextcol;
        !          1379: -                      two = two->nextcol;
        !          1380: -              }
        !          1381: -
        !          1382: -      return 1;
        !          1383: -}
        !          1384: //GO.SYSIN DD pret0.c
        !          1385: echo pret1.c 1>&2
        !          1386: sed 's/.//' >pret1.c <<'//GO.SYSIN DD pret1.c'
        !          1387: -#include <stdio.h>
        !          1388: -#include "pret.h"
        !          1389: -
        !          1390: -#define LOOK  0
        !          1391: -#define ADD   1
        !          1392: -
        !          1393: -struct QSET_EL {
        !          1394: -      char name[MAXNAME];             /* message name           */
        !          1395: -      char status;                    /* usage of this message  */
        !          1396: -      int id;                         /* number assigned to msg */
        !          1397: -      struct QSET_EL *nxtel;
        !          1398: -};
        !          1399: -
        !          1400: -struct QSETS {
        !          1401: -      int nrelmnts;
        !          1402: -      int status;                     /* usage of the qset itself */
        !          1403: -      int qstatus;                    /* usage of the setowner (a queue) */
        !          1404: -      char setname[MAXNAME];          /* symbolic name */
        !          1405: -      char setowner[MAXNAME];         /* queue */
        !          1406: -      int qind;                       /* NONE if simple q, #expr if array */
        !          1407: -      struct QSET_EL *elmnts;
        !          1408: -      struct QSETS *nxtset;
        !          1409: -      int closed;
        !          1410: -};
        !          1411: -
        !          1412: -struct QSETS *frstset;
        !          1413: -int nrsets = 0;
        !          1414: -
        !          1415: -extern struct QTABLE qtable[NQUEUES];
        !          1416: -extern char procname[MAXNAME];
        !          1417: -extern char refname[MAXNAME];
        !          1418: -extern pid, rid;
        !          1419: -char *Emalloc();
        !          1420: -
        !          1421: -isqset(str)
        !          1422: -      char *str;
        !          1423: -{     struct QSETS *q = frstset;
        !          1424: -      char buf1[MAXNAME], buf2[MAXNAME];
        !          1425: -      int i;
        !          1426: -
        !          1427: -      buf1[0] = '\0';
        !          1428: -      if (pid != NONE)
        !          1429: -              strncpy(buf1, procname, 8);
        !          1430: -      else if (rid != NONE)
        !          1431: -              strncpy(buf1, refname, 8);
        !          1432: -      strcat(buf1, ":");
        !          1433: -
        !          1434: -      strcpy(buf2, "global:");
        !          1435: -      strcat(buf1, str);
        !          1436: -      strcat(buf2, str);
        !          1437: -
        !          1438: -      for (i = 0; i < nrsets; i++, q = q->nxtset)
        !          1439: -      {       if (strcmp(buf1, q->setname) == 0
        !          1440: -              ||  strcmp(buf2, q->setname) == 0)
        !          1441: -                      return 1;
        !          1442: -      }
        !          1443: -      return 0;
        !          1444: -}
        !          1445: -
        !          1446: -struct QSETS *
        !          1447: -findset(which)
        !          1448: -{     struct QSETS *hook = frstset;
        !          1449: -      int i;
        !          1450: -
        !          1451: -      if (which >= nrsets || which < 0)
        !          1452: -              whoops("cannot happen - findset");
        !          1453: -
        !          1454: -      for (i = 0; i < which; i++)
        !          1455: -              hook = hook->nxtset;
        !          1456: -
        !          1457: -      return hook;
        !          1458: -}
        !          1459: -
        !          1460: -inqset(which, what, usage, qind)
        !          1461: -      char *what;
        !          1462: -{
        !          1463: -      struct QSETS   *hook  = findset(which);
        !          1464: -      struct QSET_EL *hookl = hook->elmnts;
        !          1465: -      int i;
        !          1466: -
        !          1467: -      for (i = 0; i < hook->nrelmnts; i++)
        !          1468: -      {       if (strcmp(what, hookl->name) == 0)
        !          1469: -              {       hookl->status |= usage;
        !          1470: -                      if (hookl->id == -1)
        !          1471: -                              whoops("unnumbered parameter");
        !          1472: -                      if (qind != hook->qind)
        !          1473: -                              yyerror("queue indexing error, qset, %s", what);
        !          1474: -                      return hookl->id;
        !          1475: -              }
        !          1476: -              hookl = hookl->nxtel;
        !          1477: -      }
        !          1478: -
        !          1479: -      return -1;
        !          1480: -}
        !          1481: -
        !          1482: -renumqset(which, N)
        !          1483: -{ struct QSETS * hook = findset(which);
        !          1484: -  struct QSET_EL * hookl = hook->elmnts;
        !          1485: -  int i, j;
        !          1486: -
        !          1487: -      qsetowner(which, 0);
        !          1488: -      for (i = 0, j = N; i < hook->nrelmnts; i++)
        !          1489: -      {       hookl->id = j++;
        !          1490: -              hookl = hookl->nxtel;
        !          1491: -      }
        !          1492: -      return j;
        !          1493: -}
        !          1494: -
        !          1495: -matchset(a, b)
        !          1496: -{ struct QSETS * one = findset(a);
        !          1497: -  struct QSETS * two = findset(b);
        !          1498: -  struct QSET_EL * onel;
        !          1499: -  struct QSET_EL * twol;
        !          1500: -  int i;
        !          1501: -
        !          1502: -      if (one->nrelmnts != two->nrelmnts)
        !          1503: -      {       yyerror("qset does not match formal parameter, %s", one->setname);
        !          1504: -              return;
        !          1505: -      }
        !          1506: -      onel = one->elmnts;
        !          1507: -      twol = two->elmnts;
        !          1508: -
        !          1509: -      for (i = 0; i < one->nrelmnts; i++)
        !          1510: -      {       onel->status |= twol->status;
        !          1511: -              onel = onel->nxtel;
        !          1512: -              twol = twol->nxtel;
        !          1513: -      }
        !          1514: -      return two->qstatus;
        !          1515: -}
        !          1516: -
        !          1517: -matchowner(a, str, how, qind)
        !          1518: -      char *str;
        !          1519: -{ struct QSETS * hook = findset(a);
        !          1520: -
        !          1521: -      if (strcmp(hook->setowner, str) == 0)
        !          1522: -      {       hook->qstatus |= how;
        !          1523: -              if (qind != hook->qind)
        !          1524: -                      yyerror("queue indexing error (qset ref), %s", str);
        !          1525: -              return 1;
        !          1526: -      }
        !          1527: -      return 0;
        !          1528: -}
        !          1529: -
        !          1530: -struct QSET_EL *
        !          1531: -mkelmnt(str, how)
        !          1532: -      char *str;
        !          1533: -{ struct QSET_EL *try = (struct QSET_EL *)
        !          1534: -              Emalloc( sizeof( struct QSET_EL ) );
        !          1535: -
        !          1536: -      strcpy(try->name, str);
        !          1537: -      try->nxtel = NULL;
        !          1538: -      try->status = how;
        !          1539: -      try->id = -1;
        !          1540: -
        !          1541: -      return try;
        !          1542: -}
        !          1543: -
        !          1544: -struct QSETS *
        !          1545: -mkset(str1, str2, how, qind)
        !          1546: -      char *str1, *str2;
        !          1547: -{ struct QSET_EL *hook;
        !          1548: -  struct QSETS *try = (struct QSETS *)
        !          1549: -              Emalloc( sizeof( struct QSETS ) );
        !          1550: -
        !          1551: -      if (how == RFR)
        !          1552: -              yyerror("undeclared qset, %s", str1);
        !          1553: -
        !          1554: -      try->status = how;
        !          1555: -      try->qstatus = 0;
        !          1556: -      try->nxtset = NULL;
        !          1557: -      strcpy(try->setname,  str1);
        !          1558: -      strcpy(try->setowner, str2);
        !          1559: -      try->closed = 0;
        !          1560: -      try->qind = qind;
        !          1561: -
        !          1562: -      try->nrelmnts = 0;
        !          1563: -      try->elmnts = mkelmnt(" tau", SAR);
        !          1564: -      try->nrelmnts++;
        !          1565: -
        !          1566: -      hook = try->elmnts;
        !          1567: -      hook->nxtel = mkelmnt(" any", SND);
        !          1568: -      try->nrelmnts++;
        !          1569: -
        !          1570: -      nrsets++;
        !          1571: -      return try;
        !          1572: -}
        !          1573: -
        !          1574: -qsetowner(which, how)
        !          1575: -{     struct QSETS *hook = findset(which);
        !          1576: -      return newqname(hook->setowner, how, NONE, hook->qind);
        !          1577: -}
        !          1578: -
        !          1579: -inset(str, str2, mask, how, qind)
        !          1580: -      char *str, *str2;
        !          1581: -{ struct QSETS *hook = frstset;
        !          1582: -  struct QSETS *last = frstset;
        !          1583: -  int i;
        !          1584: -      for (i = 0; i < nrsets && hook != NULL; i++)
        !          1585: -      {       if (strcmp(hook->setname, str) == 0)
        !          1586: -              {       if (mask == DCL)
        !          1587: -                              yyerror("qset redeclared, %s", str);
        !          1588: -                      hook->status |= mask;
        !          1589: -                      break;
        !          1590: -              }
        !          1591: -              last = hook;
        !          1592: -              hook = hook->nxtset;
        !          1593: -      }
        !          1594: -      if (how == ADD && i == nrsets)
        !          1595: -              last->nxtset = mkset(str, str2, mask, qind);
        !          1596: -
        !          1597: -      return i;
        !          1598: -}
        !          1599: -
        !          1600: -newqset(str1, str2, mask, qind)
        !          1601: -      char *str1, *str2;
        !          1602: -{
        !          1603: -      int i = nrsets;
        !          1604: -      char str[MAXNAME];
        !          1605: -
        !          1606: -      if (pid != NONE)
        !          1607: -              strncpy(str, procname, 8);
        !          1608: -      else if (rid != NONE)
        !          1609: -              strncpy(str, refname, 8);
        !          1610: -      else
        !          1611: -              strcpy(str, "global");
        !          1612: -      strcat(str, ":");
        !          1613: -      strcat(str, str1);
        !          1614: -
        !          1615: -      if (mask == RFR && (pid != NONE || rid != NONE))
        !          1616: -      {       if (inset(str, str2, mask, LOOK, qind) == nrsets)
        !          1617: -              {       strcpy(str, "global");
        !          1618: -                      strcat(str, ":");
        !          1619: -                      strcat(str, str1);
        !          1620: -      }       }
        !          1621: -
        !          1622: -      if (nrsets == 0)
        !          1623: -              frstset = mkset(str, str2, mask, qind);
        !          1624: -      else
        !          1625: -              i = inset(str, str2, mask, ADD, qind);
        !          1626: -
        !          1627: -      return i;
        !          1628: -}
        !          1629: -
        !          1630: -closeqset(which)
        !          1631: -{     struct QSETS *where = findset(which);
        !          1632: -      where->closed = 1;
        !          1633: -}
        !          1634: -
        !          1635: -isclosed(which)
        !          1636: -{     struct QSETS *where = findset(which);
        !          1637: -      return where->closed;
        !          1638: -}
        !          1639: -
        !          1640: -addsetname(str, which, susp)
        !          1641: -      char *str;
        !          1642: -{ struct QSETS   *where = findset(which);
        !          1643: -  struct QSET_EL *hook  = where->elmnts;
        !          1644: -  int i, j;
        !          1645: -
        !          1646: -      j = newqname(where->setowner, 0, NONE, where->qind);
        !          1647: -      i = where->nrelmnts;
        !          1648: -
        !          1649: -      if (i == 0)
        !          1650: -              where->elmnts = mkelmnt(str, 0);
        !          1651: -      else
        !          1652: -      {       for (i = 1; i < where->nrelmnts; i++)
        !          1653: -                      hook = hook->nxtel;
        !          1654: -
        !          1655: -              hook->nxtel = mkelmnt(str, 0);
        !          1656: -      }
        !          1657: -
        !          1658: -      /* if setowner is a formal parameter name
        !          1659: -       * the returned value `j' refers to the qset
        !          1660: -       * in which it was defined + an offset `MANY'
        !          1661: -       * if so, we must check that the message added
        !          1662: -       * here was also defined in the original set
        !          1663: -       */
        !          1664: -
        !          1665: -      if (susp && j >= MANY && isclosed(j - MANY))    /* current set is open */
        !          1666: -              addmsg(str, j, 0, NORM, where->qind);   /* check validity msg  */
        !          1667: -
        !          1668: -      where->nrelmnts++;
        !          1669: -
        !          1670: -      return i;
        !          1671: -}
        !          1672: -
        !          1673: -callist(which, hit)
        !          1674: -{ int i, j;
        !          1675: -  struct QSETS   * hook = findset(which);
        !          1676: -  struct QSET_EL * kooh = hook->elmnts;
        !          1677: -
        !          1678: -      for (i = 0; i < hook->nrelmnts; i++)
        !          1679: -      {       j = addmsg(kooh->name, hit, kooh->status, NORM, hook->qind);
        !          1680: -              callentry(ISM, j);
        !          1681: -              kooh = kooh->nxtel;
        !          1682: -      }
        !          1683: -}
        !          1684: //GO.SYSIN DD pret1.c
        !          1685: echo pret2.c 1>&2
        !          1686: sed 's/.//' >pret2.c <<'//GO.SYSIN DD pret2.c'
        !          1687: -#include <stdio.h>
        !          1688: -#include "pret.h"
        !          1689: -#include "pret.d"
        !          1690: -
        !          1691: - struct COL column[MANY];
        !          1692: - struct ROW row[MANY];
        !          1693: -
        !          1694: - struct ENTRY *rowtail;
        !          1695: - struct ENTRY *coltail;
        !          1696: - struct ENTRY *base;          /* base of transition table */
        !          1697: -
        !          1698: - struct ENTRY *newentry();
        !          1699: - struct PILAR *newunit();
        !          1700: -
        !          1701: - int nrrows = 0;      /* raw nr of rows (incremented by addrow() */
        !          1702: - int nrcols = 0;      /* number of columns per table             */
        !          1703: - int redrows = 0;     /* reduced nr of rows (set by remap()      */
        !          1704: - int extras = 0;      /* counts replicated processes             */
        !          1705: -
        !          1706: -extern char procname[MAXNAME], refname[MAXNAME];
        !          1707: -extern int anyerror, pid, rid, curstate, lastloop;
        !          1708: -
        !          1709: -struct ENTRY *
        !          1710: -find(R, C)
        !          1711: -{ register int i;
        !          1712: -  register int r = R;
        !          1713: -  register int c = C;
        !          1714: -  register struct ENTRY *here = base;
        !          1715: -
        !          1716: -      if (r >= nrrows || c >= nrcols || r < 0 || c < 0)
        !          1717: -              whoops ("bad table index");
        !          1718: -      for (i = 0; i < r; i++)
        !          1719: -              here = here->nextrow;
        !          1720: -      for (i = 0; i < c; i++)
        !          1721: -              here = here->nextcol;
        !          1722: -      return here;
        !          1723: -}
        !          1724: -
        !          1725: -getrowname(where, which)
        !          1726: -      char *where;
        !          1727: -{     strcpy(where, row[which].name);
        !          1728: -}
        !          1729: -
        !          1730: -setrowname(which)
        !          1731: -{ char stro[256];
        !          1732: -  extern linenumber;
        !          1733: -  extern char filename[];
        !          1734: -
        !          1735: -      sprintf(stro, "%d/%d:%s", linenumber, nrrows, filename);
        !          1736: -      strcpy(row[which].name, stro);
        !          1737: -}
        !          1738: -
        !          1739: -deadlabels()
        !          1740: -{ register int i;
        !          1741: -      for (i = 0; i < nrrows; i++)
        !          1742: -      switch(row[i].refcount)
        !          1743: -      {       case ADR: printf("%s: undeclared label\n", row[i].name);
        !          1744: -                        anyerror++;
        !          1745: -                        break;
        !          1746: -              case DCL: printf("%s: unused label\n", row[i].name);
        !          1747: -                        break;
        !          1748: -              case ADR+DCL:
        !          1749: -                        break;
        !          1750: -              default:  whoops("cannot happen - label");
        !          1751: -      }
        !          1752: -}
        !          1753: -
        !          1754: -remap()
        !          1755: -{ register int i, j;
        !          1756: -
        !          1757: -      for (i = j = 0; i < nrrows; i++)
        !          1758: -              if (row[i].mapping == NOSTATE)
        !          1759: -                      row[i].maptwo = j++;
        !          1760: -      redrows = j;
        !          1761: -}
        !          1762: -
        !          1763: -purgerows(how)
        !          1764: -{ int i; extern int linecode, assertion, inertion;
        !          1765: -
        !          1766: -      for (i = 0; i < nrrows; i++)
        !          1767: -      {       row[i].mapping = NOSTATE;
        !          1768: -              row[i].maptwo = i;
        !          1769: -      }
        !          1770: -      redrows = nrrows;
        !          1771: -/* -> bug if (!linecode) */
        !          1772: -      if (!linecode || rid==assertion || rid==inertion)
        !          1773: -              transitrows();  /* remove dummy transitions */
        !          1774: -      remap();
        !          1775: -
        !          1776: -      if (!linecode && !how)
        !          1777: -      {       minimize();
        !          1778: -              remap();
        !          1779: -      }
        !          1780: -}
        !          1781: -
        !          1782: -target(y)
        !          1783: -{ int i = 0;
        !          1784: -  int x = y;
        !          1785: -      while (row[x].mapping != NOSTATE)
        !          1786: -      {       x = row[x].mapping;
        !          1787: -              if (i++ > nrrows)
        !          1788: -              {       printf("%s: ", (pid == NONE) ? procname : refname);
        !          1789: -                      whoops("contains unconditional, infinite loop");
        !          1790: -              }
        !          1791: -      }
        !          1792: -      return x;
        !          1793: -}
        !          1794: -
        !          1795: -enterowname(how, stri, bang)
        !          1796: -      char *stri, bang;
        !          1797: -{ register int i;
        !          1798: -  char stro[256];
        !          1799: -  extern int linenumber;
        !          1800: -  extern char filename[];
        !          1801: -
        !          1802: -      switch(how) {
        !          1803: -      case LAB:       sprintf(stro, "%s: %s", stri, filename);
        !          1804: -                      for (i = 0; i < nrrows; i++)
        !          1805: -                              if (strcmp(stro, row[i].name) == 0)
        !          1806: -                                      break;
        !          1807: -
        !          1808: -                      if (i < nrrows)
        !          1809: -                      {       if (bang == DCL && (row[i].refcount & DCL))
        !          1810: -                              {       fprintf(stderr, "%d/%d %s %s\n",
        !          1811: -                                              i, nrrows, stro, row[i].name);
        !          1812: -                                      yyerror("label redeclared, %s", stro);
        !          1813: -                              }else
        !          1814: -                                      row[i].refcount |= bang;
        !          1815: -                              break;
        !          1816: -                      } else
        !          1817: -                      {       addrow();
        !          1818: -                              row[i].refcount = bang;
        !          1819: -                              row[i].labeled = 0;
        !          1820: -                              strcpy(row[i].name, stro);
        !          1821: -                      }
        !          1822: -                      break;
        !          1823: -      case NEW:       i = nrrows;
        !          1824: -                      sprintf(stro, "%d/%d:%s", linenumber, i, filename);
        !          1825: -                      addrow();
        !          1826: -                      row[i].refcount = bang;
        !          1827: -                      row[i].labeled = 0;
        !          1828: -                      strcpy(row[i].name, stro);
        !          1829: -                      break;
        !          1830: -      case OLD:       for (i = 0; i < nrrows; i++)
        !          1831: -                              if (strcmp(stri, row[i].name) == 0)
        !          1832: -                                      break;
        !          1833: -                      if (i == nrrows)
        !          1834: -                              whoops("cannot happen - rows");
        !          1835: -                      break;
        !          1836: -      }
        !          1837: -      return i;
        !          1838: -}
        !          1839: -
        !          1840: -labelrow(n)
        !          1841: -{
        !          1842: -      if (n < 0 || n >= nrrows)
        !          1843: -              whoops("cannot happen - labelrow");
        !          1844: -      row[n].labeled = 1;
        !          1845: -
        !          1846: -}
        !          1847: -
        !          1848: -deadrows(p, r)
        !          1849: -{ register int i, j, k;
        !          1850: -  struct ENTRY *it;
        !          1851: -  struct PILAR  *at;
        !          1852: -  char fld[128];
        !          1853: -  extern int nrprocs;
        !          1854: -
        !          1855: -      for (i = 0; i < nrrows; i++)
        !          1856: -              row[i].reached = 0;
        !          1857: -
        !          1858: -      for (i = 0; i < nrrows; i++)
        !          1859: -      {       if (row[i].mapping != NOSTATE)
        !          1860: -                      continue;
        !          1861: -              it = find(i, 0);
        !          1862: -              for (j = 0; j < nrcols; j++, it = it->nextcol)
        !          1863: -              {       at = it->pilar;
        !          1864: -                      do
        !          1865: -                      {       if (at->transf != NOSTATE)
        !          1866: -                              {       k = target(at->transf);
        !          1867: -                                      if (k != i)
        !          1868: -                                              row[k].reached = 1;
        !          1869: -                              }
        !          1870: -                              at = at->nxtp;
        !          1871: -                      } while (at != NULL);
        !          1872: -      }       }
        !          1873: -
        !          1874: -      fld[0] = '\0';
        !          1875: -      for (i = k = 0; i < nrrows; i++)
        !          1876: -      {       if (row[i].mapping != NOSTATE)
        !          1877: -                      continue;
        !          1878: -              if (row[i].reached == 0 && row[i].maptwo != 0)
        !          1879: -              {       j = strlen(fld); k++;
        !          1880: -                      sprintf(&fld[j], "%d, ", row[i].maptwo);
        !          1881: -      }       }
        !          1882: -
        !          1883: -      if (p == NONE)
        !          1884: -              refsize(r, redrows, k);
        !          1885: -      else
        !          1886: -              procsize(p, redrows, k);
        !          1887: -}
        !          1888: -
        !          1889: -deadends(tb)
        !          1890: -      FILE *tb;
        !          1891: -{ register int i, j, x;
        !          1892: -  struct ENTRY *it;
        !          1893: -  struct PILAR  *at;
        !          1894: -  char field[256];
        !          1895: -  int nrdeads = 0;
        !          1896: -
        !          1897: -      if (nrrows == 0)
        !          1898: -              return;
        !          1899: -
        !          1900: -      field[0] = '\0';
        !          1901: -      for (i = 0; i < nrrows; i++)
        !          1902: -      {       if (row[i].mapping != NOSTATE)
        !          1903: -                      continue;
        !          1904: -              it = find(i, 0);
        !          1905: -              for (j = 0; j < nrcols; j++, it = it->nextcol)
        !          1906: -              {       for (at = it->pilar; at != NULL; at = at->nxtp)
        !          1907: -                              if (at->transf != NOSTATE)
        !          1908: -                                      break;
        !          1909: -                      if (at != NULL)
        !          1910: -                              break;
        !          1911: -              }
        !          1912: -              if (j == nrcols)
        !          1913: -              {       x = strlen(field);
        !          1914: -                      sprintf(&field[x], "%d,", row[i].maptwo);
        !          1915: -                      nrdeads++;
        !          1916: -      }       }
        !          1917: -      if ((i = lastloop) >= 0)
        !          1918: -      {       if (i >= nrrows || row[i].mapping != NOSTATE)
        !          1919: -                      whoops("cannot happen - deadends");
        !          1920: -              x = strlen(field);
        !          1921: -              sprintf(&field[x], "%d,", row[i].maptwo);
        !          1922: -              nrdeads++;
        !          1923: -      }
        !          1924: -      fprintf(tb, "ENDSTATES %d: %s\n", nrdeads, field);
        !          1925: -}
        !          1926: -
        !          1927: -transitrows()
        !          1928: -{ register int i, j;
        !          1929: -  struct ENTRY *here, *there;
        !          1930: -                                      /* maintain row 0 as initial state */
        !          1931: -      here = base->nextrow;
        !          1932: -      for (i = 1; i < nrrows; i++, here = here->nextrow)
        !          1933: -      {       if (here->nrpils != 1 || here->pilar->code != NONE)
        !          1934: -                      continue;
        !          1935: -
        !          1936: -              there = here->nextcol;
        !          1937: -              for (j = 1; j < nrcols; j++, there = there->nextcol)
        !          1938: -                      if (there->nrpils != 0)
        !          1939: -                              break;
        !          1940: -              if (j == nrcols)
        !          1941: -              {       row[i].mapping = here->pilar->transf;
        !          1942: -                      row[here->pilar->transf].labeled |= row[i].labeled;
        !          1943: -      }       }
        !          1944: -}
        !          1945: -
        !          1946: -entercolname(val, what)
        !          1947: -{ register int i;
        !          1948: -
        !          1949: -      for (i = 0; i < nrcols; i++)
        !          1950: -              if (column[i].ccode == val && column[i].coltype == what)
        !          1951: -                      break;
        !          1952: -      if (i == nrcols)
        !          1953: -      {       addcol();
        !          1954: -              column[i].ccode = val;
        !          1955: -              column[i].coltype = what;
        !          1956: -      }
        !          1957: -      return i;
        !          1958: -}
        !          1959: -
        !          1960: -addrow()
        !          1961: -{ register i = nrcols;
        !          1962: -  struct ENTRY *lastcol, *thiscol;
        !          1963: -  char uni[32];
        !          1964: -
        !          1965: -      if (nrcols == 0)
        !          1966: -      {       rowtail = coltail = base = newentry();
        !          1967: -              sprintf(uni, "%4d", curstate);
        !          1968: -              column[0].ccode = -1;
        !          1969: -              column[0].coltype = SPN;
        !          1970: -              strcpy(row[0].name, uni);
        !          1971: -              nrrows = nrcols = 1;
        !          1972: -      } else
        !          1973: -      {       if (nrrows == MANY)
        !          1974: -                      whoops("too many rows");
        !          1975: -              lastcol = rowtail;
        !          1976: -              rowtail = thiscol = lastcol->nextrow = newentry();
        !          1977: -              for (--i; i > 0; i--)
        !          1978: -              {       thiscol = thiscol->nextcol = newentry();
        !          1979: -                      lastcol = lastcol->nextcol;
        !          1980: -                      lastcol->nextrow = thiscol;
        !          1981: -              }
        !          1982: -              nrrows++;
        !          1983: -      }
        !          1984: -}
        !          1985: -
        !          1986: -addcol()
        !          1987: -{ register int i = nrrows;
        !          1988: -  struct ENTRY *lstrow, *thisrow;
        !          1989: -
        !          1990: -      if (nrcols == 0)
        !          1991: -              whoops("cannot happen - columns");
        !          1992: -      else
        !          1993: -      {       lstrow = coltail;
        !          1994: -              coltail = thisrow = lstrow->nextcol = newentry();
        !          1995: -              if (nrcols++ == MANY)
        !          1996: -                      whoops("too many columns");
        !          1997: -              for (--i; i > 0; i--)
        !          1998: -              {       thisrow = thisrow->nextrow = newentry();
        !          1999: -                      lstrow = lstrow->nextrow;
        !          2000: -                      lstrow->nextcol = thisrow;
        !          2001: -      }       }
        !          2002: -}
        !          2003: -
        !          2004: -setrans(r, c, tr, to)
        !          2005: -{ struct ENTRY *ft;
        !          2006: -  struct PILAR  *pt;
        !          2007: -  int i;
        !          2008: -      ft = find(r, c);
        !          2009: -      pt = ft->pilar;
        !          2010: -      for (i = ft->nrpils++; i > 0; i--)
        !          2011: -              pt = pt->nxtp;
        !          2012: -
        !          2013: -      pt->code = to;
        !          2014: -      pt->transf = tr;
        !          2015: -
        !          2016: -      pt->nxtp = newunit();
        !          2017: -}
        !          2018: -
        !          2019: -badstates(tb)
        !          2020: -      FILE *tb;
        !          2021: -{ struct ENTRY *this, *that;
        !          2022: -  struct PILAR *at;
        !          2023: -  int i, k, x, nrbads = 0, nrlabs = 0;
        !          2024: -  char field[512], labfield[512];
        !          2025: -
        !          2026: -      if (nrrows == 0)
        !          2027: -              return;
        !          2028: -
        !          2029: -      labfield[0] = field[0] = '\0';
        !          2030: -      for (i = 0, this = base; this != NULL; this = this->nextrow, i++)
        !          2031: -      {       if (row[i].mapping != NOSTATE)
        !          2032: -                      continue;
        !          2033: -
        !          2034: -              if (row[i].labeled)
        !          2035: -              {       sprintf(&labfield[strlen(labfield)], "%d,", row[i].maptwo);
        !          2036: -                      nrlabs++;
        !          2037: -              }
        !          2038: -              that = find(i, 0);
        !          2039: -              for (k = 0; k < nrcols; k++, that = that->nextcol)
        !          2040: -              {       if (!SPNT(column[k].coltype))
        !          2041: -                              continue;
        !          2042: -
        !          2043: -                      for (at = that->pilar, x = 0; at != NULL; at = at->nxtp)
        !          2044: -                      {       if (at->transf == NOSTATE)
        !          2045: -                                      continue;
        !          2046: -                              x++; break;
        !          2047: -                      }
        !          2048: -                      if (x > 0)
        !          2049: -                      {       sprintf(&field[strlen(field)],"%d,",row[i].maptwo);
        !          2050: -                              nrbads++;
        !          2051: -                              break;
        !          2052: -              }       }
        !          2053: -      }
        !          2054: -      fprintf(tb, "BADSTATES %d: %s\n", nrbads, field);
        !          2055: -      fprintf(tb, "LABSTATES %d: %s\n", nrlabs, labfield);
        !          2056: -}
        !          2057: -
        !          2058: -dumpforw(tb)
        !          2059: -      FILE *tb;
        !          2060: -{ struct ENTRY *this, *that;
        !          2061: -  struct PILAR *at;
        !          2062: -  char field[256];
        !          2063: -  int i, j, k, x, y; extern int linecode;
        !          2064: -
        !          2065: -      if (pid == NONE)
        !          2066: -              fprintf(tb, "%s %d:", "REF", rid);
        !          2067: -      else
        !          2068: -              fprintf(tb, "%s %d:", "PROC", pid+extras);
        !          2069: -
        !          2070: -      fprintf(tb, "%d/%d:", redrows, nrcols);
        !          2071: -      for (i = 0; i < nrcols; i++)
        !          2072: -              fprintf(tb, "%d(%d),", column[i].ccode, column[i].coltype);
        !          2073: -      putc('\n', tb);
        !          2074: -
        !          2075: -      for (i = 0, this = base; this != NULL; this = this->nextrow, i++)
        !          2076: -      {       if (row[i].mapping != NOSTATE)
        !          2077: -                      continue;
        !          2078: -
        !          2079: -              that = find(i, 0);
        !          2080: -              for (k = 0; k < nrcols; k++, that = that->nextcol)
        !          2081: -              {       y = 0; field[0] = '\0';
        !          2082: -                      for (at = that->pilar; at != NULL; at = at->nxtp)
        !          2083: -                      {       if (at->transf == NOSTATE)
        !          2084: -                                      continue;
        !          2085: -
        !          2086: -                              j = row[ target(at->transf) ].maptwo;
        !          2087: -
        !          2088: -                              if ((x = strlen(field)) > 200)
        !          2089: -                                      whoops("string overflow");
        !          2090: -
        !          2091: -                              sprintf(&field[x], "[%d,%d]", j, at->code);
        !          2092: -                              y++;
        !          2093: -                      }
        !          2094: -
        !          2095: -                      if (y > 0)
        !          2096: -                      {       fprintf(tb, "%d/%d ", row[i].maptwo, k);
        !          2097: -                              fprintf(tb, "(%d) %s\n", y, field);
        !          2098: -      }       }       }
        !          2099: -      fprintf(tb, "0/0 (0)\n");
        !          2100: -
        !          2101: -      if (linecode)
        !          2102: -      {       fprintf(tb, "rownames:\n");
        !          2103: -              for (i = 0; i < redrows; i++)
        !          2104: -                      fprintf(tb, "%s\n", row[i].name);
        !          2105: -      }
        !          2106: -}
        !          2107: -
        !          2108: -wrapup(r, p, tb, np, vb)
        !          2109: -      FILE *tb;
        !          2110: -{
        !          2111: -      int i;
        !          2112: -      extern struct PROCTABLE proctable[MAXPROC];
        !          2113: -
        !          2114: -      purgerows(np);
        !          2115: -      dumpforw(tb);
        !          2116: -      deadends(tb);
        !          2117: -      badstates(tb);
        !          2118: -      putcalls(tb);
        !          2119: -      numlocvars(tb);
        !          2120: -
        !          2121: -      if (r == NONE)
        !          2122: -      for (i = 1; i < proctable[p].replic; i++)
        !          2123: -      {       extras++;
        !          2124: -              twiddle("_PROCID");
        !          2125: -              dumpforw(tb);
        !          2126: -              deadends(tb);
        !          2127: -              badstates(tb);
        !          2128: -              putcalls(tb);
        !          2129: -              numlocvars(tb);
        !          2130: -      }
        !          2131: -
        !          2132: -      if (vb)
        !          2133: -      {       deadrows(p, r);
        !          2134: -              deadlabels();
        !          2135: -      }
        !          2136: -
        !          2137: -      release();
        !          2138: -      scrapcalltable();
        !          2139: -}
        !          2140: //GO.SYSIN DD pret2.c
        !          2141: echo pret3.c 1>&2
        !          2142: sed 's/.//' >pret3.c <<'//GO.SYSIN DD pret3.c'
        !          2143: -#include <stdio.h>
        !          2144: -#include "pret.h"
        !          2145: -
        !          2146: - struct FORMALS {
        !          2147: -      char name[MAXNAME];
        !          2148: -      int typefs;             /* qset or pvar (default)   */
        !          2149: -      int tag;                /* id                       */
        !          2150: -      char used;              /* reference count          */
        !          2151: -      char reset;             /* default type overwritten */
        !          2152: -      struct FORMALS *nxtpar;
        !          2153: - };
        !          2154: -
        !          2155: - struct {
        !          2156: -      char name[MAXNAME];
        !          2157: -      int status;
        !          2158: -      int nrparams;
        !          2159: -      int nrstates;
        !          2160: -      int unreach;
        !          2161: -      struct FORMALS *params; /* formal parameters */
        !          2162: - } reftable[MAXPROC];
        !          2163: -
        !          2164: - int nrrefs = 0;
        !          2165: -
        !          2166: - extern int anyerror, pid, rid, assertion, inertion;
        !          2167: - extern char qsetname[MAXNAME];
        !          2168: -
        !          2169: -refsize(n, m, k)
        !          2170: -{     reftable[n].nrstates = m;
        !          2171: -      reftable[n].unreach = k;
        !          2172: -}
        !          2173: -
        !          2174: -reorder()
        !          2175: -{ int i, j, N, M;
        !          2176: -  struct FORMALS * hook;
        !          2177: -
        !          2178: -      if (rid == NONE)
        !          2179: -              return;
        !          2180: -      /*
        !          2181: -       * make sure that formal msg parameters
        !          2182: -       * are numbered in the order in which they
        !          2183: -       * will be pushed onto the call stack in trace.c
        !          2184: -       */
        !          2185: -
        !          2186: -      j = reftable[rid].nrparams;
        !          2187: -      hook = reftable[rid].params;
        !          2188: -
        !          2189: -      for (i = N = M = 0; i < j; i++)
        !          2190: -      {       if (hook->typefs == ISQ || hook->typefs == ISQN)
        !          2191: -                      N = renumqset(hook->tag, N);
        !          2192: -              else
        !          2193: -                      hook->tag = M++;
        !          2194: -
        !          2195: -              hook = hook->nxtpar;
        !          2196: -      }
        !          2197: -}
        !          2198: -
        !          2199: -newreftask(str, mask)
        !          2200: -      char *str;
        !          2201: -{ register int i;
        !          2202: -
        !          2203: -      for (i = 0; i < nrrefs; i++)
        !          2204: -              if (strcmp(str, reftable[i].name) == 0)
        !          2205: -                      break;
        !          2206: -      if (i == nrrefs)
        !          2207: -      {       if (nrrefs >= MAXPROC)
        !          2208: -                      whoops("too many procedures");
        !          2209: -              if (mask == RFR)
        !          2210: -                      yyerror("undeclared procedure, %s", str);
        !          2211: -
        !          2212: -              reftable[i].status = 0;
        !          2213: -              reftable[i].nrparams = 0;
        !          2214: -              reftable[i].nrstates = 0;
        !          2215: -              reftable[i].unreach = 0;
        !          2216: -              strcpy(reftable[nrrefs++].name, str);
        !          2217: -      } else
        !          2218: -      {       if (mask == DCL && (reftable[i].status & DCL))
        !          2219: -                      yyerror("procedure redeclared, %s", str);
        !          2220: -              if (mask == RFR && rid == i)
        !          2221: -                      yyerror("recursive procedure, %s", str);
        !          2222: -      }
        !          2223: -      reftable[i].status |= mask;
        !          2224: -
        !          2225: -      return i;
        !          2226: -}
        !          2227: -
        !          2228: -struct FORMALS *
        !          2229: -newparunit(str, nn, tp, ins)
        !          2230: -      char *str;
        !          2231: -{ struct FORMALS * try = (struct FORMALS *)
        !          2232: -              Emalloc ( sizeof(struct FORMALS) );
        !          2233: -
        !          2234: -      try->used  = 0;
        !          2235: -      try->reset = 0;
        !          2236: -
        !          2237: -      strcpy(try->name, str);
        !          2238: -
        !          2239: -      try->typefs = tp;
        !          2240: -      try->nxtpar = NULL;
        !          2241: -
        !          2242: -      try->tag = nn;
        !          2243: -      if (!ins)
        !          2244: -              yyerror("unspecified parameter, %s", str);
        !          2245: -
        !          2246: -      return try;
        !          2247: -}
        !          2248: -
        !          2249: -addFpar(to, stri, n, vt, ins)
        !          2250: -      char *stri;
        !          2251: -{ struct FORMALS *hook;
        !          2252: -  int N = reftable[to].nrparams;
        !          2253: -  int i = N;
        !          2254: -
        !          2255: -      if (N == 0)
        !          2256: -      {       reftable[to].params = newparunit(stri, n, vt, ins);
        !          2257: -              reftable[to].nrparams++;
        !          2258: -      } else
        !          2259: -      {       hook = reftable[to].params;
        !          2260: -              for (i = 0; i < N; i++, hook = hook->nxtpar)
        !          2261: -              {       if (strcmp(hook->name, stri) == 0)
        !          2262: -                      {       if (ins || hook->reset == 1)
        !          2263: -                                      yyerror("name clash, %s", stri);
        !          2264: -
        !          2265: -                              hook->tag = n;
        !          2266: -                              hook->typefs = vt;
        !          2267: -                              hook->reset = 1;
        !          2268: -                              break;
        !          2269: -                      }
        !          2270: -                      if (hook->nxtpar == NULL)
        !          2271: -                      {       hook->nxtpar = newparunit(stri, n, vt, ins);
        !          2272: -                              reftable[to].nrparams++;
        !          2273: -                              i++;
        !          2274: -                              break;
        !          2275: -      }       }       }
        !          2276: -
        !          2277: -      return i;
        !          2278: -}
        !          2279: -
        !          2280: -Fparname(str, which, vt, hit, how, qind)
        !          2281: -      char *str;
        !          2282: -{ int i, j, k;
        !          2283: -  struct FORMALS * hook = reftable[which].params;
        !          2284: -
        !          2285: -      for (i = 0, j = reftable[which].nrparams; i < j; i++)
        !          2286: -      {       if (strcmp(str, hook->name) == 0 &&  hook->typefs == vt)
        !          2287: -                      break;
        !          2288: -              if (hook->typefs == ISQ || hook->typefs == ISQN)
        !          2289: -              {       switch (vt) {
        !          2290: -                      case ISM:
        !          2291: -                              if (hook->tag == hit
        !          2292: -                              && (k = inqset(hook->tag, str, how, qind)) != -1)
        !          2293: -                                      return k;
        !          2294: -                              break;
        !          2295: -                      case ISQ:
        !          2296: -                              if (matchowner(hook->tag, str, how, qind))
        !          2297: -                                      return hook->tag;       /* id of qset */
        !          2298: -                              break;
        !          2299: -              }       }
        !          2300: -              hook = hook->nxtpar;
        !          2301: -      }
        !          2302: -      if (i == j || (vt == ISM && hook->tag != hit))
        !          2303: -              return -1;
        !          2304: -              
        !          2305: -      hook->used |= how;
        !          2306: -
        !          2307: -      if (vt == ISV)
        !          2308: -              return hook->tag;
        !          2309: -
        !          2310: -      return i;
        !          2311: -}
        !          2312: -
        !          2313: -checkrefs()
        !          2314: -{ int i;
        !          2315: -      if (nrrefs == 0)
        !          2316: -              return;
        !          2317: -      for (i = 0; i < nrrefs; i++)
        !          2318: -              if (reftable[i].status == DCL)
        !          2319: -              {       if (strcmp(reftable[i].name, " assert") != 0
        !          2320: -                      &&  strcmp(reftable[i].name, " error") != 0)
        !          2321: -                              printf("%s: unused procedure\n", reftable[i].name);
        !          2322: -              } else if (reftable[i].status == RFR)
        !          2323: -                      printf("%s: undeclared procedure\n", reftable[i].name);
        !          2324: -}
        !          2325: -
        !          2326: -numrefs(fd)
        !          2327: -      FILE *fd;
        !          2328: -{     extern int linecode;
        !          2329: -      fprintf(fd, "%d linecode\n", linecode);
        !          2330: -      fprintf(fd, "%d procedures ", nrrefs);
        !          2331: -      fprintf(fd, "(assert %d/%d)\n", assertion, inertion);
        !          2332: -}
        !          2333: -
        !          2334: -parrefs(n, m)
        !          2335: -{ int i;
        !          2336: -      if ((i = reftable[m].nrparams - n) == 0)
        !          2337: -              return;
        !          2338: -      if (i > 0)
        !          2339: -              yyerror("missing parameters, %s", reftable[m].name);
        !          2340: -      else
        !          2341: -              yyerror("too many parameters, %s", reftable[m].name);
        !          2342: -}
        !          2343: -
        !          2344: -isdigit(c) {  return (c >= '0' && c <= '9'); }
        !          2345: -
        !          2346: -addAspecial(val, which, pn)
        !          2347: -{ struct FORMALS * hook = reftable[which].params;
        !          2348: -  int i;
        !          2349: -
        !          2350: -      if (pn >= reftable[which].nrparams || pn < 0)
        !          2351: -              return;
        !          2352: -
        !          2353: -      for (i = 0; i < pn; i++)
        !          2354: -              if ((hook = hook->nxtpar) == NULL)
        !          2355: -                      whoops("cannot happen - addAspecial");
        !          2356: -
        !          2357: -      switch (hook->typefs)
        !          2358: -      {       case ISQN:
        !          2359: -              case ISQ: yyerror("mismatched parameter, %s", "queue or qset");
        !          2360: -                        break;
        !          2361: -              case ISV: callentry(ISV, val);
        !          2362: -                        break;
        !          2363: -              default : whoops("cannot happen - addAspecial");
        !          2364: -      }
        !          2365: -}
        !          2366: -
        !          2367: -addApars(what, which, pn, index)
        !          2368: -      char *what;
        !          2369: -{ struct FORMALS * hook = reftable[which].params;
        !          2370: -  int val, hit, x;
        !          2371: -
        !          2372: -      if (pn >= reftable[which].nrparams || pn < 0)
        !          2373: -              return;
        !          2374: -
        !          2375: -      for (x = 0; x < pn; x++)
        !          2376: -              if ((hook = hook->nxtpar) == NULL)
        !          2377: -                      whoops("cannot happen - formals");
        !          2378: -
        !          2379: -      switch (hook->typefs)
        !          2380: -      {       case ISQN:
        !          2381: -                        val = newqset(what, what, 0, index);
        !          2382: -                        x = matchset(val, hook->tag);
        !          2383: -                        hit = qsetowner(val, x);      /* find queue-id  */
        !          2384: -                        callentry(ISQ, hit);          /* enter queue-id */
        !          2385: -                        callist(val, hit);            /* enter messages */
        !          2386: -                        break;
        !          2387: -              case ISQ: val = newqset(what, "", RFR, index);
        !          2388: -                        x = matchset(val, hook->tag);
        !          2389: -                        hit = qsetowner(val, x);      /* find queue-id  */
        !          2390: -                        callentry(ISQ, hit);          /* enter queue-id */
        !          2391: -                        callist(val, hit);            /* enter messages */
        !          2392: -                        break;
        !          2393: -              case ISV: val = addvarname(what, RFR, NONE, index, 0);
        !          2394: -                        callentry(ISV, val);
        !          2395: -                        break;
        !          2396: -              default : whoops("cannot happen - addApars");
        !          2397: -      }
        !          2398: -}
        !          2399: -
        !          2400: -listrefs()
        !          2401: -{     int i, k;
        !          2402: -
        !          2403: -      for (i = 0; i < nrrefs; i++)
        !          2404: -      {       printf("\t%2d\t%s, ", i+1, reftable[i].name);
        !          2405: -              for (k = strlen(reftable[i].name)+1; k < 10; k++)
        !          2406: -                      putchar(' ');
        !          2407: -              k = reftable[i].nrstates;
        !          2408: -              printf("%d state%s", k, (k!=1)?"s":"");
        !          2409: -              if ((k = reftable[i].unreach) > 0)
        !          2410: -                      printf(" (%d unreachable state%s)", k, (k>1)?"s":"");
        !          2411: -              putchar('\n');
        !          2412: -      }
        !          2413: -}
        !          2414: //GO.SYSIN DD pret3.c
        !          2415: echo pret4.c 1>&2
        !          2416: sed 's/.//' >pret4.c <<'//GO.SYSIN DD pret4.c'
        !          2417: -#include <stdio.h>
        !          2418: -#include "pret.h"
        !          2419: -
        !          2420: -struct PROCTABLE proctable[MAXPROC];          /* index to process names */
        !          2421: -
        !          2422: -int nrprocs = 0;
        !          2423: -
        !          2424: -procsize(n, m, k)
        !          2425: -{     proctable[n].nrstates = m;
        !          2426: -      proctable[n].unreach = k;
        !          2427: -}
        !          2428: -
        !          2429: -newprocname(str, repl)
        !          2430: -      char *str;
        !          2431: -{ register int i;
        !          2432: -
        !          2433: -      for (i = 0; i < nrprocs; i++)
        !          2434: -              if (strcmp(str, proctable[i].name) == 0)
        !          2435: -                      break;
        !          2436: -
        !          2437: -      if (i == nrprocs)
        !          2438: -      {       if (nrprocs >= MAXPROC)
        !          2439: -                      whoops("too many processes");
        !          2440: -              proctable[i].nrstates = 0;
        !          2441: -              proctable[i].unreach = 0;
        !          2442: -              proctable[i].replic = repl;
        !          2443: -              strcpy(proctable[nrprocs++].name, str);
        !          2444: -      } else
        !          2445: -              yyerror("process redeclared, %s", str);
        !          2446: -
        !          2447: -      return i;
        !          2448: -}
        !          2449: -
        !          2450: -numprocs(fd)
        !          2451: -      FILE *fd;
        !          2452: -{
        !          2453: -      extern int extras;
        !          2454: -      fprintf(fd, "%d processes\n", nrprocs+extras);
        !          2455: -}
        !          2456: -
        !          2457: -chatter()
        !          2458: -{     int i;
        !          2459: -      extern int verbose, nrqs, nrmesgs, nrrefs, assertion, inertion, extras;
        !          2460: -
        !          2461: -      if (verbose)
        !          2462: -      {       i = ((assertion != -1) + (inertion != -1));
        !          2463: -              printf("\nOverview:\n========\n");
        !          2464: -              printf("%d queue%s:\n", nrqs, (nrqs==1)?"":"s");
        !          2465: -              listqs();
        !          2466: -              printf("%d process%s:\n",
        !          2467: -                              nrprocs+extras, (nrprocs+extras==1)?"":"es");
        !          2468: -              listprs();
        !          2469: -              printf("%d procedure%s:\n", nrrefs, (nrrefs==1)?"":"s");
        !          2470: -              listrefs();
        !          2471: -              printf("%d assertion%s\n", i, (i==1)?"":"s");
        !          2472: -      }
        !          2473: -}
        !          2474: -
        !          2475: -listprs()
        !          2476: -{     int i, k;
        !          2477: -
        !          2478: -      for (i = 0; i < nrprocs; i++)
        !          2479: -      {       printf("\t%2d", i+1);
        !          2480: -              if (proctable[i].replic != NONE)
        !          2481: -                      printf("x%d", proctable[i].replic);
        !          2482: -              printf("\t%s, ", proctable[i].name);
        !          2483: -              for (k = strlen(proctable[i].name)+1; k < 10; k++)
        !          2484: -                      putchar(' ');
        !          2485: -              k = proctable[i].nrstates;
        !          2486: -              printf("%d state%s", k, (k!=1)?"s":"");
        !          2487: -              if ((k = proctable[i].unreach) > 0)
        !          2488: -                      printf(" (%d unreachable state%s)", k, (k>1)?"s":"");
        !          2489: -              putchar('\n');
        !          2490: -      }
        !          2491: -}
        !          2492: //GO.SYSIN DD pret4.c
        !          2493: echo pret6.c 1>&2
        !          2494: sed 's/.//' >pret6.c <<'//GO.SYSIN DD pret6.c'
        !          2495: -#include <stdio.h>
        !          2496: -#include "pret.h"
        !          2497: -
        !          2498: -struct {
        !          2499: -      char name[MAXNAME];
        !          2500: -      char mbox;
        !          2501: -      char status;
        !          2502: -      int  qind;              /* index!=NONE if q addressed is array */
        !          2503: -      int  equa;              /* basename match */
        !          2504: -      int  code;
        !          2505: -} mesgtable[MANY];
        !          2506: -
        !          2507: -struct QTABLE qtable[NQUEUES];
        !          2508: -
        !          2509: -int msize[NQUEUES];           /* mailbox sizes per queue */
        !          2510: -
        !          2511: -int msgval = BASEVAL;
        !          2512: -int nrmesgs = 0;
        !          2513: -int nrqs = 0;
        !          2514: -
        !          2515: -int initable[MANY];
        !          2516: -int nrinits = 0;              /* number initial messages */
        !          2517: -
        !          2518: -extern anyerror, pid, rid;
        !          2519: -
        !          2520: -newqname(str, mask, lim, qind)
        !          2521: -      char *str;
        !          2522: -{
        !          2523: -      register int i;
        !          2524: -
        !          2525: -      if (rid != NONE)
        !          2526: -      {       if ((i = Fparname(str, rid, ISQ, NONE, mask, qind)) != -1)
        !          2527: -                      return (MANY + i);      /* id of qset + offset */
        !          2528: -      }
        !          2529: -      for (i = 0; i < nrqs; i++)
        !          2530: -              if (strcmp(str, qtable[i].name) == 0)
        !          2531: -                      break;
        !          2532: -      if (i == nrqs)
        !          2533: -      {       if (nrqs >= NQUEUES)
        !          2534: -                      whoops("too many queues");
        !          2535: -
        !          2536: -              qtable[i].owner = (mask == DCL || mask == RFR) ? pid : NONE;
        !          2537: -              qtable[i].limit  = (lim == NONE) ? 2 : lim;
        !          2538: -              qtable[i].status = mask;
        !          2539: -              qtable[i].magic  = 0;
        !          2540: -              qtable[i].multiple  = qind;
        !          2541: -              strcpy(qtable[nrqs++].name, str);
        !          2542: -      } else
        !          2543: -      {       if (mask == DCL)
        !          2544: -              {       if (qtable[i].status & DCL)
        !          2545: -                              yyerror("queue redeclared, %s", str);
        !          2546: -
        !          2547: -                      if (qtable[i].owner == NONE)
        !          2548: -                              qtable[i].owner = pid;
        !          2549: -                      else if (qtable[i].owner != pid && pid != NONE)
        !          2550: -                              warning("queue read by 2 processes", str);
        !          2551: -                      qtable[i].limit = lim;
        !          2552: -                      qtable[i].multiple = qind;
        !          2553: -              } else if (mask & RFR)
        !          2554: -              {       if (qtable[i].owner == NONE)
        !          2555: -                              qtable[i].owner = pid;
        !          2556: -
        !          2557: -                      else if (qtable[i].owner != pid)
        !          2558: -                              warning("queue read by 2 processes", str);
        !          2559: -              }
        !          2560: -              if ((mask & RFR) || (mask & ADR))
        !          2561: -              {       if (qind != qtable[i].multiple
        !          2562: -                      &&  (qind == NONE || qtable[i].multiple == NONE))
        !          2563: -                              yyerror("queue indexing error, mesg name, %s", str);
        !          2564: -              }
        !          2565: -              qtable[i].status |= mask;
        !          2566: -      }
        !          2567: -      return i;
        !          2568: -}
        !          2569: -
        !          2570: -addmsg(what, hit, mask, tpp, qind)
        !          2571: -      char *what; char mask;
        !          2572: -{ register int i, j;
        !          2573: -  char str[MAXNAME];
        !          2574: -
        !          2575: -      if (rid != NONE)
        !          2576: -      {       if ((i = Fparname(what, rid, ISM, hit - MANY, mask, qind)) != -1)
        !          2577: -                      return (MANY + i);
        !          2578: -              if (hit >= MANY)
        !          2579: -              {       yyerror("undeclared message, %s", what);
        !          2580: -                      return -1;
        !          2581: -      }       }
        !          2582: -
        !          2583: -      strcpy(str, qtable[hit].name);
        !          2584: -      strcat(str, ":"); strcat(str, what);
        !          2585: -
        !          2586: -      for (j = 0; j < nrmesgs; j++)
        !          2587: -      {       if (strcmp(str, mesgtable[j].name) == 0)
        !          2588: -                      break;
        !          2589: -      }
        !          2590: -      for (i = j; i < nrmesgs; i++)
        !          2591: -              if (strcmp(str, mesgtable[i].name) == 0
        !          2592: -              &&  mesgtable[i].qind == qind)
        !          2593: -                      break;
        !          2594: -      if (i == nrmesgs)
        !          2595: -      {       if (nrmesgs >= MANY)
        !          2596: -                      whoops("too many messages");
        !          2597: -              if (qtable[hit].multiple != qind
        !          2598: -              &&  (qind == NONE || qtable[hit].multiple == NONE))
        !          2599: -                      yyerror("Queue indexing error, qname, %s", str);
        !          2600: -
        !          2601: -              mesgtable[i].mbox = hit;
        !          2602: -              mesgtable[i].qind = qind;
        !          2603: -              mesgtable[i].status = mask;
        !          2604: -              strcpy(mesgtable[nrmesgs++].name, str);
        !          2605: -              mesgtable[i].code = msgval++;
        !          2606: -              mesgtable[i].equa = mesgtable[j].code;
        !          2607: -      } else
        !          2608: -              mesgtable[i].status |= mask;
        !          2609: -
        !          2610: -      if (tpp == INITM)
        !          2611: -              initable[nrinits++] = mesgtable[i].code;
        !          2612: -
        !          2613: -      if (strcmp(what, " any") == 0 && mask == SAR)
        !          2614: -              qtable[hit].magic = 1;
        !          2615: -
        !          2616: -      return mesgtable[i].code;
        !          2617: -}
        !          2618: -
        !          2619: -isoqs()
        !          2620: -{ int i;
        !          2621: -      for (i = 0; i < nrqs; i++)
        !          2622: -      {       if (!(qtable[i].status & DCL))
        !          2623: -              printf("warning: queue `%s' undeclared\n", qtable[i].name);
        !          2624: -              if (qtable[i].owner == NONE)
        !          2625: -              printf("warning: queue `%s' unknown owner\n", qtable[i].name);
        !          2626: -              switch (qtable[i].status) {
        !          2627: -              case 0:         /* used to check name existence in qsets */
        !          2628: -              case DCL:       printf("%s: isolated queue\n", qtable[i].name);
        !          2629: -                              break;
        !          2630: -              case DCL+RFR:   printf("%s: queue not addressed\n", qtable[i].name);
        !          2631: -                              break;
        !          2632: -              case DCL+ADR:   printf("%s: queue is never read\n", qtable[i].name);
        !          2633: -              default:        break;
        !          2634: -              }
        !          2635: -      }
        !          2636: -}
        !          2637: -
        !          2638: -silentcheck()
        !          2639: -{ int i, j, k, p;
        !          2640: -      for (i = 0; i < nrqs; i++)
        !          2641: -      {       if (msize[i] == 0)
        !          2642: -                      continue;
        !          2643: -              k = strlen(qtable[i].name) + 1;
        !          2644: -              for (j = 0; j < nrmesgs; j++)
        !          2645: -              if (mesgtable[j].mbox == i && (p = mesgtable[j].status) != SAR)
        !          2646: -              {       switch (p) {
        !          2647: -                      case RCV: if (qtable[i].multiple) break;
        !          2648: -                                printf("queue %s: ", qtable[i].name);
        !          2649: -                                printf("mesg '%s' ", &mesgtable[j].name[k]);
        !          2650: -                                printf("is received but not sent\n");
        !          2651: -                                anyerror++;
        !          2652: -                                break;
        !          2653: -                      case SND: if (qtable[i].magic != 0
        !          2654: -                                ||  qtable[i].multiple
        !          2655: -                                ||  strcmp(&mesgtable[j].name[k], " any") == 0)
        !          2656: -                                      break;
        !          2657: -                                printf("queue %s: ", qtable[i].name);
        !          2658: -                                printf("mesg '%s' ", &mesgtable[j].name[k]);
        !          2659: -                                printf("is sent but not received\n");
        !          2660: -                                anyerror++;
        !          2661: -                                break;
        !          2662: -                      case 0:   printf("queue %s: ", qtable[i].name);
        !          2663: -                                printf("mesg '%s' ", &mesgtable[j].name[k]);
        !          2664: -                                printf("is never used\n");
        !          2665: -                                break;
        !          2666: -                      }
        !          2667: -      }       }       
        !          2668: -}
        !          2669: -
        !          2670: -checkqs()
        !          2671: -{     isoqs();
        !          2672: -      silentcheck();
        !          2673: -}
        !          2674: -
        !          2675: -numsorts(fd)
        !          2676: -      FILE *fd;
        !          2677: -{ int i, j;
        !          2678: -
        !          2679: -      for (i = j = 0; i < nrqs; i++)
        !          2680: -      {       if (qtable[i].multiple == NONE)
        !          2681: -                      j++;
        !          2682: -              else
        !          2683: -                      j += qtable[i].multiple;
        !          2684: -      }
        !          2685: -      fprintf(fd, "%d queues:\n", j);
        !          2686: -      numesgs(fd);
        !          2687: -      for (i = 0; i < nrqs; i++)
        !          2688: -      {       fprintf(fd, "%s\t%d/",
        !          2689: -                              qtable[i].name, qtable[i].owner);
        !          2690: -              fprintf(fd, "%d/%d/%d: ",
        !          2691: -                              qtable[i].limit, msize[i], qtable[i].multiple);
        !          2692: -              for (j = 0; j < nrmesgs; j++)
        !          2693: -                      if (mesgtable[j].mbox == i)
        !          2694: -                              fprintf(fd, "%d[%d,%d],", mesgtable[j].code,
        !          2695: -                                      mesgtable[j].qind,
        !          2696: -                                      mesgtable[j].equa);
        !          2697: -              putc('\n', fd);
        !          2698: -}     }
        !          2699: -
        !          2700: -numinits(fd)
        !          2701: -      FILE *fd;
        !          2702: -{ int i;
        !          2703: -      fprintf(fd, "%d inits:\n", nrinits);
        !          2704: -      for (i = 0; i < nrinits; i++)
        !          2705: -              fprintf(fd, "%d,", initable[i]);
        !          2706: -      if (nrinits > 0)
        !          2707: -              putc('\n', fd);
        !          2708: -}
        !          2709: -
        !          2710: -numesgs(fd)
        !          2711: -      FILE *fd;
        !          2712: -{ int i, j;
        !          2713: -  char c;
        !          2714: -
        !          2715: -      fprintf(fd, "%d messages, base %d:\n", nrmesgs, BASEVAL);
        !          2716: -      for (i = 0; i < nrmesgs; i++)
        !          2717: -      {       for (j = 0; (c = mesgtable[i].name[j]) != '\0'; j++)
        !          2718: -                      if (c == ':')
        !          2719: -                      {       j++;
        !          2720: -                              break;
        !          2721: -                      }
        !          2722: -              if (c == '\0')
        !          2723: -                      j = 0;
        !          2724: -
        !          2725: -              fprintf(fd, "%s ", &mesgtable[i].name[j]);
        !          2726: -      }
        !          2727: -      if (nrmesgs > 0)
        !          2728: -              putc('\n', fd);
        !          2729: -}
        !          2730: -
        !          2731: -prepsorts()
        !          2732: -{ int i, j;
        !          2733: -      for (i = 0; i < nrqs; i++)
        !          2734: -      {       msize[i] = 0;
        !          2735: -              for (j = 0; j < nrmesgs; j++)
        !          2736: -                      if (mesgtable[j].mbox == i)
        !          2737: -                              msize[i]++;
        !          2738: -      }
        !          2739: -}
        !          2740: -
        !          2741: -listqs()
        !          2742: -{     int i, j, k, l, a;
        !          2743: -
        !          2744: -      for (i = 0; i < nrqs; i++)
        !          2745: -      {
        !          2746: -              if (qtable[i].status & DCL == 0)        /* formal q-parameter */
        !          2747: -                      continue;
        !          2748: -
        !          2749: -              printf("\t%2d\t%s", i+1, qtable[i].name);
        !          2750: -              k = strlen(qtable[i].name) + 1;
        !          2751: -              if (qtable[i].multiple != NONE)
        !          2752: -              {       printf("[%d], ", qtable[i].multiple);
        !          2753: -                      a = (qtable[i].multiple>9)?4:3;
        !          2754: -              } else
        !          2755: -              {       printf(", ");
        !          2756: -                      a = 0;
        !          2757: -              }
        !          2758: -              for (j = 10; j > k+a; j--) putchar(' ');
        !          2759: -              printf("sort: ");
        !          2760: -
        !          2761: -              for (j = l = 0; j < nrmesgs; j++)
        !          2762: -              if (mesgtable[j].mbox == i &&
        !          2763: -                      strcmp(&mesgtable[j].name[k], " tau") != 0 &&
        !          2764: -                      strcmp(&mesgtable[j].name[k], " any") != 0)
        !          2765: -              {       if (l++ > 0)
        !          2766: -                              printf(", ");
        !          2767: -                      printf("%s", &mesgtable[j].name[k]);
        !          2768: -                      if ((a = mesgtable[j].qind) != NONE)
        !          2769: -                      {       if (a < -1)
        !          2770: -                                      printf("/*%d", -(a+2));
        !          2771: -                              else
        !          2772: -                                      printf("/%d", a);
        !          2773: -              }       }
        !          2774: -              printf("\n");
        !          2775: -      }
        !          2776: -}
        !          2777: //GO.SYSIN DD pret6.c
        !          2778: echo pret7.c 1>&2
        !          2779: sed 's/.//' >pret7.c <<'//GO.SYSIN DD pret7.c'
        !          2780: -#include <stdio.h>
        !          2781: -#include "pret.h"
        !          2782: -#include "pret.d"
        !          2783: -
        !          2784: -extern FILE *tb;
        !          2785: -extern int anyerror, linenumber;
        !          2786: -extern int nrrows, nrcols, curstate, curdepth;
        !          2787: -extern int nrvars, realnrvars;
        !          2788: -extern struct ENTRY *base;
        !          2789: -extern char filename[256];
        !          2790: -
        !          2791: -char *
        !          2792: -Emalloc(N)
        !          2793: -      unsigned N;
        !          2794: -{ char *try, *malloc();
        !          2795: -      if ((try = malloc(N)) == NULL)
        !          2796: -              whoops("out of memory");
        !          2797: -      return try;
        !          2798: -}
        !          2799: -
        !          2800: -whoops(s)
        !          2801: -      char *s;
        !          2802: -{     yyerror(s, "aborting");
        !          2803: -      fclose(tb);
        !          2804: -      unlink("pret.tmp");
        !          2805: -      exit(1);
        !          2806: -}
        !          2807: -
        !          2808: -yyerror(s1, s2)
        !          2809: -      char *s1, *s2;
        !          2810: -{
        !          2811: -      char buf[512];
        !          2812: -      sprintf(buf, s1, s2);
        !          2813: -
        !          2814: -      printf("\"%s\", line %2d: %s\n", filename, linenumber, buf);
        !          2815: -      fflush(stdout);
        !          2816: -      anyerror++;
        !          2817: -}
        !          2818: -
        !          2819: -warning(s1, s2)
        !          2820: -      char *s1, *s2;
        !          2821: -{
        !          2822: -      printf("\"%s\", line %2d, warning: %s", filename, linenumber, s1);
        !          2823: -      if (strlen(s2) > 0 && strcmp(s1, "syntax error") != 0)
        !          2824: -              printf(" (%s)\n", s2);
        !          2825: -      else
        !          2826: -              printf("\n");
        !          2827: -}
        !          2828: -
        !          2829: -release()
        !          2830: -{ register struct ENTRY *this, *temp1, *temp2;
        !          2831: -  register struct PILAR  *that, *temp3;
        !          2832: -
        !          2833: -      this = base;
        !          2834: -      while (this != NULL)
        !          2835: -      {       temp1 = this->nextrow;
        !          2836: -              do
        !          2837: -              {       temp2 = this->nextcol;
        !          2838: -                      that = this->pilar;
        !          2839: -                      do
        !          2840: -                      {       temp3 = that->nxtp;
        !          2841: -                              free(that);
        !          2842: -                              that = temp3;
        !          2843: -                      } while (that != NULL);
        !          2844: -                      free(this);
        !          2845: -                      this = temp2;
        !          2846: -              } while (this != NULL);
        !          2847: -              this = temp1;
        !          2848: -      }
        !          2849: -      nrrows = nrcols = curstate = curdepth = 0;
        !          2850: -      nrvars = realnrvars = 0;
        !          2851: -}
        !          2852: -
        !          2853: -struct PILAR *
        !          2854: -newunit()
        !          2855: -{ struct PILAR  *try;
        !          2856: -
        !          2857: -      try = (struct PILAR *) Emalloc(sizeof(struct PILAR));
        !          2858: -
        !          2859: -      try->transf = NOSTATE;
        !          2860: -      try->code = NONE;
        !          2861: -      try->nxtp = NULL;
        !          2862: -
        !          2863: -      return try;
        !          2864: -}
        !          2865: -
        !          2866: -struct ENTRY *
        !          2867: -newentry()
        !          2868: -{ struct ENTRY *try;
        !          2869: -
        !          2870: -      try = (struct ENTRY *) Emalloc(sizeof(struct ENTRY));
        !          2871: -
        !          2872: -      try->pilar = newunit();
        !          2873: -      try->nrpils = 0;
        !          2874: -      try->nextrow = try->nextcol = NULL;
        !          2875: -      return try;
        !          2876: -}
        !          2877: //GO.SYSIN DD pret7.c
        !          2878: echo pret8.c 1>&2
        !          2879: sed 's/.//' >pret8.c <<'//GO.SYSIN DD pret8.c'
        !          2880: -#include <stdio.h>
        !          2881: -#include "pret.h"
        !          2882: -
        !          2883: -struct {
        !          2884: -      char name[MAXNAME];
        !          2885: -      int status;
        !          2886: -      int initval;
        !          2887: -      int index;      /* set if used as array */
        !          2888: -      int width;      /* in bits: for supertrace */
        !          2889: -} vartbl[MANY];
        !          2890: -
        !          2891: -struct {
        !          2892: -      int m;          /* index of basename in vartbl */
        !          2893: -      int n;          /* reference to the index      */
        !          2894: -} ivartbl[MANY];
        !          2895: -int realnrvars=0;
        !          2896: -
        !          2897: -struct {
        !          2898: -      int m;          /* index of basename in globvartbl */
        !          2899: -      int n;          /* reference to the index      */
        !          2900: -} igvartbl[MANY];
        !          2901: -int realgvars=0;
        !          2902: -
        !          2903: -struct {
        !          2904: -      char name[MAXNAME];
        !          2905: -      int status;
        !          2906: -      int initval;
        !          2907: -      int index;
        !          2908: -      int width;
        !          2909: -} globvartbl[MANY];
        !          2910: -
        !          2911: -int nrvars = 0;
        !          2912: -int nrglobvars = 0;
        !          2913: -int varwidths = 0;
        !          2914: -
        !          2915: -extern char procname[MAXNAME];
        !          2916: -extern char refname[MAXNAME];
        !          2917: -extern int anyerror, pid, rid;
        !          2918: -
        !          2919: -reallocal(m, n)
        !          2920: -{     int i;
        !          2921: -      for (i = 0; i < realnrvars; i++)
        !          2922: -              if (ivartbl[i].m == m && ivartbl[i].n == n)
        !          2923: -                      return i;
        !          2924: -      if ((i = realnrvars++) >= MANY)
        !          2925: -              whoops("reallocal overflow");
        !          2926: -      ivartbl[i].n = n;
        !          2927: -      ivartbl[i].m = m;
        !          2928: -      return i;
        !          2929: -}
        !          2930: -
        !          2931: -realglobal(m, n)
        !          2932: -{     int i;
        !          2933: -      for (i = 0; i < realgvars; i++)
        !          2934: -              if (igvartbl[i].m == m && igvartbl[i].n == n)
        !          2935: -                      return i;
        !          2936: -      if ((i = realgvars++) >= MANY)
        !          2937: -              whoops("realglobal overflow");
        !          2938: -      igvartbl[i].n = n;
        !          2939: -      igvartbl[i].m = m;
        !          2940: -      return i;
        !          2941: -}
        !          2942: -
        !          2943: -twiddle(suff)
        !          2944: -      char *suff;
        !          2945: -{     int i; extern int extras;
        !          2946: -
        !          2947: -      for (i = 0; i < nrvars; i++)
        !          2948: -              if (strcmp(vartbl[i].name, suff) == 0)
        !          2949: -              {       vartbl[i].initval++;
        !          2950: -                      return;
        !          2951: -              }
        !          2952: -      whoops("cannot happen, twiddle");
        !          2953: -}
        !          2954: -
        !          2955: -isarrayvar(suff)
        !          2956: -      char *suff;
        !          2957: -{     int i;
        !          2958: -
        !          2959: -      for (i = 0; i < nrvars; i++)
        !          2960: -              if (strcmp(vartbl[i].name, suff) == 0
        !          2961: -              && vartbl[i].index != NONE)
        !          2962: -                      return 1;
        !          2963: -      for (i = 0; i < nrglobvars; i++)
        !          2964: -              if (strcmp(globvartbl[i].name, suff) == 0
        !          2965: -              && globvartbl[i].index != NONE)
        !          2966: -                      return 1;
        !          2967: -      return 0;
        !          2968: -}
        !          2969: -
        !          2970: -looklocal(suff, how, index)
        !          2971: -      char *suff;
        !          2972: -{     int i;
        !          2973: -
        !          2974: -      for (i = 0; i < nrvars; i++)
        !          2975: -              if (strcmp(vartbl[i].name, suff) == 0)
        !          2976: -              {       vartbl[i].status |= how;
        !          2977: -                      break;
        !          2978: -              }
        !          2979: -
        !          2980: -      if (i != nrvars && how == DCL)
        !          2981: -              yyerror("local variable redeclared, %s", suff);
        !          2982: -
        !          2983: -      if (i != nrvars && how == RFR && index != vartbl[i].index
        !          2984: -      && (index == NONE || vartbl[i].index == NONE))
        !          2985: -              yyerror("local variable array indexing error, %s", suff);
        !          2986: -      return i;
        !          2987: -}
        !          2988: -
        !          2989: -lookglobal(suff, how, index)
        !          2990: -      char *suff;
        !          2991: -{     int i;
        !          2992: -
        !          2993: -      for (i = 0; i < nrglobvars; i++)
        !          2994: -              if (strcmp(globvartbl[i].name, suff) == 0)
        !          2995: -              {       globvartbl[i].status |= how;
        !          2996: -                      break;
        !          2997: -              }
        !          2998: -
        !          2999: -      if (pid == NONE && rid == NONE && i != nrglobvars && how == DCL)
        !          3000: -              yyerror("global variable redeclared, %s", suff);
        !          3001: -
        !          3002: -      if (i != nrglobvars && how == RFR && index != globvartbl[i].index
        !          3003: -      && (index == NONE || globvartbl[i].index == NONE))
        !          3004: -              yyerror("global variable array indexing error, %s", suff);
        !          3005: -      return i;
        !          3006: -}
        !          3007: -
        !          3008: -putlocal(what, ival, how, index, width)
        !          3009: -      char *what;
        !          3010: -{     int i;
        !          3011: -
        !          3012: -      if ((i = nrvars++) >= MANY)
        !          3013: -              whoops("too many variables");
        !          3014: -
        !          3015: -      strcpy(vartbl[i].name, what);
        !          3016: -      vartbl[i].initval = ival;
        !          3017: -      vartbl[i].status = how;
        !          3018: -      vartbl[i].index = index;
        !          3019: -      vartbl[i].width = width;
        !          3020: -      if (index != NONE && ival != NONE)
        !          3021: -      {       fprintf(stderr,"error: no automatic initialization");
        !          3022: -              fprintf(stderr, " of array `%s'\n",what);
        !          3023: -              anyerror++;
        !          3024: -      }
        !          3025: -      if (width != 0) varwidths=1;
        !          3026: -      return (MANY + i);
        !          3027: -}
        !          3028: -
        !          3029: -putglobal(what, ival, how, index, width)
        !          3030: -      char *what;
        !          3031: -{     int i;
        !          3032: -
        !          3033: -      if ((i = nrglobvars++) >= MANY)
        !          3034: -              whoops("too many variables");
        !          3035: -      strcpy(globvartbl[i].name, what);
        !          3036: -      globvartbl[i].initval = ival;
        !          3037: -      globvartbl[i].status = how;
        !          3038: -      globvartbl[i].index = index;
        !          3039: -      globvartbl[i].width = width;
        !          3040: -      if (index != NONE && ival != NONE)
        !          3041: -      {       fprintf(stderr,"error: no automatic initialization");
        !          3042: -              fprintf(stderr, " of array `%s'\n",what);
        !          3043: -              anyerror++;
        !          3044: -      }
        !          3045: -      if (width != 0) varwidths=1;
        !          3046: -
        !          3047: -      return i;
        !          3048: -}
        !          3049: -/*
        !          3050: - * arrays are merely patched in for now
        !          3051: - */
        !          3052: -addvarname(what, how, ival, index, width)
        !          3053: -      char *what;
        !          3054: -{
        !          3055: -      int i, islocal = (rid != NONE || pid != NONE);
        !          3056: -
        !          3057: -      if (rid != NONE && (i = Fparname(what, rid, ISV, NONE, how, index)) != -1)
        !          3058: -              return (2*MANY + i);
        !          3059: -      /* formal parameter may not be an array reference */
        !          3060: -
        !          3061: -      if (islocal && (i = looklocal(what, how, index)) < nrvars)
        !          3062: -              return (MANY + reallocal(i, index));
        !          3063: -      if ((i = lookglobal(what, how, index)) < nrglobvars)
        !          3064: -              return realglobal(i, index);
        !          3065: -
        !          3066: -      if (how == RFR)
        !          3067: -              yyerror("undeclared variable, %s", what);
        !          3068: -      if (islocal)
        !          3069: -              return putlocal(what, ival, how, index, width);
        !          3070: -
        !          3071: -      return putglobal(what, ival, how, index, width);
        !          3072: -}
        !          3073: -
        !          3074: -checklocvars()
        !          3075: -{     int i;
        !          3076: -
        !          3077: -      for (i = 0; i < nrvars; i++)
        !          3078: -              if (vartbl[i].status == DCL)
        !          3079: -              {       printf("%s: ", (pid != NONE)?procname:refname);
        !          3080: -                      printf("pvar %s is never used\n", vartbl[i].name);
        !          3081: -              }
        !          3082: -}
        !          3083: -
        !          3084: -checkglobvars()
        !          3085: -{     int i;
        !          3086: -
        !          3087: -      for (i = 0; i < nrglobvars; i++)
        !          3088: -              if (globvartbl[i].status == DCL)
        !          3089: -              {       printf("global: ");
        !          3090: -                      printf("pvar %s is never used\n", globvartbl[i].name);
        !          3091: -              }
        !          3092: -}
        !          3093: -
        !          3094: -numglobvars(fd)
        !          3095: -      FILE *fd;
        !          3096: -{     int i;
        !          3097: -
        !          3098: -      fprintf(fd, "%d g-variables: ", nrglobvars);
        !          3099: -      for (i = 0; i < nrglobvars; i++)
        !          3100: -              fprintf(fd, "%d/%d,", globvartbl[i].initval, globvartbl[i].index);
        !          3101: -      putc('\n', fd);
        !          3102: -      if (varwidths)
        !          3103: -      {       fprintf(fd, "%d g-widths: ", nrglobvars);
        !          3104: -              for (i = 0; i < nrglobvars; i++)
        !          3105: -                      fprintf(fd, "%d,", globvartbl[i].width);
        !          3106: -              putc('\n', fd);
        !          3107: -      }
        !          3108: -      fprintf(fd, "%d g-uses: ", realgvars);
        !          3109: -      for (i = 0; i < realgvars; i++)
        !          3110: -              fprintf(fd, "%d/%d,", igvartbl[i].m, igvartbl[i].n);            
        !          3111: -      putc('\n', fd);
        !          3112: -}
        !          3113: -
        !          3114: -numlocvars(fd)
        !          3115: -      FILE *fd;
        !          3116: -{     int i;
        !          3117: -
        !          3118: -      fprintf(fd, "%d l-variables: ", nrvars);
        !          3119: -      for (i = 0; i < nrvars; i++)
        !          3120: -              fprintf(fd, "%d/%d,", vartbl[i].initval, vartbl[i].index);
        !          3121: -      putc('\n', fd);
        !          3122: -      if (varwidths)
        !          3123: -      {       fprintf(fd, "%d l-widths: ", nrvars);
        !          3124: -              for (i = 0; i < nrvars; i++)
        !          3125: -                      fprintf(fd, "%d,", vartbl[i].width);
        !          3126: -              putc('\n', fd);
        !          3127: -      }
        !          3128: -
        !          3129: -      fprintf(fd, "%d l-uses: ", realnrvars);
        !          3130: -      for (i = 0; i < realnrvars; i++)
        !          3131: -              fprintf(fd, "%d/%d,", ivartbl[i].m, ivartbl[i].n);              
        !          3132: -      putc('\n', fd);
        !          3133: -}
        !          3134: //GO.SYSIN DD pret8.c
        !          3135: echo pret9.c 1>&2
        !          3136: sed 's/.//' >pret9.c <<'//GO.SYSIN DD pret9.c'
        !          3137: -#include <stdio.h>
        !          3138: -#include "pret.h"
        !          3139: -
        !          3140: -#define MAXACTUALS    (MANY)
        !          3141: -
        !          3142: - struct ACTUALS {
        !          3143: -      int typefs[MAXACTUALS];         /* queue mesg or pvar */
        !          3144: -      int index [MAXACTUALS];         /* qid,  if mesg      */
        !          3145: -      struct ACTUALS *nxtcall;
        !          3146: -      int nractuals;
        !          3147: -      int whattask;                   /* id of task called  */
        !          3148: - };
        !          3149: -
        !          3150: - struct ACTUALS *calls;               /* procedure call data   */
        !          3151: - int nrcalls;                 /* nr of procedure calls */
        !          3152: -
        !          3153: - extern pid, rid, linenumber;
        !          3154: -
        !          3155: -newcalltable()
        !          3156: -{     nrcalls = 0;
        !          3157: -      calls = NULL;
        !          3158: -}
        !          3159: -
        !          3160: -scrapcalltable()
        !          3161: -{ struct ACTUALS *tmp;
        !          3162: -  struct ACTUALS *hook = calls;
        !          3163: -  int i;
        !          3164: -
        !          3165: -      for (i = 0; i < nrcalls; i++)
        !          3166: -      {       tmp = hook;
        !          3167: -              hook = hook->nxtcall;
        !          3168: -              free(tmp);
        !          3169: -      }
        !          3170: -}
        !          3171: -
        !          3172: -newcall(ofwhat)
        !          3173: -{ int i, j;
        !          3174: -  struct ACTUALS *new, *old;
        !          3175: -
        !          3176: -      new = ( struct ACTUALS *)
        !          3177: -              Emalloc( sizeof(struct ACTUALS) );
        !          3178: -      new->nractuals = 0;
        !          3179: -      new->whattask = ofwhat;
        !          3180: -
        !          3181: -      if ((j = nrcalls++) == 0)
        !          3182: -              calls = new;
        !          3183: -      else
        !          3184: -      {       old = calls;
        !          3185: -              for (i = 1; i < j; i++)
        !          3186: -                      old = old->nxtcall;
        !          3187: -              old->nxtcall = new;
        !          3188: -      }
        !          3189: -      return nrcalls-1;
        !          3190: -}
        !          3191: -
        !          3192: -putcalls(tb)
        !          3193: -      FILE *tb;
        !          3194: -{ struct ACTUALS *hook;
        !          3195: -  int j, k, a, b;
        !          3196: -  int maxm = 0;
        !          3197: -  int maxv = 0;
        !          3198: -
        !          3199: -      fprintf(tb, "FCT_CALLS %d\n",  nrcalls);
        !          3200: -      for (j = 0, hook = calls; j < nrcalls; j++)
        !          3201: -      {
        !          3202: -              for (k = a = b = 0; k < hook->nractuals; k++)
        !          3203: -              {       if (hook->typefs[k] == ISM)
        !          3204: -                              a++;
        !          3205: -                      else if (hook->typefs[k] == ISV)
        !          3206: -                              b++;
        !          3207: -              }
        !          3208: -              if (a > maxm) maxm = a;
        !          3209: -              if (b > maxv) maxv = b;
        !          3210: -
        !          3211: -              fprintf(tb, "%d-%d/%d:", hook->whattask, a, b);
        !          3212: -              for (k = 0; k < hook->nractuals; k++)
        !          3213: -              {       if (hook->typefs[k] != ISQ)
        !          3214: -                      fprintf(tb, " %d/%d", hook->typefs[k], hook->index[k]);
        !          3215: -              }
        !          3216: -              putc('\n', tb);
        !          3217: -              hook = hook->nxtcall;
        !          3218: -      }
        !          3219: -      fprintf(tb, "PARS %d/%d\n",  maxm, maxv);
        !          3220: -}
        !          3221: -
        !          3222: -callentry(x, val)
        !          3223: -{ int i;
        !          3224: -  struct ACTUALS *hook = calls;
        !          3225: -
        !          3226: -      for (i = 1; i < nrcalls; i++)
        !          3227: -              hook = hook->nxtcall;
        !          3228: -
        !          3229: -      if ((i = hook->nractuals++) >= MAXACTUALS)
        !          3230: -              whoops("too many parameters");
        !          3231: -      hook->typefs[i] = x;
        !          3232: -      hook->index[i] = val;
        !          3233: -}
        !          3234: //GO.SYSIN DD pret9.c
        !          3235: echo pretlex.l 1>&2
        !          3236: sed 's/.//' >pretlex.l <<'//GO.SYSIN DD pretlex.l'
        !          3237: -%{
        !          3238: -#include "stdio.h"
        !          3239: -#include "pret.h"
        !          3240: -#include "y.tab.h"
        !          3241: -
        !          3242: -extern linenumber, nest;
        !          3243: -extern char filename[256];
        !          3244: -
        !          3245: -putback(c)
        !          3246: -{     unput(c);
        !          3247: -}
        !          3248: -
        !          3249: -%}
        !          3250: -%%
        !          3251: -\n    { linenumber++; }
        !          3252: -\/\*  { char c1, c2;          /* comment string */
        !          3253: -
        !          3254: -        for(nest++, c2 = ' ';;){
        !          3255: -              c1 = c2;
        !          3256: -              c2 = input();
        !          3257: -              if (c1 == '/' && c2 == '*')
        !          3258: -                      nest++;
        !          3259: -              else if (c1 == '*' && c2 == '/')
        !          3260: -                      nest--;
        !          3261: -              if (nest <= 0)
        !          3262: -                      break;
        !          3263: -              if (c2 == '\n')
        !          3264: -                      linenumber++;
        !          3265: -              else if (c2 == 0)
        !          3266: -                      whoops("unexpected eof (in comment)");
        !          3267: -        }
        !          3268: -      }
        !          3269: -[ \t] { ; }
        !          3270: -^#[ ]+[0-9]+[ ]+\"[^\"]+\"\n  {
        !          3271: -              sscanf(&yytext[1], "%d \"%s\"\n", &linenumber, filename);
        !          3272: -              filename[strlen(filename)-1] = 0;       /* strip the last " */
        !          3273: -      }
        !          3274: -queue { return(QUEUES); }
        !          3275: -qset  { return(QSET); }
        !          3276: -pvar  { return(PVAR); }
        !          3277: -proc  { return(PROCESS); }
        !          3278: -if    { return(IF); }
        !          3279: -fi    { return(FI); }
        !          3280: -do    { return(DO); }
        !          3281: -od    { return(OD); }
        !          3282: -skip  { return(skip); }
        !          3283: -goto  { return(GOTO); }
        !          3284: -break { return(BREAK); }
        !          3285: -any   { return(DEFAULT); }
        !          3286: -default       { return(DEFAULT); }
        !          3287: -assert        { return(ASSERT); }
        !          3288: -error { return(ERROR); }
        !          3289: -timeout       { return(timeout); }
        !          3290: -\{    { return(PBEGIN); }
        !          3291: -\}    { return(END); }
        !          3292: -[0-9]+        { yylval.resu = atoi(yytext); return(VALUE); }
        !          3293: -[a-zA-Z][_a-zA-Z0-9]* {
        !          3294: -              yylval.resu = newstring(yytext);
        !          3295: -              if (isarrayvar(yytext)) return(ARNAME);
        !          3296: -              if (isqset(yytext)) return(QSNAME);
        !          3297: -              return(NAME);
        !          3298: -      }
        !          3299: -_PROCID       { yylval.resu = newstring("_PROCID"); return(NAME); }
        !          3300: -"::"  { return(FLAG); }
        !          3301: -"->"  { return(ARROW); }
        !          3302: -";"   { return(SEMICOLON); }
        !          3303: -":"   { return(COLON); }
        !          3304: -\+\+  { return(INC); }
        !          3305: -\-\-  { return(DEC); }
        !          3306: -\+\=  { return(ADDEQ); }
        !          3307: -\-\=  { return(SUBEQ); }
        !          3308: -\*\=  { return(MULEQ); }
        !          3309: -\/\=  { return(DIVEQ); }
        !          3310: -\%\=  { return(MODEQ); }
        !          3311: -\|\|  { return(OR); }
        !          3312: -\&\&  { return(AND); }
        !          3313: -\>\=  { return(GE); }
        !          3314: -\<\=  { return(LE); }
        !          3315: -\!\=  { return(NE); }
        !          3316: -\>    { return(GT); }
        !          3317: -\<    { return(LT); }
        !          3318: -\!    { return(NOT); }
        !          3319: -==    { return(EQ); }
        !          3320: -.     { return(yytext[0]); }
        !          3321: //GO.SYSIN DD pretlex.l
        !          3322: echo x.tab.h 1>&2
        !          3323: sed 's/.//' >x.tab.h <<'//GO.SYSIN DD x.tab.h'
        !          3324: -
        !          3325: -typedef union {
        !          3326: -      int resu;
        !          3327: -      struct Node *node;
        !          3328: -} YYSTYPE;
        !          3329: -extern YYSTYPE yylval;
        !          3330: -# define NAME 257
        !          3331: -# define VALUE 258
        !          3332: -# define ARNAME 259
        !          3333: -# define QSNAME 260
        !          3334: -# define ASSERT 261
        !          3335: -# define ERROR 262
        !          3336: -# define PROCESS 263
        !          3337: -# define PBEGIN 264
        !          3338: -# define END 265
        !          3339: -# define IF 266
        !          3340: -# define FI 267
        !          3341: -# define DO 268
        !          3342: -# define OD 269
        !          3343: -# define timeout 270
        !          3344: -# define skip 271
        !          3345: -# define BREAK 272
        !          3346: -# define DEFAULT 273
        !          3347: -# define GOTO 274
        !          3348: -# define FLAG 275
        !          3349: -# define ARROW 276
        !          3350: -# define SEMICOLON 277
        !          3351: -# define COLON 278
        !          3352: -# define QUEUES 279
        !          3353: -# define QSET 280
        !          3354: -# define PVAR 281
        !          3355: -# define MESG 282
        !          3356: -# define ADDEQ 283
        !          3357: -# define SUBEQ 284
        !          3358: -# define MULEQ 285
        !          3359: -# define DIVEQ 286
        !          3360: -# define MODEQ 287
        !          3361: -# define OR 288
        !          3362: -# define AND 289
        !          3363: -# define GT 290
        !          3364: -# define GE 291
        !          3365: -# define LT 292
        !          3366: -# define LE 293
        !          3367: -# define EQ 294
        !          3368: -# define NE 295
        !          3369: -# define UNARYMINUS 296
        !          3370: -# define NOT 297
        !          3371: -# define INC 298
        !          3372: -# define DEC 299
        !          3373: //GO.SYSIN DD x.tab.h

unix.superglobalmegacorp.com

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