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"; 1005