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