xref: /original-bsd/usr.bin/struct/struct/3.flow.c (revision c3e32dec)
1 /*-
2  * %sccs.include.proprietary.c%
3  */
4 
5 #ifndef lint
6 static char sccsid[] = "@(#)3.flow.c	8.1 (Berkeley) 06/06/93";
7 #endif /* not lint */
8 
9 #include <stdio.h>
10 #
11 /*
12 correct the flow of control in the new program - use GOTO's which may
13 be changed later to NEXT, BREAK, etc.
14 */
15 #include "def.h"
16 #include "3.def.h"
17 
18 #define BRANCHTYPE(v)	(NTYPE(v) == GOVX )
19 #define HASLEX(t)	(t != GOVX && t != COMPVX && t != ASGOVX  && t != ITERVX )
20 			/* for these, control never flows directly to following statement */
21 
22 
23 getflow()
24 	{
25 	fixflow(START,UNDEFINED);
26 	}
27 
28 
29 fixflow(v,autolex)
30 VERT v;
31 VERT autolex;		/* lexical successor of v */
32 	{
33 	VERT lex,chlex,z,x,w;
34 	int i;
35 	lex = lexval(v,autolex);
36 	if (HASLEX(NTYPE(v)) && NTYPE(v) != ICASVX)
37 		if (DEFINED(REACH(v)) && REACH(v) != lex)
38 			insib(v,makebr(REACH(v)));
39 		else if (NTYPE(v) == DOVX && ARC(v,1) != lex)
40 			insib(v,makebr(ARC(v,1)));
41 	if (NTYPE(v) == ITERVX)
42 		{
43 		BRK(v) = autolex;
44 		chlex = v;
45 		}
46 	else
47 		chlex = lexval(v,autolex);
48 
49 	for (i = 0; i < CHILDNUM(v); ++i)
50 		{
51 		w = LCHILD(v,i);
52 		if (DEFINED(w))
53 			fixflow(w,chlex);
54 		else
55 			{
56 			ASSERT(i < ARCNUM(v),fixflow);
57 			z = ARC(v,i);
58 			ASSERT(DEFINED(z), fixflow);
59 			if (z != chlex)
60 				{
61 				x = makebr(z);
62 				LCHILD(v,i) = x;
63 				RSIB(x) = UNDEFINED;
64 				}
65 			}
66 		}
67 	if (DEFINED(RSIB(v)))
68 		fixflow(RSIB(v),autolex);
69 	}
70 
71 
72 lexval(v,lastlex)
73 VERT v,lastlex;
74 	{
75 	VERT sib;
76 	if (!HASLEX(NTYPE(v))) return(UNDEFINED);
77 	sib = RSIB(v);
78 	if (NTYPE(v) == ICASVX || NTYPE(v) == ACASVX)
79 		return(lastlex);
80 	else if (!DEFINED(sib))
81 		return(lastlex);
82 	else if (BRANCHTYPE(sib))
83 		return(ARC(sib,0));
84 	else return(sib);
85 	}
86 
87 
88 makebr(w)		/* make branching node leading to w */
89 VERT w;
90 	{
91 	VERT new;
92 	new = create(GOVX,1);
93 	ARC(new,0) = w;
94 	RSIB(new) = UNDEFINED;
95 	REACH(new) = UNDEFINED;
96 	return(new);
97 	}
98