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