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