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