blob: fe8133c9cba1620e5c549a5a3404f426d674d22d [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 Howardd2a05252018-09-27 14:00:40 -060025#include <num.h>
Gavin Howardf456d372018-03-10 20:11:41 -070026
Gavin Howard29204d62018-09-28 09:44:35 -060027// ** Exclude start. **
Gavin Howard4ffe5a92018-09-26 20:58:31 -060028const char bc_name[] = "bc";
29const char dc_name[] = "dc";
Gavin Howard29204d62018-09-28 09:44:35 -060030// ** Exclude end. **
Gavin Howard4ffe5a92018-09-26 20:58:31 -060031
Gavin Howard86fb8d32018-09-25 18:00:06 -060032const char bc_header[] =
Gavin Howard73527d22018-09-25 17:43:34 -060033 "bc 1.0\n"
Gavin Howardcdcae372018-09-26 16:49:04 -060034 "Copyright (c) 2018 Gavin D. Howard and contributors\n"
Gavin Howard73527d22018-09-25 17:43:34 -060035 "Report bugs at: https://github.com/gavinhoward/bc\n\n"
Gavin Howard41044032018-09-27 10:49:51 -060036 "This is free software with ABSOLUTELY NO WARRANTY.\n";
Gavin Howardf456d372018-03-10 20:11:41 -070037
Gavin Howard42941792018-10-03 11:20:22 -060038const char bc_err_fmt[] = "\n%s error: %s\n";
Gavin Howardc9a9c472018-10-02 17:23:01 -060039const char bc_err_line[] = ":%zu\n\n";
Gavin Howard79ce08b2018-06-21 16:21:55 -060040
41const char *bc_errs[] = {
Gavin Howard73527d22018-09-25 17:43:34 -060042 "VM",
43 "Lex",
44 "Parse",
45 "Math",
46 "Runtime",
47 "POSIX",
Gavin Howard9a65a4e2018-03-15 18:26:57 -060048};
Gavin Howardf456d372018-03-10 20:11:41 -070049
Gavin Howard79ce08b2018-06-21 16:21:55 -060050const uint8_t bc_err_indices[] = {
Gavin Howard73527d22018-09-25 17:43:34 -060051 BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM,
52 BC_ERR_IDX_LEX, BC_ERR_IDX_LEX, BC_ERR_IDX_LEX, BC_ERR_IDX_LEX,
53 BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
54 BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
55 BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH,
56 BC_ERR_IDX_MATH, BC_ERR_IDX_MATH,
Gavin Howardba009802018-09-29 04:41:51 -060057#ifdef DC_CONFIG
58 BC_ERR_IDX_MATH,
59#endif // DC_CONFIG
Gavin Howard73527d22018-09-25 17:43:34 -060060 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
61 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
62 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
63 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
Gavin Howard044644b2018-10-02 14:42:45 -060064 BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
Gavin Howard73527d22018-09-25 17:43:34 -060065 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
66 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
67 BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX, BC_ERR_IDX_POSIX,
68 BC_ERR_IDX_VEC, BC_ERR_IDX_VEC,
69 BC_ERR_IDX_VM, BC_ERR_IDX_VM, BC_ERR_IDX_VM,
Gavin Howardf456d372018-03-10 20:11:41 -070070};
71
72const char *bc_err_descs[] = {
Gavin Howard0790bca2018-09-22 19:44:35 -060073
Gavin Howard73527d22018-09-25 17:43:34 -060074 NULL,
75 "memory allocation error",
76 "I/O error",
77 "file is not text:",
Gavin Howarde77b83d2018-03-29 14:24:26 -060078
Gavin Howard73527d22018-09-25 17:43:34 -060079 "bad character",
80 "string end could not be found",
81 "comment end could not be found",
82 "end of file",
Gavin Howardf456d372018-03-10 20:11:41 -070083
Gavin Howard73527d22018-09-25 17:43:34 -060084 "bad token",
85 "bad expression",
Gavin Howard6d632e92018-09-28 11:26:23 -060086 "empty expression",
Gavin Howard73527d22018-09-25 17:43:34 -060087 "bad print statement",
88 "bad function definition",
89 "bad assignment: left side must be scale, ibase, "
90 "obase, last, var, or array element",
91 "no auto variable found",
92 "function parameter or auto var has the same name as another",
93 "block end could not be found",
Gavin Howardf456d372018-03-10 20:11:41 -070094
Gavin Howard73527d22018-09-25 17:43:34 -060095 "negative number",
96 "non integer number",
97 "overflow",
98 "divide by zero",
99 "negative square root",
100 "bad number string",
Gavin Howardba009802018-09-29 04:41:51 -0600101#ifdef DC_CONFIG
102 "modulus overflowed base",
103#endif // DC_CONFIG
Gavin Howardf456d372018-03-10 20:11:41 -0700104
Gavin Howard73527d22018-09-25 17:43:34 -0600105 "could not open file:",
106 "mismatched parameters",
107 "undefined function",
108 "file is not executable:",
109 "could not install signal handler",
110 "bad scale; must be [0, BC_SCALE_MAX]",
111 "bad ibase; must be [2, 16]",
112 "bad obase; must be [2, BC_BASE_MAX]",
113 "number too long: must be [1, BC_NUM_MAX]",
114 "name too long: must be [1, BC_NAME_MAX]",
115 "string too long: must be [1, BC_STRING_MAX]",
116 "array too long; must be [1, BC_DIM_MAX]",
117 "bad read() expression",
118 "read() call inside of a read() call",
119 "variable is wrong type",
120 "signal caught",
Gavin Howardc935ff12018-09-29 02:18:45 -0600121 "stack has too few elements",
Gavin Howardf456d372018-03-10 20:11:41 -0700122
Gavin Howard73527d22018-09-25 17:43:34 -0600123 "POSIX only allows one character names; the following is bad:",
124 "POSIX does not allow '#' script comments",
125 "POSIX does not allow the following keyword:",
126 "POSIX does not allow a period ('.') as a shortcut for the last result",
127 "POSIX requires parentheses around return expressions",
128 "POSIX does not allow boolean operators; the following is bad:",
129 "POSIX does not allow comparison operators outside if or loops",
130 "POSIX requires exactly one comparison operator per condition",
131 "POSIX does not allow an empty init expression in a for loop",
132 "POSIX does not allow an empty condition expression in a for loop",
133 "POSIX does not allow an empty update expression in a for loop",
134 "POSIX requires the left brace be on the same line as the function header",
Gavin Howarda0492142018-08-29 15:28:35 -0600135
Gavin Howard73527d22018-09-25 17:43:34 -0600136 "index is out of bounds",
137 "item already exists",
Gavin Howardc4fab672018-09-28 18:58:45 -0600138
Gavin Howard5f0cf2c2018-08-31 20:22:34 -0600139#ifndef NDEBUG
Gavin Howard73527d22018-09-25 17:43:34 -0600140 "quit request not honored",
141 "limits request not honored",
Gavin Howardc3a66802018-09-04 16:53:26 -0600142#endif // NDEBUG
Gavin Howard0790bca2018-09-22 19:44:35 -0600143
Gavin Howardf456d372018-03-10 20:11:41 -0700144};
145
Gavin Howard67598a72018-06-21 15:04:07 -0600146const char bc_sig_msg[34] = "\ninterrupt (type \"quit\" to exit)\n";
Gavin Howardf456d372018-03-10 20:11:41 -0700147
Gavin Howard3bc436f2018-09-28 14:02:34 -0600148const char bc_func_main[] = "(main)";
149const char bc_func_read[] = "(read)";
Gavin Howardff66e292018-03-28 12:47:58 -0600150
Gavin Howarde0eec662018-03-29 17:53:20 -0600151#ifndef NDEBUG
Gavin Howard3bc436f2018-09-28 14:02:34 -0600152const char bc_inst_chars[] =
Gavin Howard044644b2018-10-02 14:42:45 -0600153 "edED_^*/%+-=;?~<>!|&`{}@[],NVMACaI.LlrOqpQsSJjPR$HovxzcZdfghkK";
Gavin Howarde0eec662018-03-29 17:53:20 -0600154#endif // NDEBUG
Gavin Howard101b5e62018-03-26 07:46:27 -0600155
Gavin Howard634b6002018-09-28 19:52:17 -0600156#ifdef DC_CONFIG
157const uint8_t bc_inst_noperands[] = {
Gavin Howard88cbe152018-09-28 14:03:57 -0600158 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2,
159 2, 2, 2, 2, 2, 2, 2, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1,
Gavin Howard3a714ae2018-09-29 19:56:47 -0600160 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 3, 2, 1, 0, 0, 0, 1, 2, 1, 0, 0, 1,
Gavin Howard88cbe152018-09-28 14:03:57 -0600161};
162
Gavin Howard634b6002018-09-28 19:52:17 -0600163const uint8_t bc_inst_nresults[] = {
164 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
165 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1,
Gavin Howard3a714ae2018-09-29 19:56:47 -0600166 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 2, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0,
Gavin Howard634b6002018-09-28 19:52:17 -0600167};
168#endif // DC_CONFIG
169
Gavin Howard29204d62018-09-28 09:44:35 -0600170#ifdef BC_CONFIG
Gavin Howard63738202018-09-26 15:34:20 -0600171const BcLexKeyword bc_lex_kws[20] = {
Gavin Howard73527d22018-09-25 17:43:34 -0600172 BC_LEX_KW_ENTRY("auto", 4, true),
173 BC_LEX_KW_ENTRY("break", 5, true),
174 BC_LEX_KW_ENTRY("continue", 8, false),
175 BC_LEX_KW_ENTRY("define", 6, true),
176 BC_LEX_KW_ENTRY("else", 4, false),
177 BC_LEX_KW_ENTRY("for", 3, true),
178 BC_LEX_KW_ENTRY("halt", 4, false),
179 BC_LEX_KW_ENTRY("ibase", 5, true),
180 BC_LEX_KW_ENTRY("if", 2, true),
181 BC_LEX_KW_ENTRY("last", 4, false),
182 BC_LEX_KW_ENTRY("length", 6, true),
183 BC_LEX_KW_ENTRY("limits", 6, false),
184 BC_LEX_KW_ENTRY("obase", 5, true),
185 BC_LEX_KW_ENTRY("print", 5, false),
186 BC_LEX_KW_ENTRY("quit", 4, true),
187 BC_LEX_KW_ENTRY("read", 4, false),
188 BC_LEX_KW_ENTRY("return", 6, true),
189 BC_LEX_KW_ENTRY("scale", 5, true),
190 BC_LEX_KW_ENTRY("sqrt", 4, true),
191 BC_LEX_KW_ENTRY("while", 5, true),
Gavin Howardf456d372018-03-10 20:11:41 -0700192};
193
Gavin Howardf456d372018-03-10 20:11:41 -0700194// This is an array that corresponds to token types. An entry is
195// true if the token is valid in an expression, false otherwise.
Gavin Howard9520b202018-09-28 12:04:14 -0600196const bool bc_parse_exprs[] = {
Gavin Howard65a0c772018-09-28 12:50:18 -0600197 false, false, true, true, true, true, true, true, true, true, true, true,
198 true, true, true, true, true, true, true, true, true, true, true, true,
199 true, true, true, false, false, true, true, false, false, false, false,
200 false, false, false, true, true, false, false, false, false, false, false,
Gavin Howardc9a9c472018-10-02 17:23:01 -0600201 false, true, false, true, true, true, true, false, false, true, false, true,
Gavin Howard65a0c772018-09-28 12:50:18 -0600202 true, false,
Gavin Howardf456d372018-03-10 20:11:41 -0700203};
204
205// This is an array of data for operators that correspond to token types.
Gavin Howardf456d372018-03-10 20:11:41 -0700206const BcOp bc_parse_ops[] = {
Gavin Howard73527d22018-09-25 17:43:34 -0600207 { 0, false }, { 0, false },
208 { 1, false },
209 { 2, false },
210 { 3, true }, { 3, true }, { 3, true },
211 { 4, true }, { 4, true },
212 { 6, true }, { 6, true }, { 6, true }, { 6, true }, { 6, true }, { 6, true },
213 { 1, false },
214 { 7, true }, { 7, true },
215 { 5, false }, { 5, false }, { 5, false }, { 5, false }, { 5, false },
216 { 5, false }, { 5, false },
Gavin Howardf456d372018-03-10 20:11:41 -0700217};
218
Gavin Howard29204d62018-09-28 09:44:35 -0600219// These identify what tokens can come after expressions in certain cases.
220const BcParseNext bc_parse_next_expr =
221 BC_PARSE_NEXT(3, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_RBRACE);
222const BcParseNext bc_parse_next_param =
223 BC_PARSE_NEXT(2, BC_LEX_RPAREN, BC_LEX_COMMA);
224const BcParseNext bc_parse_next_print =
225 BC_PARSE_NEXT(3, BC_LEX_COMMA, BC_LEX_NLINE, BC_LEX_SCOLON);
226const BcParseNext bc_parse_next_cond = BC_PARSE_NEXT(1, BC_LEX_RPAREN);
227const BcParseNext bc_parse_next_elem = BC_PARSE_NEXT(1, BC_LEX_RBRACKET);
228const BcParseNext bc_parse_next_for = BC_PARSE_NEXT(1, BC_LEX_SCOLON);
229#endif // BC_CONFIG
230
231// This one is needed for dc too.
232const BcParseNext bc_parse_next_read = BC_PARSE_NEXT(1, BC_LEX_NLINE);
233
Gavin Howardc246baf2018-09-28 09:49:49 -0600234#ifdef DC_CONFIG
Gavin Howard2b9aa8a2018-09-28 12:49:41 -0600235const BcLexType dc_lex_tokens[] = {
Gavin Howardc246baf2018-09-28 09:49:49 -0600236 BC_LEX_OP_MODULUS, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_OP_REL_GT,
237 BC_LEX_INVALID, BC_LEX_OP_MULTIPLY, BC_LEX_OP_PLUS, BC_LEX_INVALID,
238 BC_LEX_OP_MINUS, BC_LEX_INVALID, BC_LEX_OP_DIVIDE,
239 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
240 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
241 BC_LEX_INVALID, BC_LEX_INVALID,
242 BC_LEX_COLON, BC_LEX_COLON, BC_LEX_OP_REL_LT, BC_LEX_OP_REL_EQ,
243 BC_LEX_OP_REL_GT, BC_LEX_KEY_READ, BC_LEX_INVALID,
244 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
245 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_OP_REL_EQ, BC_LEX_INVALID,
246 BC_LEX_KEY_IBASE, BC_LEX_INVALID, BC_LEX_KEY_SCALE, BC_LEX_LOAD,
Gavin Howard634b6002018-09-28 19:52:17 -0600247 BC_LEX_INVALID, BC_LEX_OP_BOOL_NOT, BC_LEX_KEY_OBASE, BC_LEX_PRINT_STREAM,
Gavin Howardc246baf2018-09-28 09:49:49 -0600248 BC_LEX_NQUIT, BC_LEX_POP, BC_LEX_STORE, BC_LEX_INVALID, BC_LEX_INVALID,
249 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_SCALE_FACTOR, BC_LEX_INVALID,
250 BC_LEX_KEY_LENGTH,
251 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_OP_POWER,
Gavin Howard62525842018-10-01 12:41:50 -0600252 BC_LEX_NEG, BC_LEX_INVALID,
Gavin Howard3a714ae2018-09-29 19:56:47 -0600253 BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_CLEAR_STACK, BC_LEX_DUPLICATE,
Gavin Howardc246baf2018-09-28 09:49:49 -0600254 BC_LEX_INVALID, BC_LEX_PRINT_STACK, BC_LEX_INVALID, BC_LEX_INVALID,
Gavin Howardc935ff12018-09-29 02:18:45 -0600255 BC_LEX_STORE_IBASE, BC_LEX_INVALID, BC_LEX_STORE_SCALE, BC_LEX_LOAD_POP,
Gavin Howard634b6002018-09-28 19:52:17 -0600256 BC_LEX_INVALID, BC_LEX_PRINT_POP, BC_LEX_STORE_OBASE, BC_LEX_KEY_PRINT,
Gavin Howardc935ff12018-09-29 02:18:45 -0600257 BC_LEX_KEY_QUIT, BC_LEX_SWAP, BC_LEX_STORE_PUSH, BC_LEX_INVALID,
Gavin Howardc246baf2018-09-28 09:49:49 -0600258 BC_LEX_INVALID, BC_LEX_KEY_SQRT, BC_LEX_INVALID, BC_LEX_EXECUTE,
259 BC_LEX_INVALID, BC_LEX_STACK_LEVEL,
260 BC_LEX_OP_REL_GE, BC_LEX_OP_MODEXP, BC_LEX_INVALID, BC_LEX_OP_DIVMOD,
261 BC_LEX_INVALID
262};
Gavin Howard88cbe152018-09-28 14:03:57 -0600263
264const BcInst dc_parse_insts[] = {
265 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
Gavin Howardc079d552018-10-01 12:38:54 -0600266 BC_INST_INVALID, BC_INST_POWER, BC_INST_MULTIPLY, BC_INST_DIVIDE,
Gavin Howard88cbe152018-09-28 14:03:57 -0600267 BC_INST_MODULUS, BC_INST_PLUS, BC_INST_MINUS,
268 BC_INST_REL_EQ, BC_INST_REL_LE, BC_INST_REL_GE, BC_INST_REL_NE,
269 BC_INST_REL_LT, BC_INST_REL_GT,
Gavin Howard634b6002018-09-28 19:52:17 -0600270 BC_INST_BOOL_NOT, BC_INST_INVALID, BC_INST_INVALID,
Gavin Howard88cbe152018-09-28 14:03:57 -0600271 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
272 BC_INST_INVALID, BC_INST_INVALID, BC_INST_ASSIGN,
273 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
274 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
275 BC_INST_ARRAY_ELEM, BC_INST_INVALID,
276 BC_INST_STR, BC_INST_INVALID, BC_INST_INVALID,
277 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
278 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_IBASE,
279 BC_INST_INVALID, BC_INST_INVALID, BC_INST_LENGTH, BC_INST_INVALID,
Gavin Howardc935ff12018-09-29 02:18:45 -0600280 BC_INST_OBASE, BC_INST_PRINT, BC_INST_QUIT, BC_INST_READ,
Gavin Howard88cbe152018-09-28 14:03:57 -0600281 BC_INST_INVALID, BC_INST_SCALE, BC_INST_SQRT, BC_INST_INVALID,
Gavin Howard3a714ae2018-09-29 19:56:47 -0600282 BC_INST_MODEXP, BC_INST_DIVMOD, BC_INST_INVALID, BC_INST_EXECUTE,
283 BC_INST_PRINT_STACK, BC_INST_CLEAR_STACK,
Gavin Howard634b6002018-09-28 19:52:17 -0600284 BC_INST_STACK_LEN, BC_INST_DUPLICATE, BC_INST_SWAP, BC_INST_POP,
Gavin Howard88cbe152018-09-28 14:03:57 -0600285 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
286 BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_PRINT,
Gavin Howardc935ff12018-09-29 02:18:45 -0600287 BC_INST_INVALID, BC_INST_NQUIT, BC_INST_SCALE_FUNC,
Gavin Howard88cbe152018-09-28 14:03:57 -0600288};
Gavin Howardc246baf2018-09-28 09:49:49 -0600289#endif // DC_CONFIG
290
Gavin Howard29204d62018-09-28 09:44:35 -0600291const char bc_num_hex_digits[] = "0123456789ABCDEF";
292
Gavin Howardce8fb792018-09-04 15:08:36 -0600293const BcNumBinaryOp bc_program_ops[] = {
Gavin Howard73527d22018-09-25 17:43:34 -0600294 bc_num_pow, bc_num_mul, bc_num_div, bc_num_mod, bc_num_add, bc_num_sub,
Gavin Howardf456d372018-03-10 20:11:41 -0700295};
296
Gavin Howardff66e292018-03-28 12:47:58 -0600297const char bc_program_stdin_name[] = "<stdin>";
Gavin Howard63738202018-09-26 15:34:20 -0600298const char bc_program_ready_msg[] = "ready for more input\n";