home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / struct / 3.branch.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1.6 KB  |  89 lines

  1. #include <stdio.h>
  2. #include "def.h"
  3. #include "3.def.h"
  4.  
  5.  
  6. getbranch(head)
  7. VERT *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.  
  19. chkbranch(v,head)
  20. VERT 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.  
  72. addlab(v)        /* add labels */
  73. VERT 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.  
  84. nxtlab()
  85.     {
  86.     static count;
  87.     return(labinit + (count++) * labinc);
  88.     }
  89.