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