date and time created 83/02/11 15:44:37 by rrh
authorRobert R. Henry <rrh@ucbvax.Berkeley.EDU>
Sat, 12 Feb 1983 07:44:37 +0000 (23:44 -0800)
committerRobert R. Henry <rrh@ucbvax.Berkeley.EDU>
Sat, 12 Feb 1983 07:44:37 +0000 (23:44 -0800)
SCCS-vsn: usr.bin/struct/struct/3.branch.c 4.1

usr/src/usr.bin/struct/struct/3.branch.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/struct/struct/3.branch.c b/usr/src/usr.bin/struct/struct/3.branch.c
new file mode 100644 (file)
index 0000000..418d9da
--- /dev/null
@@ -0,0 +1,92 @@
+#ifndef lint
+static char sccsid[] = "@(#)3.branch.c 4.1     (Berkeley)      %G%";
+#endif not lint
+
+#include <stdio.h>
+#include "def.h"
+#include "3.def.h"
+
+
+getbranch(head)
+VERT *head;
+       {
+       VERT v;
+       for (v = 0; v < nodenum; ++v)
+               LABEL(v) = FALSE;
+       for (v = START; DEFINED(v); v = RSIB(v))
+               chkbranch(v,head);
+       addlab(START);
+       }
+
+
+
+chkbranch(v,head)
+VERT v,*head;
+       {
+       VERT  w;
+       int i;
+       switch(NTYPE(v))
+               {
+               case GOVX:
+                               for (i = 1, w = head[v]; DEFINED(w); w = head[w], ++i)
+                                       {
+                                       if (i > 1 && !levnxt && !levbrk) break;
+                                       if (ARC(v,0) == BRK(w) && (levbrk || i == 1))
+                                               {
+                                               NTYPE(v) = BRKVX;
+                                               LEVEL(v) = i;
+                                               break;
+                                               }
+                                       else if (ARC(v,0) == NXT(w) && (levnxt || i == 1))
+                                               {
+                                               NTYPE(v) = NXTVX;
+                                               LEVEL(v) = i;
+                                               break;
+                                               }
+                                       }
+                       if (NTYPE(v) == GOVX)
+                               {
+                               if (ARC(v,0) == stopvert)
+                                       NTYPE(v) = STOPVX;
+                               else if (ARC(v,0) == retvert)
+                                       NTYPE(v) = RETVX;
+                               else LABEL(ARC(v,0)) = TRUE;
+                               }
+                       break;
+               case COMPVX:
+               case ASGOVX:
+                       for (i = 0; i < ARCNUM(v); ++i)
+                               LABEL(ARC(v,i)) = TRUE;
+                       break;
+               case IOVX:
+                               if (DEFINED(ARC(v,ENDEQ)))
+                                       LABEL(ARC(v,ENDEQ)) = TRUE;
+                               if (DEFINED(ARC(v,ERREQ)))
+                                       LABEL(ARC(v,ERREQ)) = TRUE;
+                               if (DEFINED(FMTREF(v)))
+                                       LABEL(FMTREF(v)) = TRUE;
+                               break;
+               }
+       for (i = 0; i < CHILDNUM(v); ++i)
+               for (w = LCHILD(v,i); DEFINED(w); w = RSIB(w))
+                       chkbranch(w,head);
+       }
+
+
+addlab(v)              /* add labels */
+VERT v;
+       {
+       int recvar;
+       if (NTYPE(v) != ITERVX && LABEL(v) )
+               LABEL(v) = nxtlab();
+       RECURSE(addlab,v,recvar);
+       if (NTYPE(v) == ITERVX && LABEL(NXT(v)))
+               LABEL(NXT(v)) = nxtlab();
+       }
+
+
+nxtlab()
+       {
+       static count;
+       return(labinit + (count++) * labinc);
+       }