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