1 /*- 2 * %sccs.include.proprietary.c% 3 */ 4 5 #ifndef lint 6 static char sccsid[] = "@(#)4.out.c 4.2 (Berkeley) 04/16/91"; 7 #endif /* not lint */ 8 9 #include <stdio.h> 10 #include "def.h" 11 #include "4.def.h" 12 #include "3.def.h" 13 14 outrat(v,tab,tabfirst) 15 VERT v; 16 int tab; /* number of tabs to indent */ 17 LOGICAL tabfirst; /* FALSE if doing IF of ELSE IF */ 18 { 19 LOGICAL ndcomma; 20 VERT w; 21 int type,i; 22 type = NTYPE(v); 23 if (hascom[type]) 24 prcom(v); 25 if (!LABEL(v) && type == FMTVX) 26 { 27 OUTSTR("#following unreferenced format statement commented out\n"); 28 OUTSTR("#"); 29 } 30 if (LABEL(v) && type != ITERVX) 31 { 32 ASSERT(tabfirst, outrat); 33 prlab(LABEL(v),tab); 34 } 35 else if (tabfirst && type != DUMVX && type != ITERVX) 36 TABOVER(tab); 37 38 switch(type) 39 { 40 case DUMVX: 41 newlevel(v,0,tab,YESTAB); 42 break; 43 case GOVX: 44 OUTSTR("go to "); 45 OUTNUM(LABEL(ARC(v,0))); 46 OUTSTR("\n"); 47 break; 48 case STOPVX: 49 if (progtype != blockdata) 50 OUTSTR("stop\n"); 51 break; 52 case RETVX: 53 OUTSTR("return\n"); 54 break; 55 case BRKVX: 56 if (!levbrk) 57 { 58 ASSERT(LEVEL(v) == 1,outrat); 59 OUTSTR("break\n"); 60 } 61 else 62 { 63 OUTSTR("break "); 64 OUTNUM(LEVEL(v)); 65 OUTSTR("\n"); 66 } 67 break; 68 case NXTVX: 69 if (!levnxt) 70 { 71 ASSERT(LEVEL(v) == 1,outrat); 72 OUTSTR("next\n"); 73 } 74 else 75 { 76 OUTSTR("next "); 77 OUTNUM(LEVEL(v)); 78 OUTSTR("\n"); 79 } 80 break; 81 case ASGOVX: 82 case COMPVX: 83 OUTSTR("goto "); 84 if (type == ASGOVX) 85 { 86 OUTSTR(EXP(v)); 87 OUTSTR(","); 88 } 89 OUTSTR("("); 90 for (i = ARCNUM(v)-1; i >=0; --i) /* arcs were stored backward */ 91 { 92 OUTNUM(LABEL(ARC(v,i))); 93 if (i > 0) OUTSTR(","); 94 } 95 OUTSTR(")"); 96 if (type == COMPVX) 97 { 98 OUTSTR(","); 99 OUTSTR(EXP(v)); 100 } 101 OUTSTR("\n"); 102 break; 103 case ASVX: 104 OUTSTR("assign "); 105 OUTNUM(LABEL(LABREF(v))); 106 OUTSTR(" to "); 107 OUTSTR(EXP(v)); 108 OUTSTR("\n"); 109 break; 110 case IFVX: 111 OUTSTR("IF"); 112 prpred(v,TRUE); 113 if (IFTHEN(v)) 114 newlevel(v,THEN,tab+1,YESTAB); 115 else 116 { 117 newlevel(v,THEN,tab+1,YESTAB); 118 TABOVER(tab); 119 OUTSTR("ELSE "); 120 w = LCHILD(v,ELSE); 121 ASSERT(DEFINED(w),outrat); 122 if (NTYPE(w) == IFVX && !LABEL(w) && !DEFINED(RSIB(w)) && 123 !HASBRACE(v,ELSE) ) 124 newlevel(v,ELSE,tab,NOTAB); 125 else 126 newlevel(v,ELSE,tab+1,YESTAB); 127 } 128 break; 129 case ITERVX: 130 newlevel(v,0,tab,YESTAB); 131 ASSERT(DEFINED(NXT(v)),outrat); 132 if (LABEL(NXT(v))) 133 { 134 prlab(LABEL(NXT(v)),tab); 135 OUTSTR("continue\n"); 136 } 137 break; 138 case DOVX: 139 OUTSTR("DO "); 140 OUTSTR(INC(v)); 141 newlevel(v,0,tab+1,YESTAB); 142 break; 143 case LOOPVX: 144 case UNTVX: 145 OUTSTR("REPEAT"); 146 newlevel(v,0,tab+1,YESTAB); 147 if (type == UNTVX) 148 { 149 TABOVER(tab+1); 150 OUTSTR("UNTIL"); 151 ASSERT(DEFINED(ARC(v,0)),outrat); 152 prpred(LPRED(ARC(v,0)),TRUE); 153 OUTSTR("\n"); 154 } 155 break; 156 case WHIVX: 157 OUTSTR("WHILE"); 158 ASSERT(DEFINED(ARC(v,0)),outrat); 159 ASSERT(DEFINED(LPRED(ARC(v,0))),outrat); 160 prpred(LPRED(ARC(v,0)),TRUE); 161 newlevel(v,0,tab+1,YESTAB); 162 break; 163 case STLNVX: 164 case FMTVX: 165 prstln(v,tab); 166 break; 167 case SWCHVX: 168 OUTSTR("SWITCH"); 169 if (DEFINED(EXP(v))) 170 { 171 OUTSTR("("); 172 OUTSTR(EXP(v)); 173 OUTSTR(")"); 174 } 175 newlevel(v,0,tab+1,YESTAB); 176 break; 177 case ICASVX: 178 case ACASVX: 179 OUTSTR("CASE "); 180 if (type == ACASVX) 181 prpred(v,FALSE); 182 else 183 OUTSTR(EXP(v)); 184 OUTSTR(":\n"); 185 newlevel(v,0,tab+1,YESTAB); 186 if (type == ACASVX &&DEFINED(LCHILD(v,ELSE))) 187 { 188 TABOVER(tab); 189 OUTSTR("DEFAULT:\n"); 190 newlevel(v,1,tab+1,YESTAB); 191 } 192 break; 193 case IOVX: 194 OUTSTR(PRERW(v)); 195 ndcomma = FALSE; 196 if (DEFINED(FMTREF(v))) 197 { 198 OUTNUM(LABEL(FMTREF(v))); 199 ndcomma = TRUE; 200 } 201 if (DEFINED(ARC(v,ENDEQ))) 202 { 203 if (ndcomma) 204 OUTSTR(","); 205 OUTSTR("end = "); 206 OUTNUM(LABEL(ARC(v,ENDEQ))); 207 ndcomma = TRUE; 208 } 209 if (DEFINED(ARC(v,ERREQ))) 210 { 211 if (ndcomma) 212 OUTSTR(","); 213 OUTSTR("err = "); 214 OUTNUM(LABEL(ARC(v,ERREQ))); 215 ndcomma = TRUE; 216 } 217 OUTSTR(POSTRW(v)); 218 OUTSTR("\n"); 219 break; 220 } 221 } 222 223 224 newlevel(v,ch,tab,tabfirst) 225 VERT v; 226 int ch; /* number of lchild of v being processed */ 227 int tab; /* number of tabs to indent */ 228 LOGICAL tabfirst; /* same as for outrat */ 229 { 230 LOGICAL addbrace; 231 VERT w; 232 if (NTYPE(v) == ACASVX || NTYPE(v) == ICASVX) 233 addbrace = FALSE; 234 else 235 addbrace = HASBRACE(v,ch); 236 ASSERT(tabfirst || !addbrace,newlevel); 237 if (addbrace) 238 OUTSTR(" {"); 239 if(tabfirst && NTYPE(v)!=ITERVX && NTYPE(v)!=DUMVX) OUTSTR("\n"); 240 for (w = LCHILD(v,ch); DEFINED(w); w = RSIB(w)) 241 outrat(w,tab,tabfirst); 242 if (addbrace) 243 { 244 TABOVER(tab); 245 OUTSTR("}\n"); 246 } 247 } 248 249 250 251 252 253 prpred(v,addpar) 254 VERT v; 255 LOGICAL addpar; 256 { 257 if (addpar) 258 OUTSTR("("); 259 if (NEG(v)) OUTSTR("!("); 260 OUTSTR(PRED(v)); 261 if (NEG(v)) OUTSTR(")"); 262 if (addpar) 263 OUTSTR(")"); 264 } 265 266 prlab(n,tab) 267 int n,tab; 268 { 269 TABOVER(tab); 270 OUTSTR("~"); 271 OUTNUM(n); 272 OUTSTR(" "); 273 } 274 275 prstln(v,tab) 276 VERT v; 277 int tab; 278 { 279 ASSERT(NTYPE(v) == STLNVX || NTYPE(v) == FMTVX,prstln); 280 if (!ONDISK(v)) 281 { 282 OUTSTR(BEGCODE(v)); 283 OUTSTR("\n"); 284 } 285 else 286 { 287 empseek(BEGCODE(v)); 288 prcode(ONDISK(v),tab); 289 } 290 } 291 292 prcom(v) 293 VERT v; 294 { 295 if (DEFINED(BEGCOM(v))) 296 { 297 empseek(BEGCOM(v)); 298 comprint(); 299 } 300 } 301