Research V7 development
[unix-history] / usr / src / cmd / struct / 4.brace.c
CommitLineData
2a70a0a1
BB
1#include <stdio.h>
2#include "def.h"
3#include "4.def.h"
4#include "3.def.h"
5
6ndbrace(v) /* determine whether braces needed around subparts of v */
7 /* return TRUE if v ends with IF THEN not in braces */
8VERT v;
9 {
10 VERT w;
11 int i;
12 LOGICAL endif;
13 endif = FALSE;
14 for (i = 0; i < CHILDNUM(v); ++i)
15 {
16 endif = FALSE;
17 for (w = LCHILD(v,i); DEFINED(w); w = RSIB(w))
18 endif = ndbrace(w);
19 if (NTYPE(v) != DUMVX && NTYPE(v) != ITERVX &&
20 (!DEFINED(LCHILD(v,i)) || compound(v,i) ||
21 (endif && NTYPE(v) == IFVX && !IFTHEN(v) && i == THEN )))
22 /* DUMVX doesn't nest, ITERVX doen't nest since
23 nesting is done at LOOPNODE, etc., must
24 check for IFTHEN followed by unrelated ELSE */
25 {
26 YESBRACE(v,i);
27 endif = FALSE;
28 }
29 }
30 return(endif || IFTHEN(v) );
31 }
32
33
34compound(v,ch) /* return TRUE iff subpart ch of v has multiple statements */
35VERT v;
36int ch;
37 {
38 VERT w;
39 w = LCHILD(v,ch);
40 if (!DEFINED(w))
41 return(FALSE);
42 if (NTYPE(w) == ITERVX)
43 {
44 ASSERT(DEFINED(NXT(w)),compound);
45 if (LABEL(NXT(w)))
46 return(TRUE); /* loop ends with labeled CONTINUE statement */
47 else
48 return(compound(w,0));
49 }
50 else if (DEFINED(RSIB(w)))
51 return(TRUE);
52 else if (NTYPE(w) == STLNVX && CODELINES(w) > 1)
53 return(TRUE);
54 else
55 return(FALSE);
56 }