home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include "def.h"
- #include "4.def.h"
- #include "3.def.h"
-
- outrat(v,tab,tabfirst)
- VERT v;
- int tab; /* number of tabs to indent */
- LOGICAL tabfirst; /* FALSE if doing IF of ELSE IF */
- {
- LOGICAL ndcomma;
- VERT w;
- int type,i;
- type = NTYPE(v);
- if (hascom[type])
- prcom(v);
- if (!LABEL(v) && type == FMTVX)
- {
- OUTSTR("#following unreferenced format statement commented out\n");
- OUTSTR("#");
- }
- if (LABEL(v) && type != ITERVX)
- {
- ASSERT(tabfirst, outrat);
- prlab(LABEL(v),tab);
- }
- else if (tabfirst && type != DUMVX && type != ITERVX)
- TABOVER(tab);
-
- switch(type)
- {
- case DUMVX:
- newlevel(v,0,tab,YESTAB);
- break;
- case GOVX:
- OUTSTR("go to ");
- OUTNUM(LABEL(ARC(v,0)));
- OUTSTR("\n");
- break;
- case STOPVX:
- if (progtype != blockdata)
- OUTSTR("stop\n");
- break;
- case RETVX:
- OUTSTR("return\n");
- break;
- case BRKVX:
- if (!levbrk)
- {
- ASSERT(LEVEL(v) == 1,outrat);
- OUTSTR("break\n");
- }
- else
- {
- OUTSTR("break ");
- OUTNUM(LEVEL(v));
- OUTSTR("\n");
- }
- break;
- case NXTVX:
- if (!levnxt)
- {
- ASSERT(LEVEL(v) == 1,outrat);
- OUTSTR("next\n");
- }
- else
- {
- OUTSTR("next ");
- OUTNUM(LEVEL(v));
- OUTSTR("\n");
- }
- break;
- case ASGOVX:
- case COMPVX:
- OUTSTR("goto ");
- if (type == ASGOVX)
- {
- OUTSTR(EXP(v));
- OUTSTR(",");
- }
- OUTSTR("(");
- for (i = ARCNUM(v)-1; i >=0; --i) /* arcs were stored backward */
- {
- OUTNUM(LABEL(ARC(v,i)));
- if (i > 0) OUTSTR(",");
- }
- OUTSTR(")");
- if (type == COMPVX)
- {
- OUTSTR(",");
- OUTSTR(EXP(v));
- }
- OUTSTR("\n");
- break;
- case ASVX:
- OUTSTR("assign ");
- OUTNUM(LABEL(LABREF(v)));
- OUTSTR(" to ");
- OUTSTR(EXP(v));
- OUTSTR("\n");
- break;
- case IFVX:
- OUTSTR("IF");
- prpred(v,TRUE);
- if (IFTHEN(v))
- newlevel(v,THEN,tab+1,YESTAB);
- else
- {
- newlevel(v,THEN,tab+1,YESTAB);
- TABOVER(tab);
- OUTSTR("ELSE ");
- w = LCHILD(v,ELSE);
- ASSERT(DEFINED(w),outrat);
- if (NTYPE(w) == IFVX && !LABEL(w) && !DEFINED(RSIB(w)) &&
- !HASBRACE(v,ELSE) )
- newlevel(v,ELSE,tab,NOTAB);
- else
- newlevel(v,ELSE,tab+1,YESTAB);
- }
- break;
- case ITERVX:
- newlevel(v,0,tab,YESTAB);
- ASSERT(DEFINED(NXT(v)),outrat);
- if (LABEL(NXT(v)))
- {
- prlab(LABEL(NXT(v)),tab);
- OUTSTR("continue\n");
- }
- break;
- case DOVX:
- OUTSTR("DO ");
- OUTSTR(INC(v));
- newlevel(v,0,tab+1,YESTAB);
- break;
- case LOOPVX:
- case UNTVX:
- OUTSTR("REPEAT");
- newlevel(v,0,tab+1,YESTAB);
- if (type == UNTVX)
- {
- TABOVER(tab+1);
- OUTSTR("UNTIL");
- ASSERT(DEFINED(ARC(v,0)),outrat);
- prpred(LPRED(ARC(v,0)),TRUE);
- OUTSTR("\n");
- }
- break;
- case WHIVX:
- OUTSTR("WHILE");
- ASSERT(DEFINED(ARC(v,0)),outrat);
- ASSERT(DEFINED(LPRED(ARC(v,0))),outrat);
- prpred(LPRED(ARC(v,0)),TRUE);
- newlevel(v,0,tab+1,YESTAB);
- break;
- case STLNVX:
- case FMTVX:
- prstln(v,tab);
- break;
- case SWCHVX:
- OUTSTR("SWITCH");
- if (DEFINED(EXP(v)))
- {
- OUTSTR("(");
- OUTSTR(EXP(v));
- OUTSTR(")");
- }
- newlevel(v,0,tab+1,YESTAB);
- break;
- case ICASVX:
- case ACASVX:
- OUTSTR("CASE ");
- if (type == ACASVX)
- prpred(v,FALSE);
- else
- OUTSTR(EXP(v));
- OUTSTR(":\n");
- newlevel(v,0,tab+1,YESTAB);
- if (type == ACASVX &&DEFINED(LCHILD(v,ELSE)))
- {
- TABOVER(tab);
- OUTSTR("DEFAULT:\n");
- newlevel(v,1,tab+1,YESTAB);
- }
- break;
- case IOVX:
- OUTSTR(PRERW(v));
- ndcomma = FALSE;
- if (DEFINED(FMTREF(v)))
- {
- OUTNUM(LABEL(FMTREF(v)));
- ndcomma = TRUE;
- }
- if (DEFINED(ARC(v,ENDEQ)))
- {
- if (ndcomma)
- OUTSTR(",");
- OUTSTR("end = ");
- OUTNUM(LABEL(ARC(v,ENDEQ)));
- ndcomma = TRUE;
- }
- if (DEFINED(ARC(v,ERREQ)))
- {
- if (ndcomma)
- OUTSTR(",");
- OUTSTR("err = ");
- OUTNUM(LABEL(ARC(v,ERREQ)));
- ndcomma = TRUE;
- }
- OUTSTR(POSTRW(v));
- OUTSTR("\n");
- break;
- }
- }
-
-
- newlevel(v,ch,tab,tabfirst)
- VERT v;
- int ch; /* number of lchild of v being processed */
- int tab; /* number of tabs to indent */
- LOGICAL tabfirst; /* same as for outrat */
- {
- LOGICAL addbrace;
- VERT w;
- if (NTYPE(v) == ACASVX || NTYPE(v) == ICASVX)
- addbrace = FALSE;
- else if (NTYPE(v) == SWCHVX)
- addbrace = TRUE;
- else
- addbrace = HASBRACE(v,ch);
- ASSERT(tabfirst || !addbrace,newlevel);
- if (addbrace)
- OUTSTR(" {");
- if(tabfirst && NTYPE(v)!=ITERVX && NTYPE(v)!=DUMVX) OUTSTR("\n");
- for (w = LCHILD(v,ch); DEFINED(w); w = RSIB(w))
- outrat(w,tab,tabfirst);
- if (addbrace)
- {
- TABOVER(tab);
- OUTSTR("}\n");
- }
- }
-
-
-
-
-
- prpred(v,addpar)
- VERT v;
- LOGICAL addpar;
- {
- if (addpar)
- OUTSTR("(");
- if (NEG(v)) OUTSTR("!(");
- OUTSTR(PRED(v));
- if (NEG(v)) OUTSTR(")");
- if (addpar)
- OUTSTR(")");
- }
-
- prlab(n,tab)
- int n,tab;
- {
- TABOVER(tab);
- OUTSTR("~");
- OUTNUM(n);
- OUTSTR(" ");
- }
-
- prstln(v,tab)
- VERT v;
- int tab;
- {
- ASSERT(NTYPE(v) == STLNVX || NTYPE(v) == FMTVX,prstln);
- if (!ONDISK(v))
- {
- OUTSTR(BEGCODE(v));
- OUTSTR("\n");
- }
- else
- {
- empseek(BEGCODE(v));
- prcode(ONDISK(v),tab);
- }
- }
-
- prcom(v)
- VERT v;
- {
- if (DEFINED(BEGCOM(v)))
- {
- empseek(BEGCOM(v));
- comprint();
- }
- }
-