home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-386-Vol-2of3.iso / b / bc-102.zip / bc-1.02 / bcdefs.h < prev    next >
C/C++ Source or Header  |  1992-03-04  |  4KB  |  155 lines

  1. /* bcdefs.h:  The single file to include all constants and type definitions. */
  2.  
  3. /*  This file is part of bc written for MINIX.
  4.     Copyright (C) 1991, 1992 Free Software Foundation, Inc.
  5.  
  6.     This program is free software; you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation; either version 2 of the License , or
  9.     (at your option) any later version.
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; see the file COPYING.  If not, write to
  18.     the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  
  20.     You may contact the author by:
  21.        e-mail:  phil@cs.wwu.edu
  22.       us-mail:  Philip A. Nelson
  23.                 Computer Science Department, 9062
  24.                 Western Washington University
  25.                 Bellingham, WA 98226-9062
  26.        
  27. *************************************************************************/
  28.  
  29. /* Include the configuration file. */
  30. #include "config.h"
  31.  
  32. /* Standard includes for all files. */
  33. #include <stdio.h>
  34. #include <sys/types.h>
  35. #include <ctype.h>
  36. #ifdef STRINGS_H
  37. #include <strings.h>
  38. #else
  39. #include <string.h>
  40. #endif
  41. #ifndef NO_LIMITS
  42. #include <limits.h>
  43. #endif
  44.  
  45. /* Include the other definitions. */
  46. #include "const.h"
  47. #include "number.h"
  48.  
  49.  
  50. /* These definitions define all the structures used in
  51.    code and data storage.  This includes the representation of
  52.    labels.   The "guiding" principle is to make structures that
  53.    take a minimum of space when unused but can be built to contain
  54.    the full structures.  */
  55.  
  56. /* Labels are first.  Labels are generated sequentially in functions
  57.    and full code.  They just "point" to a single bye in the code.  The
  58.    "address" is the byte number.  The byte number is used to get an
  59.    actual character pointer. */
  60.  
  61. typedef struct bc_label_group
  62.     {
  63.       long l_adrs [ BC_LABEL_GROUP ];
  64.       struct bc_label_group *l_next;
  65.     } bc_label_group;
  66.  
  67.  
  68. /* Each function has its own code segments and labels.  There can be
  69.    no jumps between functions so labels are unique to a function. */
  70.  
  71. typedef struct arg_list
  72.     {
  73.       int av_name;
  74.       struct arg_list *next;
  75.     } arg_list;
  76.  
  77. typedef struct 
  78.     {
  79.       char f_defined;   /* Is this function defined yet. */
  80.       char *f_body[BC_MAX_SEGS];
  81.       int   f_code_size;
  82.       bc_label_group *f_label;
  83.       arg_list *f_params;
  84.       arg_list *f_autos;
  85.     } bc_function;
  86.  
  87. /* Code addresses. */
  88. typedef struct {
  89.       int pc_func;
  90.       int pc_addr;
  91.     } program_counter;
  92.  
  93.  
  94. /* Variables are "pushable" (auto) and thus we need a stack mechanism.
  95.    This is built into the variable record. */
  96.  
  97. typedef struct bc_var
  98.     {
  99.       bc_num v_value;
  100.       struct bc_var *v_next;
  101.     }  bc_var;
  102.  
  103.  
  104. /* bc arrays can also be "auto" variables and thus need the same
  105.    kind of stacking mechanisms. */
  106.  
  107. typedef struct bc_array_node
  108.     {
  109.       union
  110.     {
  111.       bc_num n_num [NODE_SIZE];
  112.       struct bc_array_node *n_down [NODE_SIZE];
  113.     } n_items;
  114.     } bc_array_node;
  115.  
  116. typedef struct bc_array
  117.     {
  118.       bc_array_node *a_tree;
  119.       short a_depth;
  120.     } bc_array;
  121.  
  122. typedef struct bc_var_array
  123.     {
  124.       bc_array *a_value;
  125.       char      a_param;
  126.       struct bc_var_array *a_next;
  127.     } bc_var_array;
  128.  
  129.  
  130. /* For the stacks, execution and function, we need records to allow
  131.    for arbitrary size. */
  132.  
  133. typedef struct estack_rec {
  134.     bc_num s_num;
  135.     struct estack_rec *s_next;
  136. } estack_rec;
  137.  
  138. typedef struct fstack_rec {
  139.     int  s_val;
  140.     struct fstack_rec *s_next;
  141. } fstack_rec;
  142.  
  143.  
  144. /* The following are for the name tree. */
  145.  
  146. typedef struct id_rec {
  147.     char  *id;      /* The program name. */
  148.             /* A name == 0 => nothing assigned yet. */
  149.     int   a_name;   /* The array variable name (number). */
  150.     int   f_name;   /* The function name (number).  */
  151.     int   v_name;   /* The variable name (number).  */
  152.         short balance;  /* For the balanced tree. */
  153.     struct id_rec *left, *right; /* Tree pointers. */
  154. } id_rec;
  155.