1 /* $NetBSD: bcdefs.h,v 1.1 2017/04/10 02:28:23 phil Exp $ */ 2 3 /* 4 * Copyright (C) 1991-1994, 1997, 2006, 2008, 2012-2017 Free Software Foundation, Inc. 5 * Copyright (C) 2016-2017 Philip A. Nelson. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. The names Philip A. Nelson and Free Software Foundation may not be 18 * used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY PHILIP A. NELSON ``AS IS'' AND ANY EXPRESS OR 22 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 * IN NO EVENT SHALL PHILIP A. NELSON OR THE FREE SOFTWARE FOUNDATION BE 25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 31 * THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 /* bcdefs.h: The single file to include all constants and type definitions. */ 35 36 /* Include the configuration file. */ 37 #include "config.h" 38 39 /* Standard includes for all files. */ 40 #include <stdio.h> 41 #include <sys/types.h> 42 #include <ctype.h> 43 #ifdef HAVE_STRING_H 44 #include <string.h> 45 #else 46 #include <strings.h> 47 #endif 48 #ifdef HAVE_LIMITS_H 49 #include <limits.h> 50 #endif 51 52 #if defined(LIBEDIT) 53 #include <histedit.h> 54 #endif 55 56 #if defined(READLINE) 57 #include <readline/readline.h> 58 #include <readline/history.h> 59 #endif 60 61 /* Initialization magic ... */ 62 #ifdef _GLOBAL_C 63 #define EXTERN 64 #define INIT(x) = x 65 #else 66 #define EXTERN extern 67 #define INIT(x) 68 #endif 69 70 /* Include the other definitions. */ 71 #include "const.h" 72 #include "number.h" 73 74 /* These definitions define all the structures used in 75 code and data storage. This includes the representation of 76 labels. The "guiding" principle is to make structures that 77 take a minimum of space when unused but can be built to contain 78 the full structures. */ 79 80 /* Labels are first. Labels are generated sequentially in functions 81 and full code. They just "point" to a single bye in the code. The 82 "address" is the byte number. The byte number is used to get an 83 actual character pointer. */ 84 85 typedef struct bc_label_group 86 { 87 unsigned long l_adrs [ BC_LABEL_GROUP ]; 88 struct bc_label_group *l_next; 89 } bc_label_group; 90 91 /* Argument list. Recorded in the function so arguments can 92 be checked at call time. */ 93 94 typedef struct arg_list 95 { 96 int av_name; 97 int arg_is_var; /* Extension ... variable parameters. */ 98 struct arg_list *next; 99 } arg_list; 100 101 /* Each function has its own code segments and labels. There can be 102 no jumps between functions so labels are unique to a function. */ 103 104 typedef struct 105 { 106 char f_defined; /* Is this function defined yet. */ 107 char f_void; /* Is this function a void function. */ 108 char *f_body; 109 size_t f_body_size; /* Size of body. Power of 2. */ 110 size_t f_code_size; 111 bc_label_group *f_label; 112 arg_list *f_params; 113 arg_list *f_autos; 114 } bc_function; 115 116 /* Code addresses. */ 117 typedef struct { 118 unsigned int pc_func; 119 unsigned int pc_addr; 120 } program_counter; 121 122 123 /* Variables are "pushable" (auto) and thus we need a stack mechanism. 124 This is built into the variable record. */ 125 126 typedef struct bc_var 127 { 128 bc_num v_value; 129 struct bc_var *v_next; 130 } bc_var; 131 132 133 /* bc arrays can also be "auto" variables and thus need the same 134 kind of stacking mechanisms. */ 135 136 typedef struct bc_array_node 137 { 138 union 139 { 140 bc_num n_num [NODE_SIZE]; 141 struct bc_array_node *n_down [NODE_SIZE]; 142 } n_items; 143 } bc_array_node; 144 145 typedef struct bc_array 146 { 147 bc_array_node *a_tree; 148 short a_depth; 149 } bc_array; 150 151 typedef struct bc_var_array 152 { 153 bc_array *a_value; 154 char a_param; 155 struct bc_var_array *a_next; 156 } bc_var_array; 157 158 159 /* For the stacks, execution and function, we need records to allow 160 for arbitrary size. */ 161 162 typedef struct estack_rec { 163 bc_num s_num; 164 struct estack_rec *s_next; 165 } estack_rec; 166 167 typedef struct fstack_rec { 168 int s_val; 169 struct fstack_rec *s_next; 170 } fstack_rec; 171 172 173 /* The following are for the name tree. */ 174 175 typedef struct id_rec { 176 char *id; /* The program name. */ 177 /* A name == 0 => nothing assigned yet. */ 178 int a_name; /* The array variable name (number). */ 179 int f_name; /* The function name (number). */ 180 int v_name; /* The variable name (number). */ 181 short balance; /* For the balanced tree. */ 182 struct id_rec *left, *right; /* Tree pointers. */ 183 } id_rec; 184 185 186 /* A list of files to process. */ 187 188 typedef struct file_node { 189 char *name; 190 struct file_node *next; 191 } file_node; 192 193 /* Macro Definitions */ 194 195 #if defined(LIBEDIT) 196 #define HISTORY_SIZE(n) history(hist, &histev, H_SETSIZE, n) 197 #define UNLIMIT_HISTORY history(hist, &histev, H_SETSIZE, INT_MAX) 198 #endif 199 200 #if defined(READLINE) 201 #define HISTORY_SIZE(n) stifle_history(n) 202 #define UNLIMIT_HISTORY unstifle_history() 203 #endif 204 205 /* Now the global variable declarations. */ 206 #include "global.h" 207