xref: /freebsd/contrib/bc/src/data.c (revision 12e0d316644a4f80f5f1f78cf07bd93def43b1ca)
1252884aeSStefan Eßer /*
2252884aeSStefan Eßer  * *****************************************************************************
3252884aeSStefan Eßer  *
43aa99676SStefan Eßer  * SPDX-License-Identifier: BSD-2-Clause
5252884aeSStefan Eßer  *
6a970610aSStefan Eßer  * Copyright (c) 2018-2024 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 
6978bc019dSStefan Eßer // clang-format off
7078bc019dSStefan Eßer 
7144d4804dSStefan Eßer /// The copyright banner.
72252884aeSStefan Eßer const char bc_copyright[] =
73a970610aSStefan Eßer 	"Copyright (c) 2018-2024 Gavin D. Howard and contributors\n"
744fca8e0fSStefan Eßer 	"Report bugs at: https://git.gavinhoward.com/gavin/bc\n\n"
75252884aeSStefan Eßer 	"This is free software with ABSOLUTELY NO WARRANTY.\n";
76252884aeSStefan Eßer 
7778bc019dSStefan Eßer // clang-format on
7878bc019dSStefan Eßer 
7944d4804dSStefan Eßer #ifdef __OpenBSD__
8044d4804dSStefan Eßer 
8144d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
8244d4804dSStefan Eßer 
8344d4804dSStefan Eßer #if BC_ENABLE_HISTORY
8444d4804dSStefan Eßer 
8544d4804dSStefan Eßer /// The pledges for starting bc.
8644d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio tty unveil";
8744d4804dSStefan Eßer 
8844d4804dSStefan Eßer /// The final pledges with history enabled.
8944d4804dSStefan Eßer const char bc_pledge_end_history[] = "rpath stdio tty";
9044d4804dSStefan Eßer 
9144d4804dSStefan Eßer #else // BC_ENABLE_HISTORY
9244d4804dSStefan Eßer 
9344d4804dSStefan Eßer /// The pledges for starting bc.
9444d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio unveil";
9544d4804dSStefan Eßer 
9644d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
9744d4804dSStefan Eßer 
9844d4804dSStefan Eßer /// The final pledges with history history disabled.
9944d4804dSStefan Eßer const char bc_pledge_end[] = "rpath stdio";
10044d4804dSStefan Eßer 
10144d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
10244d4804dSStefan Eßer 
10344d4804dSStefan Eßer #if BC_ENABLE_HISTORY
10444d4804dSStefan Eßer 
10544d4804dSStefan Eßer /// The pledges for starting bc.
10644d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio tty";
10744d4804dSStefan Eßer 
10844d4804dSStefan Eßer /// The final pledges with history enabled.
10944d4804dSStefan Eßer const char bc_pledge_end_history[] = "stdio tty";
11044d4804dSStefan Eßer 
11144d4804dSStefan Eßer #else // BC_ENABLE_HISTORY
11244d4804dSStefan Eßer 
11344d4804dSStefan Eßer /// The pledges for starting bc.
11444d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio";
11544d4804dSStefan Eßer 
11644d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
11744d4804dSStefan Eßer 
11844d4804dSStefan Eßer /// The final pledges with history history disabled.
11944d4804dSStefan Eßer const char bc_pledge_end[] = "stdio";
12044d4804dSStefan Eßer 
12144d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
12244d4804dSStefan Eßer 
12344d4804dSStefan Eßer #else // __OpenBSD__
12444d4804dSStefan Eßer 
12544d4804dSStefan Eßer /// The pledges for starting bc.
12644d4804dSStefan Eßer const char bc_pledge_start[] = "";
12744d4804dSStefan Eßer 
12844d4804dSStefan Eßer #if BC_ENABLE_HISTORY
12944d4804dSStefan Eßer 
13044d4804dSStefan Eßer /// The final pledges with history enabled.
13144d4804dSStefan Eßer const char bc_pledge_end_history[] = "";
13244d4804dSStefan Eßer 
13344d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
13444d4804dSStefan Eßer 
13544d4804dSStefan Eßer /// The final pledges with history history disabled.
13644d4804dSStefan Eßer const char bc_pledge_end[] = "";
13744d4804dSStefan Eßer 
13844d4804dSStefan Eßer #endif // __OpenBSD__
13944d4804dSStefan Eßer 
14044d4804dSStefan Eßer /// The list of long options. There is a zero set at the end for detecting the
14144d4804dSStefan Eßer /// end.
14244d4804dSStefan Eßer const BcOptLong bc_args_lopt[] = {
14344d4804dSStefan Eßer 
144d101cdd6SStefan Eßer 	{ "digit-clamp", BC_OPT_NONE, 'c' },
14544d4804dSStefan Eßer 	{ "expression", BC_OPT_REQUIRED, 'e' },
14644d4804dSStefan Eßer 	{ "file", BC_OPT_REQUIRED, 'f' },
14744d4804dSStefan Eßer 	{ "help", BC_OPT_NONE, 'h' },
14844d4804dSStefan Eßer 	{ "interactive", BC_OPT_NONE, 'i' },
14978bc019dSStefan Eßer 	{ "ibase", BC_OPT_REQUIRED, 'I' },
150d43fa8efSStefan Eßer 	{ "leading-zeroes", BC_OPT_NONE, 'z' },
151d43fa8efSStefan Eßer 	{ "no-line-length", BC_OPT_NONE, 'L' },
15278bc019dSStefan Eßer 	{ "obase", BC_OPT_REQUIRED, 'O' },
153d101cdd6SStefan Eßer 	{ "no-digit-clamp", BC_OPT_NONE, 'C' },
15444d4804dSStefan Eßer 	{ "no-prompt", BC_OPT_NONE, 'P' },
15544d4804dSStefan Eßer 	{ "no-read-prompt", BC_OPT_NONE, 'R' },
15678bc019dSStefan Eßer 	{ "scale", BC_OPT_REQUIRED, 'S' },
15778bc019dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
15878bc019dSStefan Eßer 	{ "seed", BC_OPT_REQUIRED, 'E' },
15978bc019dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
16044d4804dSStefan Eßer #if BC_ENABLED
16144d4804dSStefan Eßer 	{ "global-stacks", BC_OPT_BC_ONLY, 'g' },
16244d4804dSStefan Eßer 	{ "mathlib", BC_OPT_BC_ONLY, 'l' },
16344d4804dSStefan Eßer 	{ "quiet", BC_OPT_BC_ONLY, 'q' },
16444d4804dSStefan Eßer 	{ "redefine", BC_OPT_REQUIRED_BC_ONLY, 'r' },
16544d4804dSStefan Eßer 	{ "standard", BC_OPT_BC_ONLY, 's' },
16644d4804dSStefan Eßer 	{ "warn", BC_OPT_BC_ONLY, 'w' },
16744d4804dSStefan Eßer #endif // BC_ENABLED
16844d4804dSStefan Eßer 	{ "version", BC_OPT_NONE, 'v' },
16944d4804dSStefan Eßer 	{ "version", BC_OPT_NONE, 'V' },
17044d4804dSStefan Eßer #if DC_ENABLED
17144d4804dSStefan Eßer 	{ "extended-register", BC_OPT_DC_ONLY, 'x' },
17244d4804dSStefan Eßer #endif // DC_ENABLED
17344d4804dSStefan Eßer 	{ NULL, 0, 0 },
17444d4804dSStefan Eßer 
17544d4804dSStefan Eßer };
17644d4804dSStefan Eßer 
177*12e0d316SStefan Eßer #if BC_ENABLE_OSSFUZZ
178*12e0d316SStefan Eßer 
179*12e0d316SStefan Eßer const char* bc_fuzzer_args_c[] = {
180*12e0d316SStefan Eßer 	"bc",
181*12e0d316SStefan Eßer 	"-lqc",
182*12e0d316SStefan Eßer 	"-e",
183*12e0d316SStefan Eßer 	"seed = 82507683022933941343198991100880559238.7080266844215897551270760113"
184*12e0d316SStefan Eßer 	"4734858017748592704189096562163085637164174146616055338762825421827784"
185*12e0d316SStefan Eßer 	"566630725748836994171142578125",
186*12e0d316SStefan Eßer 	NULL,
187*12e0d316SStefan Eßer };
188*12e0d316SStefan Eßer 
189*12e0d316SStefan Eßer const char* dc_fuzzer_args_c[] = {
190*12e0d316SStefan Eßer 	"dc",
191*12e0d316SStefan Eßer 	"-xc",
192*12e0d316SStefan Eßer 	"-e",
193*12e0d316SStefan Eßer 	"82507683022933941343198991100880559238.7080266844215897551270760113"
194*12e0d316SStefan Eßer 	"4734858017748592704189096562163085637164174146616055338762825421827784"
195*12e0d316SStefan Eßer 	"566630725748836994171142578125j",
196*12e0d316SStefan Eßer 	NULL,
197*12e0d316SStefan Eßer };
198*12e0d316SStefan Eßer 
199*12e0d316SStefan Eßer const char* bc_fuzzer_args_C[] = {
200*12e0d316SStefan Eßer 	"bc",
201*12e0d316SStefan Eßer 	"-lqC",
202*12e0d316SStefan Eßer 	"-e",
203*12e0d316SStefan Eßer 	"seed = 82507683022933941343198991100880559238.7080266844215897551270760113"
204*12e0d316SStefan Eßer 	"4734858017748592704189096562163085637164174146616055338762825421827784"
205*12e0d316SStefan Eßer 	"566630725748836994171142578125",
206*12e0d316SStefan Eßer 	NULL,
207*12e0d316SStefan Eßer };
208*12e0d316SStefan Eßer 
209*12e0d316SStefan Eßer const char* dc_fuzzer_args_C[] = {
210*12e0d316SStefan Eßer 	"dc",
211*12e0d316SStefan Eßer 	"-xC",
212*12e0d316SStefan Eßer 	"-e",
213*12e0d316SStefan Eßer 	"82507683022933941343198991100880559238.7080266844215897551270760113"
214*12e0d316SStefan Eßer 	"4734858017748592704189096562163085637164174146616055338762825421827784"
215*12e0d316SStefan Eßer 	"566630725748836994171142578125j",
216*12e0d316SStefan Eßer 	NULL,
217*12e0d316SStefan Eßer };
218*12e0d316SStefan Eßer 
219*12e0d316SStefan Eßer const size_t bc_fuzzer_args_len = sizeof(bc_fuzzer_args_c) / sizeof(char*);
220*12e0d316SStefan Eßer 
221*12e0d316SStefan Eßer #if BC_C11
222*12e0d316SStefan Eßer 
223*12e0d316SStefan Eßer _Static_assert(sizeof(bc_fuzzer_args_C) / sizeof(char*) == bc_fuzzer_args_len,
224*12e0d316SStefan Eßer                "Wrong number of bc fuzzer args");
225*12e0d316SStefan Eßer 
226*12e0d316SStefan Eßer _Static_assert(sizeof(dc_fuzzer_args_c) / sizeof(char*) == bc_fuzzer_args_len,
227*12e0d316SStefan Eßer                "Wrong number of dc fuzzer args");
228*12e0d316SStefan Eßer 
229*12e0d316SStefan Eßer _Static_assert(sizeof(dc_fuzzer_args_C) / sizeof(char*) == bc_fuzzer_args_len,
230*12e0d316SStefan Eßer                "Wrong number of dc fuzzer args");
231*12e0d316SStefan Eßer 
232*12e0d316SStefan Eßer #endif // BC_C11
233*12e0d316SStefan Eßer 
234*12e0d316SStefan Eßer #endif // BC_ENABLE_OSSFUZZ
235*12e0d316SStefan Eßer 
23678bc019dSStefan Eßer // clang-format off
23778bc019dSStefan Eßer 
23844d4804dSStefan Eßer /// The default error category strings.
239252884aeSStefan Eßer const char *bc_errs[] = {
240252884aeSStefan Eßer 	"Math error:",
241252884aeSStefan Eßer 	"Parse error:",
242252884aeSStefan Eßer 	"Runtime error:",
243252884aeSStefan Eßer 	"Fatal error:",
244252884aeSStefan Eßer #if BC_ENABLED
245252884aeSStefan Eßer 	"Warning:",
246252884aeSStefan Eßer #endif // BC_ENABLED
247252884aeSStefan Eßer };
248252884aeSStefan Eßer 
24978bc019dSStefan Eßer // clang-format on
25078bc019dSStefan Eßer 
25144d4804dSStefan Eßer /// The error category for each error.
252252884aeSStefan Eßer const uchar bc_err_ids[] = {
253252884aeSStefan Eßer 
254252884aeSStefan Eßer 	BC_ERR_IDX_MATH,  BC_ERR_IDX_MATH,  BC_ERR_IDX_MATH,  BC_ERR_IDX_MATH,
255252884aeSStefan Eßer 
256252884aeSStefan Eßer 	BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL,
257252884aeSStefan Eßer 	BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL,
25844d4804dSStefan Eßer 	BC_ERR_IDX_FATAL,
259252884aeSStefan Eßer 
260252884aeSStefan Eßer 	BC_ERR_IDX_EXEC,  BC_ERR_IDX_EXEC,  BC_ERR_IDX_EXEC,  BC_ERR_IDX_EXEC,
261252884aeSStefan Eßer 	BC_ERR_IDX_EXEC,  BC_ERR_IDX_EXEC,  BC_ERR_IDX_EXEC,  BC_ERR_IDX_EXEC,
26244d4804dSStefan Eßer 	BC_ERR_IDX_EXEC,  BC_ERR_IDX_EXEC,  BC_ERR_IDX_EXEC,
263252884aeSStefan Eßer 
264252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
265252884aeSStefan Eßer 	BC_ERR_IDX_PARSE,
266252884aeSStefan Eßer #if BC_ENABLED
267252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
268252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
269252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
270252884aeSStefan Eßer 
271252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
272252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
273252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
27410041e99SStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
275252884aeSStefan Eßer #endif // BC_ENABLED
276252884aeSStefan Eßer 
277252884aeSStefan Eßer };
278252884aeSStefan Eßer 
27944d4804dSStefan Eßer /// The default error messages. There are NULL pointers because the positions
28044d4804dSStefan Eßer /// must be preserved for the locales.
281252884aeSStefan Eßer const char* const bc_err_msgs[] = {
282252884aeSStefan Eßer 
283252884aeSStefan Eßer 	"negative number",
284252884aeSStefan Eßer 	"non-integer number",
285252884aeSStefan Eßer 	"overflow: number cannot fit",
286252884aeSStefan Eßer 	"divide by 0",
287252884aeSStefan Eßer 
288252884aeSStefan Eßer 	"memory allocation failed",
289252884aeSStefan Eßer 	"I/O error",
290252884aeSStefan Eßer 	"cannot open file: %s",
29144d4804dSStefan Eßer 	"file is not text: %s",
292252884aeSStefan Eßer 	"path is a directory: %s",
293252884aeSStefan Eßer 	"bad command-line option: \"%s\"",
294252884aeSStefan Eßer 	"option requires an argument: '%c' (\"%s\")",
295252884aeSStefan Eßer 	"option takes no arguments: '%c' (\"%s\")",
29644d4804dSStefan Eßer 	"bad option argument: \"%s\"",
297252884aeSStefan Eßer 
298252884aeSStefan Eßer 	"bad ibase: must be [%lu, %lu]",
299252884aeSStefan Eßer 	"bad obase: must be [%lu, %lu]",
300252884aeSStefan Eßer 	"bad scale: must be [%lu, %lu]",
301252884aeSStefan Eßer 	"bad read() expression",
302252884aeSStefan Eßer 	"read() call inside of a read() call",
303252884aeSStefan Eßer 	"variable or array element is the wrong type",
304252884aeSStefan Eßer #if DC_ENABLED
305252884aeSStefan Eßer 	"stack has too few elements",
30644d4804dSStefan Eßer 	"stack for register \"%s\" has too few elements",
307252884aeSStefan Eßer #else // DC_ENABLED
30878bc019dSStefan Eßer 	NULL,
30978bc019dSStefan Eßer 	NULL,
310252884aeSStefan Eßer #endif // DC_ENABLED
311252884aeSStefan Eßer #if BC_ENABLED
312252884aeSStefan Eßer 	"wrong number of parameters; need %zu, have %zu",
313252884aeSStefan Eßer 	"undefined function: %s()",
314252884aeSStefan Eßer 	"cannot use a void value in an expression",
315252884aeSStefan Eßer #else
31678bc019dSStefan Eßer 	NULL,
31778bc019dSStefan Eßer 	NULL,
31878bc019dSStefan Eßer 	NULL,
319252884aeSStefan Eßer #endif // BC_ENABLED
320252884aeSStefan Eßer 
321252884aeSStefan Eßer 	"end of file",
322252884aeSStefan Eßer 	"bad character '%c'",
323252884aeSStefan Eßer 	"string end cannot be found",
324252884aeSStefan Eßer 	"comment end cannot be found",
325252884aeSStefan Eßer 	"bad token",
326252884aeSStefan Eßer #if BC_ENABLED
327252884aeSStefan Eßer 	"bad expression",
328252884aeSStefan Eßer 	"empty expression",
32944d4804dSStefan Eßer 	"bad print or stream statement",
330252884aeSStefan Eßer 	"bad function definition",
331d213476dSStefan Eßer 	("bad assignment: left side must be scale, ibase, "
332d213476dSStefan Eßer 	 "obase, seed, last, var, or array element"),
333252884aeSStefan Eßer 	"no auto variable found",
334252884aeSStefan Eßer 	"function parameter or auto \"%s%s\" already exists",
335252884aeSStefan Eßer 	"block end cannot be found",
336252884aeSStefan Eßer 	"cannot return a value from void function: %s()",
337252884aeSStefan Eßer 	"var cannot be a reference: %s",
338252884aeSStefan Eßer 
339252884aeSStefan Eßer 	"POSIX does not allow names longer than 1 character: %s",
340252884aeSStefan Eßer 	"POSIX does not allow '#' script comments",
341252884aeSStefan Eßer 	"POSIX does not allow the following keyword: %s",
342252884aeSStefan Eßer 	"POSIX does not allow a period ('.') as a shortcut for the last result",
343252884aeSStefan Eßer 	"POSIX requires parentheses around return expressions",
344252884aeSStefan Eßer 	"POSIX does not allow the following operator: %s",
345252884aeSStefan Eßer 	"POSIX does not allow comparison operators outside if statements or loops",
346252884aeSStefan Eßer 	"POSIX requires 0 or 1 comparison operators per condition",
347252884aeSStefan Eßer 	"POSIX requires all 3 parts of a for loop to be non-empty",
34810041e99SStefan Eßer 	"POSIX requires a newline between a semicolon and a function definition",
349252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
350252884aeSStefan Eßer 	"POSIX does not allow exponential notation",
351252884aeSStefan Eßer #else
352252884aeSStefan Eßer 	NULL,
353252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
354252884aeSStefan Eßer 	"POSIX does not allow array references as function parameters",
355252884aeSStefan Eßer 	"POSIX does not allow void functions",
356252884aeSStefan Eßer 	"POSIX requires the left brace be on the same line as the function header",
35744d4804dSStefan Eßer 	"POSIX does not allow strings to be assigned to variables or arrays",
358252884aeSStefan Eßer #endif // BC_ENABLED
359252884aeSStefan Eßer 
360252884aeSStefan Eßer };
361252884aeSStefan Eßer 
36244d4804dSStefan Eßer #endif // !BC_ENABLE_LIBRARY
36344d4804dSStefan Eßer 
36444d4804dSStefan Eßer /// The destructors corresponding to BcDtorType enum items.
36544d4804dSStefan Eßer const BcVecFree bc_vec_dtors[] = {
36644d4804dSStefan Eßer 	NULL,
36744d4804dSStefan Eßer 	bc_vec_free,
36844d4804dSStefan Eßer 	bc_num_free,
36944d4804dSStefan Eßer #if !BC_ENABLE_LIBRARY
370103d7cdfSStefan Eßer #if BC_DEBUG
37144d4804dSStefan Eßer 	bc_func_free,
372103d7cdfSStefan Eßer #endif // BC_DEBUG
37344d4804dSStefan Eßer 	bc_slab_free,
37444d4804dSStefan Eßer 	bc_const_free,
37544d4804dSStefan Eßer 	bc_result_free,
37678bc019dSStefan Eßer #if BC_ENABLE_HISTORY && !BC_ENABLE_LINE_LIB
37744d4804dSStefan Eßer 	bc_history_string_free,
37878bc019dSStefan Eßer #endif // BC_ENABLE_HISTORY && !BC_ENABLE_LINE_LIB
37944d4804dSStefan Eßer #else // !BC_ENABLE_LIBRARY
38044d4804dSStefan Eßer 	bcl_num_destruct,
38144d4804dSStefan Eßer #endif // !BC_ENABLE_LIBRARY
38244d4804dSStefan Eßer };
38344d4804dSStefan Eßer 
38444d4804dSStefan Eßer #if !BC_ENABLE_LIBRARY
38544d4804dSStefan Eßer 
38678bc019dSStefan Eßer #if BC_ENABLE_EDITLINE
38778bc019dSStefan Eßer 
38878bc019dSStefan Eßer /// The normal path to the editrc.
38978bc019dSStefan Eßer const char bc_history_editrc[] = "/.editrc";
39078bc019dSStefan Eßer 
39178bc019dSStefan Eßer /// The length of the normal path to the editrc.
39278bc019dSStefan Eßer const size_t bc_history_editrc_len = sizeof(bc_history_editrc) - 1;
39378bc019dSStefan Eßer 
39478bc019dSStefan Eßer #endif // BC_ENABLE_EDITLINE
39578bc019dSStefan Eßer 
39678bc019dSStefan Eßer #if BC_ENABLE_HISTORY && !BC_ENABLE_LINE_LIB
39744d4804dSStefan Eßer 
39844d4804dSStefan Eßer /// A flush type for not clearing current extras but not saving new ones either.
3997e5c51e5SStefan Eßer const BcFlushType bc_flush_none = BC_FLUSH_NO_EXTRAS_NO_CLEAR;
40044d4804dSStefan Eßer 
40144d4804dSStefan Eßer /// A flush type for clearing extras and not saving new ones.
4027e5c51e5SStefan Eßer const BcFlushType bc_flush_err = BC_FLUSH_NO_EXTRAS_CLEAR;
40344d4804dSStefan Eßer 
40444d4804dSStefan Eßer /// A flush type for clearing previous extras and saving new ones.
4057e5c51e5SStefan Eßer const BcFlushType bc_flush_save = BC_FLUSH_SAVE_EXTRAS_CLEAR;
40644d4804dSStefan Eßer 
40744d4804dSStefan Eßer /// A list of known bad terminals.
408252884aeSStefan Eßer const char* bc_history_bad_terms[] = { "dumb", "cons25", "emacs", NULL };
409252884aeSStefan Eßer 
41044d4804dSStefan Eßer /// A constant for tabs and its length. My tab handling is dumb and always
41144d4804dSStefan Eßer /// outputs the entire thing.
41278bc019dSStefan Eßer const char bc_history_tab[] = "\t";
413252884aeSStefan Eßer const size_t bc_history_tab_len = sizeof(bc_history_tab) - 1;
414252884aeSStefan Eßer 
41544d4804dSStefan Eßer /// A list of wide chars. These are listed in ascending order for efficiency.
416252884aeSStefan Eßer const uint32_t bc_history_wchars[][2] = {
41778bc019dSStefan Eßer 	{ 0x1100, 0x115F },   { 0x231A, 0x231B },   { 0x2329, 0x232A },
41878bc019dSStefan Eßer 	{ 0x23E9, 0x23EC },   { 0x23F0, 0x23F0 },   { 0x23F3, 0x23F3 },
41978bc019dSStefan Eßer 	{ 0x25FD, 0x25FE },   { 0x2614, 0x2615 },   { 0x2648, 0x2653 },
42078bc019dSStefan Eßer 	{ 0x267F, 0x267F },   { 0x2693, 0x2693 },   { 0x26A1, 0x26A1 },
42178bc019dSStefan Eßer 	{ 0x26AA, 0x26AB },   { 0x26BD, 0x26BE },   { 0x26C4, 0x26C5 },
42278bc019dSStefan Eßer 	{ 0x26CE, 0x26CE },   { 0x26D4, 0x26D4 },   { 0x26EA, 0x26EA },
42378bc019dSStefan Eßer 	{ 0x26F2, 0x26F3 },   { 0x26F5, 0x26F5 },   { 0x26FA, 0x26FA },
42478bc019dSStefan Eßer 	{ 0x26FD, 0x26FD },   { 0x2705, 0x2705 },   { 0x270A, 0x270B },
42578bc019dSStefan Eßer 	{ 0x2728, 0x2728 },   { 0x274C, 0x274C },   { 0x274E, 0x274E },
42678bc019dSStefan Eßer 	{ 0x2753, 0x2755 },   { 0x2757, 0x2757 },   { 0x2795, 0x2797 },
42778bc019dSStefan Eßer 	{ 0x27B0, 0x27B0 },   { 0x27BF, 0x27BF },   { 0x2B1B, 0x2B1C },
42878bc019dSStefan Eßer 	{ 0x2B50, 0x2B50 },   { 0x2B55, 0x2B55 },   { 0x2E80, 0x2E99 },
42978bc019dSStefan Eßer 	{ 0x2E9B, 0x2EF3 },   { 0x2F00, 0x2FD5 },   { 0x2FF0, 0x2FFB },
43078bc019dSStefan Eßer 	{ 0x3001, 0x303E },   { 0x3041, 0x3096 },   { 0x3099, 0x30FF },
43178bc019dSStefan Eßer 	{ 0x3105, 0x312D },   { 0x3131, 0x318E },   { 0x3190, 0x31BA },
43278bc019dSStefan Eßer 	{ 0x31C0, 0x31E3 },   { 0x31F0, 0x321E },   { 0x3220, 0x3247 },
43378bc019dSStefan Eßer 	{ 0x3250, 0x32FE },   { 0x3300, 0x4DBF },   { 0x4E00, 0xA48C },
43478bc019dSStefan Eßer 	{ 0xA490, 0xA4C6 },   { 0xA960, 0xA97C },   { 0xAC00, 0xD7A3 },
43578bc019dSStefan Eßer 	{ 0xF900, 0xFAFF },   { 0xFE10, 0xFE19 },   { 0xFE30, 0xFE52 },
43678bc019dSStefan Eßer 	{ 0xFE54, 0xFE66 },   { 0xFE68, 0xFE6B },   { 0x16FE0, 0x16FE0 },
43778bc019dSStefan Eßer 	{ 0x17000, 0x187EC }, { 0x18800, 0x18AF2 }, { 0x1B000, 0x1B001 },
43878bc019dSStefan Eßer 	{ 0x1F004, 0x1F004 }, { 0x1F0CF, 0x1F0CF }, { 0x1F18E, 0x1F18E },
43978bc019dSStefan Eßer 	{ 0x1F191, 0x1F19A }, { 0x1F200, 0x1F202 }, { 0x1F210, 0x1F23B },
44078bc019dSStefan Eßer 	{ 0x1F240, 0x1F248 }, { 0x1F250, 0x1F251 }, { 0x1F300, 0x1F320 },
44178bc019dSStefan Eßer 	{ 0x1F32D, 0x1F335 }, { 0x1F337, 0x1F37C }, { 0x1F37E, 0x1F393 },
44278bc019dSStefan Eßer 	{ 0x1F3A0, 0x1F3CA }, { 0x1F3CF, 0x1F3D3 }, { 0x1F3E0, 0x1F3F0 },
44378bc019dSStefan Eßer 	{ 0x1F3F4, 0x1F3F4 }, { 0x1F3F8, 0x1F43E }, { 0x1F440, 0x1F440 },
44478bc019dSStefan Eßer 	{ 0x1F442, 0x1F4FC }, { 0x1F4FF, 0x1F53D }, { 0x1F54B, 0x1F54E },
44578bc019dSStefan Eßer 	{ 0x1F550, 0x1F567 }, { 0x1F57A, 0x1F57A }, { 0x1F595, 0x1F596 },
44678bc019dSStefan Eßer 	{ 0x1F5A4, 0x1F5A4 }, { 0x1F5FB, 0x1F64F }, { 0x1F680, 0x1F6C5 },
44778bc019dSStefan Eßer 	{ 0x1F6CC, 0x1F6CC }, { 0x1F6D0, 0x1F6D2 }, { 0x1F6EB, 0x1F6EC },
44878bc019dSStefan Eßer 	{ 0x1F6F4, 0x1F6F6 }, { 0x1F910, 0x1F91E }, { 0x1F920, 0x1F927 },
44978bc019dSStefan Eßer 	{ 0x1F930, 0x1F930 }, { 0x1F933, 0x1F93E }, { 0x1F940, 0x1F94B },
45078bc019dSStefan Eßer 	{ 0x1F950, 0x1F95E }, { 0x1F980, 0x1F991 }, { 0x1F9C0, 0x1F9C0 },
45178bc019dSStefan Eßer 	{ 0x20000, 0x2FFFD }, { 0x30000, 0x3FFFD },
452252884aeSStefan Eßer };
453252884aeSStefan Eßer 
45444d4804dSStefan Eßer /// The length of the wide chars list.
45578bc019dSStefan Eßer const size_t bc_history_wchars_len = sizeof(bc_history_wchars) /
45678bc019dSStefan Eßer                                      sizeof(bc_history_wchars[0]);
457252884aeSStefan Eßer 
45844d4804dSStefan Eßer /// A list of combining characters in Unicode. These are listed in ascending
45944d4804dSStefan Eßer /// order for efficiency.
460252884aeSStefan Eßer const uint32_t bc_history_combo_chars[] = {
461252884aeSStefan Eßer 	0x0300,  0x0301,  0x0302,  0x0303,  0x0304,  0x0305,  0x0306,  0x0307,
462252884aeSStefan Eßer 	0x0308,  0x0309,  0x030A,  0x030B,  0x030C,  0x030D,  0x030E,  0x030F,
463252884aeSStefan Eßer 	0x0310,  0x0311,  0x0312,  0x0313,  0x0314,  0x0315,  0x0316,  0x0317,
464252884aeSStefan Eßer 	0x0318,  0x0319,  0x031A,  0x031B,  0x031C,  0x031D,  0x031E,  0x031F,
465252884aeSStefan Eßer 	0x0320,  0x0321,  0x0322,  0x0323,  0x0324,  0x0325,  0x0326,  0x0327,
466252884aeSStefan Eßer 	0x0328,  0x0329,  0x032A,  0x032B,  0x032C,  0x032D,  0x032E,  0x032F,
467252884aeSStefan Eßer 	0x0330,  0x0331,  0x0332,  0x0333,  0x0334,  0x0335,  0x0336,  0x0337,
468252884aeSStefan Eßer 	0x0338,  0x0339,  0x033A,  0x033B,  0x033C,  0x033D,  0x033E,  0x033F,
469252884aeSStefan Eßer 	0x0340,  0x0341,  0x0342,  0x0343,  0x0344,  0x0345,  0x0346,  0x0347,
470252884aeSStefan Eßer 	0x0348,  0x0349,  0x034A,  0x034B,  0x034C,  0x034D,  0x034E,  0x034F,
471252884aeSStefan Eßer 	0x0350,  0x0351,  0x0352,  0x0353,  0x0354,  0x0355,  0x0356,  0x0357,
472252884aeSStefan Eßer 	0x0358,  0x0359,  0x035A,  0x035B,  0x035C,  0x035D,  0x035E,  0x035F,
473252884aeSStefan Eßer 	0x0360,  0x0361,  0x0362,  0x0363,  0x0364,  0x0365,  0x0366,  0x0367,
474252884aeSStefan Eßer 	0x0368,  0x0369,  0x036A,  0x036B,  0x036C,  0x036D,  0x036E,  0x036F,
475252884aeSStefan Eßer 	0x0483,  0x0484,  0x0485,  0x0486,  0x0487,  0x0591,  0x0592,  0x0593,
476252884aeSStefan Eßer 	0x0594,  0x0595,  0x0596,  0x0597,  0x0598,  0x0599,  0x059A,  0x059B,
477252884aeSStefan Eßer 	0x059C,  0x059D,  0x059E,  0x059F,  0x05A0,  0x05A1,  0x05A2,  0x05A3,
478252884aeSStefan Eßer 	0x05A4,  0x05A5,  0x05A6,  0x05A7,  0x05A8,  0x05A9,  0x05AA,  0x05AB,
479252884aeSStefan Eßer 	0x05AC,  0x05AD,  0x05AE,  0x05AF,  0x05B0,  0x05B1,  0x05B2,  0x05B3,
480252884aeSStefan Eßer 	0x05B4,  0x05B5,  0x05B6,  0x05B7,  0x05B8,  0x05B9,  0x05BA,  0x05BB,
481252884aeSStefan Eßer 	0x05BC,  0x05BD,  0x05BF,  0x05C1,  0x05C2,  0x05C4,  0x05C5,  0x05C7,
482252884aeSStefan Eßer 	0x0610,  0x0611,  0x0612,  0x0613,  0x0614,  0x0615,  0x0616,  0x0617,
483252884aeSStefan Eßer 	0x0618,  0x0619,  0x061A,  0x064B,  0x064C,  0x064D,  0x064E,  0x064F,
484252884aeSStefan Eßer 	0x0650,  0x0651,  0x0652,  0x0653,  0x0654,  0x0655,  0x0656,  0x0657,
485252884aeSStefan Eßer 	0x0658,  0x0659,  0x065A,  0x065B,  0x065C,  0x065D,  0x065E,  0x065F,
486252884aeSStefan Eßer 	0x0670,  0x06D6,  0x06D7,  0x06D8,  0x06D9,  0x06DA,  0x06DB,  0x06DC,
487252884aeSStefan Eßer 	0x06DF,  0x06E0,  0x06E1,  0x06E2,  0x06E3,  0x06E4,  0x06E7,  0x06E8,
488252884aeSStefan Eßer 	0x06EA,  0x06EB,  0x06EC,  0x06ED,  0x0711,  0x0730,  0x0731,  0x0732,
489252884aeSStefan Eßer 	0x0733,  0x0734,  0x0735,  0x0736,  0x0737,  0x0738,  0x0739,  0x073A,
490252884aeSStefan Eßer 	0x073B,  0x073C,  0x073D,  0x073E,  0x073F,  0x0740,  0x0741,  0x0742,
491252884aeSStefan Eßer 	0x0743,  0x0744,  0x0745,  0x0746,  0x0747,  0x0748,  0x0749,  0x074A,
492252884aeSStefan Eßer 	0x07A6,  0x07A7,  0x07A8,  0x07A9,  0x07AA,  0x07AB,  0x07AC,  0x07AD,
493252884aeSStefan Eßer 	0x07AE,  0x07AF,  0x07B0,  0x07EB,  0x07EC,  0x07ED,  0x07EE,  0x07EF,
494252884aeSStefan Eßer 	0x07F0,  0x07F1,  0x07F2,  0x07F3,  0x0816,  0x0817,  0x0818,  0x0819,
495252884aeSStefan Eßer 	0x081B,  0x081C,  0x081D,  0x081E,  0x081F,  0x0820,  0x0821,  0x0822,
496252884aeSStefan Eßer 	0x0823,  0x0825,  0x0826,  0x0827,  0x0829,  0x082A,  0x082B,  0x082C,
497252884aeSStefan Eßer 	0x082D,  0x0859,  0x085A,  0x085B,  0x08D4,  0x08D5,  0x08D6,  0x08D7,
498252884aeSStefan Eßer 	0x08D8,  0x08D9,  0x08DA,  0x08DB,  0x08DC,  0x08DD,  0x08DE,  0x08DF,
499252884aeSStefan Eßer 	0x08E0,  0x08E1,  0x08E3,  0x08E4,  0x08E5,  0x08E6,  0x08E7,  0x08E8,
500252884aeSStefan Eßer 	0x08E9,  0x08EA,  0x08EB,  0x08EC,  0x08ED,  0x08EE,  0x08EF,  0x08F0,
501252884aeSStefan Eßer 	0x08F1,  0x08F2,  0x08F3,  0x08F4,  0x08F5,  0x08F6,  0x08F7,  0x08F8,
502252884aeSStefan Eßer 	0x08F9,  0x08FA,  0x08FB,  0x08FC,  0x08FD,  0x08FE,  0x08FF,  0x0900,
503252884aeSStefan Eßer 	0x0901,  0x0902,  0x093A,  0x093C,  0x0941,  0x0942,  0x0943,  0x0944,
504252884aeSStefan Eßer 	0x0945,  0x0946,  0x0947,  0x0948,  0x094D,  0x0951,  0x0952,  0x0953,
505252884aeSStefan Eßer 	0x0954,  0x0955,  0x0956,  0x0957,  0x0962,  0x0963,  0x0981,  0x09BC,
506252884aeSStefan Eßer 	0x09C1,  0x09C2,  0x09C3,  0x09C4,  0x09CD,  0x09E2,  0x09E3,  0x0A01,
507252884aeSStefan Eßer 	0x0A02,  0x0A3C,  0x0A41,  0x0A42,  0x0A47,  0x0A48,  0x0A4B,  0x0A4C,
508252884aeSStefan Eßer 	0x0A4D,  0x0A51,  0x0A70,  0x0A71,  0x0A75,  0x0A81,  0x0A82,  0x0ABC,
509252884aeSStefan Eßer 	0x0AC1,  0x0AC2,  0x0AC3,  0x0AC4,  0x0AC5,  0x0AC7,  0x0AC8,  0x0ACD,
510252884aeSStefan Eßer 	0x0AE2,  0x0AE3,  0x0B01,  0x0B3C,  0x0B3F,  0x0B41,  0x0B42,  0x0B43,
511252884aeSStefan Eßer 	0x0B44,  0x0B4D,  0x0B56,  0x0B62,  0x0B63,  0x0B82,  0x0BC0,  0x0BCD,
512252884aeSStefan Eßer 	0x0C00,  0x0C3E,  0x0C3F,  0x0C40,  0x0C46,  0x0C47,  0x0C48,  0x0C4A,
513252884aeSStefan Eßer 	0x0C4B,  0x0C4C,  0x0C4D,  0x0C55,  0x0C56,  0x0C62,  0x0C63,  0x0C81,
514252884aeSStefan Eßer 	0x0CBC,  0x0CBF,  0x0CC6,  0x0CCC,  0x0CCD,  0x0CE2,  0x0CE3,  0x0D01,
515252884aeSStefan Eßer 	0x0D41,  0x0D42,  0x0D43,  0x0D44,  0x0D4D,  0x0D62,  0x0D63,  0x0DCA,
516252884aeSStefan Eßer 	0x0DD2,  0x0DD3,  0x0DD4,  0x0DD6,  0x0E31,  0x0E34,  0x0E35,  0x0E36,
517252884aeSStefan Eßer 	0x0E37,  0x0E38,  0x0E39,  0x0E3A,  0x0E47,  0x0E48,  0x0E49,  0x0E4A,
518252884aeSStefan Eßer 	0x0E4B,  0x0E4C,  0x0E4D,  0x0E4E,  0x0EB1,  0x0EB4,  0x0EB5,  0x0EB6,
519252884aeSStefan Eßer 	0x0EB7,  0x0EB8,  0x0EB9,  0x0EBB,  0x0EBC,  0x0EC8,  0x0EC9,  0x0ECA,
520252884aeSStefan Eßer 	0x0ECB,  0x0ECC,  0x0ECD,  0x0F18,  0x0F19,  0x0F35,  0x0F37,  0x0F39,
521252884aeSStefan Eßer 	0x0F71,  0x0F72,  0x0F73,  0x0F74,  0x0F75,  0x0F76,  0x0F77,  0x0F78,
522252884aeSStefan Eßer 	0x0F79,  0x0F7A,  0x0F7B,  0x0F7C,  0x0F7D,  0x0F7E,  0x0F80,  0x0F81,
523252884aeSStefan Eßer 	0x0F82,  0x0F83,  0x0F84,  0x0F86,  0x0F87,  0x0F8D,  0x0F8E,  0x0F8F,
524252884aeSStefan Eßer 	0x0F90,  0x0F91,  0x0F92,  0x0F93,  0x0F94,  0x0F95,  0x0F96,  0x0F97,
525252884aeSStefan Eßer 	0x0F99,  0x0F9A,  0x0F9B,  0x0F9C,  0x0F9D,  0x0F9E,  0x0F9F,  0x0FA0,
526252884aeSStefan Eßer 	0x0FA1,  0x0FA2,  0x0FA3,  0x0FA4,  0x0FA5,  0x0FA6,  0x0FA7,  0x0FA8,
527252884aeSStefan Eßer 	0x0FA9,  0x0FAA,  0x0FAB,  0x0FAC,  0x0FAD,  0x0FAE,  0x0FAF,  0x0FB0,
528252884aeSStefan Eßer 	0x0FB1,  0x0FB2,  0x0FB3,  0x0FB4,  0x0FB5,  0x0FB6,  0x0FB7,  0x0FB8,
529252884aeSStefan Eßer 	0x0FB9,  0x0FBA,  0x0FBB,  0x0FBC,  0x0FC6,  0x102D,  0x102E,  0x102F,
530252884aeSStefan Eßer 	0x1030,  0x1032,  0x1033,  0x1034,  0x1035,  0x1036,  0x1037,  0x1039,
531252884aeSStefan Eßer 	0x103A,  0x103D,  0x103E,  0x1058,  0x1059,  0x105E,  0x105F,  0x1060,
532252884aeSStefan Eßer 	0x1071,  0x1072,  0x1073,  0x1074,  0x1082,  0x1085,  0x1086,  0x108D,
533252884aeSStefan Eßer 	0x109D,  0x135D,  0x135E,  0x135F,  0x1712,  0x1713,  0x1714,  0x1732,
534252884aeSStefan Eßer 	0x1733,  0x1734,  0x1752,  0x1753,  0x1772,  0x1773,  0x17B4,  0x17B5,
535252884aeSStefan Eßer 	0x17B7,  0x17B8,  0x17B9,  0x17BA,  0x17BB,  0x17BC,  0x17BD,  0x17C6,
536252884aeSStefan Eßer 	0x17C9,  0x17CA,  0x17CB,  0x17CC,  0x17CD,  0x17CE,  0x17CF,  0x17D0,
537252884aeSStefan Eßer 	0x17D1,  0x17D2,  0x17D3,  0x17DD,  0x180B,  0x180C,  0x180D,  0x1885,
538252884aeSStefan Eßer 	0x1886,  0x18A9,  0x1920,  0x1921,  0x1922,  0x1927,  0x1928,  0x1932,
539252884aeSStefan Eßer 	0x1939,  0x193A,  0x193B,  0x1A17,  0x1A18,  0x1A1B,  0x1A56,  0x1A58,
540252884aeSStefan Eßer 	0x1A59,  0x1A5A,  0x1A5B,  0x1A5C,  0x1A5D,  0x1A5E,  0x1A60,  0x1A62,
541252884aeSStefan Eßer 	0x1A65,  0x1A66,  0x1A67,  0x1A68,  0x1A69,  0x1A6A,  0x1A6B,  0x1A6C,
542252884aeSStefan Eßer 	0x1A73,  0x1A74,  0x1A75,  0x1A76,  0x1A77,  0x1A78,  0x1A79,  0x1A7A,
543252884aeSStefan Eßer 	0x1A7B,  0x1A7C,  0x1A7F,  0x1AB0,  0x1AB1,  0x1AB2,  0x1AB3,  0x1AB4,
544252884aeSStefan Eßer 	0x1AB5,  0x1AB6,  0x1AB7,  0x1AB8,  0x1AB9,  0x1ABA,  0x1ABB,  0x1ABC,
545252884aeSStefan Eßer 	0x1ABD,  0x1B00,  0x1B01,  0x1B02,  0x1B03,  0x1B34,  0x1B36,  0x1B37,
546252884aeSStefan Eßer 	0x1B38,  0x1B39,  0x1B3A,  0x1B3C,  0x1B42,  0x1B6B,  0x1B6C,  0x1B6D,
547252884aeSStefan Eßer 	0x1B6E,  0x1B6F,  0x1B70,  0x1B71,  0x1B72,  0x1B73,  0x1B80,  0x1B81,
548252884aeSStefan Eßer 	0x1BA2,  0x1BA3,  0x1BA4,  0x1BA5,  0x1BA8,  0x1BA9,  0x1BAB,  0x1BAC,
549252884aeSStefan Eßer 	0x1BAD,  0x1BE6,  0x1BE8,  0x1BE9,  0x1BED,  0x1BEF,  0x1BF0,  0x1BF1,
550252884aeSStefan Eßer 	0x1C2C,  0x1C2D,  0x1C2E,  0x1C2F,  0x1C30,  0x1C31,  0x1C32,  0x1C33,
551252884aeSStefan Eßer 	0x1C36,  0x1C37,  0x1CD0,  0x1CD1,  0x1CD2,  0x1CD4,  0x1CD5,  0x1CD6,
552252884aeSStefan Eßer 	0x1CD7,  0x1CD8,  0x1CD9,  0x1CDA,  0x1CDB,  0x1CDC,  0x1CDD,  0x1CDE,
553252884aeSStefan Eßer 	0x1CDF,  0x1CE0,  0x1CE2,  0x1CE3,  0x1CE4,  0x1CE5,  0x1CE6,  0x1CE7,
554252884aeSStefan Eßer 	0x1CE8,  0x1CED,  0x1CF4,  0x1CF8,  0x1CF9,  0x1DC0,  0x1DC1,  0x1DC2,
555252884aeSStefan Eßer 	0x1DC3,  0x1DC4,  0x1DC5,  0x1DC6,  0x1DC7,  0x1DC8,  0x1DC9,  0x1DCA,
556252884aeSStefan Eßer 	0x1DCB,  0x1DCC,  0x1DCD,  0x1DCE,  0x1DCF,  0x1DD0,  0x1DD1,  0x1DD2,
557252884aeSStefan Eßer 	0x1DD3,  0x1DD4,  0x1DD5,  0x1DD6,  0x1DD7,  0x1DD8,  0x1DD9,  0x1DDA,
558252884aeSStefan Eßer 	0x1DDB,  0x1DDC,  0x1DDD,  0x1DDE,  0x1DDF,  0x1DE0,  0x1DE1,  0x1DE2,
559252884aeSStefan Eßer 	0x1DE3,  0x1DE4,  0x1DE5,  0x1DE6,  0x1DE7,  0x1DE8,  0x1DE9,  0x1DEA,
560252884aeSStefan Eßer 	0x1DEB,  0x1DEC,  0x1DED,  0x1DEE,  0x1DEF,  0x1DF0,  0x1DF1,  0x1DF2,
561252884aeSStefan Eßer 	0x1DF3,  0x1DF4,  0x1DF5,  0x1DFB,  0x1DFC,  0x1DFD,  0x1DFE,  0x1DFF,
562252884aeSStefan Eßer 	0x20D0,  0x20D1,  0x20D2,  0x20D3,  0x20D4,  0x20D5,  0x20D6,  0x20D7,
563252884aeSStefan Eßer 	0x20D8,  0x20D9,  0x20DA,  0x20DB,  0x20DC,  0x20E1,  0x20E5,  0x20E6,
564252884aeSStefan Eßer 	0x20E7,  0x20E8,  0x20E9,  0x20EA,  0x20EB,  0x20EC,  0x20ED,  0x20EE,
565252884aeSStefan Eßer 	0x20EF,  0x20F0,  0x2CEF,  0x2CF0,  0x2CF1,  0x2D7F,  0x2DE0,  0x2DE1,
566252884aeSStefan Eßer 	0x2DE2,  0x2DE3,  0x2DE4,  0x2DE5,  0x2DE6,  0x2DE7,  0x2DE8,  0x2DE9,
567252884aeSStefan Eßer 	0x2DEA,  0x2DEB,  0x2DEC,  0x2DED,  0x2DEE,  0x2DEF,  0x2DF0,  0x2DF1,
568252884aeSStefan Eßer 	0x2DF2,  0x2DF3,  0x2DF4,  0x2DF5,  0x2DF6,  0x2DF7,  0x2DF8,  0x2DF9,
569252884aeSStefan Eßer 	0x2DFA,  0x2DFB,  0x2DFC,  0x2DFD,  0x2DFE,  0x2DFF,  0x302A,  0x302B,
570252884aeSStefan Eßer 	0x302C,  0x302D,  0x3099,  0x309A,  0xA66F,  0xA674,  0xA675,  0xA676,
571252884aeSStefan Eßer 	0xA677,  0xA678,  0xA679,  0xA67A,  0xA67B,  0xA67C,  0xA67D,  0xA69E,
572252884aeSStefan Eßer 	0xA69F,  0xA6F0,  0xA6F1,  0xA802,  0xA806,  0xA80B,  0xA825,  0xA826,
573252884aeSStefan Eßer 	0xA8C4,  0xA8C5,  0xA8E0,  0xA8E1,  0xA8E2,  0xA8E3,  0xA8E4,  0xA8E5,
574252884aeSStefan Eßer 	0xA8E6,  0xA8E7,  0xA8E8,  0xA8E9,  0xA8EA,  0xA8EB,  0xA8EC,  0xA8ED,
575252884aeSStefan Eßer 	0xA8EE,  0xA8EF,  0xA8F0,  0xA8F1,  0xA926,  0xA927,  0xA928,  0xA929,
576252884aeSStefan Eßer 	0xA92A,  0xA92B,  0xA92C,  0xA92D,  0xA947,  0xA948,  0xA949,  0xA94A,
577252884aeSStefan Eßer 	0xA94B,  0xA94C,  0xA94D,  0xA94E,  0xA94F,  0xA950,  0xA951,  0xA980,
578252884aeSStefan Eßer 	0xA981,  0xA982,  0xA9B3,  0xA9B6,  0xA9B7,  0xA9B8,  0xA9B9,  0xA9BC,
579252884aeSStefan Eßer 	0xA9E5,  0xAA29,  0xAA2A,  0xAA2B,  0xAA2C,  0xAA2D,  0xAA2E,  0xAA31,
580252884aeSStefan Eßer 	0xAA32,  0xAA35,  0xAA36,  0xAA43,  0xAA4C,  0xAA7C,  0xAAB0,  0xAAB2,
581252884aeSStefan Eßer 	0xAAB3,  0xAAB4,  0xAAB7,  0xAAB8,  0xAABE,  0xAABF,  0xAAC1,  0xAAEC,
582252884aeSStefan Eßer 	0xAAED,  0xAAF6,  0xABE5,  0xABE8,  0xABED,  0xFB1E,  0xFE00,  0xFE01,
583252884aeSStefan Eßer 	0xFE02,  0xFE03,  0xFE04,  0xFE05,  0xFE06,  0xFE07,  0xFE08,  0xFE09,
584252884aeSStefan Eßer 	0xFE0A,  0xFE0B,  0xFE0C,  0xFE0D,  0xFE0E,  0xFE0F,  0xFE20,  0xFE21,
585252884aeSStefan Eßer 	0xFE22,  0xFE23,  0xFE24,  0xFE25,  0xFE26,  0xFE27,  0xFE28,  0xFE29,
58678bc019dSStefan Eßer 	0xFE2A,  0xFE2B,  0xFE2C,  0xFE2D,  0xFE2E,  0xFE2F,  0x101FD, 0x102E0,
58778bc019dSStefan Eßer 	0x10376, 0x10377, 0x10378, 0x10379, 0x1037A, 0x10A01, 0x10A02, 0x10A03,
58878bc019dSStefan Eßer 	0x10A05, 0x10A06, 0x10A0C, 0x10A0D, 0x10A0E, 0x10A0F, 0x10A38, 0x10A39,
58978bc019dSStefan Eßer 	0x10A3A, 0x10A3F, 0x10AE5, 0x10AE6, 0x11001, 0x11038, 0x11039, 0x1103A,
59078bc019dSStefan Eßer 	0x1103B, 0x1103C, 0x1103D, 0x1103E, 0x1103F, 0x11040, 0x11041, 0x11042,
59178bc019dSStefan Eßer 	0x11043, 0x11044, 0x11045, 0x11046, 0x1107F, 0x11080, 0x11081, 0x110B3,
59278bc019dSStefan Eßer 	0x110B4, 0x110B5, 0x110B6, 0x110B9, 0x110BA, 0x11100, 0x11101, 0x11102,
59378bc019dSStefan Eßer 	0x11127, 0x11128, 0x11129, 0x1112A, 0x1112B, 0x1112D, 0x1112E, 0x1112F,
59478bc019dSStefan Eßer 	0x11130, 0x11131, 0x11132, 0x11133, 0x11134, 0x11173, 0x11180, 0x11181,
59578bc019dSStefan Eßer 	0x111B6, 0x111B7, 0x111B8, 0x111B9, 0x111BA, 0x111BB, 0x111BC, 0x111BD,
59678bc019dSStefan Eßer 	0x111BE, 0x111CA, 0x111CB, 0x111CC, 0x1122F, 0x11230, 0x11231, 0x11234,
59778bc019dSStefan Eßer 	0x11236, 0x11237, 0x1123E, 0x112DF, 0x112E3, 0x112E4, 0x112E5, 0x112E6,
59878bc019dSStefan Eßer 	0x112E7, 0x112E8, 0x112E9, 0x112EA, 0x11300, 0x11301, 0x1133C, 0x11340,
59978bc019dSStefan Eßer 	0x11366, 0x11367, 0x11368, 0x11369, 0x1136A, 0x1136B, 0x1136C, 0x11370,
60078bc019dSStefan Eßer 	0x11371, 0x11372, 0x11373, 0x11374, 0x11438, 0x11439, 0x1143A, 0x1143B,
60178bc019dSStefan Eßer 	0x1143C, 0x1143D, 0x1143E, 0x1143F, 0x11442, 0x11443, 0x11444, 0x11446,
60278bc019dSStefan Eßer 	0x114B3, 0x114B4, 0x114B5, 0x114B6, 0x114B7, 0x114B8, 0x114BA, 0x114BF,
60378bc019dSStefan Eßer 	0x114C0, 0x114C2, 0x114C3, 0x115B2, 0x115B3, 0x115B4, 0x115B5, 0x115BC,
60478bc019dSStefan Eßer 	0x115BD, 0x115BF, 0x115C0, 0x115DC, 0x115DD, 0x11633, 0x11634, 0x11635,
60578bc019dSStefan Eßer 	0x11636, 0x11637, 0x11638, 0x11639, 0x1163A, 0x1163D, 0x1163F, 0x11640,
60678bc019dSStefan Eßer 	0x116AB, 0x116AD, 0x116B0, 0x116B1, 0x116B2, 0x116B3, 0x116B4, 0x116B5,
60778bc019dSStefan Eßer 	0x116B7, 0x1171D, 0x1171E, 0x1171F, 0x11722, 0x11723, 0x11724, 0x11725,
60878bc019dSStefan Eßer 	0x11727, 0x11728, 0x11729, 0x1172A, 0x1172B, 0x11C30, 0x11C31, 0x11C32,
60978bc019dSStefan Eßer 	0x11C33, 0x11C34, 0x11C35, 0x11C36, 0x11C38, 0x11C39, 0x11C3A, 0x11C3B,
61078bc019dSStefan Eßer 	0x11C3C, 0x11C3D, 0x11C3F, 0x11C92, 0x11C93, 0x11C94, 0x11C95, 0x11C96,
61178bc019dSStefan Eßer 	0x11C97, 0x11C98, 0x11C99, 0x11C9A, 0x11C9B, 0x11C9C, 0x11C9D, 0x11C9E,
61278bc019dSStefan Eßer 	0x11C9F, 0x11CA0, 0x11CA1, 0x11CA2, 0x11CA3, 0x11CA4, 0x11CA5, 0x11CA6,
61378bc019dSStefan Eßer 	0x11CA7, 0x11CAA, 0x11CAB, 0x11CAC, 0x11CAD, 0x11CAE, 0x11CAF, 0x11CB0,
61478bc019dSStefan Eßer 	0x11CB2, 0x11CB3, 0x11CB5, 0x11CB6, 0x16AF0, 0x16AF1, 0x16AF2, 0x16AF3,
61578bc019dSStefan Eßer 	0x16AF4, 0x16B30, 0x16B31, 0x16B32, 0x16B33, 0x16B34, 0x16B35, 0x16B36,
61678bc019dSStefan Eßer 	0x16F8F, 0x16F90, 0x16F91, 0x16F92, 0x1BC9D, 0x1BC9E, 0x1D167, 0x1D168,
61778bc019dSStefan Eßer 	0x1D169, 0x1D17B, 0x1D17C, 0x1D17D, 0x1D17E, 0x1D17F, 0x1D180, 0x1D181,
61878bc019dSStefan Eßer 	0x1D182, 0x1D185, 0x1D186, 0x1D187, 0x1D188, 0x1D189, 0x1D18A, 0x1D18B,
61978bc019dSStefan Eßer 	0x1D1AA, 0x1D1AB, 0x1D1AC, 0x1D1AD, 0x1D242, 0x1D243, 0x1D244, 0x1DA00,
62078bc019dSStefan Eßer 	0x1DA01, 0x1DA02, 0x1DA03, 0x1DA04, 0x1DA05, 0x1DA06, 0x1DA07, 0x1DA08,
62178bc019dSStefan Eßer 	0x1DA09, 0x1DA0A, 0x1DA0B, 0x1DA0C, 0x1DA0D, 0x1DA0E, 0x1DA0F, 0x1DA10,
62278bc019dSStefan Eßer 	0x1DA11, 0x1DA12, 0x1DA13, 0x1DA14, 0x1DA15, 0x1DA16, 0x1DA17, 0x1DA18,
62378bc019dSStefan Eßer 	0x1DA19, 0x1DA1A, 0x1DA1B, 0x1DA1C, 0x1DA1D, 0x1DA1E, 0x1DA1F, 0x1DA20,
62478bc019dSStefan Eßer 	0x1DA21, 0x1DA22, 0x1DA23, 0x1DA24, 0x1DA25, 0x1DA26, 0x1DA27, 0x1DA28,
62578bc019dSStefan Eßer 	0x1DA29, 0x1DA2A, 0x1DA2B, 0x1DA2C, 0x1DA2D, 0x1DA2E, 0x1DA2F, 0x1DA30,
62678bc019dSStefan Eßer 	0x1DA31, 0x1DA32, 0x1DA33, 0x1DA34, 0x1DA35, 0x1DA36, 0x1DA3B, 0x1DA3C,
62778bc019dSStefan Eßer 	0x1DA3D, 0x1DA3E, 0x1DA3F, 0x1DA40, 0x1DA41, 0x1DA42, 0x1DA43, 0x1DA44,
62878bc019dSStefan Eßer 	0x1DA45, 0x1DA46, 0x1DA47, 0x1DA48, 0x1DA49, 0x1DA4A, 0x1DA4B, 0x1DA4C,
62978bc019dSStefan Eßer 	0x1DA4D, 0x1DA4E, 0x1DA4F, 0x1DA50, 0x1DA51, 0x1DA52, 0x1DA53, 0x1DA54,
63078bc019dSStefan Eßer 	0x1DA55, 0x1DA56, 0x1DA57, 0x1DA58, 0x1DA59, 0x1DA5A, 0x1DA5B, 0x1DA5C,
63178bc019dSStefan Eßer 	0x1DA5D, 0x1DA5E, 0x1DA5F, 0x1DA60, 0x1DA61, 0x1DA62, 0x1DA63, 0x1DA64,
63278bc019dSStefan Eßer 	0x1DA65, 0x1DA66, 0x1DA67, 0x1DA68, 0x1DA69, 0x1DA6A, 0x1DA6B, 0x1DA6C,
63378bc019dSStefan Eßer 	0x1DA75, 0x1DA84, 0x1DA9B, 0x1DA9C, 0x1DA9D, 0x1DA9E, 0x1DA9F, 0x1DAA1,
63478bc019dSStefan Eßer 	0x1DAA2, 0x1DAA3, 0x1DAA4, 0x1DAA5, 0x1DAA6, 0x1DAA7, 0x1DAA8, 0x1DAA9,
63578bc019dSStefan Eßer 	0x1DAAA, 0x1DAAB, 0x1DAAC, 0x1DAAD, 0x1DAAE, 0x1DAAF, 0x1E000, 0x1E001,
63678bc019dSStefan Eßer 	0x1E002, 0x1E003, 0x1E004, 0x1E005, 0x1E006, 0x1E008, 0x1E009, 0x1E00A,
63778bc019dSStefan Eßer 	0x1E00B, 0x1E00C, 0x1E00D, 0x1E00E, 0x1E00F, 0x1E010, 0x1E011, 0x1E012,
63878bc019dSStefan Eßer 	0x1E013, 0x1E014, 0x1E015, 0x1E016, 0x1E017, 0x1E018, 0x1E01B, 0x1E01C,
63978bc019dSStefan Eßer 	0x1E01D, 0x1E01E, 0x1E01F, 0x1E020, 0x1E021, 0x1E023, 0x1E024, 0x1E026,
64078bc019dSStefan Eßer 	0x1E027, 0x1E028, 0x1E029, 0x1E02A, 0x1E8D0, 0x1E8D1, 0x1E8D2, 0x1E8D3,
64178bc019dSStefan Eßer 	0x1E8D4, 0x1E8D5, 0x1E8D6, 0x1E944, 0x1E945, 0x1E946, 0x1E947, 0x1E948,
64278bc019dSStefan Eßer 	0x1E949, 0x1E94A, 0xE0100, 0xE0101, 0xE0102, 0xE0103, 0xE0104, 0xE0105,
64378bc019dSStefan Eßer 	0xE0106, 0xE0107, 0xE0108, 0xE0109, 0xE010A, 0xE010B, 0xE010C, 0xE010D,
64478bc019dSStefan Eßer 	0xE010E, 0xE010F, 0xE0110, 0xE0111, 0xE0112, 0xE0113, 0xE0114, 0xE0115,
64578bc019dSStefan Eßer 	0xE0116, 0xE0117, 0xE0118, 0xE0119, 0xE011A, 0xE011B, 0xE011C, 0xE011D,
64678bc019dSStefan Eßer 	0xE011E, 0xE011F, 0xE0120, 0xE0121, 0xE0122, 0xE0123, 0xE0124, 0xE0125,
64778bc019dSStefan Eßer 	0xE0126, 0xE0127, 0xE0128, 0xE0129, 0xE012A, 0xE012B, 0xE012C, 0xE012D,
64878bc019dSStefan Eßer 	0xE012E, 0xE012F, 0xE0130, 0xE0131, 0xE0132, 0xE0133, 0xE0134, 0xE0135,
64978bc019dSStefan Eßer 	0xE0136, 0xE0137, 0xE0138, 0xE0139, 0xE013A, 0xE013B, 0xE013C, 0xE013D,
65078bc019dSStefan Eßer 	0xE013E, 0xE013F, 0xE0140, 0xE0141, 0xE0142, 0xE0143, 0xE0144, 0xE0145,
65178bc019dSStefan Eßer 	0xE0146, 0xE0147, 0xE0148, 0xE0149, 0xE014A, 0xE014B, 0xE014C, 0xE014D,
65278bc019dSStefan Eßer 	0xE014E, 0xE014F, 0xE0150, 0xE0151, 0xE0152, 0xE0153, 0xE0154, 0xE0155,
65378bc019dSStefan Eßer 	0xE0156, 0xE0157, 0xE0158, 0xE0159, 0xE015A, 0xE015B, 0xE015C, 0xE015D,
65478bc019dSStefan Eßer 	0xE015E, 0xE015F, 0xE0160, 0xE0161, 0xE0162, 0xE0163, 0xE0164, 0xE0165,
65578bc019dSStefan Eßer 	0xE0166, 0xE0167, 0xE0168, 0xE0169, 0xE016A, 0xE016B, 0xE016C, 0xE016D,
65678bc019dSStefan Eßer 	0xE016E, 0xE016F, 0xE0170, 0xE0171, 0xE0172, 0xE0173, 0xE0174, 0xE0175,
65778bc019dSStefan Eßer 	0xE0176, 0xE0177, 0xE0178, 0xE0179, 0xE017A, 0xE017B, 0xE017C, 0xE017D,
65878bc019dSStefan Eßer 	0xE017E, 0xE017F, 0xE0180, 0xE0181, 0xE0182, 0xE0183, 0xE0184, 0xE0185,
65978bc019dSStefan Eßer 	0xE0186, 0xE0187, 0xE0188, 0xE0189, 0xE018A, 0xE018B, 0xE018C, 0xE018D,
66078bc019dSStefan Eßer 	0xE018E, 0xE018F, 0xE0190, 0xE0191, 0xE0192, 0xE0193, 0xE0194, 0xE0195,
66178bc019dSStefan Eßer 	0xE0196, 0xE0197, 0xE0198, 0xE0199, 0xE019A, 0xE019B, 0xE019C, 0xE019D,
66278bc019dSStefan Eßer 	0xE019E, 0xE019F, 0xE01A0, 0xE01A1, 0xE01A2, 0xE01A3, 0xE01A4, 0xE01A5,
66378bc019dSStefan Eßer 	0xE01A6, 0xE01A7, 0xE01A8, 0xE01A9, 0xE01AA, 0xE01AB, 0xE01AC, 0xE01AD,
66478bc019dSStefan Eßer 	0xE01AE, 0xE01AF, 0xE01B0, 0xE01B1, 0xE01B2, 0xE01B3, 0xE01B4, 0xE01B5,
66578bc019dSStefan Eßer 	0xE01B6, 0xE01B7, 0xE01B8, 0xE01B9, 0xE01BA, 0xE01BB, 0xE01BC, 0xE01BD,
66678bc019dSStefan Eßer 	0xE01BE, 0xE01BF, 0xE01C0, 0xE01C1, 0xE01C2, 0xE01C3, 0xE01C4, 0xE01C5,
66778bc019dSStefan Eßer 	0xE01C6, 0xE01C7, 0xE01C8, 0xE01C9, 0xE01CA, 0xE01CB, 0xE01CC, 0xE01CD,
66878bc019dSStefan Eßer 	0xE01CE, 0xE01CF, 0xE01D0, 0xE01D1, 0xE01D2, 0xE01D3, 0xE01D4, 0xE01D5,
66978bc019dSStefan Eßer 	0xE01D6, 0xE01D7, 0xE01D8, 0xE01D9, 0xE01DA, 0xE01DB, 0xE01DC, 0xE01DD,
67078bc019dSStefan Eßer 	0xE01DE, 0xE01DF, 0xE01E0, 0xE01E1, 0xE01E2, 0xE01E3, 0xE01E4, 0xE01E5,
67178bc019dSStefan Eßer 	0xE01E6, 0xE01E7, 0xE01E8, 0xE01E9, 0xE01EA, 0xE01EB, 0xE01EC, 0xE01ED,
67278bc019dSStefan Eßer 	0xE01EE, 0xE01EF,
673252884aeSStefan Eßer };
674252884aeSStefan Eßer 
67544d4804dSStefan Eßer /// The length of the combining characters list.
67678bc019dSStefan Eßer const size_t bc_history_combo_chars_len = sizeof(bc_history_combo_chars) /
67778bc019dSStefan Eßer                                           sizeof(bc_history_combo_chars[0]);
67878bc019dSStefan Eßer #endif // BC_ENABLE_HISTORY && !BC_ENABLE_LINE_LIB
679252884aeSStefan Eßer 
68044d4804dSStefan Eßer /// The human-readable name of the main function in bc source code.
681252884aeSStefan Eßer const char bc_func_main[] = "(main)";
68244d4804dSStefan Eßer 
68344d4804dSStefan Eßer /// The human-readable name of the read function in bc source code.
684252884aeSStefan Eßer const char bc_func_read[] = "(read)";
685252884aeSStefan Eßer 
686252884aeSStefan Eßer #if BC_DEBUG_CODE
68744d4804dSStefan Eßer 
68844d4804dSStefan Eßer /// A list of names of instructions for easy debugging output.
689252884aeSStefan Eßer const char* bc_inst_names[] = {
690252884aeSStefan Eßer 
691252884aeSStefan Eßer #if BC_ENABLED
692252884aeSStefan Eßer 	"BC_INST_INC",
693252884aeSStefan Eßer 	"BC_INST_DEC",
694252884aeSStefan Eßer #endif // BC_ENABLED
695252884aeSStefan Eßer 
696252884aeSStefan Eßer 	"BC_INST_NEG",
697252884aeSStefan Eßer 	"BC_INST_BOOL_NOT",
698252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
699252884aeSStefan Eßer 	"BC_INST_TRUNC",
700252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
701252884aeSStefan Eßer 
702252884aeSStefan Eßer 	"BC_INST_POWER",
703252884aeSStefan Eßer 	"BC_INST_MULTIPLY",
704252884aeSStefan Eßer 	"BC_INST_DIVIDE",
705252884aeSStefan Eßer 	"BC_INST_MODULUS",
706252884aeSStefan Eßer 	"BC_INST_PLUS",
707252884aeSStefan Eßer 	"BC_INST_MINUS",
708252884aeSStefan Eßer 
709252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
710252884aeSStefan Eßer 	"BC_INST_PLACES",
711252884aeSStefan Eßer 
712252884aeSStefan Eßer 	"BC_INST_LSHIFT",
713252884aeSStefan Eßer 	"BC_INST_RSHIFT",
714252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
715252884aeSStefan Eßer 
716252884aeSStefan Eßer 	"BC_INST_REL_EQ",
717252884aeSStefan Eßer 	"BC_INST_REL_LE",
718252884aeSStefan Eßer 	"BC_INST_REL_GE",
719252884aeSStefan Eßer 	"BC_INST_REL_NE",
720252884aeSStefan Eßer 	"BC_INST_REL_LT",
721252884aeSStefan Eßer 	"BC_INST_REL_GT",
722252884aeSStefan Eßer 
723252884aeSStefan Eßer 	"BC_INST_BOOL_OR",
724252884aeSStefan Eßer 	"BC_INST_BOOL_AND",
725252884aeSStefan Eßer 
726252884aeSStefan Eßer #if BC_ENABLED
727252884aeSStefan Eßer 	"BC_INST_ASSIGN_POWER",
728252884aeSStefan Eßer 	"BC_INST_ASSIGN_MULTIPLY",
729252884aeSStefan Eßer 	"BC_INST_ASSIGN_DIVIDE",
730252884aeSStefan Eßer 	"BC_INST_ASSIGN_MODULUS",
731252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLUS",
732252884aeSStefan Eßer 	"BC_INST_ASSIGN_MINUS",
733252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
734252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLACES",
735252884aeSStefan Eßer 	"BC_INST_ASSIGN_LSHIFT",
736252884aeSStefan Eßer 	"BC_INST_ASSIGN_RSHIFT",
737252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
738252884aeSStefan Eßer 	"BC_INST_ASSIGN",
739252884aeSStefan Eßer 
740252884aeSStefan Eßer 	"BC_INST_ASSIGN_POWER_NO_VAL",
741252884aeSStefan Eßer 	"BC_INST_ASSIGN_MULTIPLY_NO_VAL",
742252884aeSStefan Eßer 	"BC_INST_ASSIGN_DIVIDE_NO_VAL",
743252884aeSStefan Eßer 	"BC_INST_ASSIGN_MODULUS_NO_VAL",
744252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLUS_NO_VAL",
745252884aeSStefan Eßer 	"BC_INST_ASSIGN_MINUS_NO_VAL",
746252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
747252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLACES_NO_VAL",
748252884aeSStefan Eßer 	"BC_INST_ASSIGN_LSHIFT_NO_VAL",
749252884aeSStefan Eßer 	"BC_INST_ASSIGN_RSHIFT_NO_VAL",
750252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
751252884aeSStefan Eßer #endif // BC_ENABLED
752252884aeSStefan Eßer 	"BC_INST_ASSIGN_NO_VAL",
753252884aeSStefan Eßer 
754252884aeSStefan Eßer 	"BC_INST_NUM",
755252884aeSStefan Eßer 	"BC_INST_VAR",
756252884aeSStefan Eßer 	"BC_INST_ARRAY_ELEM",
757252884aeSStefan Eßer 	"BC_INST_ARRAY",
758252884aeSStefan Eßer 
7593aa99676SStefan Eßer 	"BC_INST_ZERO",
760252884aeSStefan Eßer 	"BC_INST_ONE",
761252884aeSStefan Eßer 
762252884aeSStefan Eßer #if BC_ENABLED
763252884aeSStefan Eßer 	"BC_INST_LAST",
764252884aeSStefan Eßer #endif // BC_ENABLED
765252884aeSStefan Eßer 	"BC_INST_IBASE",
766252884aeSStefan Eßer 	"BC_INST_OBASE",
767252884aeSStefan Eßer 	"BC_INST_SCALE",
768252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
769252884aeSStefan Eßer 	"BC_INST_SEED",
770252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
771252884aeSStefan Eßer 	"BC_INST_LENGTH",
772252884aeSStefan Eßer 	"BC_INST_SCALE_FUNC",
773252884aeSStefan Eßer 	"BC_INST_SQRT",
774252884aeSStefan Eßer 	"BC_INST_ABS",
775d101cdd6SStefan Eßer 	"BC_INST_IS_NUMBER",
776d101cdd6SStefan Eßer 	"BC_INST_IS_STRING",
777252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
778252884aeSStefan Eßer 	"BC_INST_IRAND",
779252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
78044d4804dSStefan Eßer 	"BC_INST_ASCIIFY",
781252884aeSStefan Eßer 	"BC_INST_READ",
782252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
783252884aeSStefan Eßer 	"BC_INST_RAND",
784252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
785252884aeSStefan Eßer 	"BC_INST_MAXIBASE",
786252884aeSStefan Eßer 	"BC_INST_MAXOBASE",
787252884aeSStefan Eßer 	"BC_INST_MAXSCALE",
788252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
789252884aeSStefan Eßer 	"BC_INST_MAXRAND",
790252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
791252884aeSStefan Eßer 
792252884aeSStefan Eßer 	"BC_INST_PRINT",
793252884aeSStefan Eßer 	"BC_INST_PRINT_POP",
794252884aeSStefan Eßer 	"BC_INST_STR",
79544d4804dSStefan Eßer #if BC_ENABLED
796252884aeSStefan Eßer 	"BC_INST_PRINT_STR",
797252884aeSStefan Eßer 
798252884aeSStefan Eßer 	"BC_INST_JUMP",
799252884aeSStefan Eßer 	"BC_INST_JUMP_ZERO",
800252884aeSStefan Eßer 
801252884aeSStefan Eßer 	"BC_INST_CALL",
802252884aeSStefan Eßer 
803252884aeSStefan Eßer 	"BC_INST_RET",
804252884aeSStefan Eßer 	"BC_INST_RET0",
805252884aeSStefan Eßer 	"BC_INST_RET_VOID",
806252884aeSStefan Eßer 
807252884aeSStefan Eßer 	"BC_INST_HALT",
808252884aeSStefan Eßer #endif // BC_ENABLED
809252884aeSStefan Eßer 
810252884aeSStefan Eßer 	"BC_INST_POP",
81144d4804dSStefan Eßer 	"BC_INST_SWAP",
812252884aeSStefan Eßer 	"BC_INST_MODEXP",
813252884aeSStefan Eßer 	"BC_INST_DIVMOD",
81444d4804dSStefan Eßer 	"BC_INST_PRINT_STREAM",
81544d4804dSStefan Eßer 
81644d4804dSStefan Eßer #if DC_ENABLED
81744d4804dSStefan Eßer 	"BC_INST_POP_EXEC",
818252884aeSStefan Eßer 
819252884aeSStefan Eßer 	"BC_INST_EXECUTE",
820252884aeSStefan Eßer 	"BC_INST_EXEC_COND",
821252884aeSStefan Eßer 
822252884aeSStefan Eßer 	"BC_INST_PRINT_STACK",
823252884aeSStefan Eßer 	"BC_INST_CLEAR_STACK",
82444d4804dSStefan Eßer 	"BC_INST_REG_STACK_LEN",
825252884aeSStefan Eßer 	"BC_INST_STACK_LEN",
826252884aeSStefan Eßer 	"BC_INST_DUPLICATE",
827252884aeSStefan Eßer 
828252884aeSStefan Eßer 	"BC_INST_LOAD",
829252884aeSStefan Eßer 	"BC_INST_PUSH_VAR",
830252884aeSStefan Eßer 	"BC_INST_PUSH_TO_VAR",
831252884aeSStefan Eßer 
832252884aeSStefan Eßer 	"BC_INST_QUIT",
833252884aeSStefan Eßer 	"BC_INST_NQUIT",
83444d4804dSStefan Eßer 
83544d4804dSStefan Eßer 	"BC_INST_EXEC_STACK_LEN",
836252884aeSStefan Eßer #endif // DC_ENABLED
83744d4804dSStefan Eßer 
83844d4804dSStefan Eßer 	"BC_INST_INVALID",
839252884aeSStefan Eßer };
84044d4804dSStefan Eßer 
841252884aeSStefan Eßer #endif // BC_DEBUG_CODE
842252884aeSStefan Eßer 
84344d4804dSStefan Eßer /// A constant string for 0.
84450696a6eSStefan Eßer const char bc_parse_zero[2] = "0";
84544d4804dSStefan Eßer 
84644d4804dSStefan Eßer /// A constant string for 1.
84750696a6eSStefan Eßer const char bc_parse_one[2] = "1";
848252884aeSStefan Eßer 
849252884aeSStefan Eßer #if BC_ENABLED
85044d4804dSStefan Eßer 
85144d4804dSStefan Eßer /// A list of keywords for bc. This needs to be updated if keywords change.
852252884aeSStefan Eßer const BcLexKeyword bc_lex_kws[] = {
853252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("auto", 4, true),
854252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("break", 5, true),
855252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("continue", 8, false),
856252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("define", 6, true),
857252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("for", 3, true),
858252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("if", 2, true),
859252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("limits", 6, false),
860252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("return", 6, true),
861252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("while", 5, true),
862252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("halt", 4, false),
863252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("last", 4, false),
864252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("ibase", 5, true),
865252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("obase", 5, true),
866252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("scale", 5, true),
86744d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
868252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("seed", 4, false),
86944d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
870252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("length", 6, true),
871252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("print", 5, false),
872252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("sqrt", 4, true),
873252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("abs", 3, false),
874d101cdd6SStefan Eßer 	BC_LEX_KW_ENTRY("is_number", 9, false),
875d101cdd6SStefan Eßer 	BC_LEX_KW_ENTRY("is_string", 9, false),
87644d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
877252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("irand", 5, false),
87844d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
87944d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("asciify", 7, false),
88044d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("modexp", 6, false),
88144d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("divmod", 6, false),
882252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("quit", 4, true),
883252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("read", 4, false),
88444d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
885252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("rand", 4, false),
88644d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
887252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxibase", 8, false),
888252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxobase", 8, false),
889252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxscale", 8, false),
89044d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
891252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxrand", 7, false),
89244d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
893d43fa8efSStefan Eßer 	BC_LEX_KW_ENTRY("line_length", 11, false),
894d43fa8efSStefan Eßer 	BC_LEX_KW_ENTRY("global_stacks", 13, false),
895d43fa8efSStefan Eßer 	BC_LEX_KW_ENTRY("leading_zero", 12, false),
89644d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("stream", 6, false),
897252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("else", 4, false),
898252884aeSStefan Eßer };
899252884aeSStefan Eßer 
90044d4804dSStefan Eßer /// The length of the list of bc keywords.
901252884aeSStefan Eßer const size_t bc_lex_kws_len = sizeof(bc_lex_kws) / sizeof(BcLexKeyword);
902252884aeSStefan Eßer 
90344d4804dSStefan Eßer #if BC_C11
90444d4804dSStefan Eßer 
90544d4804dSStefan Eßer // This is here to ensure that BC_LEX_NKWS, which is needed for the
90644d4804dSStefan Eßer // redefined_kws in BcVm, is correct. If it's correct under C11, it will be
90744d4804dSStefan Eßer // correct under C99, and I did not know any other way of ensuring they remained
90844d4804dSStefan Eßer // synchronized.
90978bc019dSStefan Eßer _Static_assert(sizeof(bc_lex_kws) / sizeof(BcLexKeyword) == BC_LEX_NKWS,
91044d4804dSStefan Eßer                "BC_LEX_NKWS is wrong.");
91144d4804dSStefan Eßer 
91244d4804dSStefan Eßer #endif // BC_C11
91344d4804dSStefan Eßer 
91444d4804dSStefan Eßer /// An array of booleans that correspond to token types. An entry is true if the
91544d4804dSStefan Eßer /// token is valid in an expression, false otherwise. This will need to change
91644d4804dSStefan Eßer /// if tokens change.
917252884aeSStefan Eßer const uint8_t bc_parse_exprs[] = {
91844d4804dSStefan Eßer 
91944d4804dSStefan Eßer 	// Starts with BC_LEX_EOF.
920252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),
92144d4804dSStefan Eßer 
92244d4804dSStefan Eßer 	// Starts with BC_LEX_OP_MULTIPLY if extra math is enabled, BC_LEX_OP_DIVIDE
92344d4804dSStefan Eßer 	// otherwise.
924252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
92544d4804dSStefan Eßer 
92644d4804dSStefan Eßer 	// Starts with BC_LEX_OP_REL_EQ if extra math is enabled, BC_LEX_OP_REL_LT
92744d4804dSStefan Eßer 	// otherwise.
928252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
92944d4804dSStefan Eßer 
93044d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
93144d4804dSStefan Eßer 
93244d4804dSStefan Eßer 	// Starts with BC_LEX_OP_ASSIGN_POWER.
933252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
93444d4804dSStefan Eßer 
93544d4804dSStefan Eßer 	// Starts with BC_LEX_OP_ASSIGN_RSHIFT.
936252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, false, false, true, true, false, false),
93744d4804dSStefan Eßer 
93844d4804dSStefan Eßer 	// Starts with BC_LEX_RBRACKET.
93944d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, true, true, true, false),
94044d4804dSStefan Eßer 
94144d4804dSStefan Eßer 	// Starts with BC_LEX_KW_BREAK.
942252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false),
94344d4804dSStefan Eßer 
94444d4804dSStefan Eßer 	// Starts with BC_LEX_KW_HALT.
945252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, true, true, true, true, true, true, false),
94644d4804dSStefan Eßer 
94744d4804dSStefan Eßer 	// Starts with BC_LEX_KW_SQRT.
948d43fa8efSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
949d43fa8efSStefan Eßer 
950d101cdd6SStefan Eßer 	// Starts with BC_LEX_KW_QUIT.
951d101cdd6SStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, true, true, true, true, true, true, true),
952d101cdd6SStefan Eßer 
953d101cdd6SStefan Eßer 	// Starts with BC_LEX_KW_GLOBAL_STACKS.
954d101cdd6SStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, false, false, 0, 0, 0, 0)
95544d4804dSStefan Eßer 
95644d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
95744d4804dSStefan Eßer 
95844d4804dSStefan Eßer 	// Starts with BC_LEX_OP_ASSIGN_PLUS.
959252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, false, false, true, true, false),
96044d4804dSStefan Eßer 
96144d4804dSStefan Eßer 	// Starts with BC_LEX_COMMA.
96244d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, true, true, true),
96344d4804dSStefan Eßer 
96444d4804dSStefan Eßer 	// Starts with BC_LEX_KW_AUTO.
965252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false),
96644d4804dSStefan Eßer 
96744d4804dSStefan Eßer 	// Starts with BC_LEX_KW_WHILE.
968252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, false),
96944d4804dSStefan Eßer 
97044d4804dSStefan Eßer 	// Starts with BC_LEX_KW_SQRT.
971d101cdd6SStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, false),
97244d4804dSStefan Eßer 
973d101cdd6SStefan Eßer 	// Starts with BC_LEX_KW_MAXIBASE.
974d101cdd6SStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, false),
975d101cdd6SStefan Eßer 
976d101cdd6SStefan Eßer 	// Starts with  BC_LEX_KW_ELSE.
977d101cdd6SStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, 0, 0, 0, 0, 0, 0, 0)
97844d4804dSStefan Eßer 
979252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
980252884aeSStefan Eßer };
981252884aeSStefan Eßer 
982d101cdd6SStefan Eßer /// An array of data for operators that correspond to token types. Note that a
983d101cdd6SStefan Eßer /// lower precedence *value* means a higher precedence.
984252884aeSStefan Eßer const uchar bc_parse_ops[] = {
98578bc019dSStefan Eßer 	BC_PARSE_OP(0, false), BC_PARSE_OP(0, false), BC_PARSE_OP(1, false),
98678bc019dSStefan Eßer 	BC_PARSE_OP(1, false),
987252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
988252884aeSStefan Eßer 	BC_PARSE_OP(2, false),
989252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
99078bc019dSStefan Eßer 	BC_PARSE_OP(4, false), BC_PARSE_OP(5, true),  BC_PARSE_OP(5, true),
99178bc019dSStefan Eßer 	BC_PARSE_OP(5, true),  BC_PARSE_OP(6, true),  BC_PARSE_OP(6, true),
992252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
99378bc019dSStefan Eßer 	BC_PARSE_OP(3, false), BC_PARSE_OP(7, true),  BC_PARSE_OP(7, true),
994252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
995252884aeSStefan Eßer 	BC_PARSE_OP(9, true),  BC_PARSE_OP(9, true),  BC_PARSE_OP(9, true),
996252884aeSStefan Eßer 	BC_PARSE_OP(9, true),  BC_PARSE_OP(9, true),  BC_PARSE_OP(9, true),
99778bc019dSStefan Eßer 	BC_PARSE_OP(11, true), BC_PARSE_OP(10, true), BC_PARSE_OP(8, false),
998252884aeSStefan Eßer 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
99978bc019dSStefan Eßer 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
1000252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1001252884aeSStefan Eßer 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
1002252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1003252884aeSStefan Eßer 	BC_PARSE_OP(8, false),
1004252884aeSStefan Eßer };
1005252884aeSStefan Eßer 
1006252884aeSStefan Eßer // These identify what tokens can come after expressions in certain cases.
100744d4804dSStefan Eßer 
100844d4804dSStefan Eßer /// The valid next tokens for normal expressions.
100978bc019dSStefan Eßer const BcParseNext bc_parse_next_expr = BC_PARSE_NEXT(4, BC_LEX_NLINE,
101078bc019dSStefan Eßer                                                      BC_LEX_SCOLON,
101178bc019dSStefan Eßer                                                      BC_LEX_RBRACE, BC_LEX_EOF);
101244d4804dSStefan Eßer 
101344d4804dSStefan Eßer /// The valid next tokens for function argument expressions.
101478bc019dSStefan Eßer const BcParseNext bc_parse_next_arg = BC_PARSE_NEXT(2, BC_LEX_RPAREN,
101578bc019dSStefan Eßer                                                     BC_LEX_COMMA);
101644d4804dSStefan Eßer 
101744d4804dSStefan Eßer /// The valid next tokens for expressions in print statements.
101878bc019dSStefan Eßer const BcParseNext bc_parse_next_print = BC_PARSE_NEXT(4, BC_LEX_COMMA,
101978bc019dSStefan Eßer                                                       BC_LEX_NLINE,
102078bc019dSStefan Eßer                                                       BC_LEX_SCOLON,
102178bc019dSStefan Eßer                                                       BC_LEX_EOF);
102244d4804dSStefan Eßer 
102344d4804dSStefan Eßer /// The valid next tokens for if statement conditions or loop conditions. This
102444d4804dSStefan Eßer /// is used in for loops for the update expression and for builtin function.
102544d4804dSStefan Eßer ///
102644d4804dSStefan Eßer /// The name is an artifact of history, and is related to @a BC_PARSE_REL (see
102744d4804dSStefan Eßer /// include/parse.h). It refers to how POSIX only allows some operators as part
102844d4804dSStefan Eßer /// of the conditional of for loops, while loops, and if statements.
1029252884aeSStefan Eßer const BcParseNext bc_parse_next_rel = BC_PARSE_NEXT(1, BC_LEX_RPAREN);
103044d4804dSStefan Eßer 
103144d4804dSStefan Eßer /// The valid next tokens for array element expressions.
1032252884aeSStefan Eßer const BcParseNext bc_parse_next_elem = BC_PARSE_NEXT(1, BC_LEX_RBRACKET);
103344d4804dSStefan Eßer 
103444d4804dSStefan Eßer /// The valid next tokens for for loop initialization expressions and condition
103544d4804dSStefan Eßer /// expressions.
1036252884aeSStefan Eßer const BcParseNext bc_parse_next_for = BC_PARSE_NEXT(1, BC_LEX_SCOLON);
103744d4804dSStefan Eßer 
103844d4804dSStefan Eßer /// The valid next tokens for read expressions.
103978bc019dSStefan Eßer const BcParseNext bc_parse_next_read = BC_PARSE_NEXT(2, BC_LEX_NLINE,
104078bc019dSStefan Eßer                                                      BC_LEX_EOF);
104144d4804dSStefan Eßer 
104244d4804dSStefan Eßer /// The valid next tokens for the arguments of a builtin function with multiple
104344d4804dSStefan Eßer /// arguments.
104444d4804dSStefan Eßer const BcParseNext bc_parse_next_builtin = BC_PARSE_NEXT(1, BC_LEX_COMMA);
104544d4804dSStefan Eßer 
1046252884aeSStefan Eßer #endif // BC_ENABLED
1047252884aeSStefan Eßer 
1048252884aeSStefan Eßer #if DC_ENABLED
104944d4804dSStefan Eßer 
105044d4804dSStefan Eßer /// A list of instructions that need register arguments in dc.
1051252884aeSStefan Eßer const uint8_t dc_lex_regs[] = {
105278bc019dSStefan Eßer 	BC_LEX_OP_REL_EQ,  BC_LEX_OP_REL_LE,       BC_LEX_OP_REL_GE,
105378bc019dSStefan Eßer 	BC_LEX_OP_REL_NE,  BC_LEX_OP_REL_LT,       BC_LEX_OP_REL_GT,
105478bc019dSStefan Eßer 	BC_LEX_SCOLON,     BC_LEX_COLON,           BC_LEX_KW_ELSE,
105578bc019dSStefan Eßer 	BC_LEX_LOAD,       BC_LEX_LOAD_POP,        BC_LEX_OP_ASSIGN,
105644d4804dSStefan Eßer 	BC_LEX_STORE_PUSH, BC_LEX_REG_STACK_LEVEL, BC_LEX_ARRAY_LENGTH,
1057252884aeSStefan Eßer };
1058252884aeSStefan Eßer 
105944d4804dSStefan Eßer /// The length of the list of register instructions.
1060252884aeSStefan Eßer const size_t dc_lex_regs_len = sizeof(dc_lex_regs) / sizeof(uint8_t);
1061252884aeSStefan Eßer 
106244d4804dSStefan Eßer /// A list corresponding to characters starting at double quote ("). If an entry
106344d4804dSStefan Eßer /// is BC_LEX_INVALID, then that character needs extra lexing in dc. If it does
106444d4804dSStefan Eßer /// not, the character can trivially be replaced by the entry. Positions are
106544d4804dSStefan Eßer /// kept because it corresponds to the ASCII table. This may need to be changed
106644d4804dSStefan Eßer /// if tokens change.
1067252884aeSStefan Eßer const uchar dc_lex_tokens[] = {
106844d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1069252884aeSStefan Eßer 	BC_LEX_KW_IRAND,
107044d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1071252884aeSStefan Eßer 	BC_LEX_INVALID,
107244d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1073252884aeSStefan Eßer 	BC_LEX_INVALID,
1074252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1075252884aeSStefan Eßer 	BC_LEX_OP_TRUNC,
1076252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1077252884aeSStefan Eßer 	BC_LEX_INVALID,
1078252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
107978bc019dSStefan Eßer 	BC_LEX_OP_MODULUS,
108078bc019dSStefan Eßer 	BC_LEX_INVALID,
108144d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1082252884aeSStefan Eßer 	BC_LEX_KW_RAND,
108344d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1084252884aeSStefan Eßer 	BC_LEX_INVALID,
108544d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
108678bc019dSStefan Eßer 	BC_LEX_LPAREN,
108778bc019dSStefan Eßer 	BC_LEX_RPAREN,
108878bc019dSStefan Eßer 	BC_LEX_OP_MULTIPLY,
108978bc019dSStefan Eßer 	BC_LEX_OP_PLUS,
109078bc019dSStefan Eßer 	BC_LEX_EXEC_STACK_LENGTH,
109178bc019dSStefan Eßer 	BC_LEX_OP_MINUS,
109278bc019dSStefan Eßer 	BC_LEX_INVALID,
109378bc019dSStefan Eßer 	BC_LEX_OP_DIVIDE,
109478bc019dSStefan Eßer 	BC_LEX_INVALID,
109578bc019dSStefan Eßer 	BC_LEX_INVALID,
109678bc019dSStefan Eßer 	BC_LEX_INVALID,
109778bc019dSStefan Eßer 	BC_LEX_INVALID,
109878bc019dSStefan Eßer 	BC_LEX_INVALID,
109978bc019dSStefan Eßer 	BC_LEX_INVALID,
110078bc019dSStefan Eßer 	BC_LEX_INVALID,
110178bc019dSStefan Eßer 	BC_LEX_INVALID,
110278bc019dSStefan Eßer 	BC_LEX_INVALID,
110378bc019dSStefan Eßer 	BC_LEX_INVALID,
110478bc019dSStefan Eßer 	BC_LEX_COLON,
110578bc019dSStefan Eßer 	BC_LEX_SCOLON,
110678bc019dSStefan Eßer 	BC_LEX_OP_REL_GT,
110778bc019dSStefan Eßer 	BC_LEX_OP_REL_EQ,
110878bc019dSStefan Eßer 	BC_LEX_OP_REL_LT,
110978bc019dSStefan Eßer 	BC_LEX_KW_READ,
1110252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1111252884aeSStefan Eßer 	BC_LEX_OP_PLACES,
1112252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1113252884aeSStefan Eßer 	BC_LEX_INVALID,
1114252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
111578bc019dSStefan Eßer 	BC_LEX_INVALID,
111678bc019dSStefan Eßer 	BC_LEX_INVALID,
111778bc019dSStefan Eßer 	BC_LEX_INVALID,
111878bc019dSStefan Eßer 	BC_LEX_INVALID,
111978bc019dSStefan Eßer 	BC_LEX_INVALID,
112078bc019dSStefan Eßer 	BC_LEX_INVALID,
112178bc019dSStefan Eßer 	BC_LEX_EQ_NO_REG,
1122252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1123252884aeSStefan Eßer 	BC_LEX_OP_LSHIFT,
1124252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1125252884aeSStefan Eßer 	BC_LEX_INVALID,
1126252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1127252884aeSStefan Eßer 	BC_LEX_KW_IBASE,
112844d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1129252884aeSStefan Eßer 	BC_LEX_KW_SEED,
113044d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1131252884aeSStefan Eßer 	BC_LEX_INVALID,
113244d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
113378bc019dSStefan Eßer 	BC_LEX_KW_SCALE,
113478bc019dSStefan Eßer 	BC_LEX_LOAD_POP,
113578bc019dSStefan Eßer 	BC_LEX_OP_BOOL_AND,
113678bc019dSStefan Eßer 	BC_LEX_OP_BOOL_NOT,
113778bc019dSStefan Eßer 	BC_LEX_KW_OBASE,
113878bc019dSStefan Eßer 	BC_LEX_KW_STREAM,
113978bc019dSStefan Eßer 	BC_LEX_NQUIT,
114078bc019dSStefan Eßer 	BC_LEX_POP,
114178bc019dSStefan Eßer 	BC_LEX_STORE_PUSH,
114278bc019dSStefan Eßer 	BC_LEX_KW_MAXIBASE,
114378bc019dSStefan Eßer 	BC_LEX_KW_MAXOBASE,
1144252884aeSStefan Eßer 	BC_LEX_KW_MAXSCALE,
114544d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1146252884aeSStefan Eßer 	BC_LEX_KW_MAXRAND,
114744d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1148252884aeSStefan Eßer 	BC_LEX_INVALID,
114944d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
115078bc019dSStefan Eßer 	BC_LEX_SCALE_FACTOR,
115178bc019dSStefan Eßer 	BC_LEX_ARRAY_LENGTH,
115278bc019dSStefan Eßer 	BC_LEX_KW_LENGTH,
115378bc019dSStefan Eßer 	BC_LEX_INVALID,
115478bc019dSStefan Eßer 	BC_LEX_INVALID,
115578bc019dSStefan Eßer 	BC_LEX_INVALID,
115678bc019dSStefan Eßer 	BC_LEX_OP_POWER,
115778bc019dSStefan Eßer 	BC_LEX_NEG,
115878bc019dSStefan Eßer 	BC_LEX_INVALID,
115978bc019dSStefan Eßer 	BC_LEX_KW_ASCIIFY,
116078bc019dSStefan Eßer 	BC_LEX_KW_ABS,
116178bc019dSStefan Eßer 	BC_LEX_CLEAR_STACK,
116278bc019dSStefan Eßer 	BC_LEX_DUPLICATE,
116378bc019dSStefan Eßer 	BC_LEX_KW_ELSE,
116478bc019dSStefan Eßer 	BC_LEX_PRINT_STACK,
116578bc019dSStefan Eßer 	BC_LEX_INVALID,
1166252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1167252884aeSStefan Eßer 	BC_LEX_OP_RSHIFT,
1168252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1169252884aeSStefan Eßer 	BC_LEX_INVALID,
1170252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1171252884aeSStefan Eßer 	BC_LEX_STORE_IBASE,
117244d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1173252884aeSStefan Eßer 	BC_LEX_STORE_SEED,
117444d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1175252884aeSStefan Eßer 	BC_LEX_INVALID,
117644d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
117778bc019dSStefan Eßer 	BC_LEX_STORE_SCALE,
117878bc019dSStefan Eßer 	BC_LEX_LOAD,
117978bc019dSStefan Eßer 	BC_LEX_OP_BOOL_OR,
118078bc019dSStefan Eßer 	BC_LEX_PRINT_POP,
118178bc019dSStefan Eßer 	BC_LEX_STORE_OBASE,
118278bc019dSStefan Eßer 	BC_LEX_KW_PRINT,
118378bc019dSStefan Eßer 	BC_LEX_KW_QUIT,
118478bc019dSStefan Eßer 	BC_LEX_SWAP,
118578bc019dSStefan Eßer 	BC_LEX_OP_ASSIGN,
1186d101cdd6SStefan Eßer 	BC_LEX_KW_IS_STRING,
1187d101cdd6SStefan Eßer 	BC_LEX_KW_IS_NUMBER,
118878bc019dSStefan Eßer 	BC_LEX_KW_SQRT,
118978bc019dSStefan Eßer 	BC_LEX_INVALID,
119078bc019dSStefan Eßer 	BC_LEX_EXECUTE,
119178bc019dSStefan Eßer 	BC_LEX_REG_STACK_LEVEL,
119278bc019dSStefan Eßer 	BC_LEX_STACK_LEVEL,
119378bc019dSStefan Eßer 	BC_LEX_LBRACE,
119478bc019dSStefan Eßer 	BC_LEX_KW_MODEXP,
119578bc019dSStefan Eßer 	BC_LEX_RBRACE,
119678bc019dSStefan Eßer 	BC_LEX_KW_DIVMOD,
1197252884aeSStefan Eßer 	BC_LEX_INVALID
1198252884aeSStefan Eßer };
1199252884aeSStefan Eßer 
120044d4804dSStefan Eßer /// A list of instructions that correspond to lex tokens. If an entry is
1201d101cdd6SStefan Eßer /// @a BC_INST_INVALID, that lex token needs extra parsing in the dc parser.
120244d4804dSStefan Eßer /// Otherwise, the token can trivially be replaced by the entry. This needs to
120344d4804dSStefan Eßer /// be updated if the tokens change.
1204252884aeSStefan Eßer const uchar dc_parse_insts[] = {
1205252884aeSStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1206252884aeSStefan Eßer #if BC_ENABLED
1207252884aeSStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1208252884aeSStefan Eßer #endif // BC_ENABLED
1209252884aeSStefan Eßer 	BC_INST_INVALID,      BC_INST_BOOL_NOT,
1210252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1211252884aeSStefan Eßer 	BC_INST_TRUNC,
1212252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1213175a4d10SStefan Eßer 	BC_INST_POWER,        BC_INST_MULTIPLY,
1214175a4d10SStefan Eßer 	BC_INST_DIVIDE,       BC_INST_MODULUS,
1215175a4d10SStefan Eßer 	BC_INST_PLUS,         BC_INST_MINUS,
1216252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1217175a4d10SStefan Eßer 	BC_INST_PLACES,       BC_INST_LSHIFT,
1218175a4d10SStefan Eßer 	BC_INST_RSHIFT,
1219252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1220175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1221175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1222175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1223252884aeSStefan Eßer 	BC_INST_BOOL_OR,      BC_INST_BOOL_AND,
1224252884aeSStefan Eßer #if BC_ENABLED
1225175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1226175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1227175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1228252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1229175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1230175a4d10SStefan Eßer 	BC_INST_INVALID,
1231252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1232252884aeSStefan Eßer #endif // BC_ENABLED
1233175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1234175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_REL_GT,
1235175a4d10SStefan Eßer 	BC_INST_REL_LT,       BC_INST_INVALID,
1236175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1237175a4d10SStefan Eßer 	BC_INST_REL_GE,       BC_INST_INVALID,
1238175a4d10SStefan Eßer 	BC_INST_REL_LE,       BC_INST_INVALID,
123978bc019dSStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1240252884aeSStefan Eßer #if BC_ENABLED
124178bc019dSStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1242175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1243175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1244175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1245175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1246175a4d10SStefan Eßer 	BC_INST_INVALID,
1247252884aeSStefan Eßer #endif // BC_ENABLED
1248175a4d10SStefan Eßer 	BC_INST_IBASE,        BC_INST_OBASE,
1249175a4d10SStefan Eßer 	BC_INST_SCALE,
125044d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1251252884aeSStefan Eßer 	BC_INST_SEED,
125244d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1253175a4d10SStefan Eßer 	BC_INST_LENGTH,       BC_INST_PRINT,
1254175a4d10SStefan Eßer 	BC_INST_SQRT,         BC_INST_ABS,
1255175a4d10SStefan Eßer 	BC_INST_IS_NUMBER,    BC_INST_IS_STRING,
125644d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1257252884aeSStefan Eßer 	BC_INST_IRAND,
125844d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1259175a4d10SStefan Eßer 	BC_INST_ASCIIFY,      BC_INST_MODEXP,
1260175a4d10SStefan Eßer 	BC_INST_DIVMOD,       BC_INST_QUIT,
1261175a4d10SStefan Eßer 	BC_INST_INVALID,
126244d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1263252884aeSStefan Eßer 	BC_INST_RAND,
126444d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1265175a4d10SStefan Eßer 	BC_INST_MAXIBASE,     BC_INST_MAXOBASE,
1266175a4d10SStefan Eßer 	BC_INST_MAXSCALE,
126744d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1268252884aeSStefan Eßer 	BC_INST_MAXRAND,
1269252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1270d43fa8efSStefan Eßer 	BC_INST_LINE_LENGTH,
1271d43fa8efSStefan Eßer #if BC_ENABLED
1272d43fa8efSStefan Eßer 	BC_INST_INVALID,
1273d43fa8efSStefan Eßer #endif // BC_ENABLED
1274175a4d10SStefan Eßer 	BC_INST_LEADING_ZERO, BC_INST_PRINT_STREAM,
1275175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_EXTENDED_REGISTERS,
1276175a4d10SStefan Eßer 	BC_INST_REL_EQ,       BC_INST_INVALID,
1277175a4d10SStefan Eßer 	BC_INST_EXECUTE,      BC_INST_PRINT_STACK,
1278175a4d10SStefan Eßer 	BC_INST_CLEAR_STACK,  BC_INST_INVALID,
1279175a4d10SStefan Eßer 	BC_INST_STACK_LEN,    BC_INST_DUPLICATE,
1280175a4d10SStefan Eßer 	BC_INST_SWAP,         BC_INST_POP,
1281103d7cdfSStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1282175a4d10SStefan Eßer 	BC_INST_INVALID,
1283252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1284252884aeSStefan Eßer 	BC_INST_INVALID,
1285252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1286175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_INVALID,
1287175a4d10SStefan Eßer 	BC_INST_INVALID,      BC_INST_PRINT_POP,
1288175a4d10SStefan Eßer 	BC_INST_NQUIT,        BC_INST_EXEC_STACK_LEN,
128944d4804dSStefan Eßer 	BC_INST_SCALE_FUNC,   BC_INST_INVALID,
1290252884aeSStefan Eßer };
1291252884aeSStefan Eßer #endif // DC_ENABLED
1292252884aeSStefan Eßer 
129350696a6eSStefan Eßer #endif // !BC_ENABLE_LIBRARY
129450696a6eSStefan Eßer 
129544d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
129650696a6eSStefan Eßer 
129744d4804dSStefan Eßer /// A constant for the rand multiplier.
129850696a6eSStefan Eßer const BcRandState bc_rand_multiplier = BC_RAND_MULTIPLIER;
129950696a6eSStefan Eßer 
130044d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
130150696a6eSStefan Eßer 
130278bc019dSStefan Eßer // clang-format off
130378bc019dSStefan Eßer 
1304252884aeSStefan Eßer #if BC_LONG_BIT >= 64
130544d4804dSStefan Eßer 
130644d4804dSStefan Eßer /// A constant array for the max of a bigdig number as a BcDig array.
1307252884aeSStefan Eßer const BcDig bc_num_bigdigMax[] = {
1308252884aeSStefan Eßer 	709551616U,
1309252884aeSStefan Eßer 	446744073U,
131050696a6eSStefan Eßer 	18U,
131150696a6eSStefan Eßer };
131244d4804dSStefan Eßer 
131344d4804dSStefan Eßer /// A constant array for the max of 2 times a bigdig number as a BcDig array.
131450696a6eSStefan Eßer const BcDig bc_num_bigdigMax2[] = {
131550696a6eSStefan Eßer 	768211456U,
131650696a6eSStefan Eßer 	374607431U,
131750696a6eSStefan Eßer 	938463463U,
131850696a6eSStefan Eßer 	282366920U,
131950696a6eSStefan Eßer 	340U,
1320252884aeSStefan Eßer };
132144d4804dSStefan Eßer 
1322252884aeSStefan Eßer #else // BC_LONG_BIT >= 64
132344d4804dSStefan Eßer 
132444d4804dSStefan Eßer /// A constant array for the max of a bigdig number as a BcDig array.
1325252884aeSStefan Eßer const BcDig bc_num_bigdigMax[] = {
1326252884aeSStefan Eßer 	7296U,
1327252884aeSStefan Eßer 	9496U,
1328252884aeSStefan Eßer 	42U,
1329252884aeSStefan Eßer };
133044d4804dSStefan Eßer 
133144d4804dSStefan Eßer /// A constant array for the max of 2 times a bigdig number as a BcDig array.
133250696a6eSStefan Eßer const BcDig bc_num_bigdigMax2[] = {
133350696a6eSStefan Eßer 	1616U,
133450696a6eSStefan Eßer 	955U,
133550696a6eSStefan Eßer 	737U,
133650696a6eSStefan Eßer 	6744U,
133750696a6eSStefan Eßer 	1844U,
133850696a6eSStefan Eßer };
133944d4804dSStefan Eßer 
1340252884aeSStefan Eßer #endif // BC_LONG_BIT >= 64
1341252884aeSStefan Eßer 
134278bc019dSStefan Eßer // clang-format on
134378bc019dSStefan Eßer 
134444d4804dSStefan Eßer /// The size of the bigdig max array.
1345252884aeSStefan Eßer const size_t bc_num_bigdigMax_size = sizeof(bc_num_bigdigMax) / sizeof(BcDig);
134644d4804dSStefan Eßer 
134744d4804dSStefan Eßer /// The size of the bigdig max times 2 array.
134850696a6eSStefan Eßer const size_t bc_num_bigdigMax2_size = sizeof(bc_num_bigdigMax2) / sizeof(BcDig);
1349252884aeSStefan Eßer 
135044d4804dSStefan Eßer /// A string of digits for easy conversion from characters to digits.
1351252884aeSStefan Eßer const char bc_num_hex_digits[] = "0123456789ABCDEF";
1352252884aeSStefan Eßer 
135378bc019dSStefan Eßer // clang-format off
135478bc019dSStefan Eßer 
135544d4804dSStefan Eßer /// An array for easy conversion from exponent to power of 10.
1356252884aeSStefan Eßer const BcBigDig bc_num_pow10[BC_BASE_DIGS + 1] = {
1357252884aeSStefan Eßer 	1,
1358252884aeSStefan Eßer 	10,
1359252884aeSStefan Eßer 	100,
1360252884aeSStefan Eßer 	1000,
1361252884aeSStefan Eßer 	10000,
1362252884aeSStefan Eßer #if BC_BASE_DIGS > 4
1363252884aeSStefan Eßer 	100000,
1364252884aeSStefan Eßer 	1000000,
1365252884aeSStefan Eßer 	10000000,
1366252884aeSStefan Eßer 	100000000,
1367252884aeSStefan Eßer 	1000000000,
1368252884aeSStefan Eßer #endif // BC_BASE_DIGS > 4
1369252884aeSStefan Eßer };
1370252884aeSStefan Eßer 
137178bc019dSStefan Eßer // clang-format on
137278bc019dSStefan Eßer 
137350696a6eSStefan Eßer #if !BC_ENABLE_LIBRARY
137450696a6eSStefan Eßer 
137544d4804dSStefan Eßer /// An array of functions for binary operators corresponding to the order of
137644d4804dSStefan Eßer /// the instructions for the operators.
1377252884aeSStefan Eßer const BcNumBinaryOp bc_program_ops[] = {
137878bc019dSStefan Eßer 	bc_num_pow,    bc_num_mul,    bc_num_div,
137978bc019dSStefan Eßer 	bc_num_mod,    bc_num_add,    bc_num_sub,
1380252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1381252884aeSStefan Eßer 	bc_num_places, bc_num_lshift, bc_num_rshift,
1382252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1383252884aeSStefan Eßer };
1384252884aeSStefan Eßer 
138544d4804dSStefan Eßer /// An array of functions for binary operators allocation requests corresponding
138644d4804dSStefan Eßer /// to the order of the instructions for the operators.
1387252884aeSStefan Eßer const BcNumBinaryOpReq bc_program_opReqs[] = {
138878bc019dSStefan Eßer 	bc_num_powReq,    bc_num_mulReq,    bc_num_divReq,
138978bc019dSStefan Eßer 	bc_num_divReq,    bc_num_addReq,    bc_num_addReq,
1390252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1391252884aeSStefan Eßer 	bc_num_placesReq, bc_num_placesReq, bc_num_placesReq,
1392252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1393252884aeSStefan Eßer };
1394252884aeSStefan Eßer 
139544d4804dSStefan Eßer /// An array of unary operator functions corresponding to the order of the
139644d4804dSStefan Eßer /// instructions.
1397252884aeSStefan Eßer const BcProgramUnary bc_program_unarys[] = {
139878bc019dSStefan Eßer 	bc_program_negate,
139978bc019dSStefan Eßer 	bc_program_not,
1400252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1401252884aeSStefan Eßer 	bc_program_trunc,
1402252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1403252884aeSStefan Eßer };
1404252884aeSStefan Eßer 
140544d4804dSStefan Eßer /// A filename for when parsing expressions.
1406252884aeSStefan Eßer const char bc_program_exprs_name[] = "<exprs>";
1407252884aeSStefan Eßer 
140844d4804dSStefan Eßer /// A filename for when parsing stdin..
1409252884aeSStefan Eßer const char bc_program_stdin_name[] = "<stdin>";
141044d4804dSStefan Eßer 
141144d4804dSStefan Eßer /// A ready message for SIGINT catching.
1412252884aeSStefan Eßer const char bc_program_ready_msg[] = "ready for more input\n";
141344d4804dSStefan Eßer 
141444d4804dSStefan Eßer /// The length of the ready message.
1415252884aeSStefan Eßer const size_t bc_program_ready_msg_len = sizeof(bc_program_ready_msg) - 1;
141644d4804dSStefan Eßer 
141744d4804dSStefan Eßer /// A list of escape characters that a print statement should treat specially.
1418252884aeSStefan Eßer const char bc_program_esc_chars[] = "ab\\efnqrt";
141944d4804dSStefan Eßer 
142044d4804dSStefan Eßer /// A list of characters corresponding to the escape characters above.
1421252884aeSStefan Eßer const char bc_program_esc_seqs[] = "\a\b\\\\\f\n\"\r\t";
142250696a6eSStefan Eßer 
142350696a6eSStefan Eßer #endif // !BC_ENABLE_LIBRARY
1424