]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/bc/src/data.c
Update to version 3.2.0
[FreeBSD/FreeBSD.git] / contrib / bc / 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_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