1: #ifndef lint
   2: static char sccsid[] = "@(#)3.then.c	4.1	(Berkeley)	2/11/83";
   3: #endif not lint
   4: 
   5: #include <stdio.h>
   6: #include "def.h"
   7: #include "3.def.h"
   8: 
   9: #define BRANCHTYPE(t)   (t == STOPVX || t == RETVX || t == BRKVX || t == NXTVX || t == GOVX)
  10: #define MAXCHUNK    20
  11:         /* if else clause smaller than MAXCHUNK and smaller than then clause,
  12: 			and there is no reason not to negate the if, negate the if */
  13: 
  14: getthen(v)      /* turn IFVX into THEN when appropriate, create else ifs where possible  */
  15: VERT v;
  16:     {
  17:     VERT tch, fch;
  18:     int tn,fn;
  19:     int recvar;
  20: 
  21:     if (NTYPE(v) == IFVX)
  22:         {
  23:         tch = LCHILD(v,THEN);
  24:         fch = LCHILD(v,ELSE);
  25:         if (!DEFINED(fch))
  26:             mkthen(v);
  27:         else if (!DEFINED(tch))
  28:             {
  29:             negate(v);
  30:             mkthen(v);
  31:             }
  32:         else if (BRANCHTYPE(NTYPE(tch)))
  33:             mkthen(v);
  34:         else if (BRANCHTYPE(NTYPE(fch)))
  35:             {
  36:             negate(v);
  37:             mkthen(v);
  38:             }
  39:         else if (NTYPE(fch) != IFVX || DEFINED(RSIB(fch)))  /* not an else if */
  40:             if ( NTYPE(tch) == IFVX && !DEFINED(RSIB(tch)))
  41:                     /* invert into else if */
  42:                 negate(v);
  43:             else
  44:                 {
  45:                 /* asoc(v,n) returns number of statements associated with v
  46: 					if <= n, -1 otherwise */
  47:                 tn = asoc(tch,MAXCHUNK);
  48:                 fn = asoc(fch,MAXCHUNK);
  49:                 if (fn >= 0 && (tn < 0 || fn < tn))
  50:                     /* else clause smaller */
  51:                     negate(v);
  52:                 }
  53:         }
  54:     RECURSE(getthen,v,recvar);
  55:     }
  56: 
  57: mkthen(v)
  58: VERT v;
  59:     {
  60:     VERT w,tc;
  61:     w = LCHILD(v,ELSE);
  62:     tc = LCHILD(v,THEN);
  63:     ASSERT(!DEFINED(w) || (DEFINED(tc) && BRANCHTYPE(NTYPE(tc)) ),mkthen);
  64:     if (DEFINED(w))
  65:         {
  66:         insib(v,w);
  67:         LCHILD(v,ELSE) = UNDEFINED;
  68:         }
  69:     ASSERT(IFTHEN(v),mkthen);
  70:     }
  71: 
  72: 
  73: negate(v)
  74: VERT v;
  75:     {
  76:     ASSERT(NTYPE(v) == IFVX,negate);
  77:     exchange(&LCHILD(v,THEN), &LCHILD(v,ELSE));
  78:     NEG(v) = !NEG(v);
  79:     }

Defined functions

getthen defined in line 14; used 2 times
mkthen defined in line 57; used 6 times
negate defined in line 73; used 5 times

Defined variables

sccsid defined in line 2; never used

Defined macros

BRANCHTYPE defined in line 9; used 3 times
MAXCHUNK defined in line 10; used 2 times
Last modified: 1987-02-17
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 1812
Valid CSS Valid XHTML 1.0 Strict