xref: /freebsd/contrib/bc/src/data.c (revision 19261079b74319502c6ffa1249920079f0f69a72)
1 /*
2  * *****************************************************************************
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  *
6  * Copyright (c) 2018-2021 Gavin D. Howard and contributors.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * * Redistributions of source code must retain the above copyright notice, this
12  *   list of conditions and the following disclaimer.
13  *
14  * * Redistributions in binary form must reproduce the above copyright notice,
15  *   this list of conditions and the following disclaimer in the documentation
16  *   and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * *****************************************************************************
31  *
32  * Constant data for bc.
33  *
34  */
35 
36 #include <assert.h>
37 
38 #include <opt.h>
39 #include <args.h>
40 #include <lex.h>
41 #include <parse.h>
42 #include <bc.h>
43 #include <dc.h>
44 #include <num.h>
45 #include <rand.h>
46 #include <program.h>
47 #include <history.h>
48 #include <library.h>
49 #include <vm.h>
50 
51 #if !BC_ENABLE_LIBRARY
52 
53 #if BC_ENABLED
54 
55 /// The bc signal message and its length.
56 const char bc_sig_msg[] = "\ninterrupt (type \"quit\" to exit)\n";
57 const uchar bc_sig_msg_len = (uchar) (sizeof(bc_sig_msg) - 1);
58 
59 #endif // BC_ENABLED
60 
61 #if DC_ENABLED
62 
63 /// The dc signal message and its length.
64 const char dc_sig_msg[] = "\ninterrupt (type \"q\" to exit)\n";
65 const uchar dc_sig_msg_len = (uchar) (sizeof(dc_sig_msg) - 1);
66 
67 #endif // DC_ENABLED
68 
69 /// The copyright banner.
70 const char bc_copyright[] =
71 	"Copyright (c) 2018-2021 Gavin D. Howard and contributors\n"
72 	"Report bugs at: https://git.yzena.com/gavin/bc\n\n"
73 	"This is free software with ABSOLUTELY NO WARRANTY.\n";
74 
75 #ifdef __OpenBSD__
76 
77 #if BC_ENABLE_EXTRA_MATH
78 
79 #if BC_ENABLE_HISTORY
80 
81 /// The pledges for starting bc.
82 const char bc_pledge_start[] = "rpath stdio tty unveil";
83 
84 /// The final pledges with history enabled.
85 const char bc_pledge_end_history[] = "rpath stdio tty";
86 
87 #else // BC_ENABLE_HISTORY
88 
89 /// The pledges for starting bc.
90 const char bc_pledge_start[] = "rpath stdio unveil";
91 
92 #endif // BC_ENABLE_HISTORY
93 
94 /// The final pledges with history history disabled.
95 const char bc_pledge_end[] = "rpath stdio";
96 
97 #else // BC_ENABLE_EXTRA_MATH
98 
99 #if BC_ENABLE_HISTORY
100 
101 /// The pledges for starting bc.
102 const char bc_pledge_start[] = "rpath stdio tty";
103 
104 /// The final pledges with history enabled.
105 const char bc_pledge_end_history[] = "stdio tty";
106 
107 #else // BC_ENABLE_HISTORY
108 
109 /// The pledges for starting bc.
110 const char bc_pledge_start[] = "rpath stdio";
111 
112 #endif // BC_ENABLE_HISTORY
113 
114 /// The final pledges with history history disabled.
115 const char bc_pledge_end[] = "stdio";
116 
117 #endif // BC_ENABLE_EXTRA_MATH
118 
119 #else // __OpenBSD__
120 
121 /// The pledges for starting bc.
122 const char bc_pledge_start[] = "";
123 
124 #if BC_ENABLE_HISTORY
125 
126 /// The final pledges with history enabled.
127 const char bc_pledge_end_history[] = "";
128 
129 #endif // BC_ENABLE_HISTORY
130 
131 /// The final pledges with history history disabled.
132 const char bc_pledge_end[] = "";
133 
134 #endif // __OpenBSD__
135 
136 /// The list of long options. There is a zero set at the end for detecting the
137 /// end.
138 const BcOptLong bc_args_lopt[] = {
139 
140 	{ "expression", BC_OPT_REQUIRED, 'e' },
141 	{ "file", BC_OPT_REQUIRED, 'f' },
142 	{ "help", BC_OPT_NONE, 'h' },
143 	{ "interactive", BC_OPT_NONE, 'i' },
144 	{ "no-prompt", BC_OPT_NONE, 'P' },
145 	{ "no-read-prompt", BC_OPT_NONE, 'R' },
146 #if BC_ENABLED
147 	{ "global-stacks", BC_OPT_BC_ONLY, 'g' },
148 	{ "mathlib", BC_OPT_BC_ONLY, 'l' },
149 	{ "quiet", BC_OPT_BC_ONLY, 'q' },
150 	{ "redefine", BC_OPT_REQUIRED_BC_ONLY, 'r' },
151 	{ "standard", BC_OPT_BC_ONLY, 's' },
152 	{ "warn", BC_OPT_BC_ONLY, 'w' },
153 #endif // BC_ENABLED
154 	{ "version", BC_OPT_NONE, 'v' },
155 	{ "version", BC_OPT_NONE, 'V' },
156 #if DC_ENABLED
157 	{ "extended-register", BC_OPT_DC_ONLY, 'x' },
158 #endif // DC_ENABLED
159 	{ NULL, 0, 0 },
160 
161 };
162 
163 /// The function header for error messages.
164 const char* const bc_err_func_header = "Function:";
165 
166 /// The line format string for error messages.
167 const char* const bc_err_line = ":%zu";
168 
169 /// The default error category strings.
170 const char *bc_errs[] = {
171 	"Math error:",
172 	"Parse error:",
173 	"Runtime error:",
174 	"Fatal error:",
175 #if BC_ENABLED
176 	"Warning:",
177 #endif // BC_ENABLED
178 };
179 
180 /// The error category for each error.
181 const uchar bc_err_ids[] = {
182 
183 	BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH,
184 
185 	BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL,
186 	BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL,
187 	BC_ERR_IDX_FATAL,
188 
189 	BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
190 	BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
191 	BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC,
192 
193 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
194 	BC_ERR_IDX_PARSE,
195 #if BC_ENABLED
196 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
197 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
198 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
199 
200 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
201 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
202 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
203 	BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE,
204 #endif // BC_ENABLED
205 
206 };
207 
208 /// The default error messages. There are NULL pointers because the positions
209 /// must be preserved for the locales.
210 const char* const bc_err_msgs[] = {
211 
212 	"negative number",
213 	"non-integer number",
214 	"overflow: number cannot fit",
215 	"divide by 0",
216 
217 	"memory allocation failed",
218 	"I/O error",
219 	"cannot open file: %s",
220 	"file is not text: %s",
221 	"path is a directory: %s",
222 	"bad command-line option: \"%s\"",
223 	"option requires an argument: '%c' (\"%s\")",
224 	"option takes no arguments: '%c' (\"%s\")",
225 	"bad option argument: \"%s\"",
226 
227 	"bad ibase: must be [%lu, %lu]",
228 	"bad obase: must be [%lu, %lu]",
229 	"bad scale: must be [%lu, %lu]",
230 	"bad read() expression",
231 	"read() call inside of a read() call",
232 	"variable or array element is the wrong type",
233 #if DC_ENABLED
234 	"stack has too few elements",
235 	"stack for register \"%s\" has too few elements",
236 #else // DC_ENABLED
237 	NULL, NULL,
238 #endif // DC_ENABLED
239 #if BC_ENABLED
240 	"wrong number of parameters; need %zu, have %zu",
241 	"undefined function: %s()",
242 	"cannot use a void value in an expression",
243 #else
244 	NULL, NULL, NULL,
245 #endif // BC_ENABLED
246 
247 	"end of file",
248 	"bad character '%c'",
249 	"string end cannot be found",
250 	"comment end cannot be found",
251 	"bad token",
252 #if BC_ENABLED
253 	"bad expression",
254 	"empty expression",
255 	"bad print or stream statement",
256 	"bad function definition",
257 	("bad assignment: left side must be scale, ibase, "
258 		"obase, seed, last, var, or array element"),
259 	"no auto variable found",
260 	"function parameter or auto \"%s%s\" already exists",
261 	"block end cannot be found",
262 	"cannot return a value from void function: %s()",
263 	"var cannot be a reference: %s",
264 
265 	"POSIX does not allow names longer than 1 character: %s",
266 	"POSIX does not allow '#' script comments",
267 	"POSIX does not allow the following keyword: %s",
268 	"POSIX does not allow a period ('.') as a shortcut for the last result",
269 	"POSIX requires parentheses around return expressions",
270 	"POSIX does not allow the following operator: %s",
271 	"POSIX does not allow comparison operators outside if statements or loops",
272 	"POSIX requires 0 or 1 comparison operators per condition",
273 	"POSIX requires all 3 parts of a for loop to be non-empty",
274 #if BC_ENABLE_EXTRA_MATH
275 	"POSIX does not allow exponential notation",
276 #else
277 	NULL,
278 #endif // BC_ENABLE_EXTRA_MATH
279 	"POSIX does not allow array references as function parameters",
280 	"POSIX does not allow void functions",
281 	"POSIX requires the left brace be on the same line as the function header",
282 	"POSIX does not allow strings to be assigned to variables or arrays",
283 #endif // BC_ENABLED
284 
285 };
286 
287 #endif // !BC_ENABLE_LIBRARY
288 
289 /// The destructors corresponding to BcDtorType enum items.
290 const BcVecFree bc_vec_dtors[] = {
291 	NULL,
292 	bc_vec_free,
293 	bc_num_free,
294 #if !BC_ENABLE_LIBRARY
295 #ifndef NDEBUG
296 	bc_func_free,
297 #endif // NDEBUG
298 	bc_slab_free,
299 	bc_const_free,
300 	bc_result_free,
301 #if BC_ENABLE_HISTORY
302 	bc_history_string_free,
303 #endif // BC_ENABLE_HISTORY
304 #else // !BC_ENABLE_LIBRARY
305 	bcl_num_destruct,
306 #endif // !BC_ENABLE_LIBRARY
307 };
308 
309 #if !BC_ENABLE_LIBRARY
310 
311 #if BC_ENABLE_HISTORY
312 
313 /// A flush type for not clearing current extras but not saving new ones either.
314 const BcFlushType bc_flush_none = BC_FLUSH_NO_EXTRAS_NO_CLEAR;
315 
316 /// A flush type for clearing extras and not saving new ones.
317 const BcFlushType bc_flush_err = BC_FLUSH_NO_EXTRAS_CLEAR;
318 
319 /// A flush type for clearing previous extras and saving new ones.
320 const BcFlushType bc_flush_save = BC_FLUSH_SAVE_EXTRAS_CLEAR;
321 #endif // BC_ENABLE_HISTORY
322 
323 #if BC_ENABLE_HISTORY
324 
325 /// A list of known bad terminals.
326 const char *bc_history_bad_terms[] = { "dumb", "cons25", "emacs", NULL };
327 
328 /// A constant for tabs and its length. My tab handling is dumb and always
329 /// outputs the entire thing.
330 const char bc_history_tab[] = "        ";
331 const size_t bc_history_tab_len = sizeof(bc_history_tab) - 1;
332 
333 /// A list of wide chars. These are listed in ascending order for efficiency.
334 const uint32_t bc_history_wchars[][2] = {
335 	{ 0x1100, 0x115F },
336 	{ 0x231A, 0x231B },
337 	{ 0x2329, 0x232A },
338 	{ 0x23E9, 0x23EC },
339 	{ 0x23F0, 0x23F0 },
340 	{ 0x23F3, 0x23F3 },
341 	{ 0x25FD, 0x25FE },
342 	{ 0x2614, 0x2615 },
343 	{ 0x2648, 0x2653 },
344 	{ 0x267F, 0x267F },
345 	{ 0x2693, 0x2693 },
346 	{ 0x26A1, 0x26A1 },
347 	{ 0x26AA, 0x26AB },
348 	{ 0x26BD, 0x26BE },
349 	{ 0x26C4, 0x26C5 },
350 	{ 0x26CE, 0x26CE },
351 	{ 0x26D4, 0x26D4 },
352 	{ 0x26EA, 0x26EA },
353 	{ 0x26F2, 0x26F3 },
354 	{ 0x26F5, 0x26F5 },
355 	{ 0x26FA, 0x26FA },
356 	{ 0x26FD, 0x26FD },
357 	{ 0x2705, 0x2705 },
358 	{ 0x270A, 0x270B },
359 	{ 0x2728, 0x2728 },
360 	{ 0x274C, 0x274C },
361 	{ 0x274E, 0x274E },
362 	{ 0x2753, 0x2755 },
363 	{ 0x2757, 0x2757 },
364 	{ 0x2795, 0x2797 },
365 	{ 0x27B0, 0x27B0 },
366 	{ 0x27BF, 0x27BF },
367 	{ 0x2B1B, 0x2B1C },
368 	{ 0x2B50, 0x2B50 },
369 	{ 0x2B55, 0x2B55 },
370 	{ 0x2E80, 0x2E99 },
371 	{ 0x2E9B, 0x2EF3 },
372 	{ 0x2F00, 0x2FD5 },
373 	{ 0x2FF0, 0x2FFB },
374 	{ 0x3001, 0x303E },
375 	{ 0x3041, 0x3096 },
376 	{ 0x3099, 0x30FF },
377 	{ 0x3105, 0x312D },
378 	{ 0x3131, 0x318E },
379 	{ 0x3190, 0x31BA },
380 	{ 0x31C0, 0x31E3 },
381 	{ 0x31F0, 0x321E },
382 	{ 0x3220, 0x3247 },
383 	{ 0x3250, 0x32FE },
384 	{ 0x3300, 0x4DBF },
385 	{ 0x4E00, 0xA48C },
386 	{ 0xA490, 0xA4C6 },
387 	{ 0xA960, 0xA97C },
388 	{ 0xAC00, 0xD7A3 },
389 	{ 0xF900, 0xFAFF },
390 	{ 0xFE10, 0xFE19 },
391 	{ 0xFE30, 0xFE52 },
392 	{ 0xFE54, 0xFE66 },
393 	{ 0xFE68, 0xFE6B },
394 	{ 0x16FE0, 0x16FE0 },
395 	{ 0x17000, 0x187EC },
396 	{ 0x18800, 0x18AF2 },
397 	{ 0x1B000, 0x1B001 },
398 	{ 0x1F004, 0x1F004 },
399 	{ 0x1F0CF, 0x1F0CF },
400 	{ 0x1F18E, 0x1F18E },
401 	{ 0x1F191, 0x1F19A },
402 	{ 0x1F200, 0x1F202 },
403 	{ 0x1F210, 0x1F23B },
404 	{ 0x1F240, 0x1F248 },
405 	{ 0x1F250, 0x1F251 },
406 	{ 0x1F300, 0x1F320 },
407 	{ 0x1F32D, 0x1F335 },
408 	{ 0x1F337, 0x1F37C },
409 	{ 0x1F37E, 0x1F393 },
410 	{ 0x1F3A0, 0x1F3CA },
411 	{ 0x1F3CF, 0x1F3D3 },
412 	{ 0x1F3E0, 0x1F3F0 },
413 	{ 0x1F3F4, 0x1F3F4 },
414 	{ 0x1F3F8, 0x1F43E },
415 	{ 0x1F440, 0x1F440 },
416 	{ 0x1F442, 0x1F4FC },
417 	{ 0x1F4FF, 0x1F53D },
418 	{ 0x1F54B, 0x1F54E },
419 	{ 0x1F550, 0x1F567 },
420 	{ 0x1F57A, 0x1F57A },
421 	{ 0x1F595, 0x1F596 },
422 	{ 0x1F5A4, 0x1F5A4 },
423 	{ 0x1F5FB, 0x1F64F },
424 	{ 0x1F680, 0x1F6C5 },
425 	{ 0x1F6CC, 0x1F6CC },
426 	{ 0x1F6D0, 0x1F6D2 },
427 	{ 0x1F6EB, 0x1F6EC },
428 	{ 0x1F6F4, 0x1F6F6 },
429 	{ 0x1F910, 0x1F91E },
430 	{ 0x1F920, 0x1F927 },
431 	{ 0x1F930, 0x1F930 },
432 	{ 0x1F933, 0x1F93E },
433 	{ 0x1F940, 0x1F94B },
434 	{ 0x1F950, 0x1F95E },
435 	{ 0x1F980, 0x1F991 },
436 	{ 0x1F9C0, 0x1F9C0 },
437 	{ 0x20000, 0x2FFFD },
438 	{ 0x30000, 0x3FFFD },
439 };
440 
441 /// The length of the wide chars list.
442 const size_t bc_history_wchars_len =
443 	sizeof(bc_history_wchars) / sizeof(bc_history_wchars[0]);
444 
445 /// A list of combining characters in Unicode. These are listed in ascending
446 /// order for efficiency.
447 const uint32_t bc_history_combo_chars[] = {
448 	0x0300,0x0301,0x0302,0x0303,0x0304,0x0305,0x0306,0x0307,
449 	0x0308,0x0309,0x030A,0x030B,0x030C,0x030D,0x030E,0x030F,
450 	0x0310,0x0311,0x0312,0x0313,0x0314,0x0315,0x0316,0x0317,
451 	0x0318,0x0319,0x031A,0x031B,0x031C,0x031D,0x031E,0x031F,
452 	0x0320,0x0321,0x0322,0x0323,0x0324,0x0325,0x0326,0x0327,
453 	0x0328,0x0329,0x032A,0x032B,0x032C,0x032D,0x032E,0x032F,
454 	0x0330,0x0331,0x0332,0x0333,0x0334,0x0335,0x0336,0x0337,
455 	0x0338,0x0339,0x033A,0x033B,0x033C,0x033D,0x033E,0x033F,
456 	0x0340,0x0341,0x0342,0x0343,0x0344,0x0345,0x0346,0x0347,
457 	0x0348,0x0349,0x034A,0x034B,0x034C,0x034D,0x034E,0x034F,
458 	0x0350,0x0351,0x0352,0x0353,0x0354,0x0355,0x0356,0x0357,
459 	0x0358,0x0359,0x035A,0x035B,0x035C,0x035D,0x035E,0x035F,
460 	0x0360,0x0361,0x0362,0x0363,0x0364,0x0365,0x0366,0x0367,
461 	0x0368,0x0369,0x036A,0x036B,0x036C,0x036D,0x036E,0x036F,
462 	0x0483,0x0484,0x0485,0x0486,0x0487,0x0591,0x0592,0x0593,
463 	0x0594,0x0595,0x0596,0x0597,0x0598,0x0599,0x059A,0x059B,
464 	0x059C,0x059D,0x059E,0x059F,0x05A0,0x05A1,0x05A2,0x05A3,
465 	0x05A4,0x05A5,0x05A6,0x05A7,0x05A8,0x05A9,0x05AA,0x05AB,
466 	0x05AC,0x05AD,0x05AE,0x05AF,0x05B0,0x05B1,0x05B2,0x05B3,
467 	0x05B4,0x05B5,0x05B6,0x05B7,0x05B8,0x05B9,0x05BA,0x05BB,
468 	0x05BC,0x05BD,0x05BF,0x05C1,0x05C2,0x05C4,0x05C5,0x05C7,
469 	0x0610,0x0611,0x0612,0x0613,0x0614,0x0615,0x0616,0x0617,
470 	0x0618,0x0619,0x061A,0x064B,0x064C,0x064D,0x064E,0x064F,
471 	0x0650,0x0651,0x0652,0x0653,0x0654,0x0655,0x0656,0x0657,
472 	0x0658,0x0659,0x065A,0x065B,0x065C,0x065D,0x065E,0x065F,
473 	0x0670,0x06D6,0x06D7,0x06D8,0x06D9,0x06DA,0x06DB,0x06DC,
474 	0x06DF,0x06E0,0x06E1,0x06E2,0x06E3,0x06E4,0x06E7,0x06E8,
475 	0x06EA,0x06EB,0x06EC,0x06ED,0x0711,0x0730,0x0731,0x0732,
476 	0x0733,0x0734,0x0735,0x0736,0x0737,0x0738,0x0739,0x073A,
477 	0x073B,0x073C,0x073D,0x073E,0x073F,0x0740,0x0741,0x0742,
478 	0x0743,0x0744,0x0745,0x0746,0x0747,0x0748,0x0749,0x074A,
479 	0x07A6,0x07A7,0x07A8,0x07A9,0x07AA,0x07AB,0x07AC,0x07AD,
480 	0x07AE,0x07AF,0x07B0,0x07EB,0x07EC,0x07ED,0x07EE,0x07EF,
481 	0x07F0,0x07F1,0x07F2,0x07F3,0x0816,0x0817,0x0818,0x0819,
482 	0x081B,0x081C,0x081D,0x081E,0x081F,0x0820,0x0821,0x0822,
483 	0x0823,0x0825,0x0826,0x0827,0x0829,0x082A,0x082B,0x082C,
484 	0x082D,0x0859,0x085A,0x085B,0x08D4,0x08D5,0x08D6,0x08D7,
485 	0x08D8,0x08D9,0x08DA,0x08DB,0x08DC,0x08DD,0x08DE,0x08DF,
486 	0x08E0,0x08E1,0x08E3,0x08E4,0x08E5,0x08E6,0x08E7,0x08E8,
487 	0x08E9,0x08EA,0x08EB,0x08EC,0x08ED,0x08EE,0x08EF,0x08F0,
488 	0x08F1,0x08F2,0x08F3,0x08F4,0x08F5,0x08F6,0x08F7,0x08F8,
489 	0x08F9,0x08FA,0x08FB,0x08FC,0x08FD,0x08FE,0x08FF,0x0900,
490 	0x0901,0x0902,0x093A,0x093C,0x0941,0x0942,0x0943,0x0944,
491 	0x0945,0x0946,0x0947,0x0948,0x094D,0x0951,0x0952,0x0953,
492 	0x0954,0x0955,0x0956,0x0957,0x0962,0x0963,0x0981,0x09BC,
493 	0x09C1,0x09C2,0x09C3,0x09C4,0x09CD,0x09E2,0x09E3,0x0A01,
494 	0x0A02,0x0A3C,0x0A41,0x0A42,0x0A47,0x0A48,0x0A4B,0x0A4C,
495 	0x0A4D,0x0A51,0x0A70,0x0A71,0x0A75,0x0A81,0x0A82,0x0ABC,
496 	0x0AC1,0x0AC2,0x0AC3,0x0AC4,0x0AC5,0x0AC7,0x0AC8,0x0ACD,
497 	0x0AE2,0x0AE3,0x0B01,0x0B3C,0x0B3F,0x0B41,0x0B42,0x0B43,
498 	0x0B44,0x0B4D,0x0B56,0x0B62,0x0B63,0x0B82,0x0BC0,0x0BCD,
499 	0x0C00,0x0C3E,0x0C3F,0x0C40,0x0C46,0x0C47,0x0C48,0x0C4A,
500 	0x0C4B,0x0C4C,0x0C4D,0x0C55,0x0C56,0x0C62,0x0C63,0x0C81,
501 	0x0CBC,0x0CBF,0x0CC6,0x0CCC,0x0CCD,0x0CE2,0x0CE3,0x0D01,
502 	0x0D41,0x0D42,0x0D43,0x0D44,0x0D4D,0x0D62,0x0D63,0x0DCA,
503 	0x0DD2,0x0DD3,0x0DD4,0x0DD6,0x0E31,0x0E34,0x0E35,0x0E36,
504 	0x0E37,0x0E38,0x0E39,0x0E3A,0x0E47,0x0E48,0x0E49,0x0E4A,
505 	0x0E4B,0x0E4C,0x0E4D,0x0E4E,0x0EB1,0x0EB4,0x0EB5,0x0EB6,
506 	0x0EB7,0x0EB8,0x0EB9,0x0EBB,0x0EBC,0x0EC8,0x0EC9,0x0ECA,
507 	0x0ECB,0x0ECC,0x0ECD,0x0F18,0x0F19,0x0F35,0x0F37,0x0F39,
508 	0x0F71,0x0F72,0x0F73,0x0F74,0x0F75,0x0F76,0x0F77,0x0F78,
509 	0x0F79,0x0F7A,0x0F7B,0x0F7C,0x0F7D,0x0F7E,0x0F80,0x0F81,
510 	0x0F82,0x0F83,0x0F84,0x0F86,0x0F87,0x0F8D,0x0F8E,0x0F8F,
511 	0x0F90,0x0F91,0x0F92,0x0F93,0x0F94,0x0F95,0x0F96,0x0F97,
512 	0x0F99,0x0F9A,0x0F9B,0x0F9C,0x0F9D,0x0F9E,0x0F9F,0x0FA0,
513 	0x0FA1,0x0FA2,0x0FA3,0x0FA4,0x0FA5,0x0FA6,0x0FA7,0x0FA8,
514 	0x0FA9,0x0FAA,0x0FAB,0x0FAC,0x0FAD,0x0FAE,0x0FAF,0x0FB0,
515 	0x0FB1,0x0FB2,0x0FB3,0x0FB4,0x0FB5,0x0FB6,0x0FB7,0x0FB8,
516 	0x0FB9,0x0FBA,0x0FBB,0x0FBC,0x0FC6,0x102D,0x102E,0x102F,
517 	0x1030,0x1032,0x1033,0x1034,0x1035,0x1036,0x1037,0x1039,
518 	0x103A,0x103D,0x103E,0x1058,0x1059,0x105E,0x105F,0x1060,
519 	0x1071,0x1072,0x1073,0x1074,0x1082,0x1085,0x1086,0x108D,
520 	0x109D,0x135D,0x135E,0x135F,0x1712,0x1713,0x1714,0x1732,
521 	0x1733,0x1734,0x1752,0x1753,0x1772,0x1773,0x17B4,0x17B5,
522 	0x17B7,0x17B8,0x17B9,0x17BA,0x17BB,0x17BC,0x17BD,0x17C6,
523 	0x17C9,0x17CA,0x17CB,0x17CC,0x17CD,0x17CE,0x17CF,0x17D0,
524 	0x17D1,0x17D2,0x17D3,0x17DD,0x180B,0x180C,0x180D,0x1885,
525 	0x1886,0x18A9,0x1920,0x1921,0x1922,0x1927,0x1928,0x1932,
526 	0x1939,0x193A,0x193B,0x1A17,0x1A18,0x1A1B,0x1A56,0x1A58,
527 	0x1A59,0x1A5A,0x1A5B,0x1A5C,0x1A5D,0x1A5E,0x1A60,0x1A62,
528 	0x1A65,0x1A66,0x1A67,0x1A68,0x1A69,0x1A6A,0x1A6B,0x1A6C,
529 	0x1A73,0x1A74,0x1A75,0x1A76,0x1A77,0x1A78,0x1A79,0x1A7A,
530 	0x1A7B,0x1A7C,0x1A7F,0x1AB0,0x1AB1,0x1AB2,0x1AB3,0x1AB4,
531 	0x1AB5,0x1AB6,0x1AB7,0x1AB8,0x1AB9,0x1ABA,0x1ABB,0x1ABC,
532 	0x1ABD,0x1B00,0x1B01,0x1B02,0x1B03,0x1B34,0x1B36,0x1B37,
533 	0x1B38,0x1B39,0x1B3A,0x1B3C,0x1B42,0x1B6B,0x1B6C,0x1B6D,
534 	0x1B6E,0x1B6F,0x1B70,0x1B71,0x1B72,0x1B73,0x1B80,0x1B81,
535 	0x1BA2,0x1BA3,0x1BA4,0x1BA5,0x1BA8,0x1BA9,0x1BAB,0x1BAC,
536 	0x1BAD,0x1BE6,0x1BE8,0x1BE9,0x1BED,0x1BEF,0x1BF0,0x1BF1,
537 	0x1C2C,0x1C2D,0x1C2E,0x1C2F,0x1C30,0x1C31,0x1C32,0x1C33,
538 	0x1C36,0x1C37,0x1CD0,0x1CD1,0x1CD2,0x1CD4,0x1CD5,0x1CD6,
539 	0x1CD7,0x1CD8,0x1CD9,0x1CDA,0x1CDB,0x1CDC,0x1CDD,0x1CDE,
540 	0x1CDF,0x1CE0,0x1CE2,0x1CE3,0x1CE4,0x1CE5,0x1CE6,0x1CE7,
541 	0x1CE8,0x1CED,0x1CF4,0x1CF8,0x1CF9,0x1DC0,0x1DC1,0x1DC2,
542 	0x1DC3,0x1DC4,0x1DC5,0x1DC6,0x1DC7,0x1DC8,0x1DC9,0x1DCA,
543 	0x1DCB,0x1DCC,0x1DCD,0x1DCE,0x1DCF,0x1DD0,0x1DD1,0x1DD2,
544 	0x1DD3,0x1DD4,0x1DD5,0x1DD6,0x1DD7,0x1DD8,0x1DD9,0x1DDA,
545 	0x1DDB,0x1DDC,0x1DDD,0x1DDE,0x1DDF,0x1DE0,0x1DE1,0x1DE2,
546 	0x1DE3,0x1DE4,0x1DE5,0x1DE6,0x1DE7,0x1DE8,0x1DE9,0x1DEA,
547 	0x1DEB,0x1DEC,0x1DED,0x1DEE,0x1DEF,0x1DF0,0x1DF1,0x1DF2,
548 	0x1DF3,0x1DF4,0x1DF5,0x1DFB,0x1DFC,0x1DFD,0x1DFE,0x1DFF,
549 	0x20D0,0x20D1,0x20D2,0x20D3,0x20D4,0x20D5,0x20D6,0x20D7,
550 	0x20D8,0x20D9,0x20DA,0x20DB,0x20DC,0x20E1,0x20E5,0x20E6,
551 	0x20E7,0x20E8,0x20E9,0x20EA,0x20EB,0x20EC,0x20ED,0x20EE,
552 	0x20EF,0x20F0,0x2CEF,0x2CF0,0x2CF1,0x2D7F,0x2DE0,0x2DE1,
553 	0x2DE2,0x2DE3,0x2DE4,0x2DE5,0x2DE6,0x2DE7,0x2DE8,0x2DE9,
554 	0x2DEA,0x2DEB,0x2DEC,0x2DED,0x2DEE,0x2DEF,0x2DF0,0x2DF1,
555 	0x2DF2,0x2DF3,0x2DF4,0x2DF5,0x2DF6,0x2DF7,0x2DF8,0x2DF9,
556 	0x2DFA,0x2DFB,0x2DFC,0x2DFD,0x2DFE,0x2DFF,0x302A,0x302B,
557 	0x302C,0x302D,0x3099,0x309A,0xA66F,0xA674,0xA675,0xA676,
558 	0xA677,0xA678,0xA679,0xA67A,0xA67B,0xA67C,0xA67D,0xA69E,
559 	0xA69F,0xA6F0,0xA6F1,0xA802,0xA806,0xA80B,0xA825,0xA826,
560 	0xA8C4,0xA8C5,0xA8E0,0xA8E1,0xA8E2,0xA8E3,0xA8E4,0xA8E5,
561 	0xA8E6,0xA8E7,0xA8E8,0xA8E9,0xA8EA,0xA8EB,0xA8EC,0xA8ED,
562 	0xA8EE,0xA8EF,0xA8F0,0xA8F1,0xA926,0xA927,0xA928,0xA929,
563 	0xA92A,0xA92B,0xA92C,0xA92D,0xA947,0xA948,0xA949,0xA94A,
564 	0xA94B,0xA94C,0xA94D,0xA94E,0xA94F,0xA950,0xA951,0xA980,
565 	0xA981,0xA982,0xA9B3,0xA9B6,0xA9B7,0xA9B8,0xA9B9,0xA9BC,
566 	0xA9E5,0xAA29,0xAA2A,0xAA2B,0xAA2C,0xAA2D,0xAA2E,0xAA31,
567 	0xAA32,0xAA35,0xAA36,0xAA43,0xAA4C,0xAA7C,0xAAB0,0xAAB2,
568 	0xAAB3,0xAAB4,0xAAB7,0xAAB8,0xAABE,0xAABF,0xAAC1,0xAAEC,
569 	0xAAED,0xAAF6,0xABE5,0xABE8,0xABED,0xFB1E,0xFE00,0xFE01,
570 	0xFE02,0xFE03,0xFE04,0xFE05,0xFE06,0xFE07,0xFE08,0xFE09,
571 	0xFE0A,0xFE0B,0xFE0C,0xFE0D,0xFE0E,0xFE0F,0xFE20,0xFE21,
572 	0xFE22,0xFE23,0xFE24,0xFE25,0xFE26,0xFE27,0xFE28,0xFE29,
573 	0xFE2A,0xFE2B,0xFE2C,0xFE2D,0xFE2E,0xFE2F,
574 	0x101FD,0x102E0,0x10376,0x10377,0x10378,0x10379,0x1037A,0x10A01,
575 	0x10A02,0x10A03,0x10A05,0x10A06,0x10A0C,0x10A0D,0x10A0E,0x10A0F,
576 	0x10A38,0x10A39,0x10A3A,0x10A3F,0x10AE5,0x10AE6,0x11001,0x11038,
577 	0x11039,0x1103A,0x1103B,0x1103C,0x1103D,0x1103E,0x1103F,0x11040,
578 	0x11041,0x11042,0x11043,0x11044,0x11045,0x11046,0x1107F,0x11080,
579 	0x11081,0x110B3,0x110B4,0x110B5,0x110B6,0x110B9,0x110BA,0x11100,
580 	0x11101,0x11102,0x11127,0x11128,0x11129,0x1112A,0x1112B,0x1112D,
581 	0x1112E,0x1112F,0x11130,0x11131,0x11132,0x11133,0x11134,0x11173,
582 	0x11180,0x11181,0x111B6,0x111B7,0x111B8,0x111B9,0x111BA,0x111BB,
583 	0x111BC,0x111BD,0x111BE,0x111CA,0x111CB,0x111CC,0x1122F,0x11230,
584 	0x11231,0x11234,0x11236,0x11237,0x1123E,0x112DF,0x112E3,0x112E4,
585 	0x112E5,0x112E6,0x112E7,0x112E8,0x112E9,0x112EA,0x11300,0x11301,
586 	0x1133C,0x11340,0x11366,0x11367,0x11368,0x11369,0x1136A,0x1136B,
587 	0x1136C,0x11370,0x11371,0x11372,0x11373,0x11374,0x11438,0x11439,
588 	0x1143A,0x1143B,0x1143C,0x1143D,0x1143E,0x1143F,0x11442,0x11443,
589 	0x11444,0x11446,0x114B3,0x114B4,0x114B5,0x114B6,0x114B7,0x114B8,
590 	0x114BA,0x114BF,0x114C0,0x114C2,0x114C3,0x115B2,0x115B3,0x115B4,
591 	0x115B5,0x115BC,0x115BD,0x115BF,0x115C0,0x115DC,0x115DD,0x11633,
592 	0x11634,0x11635,0x11636,0x11637,0x11638,0x11639,0x1163A,0x1163D,
593 	0x1163F,0x11640,0x116AB,0x116AD,0x116B0,0x116B1,0x116B2,0x116B3,
594 	0x116B4,0x116B5,0x116B7,0x1171D,0x1171E,0x1171F,0x11722,0x11723,
595 	0x11724,0x11725,0x11727,0x11728,0x11729,0x1172A,0x1172B,0x11C30,
596 	0x11C31,0x11C32,0x11C33,0x11C34,0x11C35,0x11C36,0x11C38,0x11C39,
597 	0x11C3A,0x11C3B,0x11C3C,0x11C3D,0x11C3F,0x11C92,0x11C93,0x11C94,
598 	0x11C95,0x11C96,0x11C97,0x11C98,0x11C99,0x11C9A,0x11C9B,0x11C9C,
599 	0x11C9D,0x11C9E,0x11C9F,0x11CA0,0x11CA1,0x11CA2,0x11CA3,0x11CA4,
600 	0x11CA5,0x11CA6,0x11CA7,0x11CAA,0x11CAB,0x11CAC,0x11CAD,0x11CAE,
601 	0x11CAF,0x11CB0,0x11CB2,0x11CB3,0x11CB5,0x11CB6,0x16AF0,0x16AF1,
602 	0x16AF2,0x16AF3,0x16AF4,0x16B30,0x16B31,0x16B32,0x16B33,0x16B34,
603 	0x16B35,0x16B36,0x16F8F,0x16F90,0x16F91,0x16F92,0x1BC9D,0x1BC9E,
604 	0x1D167,0x1D168,0x1D169,0x1D17B,0x1D17C,0x1D17D,0x1D17E,0x1D17F,
605 	0x1D180,0x1D181,0x1D182,0x1D185,0x1D186,0x1D187,0x1D188,0x1D189,
606 	0x1D18A,0x1D18B,0x1D1AA,0x1D1AB,0x1D1AC,0x1D1AD,0x1D242,0x1D243,
607 	0x1D244,0x1DA00,0x1DA01,0x1DA02,0x1DA03,0x1DA04,0x1DA05,0x1DA06,
608 	0x1DA07,0x1DA08,0x1DA09,0x1DA0A,0x1DA0B,0x1DA0C,0x1DA0D,0x1DA0E,
609 	0x1DA0F,0x1DA10,0x1DA11,0x1DA12,0x1DA13,0x1DA14,0x1DA15,0x1DA16,
610 	0x1DA17,0x1DA18,0x1DA19,0x1DA1A,0x1DA1B,0x1DA1C,0x1DA1D,0x1DA1E,
611 	0x1DA1F,0x1DA20,0x1DA21,0x1DA22,0x1DA23,0x1DA24,0x1DA25,0x1DA26,
612 	0x1DA27,0x1DA28,0x1DA29,0x1DA2A,0x1DA2B,0x1DA2C,0x1DA2D,0x1DA2E,
613 	0x1DA2F,0x1DA30,0x1DA31,0x1DA32,0x1DA33,0x1DA34,0x1DA35,0x1DA36,
614 	0x1DA3B,0x1DA3C,0x1DA3D,0x1DA3E,0x1DA3F,0x1DA40,0x1DA41,0x1DA42,
615 	0x1DA43,0x1DA44,0x1DA45,0x1DA46,0x1DA47,0x1DA48,0x1DA49,0x1DA4A,
616 	0x1DA4B,0x1DA4C,0x1DA4D,0x1DA4E,0x1DA4F,0x1DA50,0x1DA51,0x1DA52,
617 	0x1DA53,0x1DA54,0x1DA55,0x1DA56,0x1DA57,0x1DA58,0x1DA59,0x1DA5A,
618 	0x1DA5B,0x1DA5C,0x1DA5D,0x1DA5E,0x1DA5F,0x1DA60,0x1DA61,0x1DA62,
619 	0x1DA63,0x1DA64,0x1DA65,0x1DA66,0x1DA67,0x1DA68,0x1DA69,0x1DA6A,
620 	0x1DA6B,0x1DA6C,0x1DA75,0x1DA84,0x1DA9B,0x1DA9C,0x1DA9D,0x1DA9E,
621 	0x1DA9F,0x1DAA1,0x1DAA2,0x1DAA3,0x1DAA4,0x1DAA5,0x1DAA6,0x1DAA7,
622 	0x1DAA8,0x1DAA9,0x1DAAA,0x1DAAB,0x1DAAC,0x1DAAD,0x1DAAE,0x1DAAF,
623 	0x1E000,0x1E001,0x1E002,0x1E003,0x1E004,0x1E005,0x1E006,0x1E008,
624 	0x1E009,0x1E00A,0x1E00B,0x1E00C,0x1E00D,0x1E00E,0x1E00F,0x1E010,
625 	0x1E011,0x1E012,0x1E013,0x1E014,0x1E015,0x1E016,0x1E017,0x1E018,
626 	0x1E01B,0x1E01C,0x1E01D,0x1E01E,0x1E01F,0x1E020,0x1E021,0x1E023,
627 	0x1E024,0x1E026,0x1E027,0x1E028,0x1E029,0x1E02A,0x1E8D0,0x1E8D1,
628 	0x1E8D2,0x1E8D3,0x1E8D4,0x1E8D5,0x1E8D6,0x1E944,0x1E945,0x1E946,
629 	0x1E947,0x1E948,0x1E949,0x1E94A,0xE0100,0xE0101,0xE0102,0xE0103,
630 	0xE0104,0xE0105,0xE0106,0xE0107,0xE0108,0xE0109,0xE010A,0xE010B,
631 	0xE010C,0xE010D,0xE010E,0xE010F,0xE0110,0xE0111,0xE0112,0xE0113,
632 	0xE0114,0xE0115,0xE0116,0xE0117,0xE0118,0xE0119,0xE011A,0xE011B,
633 	0xE011C,0xE011D,0xE011E,0xE011F,0xE0120,0xE0121,0xE0122,0xE0123,
634 	0xE0124,0xE0125,0xE0126,0xE0127,0xE0128,0xE0129,0xE012A,0xE012B,
635 	0xE012C,0xE012D,0xE012E,0xE012F,0xE0130,0xE0131,0xE0132,0xE0133,
636 	0xE0134,0xE0135,0xE0136,0xE0137,0xE0138,0xE0139,0xE013A,0xE013B,
637 	0xE013C,0xE013D,0xE013E,0xE013F,0xE0140,0xE0141,0xE0142,0xE0143,
638 	0xE0144,0xE0145,0xE0146,0xE0147,0xE0148,0xE0149,0xE014A,0xE014B,
639 	0xE014C,0xE014D,0xE014E,0xE014F,0xE0150,0xE0151,0xE0152,0xE0153,
640 	0xE0154,0xE0155,0xE0156,0xE0157,0xE0158,0xE0159,0xE015A,0xE015B,
641 	0xE015C,0xE015D,0xE015E,0xE015F,0xE0160,0xE0161,0xE0162,0xE0163,
642 	0xE0164,0xE0165,0xE0166,0xE0167,0xE0168,0xE0169,0xE016A,0xE016B,
643 	0xE016C,0xE016D,0xE016E,0xE016F,0xE0170,0xE0171,0xE0172,0xE0173,
644 	0xE0174,0xE0175,0xE0176,0xE0177,0xE0178,0xE0179,0xE017A,0xE017B,
645 	0xE017C,0xE017D,0xE017E,0xE017F,0xE0180,0xE0181,0xE0182,0xE0183,
646 	0xE0184,0xE0185,0xE0186,0xE0187,0xE0188,0xE0189,0xE018A,0xE018B,
647 	0xE018C,0xE018D,0xE018E,0xE018F,0xE0190,0xE0191,0xE0192,0xE0193,
648 	0xE0194,0xE0195,0xE0196,0xE0197,0xE0198,0xE0199,0xE019A,0xE019B,
649 	0xE019C,0xE019D,0xE019E,0xE019F,0xE01A0,0xE01A1,0xE01A2,0xE01A3,
650 	0xE01A4,0xE01A5,0xE01A6,0xE01A7,0xE01A8,0xE01A9,0xE01AA,0xE01AB,
651 	0xE01AC,0xE01AD,0xE01AE,0xE01AF,0xE01B0,0xE01B1,0xE01B2,0xE01B3,
652 	0xE01B4,0xE01B5,0xE01B6,0xE01B7,0xE01B8,0xE01B9,0xE01BA,0xE01BB,
653 	0xE01BC,0xE01BD,0xE01BE,0xE01BF,0xE01C0,0xE01C1,0xE01C2,0xE01C3,
654 	0xE01C4,0xE01C5,0xE01C6,0xE01C7,0xE01C8,0xE01C9,0xE01CA,0xE01CB,
655 	0xE01CC,0xE01CD,0xE01CE,0xE01CF,0xE01D0,0xE01D1,0xE01D2,0xE01D3,
656 	0xE01D4,0xE01D5,0xE01D6,0xE01D7,0xE01D8,0xE01D9,0xE01DA,0xE01DB,
657 	0xE01DC,0xE01DD,0xE01DE,0xE01DF,0xE01E0,0xE01E1,0xE01E2,0xE01E3,
658 	0xE01E4,0xE01E5,0xE01E6,0xE01E7,0xE01E8,0xE01E9,0xE01EA,0xE01EB,
659 	0xE01EC,0xE01ED,0xE01EE,0xE01EF,
660 };
661 
662 /// The length of the combining characters list.
663 const size_t bc_history_combo_chars_len =
664 	sizeof(bc_history_combo_chars) / sizeof(bc_history_combo_chars[0]);
665 #endif // BC_ENABLE_HISTORY
666 
667 /// The human-readable name of the main function in bc source code.
668 const char bc_func_main[] = "(main)";
669 
670 /// The human-readable name of the read function in bc source code.
671 const char bc_func_read[] = "(read)";
672 
673 #if BC_DEBUG_CODE
674 
675 /// A list of names of instructions for easy debugging output.
676 const char* bc_inst_names[] = {
677 
678 #if BC_ENABLED
679 	"BC_INST_INC",
680 	"BC_INST_DEC",
681 #endif // BC_ENABLED
682 
683 	"BC_INST_NEG",
684 	"BC_INST_BOOL_NOT",
685 #if BC_ENABLE_EXTRA_MATH
686 	"BC_INST_TRUNC",
687 #endif // BC_ENABLE_EXTRA_MATH
688 
689 	"BC_INST_POWER",
690 	"BC_INST_MULTIPLY",
691 	"BC_INST_DIVIDE",
692 	"BC_INST_MODULUS",
693 	"BC_INST_PLUS",
694 	"BC_INST_MINUS",
695 
696 #if BC_ENABLE_EXTRA_MATH
697 	"BC_INST_PLACES",
698 
699 	"BC_INST_LSHIFT",
700 	"BC_INST_RSHIFT",
701 #endif // BC_ENABLE_EXTRA_MATH
702 
703 	"BC_INST_REL_EQ",
704 	"BC_INST_REL_LE",
705 	"BC_INST_REL_GE",
706 	"BC_INST_REL_NE",
707 	"BC_INST_REL_LT",
708 	"BC_INST_REL_GT",
709 
710 	"BC_INST_BOOL_OR",
711 	"BC_INST_BOOL_AND",
712 
713 #if BC_ENABLED
714 	"BC_INST_ASSIGN_POWER",
715 	"BC_INST_ASSIGN_MULTIPLY",
716 	"BC_INST_ASSIGN_DIVIDE",
717 	"BC_INST_ASSIGN_MODULUS",
718 	"BC_INST_ASSIGN_PLUS",
719 	"BC_INST_ASSIGN_MINUS",
720 #if BC_ENABLE_EXTRA_MATH
721 	"BC_INST_ASSIGN_PLACES",
722 	"BC_INST_ASSIGN_LSHIFT",
723 	"BC_INST_ASSIGN_RSHIFT",
724 #endif // BC_ENABLE_EXTRA_MATH
725 	"BC_INST_ASSIGN",
726 
727 	"BC_INST_ASSIGN_POWER_NO_VAL",
728 	"BC_INST_ASSIGN_MULTIPLY_NO_VAL",
729 	"BC_INST_ASSIGN_DIVIDE_NO_VAL",
730 	"BC_INST_ASSIGN_MODULUS_NO_VAL",
731 	"BC_INST_ASSIGN_PLUS_NO_VAL",
732 	"BC_INST_ASSIGN_MINUS_NO_VAL",
733 #if BC_ENABLE_EXTRA_MATH
734 	"BC_INST_ASSIGN_PLACES_NO_VAL",
735 	"BC_INST_ASSIGN_LSHIFT_NO_VAL",
736 	"BC_INST_ASSIGN_RSHIFT_NO_VAL",
737 #endif // BC_ENABLE_EXTRA_MATH
738 #endif // BC_ENABLED
739 	"BC_INST_ASSIGN_NO_VAL",
740 
741 	"BC_INST_NUM",
742 	"BC_INST_VAR",
743 	"BC_INST_ARRAY_ELEM",
744 	"BC_INST_ARRAY",
745 
746 	"BC_INST_ZERO",
747 	"BC_INST_ONE",
748 
749 #if BC_ENABLED
750 	"BC_INST_LAST",
751 #endif // BC_ENABLED
752 	"BC_INST_IBASE",
753 	"BC_INST_OBASE",
754 	"BC_INST_SCALE",
755 #if BC_ENABLE_EXTRA_MATH
756 	"BC_INST_SEED",
757 #endif // BC_ENABLE_EXTRA_MATH
758 	"BC_INST_LENGTH",
759 	"BC_INST_SCALE_FUNC",
760 	"BC_INST_SQRT",
761 	"BC_INST_ABS",
762 #if BC_ENABLE_EXTRA_MATH
763 	"BC_INST_IRAND",
764 #endif // BC_ENABLE_EXTRA_MATH
765 	"BC_INST_ASCIIFY",
766 	"BC_INST_READ",
767 #if BC_ENABLE_EXTRA_MATH
768 	"BC_INST_RAND",
769 #endif // BC_ENABLE_EXTRA_MATH
770 	"BC_INST_MAXIBASE",
771 	"BC_INST_MAXOBASE",
772 	"BC_INST_MAXSCALE",
773 #if BC_ENABLE_EXTRA_MATH
774 	"BC_INST_MAXRAND",
775 #endif // BC_ENABLE_EXTRA_MATH
776 
777 	"BC_INST_PRINT",
778 	"BC_INST_PRINT_POP",
779 	"BC_INST_STR",
780 #if BC_ENABLED
781 	"BC_INST_PRINT_STR",
782 
783 	"BC_INST_JUMP",
784 	"BC_INST_JUMP_ZERO",
785 
786 	"BC_INST_CALL",
787 
788 	"BC_INST_RET",
789 	"BC_INST_RET0",
790 	"BC_INST_RET_VOID",
791 
792 	"BC_INST_HALT",
793 #endif // BC_ENABLED
794 
795 	"BC_INST_POP",
796 	"BC_INST_SWAP",
797 	"BC_INST_MODEXP",
798 	"BC_INST_DIVMOD",
799 	"BC_INST_PRINT_STREAM",
800 
801 #if DC_ENABLED
802 	"BC_INST_POP_EXEC",
803 
804 	"BC_INST_EXECUTE",
805 	"BC_INST_EXEC_COND",
806 
807 	"BC_INST_PRINT_STACK",
808 	"BC_INST_CLEAR_STACK",
809 	"BC_INST_REG_STACK_LEN",
810 	"BC_INST_STACK_LEN",
811 	"BC_INST_DUPLICATE",
812 
813 	"BC_INST_LOAD",
814 	"BC_INST_PUSH_VAR",
815 	"BC_INST_PUSH_TO_VAR",
816 
817 	"BC_INST_QUIT",
818 	"BC_INST_NQUIT",
819 
820 	"BC_INST_EXEC_STACK_LEN",
821 #endif // DC_ENABLED
822 
823 	"BC_INST_INVALID",
824 };
825 
826 #endif // BC_DEBUG_CODE
827 
828 /// A constant string for 0.
829 const char bc_parse_zero[2] = "0";
830 
831 /// A constant string for 1.
832 const char bc_parse_one[2] = "1";
833 
834 #if BC_ENABLED
835 
836 /// A list of keywords for bc. This needs to be updated if keywords change.
837 const BcLexKeyword bc_lex_kws[] = {
838 	BC_LEX_KW_ENTRY("auto", 4, true),
839 	BC_LEX_KW_ENTRY("break", 5, true),
840 	BC_LEX_KW_ENTRY("continue", 8, false),
841 	BC_LEX_KW_ENTRY("define", 6, true),
842 	BC_LEX_KW_ENTRY("for", 3, true),
843 	BC_LEX_KW_ENTRY("if", 2, true),
844 	BC_LEX_KW_ENTRY("limits", 6, false),
845 	BC_LEX_KW_ENTRY("return", 6, true),
846 	BC_LEX_KW_ENTRY("while", 5, true),
847 	BC_LEX_KW_ENTRY("halt", 4, false),
848 	BC_LEX_KW_ENTRY("last", 4, false),
849 	BC_LEX_KW_ENTRY("ibase", 5, true),
850 	BC_LEX_KW_ENTRY("obase", 5, true),
851 	BC_LEX_KW_ENTRY("scale", 5, true),
852 #if BC_ENABLE_EXTRA_MATH
853 	BC_LEX_KW_ENTRY("seed", 4, false),
854 #endif // BC_ENABLE_EXTRA_MATH
855 	BC_LEX_KW_ENTRY("length", 6, true),
856 	BC_LEX_KW_ENTRY("print", 5, false),
857 	BC_LEX_KW_ENTRY("sqrt", 4, true),
858 	BC_LEX_KW_ENTRY("abs", 3, false),
859 #if BC_ENABLE_EXTRA_MATH
860 	BC_LEX_KW_ENTRY("irand", 5, false),
861 #endif // BC_ENABLE_EXTRA_MATH
862 	BC_LEX_KW_ENTRY("asciify", 7, false),
863 	BC_LEX_KW_ENTRY("modexp", 6, false),
864 	BC_LEX_KW_ENTRY("divmod", 6, false),
865 	BC_LEX_KW_ENTRY("quit", 4, true),
866 	BC_LEX_KW_ENTRY("read", 4, false),
867 #if BC_ENABLE_EXTRA_MATH
868 	BC_LEX_KW_ENTRY("rand", 4, false),
869 #endif // BC_ENABLE_EXTRA_MATH
870 	BC_LEX_KW_ENTRY("maxibase", 8, false),
871 	BC_LEX_KW_ENTRY("maxobase", 8, false),
872 	BC_LEX_KW_ENTRY("maxscale", 8, false),
873 #if BC_ENABLE_EXTRA_MATH
874 	BC_LEX_KW_ENTRY("maxrand", 7, false),
875 #endif // BC_ENABLE_EXTRA_MATH
876 	BC_LEX_KW_ENTRY("stream", 6, false),
877 	BC_LEX_KW_ENTRY("else", 4, false),
878 };
879 
880 /// The length of the list of bc keywords.
881 const size_t bc_lex_kws_len = sizeof(bc_lex_kws) / sizeof(BcLexKeyword);
882 
883 #if BC_C11
884 
885 // This is here to ensure that BC_LEX_NKWS, which is needed for the
886 // redefined_kws in BcVm, is correct. If it's correct under C11, it will be
887 // correct under C99, and I did not know any other way of ensuring they remained
888 // synchronized.
889 static_assert(sizeof(bc_lex_kws) / sizeof(BcLexKeyword) == BC_LEX_NKWS,
890               "BC_LEX_NKWS is wrong.");
891 
892 #endif // BC_C11
893 
894 /// An array of booleans that correspond to token types. An entry is true if the
895 /// token is valid in an expression, false otherwise. This will need to change
896 /// if tokens change.
897 const uint8_t bc_parse_exprs[] = {
898 
899 	// Starts with BC_LEX_EOF.
900 	BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),
901 
902 	// Starts with BC_LEX_OP_MULTIPLY if extra math is enabled, BC_LEX_OP_DIVIDE
903 	// otherwise.
904 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
905 
906 	// Starts with BC_LEX_OP_REL_EQ if extra math is enabled, BC_LEX_OP_REL_LT
907 	// otherwise.
908 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
909 
910 #if BC_ENABLE_EXTRA_MATH
911 
912 	// Starts with BC_LEX_OP_ASSIGN_POWER.
913 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
914 
915 	// Starts with BC_LEX_OP_ASSIGN_RSHIFT.
916 	BC_PARSE_EXPR_ENTRY(true, true, false, false, true, true, false, false),
917 
918 	// Starts with BC_LEX_RBRACKET.
919 	BC_PARSE_EXPR_ENTRY(false, false, false, false, true, true, true, false),
920 
921 	// Starts with BC_LEX_KW_BREAK.
922 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false),
923 
924 	// Starts with BC_LEX_KW_HALT.
925 	BC_PARSE_EXPR_ENTRY(false, true, true, true, true, true, true, false),
926 
927 	// Starts with BC_LEX_KW_SQRT.
928 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, false, true),
929 
930 	// Starts with BC_LEX_KW_MAXIBASE.
931 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, false, false, 0)
932 
933 #else // BC_ENABLE_EXTRA_MATH
934 
935 	// Starts with BC_LEX_OP_ASSIGN_PLUS.
936 	BC_PARSE_EXPR_ENTRY(true, true, true, false, false, true, true, false),
937 
938 	// Starts with BC_LEX_COMMA.
939 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, true, true, true),
940 
941 	// Starts with BC_LEX_KW_AUTO.
942 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false),
943 
944 	// Starts with BC_LEX_KW_WHILE.
945 	BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, false),
946 
947 	// Starts with BC_LEX_KW_SQRT.
948 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, false, true, true),
949 
950 	// Starts with BC_LEX_KW_MAXSCALE,
951 	BC_PARSE_EXPR_ENTRY(true, true, false, false, 0, 0, 0, 0)
952 
953 #endif // BC_ENABLE_EXTRA_MATH
954 };
955 
956 /// An array of data for operators that correspond to token types.
957 const uchar bc_parse_ops[] = {
958 	BC_PARSE_OP(0, false), BC_PARSE_OP(0, false),
959 	BC_PARSE_OP(1, false), BC_PARSE_OP(1, false),
960 #if BC_ENABLE_EXTRA_MATH
961 	BC_PARSE_OP(2, false),
962 #endif // BC_ENABLE_EXTRA_MATH
963 	BC_PARSE_OP(4, false),
964 	BC_PARSE_OP(5, true), BC_PARSE_OP(5, true), BC_PARSE_OP(5, true),
965 	BC_PARSE_OP(6, true), BC_PARSE_OP(6, true),
966 #if BC_ENABLE_EXTRA_MATH
967 	BC_PARSE_OP(3, false),
968 	BC_PARSE_OP(7, true), BC_PARSE_OP(7, true),
969 #endif // BC_ENABLE_EXTRA_MATH
970 	BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true),
971 	BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true),
972 	BC_PARSE_OP(11, true), BC_PARSE_OP(10, true),
973 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
974 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
975 #if BC_ENABLE_EXTRA_MATH
976 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
977 #endif // BC_ENABLE_EXTRA_MATH
978 	BC_PARSE_OP(8, false),
979 };
980 
981 // These identify what tokens can come after expressions in certain cases.
982 
983 /// The valid next tokens for normal expressions.
984 const BcParseNext bc_parse_next_expr =
985 	BC_PARSE_NEXT(4, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_RBRACE, BC_LEX_EOF);
986 
987 /// The valid next tokens for function argument expressions.
988 const BcParseNext bc_parse_next_arg =
989 	BC_PARSE_NEXT(2, BC_LEX_RPAREN, BC_LEX_COMMA);
990 
991 /// The valid next tokens for expressions in print statements.
992 const BcParseNext bc_parse_next_print =
993 	BC_PARSE_NEXT(4, BC_LEX_COMMA, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_EOF);
994 
995 /// The valid next tokens for if statement conditions or loop conditions. This
996 /// is used in for loops for the update expression and for builtin function.
997 ///
998 /// The name is an artifact of history, and is related to @a BC_PARSE_REL (see
999 /// include/parse.h). It refers to how POSIX only allows some operators as part
1000 /// of the conditional of for loops, while loops, and if statements.
1001 const BcParseNext bc_parse_next_rel = BC_PARSE_NEXT(1, BC_LEX_RPAREN);
1002 
1003 /// The valid next tokens for array element expressions.
1004 const BcParseNext bc_parse_next_elem = BC_PARSE_NEXT(1, BC_LEX_RBRACKET);
1005 
1006 /// The valid next tokens for for loop initialization expressions and condition
1007 /// expressions.
1008 const BcParseNext bc_parse_next_for = BC_PARSE_NEXT(1, BC_LEX_SCOLON);
1009 
1010 /// The valid next tokens for read expressions.
1011 const BcParseNext bc_parse_next_read =
1012 	BC_PARSE_NEXT(2, BC_LEX_NLINE, BC_LEX_EOF);
1013 
1014 /// The valid next tokens for the arguments of a builtin function with multiple
1015 /// arguments.
1016 const BcParseNext bc_parse_next_builtin = BC_PARSE_NEXT(1, BC_LEX_COMMA);
1017 
1018 #endif // BC_ENABLED
1019 
1020 #if DC_ENABLED
1021 
1022 /// A list of instructions that need register arguments in dc.
1023 const uint8_t dc_lex_regs[] = {
1024 	BC_LEX_OP_REL_EQ, BC_LEX_OP_REL_LE, BC_LEX_OP_REL_GE, BC_LEX_OP_REL_NE,
1025 	BC_LEX_OP_REL_LT, BC_LEX_OP_REL_GT, BC_LEX_SCOLON, BC_LEX_COLON,
1026 	BC_LEX_KW_ELSE, BC_LEX_LOAD, BC_LEX_LOAD_POP, BC_LEX_OP_ASSIGN,
1027 	BC_LEX_STORE_PUSH, BC_LEX_REG_STACK_LEVEL, BC_LEX_ARRAY_LENGTH,
1028 };
1029 
1030 /// The length of the list of register instructions.
1031 const size_t dc_lex_regs_len = sizeof(dc_lex_regs) / sizeof(uint8_t);
1032 
1033 /// A list corresponding to characters starting at double quote ("). If an entry
1034 /// is BC_LEX_INVALID, then that character needs extra lexing in dc. If it does
1035 /// not, the character can trivially be replaced by the entry. Positions are
1036 /// kept because it corresponds to the ASCII table. This may need to be changed
1037 /// if tokens change.
1038 const uchar dc_lex_tokens[] = {
1039 #if BC_ENABLE_EXTRA_MATH
1040 	BC_LEX_KW_IRAND,
1041 #else // BC_ENABLE_EXTRA_MATH
1042 	BC_LEX_INVALID,
1043 #endif // BC_ENABLE_EXTRA_MATH
1044 	BC_LEX_INVALID,
1045 #if BC_ENABLE_EXTRA_MATH
1046 	BC_LEX_OP_TRUNC,
1047 #else // BC_ENABLE_EXTRA_MATH
1048 	BC_LEX_INVALID,
1049 #endif // BC_ENABLE_EXTRA_MATH
1050 	BC_LEX_OP_MODULUS, BC_LEX_INVALID,
1051 #if BC_ENABLE_EXTRA_MATH
1052 	BC_LEX_KW_RAND,
1053 #else // BC_ENABLE_EXTRA_MATH
1054 	BC_LEX_INVALID,
1055 #endif // BC_ENABLE_EXTRA_MATH
1056 	BC_LEX_LPAREN, BC_LEX_RPAREN, BC_LEX_OP_MULTIPLY, BC_LEX_OP_PLUS,
1057 	BC_LEX_EXEC_STACK_LENGTH, BC_LEX_OP_MINUS, BC_LEX_INVALID, BC_LEX_OP_DIVIDE,
1058 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1059 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1060 	BC_LEX_INVALID, BC_LEX_INVALID,
1061 	BC_LEX_COLON, BC_LEX_SCOLON, BC_LEX_OP_REL_GT, BC_LEX_OP_REL_EQ,
1062 	BC_LEX_OP_REL_LT, BC_LEX_KW_READ,
1063 #if BC_ENABLE_EXTRA_MATH
1064 	BC_LEX_OP_PLACES,
1065 #else // BC_ENABLE_EXTRA_MATH
1066 	BC_LEX_INVALID,
1067 #endif // BC_ENABLE_EXTRA_MATH
1068 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1069 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_EQ_NO_REG,
1070 #if BC_ENABLE_EXTRA_MATH
1071 	BC_LEX_OP_LSHIFT,
1072 #else // BC_ENABLE_EXTRA_MATH
1073 	BC_LEX_INVALID,
1074 #endif // BC_ENABLE_EXTRA_MATH
1075 	BC_LEX_KW_IBASE,
1076 #if BC_ENABLE_EXTRA_MATH
1077 	BC_LEX_KW_SEED,
1078 #else // BC_ENABLE_EXTRA_MATH
1079 	BC_LEX_INVALID,
1080 #endif // BC_ENABLE_EXTRA_MATH
1081 	BC_LEX_KW_SCALE, BC_LEX_LOAD_POP, BC_LEX_OP_BOOL_AND, BC_LEX_OP_BOOL_NOT,
1082 	BC_LEX_KW_OBASE, BC_LEX_KW_STREAM, BC_LEX_NQUIT, BC_LEX_POP,
1083 	BC_LEX_STORE_PUSH, BC_LEX_KW_MAXIBASE, BC_LEX_KW_MAXOBASE,
1084 	BC_LEX_KW_MAXSCALE,
1085 #if BC_ENABLE_EXTRA_MATH
1086 	BC_LEX_KW_MAXRAND,
1087 #else // BC_ENABLE_EXTRA_MATH
1088 	BC_LEX_INVALID,
1089 #endif // BC_ENABLE_EXTRA_MATH
1090 	BC_LEX_SCALE_FACTOR, BC_LEX_ARRAY_LENGTH, BC_LEX_KW_LENGTH,
1091 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
1092 	BC_LEX_OP_POWER, BC_LEX_NEG, BC_LEX_INVALID,
1093 	BC_LEX_KW_ASCIIFY, BC_LEX_KW_ABS, BC_LEX_CLEAR_STACK, BC_LEX_DUPLICATE,
1094 	BC_LEX_KW_ELSE, BC_LEX_PRINT_STACK, BC_LEX_INVALID,
1095 #if BC_ENABLE_EXTRA_MATH
1096 	BC_LEX_OP_RSHIFT,
1097 #else // BC_ENABLE_EXTRA_MATH
1098 	BC_LEX_INVALID,
1099 #endif // BC_ENABLE_EXTRA_MATH
1100 	BC_LEX_STORE_IBASE,
1101 #if BC_ENABLE_EXTRA_MATH
1102 	BC_LEX_STORE_SEED,
1103 #else // BC_ENABLE_EXTRA_MATH
1104 	BC_LEX_INVALID,
1105 #endif // BC_ENABLE_EXTRA_MATH
1106 	BC_LEX_STORE_SCALE, BC_LEX_LOAD,
1107 	BC_LEX_OP_BOOL_OR, BC_LEX_PRINT_POP, BC_LEX_STORE_OBASE, BC_LEX_KW_PRINT,
1108 	BC_LEX_KW_QUIT, BC_LEX_SWAP, BC_LEX_OP_ASSIGN, BC_LEX_INVALID,
1109 	BC_LEX_INVALID, BC_LEX_KW_SQRT, BC_LEX_INVALID, BC_LEX_EXECUTE,
1110 	BC_LEX_REG_STACK_LEVEL, BC_LEX_STACK_LEVEL,
1111 	BC_LEX_LBRACE, BC_LEX_KW_MODEXP, BC_LEX_RBRACE, BC_LEX_KW_DIVMOD,
1112 	BC_LEX_INVALID
1113 };
1114 
1115 /// A list of instructions that correspond to lex tokens. If an entry is
1116 /// BC_INST_INVALID, that lex token needs extra parsing in the dc parser.
1117 /// Otherwise, the token can trivially be replaced by the entry. This needs to
1118 /// be updated if the tokens change.
1119 const uchar dc_parse_insts[] = {
1120 	BC_INST_INVALID, BC_INST_INVALID,
1121 #if BC_ENABLED
1122 	BC_INST_INVALID, BC_INST_INVALID,
1123 #endif // BC_ENABLED
1124 	BC_INST_INVALID, BC_INST_BOOL_NOT,
1125 #if BC_ENABLE_EXTRA_MATH
1126 	BC_INST_TRUNC,
1127 #endif // BC_ENABLE_EXTRA_MATH
1128 	BC_INST_POWER, BC_INST_MULTIPLY, BC_INST_DIVIDE, BC_INST_MODULUS,
1129 	BC_INST_PLUS, BC_INST_MINUS,
1130 #if BC_ENABLE_EXTRA_MATH
1131 	BC_INST_PLACES,
1132 	BC_INST_LSHIFT, BC_INST_RSHIFT,
1133 #endif // BC_ENABLE_EXTRA_MATH
1134 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1135 	BC_INST_INVALID, BC_INST_INVALID,
1136 	BC_INST_BOOL_OR, BC_INST_BOOL_AND,
1137 #if BC_ENABLED
1138 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1139 	BC_INST_INVALID, BC_INST_INVALID,
1140 #if BC_ENABLE_EXTRA_MATH
1141 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1142 #endif // BC_ENABLE_EXTRA_MATH
1143 #endif // BC_ENABLED
1144 	BC_INST_INVALID,
1145 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GT, BC_INST_REL_LT,
1146 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GE,
1147 	BC_INST_INVALID, BC_INST_REL_LE,
1148 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1149 #if BC_ENABLED
1150 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1151 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1152 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1153 #endif // BC_ENABLED
1154 	BC_INST_IBASE, BC_INST_OBASE, BC_INST_SCALE,
1155 #if BC_ENABLE_EXTRA_MATH
1156 	BC_INST_SEED,
1157 #endif // BC_ENABLE_EXTRA_MATH
1158 	BC_INST_LENGTH, BC_INST_PRINT,
1159 	BC_INST_SQRT, BC_INST_ABS,
1160 #if BC_ENABLE_EXTRA_MATH
1161 	BC_INST_IRAND,
1162 #endif // BC_ENABLE_EXTRA_MATH
1163 	BC_INST_ASCIIFY, BC_INST_MODEXP, BC_INST_DIVMOD,
1164 	BC_INST_QUIT, BC_INST_INVALID,
1165 #if BC_ENABLE_EXTRA_MATH
1166 	BC_INST_RAND,
1167 #endif // BC_ENABLE_EXTRA_MATH
1168 	BC_INST_MAXIBASE,
1169 	BC_INST_MAXOBASE, BC_INST_MAXSCALE,
1170 #if BC_ENABLE_EXTRA_MATH
1171 	BC_INST_MAXRAND,
1172 #endif // BC_ENABLE_EXTRA_MATH
1173 	BC_INST_PRINT_STREAM, BC_INST_INVALID,
1174 	BC_INST_REL_EQ, BC_INST_INVALID,
1175 	BC_INST_EXECUTE, BC_INST_PRINT_STACK, BC_INST_CLEAR_STACK,
1176 	BC_INST_INVALID, BC_INST_STACK_LEN, BC_INST_DUPLICATE, BC_INST_SWAP,
1177 	BC_INST_POP,
1178 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1179 #if BC_ENABLE_EXTRA_MATH
1180 	BC_INST_INVALID,
1181 #endif // BC_ENABLE_EXTRA_MATH
1182 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
1183 	BC_INST_PRINT_POP, BC_INST_NQUIT, BC_INST_EXEC_STACK_LEN,
1184 	BC_INST_SCALE_FUNC, BC_INST_INVALID,
1185 };
1186 #endif // DC_ENABLED
1187 
1188 #endif // !BC_ENABLE_LIBRARY
1189 
1190 #if BC_ENABLE_EXTRA_MATH
1191 
1192 /// A constant for the rand multiplier.
1193 const BcRandState bc_rand_multiplier = BC_RAND_MULTIPLIER;
1194 
1195 #endif // BC_ENABLE_EXTRA_MATH
1196 
1197 #if BC_LONG_BIT >= 64
1198 
1199 /// A constant array for the max of a bigdig number as a BcDig array.
1200 const BcDig bc_num_bigdigMax[] = {
1201 	709551616U,
1202 	446744073U,
1203 	18U,
1204 };
1205 
1206 /// A constant array for the max of 2 times a bigdig number as a BcDig array.
1207 const BcDig bc_num_bigdigMax2[] = {
1208 	768211456U,
1209 	374607431U,
1210 	938463463U,
1211 	282366920U,
1212 	340U,
1213 };
1214 
1215 #else // BC_LONG_BIT >= 64
1216 
1217 /// A constant array for the max of a bigdig number as a BcDig array.
1218 const BcDig bc_num_bigdigMax[] = {
1219 	7296U,
1220 	9496U,
1221 	42U,
1222 };
1223 
1224 /// A constant array for the max of 2 times a bigdig number as a BcDig array.
1225 const BcDig bc_num_bigdigMax2[] = {
1226 	1616U,
1227 	955U,
1228 	737U,
1229 	6744U,
1230 	1844U,
1231 };
1232 
1233 #endif // BC_LONG_BIT >= 64
1234 
1235 /// The size of the bigdig max array.
1236 const size_t bc_num_bigdigMax_size = sizeof(bc_num_bigdigMax) / sizeof(BcDig);
1237 
1238 /// The size of the bigdig max times 2 array.
1239 const size_t bc_num_bigdigMax2_size = sizeof(bc_num_bigdigMax2) / sizeof(BcDig);
1240 
1241 /// A string of digits for easy conversion from characters to digits.
1242 const char bc_num_hex_digits[] = "0123456789ABCDEF";
1243 
1244 /// An array for easy conversion from exponent to power of 10.
1245 const BcBigDig bc_num_pow10[BC_BASE_DIGS + 1] = {
1246 	1,
1247 	10,
1248 	100,
1249 	1000,
1250 	10000,
1251 #if BC_BASE_DIGS > 4
1252 	100000,
1253 	1000000,
1254 	10000000,
1255 	100000000,
1256 	1000000000,
1257 #endif // BC_BASE_DIGS > 4
1258 };
1259 
1260 #if !BC_ENABLE_LIBRARY
1261 
1262 /// An array of functions for binary operators corresponding to the order of
1263 /// the instructions for the operators.
1264 const BcNumBinaryOp bc_program_ops[] = {
1265 	bc_num_pow, bc_num_mul, bc_num_div, bc_num_mod, bc_num_add, bc_num_sub,
1266 #if BC_ENABLE_EXTRA_MATH
1267 	bc_num_places, bc_num_lshift, bc_num_rshift,
1268 #endif // BC_ENABLE_EXTRA_MATH
1269 };
1270 
1271 /// An array of functions for binary operators allocation requests corresponding
1272 /// to the order of the instructions for the operators.
1273 const BcNumBinaryOpReq bc_program_opReqs[] = {
1274 	bc_num_powReq, bc_num_mulReq, bc_num_divReq, bc_num_divReq,
1275 	bc_num_addReq, bc_num_addReq,
1276 #if BC_ENABLE_EXTRA_MATH
1277 	bc_num_placesReq, bc_num_placesReq, bc_num_placesReq,
1278 #endif // BC_ENABLE_EXTRA_MATH
1279 };
1280 
1281 /// An array of unary operator functions corresponding to the order of the
1282 /// instructions.
1283 const BcProgramUnary bc_program_unarys[] = {
1284 	bc_program_negate, bc_program_not,
1285 #if BC_ENABLE_EXTRA_MATH
1286 	bc_program_trunc,
1287 #endif // BC_ENABLE_EXTRA_MATH
1288 };
1289 
1290 /// A filename for when parsing expressions.
1291 const char bc_program_exprs_name[] = "<exprs>";
1292 
1293 /// A filename for when parsing stdin..
1294 const char bc_program_stdin_name[] = "<stdin>";
1295 
1296 /// A ready message for SIGINT catching.
1297 const char bc_program_ready_msg[] = "ready for more input\n";
1298 
1299 /// The length of the ready message.
1300 const size_t bc_program_ready_msg_len = sizeof(bc_program_ready_msg) - 1;
1301 
1302 /// A list of escape characters that a print statement should treat specially.
1303 const char bc_program_esc_chars[] = "ab\\efnqrt";
1304 
1305 /// A list of characters corresponding to the escape characters above.
1306 const char bc_program_esc_seqs[] = "\a\b\\\\\f\n\"\r\t";
1307 
1308 #endif // !BC_ENABLE_LIBRARY
1309