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