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