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