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
getbranch(head)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
chkbranch(v,head)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
addlab(v)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
nxtlab()92 nxtlab()
93 {
94 static count;
95 return(labinit + (count++) * labinc);
96 }
97