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