xref: /original-bsd/usr.bin/struct/struct/4.out.c (revision c3e32dec)
1 /*-
2  * %sccs.include.proprietary.c%
3  */
4 
5 #ifndef lint
6 static char sccsid[] = "@(#)4.out.c	8.1 (Berkeley) 06/06/93";
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