blob: ac7eb5ea6b3f212bac63a15152c242891d4b1ea2 [file] [log] [blame]
Gavin Howardf456d372018-03-10 20:11:41 -07001/*
2 * *****************************************************************************
3 *
4 * Copyright 2018 Gavin D. Howard
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
16 *
17 * *****************************************************************************
18 *
19 * Constant data for bc.
20 *
21 */
22
Gavin Howardf456d372018-03-10 20:11:41 -070023#include <lex.h>
24#include <parse.h>
Gavin Howard707a4e32018-10-03 16:36:41 -060025#include <bc.h>
Gavin Howardd2a05252018-09-27 14:00:40 -060026#include <num.h>
Gavin Howardf456d372018-03-10 20:11:41 -070027
Gavin Howarda95501a2018-10-03 16:13:34 -060028#ifdef BC_ENABLED
Gavin Howard29204d62018-09-28 09:44:35 -060029// ** Exclude start. **
Gavin Howard4ffe5a92018-09-26 20:58:31 -060030const char bc_name[] = "bc";
Gavin Howard29204d62018-09-28 09:44:35 -060031// ** Exclude end. **
Gavin Howarda95501a2018-10-03 16:13:34 -060032const char bc_sig_msg[] = "\ninterrupt (type \"quit\" to exit)\n";
33#endif // BC_ENABLED
Gavin Howard4ffe5a92018-09-26 20:58:31 -060034
Gavin Howarda95501a2018-10-03 16:13:34 -060035#ifdef DC_ENABLED
36const char dc_name[] = "dc";
37const char dc_sig_msg[] = "\ninturrupt (type \"q\" to exit)\n";
38#endif // DC_ENABLED
39
40const char bc_copyright[] =
Gavin Howardcdcae372018-09-26 16:49:04 -060041 "Copyright (c) 2018 Gavin D. Howard and contributors\n"
Gavin Howard73527d22018-09-25 17:43:34 -060042 "Report bugs at: https://github.com/gavinhoward/bc\n\n"
Gavin Howard41044032018-09-27 10:49:51 -060043 "This is free software with ABSOLUTELY NO WARRANTY.\n";
Gavin Howardf456d372018-03-10 20:11:41 -070044
Gavin Howard42941792018-10-03 11:20:22 -060045const char bc_err_fmt[] = "\n%s error: %s\n";
Gavin Howardc9a9c472018-10-02 17:23:01 -060046const char bc_err_line[] = ":%zu\n\n";
Gavin Howard79ce08b2018-06-21 16:21:55 -060047
48const char *bc_errs[] = {
Gavin Howard73527d22018-09-25 17:43:34 -060049 "VM",
50 "Lex",
51 "Parse",
52 "Math",
53 "Runtime",
54 "POSIX",
Gavin Howard9a65a4e2018-03-15 18:26:57 -060055};
Gavin Howardf456d372018-03-10 20:11:41 -070056
Gavin Howard79ce08b2018-06-21 16:21:55 -060057const uint8_t bc_err_indices[] = {
Gavin Howard73527d22018-09-25 17:43:34 -060058 BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM,
59 BC_ERR_IDX_LEX, BC_ERR_IDX_LEX, BC_ERR_IDX_LEX, BC_ERR_IDX_LEX,
Gavin Howard8412ba82018-10-04 13:03:24 -060060#ifdef DC_ENABLED
61 BC_ERR_IDX_LEX,
62#endif // DC_ENABLED
Gavin Howard73527d22018-09-25 17:43:34 -060063 BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
64 BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
65 BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH,
66 BC_ERR_IDX_MATH, BC_ERR_IDX_MATH,
Gavin Howarde6e84762018-10-03 11:46:34 -060067#ifdef DC_ENABLED
Gavin Howardba009802018-09-29 04:41:51 -060068 BC_ERR_IDX_MATH,
Gavin Howarde6e84762018-10-03 11:46:34 -060069#endif // DC_ENABLED
Gavin Howard73527d22018-09-25 17:43:34 -060070 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
71 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
72 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
73 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
Gavin Howard044644b2018-10-02 14:42:45 -060074 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
Gavin Howard73527d22018-09-25 17:43:34 -060075 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
76 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
77 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
78 BC_ERR_IDX_VEC, BC_ERR_IDX_VEC,
79 BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM,
Gavin Howardf456d372018-03-10 20:11:41 -070080};
81
82const char *bc_err_descs[] = {
Gavin Howard0790bca2018-09-22 19:44:35 -060083
Gavin Howard73527d22018-09-25 17:43:34 -060084 NULL,
85 "memory allocation error",
86 "I/O error",
87 "file is not text:",
Gavin Howarde77b83d2018-03-29 14:24:26 -060088
Gavin Howard73527d22018-09-25 17:43:34 -060089 "bad character",
90 "string end could not be found",
91 "comment end could not be found",
92 "end of file",
Gavin Howard8412ba82018-10-04 13:03:24 -060093#ifdef DC_ENABLED
94 "extended register",
95#endif // DC_ENABLED
Gavin Howardf456d372018-03-10 20:11:41 -070096
Gavin Howard73527d22018-09-25 17:43:34 -060097 "bad token",
98 "bad expression",
Gavin Howard6d632e92018-09-28 11:26:23 -060099 "empty expression",
Gavin Howard73527d22018-09-25 17:43:34 -0600100 "bad print statement",
101 "bad function definition",
102 "bad assignment: left side must be scale, ibase, "
103 "obase, last, var, or array element",
104 "no auto variable found",
105 "function parameter or auto var has the same name as another",
106 "block end could not be found",
Gavin Howardf456d372018-03-10 20:11:41 -0700107
Gavin Howard73527d22018-09-25 17:43:34 -0600108 "negative number",
109 "non integer number",
110 "overflow",
111 "divide by zero",
112 "negative square root",
113 "bad number string",
Gavin Howarde6e84762018-10-03 11:46:34 -0600114#ifdef DC_ENABLED
Gavin Howardba009802018-09-29 04:41:51 -0600115 "modulus overflowed base",
Gavin Howarde6e84762018-10-03 11:46:34 -0600116#endif // DC_ENABLED
Gavin Howardf456d372018-03-10 20:11:41 -0700117
Gavin Howard73527d22018-09-25 17:43:34 -0600118 "could not open file:",
119 "mismatched parameters",
120 "undefined function",
121 "file is not executable:",
122 "could not install signal handler",
123 "bad scale; must be [0, BC_SCALE_MAX]",
124 "bad ibase; must be [2, 16]",
125 "bad obase; must be [2, BC_BASE_MAX]",
126 "number too long: must be [1, BC_NUM_MAX]",
127 "name too long: must be [1, BC_NAME_MAX]",
128 "string too long: must be [1, BC_STRING_MAX]",
129 "array too long; must be [1, BC_DIM_MAX]",
130 "bad read() expression",
131 "read() call inside of a read() call",
132 "variable is wrong type",
133 "signal caught",
Gavin Howardc935ff12018-09-29 02:18:45 -0600134 "stack has too few elements",
Gavin Howardf456d372018-03-10 20:11:41 -0700135
Gavin Howard73527d22018-09-25 17:43:34 -0600136 "POSIX only allows one character names; the following is bad:",
137 "POSIX does not allow '#' script comments",
138 "POSIX does not allow the following keyword:",
139 "POSIX does not allow a period ('.') as a shortcut for the last result",
140 "POSIX requires parentheses around return expressions",
141 "POSIX does not allow boolean operators; the following is bad:",
142 "POSIX does not allow comparison operators outside if or loops",
143 "POSIX requires exactly one comparison operator per condition",
144 "POSIX does not allow an empty init expression in a for loop",
145 "POSIX does not allow an empty condition expression in a for loop",
146 "POSIX does not allow an empty update expression in a for loop",
147 "POSIX requires the left brace be on the same line as the function header",
Gavin Howarda0492142018-08-29 15:28:35 -0600148
Gavin Howard73527d22018-09-25 17:43:34 -0600149 "index is out of bounds",
150 "item already exists",
Gavin Howardc4fab672018-09-28 18:58:45 -0600151
Gavin Howard5f0cf2c2018-08-31 20:22:34 -0600152#ifndef NDEBUG
Gavin Howard73527d22018-09-25 17:43:34 -0600153 "quit request not honored",
154 "limits request not honored",
Gavin Howardc3a66802018-09-04 16:53:26 -0600155#endif // NDEBUG
Gavin Howard0790bca2018-09-22 19:44:35 -0600156
Gavin Howardf456d372018-03-10 20:11:41 -0700157};
158
Gavin Howard3bc436f2018-09-28 14:02:34 -0600159const char bc_func_main[] = "(main)";
160const char bc_func_read[] = "(read)";
Gavin Howardff66e292018-03-28 12:47:58 -0600161
Gavin Howarde0eec662018-03-29 17:53:20 -0600162#ifndef NDEBUG
Gavin Howard3bc436f2018-09-28 14:02:34 -0600163const char bc_inst_chars[] =
Gavin Howard044644b2018-10-02 14:42:45 -0600164 "edED_^*/%+-=;?~<>!|&`{}@[],NVMACaI.LlrOqpQsSJjPR$HovxzcZdfghkK";
Gavin Howarde0eec662018-03-29 17:53:20 -0600165#endif // NDEBUG
Gavin Howard101b5e62018-03-26 07:46:27 -0600166
Gavin Howarde6e84762018-10-03 11:46:34 -0600167#ifdef BC_ENABLED
Gavin Howard63738202018-09-26 15:34:20 -0600168const BcLexKeyword bc_lex_kws[20] = {
Gavin Howard73527d22018-09-25 17:43:34 -0600169 BC_LEX_KW_ENTRY("auto", 4, true),
170 BC_LEX_KW_ENTRY("break", 5, true),
171 BC_LEX_KW_ENTRY("continue", 8, false),
172 BC_LEX_KW_ENTRY("define", 6, true),
173 BC_LEX_KW_ENTRY("else", 4, false),
174 BC_LEX_KW_ENTRY("for", 3, true),
175 BC_LEX_KW_ENTRY("halt", 4, false),
176 BC_LEX_KW_ENTRY("ibase", 5, true),
177 BC_LEX_KW_ENTRY("if", 2, true),
178 BC_LEX_KW_ENTRY("last", 4, false),
179 BC_LEX_KW_ENTRY("length", 6, true),
180 BC_LEX_KW_ENTRY("limits", 6, false),
181 BC_LEX_KW_ENTRY("obase", 5, true),
182 BC_LEX_KW_ENTRY("print", 5, false),
183 BC_LEX_KW_ENTRY("quit", 4, true),
184 BC_LEX_KW_ENTRY("read", 4, false),
185 BC_LEX_KW_ENTRY("return", 6, true),
186 BC_LEX_KW_ENTRY("scale", 5, true),
187 BC_LEX_KW_ENTRY("sqrt", 4, true),
188 BC_LEX_KW_ENTRY("while", 5, true),
Gavin Howardf456d372018-03-10 20:11:41 -0700189};
190
Gavin Howardf456d372018-03-10 20:11:41 -0700191// This is an array that corresponds to token types. An entry is
192// true if the token is valid in an expression, false otherwise.
Gavin Howard9520b202018-09-28 12:04:14 -0600193const bool bc_parse_exprs[] = {
Gavin Howard65a0c772018-09-28 12:50:18 -0600194 false, false, true, true, true, true, true, true, true, true, true, true,
195 true, true, true, true, true, true, true, true, true, true, true, true,
196 true, true, true, false, false, true, true, false, false, false, false,
197 false, false, false, true, true, false, false, false, false, false, false,
Gavin Howardc9a9c472018-10-02 17:23:01 -0600198 false, true, false, true, true, true, true, false, false, true, false, true,
Gavin Howard65a0c772018-09-28 12:50:18 -0600199 true, false,
Gavin Howardf456d372018-03-10 20:11:41 -0700200};
201
202// This is an array of data for operators that correspond to token types.
Gavin Howardf456d372018-03-10 20:11:41 -0700203const BcOp bc_parse_ops[] = {
Gavin Howard73527d22018-09-25 17:43:34 -0600204 { 0, false }, { 0, false },
205 { 1, false },
206 { 2, false },
207 { 3, true }, { 3, true }, { 3, true },
208 { 4, true }, { 4, true },
209 { 6, true }, { 6, true }, { 6, true }, { 6, true }, { 6, true }, { 6, true },
210 { 1, false },
211 { 7, true }, { 7, true },
212 { 5, false }, { 5, false }, { 5, false }, { 5, false }, { 5, false },
213 { 5, false }, { 5, false },
Gavin Howardf456d372018-03-10 20:11:41 -0700214};
215
Gavin Howard29204d62018-09-28 09:44:35 -0600216// These identify what tokens can come after expressions in certain cases.
217const BcParseNext bc_parse_next_expr =
218 BC_PARSE_NEXT(3, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_RBRACE);
219const BcParseNext bc_parse_next_param =
220 BC_PARSE_NEXT(2, BC_LEX_RPAREN, BC_LEX_COMMA);
221const BcParseNext bc_parse_next_print =
222 BC_PARSE_NEXT(3, BC_LEX_COMMA, BC_LEX_NLINE, BC_LEX_SCOLON);
223const BcParseNext bc_parse_next_cond = BC_PARSE_NEXT(1, BC_LEX_RPAREN);
224const BcParseNext bc_parse_next_elem = BC_PARSE_NEXT(1, BC_LEX_RBRACKET);
225const BcParseNext bc_parse_next_for = BC_PARSE_NEXT(1, BC_LEX_SCOLON);
Gavin Howarde6e84762018-10-03 11:46:34 -0600226#endif // BC_ENABLED
Gavin Howard29204d62018-09-28 09:44:35 -0600227
228// This one is needed for dc too.
229const BcParseNext bc_parse_next_read = BC_PARSE_NEXT(1, BC_LEX_NLINE);
230
Gavin Howarde6e84762018-10-03 11:46:34 -0600231#ifdef DC_ENABLED
Gavin Howardc39fd492018-10-04 10:07:03 -0600232const uint8_t dc_inst_noperands[] = {
Gavin Howard849e9bd2018-10-04 14:26:36 -0600233 1, 1, 1, 1, 1,
234 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
235 1, 2, 2, 2, 2, 2, 2, 2, 2, 2,
236 0, 0, 1, 0, 0,
237 1, 0, 0, 0, 1, 0, 0, 1,
238 1, 1, 0, 1, 0, 1, 1, 1, 0, 0,
239 3, 2, 1, 0, 0, 0, 1, 2, 0, 1, 0, 1,
Gavin Howardc39fd492018-10-04 10:07:03 -0600240};
241
242const uint8_t dc_inst_nresults[] = {
Gavin Howard849e9bd2018-10-04 14:26:36 -0600243 1, 1, 1, 1, 1,
244 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
245 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
246 1, 1, 1, 1, 0,
247 1, 1, 1, 1, 1, 1, 1, 1,
248 1, 0, 1, 0, 0, 1, 0, 1, 1, 0,
249 1, 2, 0, 0, 0, 1, 2, 2, 1, 0, 0, 0,
Gavin Howardc39fd492018-10-04 10:07:03 -0600250};
251
Gavin Howard8412ba82018-10-04 13:03:24 -0600252const BcLexType dc_lex_regs[] = {
253 BC_LEX_OP_REL_EQ, BC_LEX_OP_REL_LE, BC_LEX_OP_REL_GE, BC_LEX_OP_REL_NE,
254 BC_LEX_OP_REL_LT, BC_LEX_OP_REL_GT, BC_LEX_SCOLON, BC_LEX_COLON,
255 BC_LEX_ELSE, BC_LEX_LOAD, BC_LEX_LOAD_POP, BC_LEX_STORE,BC_LEX_STORE_PUSH,
256};
257
258const size_t dc_lex_regs_len = sizeof(dc_lex_regs) / sizeof(BcLexType);
259
Gavin Howard2b9aa8a2018-09-28 12:49:41 -0600260const BcLexType dc_lex_tokens[] = {
Gavin Howard849e9bd2018-10-04 14:26:36 -0600261 BC_LEX_OP_MODULUS, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_LPAREN,
Gavin Howardc246baf2018-09-28 09:49:49 -0600262 BC_LEX_INVALID, BC_LEX_OP_MULTIPLY, BC_LEX_OP_PLUS, BC_LEX_INVALID,
263 BC_LEX_OP_MINUS, BC_LEX_INVALID, BC_LEX_OP_DIVIDE,
264 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
265 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
266 BC_LEX_INVALID, BC_LEX_INVALID,
Gavin Howard8412ba82018-10-04 13:03:24 -0600267 BC_LEX_COLON, BC_LEX_SCOLON, BC_LEX_INVALID, BC_LEX_INVALID,
268 BC_LEX_INVALID, BC_LEX_KEY_READ, BC_LEX_INVALID, BC_LEX_INVALID,
269 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_ELSE,
270 BC_LEX_INVALID, BC_LEX_EQ_NO_REG, BC_LEX_INVALID, BC_LEX_KEY_IBASE,
271 BC_LEX_INVALID, BC_LEX_KEY_SCALE, BC_LEX_LOAD, BC_LEX_INVALID,
272 BC_LEX_OP_BOOL_NOT, BC_LEX_KEY_OBASE, BC_LEX_PRINT_POP, BC_LEX_NQUIT,
273 BC_LEX_POP, BC_LEX_STORE, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
274 BC_LEX_INVALID, BC_LEX_SCALE_FACTOR, BC_LEX_INVALID, BC_LEX_KEY_LENGTH,
Gavin Howardc246baf2018-09-28 09:49:49 -0600275 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_OP_POWER,
Gavin Howard62525842018-10-01 12:41:50 -0600276 BC_LEX_NEG, BC_LEX_INVALID,
Gavin Howard3a714ae2018-09-29 19:56:47 -0600277 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_CLEAR_STACK, BC_LEX_DUPLICATE,
Gavin Howardc246baf2018-09-28 09:49:49 -0600278 BC_LEX_INVALID, BC_LEX_PRINT_STACK, BC_LEX_INVALID, BC_LEX_INVALID,
Gavin Howardc935ff12018-09-29 02:18:45 -0600279 BC_LEX_STORE_IBASE, BC_LEX_INVALID, BC_LEX_STORE_SCALE, BC_LEX_LOAD_POP,
Gavin Howard634b6002018-09-28 19:52:17 -0600280 BC_LEX_INVALID, BC_LEX_PRINT_POP, BC_LEX_STORE_OBASE, BC_LEX_KEY_PRINT,
Gavin Howardc935ff12018-09-29 02:18:45 -0600281 BC_LEX_KEY_QUIT, BC_LEX_SWAP, BC_LEX_STORE_PUSH, BC_LEX_INVALID,
Gavin Howardc246baf2018-09-28 09:49:49 -0600282 BC_LEX_INVALID, BC_LEX_KEY_SQRT, BC_LEX_INVALID, BC_LEX_EXECUTE,
283 BC_LEX_INVALID, BC_LEX_STACK_LEVEL,
Gavin Howard849e9bd2018-10-04 14:26:36 -0600284 BC_LEX_LBRACE, BC_LEX_OP_MODEXP, BC_LEX_INVALID, BC_LEX_OP_DIVMOD,
Gavin Howardc246baf2018-09-28 09:49:49 -0600285 BC_LEX_INVALID
286};
Gavin Howard88cbe152018-09-28 14:03:57 -0600287
288const BcInst dc_parse_insts[] = {
Gavin Howard849e9bd2018-10-04 14:26:36 -0600289 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GE,
Gavin Howardc079d552018-10-01 12:38:54 -0600290 BC_INST_INVALID, BC_INST_POWER, BC_INST_MULTIPLY, BC_INST_DIVIDE,
Gavin Howard88cbe152018-09-28 14:03:57 -0600291 BC_INST_MODULUS, BC_INST_PLUS, BC_INST_MINUS,
Gavin Howard849e9bd2018-10-04 14:26:36 -0600292 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
293 BC_INST_INVALID, BC_INST_INVALID,
Gavin Howard634b6002018-09-28 19:52:17 -0600294 BC_INST_BOOL_NOT, BC_INST_INVALID, BC_INST_INVALID,
Gavin Howard88cbe152018-09-28 14:03:57 -0600295 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
296 BC_INST_INVALID, BC_INST_INVALID, BC_INST_ASSIGN,
Gavin Howard849e9bd2018-10-04 14:26:36 -0600297 BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GT, BC_INST_INVALID,
298 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GE,
299 BC_INST_INVALID, BC_INST_INVALID,
Gavin Howard88cbe152018-09-28 14:03:57 -0600300 BC_INST_STR, BC_INST_INVALID, BC_INST_INVALID,
301 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
302 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_IBASE,
303 BC_INST_INVALID, BC_INST_INVALID, BC_INST_LENGTH, BC_INST_INVALID,
Gavin Howard1ce5ea92018-10-04 12:03:18 -0600304 BC_INST_OBASE, BC_INST_PRINT, BC_INST_QUIT, BC_INST_INVALID,
Gavin Howard88cbe152018-09-28 14:03:57 -0600305 BC_INST_INVALID, BC_INST_SCALE, BC_INST_SQRT, BC_INST_INVALID,
Gavin Howard8412ba82018-10-04 13:03:24 -0600306 BC_INST_REL_EQ, BC_INST_MODEXP, BC_INST_DIVMOD, BC_INST_INVALID,
Gavin Howard849e9bd2018-10-04 14:26:36 -0600307 BC_INST_INVALID, BC_INST_EXECUTE, BC_INST_PRINT_STACK, BC_INST_CLEAR_STACK,
Gavin Howard634b6002018-09-28 19:52:17 -0600308 BC_INST_STACK_LEN, BC_INST_DUPLICATE, BC_INST_SWAP, BC_INST_POP,
Gavin Howard88cbe152018-09-28 14:03:57 -0600309 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
310 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_PRINT,
Gavin Howardc935ff12018-09-29 02:18:45 -0600311 BC_INST_INVALID, BC_INST_NQUIT, BC_INST_SCALE_FUNC,
Gavin Howard88cbe152018-09-28 14:03:57 -0600312};
Gavin Howarde6e84762018-10-03 11:46:34 -0600313#endif // DC_ENABLED
Gavin Howardc246baf2018-09-28 09:49:49 -0600314
Gavin Howard29204d62018-09-28 09:44:35 -0600315const char bc_num_hex_digits[] = "0123456789ABCDEF";
316
Gavin Howardce8fb792018-09-04 15:08:36 -0600317const BcNumBinaryOp bc_program_ops[] = {
Gavin Howardbe53edd2018-10-04 10:55:08 -0600318 bc_num_pow, bc_num_mul, bc_num_div, bc_num_rem, bc_num_add, bc_num_sub,
Gavin Howardf456d372018-03-10 20:11:41 -0700319};
320
Gavin Howardff66e292018-03-28 12:47:58 -0600321const char bc_program_stdin_name[] = "<stdin>";
Gavin Howard63738202018-09-26 15:34:20 -0600322const char bc_program_ready_msg[] = "ready for more input\n";