# 2.11BSD#431 - /usr/src/usr.bin/struct/3.then.c

##### Functions

    getthen           X
    mkthen            X
    negate            X

##### Macros

    BRANCHTYPE        X
    MAXCHUNK          X

       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

- in line 54
- in /usr/src/usr.bin/struct/3.main.c line 21

mkthen defined in line 57; used 6 times

- in line 26-37(4), 63, 69

negate defined in line 73; used 5 times

- in line 29, 36, 42, 51, 76

#### Defined variables

sccsid defined in line 2; never used

#### Defined macros

BRANCHTYPE defined in line 9; used 3 times

- in line 32-34(2), 63

MAXCHUNK defined in line 10; used 2 times

- in line 47-48(2)

Last modified: 1987-02-17 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 559 |