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