/* bcdefs.h:  The single file to include all constants and type definitions. */

/*  This file is part of bc written for MINIX.
    Copyright (C) 1991, 1992 Free Software Foundation, Inc.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License , or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; see the file COPYING.  If not, write to
    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

    You may contact the author by:
       e-mail:  phil@cs.wwu.edu
      us-mail:  Philip A. Nelson
                Computer Science Department, 9062
                Western Washington University
                Bellingham, WA 98226-9062
       
*************************************************************************/

/* Include the configuration file. */
#include "config.h"

/* Standard includes for all files. */
#include <stdio.h>
#include <sys/types.h>
#include <ctype.h>
#ifdef STRINGS_H
#include <strings.h>
#else
#include <string.h>
#endif
#ifndef NO_LIMITS
#include <limits.h>
#endif

/* Include the other definitions. */
#include "const.h"
#include "number.h"


/* These definitions define all the structures used in
   code and data storage.  This includes the representation of
   labels.   The "guiding" principle is to make structures that
   take a minimum of space when unused but can be built to contain
   the full structures.  */

/* Labels are first.  Labels are generated sequentially in functions
   and full code.  They just "point" to a single bye in the code.  The
   "address" is the byte number.  The byte number is used to get an
   actual character pointer. */

typedef struct bc_label_group
    {
      long l_adrs[BC_LABEL_GROUP];
      struct bc_label_group * l_next;
    } bc_label_group;


/* Each function has its own code segments and labels.  There can be
   no jumps between functions so labels are unique to a function. */

typedef struct arg_list
    {
      int av_name;
      struct arg_list * next;
    } arg_list;

typedef struct 
    {
      char f_defined;   /* Is this function defined yet. */
      char * f_body[BC_MAX_SEGS];
      int   f_code_size;
      bc_label_group * f_label;
      arg_list * f_params;
      arg_list * f_autos;
    } bc_function;

/* Code addresses. */
typedef struct {
      int pc_func;
      int pc_addr;
    } program_counter;


/* Variables are "pushable" (auto) and thus we need a stack mechanism.
   This is built into the variable record. */

typedef struct bc_var
    {
      bc_num v_value;
      struct bc_var * v_next;
    }  bc_var;


/* bc arrays can also be "auto" variables and thus need the same
   kind of stacking mechanisms. */

typedef struct bc_array_node
    {
	  bc_num n_num[NODE_SIZE];
	  struct bc_array_node * n_down[NODE_SIZE];
    } bc_array_node;

typedef struct bc_array
    {
      bc_array_node * a_tree;
      short a_depth;
    } bc_array;

typedef struct bc_var_array
    {
      bc_array * a_value;
      char      a_param;
      struct bc_var_array * a_next;
    } bc_var_array;


/* For the stacks, execution and function, we need records to allow
   for arbitrary size. */

typedef struct estack_rec {
	bc_num s_num;
	struct estack_rec * s_next;
} estack_rec;

typedef struct fstack_rec {
	int  s_val;
	struct fstack_rec * s_next;
} fstack_rec;


/* The following are for the name tree. */

typedef struct id_rec {
	char * id;   /* The program name. */
			/* A name == 0 => nothing assigned yet. */
	int   a_name;   /* The array variable name (number). */
	int   f_name;   /* The function name (number).  */
	int   v_name;   /* The variable name (number).  */
        short balance;  /* For the balanced tree. */
	struct id_rec * left;
	struct id_rec * right; /* Tree pointers. */
} id_rec;
