xref: /original-bsd/usr.bin/struct/struct/4.out.c (revision 92d3de31)
1 #ifndef lint
2 static char sccsid[] = "@(#)4.out.c	4.1	(Berkeley)	02/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 	}
297