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