# 2.11BSD#431 - /usr/ingres/source/iutil/trbuild.c

##### Functions

    leaf              X
    trbuild           X

       1: # include   "../ingres.h"
       2: # include   "../tree.h"
       3: # include   "../symbol.h"
       4:
       5: /*
       6: **  TRBUILD -- Rebuild a tree in memory
       7: **
       8: **	Trbuild is called with a pointer to the TREE node of
       9: **	a query already in memory. It rebuilds the pointer
      10: **	structure assuming the querytree is in postfix order.
      11: **
      12: **	Parameters:
      13: **		bufptr - a pointer to the TREE node
      14: **
      15: **
      16: **	Returns:
      17: **		NULL - Internal stack overflow (STACKSIZ)
      18: **		pointer to the ROOT node
      19: **
      20: **	Side Effects:
      21: **		All left & right pointers are rebuilt.
      22: **
      23: **	Called By:
      24: **		readq
      25: **
      26: **	Syserrs:
      27: **		syserr if there are too many leaf nodes or too
      28: **		few child nodes
      29: **
      30: **	History:
      31: **		1/18/79 (rse) - written
      32: */
      33:
      34:
      35: struct querytree *trbuild(bufptr)
      36: char    *bufptr;
      37: {
      38:     register struct querytree   **stackptr;
      39:     register char           *p; /* really struct querytree * */
      40:     register struct symbol      *s;
      41:     struct querytree        *treestack[STACKSIZ];
      42:
      43:
      44:     stackptr = treestack;
      45:
      46:     for (p = bufptr; ;p += 6 + ((s->len + 1) & 0376))
      47:     {
      48:         s = &(((struct querytree *)p)->sym);
      49:         ((struct querytree *)p)->left = ((struct querytree *)p)->right = 0;
      50:
      51:         /* reunite p with left and right children on stack, if any*/
      52:         if (!leaf(p))       /* this node has children */
      53:         {
      54:             if (s->type != UOP)
      55:                 if (stackptr <= treestack)
      56:                 {
      57:                 err:
      58:                     syserr("trbuild:too few nodes");
      59:                 }
      60:                 else
      61:                     ((struct querytree *)p)->right = *(--stackptr);
      62:             if (s->type != AOP)
      63:                 if (stackptr <= treestack)
      64:                     goto err;
      65:                 else
      66:                     ((struct querytree *)p)->left = *(--stackptr);
      67:         }
      68:
      69:         /*
      70: 		** If this is a ROOT node then the tree is complete.
      71: 		** verify that there are no extra nodes in the
      72: 		** treestack.
      73: 		*/
      74:         if (s->type == ROOT)        /* root node */
      75:         {
      76:             if (stackptr != treestack)
      77:                 syserr("trbuild:xtra nodes");
      78:             return ((struct querytree *)p);
      79:         }
      80:
      81:         /* stack p */
      82:         if (stackptr-treestack >= STACKSIZ)
      83:             return (NULL);  /* error:stack full */
      84:         *(stackptr++) = (struct querytree *)p;
      85:
      86:     }
      87: }
      88:
      89:
      90: leaf(p)
      91: struct querytree *p;
      92: {
      93:     switch (p->sym.type)
      94:     {
      95:       case VAR:
      96:       case TREE:
      97:       case QLEND:
      98:       case INT:
      99:       case FLOAT:
     100:       case CHAR:
     101:       case COP:
     102:         return(1);
     103:
     104:       default:
     105:         return(0);
     106:     }
     107: }

#### Defined functions

leaf defined in line 90; used 1 times

- in line 52

trbuild defined in line 35; used 6 times

- in /usr/ingres/source/dbu/readtree.c line 98, 138
- in /usr/ingres/source/decomp/qryproc.c line 15, 47
- in /usr/ingres/source/qrymod/readtree.c line 69, 124

Last modified: 1995-02-12 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 540 |