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