|
|
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
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.