/*
 * tree.c -- functions for constructing parse trees
 */

#include "..\h\config.h"
#include "general.h"
#include "tproto.h"
#include "tree.h"

/*
 *  tree[1-6] construct parse tree nodes with specified values.  tfree
 *   points at the next free word in the parse tree space.  Nodes are
 *   built by copying argument values into successive locations starting
 *   at tfree.  Parameters a and b are line and column information,
 *   while parameters c through f are values to be assigned to n_field[0-3].
 *   Note that this could be done with a single routine; a separate routine
 *   for each node size is used for speed and simplicity.
 */

nodeptr tree1(type)
int type;
   {
   register nodeptr t;

   t = tfree;
   tfree = (nodeptr) ((word *)tfree + 1);
   if (tfree > tend)
      tsyserr("out of tree space");
   t->n_type = type;
   return t;
   }

nodeptr tree2(type, loc_model)
int type;
nodeptr loc_model;
   {
   register nodeptr t;

   t = tfree;
   tfree = (nodeptr) ((word *)tfree + 4);
   if (tfree > tend)
      tsyserr("out of tree space");
   t->n_type = type;
   t->n_file = loc_model->n_file;
   t->n_line = loc_model->n_line;
   t->n_col = loc_model->n_col;
   return t;
   }

nodeptr tree3(type, loc_model, c)
int type;
nodeptr loc_model;
nodeptr c;
   {
   register nodeptr t;

   t = tfree;
   tfree = (nodeptr) ((word *)tfree + 5);
   if (tfree > tend)
      tsyserr("out of tree space");
   t->n_type = type;
   t->n_file = loc_model->n_file;
   t->n_line = loc_model->n_line;
   t->n_col = loc_model->n_col;
   t->n_field[0].n_ptr = c;
   return t;
   }

nodeptr tree4(type, loc_model, c, d)
int type;
nodeptr loc_model;
nodeptr c, d;
   {
   register nodeptr t;

   t = tfree;
   tfree = (nodeptr) ((word *)tfree + 6);
   if (tfree > tend)
      tsyserr("out of tree space");
   t->n_type = type;
   t->n_file = loc_model->n_file;
   t->n_line = loc_model->n_line;
   t->n_col = loc_model->n_col;
   t->n_field[0].n_ptr = c;
   t->n_field[1].n_ptr = d;
   return t;
   }

nodeptr tree5(type, loc_model, c, d, e)
int type;
nodeptr loc_model;
nodeptr c, d, e;
   {
   register nodeptr t;

   t = tfree;
   tfree = (nodeptr) ((word *)tfree + 7);
   if (tfree > tend)
      tsyserr("out of tree space");
   t->n_type = type;
   t->n_file = loc_model->n_file;
   t->n_line = loc_model->n_line;
   t->n_col = loc_model->n_col;
   t->n_field[0].n_ptr = c;
   t->n_field[1].n_ptr = d;
   t->n_field[2].n_ptr = e;
   return t;
   }

nodeptr tree6(type, loc_model, c, d, e, f)
int type;
nodeptr loc_model;
nodeptr c, d, e, f;
   {
   register nodeptr t;

   t = tfree;
   tfree = (nodeptr) ((word *)tfree + 8);
   if (tfree > tend)
      tsyserr("out of tree space");
   t->n_type = type;
   t->n_file = loc_model->n_file;
   t->n_line = loc_model->n_line;
   t->n_col = loc_model->n_col;
   t->n_field[0].n_ptr = c;
   t->n_field[1].n_ptr = d;
   t->n_field[2].n_ptr = e;
   t->n_field[3].n_ptr = f;
   return t;
   }

nodeptr int_leaf(type, loc_model, c)
int type;
nodeptr loc_model;
int c;
   {
   register nodeptr t;

   t = tfree;
   tfree = (nodeptr) ((word *)tfree + 5);
   if (tfree > tend)
      tsyserr("out of tree space");
   t->n_type = type;
   t->n_file = loc_model->n_file;
   t->n_line = loc_model->n_line;
   t->n_col = loc_model->n_col;
   t->n_field[0].n_val = c;
   return t;
   }

nodeptr c_str_leaf(type, loc_model, c)
int type;
nodeptr loc_model;
char *c;
   {
   register nodeptr t;

   t = tfree;
   tfree = (nodeptr) ((word *)tfree + 5);
   if (tfree > tend)
      tsyserr("out of tree space");
   t->n_type = type;
   t->n_file = loc_model->n_file;
   t->n_line = loc_model->n_line;
   t->n_col = loc_model->n_col;
   t->n_field[0].n_str = c;
   return t;
   }

nodeptr i_str_leaf(type, loc_model, c, d)
int type;
nodeptr loc_model;
char *c;
int d;
   {
   register nodeptr t;

   t = tfree;
   tfree = (nodeptr) ((word *)tfree + 6);
   if (tfree > tend)
      tsyserr("out of tree space");
   t->n_type = type;
   t->n_file = loc_model->n_file;
   t->n_line = loc_model->n_line;
   t->n_col = loc_model->n_col;
   t->n_field[0].n_str = c;
   t->n_field[1].n_val = d;
   return t;
   }

/*
 * Clear the tree space by setting the free pointer back to the first word
 *  of the tree space.
 */

novalue treeinit()
   {
   tfree = tree;
   }
