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