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