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

  1. #include <stdio.h>
  2. #
  3. /*
  4. correct the flow of control in the new program - use GOTO's which may
  5. be changed later to NEXT, BREAK, etc.
  6. */
  7. #include "def.h"
  8. #include "3.def.h"
  9.  
  10. #define BRANCHTYPE(v)    (NTYPE(v) == GOVX )
  11. #define HASLEX(t)    (t != GOVX && t != COMPVX && t != ASGOVX  && t != ITERVX )
  12.             /* for these, control never flows directly to following statement */
  13.  
  14.  
  15. getflow()
  16.     {
  17.     fixflow(START,UNDEFINED);
  18.     }
  19.  
  20.  
  21. fixflow(v,autolex)
  22. VERT v;
  23. VERT autolex;        /* lexical successor of v */
  24.     {
  25.     VERT lex,chlex,z,x,w;
  26.     int i;
  27.     lex = lexval(v,autolex);
  28.     if (HASLEX(NTYPE(v)) && NTYPE(v) != ICASVX)
  29.         if (DEFINED(REACH(v)) && REACH(v) != lex)
  30.             insib(v,makebr(REACH(v)));
  31.         else if (NTYPE(v) == DOVX && ARC(v,1) != lex)
  32.             insib(v,makebr(ARC(v,1)));
  33.     if (NTYPE(v) == ITERVX)
  34.         {
  35.         BRK(v) = autolex;
  36.         chlex = v;
  37.         }
  38.     else
  39.         chlex = lexval(v,autolex);
  40.  
  41.     for (i = 0; i < CHILDNUM(v); ++i)
  42.         {
  43.         w = LCHILD(v,i);
  44.         if (DEFINED(w))
  45.             fixflow(w,chlex);
  46.         else
  47.             {
  48.             ASSERT(i < ARCNUM(v),fixflow);
  49.             z = ARC(v,i);
  50.             ASSERT(DEFINED(z), fixflow);
  51.             if (z != chlex)
  52.                 {
  53.                 x = makebr(z);
  54.                 LCHILD(v,i) = x;
  55.                 RSIB(x) = UNDEFINED;
  56.                 }
  57.             }
  58.         }
  59.     if (DEFINED(RSIB(v)))
  60.         fixflow(RSIB(v),autolex);
  61.     }
  62.  
  63.  
  64. lexval(v,lastlex)
  65. VERT v,lastlex;
  66.     {
  67.     VERT sib;
  68.     if (!HASLEX(NTYPE(v))) return(UNDEFINED);
  69.     sib = RSIB(v);
  70.     if (NTYPE(v) == ICASVX || NTYPE(v) == ACASVX)
  71.         return(lastlex);
  72.     else if (!DEFINED(sib))
  73.         return(lastlex);
  74.     else if (BRANCHTYPE(sib))
  75.         return(ARC(sib,0));
  76.     else return(sib);
  77.     }
  78.  
  79.  
  80. makebr(w)        /* make branching node leading to w */
  81. VERT w;
  82.     {
  83.     VERT new;
  84.     new = create(GOVX,1);
  85.     ARC(new,0) = w;
  86.     RSIB(new) = UNDEFINED;
  87.     REACH(new) = UNDEFINED;
  88.     return(new);
  89.     }
  90.