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