xref: /freebsd/contrib/bc/src/data.c (revision 44d4804d1945435745518cd09eb8ae6ab22ecef4)
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 
36*44d4804dSStefan Eßer #include <assert.h>
37*44d4804dSStefan Eßer 
38*44d4804dSStefan 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>
47*44d4804dSStefan Eßer #include <history.h>
48*44d4804dSStefan 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
54*44d4804dSStefan Eßer 
55*44d4804dSStefan 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);
58*44d4804dSStefan Eßer 
59252884aeSStefan Eßer #endif // BC_ENABLED
60*44d4804dSStefan Eßer 
61252884aeSStefan Eßer #if DC_ENABLED
62*44d4804dSStefan Eßer 
63*44d4804dSStefan 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);
66*44d4804dSStefan Eßer 
67252884aeSStefan Eßer #endif // DC_ENABLED
68252884aeSStefan Eßer 
69*44d4804dSStefan 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 
75*44d4804dSStefan Eßer #ifdef __OpenBSD__
76*44d4804dSStefan Eßer 
77*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
78*44d4804dSStefan Eßer 
79*44d4804dSStefan Eßer #if BC_ENABLE_HISTORY
80*44d4804dSStefan Eßer 
81*44d4804dSStefan Eßer /// The pledges for starting bc.
82*44d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio tty unveil";
83*44d4804dSStefan Eßer 
84*44d4804dSStefan Eßer /// The final pledges with history enabled.
85*44d4804dSStefan Eßer const char bc_pledge_end_history[] = "rpath stdio tty";
86*44d4804dSStefan Eßer 
87*44d4804dSStefan Eßer #else // BC_ENABLE_HISTORY
88*44d4804dSStefan Eßer 
89*44d4804dSStefan Eßer /// The pledges for starting bc.
90*44d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio unveil";
91*44d4804dSStefan Eßer 
92*44d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
93*44d4804dSStefan Eßer 
94*44d4804dSStefan Eßer /// The final pledges with history history disabled.
95*44d4804dSStefan Eßer const char bc_pledge_end[] = "rpath stdio";
96*44d4804dSStefan Eßer 
97*44d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
98*44d4804dSStefan Eßer 
99*44d4804dSStefan Eßer #if BC_ENABLE_HISTORY
100*44d4804dSStefan Eßer 
101*44d4804dSStefan Eßer /// The pledges for starting bc.
102*44d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio tty";
103*44d4804dSStefan Eßer 
104*44d4804dSStefan Eßer /// The final pledges with history enabled.
105*44d4804dSStefan Eßer const char bc_pledge_end_history[] = "stdio tty";
106*44d4804dSStefan Eßer 
107*44d4804dSStefan Eßer #else // BC_ENABLE_HISTORY
108*44d4804dSStefan Eßer 
109*44d4804dSStefan Eßer /// The pledges for starting bc.
110*44d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio";
111*44d4804dSStefan Eßer 
112*44d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
113*44d4804dSStefan Eßer 
114*44d4804dSStefan Eßer /// The final pledges with history history disabled.
115*44d4804dSStefan Eßer const char bc_pledge_end[] = "stdio";
116*44d4804dSStefan Eßer 
117*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
118*44d4804dSStefan Eßer 
119*44d4804dSStefan Eßer #else // __OpenBSD__
120*44d4804dSStefan Eßer 
121*44d4804dSStefan Eßer /// The pledges for starting bc.
122*44d4804dSStefan Eßer const char bc_pledge_start[] = "";
123*44d4804dSStefan Eßer 
124*44d4804dSStefan Eßer #if BC_ENABLE_HISTORY
125*44d4804dSStefan Eßer 
126*44d4804dSStefan Eßer /// The final pledges with history enabled.
127*44d4804dSStefan Eßer const char bc_pledge_end_history[] = "";
128*44d4804dSStefan Eßer 
129*44d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
130*44d4804dSStefan Eßer 
131*44d4804dSStefan Eßer /// The final pledges with history history disabled.
132*44d4804dSStefan Eßer const char bc_pledge_end[] = "";
133*44d4804dSStefan Eßer 
134*44d4804dSStefan Eßer #endif // __OpenBSD__
135*44d4804dSStefan Eßer 
136*44d4804dSStefan Eßer /// The list of long options. There is a zero set at the end for detecting the
137*44d4804dSStefan Eßer /// end.
138*44d4804dSStefan Eßer const BcOptLong bc_args_lopt[] = {
139*44d4804dSStefan Eßer 
140*44d4804dSStefan Eßer 	{ "expression", BC_OPT_REQUIRED, 'e' },
141*44d4804dSStefan Eßer 	{ "file", BC_OPT_REQUIRED, 'f' },
142*44d4804dSStefan Eßer 	{ "help", BC_OPT_NONE, 'h' },
143*44d4804dSStefan Eßer 	{ "interactive", BC_OPT_NONE, 'i' },
144*44d4804dSStefan Eßer 	{ "no-prompt", BC_OPT_NONE, 'P' },
145*44d4804dSStefan Eßer 	{ "no-read-prompt", BC_OPT_NONE, 'R' },
146*44d4804dSStefan Eßer #if BC_ENABLED
147*44d4804dSStefan Eßer 	{ "global-stacks", BC_OPT_BC_ONLY, 'g' },
148*44d4804dSStefan Eßer 	{ "mathlib", BC_OPT_BC_ONLY, 'l' },
149*44d4804dSStefan Eßer 	{ "quiet", BC_OPT_BC_ONLY, 'q' },
150*44d4804dSStefan Eßer 	{ "redefine", BC_OPT_REQUIRED_BC_ONLY, 'r' },
151*44d4804dSStefan Eßer 	{ "standard", BC_OPT_BC_ONLY, 's' },
152*44d4804dSStefan Eßer 	{ "warn", BC_OPT_BC_ONLY, 'w' },
153*44d4804dSStefan Eßer #endif // BC_ENABLED
154*44d4804dSStefan Eßer 	{ "version", BC_OPT_NONE, 'v' },
155*44d4804dSStefan Eßer 	{ "version", BC_OPT_NONE, 'V' },
156*44d4804dSStefan Eßer #if DC_ENABLED
157*44d4804dSStefan Eßer 	{ "extended-register", BC_OPT_DC_ONLY, 'x' },
158*44d4804dSStefan Eßer #endif // DC_ENABLED
159*44d4804dSStefan Eßer 	{ NULL, 0, 0 },
160*44d4804dSStefan Eßer 
161*44d4804dSStefan Eßer };
162*44d4804dSStefan Eßer 
163*44d4804dSStefan Eßer /// The function header for error messages.
164252884aeSStefan Eßer const char* const bc_err_func_header = "Function:";
165*44d4804dSStefan Eßer 
166*44d4804dSStefan Eßer /// The line format string for error messages.
167252884aeSStefan Eßer const char* const bc_err_line = ":%zu";
168252884aeSStefan Eßer 
169*44d4804dSStefan Eßer /// The default error category strings.
170252884aeSStefan Eßer const char *bc_errs[] = {
171252884aeSStefan Eßer 	"Math error:",
172252884aeSStefan Eßer 	"Parse error:",
173252884aeSStefan Eßer 	"Runtime error:",
174252884aeSStefan Eßer 	"Fatal error:",
175252884aeSStefan Eßer #if BC_ENABLED
176252884aeSStefan Eßer 	"Warning:",
177252884aeSStefan Eßer #endif // BC_ENABLED
178252884aeSStefan Eßer };
179252884aeSStefan Eßer 
180*44d4804dSStefan Eßer /// The error category for each error.
181252884aeSStefan Eßer const uchar bc_err_ids[] = {
182252884aeSStefan Eßer 
183252884aeSStefan Eßer 	BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH,
184252884aeSStefan Eßer 
185252884aeSStefan Eßer 	BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL,
186252884aeSStefan Eßer 	BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL,
187*44d4804dSStefan Eßer 	BC_ERR_IDX_FATAL,
188252884aeSStefan Eßer 
189252884aeSStefan Eßer 	BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
190252884aeSStefan Eßer 	BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
191*44d4804dSStefan Eßer 	BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
192252884aeSStefan Eßer 
193252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
194252884aeSStefan Eßer 	BC_ERR_IDX_PARSE,
195252884aeSStefan Eßer #if BC_ENABLED
196252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
197252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
198252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
199252884aeSStefan Eßer 
200252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
201252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
202252884aeSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
203*44d4804dSStefan Eßer 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
204252884aeSStefan Eßer #endif // BC_ENABLED
205252884aeSStefan Eßer 
206252884aeSStefan Eßer };
207252884aeSStefan Eßer 
208*44d4804dSStefan Eßer /// The default error messages. There are NULL pointers because the positions
209*44d4804dSStefan Eßer /// must be preserved for the locales.
210252884aeSStefan Eßer const char* const bc_err_msgs[] = {
211252884aeSStefan Eßer 
212252884aeSStefan Eßer 	"negative number",
213252884aeSStefan Eßer 	"non-integer number",
214252884aeSStefan Eßer 	"overflow: number cannot fit",
215252884aeSStefan Eßer 	"divide by 0",
216252884aeSStefan Eßer 
217252884aeSStefan Eßer 	"memory allocation failed",
218252884aeSStefan Eßer 	"I/O error",
219252884aeSStefan Eßer 	"cannot open file: %s",
220*44d4804dSStefan Eßer 	"file is not text: %s",
221252884aeSStefan Eßer 	"path is a directory: %s",
222252884aeSStefan Eßer 	"bad command-line option: \"%s\"",
223252884aeSStefan Eßer 	"option requires an argument: '%c' (\"%s\")",
224252884aeSStefan Eßer 	"option takes no arguments: '%c' (\"%s\")",
225*44d4804dSStefan Eßer 	"bad option argument: \"%s\"",
226252884aeSStefan Eßer 
227252884aeSStefan Eßer 	"bad ibase: must be [%lu, %lu]",
228252884aeSStefan Eßer 	"bad obase: must be [%lu, %lu]",
229252884aeSStefan Eßer 	"bad scale: must be [%lu, %lu]",
230252884aeSStefan Eßer 	"bad read() expression",
231252884aeSStefan Eßer 	"read() call inside of a read() call",
232252884aeSStefan Eßer 	"variable or array element is the wrong type",
233252884aeSStefan Eßer #if DC_ENABLED
234252884aeSStefan Eßer 	"stack has too few elements",
235*44d4804dSStefan Eßer 	"stack for register \"%s\" has too few elements",
236252884aeSStefan Eßer #else // DC_ENABLED
237*44d4804dSStefan Eßer 	NULL, NULL,
238252884aeSStefan Eßer #endif // DC_ENABLED
239252884aeSStefan Eßer #if BC_ENABLED
240252884aeSStefan Eßer 	"wrong number of parameters; need %zu, have %zu",
241252884aeSStefan Eßer 	"undefined function: %s()",
242252884aeSStefan Eßer 	"cannot use a void value in an expression",
243252884aeSStefan Eßer #else
244252884aeSStefan Eßer 	NULL, NULL, NULL,
245252884aeSStefan Eßer #endif // BC_ENABLED
246252884aeSStefan Eßer 
247252884aeSStefan Eßer 	"end of file",
248252884aeSStefan Eßer 	"bad character '%c'",
249252884aeSStefan Eßer 	"string end cannot be found",
250252884aeSStefan Eßer 	"comment end cannot be found",
251252884aeSStefan Eßer 	"bad token",
252252884aeSStefan Eßer #if BC_ENABLED
253252884aeSStefan Eßer 	"bad expression",
254252884aeSStefan Eßer 	"empty expression",
255*44d4804dSStefan Eßer 	"bad print or stream statement",
256252884aeSStefan Eßer 	"bad function definition",
257d213476dSStefan Eßer 	("bad assignment: left side must be scale, ibase, "
258d213476dSStefan Eßer 		"obase, seed, last, var, or array element"),
259252884aeSStefan Eßer 	"no auto variable found",
260252884aeSStefan Eßer 	"function parameter or auto \"%s%s\" already exists",
261252884aeSStefan Eßer 	"block end cannot be found",
262252884aeSStefan Eßer 	"cannot return a value from void function: %s()",
263252884aeSStefan Eßer 	"var cannot be a reference: %s",
264252884aeSStefan Eßer 
265252884aeSStefan Eßer 	"POSIX does not allow names longer than 1 character: %s",
266252884aeSStefan Eßer 	"POSIX does not allow '#' script comments",
267252884aeSStefan Eßer 	"POSIX does not allow the following keyword: %s",
268252884aeSStefan Eßer 	"POSIX does not allow a period ('.') as a shortcut for the last result",
269252884aeSStefan Eßer 	"POSIX requires parentheses around return expressions",
270252884aeSStefan Eßer 	"POSIX does not allow the following operator: %s",
271252884aeSStefan Eßer 	"POSIX does not allow comparison operators outside if statements or loops",
272252884aeSStefan Eßer 	"POSIX requires 0 or 1 comparison operators per condition",
273252884aeSStefan Eßer 	"POSIX requires all 3 parts of a for loop to be non-empty",
274252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
275252884aeSStefan Eßer 	"POSIX does not allow exponential notation",
276252884aeSStefan Eßer #else
277252884aeSStefan Eßer 	NULL,
278252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
279252884aeSStefan Eßer 	"POSIX does not allow array references as function parameters",
280252884aeSStefan Eßer 	"POSIX does not allow void functions",
281252884aeSStefan Eßer 	"POSIX requires the left brace be on the same line as the function header",
282*44d4804dSStefan Eßer 	"POSIX does not allow strings to be assigned to variables or arrays",
283252884aeSStefan Eßer #endif // BC_ENABLED
284252884aeSStefan Eßer 
285252884aeSStefan Eßer };
286252884aeSStefan Eßer 
287*44d4804dSStefan Eßer #endif // !BC_ENABLE_LIBRARY
288*44d4804dSStefan Eßer 
289*44d4804dSStefan Eßer /// The destructors corresponding to BcDtorType enum items.
290*44d4804dSStefan Eßer const BcVecFree bc_vec_dtors[] = {
291*44d4804dSStefan Eßer 	NULL,
292*44d4804dSStefan Eßer 	bc_vec_free,
293*44d4804dSStefan Eßer 	bc_num_free,
294*44d4804dSStefan Eßer #if !BC_ENABLE_LIBRARY
295*44d4804dSStefan Eßer #ifndef NDEBUG
296*44d4804dSStefan Eßer 	bc_func_free,
297*44d4804dSStefan Eßer #endif // NDEBUG
298*44d4804dSStefan Eßer 	bc_slab_free,
299*44d4804dSStefan Eßer 	bc_const_free,
300*44d4804dSStefan Eßer 	bc_result_free,
301252884aeSStefan Eßer #if BC_ENABLE_HISTORY
302*44d4804dSStefan Eßer 	bc_history_string_free,
303*44d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY
304*44d4804dSStefan Eßer #else // !BC_ENABLE_LIBRARY
305*44d4804dSStefan Eßer 	bcl_num_destruct,
306*44d4804dSStefan Eßer #endif // !BC_ENABLE_LIBRARY
307*44d4804dSStefan Eßer };
308*44d4804dSStefan Eßer 
309*44d4804dSStefan Eßer #if !BC_ENABLE_LIBRARY
310*44d4804dSStefan Eßer 
311*44d4804dSStefan Eßer #if BC_ENABLE_HISTORY
312*44d4804dSStefan Eßer 
313*44d4804dSStefan Eßer /// A flush type for not clearing current extras but not saving new ones either.
3147e5c51e5SStefan Eßer const BcFlushType bc_flush_none = BC_FLUSH_NO_EXTRAS_NO_CLEAR;
315*44d4804dSStefan Eßer 
316*44d4804dSStefan Eßer /// A flush type for clearing extras and not saving new ones.
3177e5c51e5SStefan Eßer const BcFlushType bc_flush_err = BC_FLUSH_NO_EXTRAS_CLEAR;
318*44d4804dSStefan Eßer 
319*44d4804dSStefan Eßer /// A flush type for clearing previous extras and saving new ones.
3207e5c51e5SStefan Eßer const BcFlushType bc_flush_save = BC_FLUSH_SAVE_EXTRAS_CLEAR;
3217e5c51e5SStefan Eßer #endif // BC_ENABLE_HISTORY
3227e5c51e5SStefan Eßer 
3237e5c51e5SStefan Eßer #if BC_ENABLE_HISTORY
324*44d4804dSStefan Eßer 
325*44d4804dSStefan Eßer /// A list of known bad terminals.
326252884aeSStefan Eßer const char *bc_history_bad_terms[] = { "dumb", "cons25", "emacs", NULL };
327252884aeSStefan Eßer 
328*44d4804dSStefan Eßer /// A constant for tabs and its length. My tab handling is dumb and always
329*44d4804dSStefan Eßer /// outputs the entire thing.
330252884aeSStefan Eßer const char bc_history_tab[] = "        ";
331252884aeSStefan Eßer const size_t bc_history_tab_len = sizeof(bc_history_tab) - 1;
332252884aeSStefan Eßer 
333*44d4804dSStefan Eßer /// A list of wide chars. These are listed in ascending order for efficiency.
334252884aeSStefan Eßer const uint32_t bc_history_wchars[][2] = {
335252884aeSStefan Eßer 	{ 0x1100, 0x115F },
336252884aeSStefan Eßer 	{ 0x231A, 0x231B },
337252884aeSStefan Eßer 	{ 0x2329, 0x232A },
338252884aeSStefan Eßer 	{ 0x23E9, 0x23EC },
339252884aeSStefan Eßer 	{ 0x23F0, 0x23F0 },
340252884aeSStefan Eßer 	{ 0x23F3, 0x23F3 },
341252884aeSStefan Eßer 	{ 0x25FD, 0x25FE },
342252884aeSStefan Eßer 	{ 0x2614, 0x2615 },
343252884aeSStefan Eßer 	{ 0x2648, 0x2653 },
344252884aeSStefan Eßer 	{ 0x267F, 0x267F },
345252884aeSStefan Eßer 	{ 0x2693, 0x2693 },
346252884aeSStefan Eßer 	{ 0x26A1, 0x26A1 },
347252884aeSStefan Eßer 	{ 0x26AA, 0x26AB },
348252884aeSStefan Eßer 	{ 0x26BD, 0x26BE },
349252884aeSStefan Eßer 	{ 0x26C4, 0x26C5 },
350252884aeSStefan Eßer 	{ 0x26CE, 0x26CE },
351252884aeSStefan Eßer 	{ 0x26D4, 0x26D4 },
352252884aeSStefan Eßer 	{ 0x26EA, 0x26EA },
353252884aeSStefan Eßer 	{ 0x26F2, 0x26F3 },
354252884aeSStefan Eßer 	{ 0x26F5, 0x26F5 },
355252884aeSStefan Eßer 	{ 0x26FA, 0x26FA },
356252884aeSStefan Eßer 	{ 0x26FD, 0x26FD },
357252884aeSStefan Eßer 	{ 0x2705, 0x2705 },
358252884aeSStefan Eßer 	{ 0x270A, 0x270B },
359252884aeSStefan Eßer 	{ 0x2728, 0x2728 },
360252884aeSStefan Eßer 	{ 0x274C, 0x274C },
361252884aeSStefan Eßer 	{ 0x274E, 0x274E },
362252884aeSStefan Eßer 	{ 0x2753, 0x2755 },
363252884aeSStefan Eßer 	{ 0x2757, 0x2757 },
364252884aeSStefan Eßer 	{ 0x2795, 0x2797 },
365252884aeSStefan Eßer 	{ 0x27B0, 0x27B0 },
366252884aeSStefan Eßer 	{ 0x27BF, 0x27BF },
367252884aeSStefan Eßer 	{ 0x2B1B, 0x2B1C },
368252884aeSStefan Eßer 	{ 0x2B50, 0x2B50 },
369252884aeSStefan Eßer 	{ 0x2B55, 0x2B55 },
370252884aeSStefan Eßer 	{ 0x2E80, 0x2E99 },
371252884aeSStefan Eßer 	{ 0x2E9B, 0x2EF3 },
372252884aeSStefan Eßer 	{ 0x2F00, 0x2FD5 },
373252884aeSStefan Eßer 	{ 0x2FF0, 0x2FFB },
374252884aeSStefan Eßer 	{ 0x3001, 0x303E },
375252884aeSStefan Eßer 	{ 0x3041, 0x3096 },
376252884aeSStefan Eßer 	{ 0x3099, 0x30FF },
377252884aeSStefan Eßer 	{ 0x3105, 0x312D },
378252884aeSStefan Eßer 	{ 0x3131, 0x318E },
379252884aeSStefan Eßer 	{ 0x3190, 0x31BA },
380252884aeSStefan Eßer 	{ 0x31C0, 0x31E3 },
381252884aeSStefan Eßer 	{ 0x31F0, 0x321E },
382252884aeSStefan Eßer 	{ 0x3220, 0x3247 },
383252884aeSStefan Eßer 	{ 0x3250, 0x32FE },
384252884aeSStefan Eßer 	{ 0x3300, 0x4DBF },
385252884aeSStefan Eßer 	{ 0x4E00, 0xA48C },
386252884aeSStefan Eßer 	{ 0xA490, 0xA4C6 },
387252884aeSStefan Eßer 	{ 0xA960, 0xA97C },
388252884aeSStefan Eßer 	{ 0xAC00, 0xD7A3 },
389252884aeSStefan Eßer 	{ 0xF900, 0xFAFF },
390252884aeSStefan Eßer 	{ 0xFE10, 0xFE19 },
391252884aeSStefan Eßer 	{ 0xFE30, 0xFE52 },
392252884aeSStefan Eßer 	{ 0xFE54, 0xFE66 },
393252884aeSStefan Eßer 	{ 0xFE68, 0xFE6B },
394252884aeSStefan Eßer 	{ 0x16FE0, 0x16FE0 },
395252884aeSStefan Eßer 	{ 0x17000, 0x187EC },
396252884aeSStefan Eßer 	{ 0x18800, 0x18AF2 },
397252884aeSStefan Eßer 	{ 0x1B000, 0x1B001 },
398252884aeSStefan Eßer 	{ 0x1F004, 0x1F004 },
399252884aeSStefan Eßer 	{ 0x1F0CF, 0x1F0CF },
400252884aeSStefan Eßer 	{ 0x1F18E, 0x1F18E },
401252884aeSStefan Eßer 	{ 0x1F191, 0x1F19A },
402252884aeSStefan Eßer 	{ 0x1F200, 0x1F202 },
403252884aeSStefan Eßer 	{ 0x1F210, 0x1F23B },
404252884aeSStefan Eßer 	{ 0x1F240, 0x1F248 },
405252884aeSStefan Eßer 	{ 0x1F250, 0x1F251 },
406252884aeSStefan Eßer 	{ 0x1F300, 0x1F320 },
407252884aeSStefan Eßer 	{ 0x1F32D, 0x1F335 },
408252884aeSStefan Eßer 	{ 0x1F337, 0x1F37C },
409252884aeSStefan Eßer 	{ 0x1F37E, 0x1F393 },
410252884aeSStefan Eßer 	{ 0x1F3A0, 0x1F3CA },
411252884aeSStefan Eßer 	{ 0x1F3CF, 0x1F3D3 },
412252884aeSStefan Eßer 	{ 0x1F3E0, 0x1F3F0 },
413252884aeSStefan Eßer 	{ 0x1F3F4, 0x1F3F4 },
414252884aeSStefan Eßer 	{ 0x1F3F8, 0x1F43E },
415252884aeSStefan Eßer 	{ 0x1F440, 0x1F440 },
416252884aeSStefan Eßer 	{ 0x1F442, 0x1F4FC },
417252884aeSStefan Eßer 	{ 0x1F4FF, 0x1F53D },
418252884aeSStefan Eßer 	{ 0x1F54B, 0x1F54E },
419252884aeSStefan Eßer 	{ 0x1F550, 0x1F567 },
420252884aeSStefan Eßer 	{ 0x1F57A, 0x1F57A },
421252884aeSStefan Eßer 	{ 0x1F595, 0x1F596 },
422252884aeSStefan Eßer 	{ 0x1F5A4, 0x1F5A4 },
423252884aeSStefan Eßer 	{ 0x1F5FB, 0x1F64F },
424252884aeSStefan Eßer 	{ 0x1F680, 0x1F6C5 },
425252884aeSStefan Eßer 	{ 0x1F6CC, 0x1F6CC },
426252884aeSStefan Eßer 	{ 0x1F6D0, 0x1F6D2 },
427252884aeSStefan Eßer 	{ 0x1F6EB, 0x1F6EC },
428252884aeSStefan Eßer 	{ 0x1F6F4, 0x1F6F6 },
429252884aeSStefan Eßer 	{ 0x1F910, 0x1F91E },
430252884aeSStefan Eßer 	{ 0x1F920, 0x1F927 },
431252884aeSStefan Eßer 	{ 0x1F930, 0x1F930 },
432252884aeSStefan Eßer 	{ 0x1F933, 0x1F93E },
433252884aeSStefan Eßer 	{ 0x1F940, 0x1F94B },
434252884aeSStefan Eßer 	{ 0x1F950, 0x1F95E },
435252884aeSStefan Eßer 	{ 0x1F980, 0x1F991 },
436252884aeSStefan Eßer 	{ 0x1F9C0, 0x1F9C0 },
437252884aeSStefan Eßer 	{ 0x20000, 0x2FFFD },
438252884aeSStefan Eßer 	{ 0x30000, 0x3FFFD },
439252884aeSStefan Eßer };
440252884aeSStefan Eßer 
441*44d4804dSStefan Eßer /// The length of the wide chars list.
442252884aeSStefan Eßer const size_t bc_history_wchars_len =
443252884aeSStefan Eßer 	sizeof(bc_history_wchars) / sizeof(bc_history_wchars[0]);
444252884aeSStefan Eßer 
445*44d4804dSStefan Eßer /// A list of combining characters in Unicode. These are listed in ascending
446*44d4804dSStefan Eßer /// order for efficiency.
447252884aeSStefan Eßer const uint32_t bc_history_combo_chars[] = {
448252884aeSStefan Eßer 	0x0300,0x0301,0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,
449252884aeSStefan Eßer 	0x0308,0x0309,0x030A,0x030B,0x030C,0x030D,0x030E,0x030F,
450252884aeSStefan Eßer 	0x0310,0x0311,0x0312,0x0313,0x0314,0x0315,0x0316,0x0317,
451252884aeSStefan Eßer 	0x0318,0x0319,0x031A,0x031B,0x031C,0x031D,0x031E,0x031F,
452252884aeSStefan Eßer 	0x0320,0x0321,0x0322,0x0323,0x0324,0x0325,0x0326,0x0327,
453252884aeSStefan Eßer 	0x0328,0x0329,0x032A,0x032B,0x032C,0x032D,0x032E,0x032F,
454252884aeSStefan Eßer 	0x0330,0x0331,0x0332,0x0333,0x0334,0x0335,0x0336,0x0337,
455252884aeSStefan Eßer 	0x0338,0x0339,0x033A,0x033B,0x033C,0x033D,0x033E,0x033F,
456252884aeSStefan Eßer 	0x0340,0x0341,0x0342,0x0343,0x0344,0x0345,0x0346,0x0347,
457252884aeSStefan Eßer 	0x0348,0x0349,0x034A,0x034B,0x034C,0x034D,0x034E,0x034F,
458252884aeSStefan Eßer 	0x0350,0x0351,0x0352,0x0353,0x0354,0x0355,0x0356,0x0357,
459252884aeSStefan Eßer 	0x0358,0x0359,0x035A,0x035B,0x035C,0x035D,0x035E,0x035F,
460252884aeSStefan Eßer 	0x0360,0x0361,0x0362,0x0363,0x0364,0x0365,0x0366,0x0367,
461252884aeSStefan Eßer 	0x0368,0x0369,0x036A,0x036B,0x036C,0x036D,0x036E,0x036F,
462252884aeSStefan Eßer 	0x0483,0x0484,0x0485,0x0486,0x0487,0x0591,0x0592,0x0593,
463252884aeSStefan Eßer 	0x0594,0x0595,0x0596,0x0597,0x0598,0x0599,0x059A,0x059B,
464252884aeSStefan Eßer 	0x059C,0x059D,0x059E,0x059F,0x05A0,0x05A1,0x05A2,0x05A3,
465252884aeSStefan Eßer 	0x05A4,0x05A5,0x05A6,0x05A7,0x05A8,0x05A9,0x05AA,0x05AB,
466252884aeSStefan Eßer 	0x05AC,0x05AD,0x05AE,0x05AF,0x05B0,0x05B1,0x05B2,0x05B3,
467252884aeSStefan Eßer 	0x05B4,0x05B5,0x05B6,0x05B7,0x05B8,0x05B9,0x05BA,0x05BB,
468252884aeSStefan Eßer 	0x05BC,0x05BD,0x05BF,0x05C1,0x05C2,0x05C4,0x05C5,0x05C7,
469252884aeSStefan Eßer 	0x0610,0x0611,0x0612,0x0613,0x0614,0x0615,0x0616,0x0617,
470252884aeSStefan Eßer 	0x0618,0x0619,0x061A,0x064B,0x064C,0x064D,0x064E,0x064F,
471252884aeSStefan Eßer 	0x0650,0x0651,0x0652,0x0653,0x0654,0x0655,0x0656,0x0657,
472252884aeSStefan Eßer 	0x0658,0x0659,0x065A,0x065B,0x065C,0x065D,0x065E,0x065F,
473252884aeSStefan Eßer 	0x0670,0x06D6,0x06D7,0x06D8,0x06D9,0x06DA,0x06DB,0x06DC,
474252884aeSStefan Eßer 	0x06DF,0x06E0,0x06E1,0x06E2,0x06E3,0x06E4,0x06E7,0x06E8,
475252884aeSStefan Eßer 	0x06EA,0x06EB,0x06EC,0x06ED,0x0711,0x0730,0x0731,0x0732,
476252884aeSStefan Eßer 	0x0733,0x0734,0x0735,0x0736,0x0737,0x0738,0x0739,0x073A,
477252884aeSStefan Eßer 	0x073B,0x073C,0x073D,0x073E,0x073F,0x0740,0x0741,0x0742,
478252884aeSStefan Eßer 	0x0743,0x0744,0x0745,0x0746,0x0747,0x0748,0x0749,0x074A,
479252884aeSStefan Eßer 	0x07A6,0x07A7,0x07A8,0x07A9,0x07AA,0x07AB,0x07AC,0x07AD,
480252884aeSStefan Eßer 	0x07AE,0x07AF,0x07B0,0x07EB,0x07EC,0x07ED,0x07EE,0x07EF,
481252884aeSStefan Eßer 	0x07F0,0x07F1,0x07F2,0x07F3,0x0816,0x0817,0x0818,0x0819,
482252884aeSStefan Eßer 	0x081B,0x081C,0x081D,0x081E,0x081F,0x0820,0x0821,0x0822,
483252884aeSStefan Eßer 	0x0823,0x0825,0x0826,0x0827,0x0829,0x082A,0x082B,0x082C,
484252884aeSStefan Eßer 	0x082D,0x0859,0x085A,0x085B,0x08D4,0x08D5,0x08D6,0x08D7,
485252884aeSStefan Eßer 	0x08D8,0x08D9,0x08DA,0x08DB,0x08DC,0x08DD,0x08DE,0x08DF,
486252884aeSStefan Eßer 	0x08E0,0x08E1,0x08E3,0x08E4,0x08E5,0x08E6,0x08E7,0x08E8,
487252884aeSStefan Eßer 	0x08E9,0x08EA,0x08EB,0x08EC,0x08ED,0x08EE,0x08EF,0x08F0,
488252884aeSStefan Eßer 	0x08F1,0x08F2,0x08F3,0x08F4,0x08F5,0x08F6,0x08F7,0x08F8,
489252884aeSStefan Eßer 	0x08F9,0x08FA,0x08FB,0x08FC,0x08FD,0x08FE,0x08FF,0x0900,
490252884aeSStefan Eßer 	0x0901,0x0902,0x093A,0x093C,0x0941,0x0942,0x0943,0x0944,
491252884aeSStefan Eßer 	0x0945,0x0946,0x0947,0x0948,0x094D,0x0951,0x0952,0x0953,
492252884aeSStefan Eßer 	0x0954,0x0955,0x0956,0x0957,0x0962,0x0963,0x0981,0x09BC,
493252884aeSStefan Eßer 	0x09C1,0x09C2,0x09C3,0x09C4,0x09CD,0x09E2,0x09E3,0x0A01,
494252884aeSStefan Eßer 	0x0A02,0x0A3C,0x0A41,0x0A42,0x0A47,0x0A48,0x0A4B,0x0A4C,
495252884aeSStefan Eßer 	0x0A4D,0x0A51,0x0A70,0x0A71,0x0A75,0x0A81,0x0A82,0x0ABC,
496252884aeSStefan Eßer 	0x0AC1,0x0AC2,0x0AC3,0x0AC4,0x0AC5,0x0AC7,0x0AC8,0x0ACD,
497252884aeSStefan Eßer 	0x0AE2,0x0AE3,0x0B01,0x0B3C,0x0B3F,0x0B41,0x0B42,0x0B43,
498252884aeSStefan Eßer 	0x0B44,0x0B4D,0x0B56,0x0B62,0x0B63,0x0B82,0x0BC0,0x0BCD,
499252884aeSStefan Eßer 	0x0C00,0x0C3E,0x0C3F,0x0C40,0x0C46,0x0C47,0x0C48,0x0C4A,
500252884aeSStefan Eßer 	0x0C4B,0x0C4C,0x0C4D,0x0C55,0x0C56,0x0C62,0x0C63,0x0C81,
501252884aeSStefan Eßer 	0x0CBC,0x0CBF,0x0CC6,0x0CCC,0x0CCD,0x0CE2,0x0CE3,0x0D01,
502252884aeSStefan Eßer 	0x0D41,0x0D42,0x0D43,0x0D44,0x0D4D,0x0D62,0x0D63,0x0DCA,
503252884aeSStefan Eßer 	0x0DD2,0x0DD3,0x0DD4,0x0DD6,0x0E31,0x0E34,0x0E35,0x0E36,
504252884aeSStefan Eßer 	0x0E37,0x0E38,0x0E39,0x0E3A,0x0E47,0x0E48,0x0E49,0x0E4A,
505252884aeSStefan Eßer 	0x0E4B,0x0E4C,0x0E4D,0x0E4E,0x0EB1,0x0EB4,0x0EB5,0x0EB6,
506252884aeSStefan Eßer 	0x0EB7,0x0EB8,0x0EB9,0x0EBB,0x0EBC,0x0EC8,0x0EC9,0x0ECA,
507252884aeSStefan Eßer 	0x0ECB,0x0ECC,0x0ECD,0x0F18,0x0F19,0x0F35,0x0F37,0x0F39,
508252884aeSStefan Eßer 	0x0F71,0x0F72,0x0F73,0x0F74,0x0F75,0x0F76,0x0F77,0x0F78,
509252884aeSStefan Eßer 	0x0F79,0x0F7A,0x0F7B,0x0F7C,0x0F7D,0x0F7E,0x0F80,0x0F81,
510252884aeSStefan Eßer 	0x0F82,0x0F83,0x0F84,0x0F86,0x0F87,0x0F8D,0x0F8E,0x0F8F,
511252884aeSStefan Eßer 	0x0F90,0x0F91,0x0F92,0x0F93,0x0F94,0x0F95,0x0F96,0x0F97,
512252884aeSStefan Eßer 	0x0F99,0x0F9A,0x0F9B,0x0F9C,0x0F9D,0x0F9E,0x0F9F,0x0FA0,
513252884aeSStefan Eßer 	0x0FA1,0x0FA2,0x0FA3,0x0FA4,0x0FA5,0x0FA6,0x0FA7,0x0FA8,
514252884aeSStefan Eßer 	0x0FA9,0x0FAA,0x0FAB,0x0FAC,0x0FAD,0x0FAE,0x0FAF,0x0FB0,
515252884aeSStefan Eßer 	0x0FB1,0x0FB2,0x0FB3,0x0FB4,0x0FB5,0x0FB6,0x0FB7,0x0FB8,
516252884aeSStefan Eßer 	0x0FB9,0x0FBA,0x0FBB,0x0FBC,0x0FC6,0x102D,0x102E,0x102F,
517252884aeSStefan Eßer 	0x1030,0x1032,0x1033,0x1034,0x1035,0x1036,0x1037,0x1039,
518252884aeSStefan Eßer 	0x103A,0x103D,0x103E,0x1058,0x1059,0x105E,0x105F,0x1060,
519252884aeSStefan Eßer 	0x1071,0x1072,0x1073,0x1074,0x1082,0x1085,0x1086,0x108D,
520252884aeSStefan Eßer 	0x109D,0x135D,0x135E,0x135F,0x1712,0x1713,0x1714,0x1732,
521252884aeSStefan Eßer 	0x1733,0x1734,0x1752,0x1753,0x1772,0x1773,0x17B4,0x17B5,
522252884aeSStefan Eßer 	0x17B7,0x17B8,0x17B9,0x17BA,0x17BB,0x17BC,0x17BD,0x17C6,
523252884aeSStefan Eßer 	0x17C9,0x17CA,0x17CB,0x17CC,0x17CD,0x17CE,0x17CF,0x17D0,
524252884aeSStefan Eßer 	0x17D1,0x17D2,0x17D3,0x17DD,0x180B,0x180C,0x180D,0x1885,
525252884aeSStefan Eßer 	0x1886,0x18A9,0x1920,0x1921,0x1922,0x1927,0x1928,0x1932,
526252884aeSStefan Eßer 	0x1939,0x193A,0x193B,0x1A17,0x1A18,0x1A1B,0x1A56,0x1A58,
527252884aeSStefan Eßer 	0x1A59,0x1A5A,0x1A5B,0x1A5C,0x1A5D,0x1A5E,0x1A60,0x1A62,
528252884aeSStefan Eßer 	0x1A65,0x1A66,0x1A67,0x1A68,0x1A69,0x1A6A,0x1A6B,0x1A6C,
529252884aeSStefan Eßer 	0x1A73,0x1A74,0x1A75,0x1A76,0x1A77,0x1A78,0x1A79,0x1A7A,
530252884aeSStefan Eßer 	0x1A7B,0x1A7C,0x1A7F,0x1AB0,0x1AB1,0x1AB2,0x1AB3,0x1AB4,
531252884aeSStefan Eßer 	0x1AB5,0x1AB6,0x1AB7,0x1AB8,0x1AB9,0x1ABA,0x1ABB,0x1ABC,
532252884aeSStefan Eßer 	0x1ABD,0x1B00,0x1B01,0x1B02,0x1B03,0x1B34,0x1B36,0x1B37,
533252884aeSStefan Eßer 	0x1B38,0x1B39,0x1B3A,0x1B3C,0x1B42,0x1B6B,0x1B6C,0x1B6D,
534252884aeSStefan Eßer 	0x1B6E,0x1B6F,0x1B70,0x1B71,0x1B72,0x1B73,0x1B80,0x1B81,
535252884aeSStefan Eßer 	0x1BA2,0x1BA3,0x1BA4,0x1BA5,0x1BA8,0x1BA9,0x1BAB,0x1BAC,
536252884aeSStefan Eßer 	0x1BAD,0x1BE6,0x1BE8,0x1BE9,0x1BED,0x1BEF,0x1BF0,0x1BF1,
537252884aeSStefan Eßer 	0x1C2C,0x1C2D,0x1C2E,0x1C2F,0x1C30,0x1C31,0x1C32,0x1C33,
538252884aeSStefan Eßer 	0x1C36,0x1C37,0x1CD0,0x1CD1,0x1CD2,0x1CD4,0x1CD5,0x1CD6,
539252884aeSStefan Eßer 	0x1CD7,0x1CD8,0x1CD9,0x1CDA,0x1CDB,0x1CDC,0x1CDD,0x1CDE,
540252884aeSStefan Eßer 	0x1CDF,0x1CE0,0x1CE2,0x1CE3,0x1CE4,0x1CE5,0x1CE6,0x1CE7,
541252884aeSStefan Eßer 	0x1CE8,0x1CED,0x1CF4,0x1CF8,0x1CF9,0x1DC0,0x1DC1,0x1DC2,
542252884aeSStefan Eßer 	0x1DC3,0x1DC4,0x1DC5,0x1DC6,0x1DC7,0x1DC8,0x1DC9,0x1DCA,
543252884aeSStefan Eßer 	0x1DCB,0x1DCC,0x1DCD,0x1DCE,0x1DCF,0x1DD0,0x1DD1,0x1DD2,
544252884aeSStefan Eßer 	0x1DD3,0x1DD4,0x1DD5,0x1DD6,0x1DD7,0x1DD8,0x1DD9,0x1DDA,
545252884aeSStefan Eßer 	0x1DDB,0x1DDC,0x1DDD,0x1DDE,0x1DDF,0x1DE0,0x1DE1,0x1DE2,
546252884aeSStefan Eßer 	0x1DE3,0x1DE4,0x1DE5,0x1DE6,0x1DE7,0x1DE8,0x1DE9,0x1DEA,
547252884aeSStefan Eßer 	0x1DEB,0x1DEC,0x1DED,0x1DEE,0x1DEF,0x1DF0,0x1DF1,0x1DF2,
548252884aeSStefan Eßer 	0x1DF3,0x1DF4,0x1DF5,0x1DFB,0x1DFC,0x1DFD,0x1DFE,0x1DFF,
549252884aeSStefan Eßer 	0x20D0,0x20D1,0x20D2,0x20D3,0x20D4,0x20D5,0x20D6,0x20D7,
550252884aeSStefan Eßer 	0x20D8,0x20D9,0x20DA,0x20DB,0x20DC,0x20E1,0x20E5,0x20E6,
551252884aeSStefan Eßer 	0x20E7,0x20E8,0x20E9,0x20EA,0x20EB,0x20EC,0x20ED,0x20EE,
552252884aeSStefan Eßer 	0x20EF,0x20F0,0x2CEF,0x2CF0,0x2CF1,0x2D7F,0x2DE0,0x2DE1,
553252884aeSStefan Eßer 	0x2DE2,0x2DE3,0x2DE4,0x2DE5,0x2DE6,0x2DE7,0x2DE8,0x2DE9,
554252884aeSStefan Eßer 	0x2DEA,0x2DEB,0x2DEC,0x2DED,0x2DEE,0x2DEF,0x2DF0,0x2DF1,
555252884aeSStefan Eßer 	0x2DF2,0x2DF3,0x2DF4,0x2DF5,0x2DF6,0x2DF7,0x2DF8,0x2DF9,
556252884aeSStefan Eßer 	0x2DFA,0x2DFB,0x2DFC,0x2DFD,0x2DFE,0x2DFF,0x302A,0x302B,
557252884aeSStefan Eßer 	0x302C,0x302D,0x3099,0x309A,0xA66F,0xA674,0xA675,0xA676,
558252884aeSStefan Eßer 	0xA677,0xA678,0xA679,0xA67A,0xA67B,0xA67C,0xA67D,0xA69E,
559252884aeSStefan Eßer 	0xA69F,0xA6F0,0xA6F1,0xA802,0xA806,0xA80B,0xA825,0xA826,
560252884aeSStefan Eßer 	0xA8C4,0xA8C5,0xA8E0,0xA8E1,0xA8E2,0xA8E3,0xA8E4,0xA8E5,
561252884aeSStefan Eßer 	0xA8E6,0xA8E7,0xA8E8,0xA8E9,0xA8EA,0xA8EB,0xA8EC,0xA8ED,
562252884aeSStefan Eßer 	0xA8EE,0xA8EF,0xA8F0,0xA8F1,0xA926,0xA927,0xA928,0xA929,
563252884aeSStefan Eßer 	0xA92A,0xA92B,0xA92C,0xA92D,0xA947,0xA948,0xA949,0xA94A,
564252884aeSStefan Eßer 	0xA94B,0xA94C,0xA94D,0xA94E,0xA94F,0xA950,0xA951,0xA980,
565252884aeSStefan Eßer 	0xA981,0xA982,0xA9B3,0xA9B6,0xA9B7,0xA9B8,0xA9B9,0xA9BC,
566252884aeSStefan Eßer 	0xA9E5,0xAA29,0xAA2A,0xAA2B,0xAA2C,0xAA2D,0xAA2E,0xAA31,
567252884aeSStefan Eßer 	0xAA32,0xAA35,0xAA36,0xAA43,0xAA4C,0xAA7C,0xAAB0,0xAAB2,
568252884aeSStefan Eßer 	0xAAB3,0xAAB4,0xAAB7,0xAAB8,0xAABE,0xAABF,0xAAC1,0xAAEC,
569252884aeSStefan Eßer 	0xAAED,0xAAF6,0xABE5,0xABE8,0xABED,0xFB1E,0xFE00,0xFE01,
570252884aeSStefan Eßer 	0xFE02,0xFE03,0xFE04,0xFE05,0xFE06,0xFE07,0xFE08,0xFE09,
571252884aeSStefan Eßer 	0xFE0A,0xFE0B,0xFE0C,0xFE0D,0xFE0E,0xFE0F,0xFE20,0xFE21,
572252884aeSStefan Eßer 	0xFE22,0xFE23,0xFE24,0xFE25,0xFE26,0xFE27,0xFE28,0xFE29,
573252884aeSStefan Eßer 	0xFE2A,0xFE2B,0xFE2C,0xFE2D,0xFE2E,0xFE2F,
574252884aeSStefan Eßer 	0x101FD,0x102E0,0x10376,0x10377,0x10378,0x10379,0x1037A,0x10A01,
575252884aeSStefan Eßer 	0x10A02,0x10A03,0x10A05,0x10A06,0x10A0C,0x10A0D,0x10A0E,0x10A0F,
576252884aeSStefan Eßer 	0x10A38,0x10A39,0x10A3A,0x10A3F,0x10AE5,0x10AE6,0x11001,0x11038,
577252884aeSStefan Eßer 	0x11039,0x1103A,0x1103B,0x1103C,0x1103D,0x1103E,0x1103F,0x11040,
578252884aeSStefan Eßer 	0x11041,0x11042,0x11043,0x11044,0x11045,0x11046,0x1107F,0x11080,
579252884aeSStefan Eßer 	0x11081,0x110B3,0x110B4,0x110B5,0x110B6,0x110B9,0x110BA,0x11100,
580252884aeSStefan Eßer 	0x11101,0x11102,0x11127,0x11128,0x11129,0x1112A,0x1112B,0x1112D,
581252884aeSStefan Eßer 	0x1112E,0x1112F,0x11130,0x11131,0x11132,0x11133,0x11134,0x11173,
582252884aeSStefan Eßer 	0x11180,0x11181,0x111B6,0x111B7,0x111B8,0x111B9,0x111BA,0x111BB,
583252884aeSStefan Eßer 	0x111BC,0x111BD,0x111BE,0x111CA,0x111CB,0x111CC,0x1122F,0x11230,
584252884aeSStefan Eßer 	0x11231,0x11234,0x11236,0x11237,0x1123E,0x112DF,0x112E3,0x112E4,
585252884aeSStefan Eßer 	0x112E5,0x112E6,0x112E7,0x112E8,0x112E9,0x112EA,0x11300,0x11301,
586252884aeSStefan Eßer 	0x1133C,0x11340,0x11366,0x11367,0x11368,0x11369,0x1136A,0x1136B,
587252884aeSStefan Eßer 	0x1136C,0x11370,0x11371,0x11372,0x11373,0x11374,0x11438,0x11439,
588252884aeSStefan Eßer 	0x1143A,0x1143B,0x1143C,0x1143D,0x1143E,0x1143F,0x11442,0x11443,
589252884aeSStefan Eßer 	0x11444,0x11446,0x114B3,0x114B4,0x114B5,0x114B6,0x114B7,0x114B8,
590252884aeSStefan Eßer 	0x114BA,0x114BF,0x114C0,0x114C2,0x114C3,0x115B2,0x115B3,0x115B4,
591252884aeSStefan Eßer 	0x115B5,0x115BC,0x115BD,0x115BF,0x115C0,0x115DC,0x115DD,0x11633,
592252884aeSStefan Eßer 	0x11634,0x11635,0x11636,0x11637,0x11638,0x11639,0x1163A,0x1163D,
593252884aeSStefan Eßer 	0x1163F,0x11640,0x116AB,0x116AD,0x116B0,0x116B1,0x116B2,0x116B3,
594252884aeSStefan Eßer 	0x116B4,0x116B5,0x116B7,0x1171D,0x1171E,0x1171F,0x11722,0x11723,
595252884aeSStefan Eßer 	0x11724,0x11725,0x11727,0x11728,0x11729,0x1172A,0x1172B,0x11C30,
596252884aeSStefan Eßer 	0x11C31,0x11C32,0x11C33,0x11C34,0x11C35,0x11C36,0x11C38,0x11C39,
597252884aeSStefan Eßer 	0x11C3A,0x11C3B,0x11C3C,0x11C3D,0x11C3F,0x11C92,0x11C93,0x11C94,
598252884aeSStefan Eßer 	0x11C95,0x11C96,0x11C97,0x11C98,0x11C99,0x11C9A,0x11C9B,0x11C9C,
599252884aeSStefan Eßer 	0x11C9D,0x11C9E,0x11C9F,0x11CA0,0x11CA1,0x11CA2,0x11CA3,0x11CA4,
600252884aeSStefan Eßer 	0x11CA5,0x11CA6,0x11CA7,0x11CAA,0x11CAB,0x11CAC,0x11CAD,0x11CAE,
601252884aeSStefan Eßer 	0x11CAF,0x11CB0,0x11CB2,0x11CB3,0x11CB5,0x11CB6,0x16AF0,0x16AF1,
602252884aeSStefan Eßer 	0x16AF2,0x16AF3,0x16AF4,0x16B30,0x16B31,0x16B32,0x16B33,0x16B34,
603252884aeSStefan Eßer 	0x16B35,0x16B36,0x16F8F,0x16F90,0x16F91,0x16F92,0x1BC9D,0x1BC9E,
604252884aeSStefan Eßer 	0x1D167,0x1D168,0x1D169,0x1D17B,0x1D17C,0x1D17D,0x1D17E,0x1D17F,
605252884aeSStefan Eßer 	0x1D180,0x1D181,0x1D182,0x1D185,0x1D186,0x1D187,0x1D188,0x1D189,
606252884aeSStefan Eßer 	0x1D18A,0x1D18B,0x1D1AA,0x1D1AB,0x1D1AC,0x1D1AD,0x1D242,0x1D243,
607252884aeSStefan Eßer 	0x1D244,0x1DA00,0x1DA01,0x1DA02,0x1DA03,0x1DA04,0x1DA05,0x1DA06,
608252884aeSStefan Eßer 	0x1DA07,0x1DA08,0x1DA09,0x1DA0A,0x1DA0B,0x1DA0C,0x1DA0D,0x1DA0E,
609252884aeSStefan Eßer 	0x1DA0F,0x1DA10,0x1DA11,0x1DA12,0x1DA13,0x1DA14,0x1DA15,0x1DA16,
610252884aeSStefan Eßer 	0x1DA17,0x1DA18,0x1DA19,0x1DA1A,0x1DA1B,0x1DA1C,0x1DA1D,0x1DA1E,
611252884aeSStefan Eßer 	0x1DA1F,0x1DA20,0x1DA21,0x1DA22,0x1DA23,0x1DA24,0x1DA25,0x1DA26,
612252884aeSStefan Eßer 	0x1DA27,0x1DA28,0x1DA29,0x1DA2A,0x1DA2B,0x1DA2C,0x1DA2D,0x1DA2E,
613252884aeSStefan Eßer 	0x1DA2F,0x1DA30,0x1DA31,0x1DA32,0x1DA33,0x1DA34,0x1DA35,0x1DA36,
614252884aeSStefan Eßer 	0x1DA3B,0x1DA3C,0x1DA3D,0x1DA3E,0x1DA3F,0x1DA40,0x1DA41,0x1DA42,
615252884aeSStefan Eßer 	0x1DA43,0x1DA44,0x1DA45,0x1DA46,0x1DA47,0x1DA48,0x1DA49,0x1DA4A,
616252884aeSStefan Eßer 	0x1DA4B,0x1DA4C,0x1DA4D,0x1DA4E,0x1DA4F,0x1DA50,0x1DA51,0x1DA52,
617252884aeSStefan Eßer 	0x1DA53,0x1DA54,0x1DA55,0x1DA56,0x1DA57,0x1DA58,0x1DA59,0x1DA5A,
618252884aeSStefan Eßer 	0x1DA5B,0x1DA5C,0x1DA5D,0x1DA5E,0x1DA5F,0x1DA60,0x1DA61,0x1DA62,
619252884aeSStefan Eßer 	0x1DA63,0x1DA64,0x1DA65,0x1DA66,0x1DA67,0x1DA68,0x1DA69,0x1DA6A,
620252884aeSStefan Eßer 	0x1DA6B,0x1DA6C,0x1DA75,0x1DA84,0x1DA9B,0x1DA9C,0x1DA9D,0x1DA9E,
621252884aeSStefan Eßer 	0x1DA9F,0x1DAA1,0x1DAA2,0x1DAA3,0x1DAA4,0x1DAA5,0x1DAA6,0x1DAA7,
622252884aeSStefan Eßer 	0x1DAA8,0x1DAA9,0x1DAAA,0x1DAAB,0x1DAAC,0x1DAAD,0x1DAAE,0x1DAAF,
623252884aeSStefan Eßer 	0x1E000,0x1E001,0x1E002,0x1E003,0x1E004,0x1E005,0x1E006,0x1E008,
624252884aeSStefan Eßer 	0x1E009,0x1E00A,0x1E00B,0x1E00C,0x1E00D,0x1E00E,0x1E00F,0x1E010,
625252884aeSStefan Eßer 	0x1E011,0x1E012,0x1E013,0x1E014,0x1E015,0x1E016,0x1E017,0x1E018,
626252884aeSStefan Eßer 	0x1E01B,0x1E01C,0x1E01D,0x1E01E,0x1E01F,0x1E020,0x1E021,0x1E023,
627252884aeSStefan Eßer 	0x1E024,0x1E026,0x1E027,0x1E028,0x1E029,0x1E02A,0x1E8D0,0x1E8D1,
628252884aeSStefan Eßer 	0x1E8D2,0x1E8D3,0x1E8D4,0x1E8D5,0x1E8D6,0x1E944,0x1E945,0x1E946,
629252884aeSStefan Eßer 	0x1E947,0x1E948,0x1E949,0x1E94A,0xE0100,0xE0101,0xE0102,0xE0103,
630252884aeSStefan Eßer 	0xE0104,0xE0105,0xE0106,0xE0107,0xE0108,0xE0109,0xE010A,0xE010B,
631252884aeSStefan Eßer 	0xE010C,0xE010D,0xE010E,0xE010F,0xE0110,0xE0111,0xE0112,0xE0113,
632252884aeSStefan Eßer 	0xE0114,0xE0115,0xE0116,0xE0117,0xE0118,0xE0119,0xE011A,0xE011B,
633252884aeSStefan Eßer 	0xE011C,0xE011D,0xE011E,0xE011F,0xE0120,0xE0121,0xE0122,0xE0123,
634252884aeSStefan Eßer 	0xE0124,0xE0125,0xE0126,0xE0127,0xE0128,0xE0129,0xE012A,0xE012B,
635252884aeSStefan Eßer 	0xE012C,0xE012D,0xE012E,0xE012F,0xE0130,0xE0131,0xE0132,0xE0133,
636252884aeSStefan Eßer 	0xE0134,0xE0135,0xE0136,0xE0137,0xE0138,0xE0139,0xE013A,0xE013B,
637252884aeSStefan Eßer 	0xE013C,0xE013D,0xE013E,0xE013F,0xE0140,0xE0141,0xE0142,0xE0143,
638252884aeSStefan Eßer 	0xE0144,0xE0145,0xE0146,0xE0147,0xE0148,0xE0149,0xE014A,0xE014B,
639252884aeSStefan Eßer 	0xE014C,0xE014D,0xE014E,0xE014F,0xE0150,0xE0151,0xE0152,0xE0153,
640252884aeSStefan Eßer 	0xE0154,0xE0155,0xE0156,0xE0157,0xE0158,0xE0159,0xE015A,0xE015B,
641252884aeSStefan Eßer 	0xE015C,0xE015D,0xE015E,0xE015F,0xE0160,0xE0161,0xE0162,0xE0163,
642252884aeSStefan Eßer 	0xE0164,0xE0165,0xE0166,0xE0167,0xE0168,0xE0169,0xE016A,0xE016B,
643252884aeSStefan Eßer 	0xE016C,0xE016D,0xE016E,0xE016F,0xE0170,0xE0171,0xE0172,0xE0173,
644252884aeSStefan Eßer 	0xE0174,0xE0175,0xE0176,0xE0177,0xE0178,0xE0179,0xE017A,0xE017B,
645252884aeSStefan Eßer 	0xE017C,0xE017D,0xE017E,0xE017F,0xE0180,0xE0181,0xE0182,0xE0183,
646252884aeSStefan Eßer 	0xE0184,0xE0185,0xE0186,0xE0187,0xE0188,0xE0189,0xE018A,0xE018B,
647252884aeSStefan Eßer 	0xE018C,0xE018D,0xE018E,0xE018F,0xE0190,0xE0191,0xE0192,0xE0193,
648252884aeSStefan Eßer 	0xE0194,0xE0195,0xE0196,0xE0197,0xE0198,0xE0199,0xE019A,0xE019B,
649252884aeSStefan Eßer 	0xE019C,0xE019D,0xE019E,0xE019F,0xE01A0,0xE01A1,0xE01A2,0xE01A3,
650252884aeSStefan Eßer 	0xE01A4,0xE01A5,0xE01A6,0xE01A7,0xE01A8,0xE01A9,0xE01AA,0xE01AB,
651252884aeSStefan Eßer 	0xE01AC,0xE01AD,0xE01AE,0xE01AF,0xE01B0,0xE01B1,0xE01B2,0xE01B3,
652252884aeSStefan Eßer 	0xE01B4,0xE01B5,0xE01B6,0xE01B7,0xE01B8,0xE01B9,0xE01BA,0xE01BB,
653252884aeSStefan Eßer 	0xE01BC,0xE01BD,0xE01BE,0xE01BF,0xE01C0,0xE01C1,0xE01C2,0xE01C3,
654252884aeSStefan Eßer 	0xE01C4,0xE01C5,0xE01C6,0xE01C7,0xE01C8,0xE01C9,0xE01CA,0xE01CB,
655252884aeSStefan Eßer 	0xE01CC,0xE01CD,0xE01CE,0xE01CF,0xE01D0,0xE01D1,0xE01D2,0xE01D3,
656252884aeSStefan Eßer 	0xE01D4,0xE01D5,0xE01D6,0xE01D7,0xE01D8,0xE01D9,0xE01DA,0xE01DB,
657252884aeSStefan Eßer 	0xE01DC,0xE01DD,0xE01DE,0xE01DF,0xE01E0,0xE01E1,0xE01E2,0xE01E3,
658252884aeSStefan Eßer 	0xE01E4,0xE01E5,0xE01E6,0xE01E7,0xE01E8,0xE01E9,0xE01EA,0xE01EB,
659252884aeSStefan Eßer 	0xE01EC,0xE01ED,0xE01EE,0xE01EF,
660252884aeSStefan Eßer };
661252884aeSStefan Eßer 
662*44d4804dSStefan Eßer /// The length of the combining characters list.
663252884aeSStefan Eßer const size_t bc_history_combo_chars_len =
664252884aeSStefan Eßer 	sizeof(bc_history_combo_chars) / sizeof(bc_history_combo_chars[0]);
665252884aeSStefan Eßer #endif // BC_ENABLE_HISTORY
666252884aeSStefan Eßer 
667*44d4804dSStefan Eßer /// The human-readable name of the main function in bc source code.
668252884aeSStefan Eßer const char bc_func_main[] = "(main)";
669*44d4804dSStefan Eßer 
670*44d4804dSStefan Eßer /// The human-readable name of the read function in bc source code.
671252884aeSStefan Eßer const char bc_func_read[] = "(read)";
672252884aeSStefan Eßer 
673252884aeSStefan Eßer #if BC_DEBUG_CODE
674*44d4804dSStefan Eßer 
675*44d4804dSStefan Eßer /// A list of names of instructions for easy debugging output.
676252884aeSStefan Eßer const char* bc_inst_names[] = {
677252884aeSStefan Eßer 
678252884aeSStefan Eßer #if BC_ENABLED
679252884aeSStefan Eßer 	"BC_INST_INC",
680252884aeSStefan Eßer 	"BC_INST_DEC",
681252884aeSStefan Eßer #endif // BC_ENABLED
682252884aeSStefan Eßer 
683252884aeSStefan Eßer 	"BC_INST_NEG",
684252884aeSStefan Eßer 	"BC_INST_BOOL_NOT",
685252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
686252884aeSStefan Eßer 	"BC_INST_TRUNC",
687252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
688252884aeSStefan Eßer 
689252884aeSStefan Eßer 	"BC_INST_POWER",
690252884aeSStefan Eßer 	"BC_INST_MULTIPLY",
691252884aeSStefan Eßer 	"BC_INST_DIVIDE",
692252884aeSStefan Eßer 	"BC_INST_MODULUS",
693252884aeSStefan Eßer 	"BC_INST_PLUS",
694252884aeSStefan Eßer 	"BC_INST_MINUS",
695252884aeSStefan Eßer 
696252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
697252884aeSStefan Eßer 	"BC_INST_PLACES",
698252884aeSStefan Eßer 
699252884aeSStefan Eßer 	"BC_INST_LSHIFT",
700252884aeSStefan Eßer 	"BC_INST_RSHIFT",
701252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
702252884aeSStefan Eßer 
703252884aeSStefan Eßer 	"BC_INST_REL_EQ",
704252884aeSStefan Eßer 	"BC_INST_REL_LE",
705252884aeSStefan Eßer 	"BC_INST_REL_GE",
706252884aeSStefan Eßer 	"BC_INST_REL_NE",
707252884aeSStefan Eßer 	"BC_INST_REL_LT",
708252884aeSStefan Eßer 	"BC_INST_REL_GT",
709252884aeSStefan Eßer 
710252884aeSStefan Eßer 	"BC_INST_BOOL_OR",
711252884aeSStefan Eßer 	"BC_INST_BOOL_AND",
712252884aeSStefan Eßer 
713252884aeSStefan Eßer #if BC_ENABLED
714252884aeSStefan Eßer 	"BC_INST_ASSIGN_POWER",
715252884aeSStefan Eßer 	"BC_INST_ASSIGN_MULTIPLY",
716252884aeSStefan Eßer 	"BC_INST_ASSIGN_DIVIDE",
717252884aeSStefan Eßer 	"BC_INST_ASSIGN_MODULUS",
718252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLUS",
719252884aeSStefan Eßer 	"BC_INST_ASSIGN_MINUS",
720252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
721252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLACES",
722252884aeSStefan Eßer 	"BC_INST_ASSIGN_LSHIFT",
723252884aeSStefan Eßer 	"BC_INST_ASSIGN_RSHIFT",
724252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
725252884aeSStefan Eßer 	"BC_INST_ASSIGN",
726252884aeSStefan Eßer 
727252884aeSStefan Eßer 	"BC_INST_ASSIGN_POWER_NO_VAL",
728252884aeSStefan Eßer 	"BC_INST_ASSIGN_MULTIPLY_NO_VAL",
729252884aeSStefan Eßer 	"BC_INST_ASSIGN_DIVIDE_NO_VAL",
730252884aeSStefan Eßer 	"BC_INST_ASSIGN_MODULUS_NO_VAL",
731252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLUS_NO_VAL",
732252884aeSStefan Eßer 	"BC_INST_ASSIGN_MINUS_NO_VAL",
733252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
734252884aeSStefan Eßer 	"BC_INST_ASSIGN_PLACES_NO_VAL",
735252884aeSStefan Eßer 	"BC_INST_ASSIGN_LSHIFT_NO_VAL",
736252884aeSStefan Eßer 	"BC_INST_ASSIGN_RSHIFT_NO_VAL",
737252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
738252884aeSStefan Eßer #endif // BC_ENABLED
739252884aeSStefan Eßer 	"BC_INST_ASSIGN_NO_VAL",
740252884aeSStefan Eßer 
741252884aeSStefan Eßer 	"BC_INST_NUM",
742252884aeSStefan Eßer 	"BC_INST_VAR",
743252884aeSStefan Eßer 	"BC_INST_ARRAY_ELEM",
744252884aeSStefan Eßer 	"BC_INST_ARRAY",
745252884aeSStefan Eßer 
7463aa99676SStefan Eßer 	"BC_INST_ZERO",
747252884aeSStefan Eßer 	"BC_INST_ONE",
748252884aeSStefan Eßer 
749252884aeSStefan Eßer #if BC_ENABLED
750252884aeSStefan Eßer 	"BC_INST_LAST",
751252884aeSStefan Eßer #endif // BC_ENABLED
752252884aeSStefan Eßer 	"BC_INST_IBASE",
753252884aeSStefan Eßer 	"BC_INST_OBASE",
754252884aeSStefan Eßer 	"BC_INST_SCALE",
755252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
756252884aeSStefan Eßer 	"BC_INST_SEED",
757252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
758252884aeSStefan Eßer 	"BC_INST_LENGTH",
759252884aeSStefan Eßer 	"BC_INST_SCALE_FUNC",
760252884aeSStefan Eßer 	"BC_INST_SQRT",
761252884aeSStefan Eßer 	"BC_INST_ABS",
762252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
763252884aeSStefan Eßer 	"BC_INST_IRAND",
764252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
765*44d4804dSStefan Eßer 	"BC_INST_ASCIIFY",
766252884aeSStefan Eßer 	"BC_INST_READ",
767252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
768252884aeSStefan Eßer 	"BC_INST_RAND",
769252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
770252884aeSStefan Eßer 	"BC_INST_MAXIBASE",
771252884aeSStefan Eßer 	"BC_INST_MAXOBASE",
772252884aeSStefan Eßer 	"BC_INST_MAXSCALE",
773252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
774252884aeSStefan Eßer 	"BC_INST_MAXRAND",
775252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
776252884aeSStefan Eßer 
777252884aeSStefan Eßer 	"BC_INST_PRINT",
778252884aeSStefan Eßer 	"BC_INST_PRINT_POP",
779252884aeSStefan Eßer 	"BC_INST_STR",
780*44d4804dSStefan Eßer #if BC_ENABLED
781252884aeSStefan Eßer 	"BC_INST_PRINT_STR",
782252884aeSStefan Eßer 
783252884aeSStefan Eßer 	"BC_INST_JUMP",
784252884aeSStefan Eßer 	"BC_INST_JUMP_ZERO",
785252884aeSStefan Eßer 
786252884aeSStefan Eßer 	"BC_INST_CALL",
787252884aeSStefan Eßer 
788252884aeSStefan Eßer 	"BC_INST_RET",
789252884aeSStefan Eßer 	"BC_INST_RET0",
790252884aeSStefan Eßer 	"BC_INST_RET_VOID",
791252884aeSStefan Eßer 
792252884aeSStefan Eßer 	"BC_INST_HALT",
793252884aeSStefan Eßer #endif // BC_ENABLED
794252884aeSStefan Eßer 
795252884aeSStefan Eßer 	"BC_INST_POP",
796*44d4804dSStefan Eßer 	"BC_INST_SWAP",
797252884aeSStefan Eßer 	"BC_INST_MODEXP",
798252884aeSStefan Eßer 	"BC_INST_DIVMOD",
799*44d4804dSStefan Eßer 	"BC_INST_PRINT_STREAM",
800*44d4804dSStefan Eßer 
801*44d4804dSStefan Eßer #if DC_ENABLED
802*44d4804dSStefan Eßer 	"BC_INST_POP_EXEC",
803252884aeSStefan Eßer 
804252884aeSStefan Eßer 	"BC_INST_EXECUTE",
805252884aeSStefan Eßer 	"BC_INST_EXEC_COND",
806252884aeSStefan Eßer 
807252884aeSStefan Eßer 	"BC_INST_PRINT_STACK",
808252884aeSStefan Eßer 	"BC_INST_CLEAR_STACK",
809*44d4804dSStefan Eßer 	"BC_INST_REG_STACK_LEN",
810252884aeSStefan Eßer 	"BC_INST_STACK_LEN",
811252884aeSStefan Eßer 	"BC_INST_DUPLICATE",
812252884aeSStefan Eßer 
813252884aeSStefan Eßer 	"BC_INST_LOAD",
814252884aeSStefan Eßer 	"BC_INST_PUSH_VAR",
815252884aeSStefan Eßer 	"BC_INST_PUSH_TO_VAR",
816252884aeSStefan Eßer 
817252884aeSStefan Eßer 	"BC_INST_QUIT",
818252884aeSStefan Eßer 	"BC_INST_NQUIT",
819*44d4804dSStefan Eßer 
820*44d4804dSStefan Eßer 	"BC_INST_EXEC_STACK_LEN",
821252884aeSStefan Eßer #endif // DC_ENABLED
822*44d4804dSStefan Eßer 
823*44d4804dSStefan Eßer 	"BC_INST_INVALID",
824252884aeSStefan Eßer };
825*44d4804dSStefan Eßer 
826252884aeSStefan Eßer #endif // BC_DEBUG_CODE
827252884aeSStefan Eßer 
828*44d4804dSStefan Eßer /// A constant string for 0.
82950696a6eSStefan Eßer const char bc_parse_zero[2] = "0";
830*44d4804dSStefan Eßer 
831*44d4804dSStefan Eßer /// A constant string for 1.
83250696a6eSStefan Eßer const char bc_parse_one[2] = "1";
833252884aeSStefan Eßer 
834252884aeSStefan Eßer #if BC_ENABLED
835*44d4804dSStefan Eßer 
836*44d4804dSStefan Eßer /// A list of keywords for bc. This needs to be updated if keywords change.
837252884aeSStefan Eßer const BcLexKeyword bc_lex_kws[] = {
838252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("auto", 4, true),
839252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("break", 5, true),
840252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("continue", 8, false),
841252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("define", 6, true),
842252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("for", 3, true),
843252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("if", 2, true),
844252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("limits", 6, false),
845252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("return", 6, true),
846252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("while", 5, true),
847252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("halt", 4, false),
848252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("last", 4, false),
849252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("ibase", 5, true),
850252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("obase", 5, true),
851252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("scale", 5, true),
852*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
853252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("seed", 4, false),
854*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
855252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("length", 6, true),
856252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("print", 5, false),
857252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("sqrt", 4, true),
858252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("abs", 3, false),
859*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
860252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("irand", 5, false),
861*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
862*44d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("asciify", 7, false),
863*44d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("modexp", 6, false),
864*44d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("divmod", 6, false),
865252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("quit", 4, true),
866252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("read", 4, false),
867*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
868252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("rand", 4, false),
869*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
870252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxibase", 8, false),
871252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxobase", 8, false),
872252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxscale", 8, false),
873*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
874252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("maxrand", 7, false),
875*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
876*44d4804dSStefan Eßer 	BC_LEX_KW_ENTRY("stream", 6, false),
877252884aeSStefan Eßer 	BC_LEX_KW_ENTRY("else", 4, false),
878252884aeSStefan Eßer };
879252884aeSStefan Eßer 
880*44d4804dSStefan Eßer /// The length of the list of bc keywords.
881252884aeSStefan Eßer const size_t bc_lex_kws_len = sizeof(bc_lex_kws) / sizeof(BcLexKeyword);
882252884aeSStefan Eßer 
883*44d4804dSStefan Eßer #if BC_C11
884*44d4804dSStefan Eßer 
885*44d4804dSStefan Eßer // This is here to ensure that BC_LEX_NKWS, which is needed for the
886*44d4804dSStefan Eßer // redefined_kws in BcVm, is correct. If it's correct under C11, it will be
887*44d4804dSStefan Eßer // correct under C99, and I did not know any other way of ensuring they remained
888*44d4804dSStefan Eßer // synchronized.
889*44d4804dSStefan Eßer static_assert(sizeof(bc_lex_kws) / sizeof(BcLexKeyword) == BC_LEX_NKWS,
890*44d4804dSStefan Eßer               "BC_LEX_NKWS is wrong.");
891*44d4804dSStefan Eßer 
892*44d4804dSStefan Eßer #endif // BC_C11
893*44d4804dSStefan Eßer 
894*44d4804dSStefan Eßer /// An array of booleans that correspond to token types. An entry is true if the
895*44d4804dSStefan Eßer /// token is valid in an expression, false otherwise. This will need to change
896*44d4804dSStefan Eßer /// if tokens change.
897252884aeSStefan Eßer const uint8_t bc_parse_exprs[] = {
898*44d4804dSStefan Eßer 
899*44d4804dSStefan Eßer 	// Starts with BC_LEX_EOF.
900252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),
901*44d4804dSStefan Eßer 
902*44d4804dSStefan Eßer 	// Starts with BC_LEX_OP_MULTIPLY if extra math is enabled, BC_LEX_OP_DIVIDE
903*44d4804dSStefan Eßer 	// otherwise.
904252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
905*44d4804dSStefan Eßer 
906*44d4804dSStefan Eßer 	// Starts with BC_LEX_OP_REL_EQ if extra math is enabled, BC_LEX_OP_REL_LT
907*44d4804dSStefan Eßer 	// otherwise.
908252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
909*44d4804dSStefan Eßer 
910*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
911*44d4804dSStefan Eßer 
912*44d4804dSStefan Eßer 	// Starts with BC_LEX_OP_ASSIGN_POWER.
913252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
914*44d4804dSStefan Eßer 
915*44d4804dSStefan Eßer 	// Starts with BC_LEX_OP_ASSIGN_RSHIFT.
916252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, false, false, true, true, false, false),
917*44d4804dSStefan Eßer 
918*44d4804dSStefan Eßer 	// Starts with BC_LEX_RBRACKET.
919*44d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, true, true, true, false),
920*44d4804dSStefan Eßer 
921*44d4804dSStefan Eßer 	// Starts with BC_LEX_KW_BREAK.
922252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false),
923*44d4804dSStefan Eßer 
924*44d4804dSStefan Eßer 	// Starts with BC_LEX_KW_HALT.
925252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, true, true, true, true, true, true, false),
926*44d4804dSStefan Eßer 
927*44d4804dSStefan Eßer 	// Starts with BC_LEX_KW_SQRT.
928*44d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, false, true),
929*44d4804dSStefan Eßer 
930*44d4804dSStefan Eßer 	// Starts with BC_LEX_KW_MAXIBASE.
931*44d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, false, false, 0)
932*44d4804dSStefan Eßer 
933*44d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
934*44d4804dSStefan Eßer 
935*44d4804dSStefan Eßer 	// Starts with BC_LEX_OP_ASSIGN_PLUS.
936252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, false, false, true, true, false),
937*44d4804dSStefan Eßer 
938*44d4804dSStefan Eßer 	// Starts with BC_LEX_COMMA.
939*44d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, true, true, true),
940*44d4804dSStefan Eßer 
941*44d4804dSStefan Eßer 	// Starts with BC_LEX_KW_AUTO.
942252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false),
943*44d4804dSStefan Eßer 
944*44d4804dSStefan Eßer 	// Starts with BC_LEX_KW_WHILE.
945252884aeSStefan Eßer 	BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, false),
946*44d4804dSStefan Eßer 
947*44d4804dSStefan Eßer 	// Starts with BC_LEX_KW_SQRT.
948*44d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, false, true, true),
949*44d4804dSStefan Eßer 
950*44d4804dSStefan Eßer 	// Starts with BC_LEX_KW_MAXSCALE,
951*44d4804dSStefan Eßer 	BC_PARSE_EXPR_ENTRY(true, true, false, false, 0, 0, 0, 0)
952*44d4804dSStefan Eßer 
953252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
954252884aeSStefan Eßer };
955252884aeSStefan Eßer 
956*44d4804dSStefan Eßer /// An array of data for operators that correspond to token types.
957252884aeSStefan Eßer const uchar bc_parse_ops[] = {
958252884aeSStefan Eßer 	BC_PARSE_OP(0, false), BC_PARSE_OP(0, false),
959252884aeSStefan Eßer 	BC_PARSE_OP(1, false), BC_PARSE_OP(1, false),
960252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
961252884aeSStefan Eßer 	BC_PARSE_OP(2, false),
962252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
963252884aeSStefan Eßer 	BC_PARSE_OP(4, false),
964252884aeSStefan Eßer 	BC_PARSE_OP(5, true), BC_PARSE_OP(5, true), BC_PARSE_OP(5, true),
965252884aeSStefan Eßer 	BC_PARSE_OP(6, true), BC_PARSE_OP(6, true),
966252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
967252884aeSStefan Eßer 	BC_PARSE_OP(3, false),
968252884aeSStefan Eßer 	BC_PARSE_OP(7, true), BC_PARSE_OP(7, true),
969252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
970252884aeSStefan Eßer 	BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true),
971252884aeSStefan Eßer 	BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true),
972252884aeSStefan Eßer 	BC_PARSE_OP(11, true), BC_PARSE_OP(10, true),
973252884aeSStefan Eßer 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
974252884aeSStefan Eßer 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
975252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
976252884aeSStefan Eßer 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
977252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
978252884aeSStefan Eßer 	BC_PARSE_OP(8, false),
979252884aeSStefan Eßer };
980252884aeSStefan Eßer 
981252884aeSStefan Eßer // These identify what tokens can come after expressions in certain cases.
982*44d4804dSStefan Eßer 
983*44d4804dSStefan Eßer /// The valid next tokens for normal expressions.
984252884aeSStefan Eßer const BcParseNext bc_parse_next_expr =
985252884aeSStefan Eßer 	BC_PARSE_NEXT(4, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_RBRACE, BC_LEX_EOF);
986*44d4804dSStefan Eßer 
987*44d4804dSStefan Eßer /// The valid next tokens for function argument expressions.
988*44d4804dSStefan Eßer const BcParseNext bc_parse_next_arg =
989252884aeSStefan Eßer 	BC_PARSE_NEXT(2, BC_LEX_RPAREN, BC_LEX_COMMA);
990*44d4804dSStefan Eßer 
991*44d4804dSStefan Eßer /// The valid next tokens for expressions in print statements.
992252884aeSStefan Eßer const BcParseNext bc_parse_next_print =
993252884aeSStefan Eßer 	BC_PARSE_NEXT(4, BC_LEX_COMMA, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_EOF);
994*44d4804dSStefan Eßer 
995*44d4804dSStefan Eßer /// The valid next tokens for if statement conditions or loop conditions. This
996*44d4804dSStefan Eßer /// is used in for loops for the update expression and for builtin function.
997*44d4804dSStefan Eßer ///
998*44d4804dSStefan Eßer /// The name is an artifact of history, and is related to @a BC_PARSE_REL (see
999*44d4804dSStefan Eßer /// include/parse.h). It refers to how POSIX only allows some operators as part
1000*44d4804dSStefan Eßer /// of the conditional of for loops, while loops, and if statements.
1001252884aeSStefan Eßer const BcParseNext bc_parse_next_rel = BC_PARSE_NEXT(1, BC_LEX_RPAREN);
1002*44d4804dSStefan Eßer 
1003*44d4804dSStefan Eßer /// The valid next tokens for array element expressions.
1004252884aeSStefan Eßer const BcParseNext bc_parse_next_elem = BC_PARSE_NEXT(1, BC_LEX_RBRACKET);
1005*44d4804dSStefan Eßer 
1006*44d4804dSStefan Eßer /// The valid next tokens for for loop initialization expressions and condition
1007*44d4804dSStefan Eßer /// expressions.
1008252884aeSStefan Eßer const BcParseNext bc_parse_next_for = BC_PARSE_NEXT(1, BC_LEX_SCOLON);
1009*44d4804dSStefan Eßer 
1010*44d4804dSStefan Eßer /// The valid next tokens for read expressions.
1011252884aeSStefan Eßer const BcParseNext bc_parse_next_read =
1012252884aeSStefan Eßer 	BC_PARSE_NEXT(2, BC_LEX_NLINE, BC_LEX_EOF);
1013*44d4804dSStefan Eßer 
1014*44d4804dSStefan Eßer /// The valid next tokens for the arguments of a builtin function with multiple
1015*44d4804dSStefan Eßer /// arguments.
1016*44d4804dSStefan Eßer const BcParseNext bc_parse_next_builtin = BC_PARSE_NEXT(1, BC_LEX_COMMA);
1017*44d4804dSStefan Eßer 
1018252884aeSStefan Eßer #endif // BC_ENABLED
1019252884aeSStefan Eßer 
1020252884aeSStefan Eßer #if DC_ENABLED
1021*44d4804dSStefan Eßer 
1022*44d4804dSStefan Eßer /// A list of instructions that need register arguments in dc.
1023252884aeSStefan Eßer const uint8_t dc_lex_regs[] = {
1024252884aeSStefan Eßer 	BC_LEX_OP_REL_EQ, BC_LEX_OP_REL_LE, BC_LEX_OP_REL_GE, BC_LEX_OP_REL_NE,
1025252884aeSStefan Eßer 	BC_LEX_OP_REL_LT, BC_LEX_OP_REL_GT, BC_LEX_SCOLON, BC_LEX_COLON,
1026252884aeSStefan Eßer 	BC_LEX_KW_ELSE, BC_LEX_LOAD, BC_LEX_LOAD_POP, BC_LEX_OP_ASSIGN,
1027*44d4804dSStefan Eßer 	BC_LEX_STORE_PUSH, BC_LEX_REG_STACK_LEVEL, BC_LEX_ARRAY_LENGTH,
1028252884aeSStefan Eßer };
1029252884aeSStefan Eßer 
1030*44d4804dSStefan Eßer /// The length of the list of register instructions.
1031252884aeSStefan Eßer const size_t dc_lex_regs_len = sizeof(dc_lex_regs) / sizeof(uint8_t);
1032252884aeSStefan Eßer 
1033*44d4804dSStefan Eßer /// A list corresponding to characters starting at double quote ("). If an entry
1034*44d4804dSStefan Eßer /// is BC_LEX_INVALID, then that character needs extra lexing in dc. If it does
1035*44d4804dSStefan Eßer /// not, the character can trivially be replaced by the entry. Positions are
1036*44d4804dSStefan Eßer /// kept because it corresponds to the ASCII table. This may need to be changed
1037*44d4804dSStefan Eßer /// if tokens change.
1038252884aeSStefan Eßer const uchar dc_lex_tokens[] = {
1039*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1040252884aeSStefan Eßer 	BC_LEX_KW_IRAND,
1041*44d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1042252884aeSStefan Eßer 	BC_LEX_INVALID,
1043*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1044252884aeSStefan Eßer 	BC_LEX_INVALID,
1045252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1046252884aeSStefan Eßer 	BC_LEX_OP_TRUNC,
1047252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1048252884aeSStefan Eßer 	BC_LEX_INVALID,
1049252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1050252884aeSStefan Eßer 	BC_LEX_OP_MODULUS, BC_LEX_INVALID,
1051*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1052252884aeSStefan Eßer 	BC_LEX_KW_RAND,
1053*44d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1054252884aeSStefan Eßer 	BC_LEX_INVALID,
1055*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1056252884aeSStefan Eßer 	BC_LEX_LPAREN, BC_LEX_RPAREN, BC_LEX_OP_MULTIPLY, BC_LEX_OP_PLUS,
1057*44d4804dSStefan Eßer 	BC_LEX_EXEC_STACK_LENGTH, BC_LEX_OP_MINUS, BC_LEX_INVALID, BC_LEX_OP_DIVIDE,
1058252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1059252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1060252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID,
1061252884aeSStefan Eßer 	BC_LEX_COLON, BC_LEX_SCOLON, BC_LEX_OP_REL_GT, BC_LEX_OP_REL_EQ,
1062252884aeSStefan Eßer 	BC_LEX_OP_REL_LT, BC_LEX_KW_READ,
1063252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1064252884aeSStefan Eßer 	BC_LEX_OP_PLACES,
1065252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1066252884aeSStefan Eßer 	BC_LEX_INVALID,
1067252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1068252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1069252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_EQ_NO_REG,
1070252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1071252884aeSStefan Eßer 	BC_LEX_OP_LSHIFT,
1072252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1073252884aeSStefan Eßer 	BC_LEX_INVALID,
1074252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1075252884aeSStefan Eßer 	BC_LEX_KW_IBASE,
1076*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1077252884aeSStefan Eßer 	BC_LEX_KW_SEED,
1078*44d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1079252884aeSStefan Eßer 	BC_LEX_INVALID,
1080*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1081252884aeSStefan Eßer 	BC_LEX_KW_SCALE, BC_LEX_LOAD_POP, BC_LEX_OP_BOOL_AND, BC_LEX_OP_BOOL_NOT,
1082*44d4804dSStefan Eßer 	BC_LEX_KW_OBASE, BC_LEX_KW_STREAM, BC_LEX_NQUIT, BC_LEX_POP,
1083252884aeSStefan Eßer 	BC_LEX_STORE_PUSH, BC_LEX_KW_MAXIBASE, BC_LEX_KW_MAXOBASE,
1084252884aeSStefan Eßer 	BC_LEX_KW_MAXSCALE,
1085*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1086252884aeSStefan Eßer 	BC_LEX_KW_MAXRAND,
1087*44d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1088252884aeSStefan Eßer 	BC_LEX_INVALID,
1089*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1090*44d4804dSStefan Eßer 	BC_LEX_SCALE_FACTOR, BC_LEX_ARRAY_LENGTH, BC_LEX_KW_LENGTH,
1091*44d4804dSStefan Eßer 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1092*44d4804dSStefan Eßer 	BC_LEX_OP_POWER, BC_LEX_NEG, BC_LEX_INVALID,
1093*44d4804dSStefan Eßer 	BC_LEX_KW_ASCIIFY, BC_LEX_KW_ABS, BC_LEX_CLEAR_STACK, BC_LEX_DUPLICATE,
1094252884aeSStefan Eßer 	BC_LEX_KW_ELSE, BC_LEX_PRINT_STACK, BC_LEX_INVALID,
1095252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1096252884aeSStefan Eßer 	BC_LEX_OP_RSHIFT,
1097252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1098252884aeSStefan Eßer 	BC_LEX_INVALID,
1099252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1100252884aeSStefan Eßer 	BC_LEX_STORE_IBASE,
1101*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1102252884aeSStefan Eßer 	BC_LEX_STORE_SEED,
1103*44d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH
1104252884aeSStefan Eßer 	BC_LEX_INVALID,
1105*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1106252884aeSStefan Eßer 	BC_LEX_STORE_SCALE, BC_LEX_LOAD,
1107252884aeSStefan Eßer 	BC_LEX_OP_BOOL_OR, BC_LEX_PRINT_POP, BC_LEX_STORE_OBASE, BC_LEX_KW_PRINT,
1108252884aeSStefan Eßer 	BC_LEX_KW_QUIT, BC_LEX_SWAP, BC_LEX_OP_ASSIGN, BC_LEX_INVALID,
1109252884aeSStefan Eßer 	BC_LEX_INVALID, BC_LEX_KW_SQRT, BC_LEX_INVALID, BC_LEX_EXECUTE,
1110*44d4804dSStefan Eßer 	BC_LEX_REG_STACK_LEVEL, BC_LEX_STACK_LEVEL,
1111*44d4804dSStefan Eßer 	BC_LEX_LBRACE, BC_LEX_KW_MODEXP, BC_LEX_RBRACE, BC_LEX_KW_DIVMOD,
1112252884aeSStefan Eßer 	BC_LEX_INVALID
1113252884aeSStefan Eßer };
1114252884aeSStefan Eßer 
1115*44d4804dSStefan Eßer /// A list of instructions that correspond to lex tokens. If an entry is
1116*44d4804dSStefan Eßer /// BC_INST_INVALID, that lex token needs extra parsing in the dc parser.
1117*44d4804dSStefan Eßer /// Otherwise, the token can trivially be replaced by the entry. This needs to
1118*44d4804dSStefan Eßer /// be updated if the tokens change.
1119252884aeSStefan Eßer const uchar dc_parse_insts[] = {
1120252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID,
1121252884aeSStefan Eßer #if BC_ENABLED
1122252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID,
1123252884aeSStefan Eßer #endif // BC_ENABLED
1124252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_BOOL_NOT,
1125252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1126252884aeSStefan Eßer 	BC_INST_TRUNC,
1127252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1128252884aeSStefan Eßer 	BC_INST_POWER, BC_INST_MULTIPLY, BC_INST_DIVIDE, BC_INST_MODULUS,
1129252884aeSStefan Eßer 	BC_INST_PLUS, BC_INST_MINUS,
1130252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1131252884aeSStefan Eßer 	BC_INST_PLACES,
1132252884aeSStefan Eßer 	BC_INST_LSHIFT, BC_INST_RSHIFT,
1133252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1134252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1135252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID,
1136252884aeSStefan Eßer 	BC_INST_BOOL_OR, BC_INST_BOOL_AND,
1137252884aeSStefan Eßer #if BC_ENABLED
1138252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1139252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID,
1140252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1141252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1142252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1143252884aeSStefan Eßer #endif // BC_ENABLED
1144252884aeSStefan Eßer 	BC_INST_INVALID,
1145252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GT, BC_INST_REL_LT,
1146252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GE,
1147252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_REL_LE,
1148252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1149252884aeSStefan Eßer #if BC_ENABLED
1150252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1151252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1152252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1153252884aeSStefan Eßer #endif // BC_ENABLED
1154252884aeSStefan Eßer 	BC_INST_IBASE, BC_INST_OBASE, BC_INST_SCALE,
1155*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1156252884aeSStefan Eßer 	BC_INST_SEED,
1157*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1158252884aeSStefan Eßer 	BC_INST_LENGTH, BC_INST_PRINT,
1159252884aeSStefan Eßer 	BC_INST_SQRT, BC_INST_ABS,
1160*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1161252884aeSStefan Eßer 	BC_INST_IRAND,
1162*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1163*44d4804dSStefan Eßer 	BC_INST_ASCIIFY, BC_INST_MODEXP, BC_INST_DIVMOD,
1164252884aeSStefan Eßer 	BC_INST_QUIT, BC_INST_INVALID,
1165*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1166252884aeSStefan Eßer 	BC_INST_RAND,
1167*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1168252884aeSStefan Eßer 	BC_INST_MAXIBASE,
1169252884aeSStefan Eßer 	BC_INST_MAXOBASE, BC_INST_MAXSCALE,
1170*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1171252884aeSStefan Eßer 	BC_INST_MAXRAND,
1172252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1173*44d4804dSStefan Eßer 	BC_INST_PRINT_STREAM, BC_INST_INVALID,
1174*44d4804dSStefan Eßer 	BC_INST_REL_EQ, BC_INST_INVALID,
1175252884aeSStefan Eßer 	BC_INST_EXECUTE, BC_INST_PRINT_STACK, BC_INST_CLEAR_STACK,
1176*44d4804dSStefan Eßer 	BC_INST_INVALID, BC_INST_STACK_LEN, BC_INST_DUPLICATE, BC_INST_SWAP,
1177*44d4804dSStefan Eßer 	BC_INST_POP,
1178252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1179252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1180252884aeSStefan Eßer 	BC_INST_INVALID,
1181252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1182252884aeSStefan Eßer 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1183*44d4804dSStefan Eßer 	BC_INST_PRINT_POP, BC_INST_NQUIT, BC_INST_EXEC_STACK_LEN,
1184*44d4804dSStefan Eßer 	BC_INST_SCALE_FUNC, BC_INST_INVALID,
1185252884aeSStefan Eßer };
1186252884aeSStefan Eßer #endif // DC_ENABLED
1187252884aeSStefan Eßer 
118850696a6eSStefan Eßer #endif // !BC_ENABLE_LIBRARY
118950696a6eSStefan Eßer 
1190*44d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH
119150696a6eSStefan Eßer 
1192*44d4804dSStefan Eßer /// A constant for the rand multiplier.
119350696a6eSStefan Eßer const BcRandState bc_rand_multiplier = BC_RAND_MULTIPLIER;
119450696a6eSStefan Eßer 
1195*44d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
119650696a6eSStefan Eßer 
1197252884aeSStefan Eßer #if BC_LONG_BIT >= 64
1198*44d4804dSStefan Eßer 
1199*44d4804dSStefan Eßer /// A constant array for the max of a bigdig number as a BcDig array.
1200252884aeSStefan Eßer const BcDig bc_num_bigdigMax[] = {
1201252884aeSStefan Eßer 	709551616U,
1202252884aeSStefan Eßer 	446744073U,
120350696a6eSStefan Eßer 	18U,
120450696a6eSStefan Eßer };
1205*44d4804dSStefan Eßer 
1206*44d4804dSStefan Eßer /// A constant array for the max of 2 times a bigdig number as a BcDig array.
120750696a6eSStefan Eßer const BcDig bc_num_bigdigMax2[] = {
120850696a6eSStefan Eßer 	768211456U,
120950696a6eSStefan Eßer 	374607431U,
121050696a6eSStefan Eßer 	938463463U,
121150696a6eSStefan Eßer 	282366920U,
121250696a6eSStefan Eßer 	340U,
1213252884aeSStefan Eßer };
1214*44d4804dSStefan Eßer 
1215252884aeSStefan Eßer #else // BC_LONG_BIT >= 64
1216*44d4804dSStefan Eßer 
1217*44d4804dSStefan Eßer /// A constant array for the max of a bigdig number as a BcDig array.
1218252884aeSStefan Eßer const BcDig bc_num_bigdigMax[] = {
1219252884aeSStefan Eßer 	7296U,
1220252884aeSStefan Eßer 	9496U,
1221252884aeSStefan Eßer 	42U,
1222252884aeSStefan Eßer };
1223*44d4804dSStefan Eßer 
1224*44d4804dSStefan Eßer /// A constant array for the max of 2 times a bigdig number as a BcDig array.
122550696a6eSStefan Eßer const BcDig bc_num_bigdigMax2[] = {
122650696a6eSStefan Eßer 	1616U,
122750696a6eSStefan Eßer 	955U,
122850696a6eSStefan Eßer 	737U,
122950696a6eSStefan Eßer 	6744U,
123050696a6eSStefan Eßer 	1844U,
123150696a6eSStefan Eßer };
1232*44d4804dSStefan Eßer 
1233252884aeSStefan Eßer #endif // BC_LONG_BIT >= 64
1234252884aeSStefan Eßer 
1235*44d4804dSStefan Eßer /// The size of the bigdig max array.
1236252884aeSStefan Eßer const size_t bc_num_bigdigMax_size = sizeof(bc_num_bigdigMax) / sizeof(BcDig);
1237*44d4804dSStefan Eßer 
1238*44d4804dSStefan Eßer /// The size of the bigdig max times 2 array.
123950696a6eSStefan Eßer const size_t bc_num_bigdigMax2_size = sizeof(bc_num_bigdigMax2) / sizeof(BcDig);
1240252884aeSStefan Eßer 
1241*44d4804dSStefan Eßer /// A string of digits for easy conversion from characters to digits.
1242252884aeSStefan Eßer const char bc_num_hex_digits[] = "0123456789ABCDEF";
1243252884aeSStefan Eßer 
1244*44d4804dSStefan Eßer /// An array for easy conversion from exponent to power of 10.
1245252884aeSStefan Eßer const BcBigDig bc_num_pow10[BC_BASE_DIGS + 1] = {
1246252884aeSStefan Eßer 	1,
1247252884aeSStefan Eßer 	10,
1248252884aeSStefan Eßer 	100,
1249252884aeSStefan Eßer 	1000,
1250252884aeSStefan Eßer 	10000,
1251252884aeSStefan Eßer #if BC_BASE_DIGS > 4
1252252884aeSStefan Eßer 	100000,
1253252884aeSStefan Eßer 	1000000,
1254252884aeSStefan Eßer 	10000000,
1255252884aeSStefan Eßer 	100000000,
1256252884aeSStefan Eßer 	1000000000,
1257252884aeSStefan Eßer #endif // BC_BASE_DIGS > 4
1258252884aeSStefan Eßer };
1259252884aeSStefan Eßer 
126050696a6eSStefan Eßer #if !BC_ENABLE_LIBRARY
126150696a6eSStefan Eßer 
1262*44d4804dSStefan Eßer /// An array of functions for binary operators corresponding to the order of
1263*44d4804dSStefan Eßer /// the instructions for the operators.
1264252884aeSStefan Eßer const BcNumBinaryOp bc_program_ops[] = {
1265252884aeSStefan Eßer 	bc_num_pow, bc_num_mul, bc_num_div, bc_num_mod, bc_num_add, bc_num_sub,
1266252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1267252884aeSStefan Eßer 	bc_num_places, bc_num_lshift, bc_num_rshift,
1268252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1269252884aeSStefan Eßer };
1270252884aeSStefan Eßer 
1271*44d4804dSStefan Eßer /// An array of functions for binary operators allocation requests corresponding
1272*44d4804dSStefan Eßer /// to the order of the instructions for the operators.
1273252884aeSStefan Eßer const BcNumBinaryOpReq bc_program_opReqs[] = {
127450696a6eSStefan Eßer 	bc_num_powReq, bc_num_mulReq, bc_num_divReq, bc_num_divReq,
1275252884aeSStefan Eßer 	bc_num_addReq, bc_num_addReq,
1276252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1277252884aeSStefan Eßer 	bc_num_placesReq, bc_num_placesReq, bc_num_placesReq,
1278252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1279252884aeSStefan Eßer };
1280252884aeSStefan Eßer 
1281*44d4804dSStefan Eßer /// An array of unary operator functions corresponding to the order of the
1282*44d4804dSStefan Eßer /// instructions.
1283252884aeSStefan Eßer const BcProgramUnary bc_program_unarys[] = {
1284252884aeSStefan Eßer 	bc_program_negate, bc_program_not,
1285252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH
1286252884aeSStefan Eßer 	bc_program_trunc,
1287252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH
1288252884aeSStefan Eßer };
1289252884aeSStefan Eßer 
1290*44d4804dSStefan Eßer /// A filename for when parsing expressions.
1291252884aeSStefan Eßer const char bc_program_exprs_name[] = "<exprs>";
1292252884aeSStefan Eßer 
1293*44d4804dSStefan Eßer /// A filename for when parsing stdin..
1294252884aeSStefan Eßer const char bc_program_stdin_name[] = "<stdin>";
1295*44d4804dSStefan Eßer 
1296*44d4804dSStefan Eßer /// A ready message for SIGINT catching.
1297252884aeSStefan Eßer const char bc_program_ready_msg[] = "ready for more input\n";
1298*44d4804dSStefan Eßer 
1299*44d4804dSStefan Eßer /// The length of the ready message.
1300252884aeSStefan Eßer const size_t bc_program_ready_msg_len = sizeof(bc_program_ready_msg) - 1;
1301*44d4804dSStefan Eßer 
1302*44d4804dSStefan Eßer /// A list of escape characters that a print statement should treat specially.
1303252884aeSStefan Eßer const char bc_program_esc_chars[] = "ab\\efnqrt";
1304*44d4804dSStefan Eßer 
1305*44d4804dSStefan Eßer /// A list of characters corresponding to the escape characters above.
1306252884aeSStefan Eßer const char bc_program_esc_seqs[] = "\a\b\\\\\f\n\"\r\t";
130750696a6eSStefan Eßer 
130850696a6eSStefan Eßer #endif // !BC_ENABLE_LIBRARY
1309