xref: /freebsd/contrib/bc/src/data.c (revision 10041e99a0c29c9f99c4148fc173bb12dd26aa8d)
1252884aeSStefan Eßer /*
2252884aeSStefan Eßer  * *****************************************************************************
3252884aeSStefan Eßer  *
43aa99676SStefan Eßer  * SPDX-License-Identifier: BSD-2-Clause
5252884aeSStefan Eßer  *
610328f8bSStefan Eßer  * Copyright (c) 2018-2021 Gavin D. Howard and contributors.
7252884aeSStefan Eßer  *
8252884aeSStefan Eßer  * Redistribution and use in source and binary forms, with or without
9252884aeSStefan Eßer  * modification, are permitted provided that the following conditions are met:
10252884aeSStefan Eßer  *
11252884aeSStefan Eßer  * * Redistributions of source code must retain the above copyright notice, this
12252884aeSStefan Eßer  *   list of conditions and the following disclaimer.
13252884aeSStefan Eßer  *
14252884aeSStefan Eßer  * * Redistributions in binary form must reproduce the above copyright notice,
15252884aeSStefan Eßer  *   this list of conditions and the following disclaimer in the documentation
16252884aeSStefan Eßer  *   and/or other materials provided with the distribution.
17252884aeSStefan Eßer  *
18252884aeSStefan Eßer  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19252884aeSStefan Eßer  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20252884aeSStefan Eßer  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21252884aeSStefan Eßer  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22252884aeSStefan Eßer  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23252884aeSStefan Eßer  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24252884aeSStefan Eßer  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25252884aeSStefan Eßer  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26252884aeSStefan Eßer  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27252884aeSStefan Eßer  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28252884aeSStefan Eßer  * POSSIBILITY OF SUCH DAMAGE.
29252884aeSStefan Eßer  *
30252884aeSStefan Eßer  * *****************************************************************************
31252884aeSStefan Eßer  *
32252884aeSStefan Eßer  * Constant data for bc.
33252884aeSStefan Eßer  *
34252884aeSStefan Eßer  */
35252884aeSStefan Eßer 
3644d4804dSStefan Eßer #include <assert.h>
3744d4804dSStefan Eßer 
3844d4804dSStefan Eßer #include <opt.h>
39252884aeSStefan Eßer #include <args.h>
40252884aeSStefan Eßer #include <lex.h>
41252884aeSStefan Eßer #include <parse.h>
42252884aeSStefan Eßer #include <bc.h>
43252884aeSStefan Eßer #include <dc.h>
44252884aeSStefan Eßer #include <num.h>
45252884aeSStefan Eßer #include <rand.h>
46252884aeSStefan Eßer #include <program.h>
4744d4804dSStefan Eßer #include <history.h>
4844d4804dSStefan Eßer #include <library.h>
49252884aeSStefan Eßer #include <vm.h>
50252884aeSStefan Eßer 
5150696a6eSStefan Eßer #if !BC_ENABLE_LIBRARY
5250696a6eSStefan Eßer 
53252884aeSStefan Eßer #if BC_ENABLED
5444d4804dSStefan Eßer 
5544d4804dSStefan Eßer /// The bc signal message and its length.
56252884aeSStefan Eßer const char bc_sig_msg[] = "\ninterrupt (type \"quit\" to exit)\n";
57252884aeSStefan Eßer const uchar bc_sig_msg_len = (uchar) (sizeof(bc_sig_msg) - 1);
5844d4804dSStefan Eßer 
59252884aeSStefan Eßer #endif // BC_ENABLED
6044d4804dSStefan Eßer 
61252884aeSStefan Eßer #if DC_ENABLED
6244d4804dSStefan Eßer 
6344d4804dSStefan Eßer /// The dc signal message and its length.
64252884aeSStefan Eßer const char dc_sig_msg[] = "\ninterrupt (type \"q\" to exit)\n";
65252884aeSStefan Eßer const uchar dc_sig_msg_len = (uchar) (sizeof(dc_sig_msg) - 1);
6644d4804dSStefan Eßer 
67252884aeSStefan Eßer #endif // DC_ENABLED
68252884aeSStefan Eßer 
6944d4804dSStefan Eßer /// The copyright banner.
70252884aeSStefan Eßer const char bc_copyright[] =
7110328f8bSStefan Eßer 	"Copyright (c) 2018-2021 Gavin D. Howard and contributors\n"
72252884aeSStefan Eßer 	"Report bugs at: https://git.yzena.com/gavin/bc\n\n"
73252884aeSStefan Eßer 	"This is free software with ABSOLUTELY NO WARRANTY.\n";
74252884aeSStefan Eßer 
7544d4804dSStefan Eßer #ifdef __OpenBSD__
7644d4804dSStefan Eßer 
7744d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
7844d4804dSStefan Eßer 
7944d4804dSStefan Eßer #if BC_ENABLE_HISTORY
8044d4804dSStefan Eßer 
8144d4804dSStefan Eßer /// The pledges for starting bc.
8244d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio tty unveil";
8344d4804dSStefan Eßer 
8444d4804dSStefan Eßer /// The final pledges with history enabled.
8544d4804dSStefan Eßer const char bc_pledge_end_history[] = "rpath stdio tty";
8644d4804dSStefan Eßer 
8744d4804dSStefan Eßer #else // BC_ENABLE_HISTORY
8844d4804dSStefan Eßer 
8944d4804dSStefan Eßer /// The pledges for starting bc.
9044d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio unveil";
9144d4804dSStefan Eßer 
9244d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
9344d4804dSStefan Eßer 
9444d4804dSStefan Eßer /// The final pledges with history history disabled.
9544d4804dSStefan Eßer const char bc_pledge_end[] = "rpath stdio";
9644d4804dSStefan Eßer 
9744d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
9844d4804dSStefan Eßer 
9944d4804dSStefan Eßer #if BC_ENABLE_HISTORY
10044d4804dSStefan Eßer 
10144d4804dSStefan Eßer /// The pledges for starting bc.
10244d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio tty";
10344d4804dSStefan Eßer 
10444d4804dSStefan Eßer /// The final pledges with history enabled.
10544d4804dSStefan Eßer const char bc_pledge_end_history[] = "stdio tty";
10644d4804dSStefan Eßer 
10744d4804dSStefan Eßer #else // BC_ENABLE_HISTORY
10844d4804dSStefan Eßer 
10944d4804dSStefan Eßer /// The pledges for starting bc.
11044d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio";
11144d4804dSStefan Eßer 
11244d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
11344d4804dSStefan Eßer 
11444d4804dSStefan Eßer /// The final pledges with history history disabled.
11544d4804dSStefan Eßer const char bc_pledge_end[] = "stdio";
11644d4804dSStefan Eßer 
11744d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
11844d4804dSStefan Eßer 
11944d4804dSStefan Eßer #else // __OpenBSD__
12044d4804dSStefan Eßer 
12144d4804dSStefan Eßer /// The pledges for starting bc.
12244d4804dSStefan Eßer const char bc_pledge_start[] = "";
12344d4804dSStefan Eßer 
12444d4804dSStefan Eßer #if BC_ENABLE_HISTORY
12544d4804dSStefan Eßer 
12644d4804dSStefan Eßer /// The final pledges with history enabled.
12744d4804dSStefan Eßer const char bc_pledge_end_history[] = "";
12844d4804dSStefan Eßer 
12944d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
13044d4804dSStefan Eßer 
13144d4804dSStefan Eßer /// The final pledges with history history disabled.
13244d4804dSStefan Eßer const char bc_pledge_end[] = "";
13344d4804dSStefan Eßer 
13444d4804dSStefan Eßer #endif // __OpenBSD__
13544d4804dSStefan Eßer 
13644d4804dSStefan Eßer /// The list of long options. There is a zero set at the end for detecting the
13744d4804dSStefan Eßer /// end.
13844d4804dSStefan Eßer const BcOptLong bc_args_lopt[] = {
13944d4804dSStefan Eßer 
14044d4804dSStefan Eßer 	{ "expression", BC_OPT_REQUIRED, 'e' },
14144d4804dSStefan Eßer 	{ "file", BC_OPT_REQUIRED, 'f' },
14244d4804dSStefan Eßer 	{ "help", BC_OPT_NONE, 'h' },
14344d4804dSStefan Eßer 	{ "interactive", BC_OPT_NONE, 'i' },
144d43fa8efSStefan Eßer 	{ "leading-zeroes", BC_OPT_NONE, 'z' },
145d43fa8efSStefan Eßer 	{ "no-line-length", BC_OPT_NONE, 'L' },
14644d4804dSStefan Eßer 	{ "no-prompt", BC_OPT_NONE, 'P' },
14744d4804dSStefan Eßer 	{ "no-read-prompt", BC_OPT_NONE, 'R' },
14844d4804dSStefan Eßer #if BC_ENABLED
14944d4804dSStefan Eßer 	{ "global-stacks", BC_OPT_BC_ONLY, 'g' },
15044d4804dSStefan Eßer 	{ "mathlib", BC_OPT_BC_ONLY, 'l' },
15144d4804dSStefan Eßer 	{ "quiet", BC_OPT_BC_ONLY, 'q' },
15244d4804dSStefan Eßer 	{ "redefine", BC_OPT_REQUIRED_BC_ONLY, 'r' },
15344d4804dSStefan Eßer 	{ "standard", BC_OPT_BC_ONLY, 's' },
15444d4804dSStefan Eßer 	{ "warn", BC_OPT_BC_ONLY, 'w' },
15544d4804dSStefan Eßer #endif // BC_ENABLED
15644d4804dSStefan Eßer 	{ "version", BC_OPT_NONE, 'v' },
15744d4804dSStefan Eßer 	{ "version", BC_OPT_NONE, 'V' },
15844d4804dSStefan Eßer #if DC_ENABLED
15944d4804dSStefan Eßer 	{ "extended-register", BC_OPT_DC_ONLY, 'x' },
16044d4804dSStefan Eßer #endif // DC_ENABLED
16144d4804dSStefan Eßer 	{ NULL, 0, 0 },
16244d4804dSStefan Eßer 
16344d4804dSStefan Eßer };
16444d4804dSStefan Eßer 
16544d4804dSStefan Eßer /// The function header for error messages.
166252884aeSStefan Eßer const char* const bc_err_func_header = "Function:";
16744d4804dSStefan Eßer 
16844d4804dSStefan Eßer /// The line format string for error messages.
169252884aeSStefan Eßer const char* const bc_err_line = ":%zu";
170252884aeSStefan Eßer 
17144d4804dSStefan Eßer /// The default error category strings.
172252884aeSStefan Eßer const char *bc_errs[] = {
173252884aeSStefan Eßer 	"Math error:",
174252884aeSStefan Eßer 	"Parse error:",
175252884aeSStefan Eßer 	"Runtime error:",
176252884aeSStefan Eßer 	"Fatal error:",
177252884aeSStefan Eßer #if BC_ENABLED
178252884aeSStefan Eßer 	"Warning:",
179252884aeSStefan Eßer #endif // BC_ENABLED
180252884aeSStefan Eßer };
181252884aeSStefan Eßer 
18244d4804dSStefan Eßer /// The error category for each error.
183252884aeSStefan Eßer const uchar bc_err_ids[] = {
184252884aeSStefan Eßer 
185252884aeSStefan Eßer 	BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH,
186252884aeSStefan Eßer 
187252884aeSStefan Eßer 	BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL,
188252884aeSStefan Eßer 	BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL,
18944d4804dSStefan Eßer 	BC_ERR_IDX_FATAL,
190252884aeSStefan Eßer 
191252884aeSStefan Eßer 	BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
192252884aeSStefan Eßer 	BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
19344d4804dSStefan Eßer 	BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
194252884aeSStefan Eßer 
195252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
196252884aeSStefan Eßer 	BC_ERR_IDX_PARSE,
197252884aeSStefan Eßer #if BC_ENABLED
198252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
199252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
200252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
201252884aeSStefan Eßer 
202252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
203252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
204252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
205*10041e99SStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
206252884aeSStefan Eßer #endif // BC_ENABLED
207252884aeSStefan Eßer 
208252884aeSStefan Eßer };
209252884aeSStefan Eßer 
21044d4804dSStefan Eßer /// The default error messages. There are NULL pointers because the positions
21144d4804dSStefan Eßer /// must be preserved for the locales.
212252884aeSStefan Eßer const char* const bc_err_msgs[] = {
213252884aeSStefan Eßer 
214252884aeSStefan Eßer 	"negative number",
215252884aeSStefan Eßer 	"non-integer number",
216252884aeSStefan Eßer 	"overflow: number cannot fit",
217252884aeSStefan Eßer 	"divide by 0",
218252884aeSStefan Eßer 
219252884aeSStefan Eßer 	"memory allocation failed",
220252884aeSStefan Eßer 	"I/O error",
221252884aeSStefan Eßer 	"cannot open file: %s",
22244d4804dSStefan Eßer 	"file is not text: %s",
223252884aeSStefan Eßer 	"path is a directory: %s",
224252884aeSStefan Eßer 	"bad command-line option: \"%s\"",
225252884aeSStefan Eßer 	"option requires an argument: '%c' (\"%s\")",
226252884aeSStefan Eßer 	"option takes no arguments: '%c' (\"%s\")",
22744d4804dSStefan Eßer 	"bad option argument: \"%s\"",
228252884aeSStefan Eßer 
229252884aeSStefan Eßer 	"bad ibase: must be [%lu, %lu]",
230252884aeSStefan Eßer 	"bad obase: must be [%lu, %lu]",
231252884aeSStefan Eßer 	"bad scale: must be [%lu, %lu]",
232252884aeSStefan Eßer 	"bad read() expression",
233252884aeSStefan Eßer 	"read() call inside of a read() call",
234252884aeSStefan Eßer 	"variable or array element is the wrong type",
235252884aeSStefan Eßer #if DC_ENABLED
236252884aeSStefan Eßer 	"stack has too few elements",
23744d4804dSStefan Eßer 	"stack for register \"%s\" has too few elements",
238252884aeSStefan Eßer #else // DC_ENABLED
23944d4804dSStefan Eßer 	NULL, NULL,
240252884aeSStefan Eßer #endif // DC_ENABLED
241252884aeSStefan Eßer #if BC_ENABLED
242252884aeSStefan Eßer 	"wrong number of parameters; need %zu, have %zu",
243252884aeSStefan Eßer 	"undefined function: %s()",
244252884aeSStefan Eßer 	"cannot use a void value in an expression",
245252884aeSStefan Eßer #else
246252884aeSStefan Eßer 	NULL, NULL, NULL,
247252884aeSStefan Eßer #endif // BC_ENABLED
248252884aeSStefan Eßer 
249252884aeSStefan Eßer 	"end of file",
250252884aeSStefan Eßer 	"bad character '%c'",
251252884aeSStefan Eßer 	"string end cannot be found",
252252884aeSStefan Eßer 	"comment end cannot be found",
253252884aeSStefan Eßer 	"bad token",
254252884aeSStefan Eßer #if BC_ENABLED
255252884aeSStefan Eßer 	"bad expression",
256252884aeSStefan Eßer 	"empty expression",
25744d4804dSStefan Eßer 	"bad print or stream statement",
258252884aeSStefan Eßer 	"bad function definition",
259d213476dSStefan Eßer 	("bad assignment: left side must be scale, ibase, "
260d213476dSStefan Eßer 		"obase, seed, last, var, or array element"),
261252884aeSStefan Eßer 	"no auto variable found",
262252884aeSStefan Eßer 	"function parameter or auto \"%s%s\" already exists",
263252884aeSStefan Eßer 	"block end cannot be found",
264252884aeSStefan Eßer 	"cannot return a value from void function: %s()",
265252884aeSStefan Eßer 	"var cannot be a reference: %s",
266252884aeSStefan Eßer 
267252884aeSStefan Eßer 	"POSIX does not allow names longer than 1 character: %s",
268252884aeSStefan Eßer 	"POSIX does not allow '#' script comments",
269252884aeSStefan Eßer 	"POSIX does not allow the following keyword: %s",
270252884aeSStefan Eßer 	"POSIX does not allow a period ('.') as a shortcut for the last result",
271252884aeSStefan Eßer 	"POSIX requires parentheses around return expressions",
272252884aeSStefan Eßer 	"POSIX does not allow the following operator: %s",
273252884aeSStefan Eßer 	"POSIX does not allow comparison operators outside if statements or loops",
274252884aeSStefan Eßer 	"POSIX requires 0 or 1 comparison operators per condition",
275252884aeSStefan Eßer 	"POSIX requires all 3 parts of a for loop to be non-empty",
276*10041e99SStefan Eßer 	"POSIX requires a newline between a semicolon and a function definition",
277252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
278252884aeSStefan Eßer 	"POSIX does not allow exponential notation",
279252884aeSStefan Eßer #else
280252884aeSStefan Eßer 	NULL,
281252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
282252884aeSStefan Eßer 	"POSIX does not allow array references as function parameters",
283252884aeSStefan Eßer 	"POSIX does not allow void functions",
284252884aeSStefan Eßer 	"POSIX requires the left brace be on the same line as the function header",
28544d4804dSStefan Eßer 	"POSIX does not allow strings to be assigned to variables or arrays",
286252884aeSStefan Eßer #endif // BC_ENABLED
287252884aeSStefan Eßer 
288252884aeSStefan Eßer };
289252884aeSStefan Eßer 
29044d4804dSStefan Eßer #endif // !BC_ENABLE_LIBRARY
29144d4804dSStefan Eßer 
29244d4804dSStefan Eßer /// The destructors corresponding to BcDtorType enum items.
29344d4804dSStefan Eßer const BcVecFree bc_vec_dtors[] = {
29444d4804dSStefan Eßer 	NULL,
29544d4804dSStefan Eßer 	bc_vec_free,
29644d4804dSStefan Eßer 	bc_num_free,
29744d4804dSStefan Eßer #if !BC_ENABLE_LIBRARY
29844d4804dSStefan Eßer #ifndef NDEBUG
29944d4804dSStefan Eßer 	bc_func_free,
30044d4804dSStefan Eßer #endif // NDEBUG
30144d4804dSStefan Eßer 	bc_slab_free,
30244d4804dSStefan Eßer 	bc_const_free,
30344d4804dSStefan Eßer 	bc_result_free,
304252884aeSStefan Eßer #if BC_ENABLE_HISTORY
30544d4804dSStefan Eßer 	bc_history_string_free,
30644d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
30744d4804dSStefan Eßer #else // !BC_ENABLE_LIBRARY
30844d4804dSStefan Eßer 	bcl_num_destruct,
30944d4804dSStefan Eßer #endif // !BC_ENABLE_LIBRARY
31044d4804dSStefan Eßer };
31144d4804dSStefan Eßer 
31244d4804dSStefan Eßer #if !BC_ENABLE_LIBRARY
31344d4804dSStefan Eßer 
31444d4804dSStefan Eßer #if BC_ENABLE_HISTORY
31544d4804dSStefan Eßer 
31644d4804dSStefan Eßer /// A flush type for not clearing current extras but not saving new ones either.
3177e5c51e5SStefan Eßer const BcFlushType bc_flush_none = BC_FLUSH_NO_EXTRAS_NO_CLEAR;
31844d4804dSStefan Eßer 
31944d4804dSStefan Eßer /// A flush type for clearing extras and not saving new ones.
3207e5c51e5SStefan Eßer const BcFlushType bc_flush_err = BC_FLUSH_NO_EXTRAS_CLEAR;
32144d4804dSStefan Eßer 
32244d4804dSStefan Eßer /// A flush type for clearing previous extras and saving new ones.
3237e5c51e5SStefan Eßer const BcFlushType bc_flush_save = BC_FLUSH_SAVE_EXTRAS_CLEAR;
3247e5c51e5SStefan Eßer #endif // BC_ENABLE_HISTORY
3257e5c51e5SStefan Eßer 
3267e5c51e5SStefan Eßer #if BC_ENABLE_HISTORY
32744d4804dSStefan Eßer 
32844d4804dSStefan Eßer /// A list of known bad terminals.
329252884aeSStefan Eßer const char *bc_history_bad_terms[] = { "dumb", "cons25", "emacs", NULL };
330252884aeSStefan Eßer 
33144d4804dSStefan Eßer /// A constant for tabs and its length. My tab handling is dumb and always
33244d4804dSStefan Eßer /// outputs the entire thing.
333252884aeSStefan Eßer const char bc_history_tab[] = "        ";
334252884aeSStefan Eßer const size_t bc_history_tab_len = sizeof(bc_history_tab) - 1;
335252884aeSStefan Eßer 
33644d4804dSStefan Eßer /// A list of wide chars. These are listed in ascending order for efficiency.
337252884aeSStefan Eßer const uint32_t bc_history_wchars[][2] = {
338252884aeSStefan Eßer 	{ 0x1100, 0x115F },
339252884aeSStefan Eßer 	{ 0x231A, 0x231B },
340252884aeSStefan Eßer 	{ 0x2329, 0x232A },
341252884aeSStefan Eßer 	{ 0x23E9, 0x23EC },
342252884aeSStefan Eßer 	{ 0x23F0, 0x23F0 },
343252884aeSStefan Eßer 	{ 0x23F3, 0x23F3 },
344252884aeSStefan Eßer 	{ 0x25FD, 0x25FE },
345252884aeSStefan Eßer 	{ 0x2614, 0x2615 },
346252884aeSStefan Eßer 	{ 0x2648, 0x2653 },
347252884aeSStefan Eßer 	{ 0x267F, 0x267F },
348252884aeSStefan Eßer 	{ 0x2693, 0x2693 },
349252884aeSStefan Eßer 	{ 0x26A1, 0x26A1 },
350252884aeSStefan Eßer 	{ 0x26AA, 0x26AB },
351252884aeSStefan Eßer 	{ 0x26BD, 0x26BE },
352252884aeSStefan Eßer 	{ 0x26C4, 0x26C5 },
353252884aeSStefan Eßer 	{ 0x26CE, 0x26CE },
354252884aeSStefan Eßer 	{ 0x26D4, 0x26D4 },
355252884aeSStefan Eßer 	{ 0x26EA, 0x26EA },
356252884aeSStefan Eßer 	{ 0x26F2, 0x26F3 },
357252884aeSStefan Eßer 	{ 0x26F5, 0x26F5 },
358252884aeSStefan Eßer 	{ 0x26FA, 0x26FA },
359252884aeSStefan Eßer 	{ 0x26FD, 0x26FD },
360252884aeSStefan Eßer 	{ 0x2705, 0x2705 },
361252884aeSStefan Eßer 	{ 0x270A, 0x270B },
362252884aeSStefan Eßer 	{ 0x2728, 0x2728 },
363252884aeSStefan Eßer 	{ 0x274C, 0x274C },
364252884aeSStefan Eßer 	{ 0x274E, 0x274E },
365252884aeSStefan Eßer 	{ 0x2753, 0x2755 },
366252884aeSStefan Eßer 	{ 0x2757, 0x2757 },
367252884aeSStefan Eßer 	{ 0x2795, 0x2797 },
368252884aeSStefan Eßer 	{ 0x27B0, 0x27B0 },
369252884aeSStefan Eßer 	{ 0x27BF, 0x27BF },
370252884aeSStefan Eßer 	{ 0x2B1B, 0x2B1C },
371252884aeSStefan Eßer 	{ 0x2B50, 0x2B50 },
372252884aeSStefan Eßer 	{ 0x2B55, 0x2B55 },
373252884aeSStefan Eßer 	{ 0x2E80, 0x2E99 },
374252884aeSStefan Eßer 	{ 0x2E9B, 0x2EF3 },
375252884aeSStefan Eßer 	{ 0x2F00, 0x2FD5 },
376252884aeSStefan Eßer 	{ 0x2FF0, 0x2FFB },
377252884aeSStefan Eßer 	{ 0x3001, 0x303E },
378252884aeSStefan Eßer 	{ 0x3041, 0x3096 },
379252884aeSStefan Eßer 	{ 0x3099, 0x30FF },
380252884aeSStefan Eßer 	{ 0x3105, 0x312D },
381252884aeSStefan Eßer 	{ 0x3131, 0x318E },
382252884aeSStefan Eßer 	{ 0x3190, 0x31BA },
383252884aeSStefan Eßer 	{ 0x31C0, 0x31E3 },
384252884aeSStefan Eßer 	{ 0x31F0, 0x321E },
385252884aeSStefan Eßer 	{ 0x3220, 0x3247 },
386252884aeSStefan Eßer 	{ 0x3250, 0x32FE },
387252884aeSStefan Eßer 	{ 0x3300, 0x4DBF },
388252884aeSStefan Eßer 	{ 0x4E00, 0xA48C },
389252884aeSStefan Eßer 	{ 0xA490, 0xA4C6 },
390252884aeSStefan Eßer 	{ 0xA960, 0xA97C },
391252884aeSStefan Eßer 	{ 0xAC00, 0xD7A3 },
392252884aeSStefan Eßer 	{ 0xF900, 0xFAFF },
393252884aeSStefan Eßer 	{ 0xFE10, 0xFE19 },
394252884aeSStefan Eßer 	{ 0xFE30, 0xFE52 },
395252884aeSStefan Eßer 	{ 0xFE54, 0xFE66 },
396252884aeSStefan Eßer 	{ 0xFE68, 0xFE6B },
397252884aeSStefan Eßer 	{ 0x16FE0, 0x16FE0 },
398252884aeSStefan Eßer 	{ 0x17000, 0x187EC },
399252884aeSStefan Eßer 	{ 0x18800, 0x18AF2 },
400252884aeSStefan Eßer 	{ 0x1B000, 0x1B001 },
401252884aeSStefan Eßer 	{ 0x1F004, 0x1F004 },
402252884aeSStefan Eßer 	{ 0x1F0CF, 0x1F0CF },
403252884aeSStefan Eßer 	{ 0x1F18E, 0x1F18E },
404252884aeSStefan Eßer 	{ 0x1F191, 0x1F19A },
405252884aeSStefan Eßer 	{ 0x1F200, 0x1F202 },
406252884aeSStefan Eßer 	{ 0x1F210, 0x1F23B },
407252884aeSStefan Eßer 	{ 0x1F240, 0x1F248 },
408252884aeSStefan Eßer 	{ 0x1F250, 0x1F251 },
409252884aeSStefan Eßer 	{ 0x1F300, 0x1F320 },
410252884aeSStefan Eßer 	{ 0x1F32D, 0x1F335 },
411252884aeSStefan Eßer 	{ 0x1F337, 0x1F37C },
412252884aeSStefan Eßer 	{ 0x1F37E, 0x1F393 },
413252884aeSStefan Eßer 	{ 0x1F3A0, 0x1F3CA },
414252884aeSStefan Eßer 	{ 0x1F3CF, 0x1F3D3 },
415252884aeSStefan Eßer 	{ 0x1F3E0, 0x1F3F0 },
416252884aeSStefan Eßer 	{ 0x1F3F4, 0x1F3F4 },
417252884aeSStefan Eßer 	{ 0x1F3F8, 0x1F43E },
418252884aeSStefan Eßer 	{ 0x1F440, 0x1F440 },
419252884aeSStefan Eßer 	{ 0x1F442, 0x1F4FC },
420252884aeSStefan Eßer 	{ 0x1F4FF, 0x1F53D },
421252884aeSStefan Eßer 	{ 0x1F54B, 0x1F54E },
422252884aeSStefan Eßer 	{ 0x1F550, 0x1F567 },
423252884aeSStefan Eßer 	{ 0x1F57A, 0x1F57A },
424252884aeSStefan Eßer 	{ 0x1F595, 0x1F596 },
425252884aeSStefan Eßer 	{ 0x1F5A4, 0x1F5A4 },
426252884aeSStefan Eßer 	{ 0x1F5FB, 0x1F64F },
427252884aeSStefan Eßer 	{ 0x1F680, 0x1F6C5 },
428252884aeSStefan Eßer 	{ 0x1F6CC, 0x1F6CC },
429252884aeSStefan Eßer 	{ 0x1F6D0, 0x1F6D2 },
430252884aeSStefan Eßer 	{ 0x1F6EB, 0x1F6EC },
431252884aeSStefan Eßer 	{ 0x1F6F4, 0x1F6F6 },
432252884aeSStefan Eßer 	{ 0x1F910, 0x1F91E },
433252884aeSStefan Eßer 	{ 0x1F920, 0x1F927 },
434252884aeSStefan Eßer 	{ 0x1F930, 0x1F930 },
435252884aeSStefan Eßer 	{ 0x1F933, 0x1F93E },
436252884aeSStefan Eßer 	{ 0x1F940, 0x1F94B },
437252884aeSStefan Eßer 	{ 0x1F950, 0x1F95E },
438252884aeSStefan Eßer 	{ 0x1F980, 0x1F991 },
439252884aeSStefan Eßer 	{ 0x1F9C0, 0x1F9C0 },
440252884aeSStefan Eßer 	{ 0x20000, 0x2FFFD },
441252884aeSStefan Eßer 	{ 0x30000, 0x3FFFD },
442252884aeSStefan Eßer };
443252884aeSStefan Eßer 
44444d4804dSStefan Eßer /// The length of the wide chars list.
445252884aeSStefan Eßer const size_t bc_history_wchars_len =
446252884aeSStefan Eßer 	sizeof(bc_history_wchars) / sizeof(bc_history_wchars[0]);
447252884aeSStefan Eßer 
44844d4804dSStefan Eßer /// A list of combining characters in Unicode. These are listed in ascending
44944d4804dSStefan Eßer /// order for efficiency.
450252884aeSStefan Eßer const uint32_t bc_history_combo_chars[] = {
451252884aeSStefan Eßer 	0x0300,0x0301,0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,
452252884aeSStefan Eßer 	0x0308,0x0309,0x030A,0x030B,0x030C,0x030D,0x030E,0x030F,
453252884aeSStefan Eßer 	0x0310,0x0311,0x0312,0x0313,0x0314,0x0315,0x0316,0x0317,
454252884aeSStefan Eßer 	0x0318,0x0319,0x031A,0x031B,0x031C,0x031D,0x031E,0x031F,
455252884aeSStefan Eßer 	0x0320,0x0321,0x0322,0x0323,0x0324,0x0325,0x0326,0x0327,
456252884aeSStefan Eßer 	0x0328,0x0329,0x032A,0x032B,0x032C,0x032D,0x032E,0x032F,
457252884aeSStefan Eßer 	0x0330,0x0331,0x0332,0x0333,0x0334,0x0335,0x0336,0x0337,
458252884aeSStefan Eßer 	0x0338,0x0339,0x033A,0x033B,0x033C,0x033D,0x033E,0x033F,
459252884aeSStefan Eßer 	0x0340,0x0341,0x0342,0x0343,0x0344,0x0345,0x0346,0x0347,
460252884aeSStefan Eßer 	0x0348,0x0349,0x034A,0x034B,0x034C,0x034D,0x034E,0x034F,
461252884aeSStefan Eßer 	0x0350,0x0351,0x0352,0x0353,0x0354,0x0355,0x0356,0x0357,
462252884aeSStefan Eßer 	0x0358,0x0359,0x035A,0x035B,0x035C,0x035D,0x035E,0x035F,
463252884aeSStefan Eßer 	0x0360,0x0361,0x0362,0x0363,0x0364,0x0365,0x0366,0x0367,
464252884aeSStefan Eßer 	0x0368,0x0369,0x036A,0x036B,0x036C,0x036D,0x036E,0x036F,
465252884aeSStefan Eßer 	0x0483,0x0484,0x0485,0x0486,0x0487,0x0591,0x0592,0x0593,
466252884aeSStefan Eßer 	0x0594,0x0595,0x0596,0x0597,0x0598,0x0599,0x059A,0x059B,
467252884aeSStefan Eßer 	0x059C,0x059D,0x059E,0x059F,0x05A0,0x05A1,0x05A2,0x05A3,
468252884aeSStefan Eßer 	0x05A4,0x05A5,0x05A6,0x05A7,0x05A8,0x05A9,0x05AA,0x05AB,
469252884aeSStefan Eßer 	0x05AC,0x05AD,0x05AE,0x05AF,0x05B0,0x05B1,0x05B2,0x05B3,
470252884aeSStefan Eßer 	0x05B4,0x05B5,0x05B6,0x05B7,0x05B8,0x05B9,0x05BA,0x05BB,
471252884aeSStefan Eßer 	0x05BC,0x05BD,0x05BF,0x05C1,0x05C2,0x05C4,0x05C5,0x05C7,
472252884aeSStefan Eßer 	0x0610,0x0611,0x0612,0x0613,0x0614,0x0615,0x0616,0x0617,
473252884aeSStefan Eßer 	0x0618,0x0619,0x061A,0x064B,0x064C,0x064D,0x064E,0x064F,
474252884aeSStefan Eßer 	0x0650,0x0651,0x0652,0x0653,0x0654,0x0655,0x0656,0x0657,
475252884aeSStefan Eßer 	0x0658,0x0659,0x065A,0x065B,0x065C,0x065D,0x065E,0x065F,
476252884aeSStefan Eßer 	0x0670,0x06D6,0x06D7,0x06D8,0x06D9,0x06DA,0x06DB,0x06DC,
477252884aeSStefan Eßer 	0x06DF,0x06E0,0x06E1,0x06E2,0x06E3,0x06E4,0x06E7,0x06E8,
478252884aeSStefan Eßer 	0x06EA,0x06EB,0x06EC,0x06ED,0x0711,0x0730,0x0731,0x0732,
479252884aeSStefan Eßer 	0x0733,0x0734,0x0735,0x0736,0x0737,0x0738,0x0739,0x073A,
480252884aeSStefan Eßer 	0x073B,0x073C,0x073D,0x073E,0x073F,0x0740,0x0741,0x0742,
481252884aeSStefan Eßer 	0x0743,0x0744,0x0745,0x0746,0x0747,0x0748,0x0749,0x074A,
482252884aeSStefan Eßer 	0x07A6,0x07A7,0x07A8,0x07A9,0x07AA,0x07AB,0x07AC,0x07AD,
483252884aeSStefan Eßer 	0x07AE,0x07AF,0x07B0,0x07EB,0x07EC,0x07ED,0x07EE,0x07EF,
484252884aeSStefan Eßer 	0x07F0,0x07F1,0x07F2,0x07F3,0x0816,0x0817,0x0818,0x0819,
485252884aeSStefan Eßer 	0x081B,0x081C,0x081D,0x081E,0x081F,0x0820,0x0821,0x0822,
486252884aeSStefan Eßer 	0x0823,0x0825,0x0826,0x0827,0x0829,0x082A,0x082B,0x082C,
487252884aeSStefan Eßer 	0x082D,0x0859,0x085A,0x085B,0x08D4,0x08D5,0x08D6,0x08D7,
488252884aeSStefan Eßer 	0x08D8,0x08D9,0x08DA,0x08DB,0x08DC,0x08DD,0x08DE,0x08DF,
489252884aeSStefan Eßer 	0x08E0,0x08E1,0x08E3,0x08E4,0x08E5,0x08E6,0x08E7,0x08E8,
490252884aeSStefan Eßer 	0x08E9,0x08EA,0x08EB,0x08EC,0x08ED,0x08EE,0x08EF,0x08F0,
491252884aeSStefan Eßer 	0x08F1,0x08F2,0x08F3,0x08F4,0x08F5,0x08F6,0x08F7,0x08F8,
492252884aeSStefan Eßer 	0x08F9,0x08FA,0x08FB,0x08FC,0x08FD,0x08FE,0x08FF,0x0900,
493252884aeSStefan Eßer 	0x0901,0x0902,0x093A,0x093C,0x0941,0x0942,0x0943,0x0944,
494252884aeSStefan Eßer 	0x0945,0x0946,0x0947,0x0948,0x094D,0x0951,0x0952,0x0953,
495252884aeSStefan Eßer 	0x0954,0x0955,0x0956,0x0957,0x0962,0x0963,0x0981,0x09BC,
496252884aeSStefan Eßer 	0x09C1,0x09C2,0x09C3,0x09C4,0x09CD,0x09E2,0x09E3,0x0A01,
497252884aeSStefan Eßer 	0x0A02,0x0A3C,0x0A41,0x0A42,0x0A47,0x0A48,0x0A4B,0x0A4C,
498252884aeSStefan Eßer 	0x0A4D,0x0A51,0x0A70,0x0A71,0x0A75,0x0A81,0x0A82,0x0ABC,
499252884aeSStefan Eßer 	0x0AC1,0x0AC2,0x0AC3,0x0AC4,0x0AC5,0x0AC7,0x0AC8,0x0ACD,
500252884aeSStefan Eßer 	0x0AE2,0x0AE3,0x0B01,0x0B3C,0x0B3F,0x0B41,0x0B42,0x0B43,
501252884aeSStefan Eßer 	0x0B44,0x0B4D,0x0B56,0x0B62,0x0B63,0x0B82,0x0BC0,0x0BCD,
502252884aeSStefan Eßer 	0x0C00,0x0C3E,0x0C3F,0x0C40,0x0C46,0x0C47,0x0C48,0x0C4A,
503252884aeSStefan Eßer 	0x0C4B,0x0C4C,0x0C4D,0x0C55,0x0C56,0x0C62,0x0C63,0x0C81,
504252884aeSStefan Eßer 	0x0CBC,0x0CBF,0x0CC6,0x0CCC,0x0CCD,0x0CE2,0x0CE3,0x0D01,
505252884aeSStefan Eßer 	0x0D41,0x0D42,0x0D43,0x0D44,0x0D4D,0x0D62,0x0D63,0x0DCA,
506252884aeSStefan Eßer 	0x0DD2,0x0DD3,0x0DD4,0x0DD6,0x0E31,0x0E34,0x0E35,0x0E36,
507252884aeSStefan Eßer 	0x0E37,0x0E38,0x0E39,0x0E3A,0x0E47,0x0E48,0x0E49,0x0E4A,
508252884aeSStefan Eßer 	0x0E4B,0x0E4C,0x0E4D,0x0E4E,0x0EB1,0x0EB4,0x0EB5,0x0EB6,
509252884aeSStefan Eßer 	0x0EB7,0x0EB8,0x0EB9,0x0EBB,0x0EBC,0x0EC8,0x0EC9,0x0ECA,
510252884aeSStefan Eßer 	0x0ECB,0x0ECC,0x0ECD,0x0F18,0x0F19,0x0F35,0x0F37,0x0F39,
511252884aeSStefan Eßer 	0x0F71,0x0F72,0x0F73,0x0F74,0x0F75,0x0F76,0x0F77,0x0F78,
512252884aeSStefan Eßer 	0x0F79,0x0F7A,0x0F7B,0x0F7C,0x0F7D,0x0F7E,0x0F80,0x0F81,
513252884aeSStefan Eßer 	0x0F82,0x0F83,0x0F84,0x0F86,0x0F87,0x0F8D,0x0F8E,0x0F8F,
514252884aeSStefan Eßer 	0x0F90,0x0F91,0x0F92,0x0F93,0x0F94,0x0F95,0x0F96,0x0F97,
515252884aeSStefan Eßer 	0x0F99,0x0F9A,0x0F9B,0x0F9C,0x0F9D,0x0F9E,0x0F9F,0x0FA0,
516252884aeSStefan Eßer 	0x0FA1,0x0FA2,0x0FA3,0x0FA4,0x0FA5,0x0FA6,0x0FA7,0x0FA8,
517252884aeSStefan Eßer 	0x0FA9,0x0FAA,0x0FAB,0x0FAC,0x0FAD,0x0FAE,0x0FAF,0x0FB0,
518252884aeSStefan Eßer 	0x0FB1,0x0FB2,0x0FB3,0x0FB4,0x0FB5,0x0FB6,0x0FB7,0x0FB8,
519252884aeSStefan Eßer 	0x0FB9,0x0FBA,0x0FBB,0x0FBC,0x0FC6,0x102D,0x102E,0x102F,
520252884aeSStefan Eßer 	0x1030,0x1032,0x1033,0x1034,0x1035,0x1036,0x1037,0x1039,
521252884aeSStefan Eßer 	0x103A,0x103D,0x103E,0x1058,0x1059,0x105E,0x105F,0x1060,
522252884aeSStefan Eßer 	0x1071,0x1072,0x1073,0x1074,0x1082,0x1085,0x1086,0x108D,
523252884aeSStefan Eßer 	0x109D,0x135D,0x135E,0x135F,0x1712,0x1713,0x1714,0x1732,
524252884aeSStefan Eßer 	0x1733,0x1734,0x1752,0x1753,0x1772,0x1773,0x17B4,0x17B5,
525252884aeSStefan Eßer 	0x17B7,0x17B8,0x17B9,0x17BA,0x17BB,0x17BC,0x17BD,0x17C6,
526252884aeSStefan Eßer 	0x17C9,0x17CA,0x17CB,0x17CC,0x17CD,0x17CE,0x17CF,0x17D0,
527252884aeSStefan Eßer 	0x17D1,0x17D2,0x17D3,0x17DD,0x180B,0x180C,0x180D,0x1885,
528252884aeSStefan Eßer 	0x1886,0x18A9,0x1920,0x1921,0x1922,0x1927,0x1928,0x1932,
529252884aeSStefan Eßer 	0x1939,0x193A,0x193B,0x1A17,0x1A18,0x1A1B,0x1A56,0x1A58,
530252884aeSStefan Eßer 	0x1A59,0x1A5A,0x1A5B,0x1A5C,0x1A5D,0x1A5E,0x1A60,0x1A62,
531252884aeSStefan Eßer 	0x1A65,0x1A66,0x1A67,0x1A68,0x1A69,0x1A6A,0x1A6B,0x1A6C,
532252884aeSStefan Eßer 	0x1A73,0x1A74,0x1A75,0x1A76,0x1A77,0x1A78,0x1A79,0x1A7A,
533252884aeSStefan Eßer 	0x1A7B,0x1A7C,0x1A7F,0x1AB0,0x1AB1,0x1AB2,0x1AB3,0x1AB4,
534252884aeSStefan Eßer 	0x1AB5,0x1AB6,0x1AB7,0x1AB8,0x1AB9,0x1ABA,0x1ABB,0x1ABC,
535252884aeSStefan Eßer 	0x1ABD,0x1B00,0x1B01,0x1B02,0x1B03,0x1B34,0x1B36,0x1B37,
536252884aeSStefan Eßer 	0x1B38,0x1B39,0x1B3A,0x1B3C,0x1B42,0x1B6B,0x1B6C,0x1B6D,
537252884aeSStefan Eßer 	0x1B6E,0x1B6F,0x1B70,0x1B71,0x1B72,0x1B73,0x1B80,0x1B81,
538252884aeSStefan Eßer 	0x1BA2,0x1BA3,0x1BA4,0x1BA5,0x1BA8,0x1BA9,0x1BAB,0x1BAC,
539252884aeSStefan Eßer 	0x1BAD,0x1BE6,0x1BE8,0x1BE9,0x1BED,0x1BEF,0x1BF0,0x1BF1,
540252884aeSStefan Eßer 	0x1C2C,0x1C2D,0x1C2E,0x1C2F,0x1C30,0x1C31,0x1C32,0x1C33,
541252884aeSStefan Eßer 	0x1C36,0x1C37,0x1CD0,0x1CD1,0x1CD2,0x1CD4,0x1CD5,0x1CD6,
542252884aeSStefan Eßer 	0x1CD7,0x1CD8,0x1CD9,0x1CDA,0x1CDB,0x1CDC,0x1CDD,0x1CDE,
543252884aeSStefan Eßer 	0x1CDF,0x1CE0,0x1CE2,0x1CE3,0x1CE4,0x1CE5,0x1CE6,0x1CE7,
544252884aeSStefan Eßer 	0x1CE8,0x1CED,0x1CF4,0x1CF8,0x1CF9,0x1DC0,0x1DC1,0x1DC2,
545252884aeSStefan Eßer 	0x1DC3,0x1DC4,0x1DC5,0x1DC6,0x1DC7,0x1DC8,0x1DC9,0x1DCA,
546252884aeSStefan Eßer 	0x1DCB,0x1DCC,0x1DCD,0x1DCE,0x1DCF,0x1DD0,0x1DD1,0x1DD2,
547252884aeSStefan Eßer 	0x1DD3,0x1DD4,0x1DD5,0x1DD6,0x1DD7,0x1DD8,0x1DD9,0x1DDA,
548252884aeSStefan Eßer 	0x1DDB,0x1DDC,0x1DDD,0x1DDE,0x1DDF,0x1DE0,0x1DE1,0x1DE2,
549252884aeSStefan Eßer 	0x1DE3,0x1DE4,0x1DE5,0x1DE6,0x1DE7,0x1DE8,0x1DE9,0x1DEA,
550252884aeSStefan Eßer 	0x1DEB,0x1DEC,0x1DED,0x1DEE,0x1DEF,0x1DF0,0x1DF1,0x1DF2,
551252884aeSStefan Eßer 	0x1DF3,0x1DF4,0x1DF5,0x1DFB,0x1DFC,0x1DFD,0x1DFE,0x1DFF,
552252884aeSStefan Eßer 	0x20D0,0x20D1,0x20D2,0x20D3,0x20D4,0x20D5,0x20D6,0x20D7,
553252884aeSStefan Eßer 	0x20D8,0x20D9,0x20DA,0x20DB,0x20DC,0x20E1,0x20E5,0x20E6,
554252884aeSStefan Eßer 	0x20E7,0x20E8,0x20E9,0x20EA,0x20EB,0x20EC,0x20ED,0x20EE,
555252884aeSStefan Eßer 	0x20EF,0x20F0,0x2CEF,0x2CF0,0x2CF1,0x2D7F,0x2DE0,0x2DE1,
556252884aeSStefan Eßer 	0x2DE2,0x2DE3,0x2DE4,0x2DE5,0x2DE6,0x2DE7,0x2DE8,0x2DE9,
557252884aeSStefan Eßer 	0x2DEA,0x2DEB,0x2DEC,0x2DED,0x2DEE,0x2DEF,0x2DF0,0x2DF1,
558252884aeSStefan Eßer 	0x2DF2,0x2DF3,0x2DF4,0x2DF5,0x2DF6,0x2DF7,0x2DF8,0x2DF9,
559252884aeSStefan Eßer 	0x2DFA,0x2DFB,0x2DFC,0x2DFD,0x2DFE,0x2DFF,0x302A,0x302B,
560252884aeSStefan Eßer 	0x302C,0x302D,0x3099,0x309A,0xA66F,0xA674,0xA675,0xA676,
561252884aeSStefan Eßer 	0xA677,0xA678,0xA679,0xA67A,0xA67B,0xA67C,0xA67D,0xA69E,
562252884aeSStefan Eßer 	0xA69F,0xA6F0,0xA6F1,0xA802,0xA806,0xA80B,0xA825,0xA826,
563252884aeSStefan Eßer 	0xA8C4,0xA8C5,0xA8E0,0xA8E1,0xA8E2,0xA8E3,0xA8E4,0xA8E5,
564252884aeSStefan Eßer 	0xA8E6,0xA8E7,0xA8E8,0xA8E9,0xA8EA,0xA8EB,0xA8EC,0xA8ED,
565252884aeSStefan Eßer 	0xA8EE,0xA8EF,0xA8F0,0xA8F1,0xA926,0xA927,0xA928,0xA929,
566252884aeSStefan Eßer 	0xA92A,0xA92B,0xA92C,0xA92D,0xA947,0xA948,0xA949,0xA94A,
567252884aeSStefan Eßer 	0xA94B,0xA94C,0xA94D,0xA94E,0xA94F,0xA950,0xA951,0xA980,
568252884aeSStefan Eßer 	0xA981,0xA982,0xA9B3,0xA9B6,0xA9B7,0xA9B8,0xA9B9,0xA9BC,
569252884aeSStefan Eßer 	0xA9E5,0xAA29,0xAA2A,0xAA2B,0xAA2C,0xAA2D,0xAA2E,0xAA31,
570252884aeSStefan Eßer 	0xAA32,0xAA35,0xAA36,0xAA43,0xAA4C,0xAA7C,0xAAB0,0xAAB2,
571252884aeSStefan Eßer 	0xAAB3,0xAAB4,0xAAB7,0xAAB8,0xAABE,0xAABF,0xAAC1,0xAAEC,
572252884aeSStefan Eßer 	0xAAED,0xAAF6,0xABE5,0xABE8,0xABED,0xFB1E,0xFE00,0xFE01,
573252884aeSStefan Eßer 	0xFE02,0xFE03,0xFE04,0xFE05,0xFE06,0xFE07,0xFE08,0xFE09,
574252884aeSStefan Eßer 	0xFE0A,0xFE0B,0xFE0C,0xFE0D,0xFE0E,0xFE0F,0xFE20,0xFE21,
575252884aeSStefan Eßer 	0xFE22,0xFE23,0xFE24,0xFE25,0xFE26,0xFE27,0xFE28,0xFE29,
576252884aeSStefan Eßer 	0xFE2A,0xFE2B,0xFE2C,0xFE2D,0xFE2E,0xFE2F,
577252884aeSStefan Eßer 	0x101FD,0x102E0,0x10376,0x10377,0x10378,0x10379,0x1037A,0x10A01,
578252884aeSStefan Eßer 	0x10A02,0x10A03,0x10A05,0x10A06,0x10A0C,0x10A0D,0x10A0E,0x10A0F,
579252884aeSStefan Eßer 	0x10A38,0x10A39,0x10A3A,0x10A3F,0x10AE5,0x10AE6,0x11001,0x11038,
580252884aeSStefan Eßer 	0x11039,0x1103A,0x1103B,0x1103C,0x1103D,0x1103E,0x1103F,0x11040,
581252884aeSStefan Eßer 	0x11041,0x11042,0x11043,0x11044,0x11045,0x11046,0x1107F,0x11080,
582252884aeSStefan Eßer 	0x11081,0x110B3,0x110B4,0x110B5,0x110B6,0x110B9,0x110BA,0x11100,
583252884aeSStefan Eßer 	0x11101,0x11102,0x11127,0x11128,0x11129,0x1112A,0x1112B,0x1112D,
584252884aeSStefan Eßer 	0x1112E,0x1112F,0x11130,0x11131,0x11132,0x11133,0x11134,0x11173,
585252884aeSStefan Eßer 	0x11180,0x11181,0x111B6,0x111B7,0x111B8,0x111B9,0x111BA,0x111BB,
586252884aeSStefan Eßer 	0x111BC,0x111BD,0x111BE,0x111CA,0x111CB,0x111CC,0x1122F,0x11230,
587252884aeSStefan Eßer 	0x11231,0x11234,0x11236,0x11237,0x1123E,0x112DF,0x112E3,0x112E4,
588252884aeSStefan Eßer 	0x112E5,0x112E6,0x112E7,0x112E8,0x112E9,0x112EA,0x11300,0x11301,
589252884aeSStefan Eßer 	0x1133C,0x11340,0x11366,0x11367,0x11368,0x11369,0x1136A,0x1136B,
590252884aeSStefan Eßer 	0x1136C,0x11370,0x11371,0x11372,0x11373,0x11374,0x11438,0x11439,
591252884aeSStefan Eßer 	0x1143A,0x1143B,0x1143C,0x1143D,0x1143E,0x1143F,0x11442,0x11443,
592252884aeSStefan Eßer 	0x11444,0x11446,0x114B3,0x114B4,0x114B5,0x114B6,0x114B7,0x114B8,
593252884aeSStefan Eßer 	0x114BA,0x114BF,0x114C0,0x114C2,0x114C3,0x115B2,0x115B3,0x115B4,
594252884aeSStefan Eßer 	0x115B5,0x115BC,0x115BD,0x115BF,0x115C0,0x115DC,0x115DD,0x11633,
595252884aeSStefan Eßer 	0x11634,0x11635,0x11636,0x11637,0x11638,0x11639,0x1163A,0x1163D,
596252884aeSStefan Eßer 	0x1163F,0x11640,0x116AB,0x116AD,0x116B0,0x116B1,0x116B2,0x116B3,
597252884aeSStefan Eßer 	0x116B4,0x116B5,0x116B7,0x1171D,0x1171E,0x1171F,0x11722,0x11723,
598252884aeSStefan Eßer 	0x11724,0x11725,0x11727,0x11728,0x11729,0x1172A,0x1172B,0x11C30,
599252884aeSStefan Eßer 	0x11C31,0x11C32,0x11C33,0x11C34,0x11C35,0x11C36,0x11C38,0x11C39,
600252884aeSStefan Eßer 	0x11C3A,0x11C3B,0x11C3C,0x11C3D,0x11C3F,0x11C92,0x11C93,0x11C94,
601252884aeSStefan Eßer 	0x11C95,0x11C96,0x11C97,0x11C98,0x11C99,0x11C9A,0x11C9B,0x11C9C,
602252884aeSStefan Eßer 	0x11C9D,0x11C9E,0x11C9F,0x11CA0,0x11CA1,0x11CA2,0x11CA3,0x11CA4,
603252884aeSStefan Eßer 	0x11CA5,0x11CA6,0x11CA7,0x11CAA,0x11CAB,0x11CAC,0x11CAD,0x11CAE,
604252884aeSStefan Eßer 	0x11CAF,0x11CB0,0x11CB2,0x11CB3,0x11CB5,0x11CB6,0x16AF0,0x16AF1,
605252884aeSStefan Eßer 	0x16AF2,0x16AF3,0x16AF4,0x16B30,0x16B31,0x16B32,0x16B33,0x16B34,
606252884aeSStefan Eßer 	0x16B35,0x16B36,0x16F8F,0x16F90,0x16F91,0x16F92,0x1BC9D,0x1BC9E,
607252884aeSStefan Eßer 	0x1D167,0x1D168,0x1D169,0x1D17B,0x1D17C,0x1D17D,0x1D17E,0x1D17F,
608252884aeSStefan Eßer 	0x1D180,0x1D181,0x1D182,0x1D185,0x1D186,0x1D187,0x1D188,0x1D189,
609252884aeSStefan Eßer 	0x1D18A,0x1D18B,0x1D1AA,0x1D1AB,0x1D1AC,0x1D1AD,0x1D242,0x1D243,
610252884aeSStefan Eßer 	0x1D244,0x1DA00,0x1DA01,0x1DA02,0x1DA03,0x1DA04,0x1DA05,0x1DA06,
611252884aeSStefan Eßer 	0x1DA07,0x1DA08,0x1DA09,0x1DA0A,0x1DA0B,0x1DA0C,0x1DA0D,0x1DA0E,
612252884aeSStefan Eßer 	0x1DA0F,0x1DA10,0x1DA11,0x1DA12,0x1DA13,0x1DA14,0x1DA15,0x1DA16,
613252884aeSStefan Eßer 	0x1DA17,0x1DA18,0x1DA19,0x1DA1A,0x1DA1B,0x1DA1C,0x1DA1D,0x1DA1E,
614252884aeSStefan Eßer 	0x1DA1F,0x1DA20,0x1DA21,0x1DA22,0x1DA23,0x1DA24,0x1DA25,0x1DA26,
615252884aeSStefan Eßer 	0x1DA27,0x1DA28,0x1DA29,0x1DA2A,0x1DA2B,0x1DA2C,0x1DA2D,0x1DA2E,
616252884aeSStefan Eßer 	0x1DA2F,0x1DA30,0x1DA31,0x1DA32,0x1DA33,0x1DA34,0x1DA35,0x1DA36,
617252884aeSStefan Eßer 	0x1DA3B,0x1DA3C,0x1DA3D,0x1DA3E,0x1DA3F,0x1DA40,0x1DA41,0x1DA42,
618252884aeSStefan Eßer 	0x1DA43,0x1DA44,0x1DA45,0x1DA46,0x1DA47,0x1DA48,0x1DA49,0x1DA4A,
619252884aeSStefan Eßer 	0x1DA4B,0x1DA4C,0x1DA4D,0x1DA4E,0x1DA4F,0x1DA50,0x1DA51,0x1DA52,
620252884aeSStefan Eßer 	0x1DA53,0x1DA54,0x1DA55,0x1DA56,0x1DA57,0x1DA58,0x1DA59,0x1DA5A,
621252884aeSStefan Eßer 	0x1DA5B,0x1DA5C,0x1DA5D,0x1DA5E,0x1DA5F,0x1DA60,0x1DA61,0x1DA62,
622252884aeSStefan Eßer 	0x1DA63,0x1DA64,0x1DA65,0x1DA66,0x1DA67,0x1DA68,0x1DA69,0x1DA6A,
623252884aeSStefan Eßer 	0x1DA6B,0x1DA6C,0x1DA75,0x1DA84,0x1DA9B,0x1DA9C,0x1DA9D,0x1DA9E,
624252884aeSStefan Eßer 	0x1DA9F,0x1DAA1,0x1DAA2,0x1DAA3,0x1DAA4,0x1DAA5,0x1DAA6,0x1DAA7,
625252884aeSStefan Eßer 	0x1DAA8,0x1DAA9,0x1DAAA,0x1DAAB,0x1DAAC,0x1DAAD,0x1DAAE,0x1DAAF,
626252884aeSStefan Eßer 	0x1E000,0x1E001,0x1E002,0x1E003,0x1E004,0x1E005,0x1E006,0x1E008,
627252884aeSStefan Eßer 	0x1E009,0x1E00A,0x1E00B,0x1E00C,0x1E00D,0x1E00E,0x1E00F,0x1E010,
628252884aeSStefan Eßer 	0x1E011,0x1E012,0x1E013,0x1E014,0x1E015,0x1E016,0x1E017,0x1E018,
629252884aeSStefan Eßer 	0x1E01B,0x1E01C,0x1E01D,0x1E01E,0x1E01F,0x1E020,0x1E021,0x1E023,
630252884aeSStefan Eßer 	0x1E024,0x1E026,0x1E027,0x1E028,0x1E029,0x1E02A,0x1E8D0,0x1E8D1,
631252884aeSStefan Eßer 	0x1E8D2,0x1E8D3,0x1E8D4,0x1E8D5,0x1E8D6,0x1E944,0x1E945,0x1E946,
632252884aeSStefan Eßer 	0x1E947,0x1E948,0x1E949,0x1E94A,0xE0100,0xE0101,0xE0102,0xE0103,
633252884aeSStefan Eßer 	0xE0104,0xE0105,0xE0106,0xE0107,0xE0108,0xE0109,0xE010A,0xE010B,
634252884aeSStefan Eßer 	0xE010C,0xE010D,0xE010E,0xE010F,0xE0110,0xE0111,0xE0112,0xE0113,
635252884aeSStefan Eßer 	0xE0114,0xE0115,0xE0116,0xE0117,0xE0118,0xE0119,0xE011A,0xE011B,
636252884aeSStefan Eßer 	0xE011C,0xE011D,0xE011E,0xE011F,0xE0120,0xE0121,0xE0122,0xE0123,
637252884aeSStefan Eßer 	0xE0124,0xE0125,0xE0126,0xE0127,0xE0128,0xE0129,0xE012A,0xE012B,
638252884aeSStefan Eßer 	0xE012C,0xE012D,0xE012E,0xE012F,0xE0130,0xE0131,0xE0132,0xE0133,
639252884aeSStefan Eßer 	0xE0134,0xE0135,0xE0136,0xE0137,0xE0138,0xE0139,0xE013A,0xE013B,
640252884aeSStefan Eßer 	0xE013C,0xE013D,0xE013E,0xE013F,0xE0140,0xE0141,0xE0142,0xE0143,
641252884aeSStefan Eßer 	0xE0144,0xE0145,0xE0146,0xE0147,0xE0148,0xE0149,0xE014A,0xE014B,
642252884aeSStefan Eßer 	0xE014C,0xE014D,0xE014E,0xE014F,0xE0150,0xE0151,0xE0152,0xE0153,
643252884aeSStefan Eßer 	0xE0154,0xE0155,0xE0156,0xE0157,0xE0158,0xE0159,0xE015A,0xE015B,
644252884aeSStefan Eßer 	0xE015C,0xE015D,0xE015E,0xE015F,0xE0160,0xE0161,0xE0162,0xE0163,
645252884aeSStefan Eßer 	0xE0164,0xE0165,0xE0166,0xE0167,0xE0168,0xE0169,0xE016A,0xE016B,
646252884aeSStefan Eßer 	0xE016C,0xE016D,0xE016E,0xE016F,0xE0170,0xE0171,0xE0172,0xE0173,
647252884aeSStefan Eßer 	0xE0174,0xE0175,0xE0176,0xE0177,0xE0178,0xE0179,0xE017A,0xE017B,
648252884aeSStefan Eßer 	0xE017C,0xE017D,0xE017E,0xE017F,0xE0180,0xE0181,0xE0182,0xE0183,
649252884aeSStefan Eßer 	0xE0184,0xE0185,0xE0186,0xE0187,0xE0188,0xE0189,0xE018A,0xE018B,
650252884aeSStefan Eßer 	0xE018C,0xE018D,0xE018E,0xE018F,0xE0190,0xE0191,0xE0192,0xE0193,
651252884aeSStefan Eßer 	0xE0194,0xE0195,0xE0196,0xE0197,0xE0198,0xE0199,0xE019A,0xE019B,
652252884aeSStefan Eßer 	0xE019C,0xE019D,0xE019E,0xE019F,0xE01A0,0xE01A1,0xE01A2,0xE01A3,
653252884aeSStefan Eßer 	0xE01A4,0xE01A5,0xE01A6,0xE01A7,0xE01A8,0xE01A9,0xE01AA,0xE01AB,
654252884aeSStefan Eßer 	0xE01AC,0xE01AD,0xE01AE,0xE01AF,0xE01B0,0xE01B1,0xE01B2,0xE01B3,
655252884aeSStefan Eßer 	0xE01B4,0xE01B5,0xE01B6,0xE01B7,0xE01B8,0xE01B9,0xE01BA,0xE01BB,
656252884aeSStefan Eßer 	0xE01BC,0xE01BD,0xE01BE,0xE01BF,0xE01C0,0xE01C1,0xE01C2,0xE01C3,
657252884aeSStefan Eßer 	0xE01C4,0xE01C5,0xE01C6,0xE01C7,0xE01C8,0xE01C9,0xE01CA,0xE01CB,
658252884aeSStefan Eßer 	0xE01CC,0xE01CD,0xE01CE,0xE01CF,0xE01D0,0xE01D1,0xE01D2,0xE01D3,
659252884aeSStefan Eßer 	0xE01D4,0xE01D5,0xE01D6,0xE01D7,0xE01D8,0xE01D9,0xE01DA,0xE01DB,
660252884aeSStefan Eßer 	0xE01DC,0xE01DD,0xE01DE,0xE01DF,0xE01E0,0xE01E1,0xE01E2,0xE01E3,
661252884aeSStefan Eßer 	0xE01E4,0xE01E5,0xE01E6,0xE01E7,0xE01E8,0xE01E9,0xE01EA,0xE01EB,
662252884aeSStefan Eßer 	0xE01EC,0xE01ED,0xE01EE,0xE01EF,
663252884aeSStefan Eßer };
664252884aeSStefan Eßer 
66544d4804dSStefan Eßer /// The length of the combining characters list.
666252884aeSStefan Eßer const size_t bc_history_combo_chars_len =
667252884aeSStefan Eßer 	sizeof(bc_history_combo_chars) / sizeof(bc_history_combo_chars[0]);
668252884aeSStefan Eßer #endif // BC_ENABLE_HISTORY
669252884aeSStefan Eßer 
67044d4804dSStefan Eßer /// The human-readable name of the main function in bc source code.
671252884aeSStefan Eßer const char bc_func_main[] = "(main)";
67244d4804dSStefan Eßer 
67344d4804dSStefan Eßer /// The human-readable name of the read function in bc source code.
674252884aeSStefan Eßer const char bc_func_read[] = "(read)";
675252884aeSStefan Eßer 
676252884aeSStefan Eßer #if BC_DEBUG_CODE
67744d4804dSStefan Eßer 
67844d4804dSStefan Eßer /// A list of names of instructions for easy debugging output.
679252884aeSStefan Eßer const char* bc_inst_names[] = {
680252884aeSStefan Eßer 
681252884aeSStefan Eßer #if BC_ENABLED
682252884aeSStefan Eßer 	"BC_INST_INC",
683252884aeSStefan Eßer 	"BC_INST_DEC",
684252884aeSStefan Eßer #endif // BC_ENABLED
685252884aeSStefan Eßer 
686252884aeSStefan Eßer 	"BC_INST_NEG",
687252884aeSStefan Eßer 	"BC_INST_BOOL_NOT",
688252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
689252884aeSStefan Eßer 	"BC_INST_TRUNC",
690252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
691252884aeSStefan Eßer 
692252884aeSStefan Eßer 	"BC_INST_POWER",
693252884aeSStefan Eßer 	"BC_INST_MULTIPLY",
694252884aeSStefan Eßer 	"BC_INST_DIVIDE",
695252884aeSStefan Eßer 	"BC_INST_MODULUS",
696252884aeSStefan Eßer 	"BC_INST_PLUS",
697252884aeSStefan Eßer 	"BC_INST_MINUS",
698252884aeSStefan Eßer 
699252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
700252884aeSStefan Eßer 	"BC_INST_PLACES",
701252884aeSStefan Eßer 
702252884aeSStefan Eßer 	"BC_INST_LSHIFT",
703252884aeSStefan Eßer 	"BC_INST_RSHIFT",
704252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
705252884aeSStefan Eßer 
706252884aeSStefan Eßer 	"BC_INST_REL_EQ",
707252884aeSStefan Eßer 	"BC_INST_REL_LE",
708252884aeSStefan Eßer 	"BC_INST_REL_GE",
709252884aeSStefan Eßer 	"BC_INST_REL_NE",
710252884aeSStefan Eßer 	"BC_INST_REL_LT",
711252884aeSStefan Eßer 	"BC_INST_REL_GT",
712252884aeSStefan Eßer 
713252884aeSStefan Eßer 	"BC_INST_BOOL_OR",
714252884aeSStefan Eßer 	"BC_INST_BOOL_AND",
715252884aeSStefan Eßer 
716252884aeSStefan Eßer #if BC_ENABLED
717252884aeSStefan Eßer 	"BC_INST_ASSIGN_POWER",
718252884aeSStefan Eßer 	"BC_INST_ASSIGN_MULTIPLY",
719252884aeSStefan Eßer 	"BC_INST_ASSIGN_DIVIDE",
720252884aeSStefan Eßer 	"BC_INST_ASSIGN_MODULUS",
721252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLUS",
722252884aeSStefan Eßer 	"BC_INST_ASSIGN_MINUS",
723252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
724252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLACES",
725252884aeSStefan Eßer 	"BC_INST_ASSIGN_LSHIFT",
726252884aeSStefan Eßer 	"BC_INST_ASSIGN_RSHIFT",
727252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
728252884aeSStefan Eßer 	"BC_INST_ASSIGN",
729252884aeSStefan Eßer 
730252884aeSStefan Eßer 	"BC_INST_ASSIGN_POWER_NO_VAL",
731252884aeSStefan Eßer 	"BC_INST_ASSIGN_MULTIPLY_NO_VAL",
732252884aeSStefan Eßer 	"BC_INST_ASSIGN_DIVIDE_NO_VAL",
733252884aeSStefan Eßer 	"BC_INST_ASSIGN_MODULUS_NO_VAL",
734252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLUS_NO_VAL",
735252884aeSStefan Eßer 	"BC_INST_ASSIGN_MINUS_NO_VAL",
736252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
737252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLACES_NO_VAL",
738252884aeSStefan Eßer 	"BC_INST_ASSIGN_LSHIFT_NO_VAL",
739252884aeSStefan Eßer 	"BC_INST_ASSIGN_RSHIFT_NO_VAL",
740252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
741252884aeSStefan Eßer #endif // BC_ENABLED
742252884aeSStefan Eßer 	"BC_INST_ASSIGN_NO_VAL",
743252884aeSStefan Eßer 
744252884aeSStefan Eßer 	"BC_INST_NUM",
745252884aeSStefan Eßer 	"BC_INST_VAR",
746252884aeSStefan Eßer 	"BC_INST_ARRAY_ELEM",
747252884aeSStefan Eßer 	"BC_INST_ARRAY",
748252884aeSStefan Eßer 
7493aa99676SStefan Eßer 	"BC_INST_ZERO",
750252884aeSStefan Eßer 	"BC_INST_ONE",
751252884aeSStefan Eßer 
752252884aeSStefan Eßer #if BC_ENABLED
753252884aeSStefan Eßer 	"BC_INST_LAST",
754252884aeSStefan Eßer #endif // BC_ENABLED
755252884aeSStefan Eßer 	"BC_INST_IBASE",
756252884aeSStefan Eßer 	"BC_INST_OBASE",
757252884aeSStefan Eßer 	"BC_INST_SCALE",
758252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
759252884aeSStefan Eßer 	"BC_INST_SEED",
760252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
761252884aeSStefan Eßer 	"BC_INST_LENGTH",
762252884aeSStefan Eßer 	"BC_INST_SCALE_FUNC",
763252884aeSStefan Eßer 	"BC_INST_SQRT",
764252884aeSStefan Eßer 	"BC_INST_ABS",
765252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
766252884aeSStefan Eßer 	"BC_INST_IRAND",
767252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
76844d4804dSStefan Eßer 	"BC_INST_ASCIIFY",
769252884aeSStefan Eßer 	"BC_INST_READ",
770252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
771252884aeSStefan Eßer 	"BC_INST_RAND",
772252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
773252884aeSStefan Eßer 	"BC_INST_MAXIBASE",
774252884aeSStefan Eßer 	"BC_INST_MAXOBASE",
775252884aeSStefan Eßer 	"BC_INST_MAXSCALE",
776252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
777252884aeSStefan Eßer 	"BC_INST_MAXRAND",
778252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
779252884aeSStefan Eßer 
780252884aeSStefan Eßer 	"BC_INST_PRINT",
781252884aeSStefan Eßer 	"BC_INST_PRINT_POP",
782252884aeSStefan Eßer 	"BC_INST_STR",
78344d4804dSStefan Eßer #if BC_ENABLED
784252884aeSStefan Eßer 	"BC_INST_PRINT_STR",
785252884aeSStefan Eßer 
786252884aeSStefan Eßer 	"BC_INST_JUMP",
787252884aeSStefan Eßer 	"BC_INST_JUMP_ZERO",
788252884aeSStefan Eßer 
789252884aeSStefan Eßer 	"BC_INST_CALL",
790252884aeSStefan Eßer 
791252884aeSStefan Eßer 	"BC_INST_RET",
792252884aeSStefan Eßer 	"BC_INST_RET0",
793252884aeSStefan Eßer 	"BC_INST_RET_VOID",
794252884aeSStefan Eßer 
795252884aeSStefan Eßer 	"BC_INST_HALT",
796252884aeSStefan Eßer #endif // BC_ENABLED
797252884aeSStefan Eßer 
798252884aeSStefan Eßer 	"BC_INST_POP",
79944d4804dSStefan Eßer 	"BC_INST_SWAP",
800252884aeSStefan Eßer 	"BC_INST_MODEXP",
801252884aeSStefan Eßer 	"BC_INST_DIVMOD",
80244d4804dSStefan Eßer 	"BC_INST_PRINT_STREAM",
80344d4804dSStefan Eßer 
80444d4804dSStefan Eßer #if DC_ENABLED
80544d4804dSStefan Eßer 	"BC_INST_POP_EXEC",
806252884aeSStefan Eßer 
807252884aeSStefan Eßer 	"BC_INST_EXECUTE",
808252884aeSStefan Eßer 	"BC_INST_EXEC_COND",
809252884aeSStefan Eßer 
810252884aeSStefan Eßer 	"BC_INST_PRINT_STACK",
811252884aeSStefan Eßer 	"BC_INST_CLEAR_STACK",
81244d4804dSStefan Eßer 	"BC_INST_REG_STACK_LEN",
813252884aeSStefan Eßer 	"BC_INST_STACK_LEN",
814252884aeSStefan Eßer 	"BC_INST_DUPLICATE",
815252884aeSStefan Eßer 
816252884aeSStefan Eßer 	"BC_INST_LOAD",
817252884aeSStefan Eßer 	"BC_INST_PUSH_VAR",
818252884aeSStefan Eßer 	"BC_INST_PUSH_TO_VAR",
819252884aeSStefan Eßer 
820252884aeSStefan Eßer 	"BC_INST_QUIT",
821252884aeSStefan Eßer 	"BC_INST_NQUIT",
82244d4804dSStefan Eßer 
82344d4804dSStefan Eßer 	"BC_INST_EXEC_STACK_LEN",
824252884aeSStefan Eßer #endif // DC_ENABLED
82544d4804dSStefan Eßer 
82644d4804dSStefan Eßer 	"BC_INST_INVALID",
827252884aeSStefan Eßer };
82844d4804dSStefan Eßer 
829252884aeSStefan Eßer #endif // BC_DEBUG_CODE
830252884aeSStefan Eßer 
83144d4804dSStefan Eßer /// A constant string for 0.
83250696a6eSStefan Eßer const char bc_parse_zero[2] = "0";
83344d4804dSStefan Eßer 
83444d4804dSStefan Eßer /// A constant string for 1.
83550696a6eSStefan Eßer const char bc_parse_one[2] = "1";
836252884aeSStefan Eßer 
837252884aeSStefan Eßer #if BC_ENABLED
83844d4804dSStefan Eßer 
83944d4804dSStefan Eßer /// A list of keywords for bc. This needs to be updated if keywords change.
840252884aeSStefan Eßer const BcLexKeyword bc_lex_kws[] = {
841252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("auto", 4, true),
842252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("break", 5, true),
843252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("continue", 8, false),
844252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("define", 6, true),
845252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("for", 3, true),
846252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("if", 2, true),
847252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("limits", 6, false),
848252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("return", 6, true),
849252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("while", 5, true),
850252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("halt", 4, false),
851252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("last", 4, false),
852252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("ibase", 5, true),
853252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("obase", 5, true),
854252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("scale", 5, true),
85544d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
856252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("seed", 4, false),
85744d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
858252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("length", 6, true),
859252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("print", 5, false),
860252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("sqrt", 4, true),
861252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("abs", 3, false),
86244d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
863252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("irand", 5, false),
86444d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
86544d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("asciify", 7, false),
86644d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("modexp", 6, false),
86744d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("divmod", 6, false),
868252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("quit", 4, true),
869252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("read", 4, false),
87044d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
871252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("rand", 4, false),
87244d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
873252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxibase", 8, false),
874252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxobase", 8, false),
875252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxscale", 8, false),
87644d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
877252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxrand", 7, false),
87844d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
879d43fa8efSStefan Eßer 	BC_LEX_KW_ENTRY("line_length", 11, false),
880d43fa8efSStefan Eßer 	BC_LEX_KW_ENTRY("global_stacks", 13, false),
881d43fa8efSStefan Eßer 	BC_LEX_KW_ENTRY("leading_zero", 12, false),
88244d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("stream", 6, false),
883252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("else", 4, false),
884252884aeSStefan Eßer };
885252884aeSStefan Eßer 
88644d4804dSStefan Eßer /// The length of the list of bc keywords.
887252884aeSStefan Eßer const size_t bc_lex_kws_len = sizeof(bc_lex_kws) / sizeof(BcLexKeyword);
888252884aeSStefan Eßer 
88944d4804dSStefan Eßer #if BC_C11
89044d4804dSStefan Eßer 
89144d4804dSStefan Eßer // This is here to ensure that BC_LEX_NKWS, which is needed for the
89244d4804dSStefan Eßer // redefined_kws in BcVm, is correct. If it's correct under C11, it will be
89344d4804dSStefan Eßer // correct under C99, and I did not know any other way of ensuring they remained
89444d4804dSStefan Eßer // synchronized.
89544d4804dSStefan Eßer static_assert(sizeof(bc_lex_kws) / sizeof(BcLexKeyword) == BC_LEX_NKWS,
89644d4804dSStefan Eßer               "BC_LEX_NKWS is wrong.");
89744d4804dSStefan Eßer 
89844d4804dSStefan Eßer #endif // BC_C11
89944d4804dSStefan Eßer 
90044d4804dSStefan Eßer /// An array of booleans that correspond to token types. An entry is true if the
90144d4804dSStefan Eßer /// token is valid in an expression, false otherwise. This will need to change
90244d4804dSStefan Eßer /// if tokens change.
903252884aeSStefan Eßer const uint8_t bc_parse_exprs[] = {
90444d4804dSStefan Eßer 
90544d4804dSStefan Eßer 	// Starts with BC_LEX_EOF.
906252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),
90744d4804dSStefan Eßer 
90844d4804dSStefan Eßer 	// Starts with BC_LEX_OP_MULTIPLY if extra math is enabled, BC_LEX_OP_DIVIDE
90944d4804dSStefan Eßer 	// otherwise.
910252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
91144d4804dSStefan Eßer 
91244d4804dSStefan Eßer 	// Starts with BC_LEX_OP_REL_EQ if extra math is enabled, BC_LEX_OP_REL_LT
91344d4804dSStefan Eßer 	// otherwise.
914252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
91544d4804dSStefan Eßer 
91644d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
91744d4804dSStefan Eßer 
91844d4804dSStefan Eßer 	// Starts with BC_LEX_OP_ASSIGN_POWER.
919252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
92044d4804dSStefan Eßer 
92144d4804dSStefan Eßer 	// Starts with BC_LEX_OP_ASSIGN_RSHIFT.
922252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, false, false, true, true, false, false),
92344d4804dSStefan Eßer 
92444d4804dSStefan Eßer 	// Starts with BC_LEX_RBRACKET.
92544d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, true, true, true, false),
92644d4804dSStefan Eßer 
92744d4804dSStefan Eßer 	// Starts with BC_LEX_KW_BREAK.
928252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false),
92944d4804dSStefan Eßer 
93044d4804dSStefan Eßer 	// Starts with BC_LEX_KW_HALT.
931252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, true, true, true, true, true, true, false),
93244d4804dSStefan Eßer 
93344d4804dSStefan Eßer 	// Starts with BC_LEX_KW_SQRT.
93444d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, false, true),
93544d4804dSStefan Eßer 
93644d4804dSStefan Eßer 	// Starts with BC_LEX_KW_MAXIBASE.
937d43fa8efSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
938d43fa8efSStefan Eßer 
939d43fa8efSStefan Eßer 	// Starts with BC_LEX_KW_STREAM.
940d43fa8efSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, 0, 0, 0, 0, 0, 0)
94144d4804dSStefan Eßer 
94244d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
94344d4804dSStefan Eßer 
94444d4804dSStefan Eßer 	// Starts with BC_LEX_OP_ASSIGN_PLUS.
945252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, false, false, true, true, false),
94644d4804dSStefan Eßer 
94744d4804dSStefan Eßer 	// Starts with BC_LEX_COMMA.
94844d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, true, true, true),
94944d4804dSStefan Eßer 
95044d4804dSStefan Eßer 	// Starts with BC_LEX_KW_AUTO.
951252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false),
95244d4804dSStefan Eßer 
95344d4804dSStefan Eßer 	// Starts with BC_LEX_KW_WHILE.
954252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, false),
95544d4804dSStefan Eßer 
95644d4804dSStefan Eßer 	// Starts with BC_LEX_KW_SQRT.
95744d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, false, true, true),
95844d4804dSStefan Eßer 
95944d4804dSStefan Eßer 	// Starts with BC_LEX_KW_MAXSCALE,
960d43fa8efSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, false, false, 0)
96144d4804dSStefan Eßer 
962252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
963252884aeSStefan Eßer };
964252884aeSStefan Eßer 
96544d4804dSStefan Eßer /// An array of data for operators that correspond to token types.
966252884aeSStefan Eßer const uchar bc_parse_ops[] = {
967252884aeSStefan Eßer 	BC_PARSE_OP(0, false), BC_PARSE_OP(0, false),
968252884aeSStefan Eßer 	BC_PARSE_OP(1, false), BC_PARSE_OP(1, false),
969252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
970252884aeSStefan Eßer 	BC_PARSE_OP(2, false),
971252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
972252884aeSStefan Eßer 	BC_PARSE_OP(4, false),
973252884aeSStefan Eßer 	BC_PARSE_OP(5, true), BC_PARSE_OP(5, true), BC_PARSE_OP(5, true),
974252884aeSStefan Eßer 	BC_PARSE_OP(6, true), BC_PARSE_OP(6, true),
975252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
976252884aeSStefan Eßer 	BC_PARSE_OP(3, false),
977252884aeSStefan Eßer 	BC_PARSE_OP(7, true), BC_PARSE_OP(7, true),
978252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
979252884aeSStefan Eßer 	BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true),
980252884aeSStefan Eßer 	BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true),
981252884aeSStefan Eßer 	BC_PARSE_OP(11, true), BC_PARSE_OP(10, true),
982252884aeSStefan Eßer 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
983252884aeSStefan Eßer 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
984252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
985252884aeSStefan Eßer 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
986252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
987252884aeSStefan Eßer 	BC_PARSE_OP(8, false),
988252884aeSStefan Eßer };
989252884aeSStefan Eßer 
990252884aeSStefan Eßer // These identify what tokens can come after expressions in certain cases.
99144d4804dSStefan Eßer 
99244d4804dSStefan Eßer /// The valid next tokens for normal expressions.
993252884aeSStefan Eßer const BcParseNext bc_parse_next_expr =
994252884aeSStefan Eßer 	BC_PARSE_NEXT(4, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_RBRACE, BC_LEX_EOF);
99544d4804dSStefan Eßer 
99644d4804dSStefan Eßer /// The valid next tokens for function argument expressions.
99744d4804dSStefan Eßer const BcParseNext bc_parse_next_arg =
998252884aeSStefan Eßer 	BC_PARSE_NEXT(2, BC_LEX_RPAREN, BC_LEX_COMMA);
99944d4804dSStefan Eßer 
100044d4804dSStefan Eßer /// The valid next tokens for expressions in print statements.
1001252884aeSStefan Eßer const BcParseNext bc_parse_next_print =
1002252884aeSStefan Eßer 	BC_PARSE_NEXT(4, BC_LEX_COMMA, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_EOF);
100344d4804dSStefan Eßer 
100444d4804dSStefan Eßer /// The valid next tokens for if statement conditions or loop conditions. This
100544d4804dSStefan Eßer /// is used in for loops for the update expression and for builtin function.
100644d4804dSStefan Eßer ///
100744d4804dSStefan Eßer /// The name is an artifact of history, and is related to @a BC_PARSE_REL (see
100844d4804dSStefan Eßer /// include/parse.h). It refers to how POSIX only allows some operators as part
100944d4804dSStefan Eßer /// of the conditional of for loops, while loops, and if statements.
1010252884aeSStefan Eßer const BcParseNext bc_parse_next_rel = BC_PARSE_NEXT(1, BC_LEX_RPAREN);
101144d4804dSStefan Eßer 
101244d4804dSStefan Eßer /// The valid next tokens for array element expressions.
1013252884aeSStefan Eßer const BcParseNext bc_parse_next_elem = BC_PARSE_NEXT(1, BC_LEX_RBRACKET);
101444d4804dSStefan Eßer 
101544d4804dSStefan Eßer /// The valid next tokens for for loop initialization expressions and condition
101644d4804dSStefan Eßer /// expressions.
1017252884aeSStefan Eßer const BcParseNext bc_parse_next_for = BC_PARSE_NEXT(1, BC_LEX_SCOLON);
101844d4804dSStefan Eßer 
101944d4804dSStefan Eßer /// The valid next tokens for read expressions.
1020252884aeSStefan Eßer const BcParseNext bc_parse_next_read =
1021252884aeSStefan Eßer 	BC_PARSE_NEXT(2, BC_LEX_NLINE, BC_LEX_EOF);
102244d4804dSStefan Eßer 
102344d4804dSStefan Eßer /// The valid next tokens for the arguments of a builtin function with multiple
102444d4804dSStefan Eßer /// arguments.
102544d4804dSStefan Eßer const BcParseNext bc_parse_next_builtin = BC_PARSE_NEXT(1, BC_LEX_COMMA);
102644d4804dSStefan Eßer 
1027252884aeSStefan Eßer #endif // BC_ENABLED
1028252884aeSStefan Eßer 
1029252884aeSStefan Eßer #if DC_ENABLED
103044d4804dSStefan Eßer 
103144d4804dSStefan Eßer /// A list of instructions that need register arguments in dc.
1032252884aeSStefan Eßer const uint8_t dc_lex_regs[] = {
1033252884aeSStefan Eßer 	BC_LEX_OP_REL_EQ, BC_LEX_OP_REL_LE, BC_LEX_OP_REL_GE, BC_LEX_OP_REL_NE,
1034252884aeSStefan Eßer 	BC_LEX_OP_REL_LT, BC_LEX_OP_REL_GT, BC_LEX_SCOLON, BC_LEX_COLON,
1035252884aeSStefan Eßer 	BC_LEX_KW_ELSE, BC_LEX_LOAD, BC_LEX_LOAD_POP, BC_LEX_OP_ASSIGN,
103644d4804dSStefan Eßer 	BC_LEX_STORE_PUSH, BC_LEX_REG_STACK_LEVEL, BC_LEX_ARRAY_LENGTH,
1037252884aeSStefan Eßer };
1038252884aeSStefan Eßer 
103944d4804dSStefan Eßer /// The length of the list of register instructions.
1040252884aeSStefan Eßer const size_t dc_lex_regs_len = sizeof(dc_lex_regs) / sizeof(uint8_t);
1041252884aeSStefan Eßer 
104244d4804dSStefan Eßer /// A list corresponding to characters starting at double quote ("). If an entry
104344d4804dSStefan Eßer /// is BC_LEX_INVALID, then that character needs extra lexing in dc. If it does
104444d4804dSStefan Eßer /// not, the character can trivially be replaced by the entry. Positions are
104544d4804dSStefan Eßer /// kept because it corresponds to the ASCII table. This may need to be changed
104644d4804dSStefan Eßer /// if tokens change.
1047252884aeSStefan Eßer const uchar dc_lex_tokens[] = {
104844d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1049252884aeSStefan Eßer 	BC_LEX_KW_IRAND,
105044d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1051252884aeSStefan Eßer 	BC_LEX_INVALID,
105244d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1053252884aeSStefan Eßer 	BC_LEX_INVALID,
1054252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1055252884aeSStefan Eßer 	BC_LEX_OP_TRUNC,
1056252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1057252884aeSStefan Eßer 	BC_LEX_INVALID,
1058252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1059252884aeSStefan Eßer 	BC_LEX_OP_MODULUS, BC_LEX_INVALID,
106044d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1061252884aeSStefan Eßer 	BC_LEX_KW_RAND,
106244d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1063252884aeSStefan Eßer 	BC_LEX_INVALID,
106444d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1065252884aeSStefan Eßer 	BC_LEX_LPAREN, BC_LEX_RPAREN, BC_LEX_OP_MULTIPLY, BC_LEX_OP_PLUS,
106644d4804dSStefan Eßer 	BC_LEX_EXEC_STACK_LENGTH, BC_LEX_OP_MINUS, BC_LEX_INVALID, BC_LEX_OP_DIVIDE,
1067252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1068252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1069252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID,
1070252884aeSStefan Eßer 	BC_LEX_COLON, BC_LEX_SCOLON, BC_LEX_OP_REL_GT, BC_LEX_OP_REL_EQ,
1071252884aeSStefan Eßer 	BC_LEX_OP_REL_LT, BC_LEX_KW_READ,
1072252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1073252884aeSStefan Eßer 	BC_LEX_OP_PLACES,
1074252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1075252884aeSStefan Eßer 	BC_LEX_INVALID,
1076252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1077252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1078252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_EQ_NO_REG,
1079252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1080252884aeSStefan Eßer 	BC_LEX_OP_LSHIFT,
1081252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1082252884aeSStefan Eßer 	BC_LEX_INVALID,
1083252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1084252884aeSStefan Eßer 	BC_LEX_KW_IBASE,
108544d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1086252884aeSStefan Eßer 	BC_LEX_KW_SEED,
108744d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1088252884aeSStefan Eßer 	BC_LEX_INVALID,
108944d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1090252884aeSStefan Eßer 	BC_LEX_KW_SCALE, BC_LEX_LOAD_POP, BC_LEX_OP_BOOL_AND, BC_LEX_OP_BOOL_NOT,
109144d4804dSStefan Eßer 	BC_LEX_KW_OBASE, BC_LEX_KW_STREAM, BC_LEX_NQUIT, BC_LEX_POP,
1092252884aeSStefan Eßer 	BC_LEX_STORE_PUSH, BC_LEX_KW_MAXIBASE, BC_LEX_KW_MAXOBASE,
1093252884aeSStefan Eßer 	BC_LEX_KW_MAXSCALE,
109444d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1095252884aeSStefan Eßer 	BC_LEX_KW_MAXRAND,
109644d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1097252884aeSStefan Eßer 	BC_LEX_INVALID,
109844d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
109944d4804dSStefan Eßer 	BC_LEX_SCALE_FACTOR, BC_LEX_ARRAY_LENGTH, BC_LEX_KW_LENGTH,
110044d4804dSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
110144d4804dSStefan Eßer 	BC_LEX_OP_POWER, BC_LEX_NEG, BC_LEX_INVALID,
110244d4804dSStefan Eßer 	BC_LEX_KW_ASCIIFY, BC_LEX_KW_ABS, BC_LEX_CLEAR_STACK, BC_LEX_DUPLICATE,
1103252884aeSStefan Eßer 	BC_LEX_KW_ELSE, BC_LEX_PRINT_STACK, BC_LEX_INVALID,
1104252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1105252884aeSStefan Eßer 	BC_LEX_OP_RSHIFT,
1106252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1107252884aeSStefan Eßer 	BC_LEX_INVALID,
1108252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1109252884aeSStefan Eßer 	BC_LEX_STORE_IBASE,
111044d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1111252884aeSStefan Eßer 	BC_LEX_STORE_SEED,
111244d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1113252884aeSStefan Eßer 	BC_LEX_INVALID,
111444d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1115252884aeSStefan Eßer 	BC_LEX_STORE_SCALE, BC_LEX_LOAD,
1116252884aeSStefan Eßer 	BC_LEX_OP_BOOL_OR, BC_LEX_PRINT_POP, BC_LEX_STORE_OBASE, BC_LEX_KW_PRINT,
1117252884aeSStefan Eßer 	BC_LEX_KW_QUIT, BC_LEX_SWAP, BC_LEX_OP_ASSIGN, BC_LEX_INVALID,
1118252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_KW_SQRT, BC_LEX_INVALID, BC_LEX_EXECUTE,
111944d4804dSStefan Eßer 	BC_LEX_REG_STACK_LEVEL, BC_LEX_STACK_LEVEL,
112044d4804dSStefan Eßer 	BC_LEX_LBRACE, BC_LEX_KW_MODEXP, BC_LEX_RBRACE, BC_LEX_KW_DIVMOD,
1121252884aeSStefan Eßer 	BC_LEX_INVALID
1122252884aeSStefan Eßer };
1123252884aeSStefan Eßer 
112444d4804dSStefan Eßer /// A list of instructions that correspond to lex tokens. If an entry is
112544d4804dSStefan Eßer /// BC_INST_INVALID, that lex token needs extra parsing in the dc parser.
112644d4804dSStefan Eßer /// Otherwise, the token can trivially be replaced by the entry. This needs to
112744d4804dSStefan Eßer /// be updated if the tokens change.
1128252884aeSStefan Eßer const uchar dc_parse_insts[] = {
1129252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID,
1130252884aeSStefan Eßer #if BC_ENABLED
1131252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID,
1132252884aeSStefan Eßer #endif // BC_ENABLED
1133252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_BOOL_NOT,
1134252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1135252884aeSStefan Eßer 	BC_INST_TRUNC,
1136252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1137252884aeSStefan Eßer 	BC_INST_POWER, BC_INST_MULTIPLY, BC_INST_DIVIDE, BC_INST_MODULUS,
1138252884aeSStefan Eßer 	BC_INST_PLUS, BC_INST_MINUS,
1139252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1140252884aeSStefan Eßer 	BC_INST_PLACES,
1141252884aeSStefan Eßer 	BC_INST_LSHIFT, BC_INST_RSHIFT,
1142252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1143252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1144252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID,
1145252884aeSStefan Eßer 	BC_INST_BOOL_OR, BC_INST_BOOL_AND,
1146252884aeSStefan Eßer #if BC_ENABLED
1147252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1148252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID,
1149252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1150252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1151252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1152252884aeSStefan Eßer #endif // BC_ENABLED
1153252884aeSStefan Eßer 	BC_INST_INVALID,
1154252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GT, BC_INST_REL_LT,
1155252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GE,
1156252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_REL_LE,
1157252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1158252884aeSStefan Eßer #if BC_ENABLED
1159252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1160252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1161252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1162252884aeSStefan Eßer #endif // BC_ENABLED
1163252884aeSStefan Eßer 	BC_INST_IBASE, BC_INST_OBASE, BC_INST_SCALE,
116444d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1165252884aeSStefan Eßer 	BC_INST_SEED,
116644d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1167252884aeSStefan Eßer 	BC_INST_LENGTH, BC_INST_PRINT,
1168252884aeSStefan Eßer 	BC_INST_SQRT, BC_INST_ABS,
116944d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1170252884aeSStefan Eßer 	BC_INST_IRAND,
117144d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
117244d4804dSStefan Eßer 	BC_INST_ASCIIFY, BC_INST_MODEXP, BC_INST_DIVMOD,
1173252884aeSStefan Eßer 	BC_INST_QUIT, BC_INST_INVALID,
117444d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1175252884aeSStefan Eßer 	BC_INST_RAND,
117644d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1177252884aeSStefan Eßer 	BC_INST_MAXIBASE,
1178252884aeSStefan Eßer 	BC_INST_MAXOBASE, BC_INST_MAXSCALE,
117944d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1180252884aeSStefan Eßer 	BC_INST_MAXRAND,
1181252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1182d43fa8efSStefan Eßer 	BC_INST_LINE_LENGTH,
1183d43fa8efSStefan Eßer #if BC_ENABLED
1184d43fa8efSStefan Eßer 	BC_INST_INVALID,
1185d43fa8efSStefan Eßer #endif // BC_ENABLED
1186d43fa8efSStefan Eßer 	BC_INST_LEADING_ZERO, BC_INST_PRINT_STREAM, BC_INST_INVALID,
118744d4804dSStefan Eßer 	BC_INST_REL_EQ, BC_INST_INVALID,
1188252884aeSStefan Eßer 	BC_INST_EXECUTE, BC_INST_PRINT_STACK, BC_INST_CLEAR_STACK,
118944d4804dSStefan Eßer 	BC_INST_INVALID, BC_INST_STACK_LEN, BC_INST_DUPLICATE, BC_INST_SWAP,
119044d4804dSStefan Eßer 	BC_INST_POP,
1191252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1192252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1193252884aeSStefan Eßer 	BC_INST_INVALID,
1194252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1195252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
119644d4804dSStefan Eßer 	BC_INST_PRINT_POP, BC_INST_NQUIT, BC_INST_EXEC_STACK_LEN,
119744d4804dSStefan Eßer 	BC_INST_SCALE_FUNC, BC_INST_INVALID,
1198252884aeSStefan Eßer };
1199252884aeSStefan Eßer #endif // DC_ENABLED
1200252884aeSStefan Eßer 
120150696a6eSStefan Eßer #endif // !BC_ENABLE_LIBRARY
120250696a6eSStefan Eßer 
120344d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
120450696a6eSStefan Eßer 
120544d4804dSStefan Eßer /// A constant for the rand multiplier.
120650696a6eSStefan Eßer const BcRandState bc_rand_multiplier = BC_RAND_MULTIPLIER;
120750696a6eSStefan Eßer 
120844d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
120950696a6eSStefan Eßer 
1210252884aeSStefan Eßer #if BC_LONG_BIT >= 64
121144d4804dSStefan Eßer 
121244d4804dSStefan Eßer /// A constant array for the max of a bigdig number as a BcDig array.
1213252884aeSStefan Eßer const BcDig bc_num_bigdigMax[] = {
1214252884aeSStefan Eßer 	709551616U,
1215252884aeSStefan Eßer 	446744073U,
121650696a6eSStefan Eßer 	18U,
121750696a6eSStefan Eßer };
121844d4804dSStefan Eßer 
121944d4804dSStefan Eßer /// A constant array for the max of 2 times a bigdig number as a BcDig array.
122050696a6eSStefan Eßer const BcDig bc_num_bigdigMax2[] = {
122150696a6eSStefan Eßer 	768211456U,
122250696a6eSStefan Eßer 	374607431U,
122350696a6eSStefan Eßer 	938463463U,
122450696a6eSStefan Eßer 	282366920U,
122550696a6eSStefan Eßer 	340U,
1226252884aeSStefan Eßer };
122744d4804dSStefan Eßer 
1228252884aeSStefan Eßer #else // BC_LONG_BIT >= 64
122944d4804dSStefan Eßer 
123044d4804dSStefan Eßer /// A constant array for the max of a bigdig number as a BcDig array.
1231252884aeSStefan Eßer const BcDig bc_num_bigdigMax[] = {
1232252884aeSStefan Eßer 	7296U,
1233252884aeSStefan Eßer 	9496U,
1234252884aeSStefan Eßer 	42U,
1235252884aeSStefan Eßer };
123644d4804dSStefan Eßer 
123744d4804dSStefan Eßer /// A constant array for the max of 2 times a bigdig number as a BcDig array.
123850696a6eSStefan Eßer const BcDig bc_num_bigdigMax2[] = {
123950696a6eSStefan Eßer 	1616U,
124050696a6eSStefan Eßer 	955U,
124150696a6eSStefan Eßer 	737U,
124250696a6eSStefan Eßer 	6744U,
124350696a6eSStefan Eßer 	1844U,
124450696a6eSStefan Eßer };
124544d4804dSStefan Eßer 
1246252884aeSStefan Eßer #endif // BC_LONG_BIT >= 64
1247252884aeSStefan Eßer 
124844d4804dSStefan Eßer /// The size of the bigdig max array.
1249252884aeSStefan Eßer const size_t bc_num_bigdigMax_size = sizeof(bc_num_bigdigMax) / sizeof(BcDig);
125044d4804dSStefan Eßer 
125144d4804dSStefan Eßer /// The size of the bigdig max times 2 array.
125250696a6eSStefan Eßer const size_t bc_num_bigdigMax2_size = sizeof(bc_num_bigdigMax2) / sizeof(BcDig);
1253252884aeSStefan Eßer 
125444d4804dSStefan Eßer /// A string of digits for easy conversion from characters to digits.
1255252884aeSStefan Eßer const char bc_num_hex_digits[] = "0123456789ABCDEF";
1256252884aeSStefan Eßer 
125744d4804dSStefan Eßer /// An array for easy conversion from exponent to power of 10.
1258252884aeSStefan Eßer const BcBigDig bc_num_pow10[BC_BASE_DIGS + 1] = {
1259252884aeSStefan Eßer 	1,
1260252884aeSStefan Eßer 	10,
1261252884aeSStefan Eßer 	100,
1262252884aeSStefan Eßer 	1000,
1263252884aeSStefan Eßer 	10000,
1264252884aeSStefan Eßer #if BC_BASE_DIGS > 4
1265252884aeSStefan Eßer 	100000,
1266252884aeSStefan Eßer 	1000000,
1267252884aeSStefan Eßer 	10000000,
1268252884aeSStefan Eßer 	100000000,
1269252884aeSStefan Eßer 	1000000000,
1270252884aeSStefan Eßer #endif // BC_BASE_DIGS > 4
1271252884aeSStefan Eßer };
1272252884aeSStefan Eßer 
127350696a6eSStefan Eßer #if !BC_ENABLE_LIBRARY
127450696a6eSStefan Eßer 
127544d4804dSStefan Eßer /// An array of functions for binary operators corresponding to the order of
127644d4804dSStefan Eßer /// the instructions for the operators.
1277252884aeSStefan Eßer const BcNumBinaryOp bc_program_ops[] = {
1278252884aeSStefan Eßer 	bc_num_pow, bc_num_mul, bc_num_div, bc_num_mod, bc_num_add, bc_num_sub,
1279252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1280252884aeSStefan Eßer 	bc_num_places, bc_num_lshift, bc_num_rshift,
1281252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1282252884aeSStefan Eßer };
1283252884aeSStefan Eßer 
128444d4804dSStefan Eßer /// An array of functions for binary operators allocation requests corresponding
128544d4804dSStefan Eßer /// to the order of the instructions for the operators.
1286252884aeSStefan Eßer const BcNumBinaryOpReq bc_program_opReqs[] = {
128750696a6eSStefan Eßer 	bc_num_powReq, bc_num_mulReq, bc_num_divReq, bc_num_divReq,
1288252884aeSStefan Eßer 	bc_num_addReq, bc_num_addReq,
1289252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1290252884aeSStefan Eßer 	bc_num_placesReq, bc_num_placesReq, bc_num_placesReq,
1291252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1292252884aeSStefan Eßer };
1293252884aeSStefan Eßer 
129444d4804dSStefan Eßer /// An array of unary operator functions corresponding to the order of the
129544d4804dSStefan Eßer /// instructions.
1296252884aeSStefan Eßer const BcProgramUnary bc_program_unarys[] = {
1297252884aeSStefan Eßer 	bc_program_negate, bc_program_not,
1298252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1299252884aeSStefan Eßer 	bc_program_trunc,
1300252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1301252884aeSStefan Eßer };
1302252884aeSStefan Eßer 
130344d4804dSStefan Eßer /// A filename for when parsing expressions.
1304252884aeSStefan Eßer const char bc_program_exprs_name[] = "<exprs>";
1305252884aeSStefan Eßer 
130644d4804dSStefan Eßer /// A filename for when parsing stdin..
1307252884aeSStefan Eßer const char bc_program_stdin_name[] = "<stdin>";
130844d4804dSStefan Eßer 
130944d4804dSStefan Eßer /// A ready message for SIGINT catching.
1310252884aeSStefan Eßer const char bc_program_ready_msg[] = "ready for more input\n";
131144d4804dSStefan Eßer 
131244d4804dSStefan Eßer /// The length of the ready message.
1313252884aeSStefan Eßer const size_t bc_program_ready_msg_len = sizeof(bc_program_ready_msg) - 1;
131444d4804dSStefan Eßer 
131544d4804dSStefan Eßer /// A list of escape characters that a print statement should treat specially.
1316252884aeSStefan Eßer const char bc_program_esc_chars[] = "ab\\efnqrt";
131744d4804dSStefan Eßer 
131844d4804dSStefan Eßer /// A list of characters corresponding to the escape characters above.
1319252884aeSStefan Eßer const char bc_program_esc_seqs[] = "\a\b\\\\\f\n\"\r\t";
132050696a6eSStefan Eßer 
132150696a6eSStefan Eßer #endif // !BC_ENABLE_LIBRARY
1322