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