xref: /freebsd/contrib/bc/src/data.c (revision 2938ecc85c29202824e83d65af5c3a4fb7b3e5fb)
1 /*
2  * *****************************************************************************
3  *
4  * Copyright (c) 2018-2020 Gavin D. Howard and contributors.
5  *
6  * All rights reserved.
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_ONE",
592 
593 #if BC_ENABLED
594 	"BC_INST_LAST",
595 #endif // BC_ENABLED
596 	"BC_INST_IBASE",
597 	"BC_INST_OBASE",
598 	"BC_INST_SCALE",
599 #if BC_ENABLE_EXTRA_MATH
600 	"BC_INST_SEED",
601 #endif // BC_ENABLE_EXTRA_MATH
602 	"BC_INST_LENGTH",
603 	"BC_INST_SCALE_FUNC",
604 	"BC_INST_SQRT",
605 	"BC_INST_ABS",
606 #if BC_ENABLE_EXTRA_MATH
607 	"BC_INST_IRAND",
608 #endif // BC_ENABLE_EXTRA_MATH
609 	"BC_INST_READ",
610 #if BC_ENABLE_EXTRA_MATH
611 	"BC_INST_RAND",
612 #endif // BC_ENABLE_EXTRA_MATH
613 	"BC_INST_MAXIBASE",
614 	"BC_INST_MAXOBASE",
615 	"BC_INST_MAXSCALE",
616 #if BC_ENABLE_EXTRA_MATH
617 	"BC_INST_MAXRAND",
618 #endif // BC_ENABLE_EXTRA_MATH
619 
620 	"BC_INST_PRINT",
621 	"BC_INST_PRINT_POP",
622 	"BC_INST_STR",
623 	"BC_INST_PRINT_STR",
624 
625 #if BC_ENABLED
626 	"BC_INST_JUMP",
627 	"BC_INST_JUMP_ZERO",
628 
629 	"BC_INST_CALL",
630 
631 	"BC_INST_RET",
632 	"BC_INST_RET0",
633 	"BC_INST_RET_VOID",
634 
635 	"BC_INST_HALT",
636 #endif // BC_ENABLED
637 
638 #if DC_ENABLED
639 	"BC_INST_POP",
640 	"BC_INST_POP_EXEC",
641 	"BC_INST_MODEXP",
642 	"BC_INST_DIVMOD",
643 
644 	"BC_INST_EXECUTE",
645 	"BC_INST_EXEC_COND",
646 
647 	"BC_INST_ASCIIFY",
648 	"BC_INST_PRINT_STREAM",
649 
650 	"BC_INST_PRINT_STACK",
651 	"BC_INST_CLEAR_STACK",
652 	"BC_INST_STACK_LEN",
653 	"BC_INST_DUPLICATE",
654 	"BC_INST_SWAP",
655 
656 	"BC_INST_LOAD",
657 	"BC_INST_PUSH_VAR",
658 	"BC_INST_PUSH_TO_VAR",
659 
660 	"BC_INST_QUIT",
661 	"BC_INST_NQUIT",
662 #endif // DC_ENABLED
663 };
664 #endif // BC_DEBUG_CODE
665 
666 #if BC_ENABLE_EXTRA_MATH
667 
668 const BcRandState bc_rand_multiplier = BC_RAND_MULTIPLIER;
669 
670 #endif // BC_ENABLE_EXTRA_MATH
671 
672 #if BC_ENABLED
673 const BcLexKeyword bc_lex_kws[] = {
674 	BC_LEX_KW_ENTRY("auto", 4, true),
675 	BC_LEX_KW_ENTRY("break", 5, true),
676 	BC_LEX_KW_ENTRY("continue", 8, false),
677 	BC_LEX_KW_ENTRY("define", 6, true),
678 	BC_LEX_KW_ENTRY("for", 3, true),
679 	BC_LEX_KW_ENTRY("if", 2, true),
680 	BC_LEX_KW_ENTRY("limits", 6, false),
681 	BC_LEX_KW_ENTRY("return", 6, true),
682 	BC_LEX_KW_ENTRY("while", 5, true),
683 	BC_LEX_KW_ENTRY("halt", 4, false),
684 	BC_LEX_KW_ENTRY("last", 4, false),
685 	BC_LEX_KW_ENTRY("ibase", 5, true),
686 	BC_LEX_KW_ENTRY("obase", 5, true),
687 	BC_LEX_KW_ENTRY("scale", 5, true),
688 #if BC_ENABLE_EXTRA_MATH
689 	BC_LEX_KW_ENTRY("seed", 4, false),
690 #endif // BC_ENABLE_EXTRA_MATH
691 	BC_LEX_KW_ENTRY("length", 6, true),
692 	BC_LEX_KW_ENTRY("print", 5, false),
693 	BC_LEX_KW_ENTRY("sqrt", 4, true),
694 	BC_LEX_KW_ENTRY("abs", 3, false),
695 #if BC_ENABLE_EXTRA_MATH
696 	BC_LEX_KW_ENTRY("irand", 5, false),
697 #endif // BC_ENABLE_EXTRA_MATH
698 	BC_LEX_KW_ENTRY("quit", 4, true),
699 	BC_LEX_KW_ENTRY("read", 4, false),
700 #if BC_ENABLE_EXTRA_MATH
701 	BC_LEX_KW_ENTRY("rand", 4, false),
702 #endif // BC_ENABLE_EXTRA_MATH
703 	BC_LEX_KW_ENTRY("maxibase", 8, false),
704 	BC_LEX_KW_ENTRY("maxobase", 8, false),
705 	BC_LEX_KW_ENTRY("maxscale", 8, false),
706 #if BC_ENABLE_EXTRA_MATH
707 	BC_LEX_KW_ENTRY("maxrand", 7, false),
708 #endif // BC_ENABLE_EXTRA_MATH
709 	BC_LEX_KW_ENTRY("else", 4, false),
710 };
711 
712 const size_t bc_lex_kws_len = sizeof(bc_lex_kws) / sizeof(BcLexKeyword);
713 
714 const char* const bc_parse_const1 = "1";
715 
716 // This is an array that corresponds to token types. An entry is
717 // true if the token is valid in an expression, false otherwise.
718 const uint8_t bc_parse_exprs[] = {
719 	BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true),
720 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
721 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
722 #if BC_ENABLE_EXTRA_MATH
723 	BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true),
724 	BC_PARSE_EXPR_ENTRY(true, true, false, false, true, true, false, false),
725 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, true, true, false),
726 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false),
727 	BC_PARSE_EXPR_ENTRY(false, true, true, true, true, true, true, false),
728 	BC_PARSE_EXPR_ENTRY(true, true, true, false, true, true, true, true),
729 	BC_PARSE_EXPR_ENTRY(true, true, false, 0, 0, 0, 0, 0)
730 #else // BC_ENABLE_EXTRA_MATH
731 	BC_PARSE_EXPR_ENTRY(true, true, true, false, false, true, true, false),
732 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, true, true),
733 	BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false),
734 	BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, false),
735 	BC_PARSE_EXPR_ENTRY(true, true, false, true, true, true, true, false)
736 #endif // BC_ENABLE_EXTRA_MATH
737 };
738 
739 // This is an array of data for operators that correspond to token types.
740 const uchar bc_parse_ops[] = {
741 	BC_PARSE_OP(0, false), BC_PARSE_OP(0, false),
742 	BC_PARSE_OP(1, false), BC_PARSE_OP(1, false),
743 #if BC_ENABLE_EXTRA_MATH
744 	BC_PARSE_OP(2, false),
745 #endif // BC_ENABLE_EXTRA_MATH
746 	BC_PARSE_OP(4, false),
747 	BC_PARSE_OP(5, true), BC_PARSE_OP(5, true), BC_PARSE_OP(5, true),
748 	BC_PARSE_OP(6, true), BC_PARSE_OP(6, true),
749 #if BC_ENABLE_EXTRA_MATH
750 	BC_PARSE_OP(3, false),
751 	BC_PARSE_OP(7, true), BC_PARSE_OP(7, true),
752 #endif // BC_ENABLE_EXTRA_MATH
753 	BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true),
754 	BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true),
755 	BC_PARSE_OP(11, true), BC_PARSE_OP(10, true),
756 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
757 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
758 #if BC_ENABLE_EXTRA_MATH
759 	BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false),
760 #endif // BC_ENABLE_EXTRA_MATH
761 	BC_PARSE_OP(8, false),
762 };
763 
764 // These identify what tokens can come after expressions in certain cases.
765 const BcParseNext bc_parse_next_expr =
766 	BC_PARSE_NEXT(4, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_RBRACE, BC_LEX_EOF);
767 const BcParseNext bc_parse_next_param =
768 	BC_PARSE_NEXT(2, BC_LEX_RPAREN, BC_LEX_COMMA);
769 const BcParseNext bc_parse_next_print =
770 	BC_PARSE_NEXT(4, BC_LEX_COMMA, BC_LEX_NLINE, BC_LEX_SCOLON, BC_LEX_EOF);
771 const BcParseNext bc_parse_next_rel = BC_PARSE_NEXT(1, BC_LEX_RPAREN);
772 const BcParseNext bc_parse_next_elem = BC_PARSE_NEXT(1, BC_LEX_RBRACKET);
773 const BcParseNext bc_parse_next_for = BC_PARSE_NEXT(1, BC_LEX_SCOLON);
774 const BcParseNext bc_parse_next_read =
775 	BC_PARSE_NEXT(2, BC_LEX_NLINE, BC_LEX_EOF);
776 #endif // BC_ENABLED
777 
778 #if DC_ENABLED
779 const uint8_t dc_lex_regs[] = {
780 	BC_LEX_OP_REL_EQ, BC_LEX_OP_REL_LE, BC_LEX_OP_REL_GE, BC_LEX_OP_REL_NE,
781 	BC_LEX_OP_REL_LT, BC_LEX_OP_REL_GT, BC_LEX_SCOLON, BC_LEX_COLON,
782 	BC_LEX_KW_ELSE, BC_LEX_LOAD, BC_LEX_LOAD_POP, BC_LEX_OP_ASSIGN,
783 	BC_LEX_STORE_PUSH,
784 };
785 
786 const size_t dc_lex_regs_len = sizeof(dc_lex_regs) / sizeof(uint8_t);
787 
788 const uchar dc_lex_tokens[] = {
789 #if BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
790 	BC_LEX_KW_IRAND,
791 #else // BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
792 	BC_LEX_INVALID,
793 #endif // BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
794 	BC_LEX_INVALID,
795 #if BC_ENABLE_EXTRA_MATH
796 	BC_LEX_OP_TRUNC,
797 #else // BC_ENABLE_EXTRA_MATH
798 	BC_LEX_INVALID,
799 #endif // BC_ENABLE_EXTRA_MATH
800 	BC_LEX_OP_MODULUS, BC_LEX_INVALID,
801 #if BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
802 	BC_LEX_KW_RAND,
803 #else // BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
804 	BC_LEX_INVALID,
805 #endif // BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
806 	BC_LEX_LPAREN, BC_LEX_RPAREN, BC_LEX_OP_MULTIPLY, BC_LEX_OP_PLUS,
807 	BC_LEX_INVALID, BC_LEX_OP_MINUS, BC_LEX_INVALID, BC_LEX_OP_DIVIDE,
808 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
809 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
810 	BC_LEX_INVALID, BC_LEX_INVALID,
811 	BC_LEX_COLON, BC_LEX_SCOLON, BC_LEX_OP_REL_GT, BC_LEX_OP_REL_EQ,
812 	BC_LEX_OP_REL_LT, BC_LEX_KW_READ,
813 #if BC_ENABLE_EXTRA_MATH
814 	BC_LEX_OP_PLACES,
815 #else // BC_ENABLE_EXTRA_MATH
816 	BC_LEX_INVALID,
817 #endif // BC_ENABLE_EXTRA_MATH
818 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_INVALID,
819 	BC_LEX_INVALID, BC_LEX_INVALID, BC_LEX_EQ_NO_REG,
820 #if BC_ENABLE_EXTRA_MATH
821 	BC_LEX_OP_LSHIFT,
822 #else // BC_ENABLE_EXTRA_MATH
823 	BC_LEX_INVALID,
824 #endif // BC_ENABLE_EXTRA_MATH
825 	BC_LEX_KW_IBASE,
826 #if BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
827 	BC_LEX_KW_SEED,
828 #else // BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
829 	BC_LEX_INVALID,
830 #endif // BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
831 	BC_LEX_KW_SCALE, BC_LEX_LOAD_POP, BC_LEX_OP_BOOL_AND, BC_LEX_OP_BOOL_NOT,
832 	BC_LEX_KW_OBASE, BC_LEX_PRINT_STREAM, BC_LEX_NQUIT, BC_LEX_POP,
833 	BC_LEX_STORE_PUSH, BC_LEX_KW_MAXIBASE, BC_LEX_KW_MAXOBASE,
834 	BC_LEX_KW_MAXSCALE,
835 #if BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
836 	BC_LEX_KW_MAXRAND,
837 #else // BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
838 	BC_LEX_INVALID,
839 #endif // BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
840 	BC_LEX_SCALE_FACTOR,
841 	BC_LEX_INVALID, BC_LEX_KW_LENGTH, BC_LEX_INVALID, BC_LEX_INVALID,
842 	BC_LEX_INVALID, BC_LEX_OP_POWER, BC_LEX_NEG, BC_LEX_INVALID,
843 	BC_LEX_ASCIIFY, BC_LEX_KW_ABS, BC_LEX_CLEAR_STACK, BC_LEX_DUPLICATE,
844 	BC_LEX_KW_ELSE, BC_LEX_PRINT_STACK, BC_LEX_INVALID,
845 #if BC_ENABLE_EXTRA_MATH
846 	BC_LEX_OP_RSHIFT,
847 #else // BC_ENABLE_EXTRA_MATH
848 	BC_LEX_INVALID,
849 #endif // BC_ENABLE_EXTRA_MATH
850 	BC_LEX_STORE_IBASE,
851 #if BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
852 	BC_LEX_STORE_SEED,
853 #else // BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
854 	BC_LEX_INVALID,
855 #endif // BC_ENABLE_EXTRA_MATH && DC_ENABLE_RAND
856 	BC_LEX_STORE_SCALE, BC_LEX_LOAD,
857 	BC_LEX_OP_BOOL_OR, BC_LEX_PRINT_POP, BC_LEX_STORE_OBASE, BC_LEX_KW_PRINT,
858 	BC_LEX_KW_QUIT, BC_LEX_SWAP, BC_LEX_OP_ASSIGN, BC_LEX_INVALID,
859 	BC_LEX_INVALID, BC_LEX_KW_SQRT, BC_LEX_INVALID, BC_LEX_EXECUTE,
860 	BC_LEX_INVALID, BC_LEX_STACK_LEVEL,
861 	BC_LEX_LBRACE, BC_LEX_OP_MODEXP, BC_LEX_RBRACE, BC_LEX_OP_DIVMOD,
862 	BC_LEX_INVALID
863 };
864 
865 const uchar dc_parse_insts[] = {
866 	BC_INST_INVALID, BC_INST_INVALID,
867 #if BC_ENABLED
868 	BC_INST_INVALID, BC_INST_INVALID,
869 #endif // BC_ENABLED
870 	BC_INST_INVALID, BC_INST_BOOL_NOT,
871 #if BC_ENABLE_EXTRA_MATH
872 	BC_INST_TRUNC,
873 #endif // BC_ENABLE_EXTRA_MATH
874 	BC_INST_POWER, BC_INST_MULTIPLY, BC_INST_DIVIDE, BC_INST_MODULUS,
875 	BC_INST_PLUS, BC_INST_MINUS,
876 #if BC_ENABLE_EXTRA_MATH
877 	BC_INST_PLACES,
878 	BC_INST_LSHIFT, BC_INST_RSHIFT,
879 #endif // BC_ENABLE_EXTRA_MATH
880 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
881 	BC_INST_INVALID, BC_INST_INVALID,
882 	BC_INST_BOOL_OR, BC_INST_BOOL_AND,
883 #if BC_ENABLED
884 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
885 	BC_INST_INVALID, BC_INST_INVALID,
886 #if BC_ENABLE_EXTRA_MATH
887 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
888 #endif // BC_ENABLE_EXTRA_MATH
889 #endif // BC_ENABLED
890 	BC_INST_INVALID,
891 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GT, BC_INST_REL_LT,
892 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_REL_GE,
893 	BC_INST_INVALID, BC_INST_REL_LE,
894 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
895 #if BC_ENABLED
896 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
897 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
898 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
899 #endif // BC_ENABLED
900 	BC_INST_IBASE, BC_INST_OBASE, BC_INST_SCALE,
901 #if BC_ENABLE_EXTRA_MATH
902 	BC_INST_SEED,
903 #endif // BC_ENABLE_EXTRA_MATH
904 	BC_INST_LENGTH, BC_INST_PRINT,
905 	BC_INST_SQRT, BC_INST_ABS,
906 #if BC_ENABLE_EXTRA_MATH
907 	BC_INST_IRAND,
908 #endif // BC_ENABLE_EXTRA_MATH
909 	BC_INST_QUIT, BC_INST_INVALID,
910 #if BC_ENABLE_EXTRA_MATH
911 	BC_INST_RAND,
912 #endif // BC_ENABLE_EXTRA_MATH
913 	BC_INST_MAXIBASE,
914 	BC_INST_MAXOBASE, BC_INST_MAXSCALE,
915 #if BC_ENABLE_EXTRA_MATH
916 	BC_INST_MAXRAND,
917 #endif // BC_ENABLE_EXTRA_MATH
918 	BC_INST_INVALID,
919 	BC_INST_REL_EQ, BC_INST_MODEXP, BC_INST_DIVMOD, BC_INST_INVALID,
920 	BC_INST_EXECUTE, BC_INST_PRINT_STACK, BC_INST_CLEAR_STACK,
921 	BC_INST_STACK_LEN, BC_INST_DUPLICATE, BC_INST_SWAP, BC_INST_POP,
922 	BC_INST_ASCIIFY, BC_INST_PRINT_STREAM,
923 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
924 #if BC_ENABLE_EXTRA_MATH
925 	BC_INST_INVALID,
926 #endif // BC_ENABLE_EXTRA_MATH
927 	BC_INST_INVALID, BC_INST_INVALID, BC_INST_INVALID,
928 	BC_INST_PRINT_POP, BC_INST_NQUIT, BC_INST_SCALE_FUNC,
929 };
930 #endif // DC_ENABLED
931 
932 #if BC_LONG_BIT >= 64
933 const BcDig bc_num_bigdigMax[] = {
934 	709551616U,
935 	446744073U,
936 	18U
937 };
938 #else // BC_LONG_BIT >= 64
939 const BcDig bc_num_bigdigMax[] = {
940 	7296U,
941 	9496U,
942 	42U,
943 };
944 #endif // BC_LONG_BIT >= 64
945 
946 const size_t bc_num_bigdigMax_size = sizeof(bc_num_bigdigMax) / sizeof(BcDig);
947 
948 const char bc_parse_one[] = "1";
949 
950 const char bc_num_hex_digits[] = "0123456789ABCDEF";
951 
952 const BcBigDig bc_num_pow10[BC_BASE_DIGS + 1] = {
953 	1,
954 	10,
955 	100,
956 	1000,
957 	10000,
958 #if BC_BASE_DIGS > 4
959 	100000,
960 	1000000,
961 	10000000,
962 	100000000,
963 	1000000000,
964 #endif // BC_BASE_DIGS > 4
965 };
966 
967 const BcNumBinaryOp bc_program_ops[] = {
968 	bc_num_pow, bc_num_mul, bc_num_div, bc_num_mod, bc_num_add, bc_num_sub,
969 #if BC_ENABLE_EXTRA_MATH
970 	bc_num_places, bc_num_lshift, bc_num_rshift,
971 #endif // BC_ENABLE_EXTRA_MATH
972 };
973 
974 const BcNumBinaryOpReq bc_program_opReqs[] = {
975 	bc_num_powReq, bc_num_mulReq, bc_num_mulReq, bc_num_mulReq,
976 	bc_num_addReq, bc_num_addReq,
977 #if BC_ENABLE_EXTRA_MATH
978 	bc_num_placesReq, bc_num_placesReq, bc_num_placesReq,
979 #endif // BC_ENABLE_EXTRA_MATH
980 };
981 
982 const BcProgramUnary bc_program_unarys[] = {
983 	bc_program_negate, bc_program_not,
984 #if BC_ENABLE_EXTRA_MATH
985 	bc_program_trunc,
986 #endif // BC_ENABLE_EXTRA_MATH
987 };
988 
989 const char bc_program_exprs_name[] = "<exprs>";
990 
991 const char bc_program_stdin_name[] = "<stdin>";
992 const char bc_program_ready_msg[] = "ready for more input\n";
993 const size_t bc_program_ready_msg_len = sizeof(bc_program_ready_msg) - 1;
994 const char bc_program_esc_chars[] = "ab\\efnqrt";
995 const char bc_program_esc_seqs[] = "\a\b\\\\\f\n\"\r\t";
996