1 /*- 2 * %sccs.include.proprietary.c% 3 */ 4 5 #ifndef lint 6 static char sccsid[] = "@(#)3.branch.c 8.1 (Berkeley) 06/06/93"; 7 #endif /* not lint */ 8 9 #include <stdio.h> 10 #include "def.h" 11 #include "3.def.h" 12 13 14 getbranch(head) 15 VERT *head; 16 { 17 VERT v; 18 for (v = 0; v < nodenum; ++v) 19 LABEL(v) = FALSE; 20 for (v = START; DEFINED(v); v = RSIB(v)) 21 chkbranch(v,head); 22 addlab(START); 23 } 24 25 26 27 chkbranch(v,head) 28 VERT v,*head; 29 { 30 VERT w; 31 int i; 32 switch(NTYPE(v)) 33 { 34 case GOVX: 35 for (i = 1, w = head[v]; DEFINED(w); w = head[w], ++i) 36 { 37 if (i > 1 && !levnxt && !levbrk) break; 38 if (ARC(v,0) == BRK(w) && (levbrk || i == 1)) 39 { 40 NTYPE(v) = BRKVX; 41 LEVEL(v) = i; 42 break; 43 } 44 else if (ARC(v,0) == NXT(w) && (levnxt || i == 1)) 45 { 46 NTYPE(v) = NXTVX; 47 LEVEL(v) = i; 48 break; 49 } 50 } 51 if (NTYPE(v) == GOVX) 52 { 53 if (ARC(v,0) == stopvert) 54 NTYPE(v) = STOPVX; 55 else if (ARC(v,0) == retvert) 56 NTYPE(v) = RETVX; 57 else LABEL(ARC(v,0)) = TRUE; 58 } 59 break; 60 case COMPVX: 61 case ASGOVX: 62 for (i = 0; i < ARCNUM(v); ++i) 63 LABEL(ARC(v,i)) = TRUE; 64 break; 65 case IOVX: 66 if (DEFINED(ARC(v,ENDEQ))) 67 LABEL(ARC(v,ENDEQ)) = TRUE; 68 if (DEFINED(ARC(v,ERREQ))) 69 LABEL(ARC(v,ERREQ)) = TRUE; 70 if (DEFINED(FMTREF(v))) 71 LABEL(FMTREF(v)) = TRUE; 72 break; 73 } 74 for (i = 0; i < CHILDNUM(v); ++i) 75 for (w = LCHILD(v,i); DEFINED(w); w = RSIB(w)) 76 chkbranch(w,head); 77 } 78 79 80 addlab(v) /* add labels */ 81 VERT v; 82 { 83 int recvar; 84 if (NTYPE(v) != ITERVX && LABEL(v) ) 85 LABEL(v) = nxtlab(); 86 RECURSE(addlab,v,recvar); 87 if (NTYPE(v) == ITERVX && LABEL(NXT(v))) 88 LABEL(NXT(v)) = nxtlab(); 89 } 90 91 92 nxtlab() 93 { 94 static count; 95 return(labinit + (count++) * labinc); 96 } 97