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