1/* bcdefs.h: The single file to include all constants and type definitions. */ 2 3/* This file is part of GNU bc. 4 Copyright (C) 1991, 1992, 1993, 1994, 1997 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, Inc. 19 59 Temple Place, Suite 330 20 Boston, MA 02111 USA 21 22 You may contact the author by: 23 e-mail: philnelson@acm.org 24 us-mail: Philip A. Nelson 25 Computer Science Department, 9062 26 Western Washington University 27 Bellingham, WA 98226-9062 28 29*************************************************************************/ 30 31/* Include the configuration file. */ 32#include "config.h" 33 34/* Standard includes for all files. */ 35#include <stdio.h> 36#include <sys/types.h> 37#include <ctype.h> 38#ifdef HAVE_STRINGS_H 39#include <strings.h> 40#else 41#include <string.h> 42#endif 43#ifdef HAVE_LIMITS_H 44#include <limits.h> 45#endif 46 47#if defined(LIBEDIT) 48#include <histedit.h> 49#endif 50 51#if defined(READLINE) 52#include <readline/readline.h> 53#include <readline/history.h> 54#endif 55 56/* Include the other definitions. */ 57#include "const.h" 58#include "number.h" 59 60/* These definitions define all the structures used in 61 code and data storage. This includes the representation of 62 labels. The "guiding" principle is to make structures that 63 take a minimum of space when unused but can be built to contain 64 the full structures. */ 65 66/* Labels are first. Labels are generated sequentially in functions 67 and full code. They just "point" to a single bye in the code. The 68 "address" is the byte number. The byte number is used to get an 69 actual character pointer. */ 70 71typedef struct bc_label_group 72 { 73 long l_adrs [ BC_LABEL_GROUP ]; 74 struct bc_label_group *l_next; 75 } bc_label_group; 76 77/* Argument list. Recorded in the function so arguments can 78 be checked at call time. */ 79 80typedef struct arg_list 81 { 82 int av_name; 83 int arg_is_var; /* Extension ... variable parameters. */ 84 struct arg_list *next; 85 } arg_list; 86 87/* Each function has its own code segments and labels. There can be 88 no jumps between functions so labels are unique to a function. */ 89 90typedef struct 91 { 92 char f_defined; /* Is this function defined yet. */ 93 char *f_body; 94 int f_body_size; /* Size of body. Power of 2. */ 95 int f_code_size; 96 bc_label_group *f_label; 97 arg_list *f_params; 98 arg_list *f_autos; 99 } bc_function; 100 101/* Code addresses. */ 102typedef struct { 103 int pc_func; 104 int pc_addr; 105 } program_counter; 106 107 108/* Variables are "pushable" (auto) and thus we need a stack mechanism. 109 This is built into the variable record. */ 110 111typedef struct bc_var 112 { 113 bc_num v_value; 114 struct bc_var *v_next; 115 } bc_var; 116 117 118/* bc arrays can also be "auto" variables and thus need the same 119 kind of stacking mechanisms. */ 120 121typedef struct bc_array_node 122 { 123 union 124 { 125 bc_num n_num [NODE_SIZE]; 126 struct bc_array_node *n_down [NODE_SIZE]; 127 } n_items; 128 } bc_array_node; 129 130typedef struct bc_array 131 { 132 bc_array_node *a_tree; 133 short a_depth; 134 } bc_array; 135 136typedef struct bc_var_array 137 { 138 bc_array *a_value; 139 char a_param; 140 struct bc_var_array *a_next; 141 } bc_var_array; 142 143 144/* For the stacks, execution and function, we need records to allow 145 for arbitrary size. */ 146 147typedef struct estack_rec { 148 bc_num s_num; 149 struct estack_rec *s_next; 150} estack_rec; 151 152typedef struct fstack_rec { 153 int s_val; 154 struct fstack_rec *s_next; 155} fstack_rec; 156 157 158/* The following are for the name tree. */ 159 160typedef struct id_rec { 161 char *id; /* The program name. */ 162 /* A name == 0 => nothing assigned yet. */ 163 int a_name; /* The array variable name (number). */ 164 int f_name; /* The function name (number). */ 165 int v_name; /* The variable name (number). */ 166 short balance; /* For the balanced tree. */ 167 struct id_rec *left, *right; /* Tree pointers. */ 168} id_rec; 169 170 171/* A list of files to process. */ 172 173typedef struct file_node { 174 char *name; 175 struct file_node *next; 176} file_node; 177 178/* Macro Definitions */ 179 180#if defined(LIBEDIT) 181#define HISTORY_SIZE(n) history(hist, &histev, H_SETSIZE, n) 182#define UNLIMIT_HISTORY history(hist, &histev, H_SETSIZE, INT_MAX) 183#endif 184 185#if defined(READLINE) 186#define HISTORY_SIZE(n) stifle_history(n) 187#define UNLIMIT_HISTORY unstifle_history() 188#endif 189