1252884aeSStefan Eßer /* 2252884aeSStefan Eßer * ***************************************************************************** 3252884aeSStefan Eßer * 43aa99676SStefan Eßer * SPDX-License-Identifier: BSD-2-Clause 5252884aeSStefan Eßer * 6a970610aSStefan Eßer * Copyright (c) 2018-2024 Gavin D. Howard and contributors. 7252884aeSStefan Eßer * 8252884aeSStefan Eßer * Redistribution and use in source and binary forms, with or without 9252884aeSStefan Eßer * modification, are permitted provided that the following conditions are met: 10252884aeSStefan Eßer * 11252884aeSStefan Eßer * * Redistributions of source code must retain the above copyright notice, this 12252884aeSStefan Eßer * list of conditions and the following disclaimer. 13252884aeSStefan Eßer * 14252884aeSStefan Eßer * * Redistributions in binary form must reproduce the above copyright notice, 15252884aeSStefan Eßer * this list of conditions and the following disclaimer in the documentation 16252884aeSStefan Eßer * and/or other materials provided with the distribution. 17252884aeSStefan Eßer * 18252884aeSStefan Eßer * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19252884aeSStefan Eßer * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20252884aeSStefan Eßer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21252884aeSStefan Eßer * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22252884aeSStefan Eßer * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23252884aeSStefan Eßer * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24252884aeSStefan Eßer * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25252884aeSStefan Eßer * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26252884aeSStefan Eßer * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27252884aeSStefan Eßer * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28252884aeSStefan Eßer * POSSIBILITY OF SUCH DAMAGE. 29252884aeSStefan Eßer * 30252884aeSStefan Eßer * ***************************************************************************** 31252884aeSStefan Eßer * 32252884aeSStefan Eßer * Constant data for bc. 33252884aeSStefan Eßer * 34252884aeSStefan Eßer */ 35252884aeSStefan Eßer 3644d4804dSStefan Eßer #include <assert.h> 3744d4804dSStefan Eßer 3844d4804dSStefan Eßer #include <opt.h> 39252884aeSStefan Eßer #include <args.h> 40252884aeSStefan Eßer #include <lex.h> 41252884aeSStefan Eßer #include <parse.h> 42252884aeSStefan Eßer #include <bc.h> 43252884aeSStefan Eßer #include <dc.h> 44252884aeSStefan Eßer #include <num.h> 45252884aeSStefan Eßer #include <rand.h> 46252884aeSStefan Eßer #include <program.h> 4744d4804dSStefan Eßer #include <history.h> 4844d4804dSStefan Eßer #include <library.h> 49252884aeSStefan Eßer #include <vm.h> 50252884aeSStefan Eßer 5150696a6eSStefan Eßer #if !BC_ENABLE_LIBRARY 5250696a6eSStefan Eßer 53252884aeSStefan Eßer #if BC_ENABLED 5444d4804dSStefan Eßer 5544d4804dSStefan Eßer /// The bc signal message and its length. 56252884aeSStefan Eßer const char bc_sig_msg[] = "\ninterrupt (type \"quit\" to exit)\n"; 57252884aeSStefan Eßer const uchar bc_sig_msg_len = (uchar) (sizeof(bc_sig_msg) - 1); 5844d4804dSStefan Eßer 59252884aeSStefan Eßer #endif // BC_ENABLED 6044d4804dSStefan Eßer 61252884aeSStefan Eßer #if DC_ENABLED 6244d4804dSStefan Eßer 6344d4804dSStefan Eßer /// The dc signal message and its length. 64252884aeSStefan Eßer const char dc_sig_msg[] = "\ninterrupt (type \"q\" to exit)\n"; 65252884aeSStefan Eßer const uchar dc_sig_msg_len = (uchar) (sizeof(dc_sig_msg) - 1); 6644d4804dSStefan Eßer 67252884aeSStefan Eßer #endif // DC_ENABLED 68252884aeSStefan Eßer 6978bc019dSStefan Eßer // clang-format off 7078bc019dSStefan Eßer 7144d4804dSStefan Eßer /// The copyright banner. 72252884aeSStefan Eßer const char bc_copyright[] = 73a970610aSStefan Eßer "Copyright (c) 2018-2024 Gavin D. Howard and contributors\n" 744fca8e0fSStefan Eßer "Report bugs at: https://git.gavinhoward.com/gavin/bc\n\n" 75252884aeSStefan Eßer "This is free software with ABSOLUTELY NO WARRANTY.\n"; 76252884aeSStefan Eßer 7778bc019dSStefan Eßer // clang-format on 7878bc019dSStefan Eßer 7944d4804dSStefan Eßer #ifdef __OpenBSD__ 8044d4804dSStefan Eßer 8144d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 8244d4804dSStefan Eßer 8344d4804dSStefan Eßer #if BC_ENABLE_HISTORY 8444d4804dSStefan Eßer 8544d4804dSStefan Eßer /// The pledges for starting bc. 8644d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio tty unveil"; 8744d4804dSStefan Eßer 8844d4804dSStefan Eßer /// The final pledges with history enabled. 8944d4804dSStefan Eßer const char bc_pledge_end_history[] = "rpath stdio tty"; 9044d4804dSStefan Eßer 9144d4804dSStefan Eßer #else // BC_ENABLE_HISTORY 9244d4804dSStefan Eßer 9344d4804dSStefan Eßer /// The pledges for starting bc. 9444d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio unveil"; 9544d4804dSStefan Eßer 9644d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY 9744d4804dSStefan Eßer 9844d4804dSStefan Eßer /// The final pledges with history history disabled. 9944d4804dSStefan Eßer const char bc_pledge_end[] = "rpath stdio"; 10044d4804dSStefan Eßer 10144d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 10244d4804dSStefan Eßer 10344d4804dSStefan Eßer #if BC_ENABLE_HISTORY 10444d4804dSStefan Eßer 10544d4804dSStefan Eßer /// The pledges for starting bc. 10644d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio tty"; 10744d4804dSStefan Eßer 10844d4804dSStefan Eßer /// The final pledges with history enabled. 10944d4804dSStefan Eßer const char bc_pledge_end_history[] = "stdio tty"; 11044d4804dSStefan Eßer 11144d4804dSStefan Eßer #else // BC_ENABLE_HISTORY 11244d4804dSStefan Eßer 11344d4804dSStefan Eßer /// The pledges for starting bc. 11444d4804dSStefan Eßer const char bc_pledge_start[] = "rpath stdio"; 11544d4804dSStefan Eßer 11644d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY 11744d4804dSStefan Eßer 11844d4804dSStefan Eßer /// The final pledges with history history disabled. 11944d4804dSStefan Eßer const char bc_pledge_end[] = "stdio"; 12044d4804dSStefan Eßer 12144d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 12244d4804dSStefan Eßer 12344d4804dSStefan Eßer #else // __OpenBSD__ 12444d4804dSStefan Eßer 12544d4804dSStefan Eßer /// The pledges for starting bc. 12644d4804dSStefan Eßer const char bc_pledge_start[] = ""; 12744d4804dSStefan Eßer 12844d4804dSStefan Eßer #if BC_ENABLE_HISTORY 12944d4804dSStefan Eßer 13044d4804dSStefan Eßer /// The final pledges with history enabled. 13144d4804dSStefan Eßer const char bc_pledge_end_history[] = ""; 13244d4804dSStefan Eßer 13344d4804dSStefan Eßer #endif // BC_ENABLE_HISTORY 13444d4804dSStefan Eßer 13544d4804dSStefan Eßer /// The final pledges with history history disabled. 13644d4804dSStefan Eßer const char bc_pledge_end[] = ""; 13744d4804dSStefan Eßer 13844d4804dSStefan Eßer #endif // __OpenBSD__ 13944d4804dSStefan Eßer 14044d4804dSStefan Eßer /// The list of long options. There is a zero set at the end for detecting the 14144d4804dSStefan Eßer /// end. 14244d4804dSStefan Eßer const BcOptLong bc_args_lopt[] = { 14344d4804dSStefan Eßer 144d101cdd6SStefan Eßer { "digit-clamp", BC_OPT_NONE, 'c' }, 14544d4804dSStefan Eßer { "expression", BC_OPT_REQUIRED, 'e' }, 14644d4804dSStefan Eßer { "file", BC_OPT_REQUIRED, 'f' }, 14744d4804dSStefan Eßer { "help", BC_OPT_NONE, 'h' }, 14844d4804dSStefan Eßer { "interactive", BC_OPT_NONE, 'i' }, 14978bc019dSStefan Eßer { "ibase", BC_OPT_REQUIRED, 'I' }, 150d43fa8efSStefan Eßer { "leading-zeroes", BC_OPT_NONE, 'z' }, 151d43fa8efSStefan Eßer { "no-line-length", BC_OPT_NONE, 'L' }, 15278bc019dSStefan Eßer { "obase", BC_OPT_REQUIRED, 'O' }, 153d101cdd6SStefan Eßer { "no-digit-clamp", BC_OPT_NONE, 'C' }, 15444d4804dSStefan Eßer { "no-prompt", BC_OPT_NONE, 'P' }, 15544d4804dSStefan Eßer { "no-read-prompt", BC_OPT_NONE, 'R' }, 15678bc019dSStefan Eßer { "scale", BC_OPT_REQUIRED, 'S' }, 15778bc019dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 15878bc019dSStefan Eßer { "seed", BC_OPT_REQUIRED, 'E' }, 15978bc019dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 16044d4804dSStefan Eßer #if BC_ENABLED 16144d4804dSStefan Eßer { "global-stacks", BC_OPT_BC_ONLY, 'g' }, 16244d4804dSStefan Eßer { "mathlib", BC_OPT_BC_ONLY, 'l' }, 16344d4804dSStefan Eßer { "quiet", BC_OPT_BC_ONLY, 'q' }, 16444d4804dSStefan Eßer { "redefine", BC_OPT_REQUIRED_BC_ONLY, 'r' }, 16544d4804dSStefan Eßer { "standard", BC_OPT_BC_ONLY, 's' }, 16644d4804dSStefan Eßer { "warn", BC_OPT_BC_ONLY, 'w' }, 16744d4804dSStefan Eßer #endif // BC_ENABLED 16844d4804dSStefan Eßer { "version", BC_OPT_NONE, 'v' }, 16944d4804dSStefan Eßer { "version", BC_OPT_NONE, 'V' }, 17044d4804dSStefan Eßer #if DC_ENABLED 17144d4804dSStefan Eßer { "extended-register", BC_OPT_DC_ONLY, 'x' }, 17244d4804dSStefan Eßer #endif // DC_ENABLED 17344d4804dSStefan Eßer { NULL, 0, 0 }, 17444d4804dSStefan Eßer 17544d4804dSStefan Eßer }; 17644d4804dSStefan Eßer 177*12e0d316SStefan Eßer #if BC_ENABLE_OSSFUZZ 178*12e0d316SStefan Eßer 179*12e0d316SStefan Eßer const char* bc_fuzzer_args_c[] = { 180*12e0d316SStefan Eßer "bc", 181*12e0d316SStefan Eßer "-lqc", 182*12e0d316SStefan Eßer "-e", 183*12e0d316SStefan Eßer "seed = 82507683022933941343198991100880559238.7080266844215897551270760113" 184*12e0d316SStefan Eßer "4734858017748592704189096562163085637164174146616055338762825421827784" 185*12e0d316SStefan Eßer "566630725748836994171142578125", 186*12e0d316SStefan Eßer NULL, 187*12e0d316SStefan Eßer }; 188*12e0d316SStefan Eßer 189*12e0d316SStefan Eßer const char* dc_fuzzer_args_c[] = { 190*12e0d316SStefan Eßer "dc", 191*12e0d316SStefan Eßer "-xc", 192*12e0d316SStefan Eßer "-e", 193*12e0d316SStefan Eßer "82507683022933941343198991100880559238.7080266844215897551270760113" 194*12e0d316SStefan Eßer "4734858017748592704189096562163085637164174146616055338762825421827784" 195*12e0d316SStefan Eßer "566630725748836994171142578125j", 196*12e0d316SStefan Eßer NULL, 197*12e0d316SStefan Eßer }; 198*12e0d316SStefan Eßer 199*12e0d316SStefan Eßer const char* bc_fuzzer_args_C[] = { 200*12e0d316SStefan Eßer "bc", 201*12e0d316SStefan Eßer "-lqC", 202*12e0d316SStefan Eßer "-e", 203*12e0d316SStefan Eßer "seed = 82507683022933941343198991100880559238.7080266844215897551270760113" 204*12e0d316SStefan Eßer "4734858017748592704189096562163085637164174146616055338762825421827784" 205*12e0d316SStefan Eßer "566630725748836994171142578125", 206*12e0d316SStefan Eßer NULL, 207*12e0d316SStefan Eßer }; 208*12e0d316SStefan Eßer 209*12e0d316SStefan Eßer const char* dc_fuzzer_args_C[] = { 210*12e0d316SStefan Eßer "dc", 211*12e0d316SStefan Eßer "-xC", 212*12e0d316SStefan Eßer "-e", 213*12e0d316SStefan Eßer "82507683022933941343198991100880559238.7080266844215897551270760113" 214*12e0d316SStefan Eßer "4734858017748592704189096562163085637164174146616055338762825421827784" 215*12e0d316SStefan Eßer "566630725748836994171142578125j", 216*12e0d316SStefan Eßer NULL, 217*12e0d316SStefan Eßer }; 218*12e0d316SStefan Eßer 219*12e0d316SStefan Eßer const size_t bc_fuzzer_args_len = sizeof(bc_fuzzer_args_c) / sizeof(char*); 220*12e0d316SStefan Eßer 221*12e0d316SStefan Eßer #if BC_C11 222*12e0d316SStefan Eßer 223*12e0d316SStefan Eßer _Static_assert(sizeof(bc_fuzzer_args_C) / sizeof(char*) == bc_fuzzer_args_len, 224*12e0d316SStefan Eßer "Wrong number of bc fuzzer args"); 225*12e0d316SStefan Eßer 226*12e0d316SStefan Eßer _Static_assert(sizeof(dc_fuzzer_args_c) / sizeof(char*) == bc_fuzzer_args_len, 227*12e0d316SStefan Eßer "Wrong number of dc fuzzer args"); 228*12e0d316SStefan Eßer 229*12e0d316SStefan Eßer _Static_assert(sizeof(dc_fuzzer_args_C) / sizeof(char*) == bc_fuzzer_args_len, 230*12e0d316SStefan Eßer "Wrong number of dc fuzzer args"); 231*12e0d316SStefan Eßer 232*12e0d316SStefan Eßer #endif // BC_C11 233*12e0d316SStefan Eßer 234*12e0d316SStefan Eßer #endif // BC_ENABLE_OSSFUZZ 235*12e0d316SStefan Eßer 23678bc019dSStefan Eßer // clang-format off 23778bc019dSStefan Eßer 23844d4804dSStefan Eßer /// The default error category strings. 239252884aeSStefan Eßer const char *bc_errs[] = { 240252884aeSStefan Eßer "Math error:", 241252884aeSStefan Eßer "Parse error:", 242252884aeSStefan Eßer "Runtime error:", 243252884aeSStefan Eßer "Fatal error:", 244252884aeSStefan Eßer #if BC_ENABLED 245252884aeSStefan Eßer "Warning:", 246252884aeSStefan Eßer #endif // BC_ENABLED 247252884aeSStefan Eßer }; 248252884aeSStefan Eßer 24978bc019dSStefan Eßer // clang-format on 25078bc019dSStefan Eßer 25144d4804dSStefan Eßer /// The error category for each error. 252252884aeSStefan Eßer const uchar bc_err_ids[] = { 253252884aeSStefan Eßer 254252884aeSStefan Eßer BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, BC_ERR_IDX_MATH, 255252884aeSStefan Eßer 256252884aeSStefan Eßer BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, 257252884aeSStefan Eßer BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, BC_ERR_IDX_FATAL, 25844d4804dSStefan Eßer BC_ERR_IDX_FATAL, 259252884aeSStefan Eßer 260252884aeSStefan Eßer BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, 261252884aeSStefan Eßer BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, 26244d4804dSStefan Eßer BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, BC_ERR_IDX_EXEC, 263252884aeSStefan Eßer 264252884aeSStefan Eßer BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, 265252884aeSStefan Eßer BC_ERR_IDX_PARSE, 266252884aeSStefan Eßer #if BC_ENABLED 267252884aeSStefan Eßer BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, 268252884aeSStefan Eßer BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, 269252884aeSStefan Eßer BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, 270252884aeSStefan Eßer 271252884aeSStefan Eßer BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, 272252884aeSStefan Eßer BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, 273252884aeSStefan Eßer BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, 27410041e99SStefan Eßer BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, BC_ERR_IDX_PARSE, 275252884aeSStefan Eßer #endif // BC_ENABLED 276252884aeSStefan Eßer 277252884aeSStefan Eßer }; 278252884aeSStefan Eßer 27944d4804dSStefan Eßer /// The default error messages. There are NULL pointers because the positions 28044d4804dSStefan Eßer /// must be preserved for the locales. 281252884aeSStefan Eßer const char* const bc_err_msgs[] = { 282252884aeSStefan Eßer 283252884aeSStefan Eßer "negative number", 284252884aeSStefan Eßer "non-integer number", 285252884aeSStefan Eßer "overflow: number cannot fit", 286252884aeSStefan Eßer "divide by 0", 287252884aeSStefan Eßer 288252884aeSStefan Eßer "memory allocation failed", 289252884aeSStefan Eßer "I/O error", 290252884aeSStefan Eßer "cannot open file: %s", 29144d4804dSStefan Eßer "file is not text: %s", 292252884aeSStefan Eßer "path is a directory: %s", 293252884aeSStefan Eßer "bad command-line option: \"%s\"", 294252884aeSStefan Eßer "option requires an argument: '%c' (\"%s\")", 295252884aeSStefan Eßer "option takes no arguments: '%c' (\"%s\")", 29644d4804dSStefan Eßer "bad option argument: \"%s\"", 297252884aeSStefan Eßer 298252884aeSStefan Eßer "bad ibase: must be [%lu, %lu]", 299252884aeSStefan Eßer "bad obase: must be [%lu, %lu]", 300252884aeSStefan Eßer "bad scale: must be [%lu, %lu]", 301252884aeSStefan Eßer "bad read() expression", 302252884aeSStefan Eßer "read() call inside of a read() call", 303252884aeSStefan Eßer "variable or array element is the wrong type", 304252884aeSStefan Eßer #if DC_ENABLED 305252884aeSStefan Eßer "stack has too few elements", 30644d4804dSStefan Eßer "stack for register \"%s\" has too few elements", 307252884aeSStefan Eßer #else // DC_ENABLED 30878bc019dSStefan Eßer NULL, 30978bc019dSStefan Eßer NULL, 310252884aeSStefan Eßer #endif // DC_ENABLED 311252884aeSStefan Eßer #if BC_ENABLED 312252884aeSStefan Eßer "wrong number of parameters; need %zu, have %zu", 313252884aeSStefan Eßer "undefined function: %s()", 314252884aeSStefan Eßer "cannot use a void value in an expression", 315252884aeSStefan Eßer #else 31678bc019dSStefan Eßer NULL, 31778bc019dSStefan Eßer NULL, 31878bc019dSStefan Eßer NULL, 319252884aeSStefan Eßer #endif // BC_ENABLED 320252884aeSStefan Eßer 321252884aeSStefan Eßer "end of file", 322252884aeSStefan Eßer "bad character '%c'", 323252884aeSStefan Eßer "string end cannot be found", 324252884aeSStefan Eßer "comment end cannot be found", 325252884aeSStefan Eßer "bad token", 326252884aeSStefan Eßer #if BC_ENABLED 327252884aeSStefan Eßer "bad expression", 328252884aeSStefan Eßer "empty expression", 32944d4804dSStefan Eßer "bad print or stream statement", 330252884aeSStefan Eßer "bad function definition", 331d213476dSStefan Eßer ("bad assignment: left side must be scale, ibase, " 332d213476dSStefan Eßer "obase, seed, last, var, or array element"), 333252884aeSStefan Eßer "no auto variable found", 334252884aeSStefan Eßer "function parameter or auto \"%s%s\" already exists", 335252884aeSStefan Eßer "block end cannot be found", 336252884aeSStefan Eßer "cannot return a value from void function: %s()", 337252884aeSStefan Eßer "var cannot be a reference: %s", 338252884aeSStefan Eßer 339252884aeSStefan Eßer "POSIX does not allow names longer than 1 character: %s", 340252884aeSStefan Eßer "POSIX does not allow '#' script comments", 341252884aeSStefan Eßer "POSIX does not allow the following keyword: %s", 342252884aeSStefan Eßer "POSIX does not allow a period ('.') as a shortcut for the last result", 343252884aeSStefan Eßer "POSIX requires parentheses around return expressions", 344252884aeSStefan Eßer "POSIX does not allow the following operator: %s", 345252884aeSStefan Eßer "POSIX does not allow comparison operators outside if statements or loops", 346252884aeSStefan Eßer "POSIX requires 0 or 1 comparison operators per condition", 347252884aeSStefan Eßer "POSIX requires all 3 parts of a for loop to be non-empty", 34810041e99SStefan Eßer "POSIX requires a newline between a semicolon and a function definition", 349252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 350252884aeSStefan Eßer "POSIX does not allow exponential notation", 351252884aeSStefan Eßer #else 352252884aeSStefan Eßer NULL, 353252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 354252884aeSStefan Eßer "POSIX does not allow array references as function parameters", 355252884aeSStefan Eßer "POSIX does not allow void functions", 356252884aeSStefan Eßer "POSIX requires the left brace be on the same line as the function header", 35744d4804dSStefan Eßer "POSIX does not allow strings to be assigned to variables or arrays", 358252884aeSStefan Eßer #endif // BC_ENABLED 359252884aeSStefan Eßer 360252884aeSStefan Eßer }; 361252884aeSStefan Eßer 36244d4804dSStefan Eßer #endif // !BC_ENABLE_LIBRARY 36344d4804dSStefan Eßer 36444d4804dSStefan Eßer /// The destructors corresponding to BcDtorType enum items. 36544d4804dSStefan Eßer const BcVecFree bc_vec_dtors[] = { 36644d4804dSStefan Eßer NULL, 36744d4804dSStefan Eßer bc_vec_free, 36844d4804dSStefan Eßer bc_num_free, 36944d4804dSStefan Eßer #if !BC_ENABLE_LIBRARY 370103d7cdfSStefan Eßer #if BC_DEBUG 37144d4804dSStefan Eßer bc_func_free, 372103d7cdfSStefan Eßer #endif // BC_DEBUG 37344d4804dSStefan Eßer bc_slab_free, 37444d4804dSStefan Eßer bc_const_free, 37544d4804dSStefan Eßer bc_result_free, 37678bc019dSStefan Eßer #if BC_ENABLE_HISTORY && !BC_ENABLE_LINE_LIB 37744d4804dSStefan Eßer bc_history_string_free, 37878bc019dSStefan Eßer #endif // BC_ENABLE_HISTORY && !BC_ENABLE_LINE_LIB 37944d4804dSStefan Eßer #else // !BC_ENABLE_LIBRARY 38044d4804dSStefan Eßer bcl_num_destruct, 38144d4804dSStefan Eßer #endif // !BC_ENABLE_LIBRARY 38244d4804dSStefan Eßer }; 38344d4804dSStefan Eßer 38444d4804dSStefan Eßer #if !BC_ENABLE_LIBRARY 38544d4804dSStefan Eßer 38678bc019dSStefan Eßer #if BC_ENABLE_EDITLINE 38778bc019dSStefan Eßer 38878bc019dSStefan Eßer /// The normal path to the editrc. 38978bc019dSStefan Eßer const char bc_history_editrc[] = "/.editrc"; 39078bc019dSStefan Eßer 39178bc019dSStefan Eßer /// The length of the normal path to the editrc. 39278bc019dSStefan Eßer const size_t bc_history_editrc_len = sizeof(bc_history_editrc) - 1; 39378bc019dSStefan Eßer 39478bc019dSStefan Eßer #endif // BC_ENABLE_EDITLINE 39578bc019dSStefan Eßer 39678bc019dSStefan Eßer #if BC_ENABLE_HISTORY && !BC_ENABLE_LINE_LIB 39744d4804dSStefan Eßer 39844d4804dSStefan Eßer /// A flush type for not clearing current extras but not saving new ones either. 3997e5c51e5SStefan Eßer const BcFlushType bc_flush_none = BC_FLUSH_NO_EXTRAS_NO_CLEAR; 40044d4804dSStefan Eßer 40144d4804dSStefan Eßer /// A flush type for clearing extras and not saving new ones. 4027e5c51e5SStefan Eßer const BcFlushType bc_flush_err = BC_FLUSH_NO_EXTRAS_CLEAR; 40344d4804dSStefan Eßer 40444d4804dSStefan Eßer /// A flush type for clearing previous extras and saving new ones. 4057e5c51e5SStefan Eßer const BcFlushType bc_flush_save = BC_FLUSH_SAVE_EXTRAS_CLEAR; 40644d4804dSStefan Eßer 40744d4804dSStefan Eßer /// A list of known bad terminals. 408252884aeSStefan Eßer const char* bc_history_bad_terms[] = { "dumb", "cons25", "emacs", NULL }; 409252884aeSStefan Eßer 41044d4804dSStefan Eßer /// A constant for tabs and its length. My tab handling is dumb and always 41144d4804dSStefan Eßer /// outputs the entire thing. 41278bc019dSStefan Eßer const char bc_history_tab[] = "\t"; 413252884aeSStefan Eßer const size_t bc_history_tab_len = sizeof(bc_history_tab) - 1; 414252884aeSStefan Eßer 41544d4804dSStefan Eßer /// A list of wide chars. These are listed in ascending order for efficiency. 416252884aeSStefan Eßer const uint32_t bc_history_wchars[][2] = { 41778bc019dSStefan Eßer { 0x1100, 0x115F }, { 0x231A, 0x231B }, { 0x2329, 0x232A }, 41878bc019dSStefan Eßer { 0x23E9, 0x23EC }, { 0x23F0, 0x23F0 }, { 0x23F3, 0x23F3 }, 41978bc019dSStefan Eßer { 0x25FD, 0x25FE }, { 0x2614, 0x2615 }, { 0x2648, 0x2653 }, 42078bc019dSStefan Eßer { 0x267F, 0x267F }, { 0x2693, 0x2693 }, { 0x26A1, 0x26A1 }, 42178bc019dSStefan Eßer { 0x26AA, 0x26AB }, { 0x26BD, 0x26BE }, { 0x26C4, 0x26C5 }, 42278bc019dSStefan Eßer { 0x26CE, 0x26CE }, { 0x26D4, 0x26D4 }, { 0x26EA, 0x26EA }, 42378bc019dSStefan Eßer { 0x26F2, 0x26F3 }, { 0x26F5, 0x26F5 }, { 0x26FA, 0x26FA }, 42478bc019dSStefan Eßer { 0x26FD, 0x26FD }, { 0x2705, 0x2705 }, { 0x270A, 0x270B }, 42578bc019dSStefan Eßer { 0x2728, 0x2728 }, { 0x274C, 0x274C }, { 0x274E, 0x274E }, 42678bc019dSStefan Eßer { 0x2753, 0x2755 }, { 0x2757, 0x2757 }, { 0x2795, 0x2797 }, 42778bc019dSStefan Eßer { 0x27B0, 0x27B0 }, { 0x27BF, 0x27BF }, { 0x2B1B, 0x2B1C }, 42878bc019dSStefan Eßer { 0x2B50, 0x2B50 }, { 0x2B55, 0x2B55 }, { 0x2E80, 0x2E99 }, 42978bc019dSStefan Eßer { 0x2E9B, 0x2EF3 }, { 0x2F00, 0x2FD5 }, { 0x2FF0, 0x2FFB }, 43078bc019dSStefan Eßer { 0x3001, 0x303E }, { 0x3041, 0x3096 }, { 0x3099, 0x30FF }, 43178bc019dSStefan Eßer { 0x3105, 0x312D }, { 0x3131, 0x318E }, { 0x3190, 0x31BA }, 43278bc019dSStefan Eßer { 0x31C0, 0x31E3 }, { 0x31F0, 0x321E }, { 0x3220, 0x3247 }, 43378bc019dSStefan Eßer { 0x3250, 0x32FE }, { 0x3300, 0x4DBF }, { 0x4E00, 0xA48C }, 43478bc019dSStefan Eßer { 0xA490, 0xA4C6 }, { 0xA960, 0xA97C }, { 0xAC00, 0xD7A3 }, 43578bc019dSStefan Eßer { 0xF900, 0xFAFF }, { 0xFE10, 0xFE19 }, { 0xFE30, 0xFE52 }, 43678bc019dSStefan Eßer { 0xFE54, 0xFE66 }, { 0xFE68, 0xFE6B }, { 0x16FE0, 0x16FE0 }, 43778bc019dSStefan Eßer { 0x17000, 0x187EC }, { 0x18800, 0x18AF2 }, { 0x1B000, 0x1B001 }, 43878bc019dSStefan Eßer { 0x1F004, 0x1F004 }, { 0x1F0CF, 0x1F0CF }, { 0x1F18E, 0x1F18E }, 43978bc019dSStefan Eßer { 0x1F191, 0x1F19A }, { 0x1F200, 0x1F202 }, { 0x1F210, 0x1F23B }, 44078bc019dSStefan Eßer { 0x1F240, 0x1F248 }, { 0x1F250, 0x1F251 }, { 0x1F300, 0x1F320 }, 44178bc019dSStefan Eßer { 0x1F32D, 0x1F335 }, { 0x1F337, 0x1F37C }, { 0x1F37E, 0x1F393 }, 44278bc019dSStefan Eßer { 0x1F3A0, 0x1F3CA }, { 0x1F3CF, 0x1F3D3 }, { 0x1F3E0, 0x1F3F0 }, 44378bc019dSStefan Eßer { 0x1F3F4, 0x1F3F4 }, { 0x1F3F8, 0x1F43E }, { 0x1F440, 0x1F440 }, 44478bc019dSStefan Eßer { 0x1F442, 0x1F4FC }, { 0x1F4FF, 0x1F53D }, { 0x1F54B, 0x1F54E }, 44578bc019dSStefan Eßer { 0x1F550, 0x1F567 }, { 0x1F57A, 0x1F57A }, { 0x1F595, 0x1F596 }, 44678bc019dSStefan Eßer { 0x1F5A4, 0x1F5A4 }, { 0x1F5FB, 0x1F64F }, { 0x1F680, 0x1F6C5 }, 44778bc019dSStefan Eßer { 0x1F6CC, 0x1F6CC }, { 0x1F6D0, 0x1F6D2 }, { 0x1F6EB, 0x1F6EC }, 44878bc019dSStefan Eßer { 0x1F6F4, 0x1F6F6 }, { 0x1F910, 0x1F91E }, { 0x1F920, 0x1F927 }, 44978bc019dSStefan Eßer { 0x1F930, 0x1F930 }, { 0x1F933, 0x1F93E }, { 0x1F940, 0x1F94B }, 45078bc019dSStefan Eßer { 0x1F950, 0x1F95E }, { 0x1F980, 0x1F991 }, { 0x1F9C0, 0x1F9C0 }, 45178bc019dSStefan Eßer { 0x20000, 0x2FFFD }, { 0x30000, 0x3FFFD }, 452252884aeSStefan Eßer }; 453252884aeSStefan Eßer 45444d4804dSStefan Eßer /// The length of the wide chars list. 45578bc019dSStefan Eßer const size_t bc_history_wchars_len = sizeof(bc_history_wchars) / 45678bc019dSStefan Eßer sizeof(bc_history_wchars[0]); 457252884aeSStefan Eßer 45844d4804dSStefan Eßer /// A list of combining characters in Unicode. These are listed in ascending 45944d4804dSStefan Eßer /// order for efficiency. 460252884aeSStefan Eßer const uint32_t bc_history_combo_chars[] = { 461252884aeSStefan Eßer 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 462252884aeSStefan Eßer 0x0308, 0x0309, 0x030A, 0x030B, 0x030C, 0x030D, 0x030E, 0x030F, 463252884aeSStefan Eßer 0x0310, 0x0311, 0x0312, 0x0313, 0x0314, 0x0315, 0x0316, 0x0317, 464252884aeSStefan Eßer 0x0318, 0x0319, 0x031A, 0x031B, 0x031C, 0x031D, 0x031E, 0x031F, 465252884aeSStefan Eßer 0x0320, 0x0321, 0x0322, 0x0323, 0x0324, 0x0325, 0x0326, 0x0327, 466252884aeSStefan Eßer 0x0328, 0x0329, 0x032A, 0x032B, 0x032C, 0x032D, 0x032E, 0x032F, 467252884aeSStefan Eßer 0x0330, 0x0331, 0x0332, 0x0333, 0x0334, 0x0335, 0x0336, 0x0337, 468252884aeSStefan Eßer 0x0338, 0x0339, 0x033A, 0x033B, 0x033C, 0x033D, 0x033E, 0x033F, 469252884aeSStefan Eßer 0x0340, 0x0341, 0x0342, 0x0343, 0x0344, 0x0345, 0x0346, 0x0347, 470252884aeSStefan Eßer 0x0348, 0x0349, 0x034A, 0x034B, 0x034C, 0x034D, 0x034E, 0x034F, 471252884aeSStefan Eßer 0x0350, 0x0351, 0x0352, 0x0353, 0x0354, 0x0355, 0x0356, 0x0357, 472252884aeSStefan Eßer 0x0358, 0x0359, 0x035A, 0x035B, 0x035C, 0x035D, 0x035E, 0x035F, 473252884aeSStefan Eßer 0x0360, 0x0361, 0x0362, 0x0363, 0x0364, 0x0365, 0x0366, 0x0367, 474252884aeSStefan Eßer 0x0368, 0x0369, 0x036A, 0x036B, 0x036C, 0x036D, 0x036E, 0x036F, 475252884aeSStefan Eßer 0x0483, 0x0484, 0x0485, 0x0486, 0x0487, 0x0591, 0x0592, 0x0593, 476252884aeSStefan Eßer 0x0594, 0x0595, 0x0596, 0x0597, 0x0598, 0x0599, 0x059A, 0x059B, 477252884aeSStefan Eßer 0x059C, 0x059D, 0x059E, 0x059F, 0x05A0, 0x05A1, 0x05A2, 0x05A3, 478252884aeSStefan Eßer 0x05A4, 0x05A5, 0x05A6, 0x05A7, 0x05A8, 0x05A9, 0x05AA, 0x05AB, 479252884aeSStefan Eßer 0x05AC, 0x05AD, 0x05AE, 0x05AF, 0x05B0, 0x05B1, 0x05B2, 0x05B3, 480252884aeSStefan Eßer 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x05BA, 0x05BB, 481252884aeSStefan Eßer 0x05BC, 0x05BD, 0x05BF, 0x05C1, 0x05C2, 0x05C4, 0x05C5, 0x05C7, 482252884aeSStefan Eßer 0x0610, 0x0611, 0x0612, 0x0613, 0x0614, 0x0615, 0x0616, 0x0617, 483252884aeSStefan Eßer 0x0618, 0x0619, 0x061A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, 484252884aeSStefan Eßer 0x0650, 0x0651, 0x0652, 0x0653, 0x0654, 0x0655, 0x0656, 0x0657, 485252884aeSStefan Eßer 0x0658, 0x0659, 0x065A, 0x065B, 0x065C, 0x065D, 0x065E, 0x065F, 486252884aeSStefan Eßer 0x0670, 0x06D6, 0x06D7, 0x06D8, 0x06D9, 0x06DA, 0x06DB, 0x06DC, 487252884aeSStefan Eßer 0x06DF, 0x06E0, 0x06E1, 0x06E2, 0x06E3, 0x06E4, 0x06E7, 0x06E8, 488252884aeSStefan Eßer 0x06EA, 0x06EB, 0x06EC, 0x06ED, 0x0711, 0x0730, 0x0731, 0x0732, 489252884aeSStefan Eßer 0x0733, 0x0734, 0x0735, 0x0736, 0x0737, 0x0738, 0x0739, 0x073A, 490252884aeSStefan Eßer 0x073B, 0x073C, 0x073D, 0x073E, 0x073F, 0x0740, 0x0741, 0x0742, 491252884aeSStefan Eßer 0x0743, 0x0744, 0x0745, 0x0746, 0x0747, 0x0748, 0x0749, 0x074A, 492252884aeSStefan Eßer 0x07A6, 0x07A7, 0x07A8, 0x07A9, 0x07AA, 0x07AB, 0x07AC, 0x07AD, 493252884aeSStefan Eßer 0x07AE, 0x07AF, 0x07B0, 0x07EB, 0x07EC, 0x07ED, 0x07EE, 0x07EF, 494252884aeSStefan Eßer 0x07F0, 0x07F1, 0x07F2, 0x07F3, 0x0816, 0x0817, 0x0818, 0x0819, 495252884aeSStefan Eßer 0x081B, 0x081C, 0x081D, 0x081E, 0x081F, 0x0820, 0x0821, 0x0822, 496252884aeSStefan Eßer 0x0823, 0x0825, 0x0826, 0x0827, 0x0829, 0x082A, 0x082B, 0x082C, 497252884aeSStefan Eßer 0x082D, 0x0859, 0x085A, 0x085B, 0x08D4, 0x08D5, 0x08D6, 0x08D7, 498252884aeSStefan Eßer 0x08D8, 0x08D9, 0x08DA, 0x08DB, 0x08DC, 0x08DD, 0x08DE, 0x08DF, 499252884aeSStefan Eßer 0x08E0, 0x08E1, 0x08E3, 0x08E4, 0x08E5, 0x08E6, 0x08E7, 0x08E8, 500252884aeSStefan Eßer 0x08E9, 0x08EA, 0x08EB, 0x08EC, 0x08ED, 0x08EE, 0x08EF, 0x08F0, 501252884aeSStefan Eßer 0x08F1, 0x08F2, 0x08F3, 0x08F4, 0x08F5, 0x08F6, 0x08F7, 0x08F8, 502252884aeSStefan Eßer 0x08F9, 0x08FA, 0x08FB, 0x08FC, 0x08FD, 0x08FE, 0x08FF, 0x0900, 503252884aeSStefan Eßer 0x0901, 0x0902, 0x093A, 0x093C, 0x0941, 0x0942, 0x0943, 0x0944, 504252884aeSStefan Eßer 0x0945, 0x0946, 0x0947, 0x0948, 0x094D, 0x0951, 0x0952, 0x0953, 505252884aeSStefan Eßer 0x0954, 0x0955, 0x0956, 0x0957, 0x0962, 0x0963, 0x0981, 0x09BC, 506252884aeSStefan Eßer 0x09C1, 0x09C2, 0x09C3, 0x09C4, 0x09CD, 0x09E2, 0x09E3, 0x0A01, 507252884aeSStefan Eßer 0x0A02, 0x0A3C, 0x0A41, 0x0A42, 0x0A47, 0x0A48, 0x0A4B, 0x0A4C, 508252884aeSStefan Eßer 0x0A4D, 0x0A51, 0x0A70, 0x0A71, 0x0A75, 0x0A81, 0x0A82, 0x0ABC, 509252884aeSStefan Eßer 0x0AC1, 0x0AC2, 0x0AC3, 0x0AC4, 0x0AC5, 0x0AC7, 0x0AC8, 0x0ACD, 510252884aeSStefan Eßer 0x0AE2, 0x0AE3, 0x0B01, 0x0B3C, 0x0B3F, 0x0B41, 0x0B42, 0x0B43, 511252884aeSStefan Eßer 0x0B44, 0x0B4D, 0x0B56, 0x0B62, 0x0B63, 0x0B82, 0x0BC0, 0x0BCD, 512252884aeSStefan Eßer 0x0C00, 0x0C3E, 0x0C3F, 0x0C40, 0x0C46, 0x0C47, 0x0C48, 0x0C4A, 513252884aeSStefan Eßer 0x0C4B, 0x0C4C, 0x0C4D, 0x0C55, 0x0C56, 0x0C62, 0x0C63, 0x0C81, 514252884aeSStefan Eßer 0x0CBC, 0x0CBF, 0x0CC6, 0x0CCC, 0x0CCD, 0x0CE2, 0x0CE3, 0x0D01, 515252884aeSStefan Eßer 0x0D41, 0x0D42, 0x0D43, 0x0D44, 0x0D4D, 0x0D62, 0x0D63, 0x0DCA, 516252884aeSStefan Eßer 0x0DD2, 0x0DD3, 0x0DD4, 0x0DD6, 0x0E31, 0x0E34, 0x0E35, 0x0E36, 517252884aeSStefan Eßer 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 518252884aeSStefan Eßer 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0EB1, 0x0EB4, 0x0EB5, 0x0EB6, 519252884aeSStefan Eßer 0x0EB7, 0x0EB8, 0x0EB9, 0x0EBB, 0x0EBC, 0x0EC8, 0x0EC9, 0x0ECA, 520252884aeSStefan Eßer 0x0ECB, 0x0ECC, 0x0ECD, 0x0F18, 0x0F19, 0x0F35, 0x0F37, 0x0F39, 521252884aeSStefan Eßer 0x0F71, 0x0F72, 0x0F73, 0x0F74, 0x0F75, 0x0F76, 0x0F77, 0x0F78, 522252884aeSStefan Eßer 0x0F79, 0x0F7A, 0x0F7B, 0x0F7C, 0x0F7D, 0x0F7E, 0x0F80, 0x0F81, 523252884aeSStefan Eßer 0x0F82, 0x0F83, 0x0F84, 0x0F86, 0x0F87, 0x0F8D, 0x0F8E, 0x0F8F, 524252884aeSStefan Eßer 0x0F90, 0x0F91, 0x0F92, 0x0F93, 0x0F94, 0x0F95, 0x0F96, 0x0F97, 525252884aeSStefan Eßer 0x0F99, 0x0F9A, 0x0F9B, 0x0F9C, 0x0F9D, 0x0F9E, 0x0F9F, 0x0FA0, 526252884aeSStefan Eßer 0x0FA1, 0x0FA2, 0x0FA3, 0x0FA4, 0x0FA5, 0x0FA6, 0x0FA7, 0x0FA8, 527252884aeSStefan Eßer 0x0FA9, 0x0FAA, 0x0FAB, 0x0FAC, 0x0FAD, 0x0FAE, 0x0FAF, 0x0FB0, 528252884aeSStefan Eßer 0x0FB1, 0x0FB2, 0x0FB3, 0x0FB4, 0x0FB5, 0x0FB6, 0x0FB7, 0x0FB8, 529252884aeSStefan Eßer 0x0FB9, 0x0FBA, 0x0FBB, 0x0FBC, 0x0FC6, 0x102D, 0x102E, 0x102F, 530252884aeSStefan Eßer 0x1030, 0x1032, 0x1033, 0x1034, 0x1035, 0x1036, 0x1037, 0x1039, 531252884aeSStefan Eßer 0x103A, 0x103D, 0x103E, 0x1058, 0x1059, 0x105E, 0x105F, 0x1060, 532252884aeSStefan Eßer 0x1071, 0x1072, 0x1073, 0x1074, 0x1082, 0x1085, 0x1086, 0x108D, 533252884aeSStefan Eßer 0x109D, 0x135D, 0x135E, 0x135F, 0x1712, 0x1713, 0x1714, 0x1732, 534252884aeSStefan Eßer 0x1733, 0x1734, 0x1752, 0x1753, 0x1772, 0x1773, 0x17B4, 0x17B5, 535252884aeSStefan Eßer 0x17B7, 0x17B8, 0x17B9, 0x17BA, 0x17BB, 0x17BC, 0x17BD, 0x17C6, 536252884aeSStefan Eßer 0x17C9, 0x17CA, 0x17CB, 0x17CC, 0x17CD, 0x17CE, 0x17CF, 0x17D0, 537252884aeSStefan Eßer 0x17D1, 0x17D2, 0x17D3, 0x17DD, 0x180B, 0x180C, 0x180D, 0x1885, 538252884aeSStefan Eßer 0x1886, 0x18A9, 0x1920, 0x1921, 0x1922, 0x1927, 0x1928, 0x1932, 539252884aeSStefan Eßer 0x1939, 0x193A, 0x193B, 0x1A17, 0x1A18, 0x1A1B, 0x1A56, 0x1A58, 540252884aeSStefan Eßer 0x1A59, 0x1A5A, 0x1A5B, 0x1A5C, 0x1A5D, 0x1A5E, 0x1A60, 0x1A62, 541252884aeSStefan Eßer 0x1A65, 0x1A66, 0x1A67, 0x1A68, 0x1A69, 0x1A6A, 0x1A6B, 0x1A6C, 542252884aeSStefan Eßer 0x1A73, 0x1A74, 0x1A75, 0x1A76, 0x1A77, 0x1A78, 0x1A79, 0x1A7A, 543252884aeSStefan Eßer 0x1A7B, 0x1A7C, 0x1A7F, 0x1AB0, 0x1AB1, 0x1AB2, 0x1AB3, 0x1AB4, 544252884aeSStefan Eßer 0x1AB5, 0x1AB6, 0x1AB7, 0x1AB8, 0x1AB9, 0x1ABA, 0x1ABB, 0x1ABC, 545252884aeSStefan Eßer 0x1ABD, 0x1B00, 0x1B01, 0x1B02, 0x1B03, 0x1B34, 0x1B36, 0x1B37, 546252884aeSStefan Eßer 0x1B38, 0x1B39, 0x1B3A, 0x1B3C, 0x1B42, 0x1B6B, 0x1B6C, 0x1B6D, 547252884aeSStefan Eßer 0x1B6E, 0x1B6F, 0x1B70, 0x1B71, 0x1B72, 0x1B73, 0x1B80, 0x1B81, 548252884aeSStefan Eßer 0x1BA2, 0x1BA3, 0x1BA4, 0x1BA5, 0x1BA8, 0x1BA9, 0x1BAB, 0x1BAC, 549252884aeSStefan Eßer 0x1BAD, 0x1BE6, 0x1BE8, 0x1BE9, 0x1BED, 0x1BEF, 0x1BF0, 0x1BF1, 550252884aeSStefan Eßer 0x1C2C, 0x1C2D, 0x1C2E, 0x1C2F, 0x1C30, 0x1C31, 0x1C32, 0x1C33, 551252884aeSStefan Eßer 0x1C36, 0x1C37, 0x1CD0, 0x1CD1, 0x1CD2, 0x1CD4, 0x1CD5, 0x1CD6, 552252884aeSStefan Eßer 0x1CD7, 0x1CD8, 0x1CD9, 0x1CDA, 0x1CDB, 0x1CDC, 0x1CDD, 0x1CDE, 553252884aeSStefan Eßer 0x1CDF, 0x1CE0, 0x1CE2, 0x1CE3, 0x1CE4, 0x1CE5, 0x1CE6, 0x1CE7, 554252884aeSStefan Eßer 0x1CE8, 0x1CED, 0x1CF4, 0x1CF8, 0x1CF9, 0x1DC0, 0x1DC1, 0x1DC2, 555252884aeSStefan Eßer 0x1DC3, 0x1DC4, 0x1DC5, 0x1DC6, 0x1DC7, 0x1DC8, 0x1DC9, 0x1DCA, 556252884aeSStefan Eßer 0x1DCB, 0x1DCC, 0x1DCD, 0x1DCE, 0x1DCF, 0x1DD0, 0x1DD1, 0x1DD2, 557252884aeSStefan Eßer 0x1DD3, 0x1DD4, 0x1DD5, 0x1DD6, 0x1DD7, 0x1DD8, 0x1DD9, 0x1DDA, 558252884aeSStefan Eßer 0x1DDB, 0x1DDC, 0x1DDD, 0x1DDE, 0x1DDF, 0x1DE0, 0x1DE1, 0x1DE2, 559252884aeSStefan Eßer 0x1DE3, 0x1DE4, 0x1DE5, 0x1DE6, 0x1DE7, 0x1DE8, 0x1DE9, 0x1DEA, 560252884aeSStefan Eßer 0x1DEB, 0x1DEC, 0x1DED, 0x1DEE, 0x1DEF, 0x1DF0, 0x1DF1, 0x1DF2, 561252884aeSStefan Eßer 0x1DF3, 0x1DF4, 0x1DF5, 0x1DFB, 0x1DFC, 0x1DFD, 0x1DFE, 0x1DFF, 562252884aeSStefan Eßer 0x20D0, 0x20D1, 0x20D2, 0x20D3, 0x20D4, 0x20D5, 0x20D6, 0x20D7, 563252884aeSStefan Eßer 0x20D8, 0x20D9, 0x20DA, 0x20DB, 0x20DC, 0x20E1, 0x20E5, 0x20E6, 564252884aeSStefan Eßer 0x20E7, 0x20E8, 0x20E9, 0x20EA, 0x20EB, 0x20EC, 0x20ED, 0x20EE, 565252884aeSStefan Eßer 0x20EF, 0x20F0, 0x2CEF, 0x2CF0, 0x2CF1, 0x2D7F, 0x2DE0, 0x2DE1, 566252884aeSStefan Eßer 0x2DE2, 0x2DE3, 0x2DE4, 0x2DE5, 0x2DE6, 0x2DE7, 0x2DE8, 0x2DE9, 567252884aeSStefan Eßer 0x2DEA, 0x2DEB, 0x2DEC, 0x2DED, 0x2DEE, 0x2DEF, 0x2DF0, 0x2DF1, 568252884aeSStefan Eßer 0x2DF2, 0x2DF3, 0x2DF4, 0x2DF5, 0x2DF6, 0x2DF7, 0x2DF8, 0x2DF9, 569252884aeSStefan Eßer 0x2DFA, 0x2DFB, 0x2DFC, 0x2DFD, 0x2DFE, 0x2DFF, 0x302A, 0x302B, 570252884aeSStefan Eßer 0x302C, 0x302D, 0x3099, 0x309A, 0xA66F, 0xA674, 0xA675, 0xA676, 571252884aeSStefan Eßer 0xA677, 0xA678, 0xA679, 0xA67A, 0xA67B, 0xA67C, 0xA67D, 0xA69E, 572252884aeSStefan Eßer 0xA69F, 0xA6F0, 0xA6F1, 0xA802, 0xA806, 0xA80B, 0xA825, 0xA826, 573252884aeSStefan Eßer 0xA8C4, 0xA8C5, 0xA8E0, 0xA8E1, 0xA8E2, 0xA8E3, 0xA8E4, 0xA8E5, 574252884aeSStefan Eßer 0xA8E6, 0xA8E7, 0xA8E8, 0xA8E9, 0xA8EA, 0xA8EB, 0xA8EC, 0xA8ED, 575252884aeSStefan Eßer 0xA8EE, 0xA8EF, 0xA8F0, 0xA8F1, 0xA926, 0xA927, 0xA928, 0xA929, 576252884aeSStefan Eßer 0xA92A, 0xA92B, 0xA92C, 0xA92D, 0xA947, 0xA948, 0xA949, 0xA94A, 577252884aeSStefan Eßer 0xA94B, 0xA94C, 0xA94D, 0xA94E, 0xA94F, 0xA950, 0xA951, 0xA980, 578252884aeSStefan Eßer 0xA981, 0xA982, 0xA9B3, 0xA9B6, 0xA9B7, 0xA9B8, 0xA9B9, 0xA9BC, 579252884aeSStefan Eßer 0xA9E5, 0xAA29, 0xAA2A, 0xAA2B, 0xAA2C, 0xAA2D, 0xAA2E, 0xAA31, 580252884aeSStefan Eßer 0xAA32, 0xAA35, 0xAA36, 0xAA43, 0xAA4C, 0xAA7C, 0xAAB0, 0xAAB2, 581252884aeSStefan Eßer 0xAAB3, 0xAAB4, 0xAAB7, 0xAAB8, 0xAABE, 0xAABF, 0xAAC1, 0xAAEC, 582252884aeSStefan Eßer 0xAAED, 0xAAF6, 0xABE5, 0xABE8, 0xABED, 0xFB1E, 0xFE00, 0xFE01, 583252884aeSStefan Eßer 0xFE02, 0xFE03, 0xFE04, 0xFE05, 0xFE06, 0xFE07, 0xFE08, 0xFE09, 584252884aeSStefan Eßer 0xFE0A, 0xFE0B, 0xFE0C, 0xFE0D, 0xFE0E, 0xFE0F, 0xFE20, 0xFE21, 585252884aeSStefan Eßer 0xFE22, 0xFE23, 0xFE24, 0xFE25, 0xFE26, 0xFE27, 0xFE28, 0xFE29, 58678bc019dSStefan Eßer 0xFE2A, 0xFE2B, 0xFE2C, 0xFE2D, 0xFE2E, 0xFE2F, 0x101FD, 0x102E0, 58778bc019dSStefan Eßer 0x10376, 0x10377, 0x10378, 0x10379, 0x1037A, 0x10A01, 0x10A02, 0x10A03, 58878bc019dSStefan Eßer 0x10A05, 0x10A06, 0x10A0C, 0x10A0D, 0x10A0E, 0x10A0F, 0x10A38, 0x10A39, 58978bc019dSStefan Eßer 0x10A3A, 0x10A3F, 0x10AE5, 0x10AE6, 0x11001, 0x11038, 0x11039, 0x1103A, 59078bc019dSStefan Eßer 0x1103B, 0x1103C, 0x1103D, 0x1103E, 0x1103F, 0x11040, 0x11041, 0x11042, 59178bc019dSStefan Eßer 0x11043, 0x11044, 0x11045, 0x11046, 0x1107F, 0x11080, 0x11081, 0x110B3, 59278bc019dSStefan Eßer 0x110B4, 0x110B5, 0x110B6, 0x110B9, 0x110BA, 0x11100, 0x11101, 0x11102, 59378bc019dSStefan Eßer 0x11127, 0x11128, 0x11129, 0x1112A, 0x1112B, 0x1112D, 0x1112E, 0x1112F, 59478bc019dSStefan Eßer 0x11130, 0x11131, 0x11132, 0x11133, 0x11134, 0x11173, 0x11180, 0x11181, 59578bc019dSStefan Eßer 0x111B6, 0x111B7, 0x111B8, 0x111B9, 0x111BA, 0x111BB, 0x111BC, 0x111BD, 59678bc019dSStefan Eßer 0x111BE, 0x111CA, 0x111CB, 0x111CC, 0x1122F, 0x11230, 0x11231, 0x11234, 59778bc019dSStefan Eßer 0x11236, 0x11237, 0x1123E, 0x112DF, 0x112E3, 0x112E4, 0x112E5, 0x112E6, 59878bc019dSStefan Eßer 0x112E7, 0x112E8, 0x112E9, 0x112EA, 0x11300, 0x11301, 0x1133C, 0x11340, 59978bc019dSStefan Eßer 0x11366, 0x11367, 0x11368, 0x11369, 0x1136A, 0x1136B, 0x1136C, 0x11370, 60078bc019dSStefan Eßer 0x11371, 0x11372, 0x11373, 0x11374, 0x11438, 0x11439, 0x1143A, 0x1143B, 60178bc019dSStefan Eßer 0x1143C, 0x1143D, 0x1143E, 0x1143F, 0x11442, 0x11443, 0x11444, 0x11446, 60278bc019dSStefan Eßer 0x114B3, 0x114B4, 0x114B5, 0x114B6, 0x114B7, 0x114B8, 0x114BA, 0x114BF, 60378bc019dSStefan Eßer 0x114C0, 0x114C2, 0x114C3, 0x115B2, 0x115B3, 0x115B4, 0x115B5, 0x115BC, 60478bc019dSStefan Eßer 0x115BD, 0x115BF, 0x115C0, 0x115DC, 0x115DD, 0x11633, 0x11634, 0x11635, 60578bc019dSStefan Eßer 0x11636, 0x11637, 0x11638, 0x11639, 0x1163A, 0x1163D, 0x1163F, 0x11640, 60678bc019dSStefan Eßer 0x116AB, 0x116AD, 0x116B0, 0x116B1, 0x116B2, 0x116B3, 0x116B4, 0x116B5, 60778bc019dSStefan Eßer 0x116B7, 0x1171D, 0x1171E, 0x1171F, 0x11722, 0x11723, 0x11724, 0x11725, 60878bc019dSStefan Eßer 0x11727, 0x11728, 0x11729, 0x1172A, 0x1172B, 0x11C30, 0x11C31, 0x11C32, 60978bc019dSStefan Eßer 0x11C33, 0x11C34, 0x11C35, 0x11C36, 0x11C38, 0x11C39, 0x11C3A, 0x11C3B, 61078bc019dSStefan Eßer 0x11C3C, 0x11C3D, 0x11C3F, 0x11C92, 0x11C93, 0x11C94, 0x11C95, 0x11C96, 61178bc019dSStefan Eßer 0x11C97, 0x11C98, 0x11C99, 0x11C9A, 0x11C9B, 0x11C9C, 0x11C9D, 0x11C9E, 61278bc019dSStefan Eßer 0x11C9F, 0x11CA0, 0x11CA1, 0x11CA2, 0x11CA3, 0x11CA4, 0x11CA5, 0x11CA6, 61378bc019dSStefan Eßer 0x11CA7, 0x11CAA, 0x11CAB, 0x11CAC, 0x11CAD, 0x11CAE, 0x11CAF, 0x11CB0, 61478bc019dSStefan Eßer 0x11CB2, 0x11CB3, 0x11CB5, 0x11CB6, 0x16AF0, 0x16AF1, 0x16AF2, 0x16AF3, 61578bc019dSStefan Eßer 0x16AF4, 0x16B30, 0x16B31, 0x16B32, 0x16B33, 0x16B34, 0x16B35, 0x16B36, 61678bc019dSStefan Eßer 0x16F8F, 0x16F90, 0x16F91, 0x16F92, 0x1BC9D, 0x1BC9E, 0x1D167, 0x1D168, 61778bc019dSStefan Eßer 0x1D169, 0x1D17B, 0x1D17C, 0x1D17D, 0x1D17E, 0x1D17F, 0x1D180, 0x1D181, 61878bc019dSStefan Eßer 0x1D182, 0x1D185, 0x1D186, 0x1D187, 0x1D188, 0x1D189, 0x1D18A, 0x1D18B, 61978bc019dSStefan Eßer 0x1D1AA, 0x1D1AB, 0x1D1AC, 0x1D1AD, 0x1D242, 0x1D243, 0x1D244, 0x1DA00, 62078bc019dSStefan Eßer 0x1DA01, 0x1DA02, 0x1DA03, 0x1DA04, 0x1DA05, 0x1DA06, 0x1DA07, 0x1DA08, 62178bc019dSStefan Eßer 0x1DA09, 0x1DA0A, 0x1DA0B, 0x1DA0C, 0x1DA0D, 0x1DA0E, 0x1DA0F, 0x1DA10, 62278bc019dSStefan Eßer 0x1DA11, 0x1DA12, 0x1DA13, 0x1DA14, 0x1DA15, 0x1DA16, 0x1DA17, 0x1DA18, 62378bc019dSStefan Eßer 0x1DA19, 0x1DA1A, 0x1DA1B, 0x1DA1C, 0x1DA1D, 0x1DA1E, 0x1DA1F, 0x1DA20, 62478bc019dSStefan Eßer 0x1DA21, 0x1DA22, 0x1DA23, 0x1DA24, 0x1DA25, 0x1DA26, 0x1DA27, 0x1DA28, 62578bc019dSStefan Eßer 0x1DA29, 0x1DA2A, 0x1DA2B, 0x1DA2C, 0x1DA2D, 0x1DA2E, 0x1DA2F, 0x1DA30, 62678bc019dSStefan Eßer 0x1DA31, 0x1DA32, 0x1DA33, 0x1DA34, 0x1DA35, 0x1DA36, 0x1DA3B, 0x1DA3C, 62778bc019dSStefan Eßer 0x1DA3D, 0x1DA3E, 0x1DA3F, 0x1DA40, 0x1DA41, 0x1DA42, 0x1DA43, 0x1DA44, 62878bc019dSStefan Eßer 0x1DA45, 0x1DA46, 0x1DA47, 0x1DA48, 0x1DA49, 0x1DA4A, 0x1DA4B, 0x1DA4C, 62978bc019dSStefan Eßer 0x1DA4D, 0x1DA4E, 0x1DA4F, 0x1DA50, 0x1DA51, 0x1DA52, 0x1DA53, 0x1DA54, 63078bc019dSStefan Eßer 0x1DA55, 0x1DA56, 0x1DA57, 0x1DA58, 0x1DA59, 0x1DA5A, 0x1DA5B, 0x1DA5C, 63178bc019dSStefan Eßer 0x1DA5D, 0x1DA5E, 0x1DA5F, 0x1DA60, 0x1DA61, 0x1DA62, 0x1DA63, 0x1DA64, 63278bc019dSStefan Eßer 0x1DA65, 0x1DA66, 0x1DA67, 0x1DA68, 0x1DA69, 0x1DA6A, 0x1DA6B, 0x1DA6C, 63378bc019dSStefan Eßer 0x1DA75, 0x1DA84, 0x1DA9B, 0x1DA9C, 0x1DA9D, 0x1DA9E, 0x1DA9F, 0x1DAA1, 63478bc019dSStefan Eßer 0x1DAA2, 0x1DAA3, 0x1DAA4, 0x1DAA5, 0x1DAA6, 0x1DAA7, 0x1DAA8, 0x1DAA9, 63578bc019dSStefan Eßer 0x1DAAA, 0x1DAAB, 0x1DAAC, 0x1DAAD, 0x1DAAE, 0x1DAAF, 0x1E000, 0x1E001, 63678bc019dSStefan Eßer 0x1E002, 0x1E003, 0x1E004, 0x1E005, 0x1E006, 0x1E008, 0x1E009, 0x1E00A, 63778bc019dSStefan Eßer 0x1E00B, 0x1E00C, 0x1E00D, 0x1E00E, 0x1E00F, 0x1E010, 0x1E011, 0x1E012, 63878bc019dSStefan Eßer 0x1E013, 0x1E014, 0x1E015, 0x1E016, 0x1E017, 0x1E018, 0x1E01B, 0x1E01C, 63978bc019dSStefan Eßer 0x1E01D, 0x1E01E, 0x1E01F, 0x1E020, 0x1E021, 0x1E023, 0x1E024, 0x1E026, 64078bc019dSStefan Eßer 0x1E027, 0x1E028, 0x1E029, 0x1E02A, 0x1E8D0, 0x1E8D1, 0x1E8D2, 0x1E8D3, 64178bc019dSStefan Eßer 0x1E8D4, 0x1E8D5, 0x1E8D6, 0x1E944, 0x1E945, 0x1E946, 0x1E947, 0x1E948, 64278bc019dSStefan Eßer 0x1E949, 0x1E94A, 0xE0100, 0xE0101, 0xE0102, 0xE0103, 0xE0104, 0xE0105, 64378bc019dSStefan Eßer 0xE0106, 0xE0107, 0xE0108, 0xE0109, 0xE010A, 0xE010B, 0xE010C, 0xE010D, 64478bc019dSStefan Eßer 0xE010E, 0xE010F, 0xE0110, 0xE0111, 0xE0112, 0xE0113, 0xE0114, 0xE0115, 64578bc019dSStefan Eßer 0xE0116, 0xE0117, 0xE0118, 0xE0119, 0xE011A, 0xE011B, 0xE011C, 0xE011D, 64678bc019dSStefan Eßer 0xE011E, 0xE011F, 0xE0120, 0xE0121, 0xE0122, 0xE0123, 0xE0124, 0xE0125, 64778bc019dSStefan Eßer 0xE0126, 0xE0127, 0xE0128, 0xE0129, 0xE012A, 0xE012B, 0xE012C, 0xE012D, 64878bc019dSStefan Eßer 0xE012E, 0xE012F, 0xE0130, 0xE0131, 0xE0132, 0xE0133, 0xE0134, 0xE0135, 64978bc019dSStefan Eßer 0xE0136, 0xE0137, 0xE0138, 0xE0139, 0xE013A, 0xE013B, 0xE013C, 0xE013D, 65078bc019dSStefan Eßer 0xE013E, 0xE013F, 0xE0140, 0xE0141, 0xE0142, 0xE0143, 0xE0144, 0xE0145, 65178bc019dSStefan Eßer 0xE0146, 0xE0147, 0xE0148, 0xE0149, 0xE014A, 0xE014B, 0xE014C, 0xE014D, 65278bc019dSStefan Eßer 0xE014E, 0xE014F, 0xE0150, 0xE0151, 0xE0152, 0xE0153, 0xE0154, 0xE0155, 65378bc019dSStefan Eßer 0xE0156, 0xE0157, 0xE0158, 0xE0159, 0xE015A, 0xE015B, 0xE015C, 0xE015D, 65478bc019dSStefan Eßer 0xE015E, 0xE015F, 0xE0160, 0xE0161, 0xE0162, 0xE0163, 0xE0164, 0xE0165, 65578bc019dSStefan Eßer 0xE0166, 0xE0167, 0xE0168, 0xE0169, 0xE016A, 0xE016B, 0xE016C, 0xE016D, 65678bc019dSStefan Eßer 0xE016E, 0xE016F, 0xE0170, 0xE0171, 0xE0172, 0xE0173, 0xE0174, 0xE0175, 65778bc019dSStefan Eßer 0xE0176, 0xE0177, 0xE0178, 0xE0179, 0xE017A, 0xE017B, 0xE017C, 0xE017D, 65878bc019dSStefan Eßer 0xE017E, 0xE017F, 0xE0180, 0xE0181, 0xE0182, 0xE0183, 0xE0184, 0xE0185, 65978bc019dSStefan Eßer 0xE0186, 0xE0187, 0xE0188, 0xE0189, 0xE018A, 0xE018B, 0xE018C, 0xE018D, 66078bc019dSStefan Eßer 0xE018E, 0xE018F, 0xE0190, 0xE0191, 0xE0192, 0xE0193, 0xE0194, 0xE0195, 66178bc019dSStefan Eßer 0xE0196, 0xE0197, 0xE0198, 0xE0199, 0xE019A, 0xE019B, 0xE019C, 0xE019D, 66278bc019dSStefan Eßer 0xE019E, 0xE019F, 0xE01A0, 0xE01A1, 0xE01A2, 0xE01A3, 0xE01A4, 0xE01A5, 66378bc019dSStefan Eßer 0xE01A6, 0xE01A7, 0xE01A8, 0xE01A9, 0xE01AA, 0xE01AB, 0xE01AC, 0xE01AD, 66478bc019dSStefan Eßer 0xE01AE, 0xE01AF, 0xE01B0, 0xE01B1, 0xE01B2, 0xE01B3, 0xE01B4, 0xE01B5, 66578bc019dSStefan Eßer 0xE01B6, 0xE01B7, 0xE01B8, 0xE01B9, 0xE01BA, 0xE01BB, 0xE01BC, 0xE01BD, 66678bc019dSStefan Eßer 0xE01BE, 0xE01BF, 0xE01C0, 0xE01C1, 0xE01C2, 0xE01C3, 0xE01C4, 0xE01C5, 66778bc019dSStefan Eßer 0xE01C6, 0xE01C7, 0xE01C8, 0xE01C9, 0xE01CA, 0xE01CB, 0xE01CC, 0xE01CD, 66878bc019dSStefan Eßer 0xE01CE, 0xE01CF, 0xE01D0, 0xE01D1, 0xE01D2, 0xE01D3, 0xE01D4, 0xE01D5, 66978bc019dSStefan Eßer 0xE01D6, 0xE01D7, 0xE01D8, 0xE01D9, 0xE01DA, 0xE01DB, 0xE01DC, 0xE01DD, 67078bc019dSStefan Eßer 0xE01DE, 0xE01DF, 0xE01E0, 0xE01E1, 0xE01E2, 0xE01E3, 0xE01E4, 0xE01E5, 67178bc019dSStefan Eßer 0xE01E6, 0xE01E7, 0xE01E8, 0xE01E9, 0xE01EA, 0xE01EB, 0xE01EC, 0xE01ED, 67278bc019dSStefan Eßer 0xE01EE, 0xE01EF, 673252884aeSStefan Eßer }; 674252884aeSStefan Eßer 67544d4804dSStefan Eßer /// The length of the combining characters list. 67678bc019dSStefan Eßer const size_t bc_history_combo_chars_len = sizeof(bc_history_combo_chars) / 67778bc019dSStefan Eßer sizeof(bc_history_combo_chars[0]); 67878bc019dSStefan Eßer #endif // BC_ENABLE_HISTORY && !BC_ENABLE_LINE_LIB 679252884aeSStefan Eßer 68044d4804dSStefan Eßer /// The human-readable name of the main function in bc source code. 681252884aeSStefan Eßer const char bc_func_main[] = "(main)"; 68244d4804dSStefan Eßer 68344d4804dSStefan Eßer /// The human-readable name of the read function in bc source code. 684252884aeSStefan Eßer const char bc_func_read[] = "(read)"; 685252884aeSStefan Eßer 686252884aeSStefan Eßer #if BC_DEBUG_CODE 68744d4804dSStefan Eßer 68844d4804dSStefan Eßer /// A list of names of instructions for easy debugging output. 689252884aeSStefan Eßer const char* bc_inst_names[] = { 690252884aeSStefan Eßer 691252884aeSStefan Eßer #if BC_ENABLED 692252884aeSStefan Eßer "BC_INST_INC", 693252884aeSStefan Eßer "BC_INST_DEC", 694252884aeSStefan Eßer #endif // BC_ENABLED 695252884aeSStefan Eßer 696252884aeSStefan Eßer "BC_INST_NEG", 697252884aeSStefan Eßer "BC_INST_BOOL_NOT", 698252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 699252884aeSStefan Eßer "BC_INST_TRUNC", 700252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 701252884aeSStefan Eßer 702252884aeSStefan Eßer "BC_INST_POWER", 703252884aeSStefan Eßer "BC_INST_MULTIPLY", 704252884aeSStefan Eßer "BC_INST_DIVIDE", 705252884aeSStefan Eßer "BC_INST_MODULUS", 706252884aeSStefan Eßer "BC_INST_PLUS", 707252884aeSStefan Eßer "BC_INST_MINUS", 708252884aeSStefan Eßer 709252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 710252884aeSStefan Eßer "BC_INST_PLACES", 711252884aeSStefan Eßer 712252884aeSStefan Eßer "BC_INST_LSHIFT", 713252884aeSStefan Eßer "BC_INST_RSHIFT", 714252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 715252884aeSStefan Eßer 716252884aeSStefan Eßer "BC_INST_REL_EQ", 717252884aeSStefan Eßer "BC_INST_REL_LE", 718252884aeSStefan Eßer "BC_INST_REL_GE", 719252884aeSStefan Eßer "BC_INST_REL_NE", 720252884aeSStefan Eßer "BC_INST_REL_LT", 721252884aeSStefan Eßer "BC_INST_REL_GT", 722252884aeSStefan Eßer 723252884aeSStefan Eßer "BC_INST_BOOL_OR", 724252884aeSStefan Eßer "BC_INST_BOOL_AND", 725252884aeSStefan Eßer 726252884aeSStefan Eßer #if BC_ENABLED 727252884aeSStefan Eßer "BC_INST_ASSIGN_POWER", 728252884aeSStefan Eßer "BC_INST_ASSIGN_MULTIPLY", 729252884aeSStefan Eßer "BC_INST_ASSIGN_DIVIDE", 730252884aeSStefan Eßer "BC_INST_ASSIGN_MODULUS", 731252884aeSStefan Eßer "BC_INST_ASSIGN_PLUS", 732252884aeSStefan Eßer "BC_INST_ASSIGN_MINUS", 733252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 734252884aeSStefan Eßer "BC_INST_ASSIGN_PLACES", 735252884aeSStefan Eßer "BC_INST_ASSIGN_LSHIFT", 736252884aeSStefan Eßer "BC_INST_ASSIGN_RSHIFT", 737252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 738252884aeSStefan Eßer "BC_INST_ASSIGN", 739252884aeSStefan Eßer 740252884aeSStefan Eßer "BC_INST_ASSIGN_POWER_NO_VAL", 741252884aeSStefan Eßer "BC_INST_ASSIGN_MULTIPLY_NO_VAL", 742252884aeSStefan Eßer "BC_INST_ASSIGN_DIVIDE_NO_VAL", 743252884aeSStefan Eßer "BC_INST_ASSIGN_MODULUS_NO_VAL", 744252884aeSStefan Eßer "BC_INST_ASSIGN_PLUS_NO_VAL", 745252884aeSStefan Eßer "BC_INST_ASSIGN_MINUS_NO_VAL", 746252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 747252884aeSStefan Eßer "BC_INST_ASSIGN_PLACES_NO_VAL", 748252884aeSStefan Eßer "BC_INST_ASSIGN_LSHIFT_NO_VAL", 749252884aeSStefan Eßer "BC_INST_ASSIGN_RSHIFT_NO_VAL", 750252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 751252884aeSStefan Eßer #endif // BC_ENABLED 752252884aeSStefan Eßer "BC_INST_ASSIGN_NO_VAL", 753252884aeSStefan Eßer 754252884aeSStefan Eßer "BC_INST_NUM", 755252884aeSStefan Eßer "BC_INST_VAR", 756252884aeSStefan Eßer "BC_INST_ARRAY_ELEM", 757252884aeSStefan Eßer "BC_INST_ARRAY", 758252884aeSStefan Eßer 7593aa99676SStefan Eßer "BC_INST_ZERO", 760252884aeSStefan Eßer "BC_INST_ONE", 761252884aeSStefan Eßer 762252884aeSStefan Eßer #if BC_ENABLED 763252884aeSStefan Eßer "BC_INST_LAST", 764252884aeSStefan Eßer #endif // BC_ENABLED 765252884aeSStefan Eßer "BC_INST_IBASE", 766252884aeSStefan Eßer "BC_INST_OBASE", 767252884aeSStefan Eßer "BC_INST_SCALE", 768252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 769252884aeSStefan Eßer "BC_INST_SEED", 770252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 771252884aeSStefan Eßer "BC_INST_LENGTH", 772252884aeSStefan Eßer "BC_INST_SCALE_FUNC", 773252884aeSStefan Eßer "BC_INST_SQRT", 774252884aeSStefan Eßer "BC_INST_ABS", 775d101cdd6SStefan Eßer "BC_INST_IS_NUMBER", 776d101cdd6SStefan Eßer "BC_INST_IS_STRING", 777252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 778252884aeSStefan Eßer "BC_INST_IRAND", 779252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 78044d4804dSStefan Eßer "BC_INST_ASCIIFY", 781252884aeSStefan Eßer "BC_INST_READ", 782252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 783252884aeSStefan Eßer "BC_INST_RAND", 784252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 785252884aeSStefan Eßer "BC_INST_MAXIBASE", 786252884aeSStefan Eßer "BC_INST_MAXOBASE", 787252884aeSStefan Eßer "BC_INST_MAXSCALE", 788252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 789252884aeSStefan Eßer "BC_INST_MAXRAND", 790252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 791252884aeSStefan Eßer 792252884aeSStefan Eßer "BC_INST_PRINT", 793252884aeSStefan Eßer "BC_INST_PRINT_POP", 794252884aeSStefan Eßer "BC_INST_STR", 79544d4804dSStefan Eßer #if BC_ENABLED 796252884aeSStefan Eßer "BC_INST_PRINT_STR", 797252884aeSStefan Eßer 798252884aeSStefan Eßer "BC_INST_JUMP", 799252884aeSStefan Eßer "BC_INST_JUMP_ZERO", 800252884aeSStefan Eßer 801252884aeSStefan Eßer "BC_INST_CALL", 802252884aeSStefan Eßer 803252884aeSStefan Eßer "BC_INST_RET", 804252884aeSStefan Eßer "BC_INST_RET0", 805252884aeSStefan Eßer "BC_INST_RET_VOID", 806252884aeSStefan Eßer 807252884aeSStefan Eßer "BC_INST_HALT", 808252884aeSStefan Eßer #endif // BC_ENABLED 809252884aeSStefan Eßer 810252884aeSStefan Eßer "BC_INST_POP", 81144d4804dSStefan Eßer "BC_INST_SWAP", 812252884aeSStefan Eßer "BC_INST_MODEXP", 813252884aeSStefan Eßer "BC_INST_DIVMOD", 81444d4804dSStefan Eßer "BC_INST_PRINT_STREAM", 81544d4804dSStefan Eßer 81644d4804dSStefan Eßer #if DC_ENABLED 81744d4804dSStefan Eßer "BC_INST_POP_EXEC", 818252884aeSStefan Eßer 819252884aeSStefan Eßer "BC_INST_EXECUTE", 820252884aeSStefan Eßer "BC_INST_EXEC_COND", 821252884aeSStefan Eßer 822252884aeSStefan Eßer "BC_INST_PRINT_STACK", 823252884aeSStefan Eßer "BC_INST_CLEAR_STACK", 82444d4804dSStefan Eßer "BC_INST_REG_STACK_LEN", 825252884aeSStefan Eßer "BC_INST_STACK_LEN", 826252884aeSStefan Eßer "BC_INST_DUPLICATE", 827252884aeSStefan Eßer 828252884aeSStefan Eßer "BC_INST_LOAD", 829252884aeSStefan Eßer "BC_INST_PUSH_VAR", 830252884aeSStefan Eßer "BC_INST_PUSH_TO_VAR", 831252884aeSStefan Eßer 832252884aeSStefan Eßer "BC_INST_QUIT", 833252884aeSStefan Eßer "BC_INST_NQUIT", 83444d4804dSStefan Eßer 83544d4804dSStefan Eßer "BC_INST_EXEC_STACK_LEN", 836252884aeSStefan Eßer #endif // DC_ENABLED 83744d4804dSStefan Eßer 83844d4804dSStefan Eßer "BC_INST_INVALID", 839252884aeSStefan Eßer }; 84044d4804dSStefan Eßer 841252884aeSStefan Eßer #endif // BC_DEBUG_CODE 842252884aeSStefan Eßer 84344d4804dSStefan Eßer /// A constant string for 0. 84450696a6eSStefan Eßer const char bc_parse_zero[2] = "0"; 84544d4804dSStefan Eßer 84644d4804dSStefan Eßer /// A constant string for 1. 84750696a6eSStefan Eßer const char bc_parse_one[2] = "1"; 848252884aeSStefan Eßer 849252884aeSStefan Eßer #if BC_ENABLED 85044d4804dSStefan Eßer 85144d4804dSStefan Eßer /// A list of keywords for bc. This needs to be updated if keywords change. 852252884aeSStefan Eßer const BcLexKeyword bc_lex_kws[] = { 853252884aeSStefan Eßer BC_LEX_KW_ENTRY("auto", 4, true), 854252884aeSStefan Eßer BC_LEX_KW_ENTRY("break", 5, true), 855252884aeSStefan Eßer BC_LEX_KW_ENTRY("continue", 8, false), 856252884aeSStefan Eßer BC_LEX_KW_ENTRY("define", 6, true), 857252884aeSStefan Eßer BC_LEX_KW_ENTRY("for", 3, true), 858252884aeSStefan Eßer BC_LEX_KW_ENTRY("if", 2, true), 859252884aeSStefan Eßer BC_LEX_KW_ENTRY("limits", 6, false), 860252884aeSStefan Eßer BC_LEX_KW_ENTRY("return", 6, true), 861252884aeSStefan Eßer BC_LEX_KW_ENTRY("while", 5, true), 862252884aeSStefan Eßer BC_LEX_KW_ENTRY("halt", 4, false), 863252884aeSStefan Eßer BC_LEX_KW_ENTRY("last", 4, false), 864252884aeSStefan Eßer BC_LEX_KW_ENTRY("ibase", 5, true), 865252884aeSStefan Eßer BC_LEX_KW_ENTRY("obase", 5, true), 866252884aeSStefan Eßer BC_LEX_KW_ENTRY("scale", 5, true), 86744d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 868252884aeSStefan Eßer BC_LEX_KW_ENTRY("seed", 4, false), 86944d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 870252884aeSStefan Eßer BC_LEX_KW_ENTRY("length", 6, true), 871252884aeSStefan Eßer BC_LEX_KW_ENTRY("print", 5, false), 872252884aeSStefan Eßer BC_LEX_KW_ENTRY("sqrt", 4, true), 873252884aeSStefan Eßer BC_LEX_KW_ENTRY("abs", 3, false), 874d101cdd6SStefan Eßer BC_LEX_KW_ENTRY("is_number", 9, false), 875d101cdd6SStefan Eßer BC_LEX_KW_ENTRY("is_string", 9, false), 87644d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 877252884aeSStefan Eßer BC_LEX_KW_ENTRY("irand", 5, false), 87844d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 87944d4804dSStefan Eßer BC_LEX_KW_ENTRY("asciify", 7, false), 88044d4804dSStefan Eßer BC_LEX_KW_ENTRY("modexp", 6, false), 88144d4804dSStefan Eßer BC_LEX_KW_ENTRY("divmod", 6, false), 882252884aeSStefan Eßer BC_LEX_KW_ENTRY("quit", 4, true), 883252884aeSStefan Eßer BC_LEX_KW_ENTRY("read", 4, false), 88444d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 885252884aeSStefan Eßer BC_LEX_KW_ENTRY("rand", 4, false), 88644d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 887252884aeSStefan Eßer BC_LEX_KW_ENTRY("maxibase", 8, false), 888252884aeSStefan Eßer BC_LEX_KW_ENTRY("maxobase", 8, false), 889252884aeSStefan Eßer BC_LEX_KW_ENTRY("maxscale", 8, false), 89044d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 891252884aeSStefan Eßer BC_LEX_KW_ENTRY("maxrand", 7, false), 89244d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 893d43fa8efSStefan Eßer BC_LEX_KW_ENTRY("line_length", 11, false), 894d43fa8efSStefan Eßer BC_LEX_KW_ENTRY("global_stacks", 13, false), 895d43fa8efSStefan Eßer BC_LEX_KW_ENTRY("leading_zero", 12, false), 89644d4804dSStefan Eßer BC_LEX_KW_ENTRY("stream", 6, false), 897252884aeSStefan Eßer BC_LEX_KW_ENTRY("else", 4, false), 898252884aeSStefan Eßer }; 899252884aeSStefan Eßer 90044d4804dSStefan Eßer /// The length of the list of bc keywords. 901252884aeSStefan Eßer const size_t bc_lex_kws_len = sizeof(bc_lex_kws) / sizeof(BcLexKeyword); 902252884aeSStefan Eßer 90344d4804dSStefan Eßer #if BC_C11 90444d4804dSStefan Eßer 90544d4804dSStefan Eßer // This is here to ensure that BC_LEX_NKWS, which is needed for the 90644d4804dSStefan Eßer // redefined_kws in BcVm, is correct. If it's correct under C11, it will be 90744d4804dSStefan Eßer // correct under C99, and I did not know any other way of ensuring they remained 90844d4804dSStefan Eßer // synchronized. 90978bc019dSStefan Eßer _Static_assert(sizeof(bc_lex_kws) / sizeof(BcLexKeyword) == BC_LEX_NKWS, 91044d4804dSStefan Eßer "BC_LEX_NKWS is wrong."); 91144d4804dSStefan Eßer 91244d4804dSStefan Eßer #endif // BC_C11 91344d4804dSStefan Eßer 91444d4804dSStefan Eßer /// An array of booleans that correspond to token types. An entry is true if the 91544d4804dSStefan Eßer /// token is valid in an expression, false otherwise. This will need to change 91644d4804dSStefan Eßer /// if tokens change. 917252884aeSStefan Eßer const uint8_t bc_parse_exprs[] = { 91844d4804dSStefan Eßer 91944d4804dSStefan Eßer // Starts with BC_LEX_EOF. 920252884aeSStefan Eßer BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, true), 92144d4804dSStefan Eßer 92244d4804dSStefan Eßer // Starts with BC_LEX_OP_MULTIPLY if extra math is enabled, BC_LEX_OP_DIVIDE 92344d4804dSStefan Eßer // otherwise. 924252884aeSStefan Eßer BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true), 92544d4804dSStefan Eßer 92644d4804dSStefan Eßer // Starts with BC_LEX_OP_REL_EQ if extra math is enabled, BC_LEX_OP_REL_LT 92744d4804dSStefan Eßer // otherwise. 928252884aeSStefan Eßer BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true), 92944d4804dSStefan Eßer 93044d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 93144d4804dSStefan Eßer 93244d4804dSStefan Eßer // Starts with BC_LEX_OP_ASSIGN_POWER. 933252884aeSStefan Eßer BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true), 93444d4804dSStefan Eßer 93544d4804dSStefan Eßer // Starts with BC_LEX_OP_ASSIGN_RSHIFT. 936252884aeSStefan Eßer BC_PARSE_EXPR_ENTRY(true, true, false, false, true, true, false, false), 93744d4804dSStefan Eßer 93844d4804dSStefan Eßer // Starts with BC_LEX_RBRACKET. 93944d4804dSStefan Eßer BC_PARSE_EXPR_ENTRY(false, false, false, false, true, true, true, false), 94044d4804dSStefan Eßer 94144d4804dSStefan Eßer // Starts with BC_LEX_KW_BREAK. 942252884aeSStefan Eßer BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false), 94344d4804dSStefan Eßer 94444d4804dSStefan Eßer // Starts with BC_LEX_KW_HALT. 945252884aeSStefan Eßer BC_PARSE_EXPR_ENTRY(false, true, true, true, true, true, true, false), 94644d4804dSStefan Eßer 94744d4804dSStefan Eßer // Starts with BC_LEX_KW_SQRT. 948d43fa8efSStefan Eßer BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, true), 949d43fa8efSStefan Eßer 950d101cdd6SStefan Eßer // Starts with BC_LEX_KW_QUIT. 951d101cdd6SStefan Eßer BC_PARSE_EXPR_ENTRY(false, true, true, true, true, true, true, true), 952d101cdd6SStefan Eßer 953d101cdd6SStefan Eßer // Starts with BC_LEX_KW_GLOBAL_STACKS. 954d101cdd6SStefan Eßer BC_PARSE_EXPR_ENTRY(true, true, false, false, 0, 0, 0, 0) 95544d4804dSStefan Eßer 95644d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 95744d4804dSStefan Eßer 95844d4804dSStefan Eßer // Starts with BC_LEX_OP_ASSIGN_PLUS. 959252884aeSStefan Eßer BC_PARSE_EXPR_ENTRY(true, true, true, false, false, true, true, false), 96044d4804dSStefan Eßer 96144d4804dSStefan Eßer // Starts with BC_LEX_COMMA. 96244d4804dSStefan Eßer BC_PARSE_EXPR_ENTRY(false, false, false, false, false, true, true, true), 96344d4804dSStefan Eßer 96444d4804dSStefan Eßer // Starts with BC_LEX_KW_AUTO. 965252884aeSStefan Eßer BC_PARSE_EXPR_ENTRY(false, false, false, false, false, false, false, false), 96644d4804dSStefan Eßer 96744d4804dSStefan Eßer // Starts with BC_LEX_KW_WHILE. 968252884aeSStefan Eßer BC_PARSE_EXPR_ENTRY(false, false, true, true, true, true, true, false), 96944d4804dSStefan Eßer 97044d4804dSStefan Eßer // Starts with BC_LEX_KW_SQRT. 971d101cdd6SStefan Eßer BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, false), 97244d4804dSStefan Eßer 973d101cdd6SStefan Eßer // Starts with BC_LEX_KW_MAXIBASE. 974d101cdd6SStefan Eßer BC_PARSE_EXPR_ENTRY(true, true, true, true, true, true, true, false), 975d101cdd6SStefan Eßer 976d101cdd6SStefan Eßer // Starts with BC_LEX_KW_ELSE. 977d101cdd6SStefan Eßer BC_PARSE_EXPR_ENTRY(false, 0, 0, 0, 0, 0, 0, 0) 97844d4804dSStefan Eßer 979252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 980252884aeSStefan Eßer }; 981252884aeSStefan Eßer 982d101cdd6SStefan Eßer /// An array of data for operators that correspond to token types. Note that a 983d101cdd6SStefan Eßer /// lower precedence *value* means a higher precedence. 984252884aeSStefan Eßer const uchar bc_parse_ops[] = { 98578bc019dSStefan Eßer BC_PARSE_OP(0, false), BC_PARSE_OP(0, false), BC_PARSE_OP(1, false), 98678bc019dSStefan Eßer BC_PARSE_OP(1, false), 987252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 988252884aeSStefan Eßer BC_PARSE_OP(2, false), 989252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 99078bc019dSStefan Eßer BC_PARSE_OP(4, false), BC_PARSE_OP(5, true), BC_PARSE_OP(5, true), 99178bc019dSStefan Eßer BC_PARSE_OP(5, true), BC_PARSE_OP(6, true), BC_PARSE_OP(6, true), 992252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 99378bc019dSStefan Eßer BC_PARSE_OP(3, false), BC_PARSE_OP(7, true), BC_PARSE_OP(7, true), 994252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 995252884aeSStefan Eßer BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), 996252884aeSStefan Eßer BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), BC_PARSE_OP(9, true), 99778bc019dSStefan Eßer BC_PARSE_OP(11, true), BC_PARSE_OP(10, true), BC_PARSE_OP(8, false), 998252884aeSStefan Eßer BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), 99978bc019dSStefan Eßer BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), 1000252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1001252884aeSStefan Eßer BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), BC_PARSE_OP(8, false), 1002252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1003252884aeSStefan Eßer BC_PARSE_OP(8, false), 1004252884aeSStefan Eßer }; 1005252884aeSStefan Eßer 1006252884aeSStefan Eßer // These identify what tokens can come after expressions in certain cases. 100744d4804dSStefan Eßer 100844d4804dSStefan Eßer /// The valid next tokens for normal expressions. 100978bc019dSStefan Eßer const BcParseNext bc_parse_next_expr = BC_PARSE_NEXT(4, BC_LEX_NLINE, 101078bc019dSStefan Eßer BC_LEX_SCOLON, 101178bc019dSStefan Eßer BC_LEX_RBRACE, BC_LEX_EOF); 101244d4804dSStefan Eßer 101344d4804dSStefan Eßer /// The valid next tokens for function argument expressions. 101478bc019dSStefan Eßer const BcParseNext bc_parse_next_arg = BC_PARSE_NEXT(2, BC_LEX_RPAREN, 101578bc019dSStefan Eßer BC_LEX_COMMA); 101644d4804dSStefan Eßer 101744d4804dSStefan Eßer /// The valid next tokens for expressions in print statements. 101878bc019dSStefan Eßer const BcParseNext bc_parse_next_print = BC_PARSE_NEXT(4, BC_LEX_COMMA, 101978bc019dSStefan Eßer BC_LEX_NLINE, 102078bc019dSStefan Eßer BC_LEX_SCOLON, 102178bc019dSStefan Eßer BC_LEX_EOF); 102244d4804dSStefan Eßer 102344d4804dSStefan Eßer /// The valid next tokens for if statement conditions or loop conditions. This 102444d4804dSStefan Eßer /// is used in for loops for the update expression and for builtin function. 102544d4804dSStefan Eßer /// 102644d4804dSStefan Eßer /// The name is an artifact of history, and is related to @a BC_PARSE_REL (see 102744d4804dSStefan Eßer /// include/parse.h). It refers to how POSIX only allows some operators as part 102844d4804dSStefan Eßer /// of the conditional of for loops, while loops, and if statements. 1029252884aeSStefan Eßer const BcParseNext bc_parse_next_rel = BC_PARSE_NEXT(1, BC_LEX_RPAREN); 103044d4804dSStefan Eßer 103144d4804dSStefan Eßer /// The valid next tokens for array element expressions. 1032252884aeSStefan Eßer const BcParseNext bc_parse_next_elem = BC_PARSE_NEXT(1, BC_LEX_RBRACKET); 103344d4804dSStefan Eßer 103444d4804dSStefan Eßer /// The valid next tokens for for loop initialization expressions and condition 103544d4804dSStefan Eßer /// expressions. 1036252884aeSStefan Eßer const BcParseNext bc_parse_next_for = BC_PARSE_NEXT(1, BC_LEX_SCOLON); 103744d4804dSStefan Eßer 103844d4804dSStefan Eßer /// The valid next tokens for read expressions. 103978bc019dSStefan Eßer const BcParseNext bc_parse_next_read = BC_PARSE_NEXT(2, BC_LEX_NLINE, 104078bc019dSStefan Eßer BC_LEX_EOF); 104144d4804dSStefan Eßer 104244d4804dSStefan Eßer /// The valid next tokens for the arguments of a builtin function with multiple 104344d4804dSStefan Eßer /// arguments. 104444d4804dSStefan Eßer const BcParseNext bc_parse_next_builtin = BC_PARSE_NEXT(1, BC_LEX_COMMA); 104544d4804dSStefan Eßer 1046252884aeSStefan Eßer #endif // BC_ENABLED 1047252884aeSStefan Eßer 1048252884aeSStefan Eßer #if DC_ENABLED 104944d4804dSStefan Eßer 105044d4804dSStefan Eßer /// A list of instructions that need register arguments in dc. 1051252884aeSStefan Eßer const uint8_t dc_lex_regs[] = { 105278bc019dSStefan Eßer BC_LEX_OP_REL_EQ, BC_LEX_OP_REL_LE, BC_LEX_OP_REL_GE, 105378bc019dSStefan Eßer BC_LEX_OP_REL_NE, BC_LEX_OP_REL_LT, BC_LEX_OP_REL_GT, 105478bc019dSStefan Eßer BC_LEX_SCOLON, BC_LEX_COLON, BC_LEX_KW_ELSE, 105578bc019dSStefan Eßer BC_LEX_LOAD, BC_LEX_LOAD_POP, BC_LEX_OP_ASSIGN, 105644d4804dSStefan Eßer BC_LEX_STORE_PUSH, BC_LEX_REG_STACK_LEVEL, BC_LEX_ARRAY_LENGTH, 1057252884aeSStefan Eßer }; 1058252884aeSStefan Eßer 105944d4804dSStefan Eßer /// The length of the list of register instructions. 1060252884aeSStefan Eßer const size_t dc_lex_regs_len = sizeof(dc_lex_regs) / sizeof(uint8_t); 1061252884aeSStefan Eßer 106244d4804dSStefan Eßer /// A list corresponding to characters starting at double quote ("). If an entry 106344d4804dSStefan Eßer /// is BC_LEX_INVALID, then that character needs extra lexing in dc. If it does 106444d4804dSStefan Eßer /// not, the character can trivially be replaced by the entry. Positions are 106544d4804dSStefan Eßer /// kept because it corresponds to the ASCII table. This may need to be changed 106644d4804dSStefan Eßer /// if tokens change. 1067252884aeSStefan Eßer const uchar dc_lex_tokens[] = { 106844d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1069252884aeSStefan Eßer BC_LEX_KW_IRAND, 107044d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 1071252884aeSStefan Eßer BC_LEX_INVALID, 107244d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1073252884aeSStefan Eßer BC_LEX_INVALID, 1074252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1075252884aeSStefan Eßer BC_LEX_OP_TRUNC, 1076252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 1077252884aeSStefan Eßer BC_LEX_INVALID, 1078252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 107978bc019dSStefan Eßer BC_LEX_OP_MODULUS, 108078bc019dSStefan Eßer BC_LEX_INVALID, 108144d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1082252884aeSStefan Eßer BC_LEX_KW_RAND, 108344d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 1084252884aeSStefan Eßer BC_LEX_INVALID, 108544d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 108678bc019dSStefan Eßer BC_LEX_LPAREN, 108778bc019dSStefan Eßer BC_LEX_RPAREN, 108878bc019dSStefan Eßer BC_LEX_OP_MULTIPLY, 108978bc019dSStefan Eßer BC_LEX_OP_PLUS, 109078bc019dSStefan Eßer BC_LEX_EXEC_STACK_LENGTH, 109178bc019dSStefan Eßer BC_LEX_OP_MINUS, 109278bc019dSStefan Eßer BC_LEX_INVALID, 109378bc019dSStefan Eßer BC_LEX_OP_DIVIDE, 109478bc019dSStefan Eßer BC_LEX_INVALID, 109578bc019dSStefan Eßer BC_LEX_INVALID, 109678bc019dSStefan Eßer BC_LEX_INVALID, 109778bc019dSStefan Eßer BC_LEX_INVALID, 109878bc019dSStefan Eßer BC_LEX_INVALID, 109978bc019dSStefan Eßer BC_LEX_INVALID, 110078bc019dSStefan Eßer BC_LEX_INVALID, 110178bc019dSStefan Eßer BC_LEX_INVALID, 110278bc019dSStefan Eßer BC_LEX_INVALID, 110378bc019dSStefan Eßer BC_LEX_INVALID, 110478bc019dSStefan Eßer BC_LEX_COLON, 110578bc019dSStefan Eßer BC_LEX_SCOLON, 110678bc019dSStefan Eßer BC_LEX_OP_REL_GT, 110778bc019dSStefan Eßer BC_LEX_OP_REL_EQ, 110878bc019dSStefan Eßer BC_LEX_OP_REL_LT, 110978bc019dSStefan Eßer BC_LEX_KW_READ, 1110252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1111252884aeSStefan Eßer BC_LEX_OP_PLACES, 1112252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 1113252884aeSStefan Eßer BC_LEX_INVALID, 1114252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 111578bc019dSStefan Eßer BC_LEX_INVALID, 111678bc019dSStefan Eßer BC_LEX_INVALID, 111778bc019dSStefan Eßer BC_LEX_INVALID, 111878bc019dSStefan Eßer BC_LEX_INVALID, 111978bc019dSStefan Eßer BC_LEX_INVALID, 112078bc019dSStefan Eßer BC_LEX_INVALID, 112178bc019dSStefan Eßer BC_LEX_EQ_NO_REG, 1122252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1123252884aeSStefan Eßer BC_LEX_OP_LSHIFT, 1124252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 1125252884aeSStefan Eßer BC_LEX_INVALID, 1126252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1127252884aeSStefan Eßer BC_LEX_KW_IBASE, 112844d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1129252884aeSStefan Eßer BC_LEX_KW_SEED, 113044d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 1131252884aeSStefan Eßer BC_LEX_INVALID, 113244d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 113378bc019dSStefan Eßer BC_LEX_KW_SCALE, 113478bc019dSStefan Eßer BC_LEX_LOAD_POP, 113578bc019dSStefan Eßer BC_LEX_OP_BOOL_AND, 113678bc019dSStefan Eßer BC_LEX_OP_BOOL_NOT, 113778bc019dSStefan Eßer BC_LEX_KW_OBASE, 113878bc019dSStefan Eßer BC_LEX_KW_STREAM, 113978bc019dSStefan Eßer BC_LEX_NQUIT, 114078bc019dSStefan Eßer BC_LEX_POP, 114178bc019dSStefan Eßer BC_LEX_STORE_PUSH, 114278bc019dSStefan Eßer BC_LEX_KW_MAXIBASE, 114378bc019dSStefan Eßer BC_LEX_KW_MAXOBASE, 1144252884aeSStefan Eßer BC_LEX_KW_MAXSCALE, 114544d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1146252884aeSStefan Eßer BC_LEX_KW_MAXRAND, 114744d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 1148252884aeSStefan Eßer BC_LEX_INVALID, 114944d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 115078bc019dSStefan Eßer BC_LEX_SCALE_FACTOR, 115178bc019dSStefan Eßer BC_LEX_ARRAY_LENGTH, 115278bc019dSStefan Eßer BC_LEX_KW_LENGTH, 115378bc019dSStefan Eßer BC_LEX_INVALID, 115478bc019dSStefan Eßer BC_LEX_INVALID, 115578bc019dSStefan Eßer BC_LEX_INVALID, 115678bc019dSStefan Eßer BC_LEX_OP_POWER, 115778bc019dSStefan Eßer BC_LEX_NEG, 115878bc019dSStefan Eßer BC_LEX_INVALID, 115978bc019dSStefan Eßer BC_LEX_KW_ASCIIFY, 116078bc019dSStefan Eßer BC_LEX_KW_ABS, 116178bc019dSStefan Eßer BC_LEX_CLEAR_STACK, 116278bc019dSStefan Eßer BC_LEX_DUPLICATE, 116378bc019dSStefan Eßer BC_LEX_KW_ELSE, 116478bc019dSStefan Eßer BC_LEX_PRINT_STACK, 116578bc019dSStefan Eßer BC_LEX_INVALID, 1166252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1167252884aeSStefan Eßer BC_LEX_OP_RSHIFT, 1168252884aeSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 1169252884aeSStefan Eßer BC_LEX_INVALID, 1170252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1171252884aeSStefan Eßer BC_LEX_STORE_IBASE, 117244d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1173252884aeSStefan Eßer BC_LEX_STORE_SEED, 117444d4804dSStefan Eßer #else // BC_ENABLE_EXTRA_MATH 1175252884aeSStefan Eßer BC_LEX_INVALID, 117644d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 117778bc019dSStefan Eßer BC_LEX_STORE_SCALE, 117878bc019dSStefan Eßer BC_LEX_LOAD, 117978bc019dSStefan Eßer BC_LEX_OP_BOOL_OR, 118078bc019dSStefan Eßer BC_LEX_PRINT_POP, 118178bc019dSStefan Eßer BC_LEX_STORE_OBASE, 118278bc019dSStefan Eßer BC_LEX_KW_PRINT, 118378bc019dSStefan Eßer BC_LEX_KW_QUIT, 118478bc019dSStefan Eßer BC_LEX_SWAP, 118578bc019dSStefan Eßer BC_LEX_OP_ASSIGN, 1186d101cdd6SStefan Eßer BC_LEX_KW_IS_STRING, 1187d101cdd6SStefan Eßer BC_LEX_KW_IS_NUMBER, 118878bc019dSStefan Eßer BC_LEX_KW_SQRT, 118978bc019dSStefan Eßer BC_LEX_INVALID, 119078bc019dSStefan Eßer BC_LEX_EXECUTE, 119178bc019dSStefan Eßer BC_LEX_REG_STACK_LEVEL, 119278bc019dSStefan Eßer BC_LEX_STACK_LEVEL, 119378bc019dSStefan Eßer BC_LEX_LBRACE, 119478bc019dSStefan Eßer BC_LEX_KW_MODEXP, 119578bc019dSStefan Eßer BC_LEX_RBRACE, 119678bc019dSStefan Eßer BC_LEX_KW_DIVMOD, 1197252884aeSStefan Eßer BC_LEX_INVALID 1198252884aeSStefan Eßer }; 1199252884aeSStefan Eßer 120044d4804dSStefan Eßer /// A list of instructions that correspond to lex tokens. If an entry is 1201d101cdd6SStefan Eßer /// @a BC_INST_INVALID, that lex token needs extra parsing in the dc parser. 120244d4804dSStefan Eßer /// Otherwise, the token can trivially be replaced by the entry. This needs to 120344d4804dSStefan Eßer /// be updated if the tokens change. 1204252884aeSStefan Eßer const uchar dc_parse_insts[] = { 1205252884aeSStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1206252884aeSStefan Eßer #if BC_ENABLED 1207252884aeSStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1208252884aeSStefan Eßer #endif // BC_ENABLED 1209252884aeSStefan Eßer BC_INST_INVALID, BC_INST_BOOL_NOT, 1210252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1211252884aeSStefan Eßer BC_INST_TRUNC, 1212252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1213175a4d10SStefan Eßer BC_INST_POWER, BC_INST_MULTIPLY, 1214175a4d10SStefan Eßer BC_INST_DIVIDE, BC_INST_MODULUS, 1215175a4d10SStefan Eßer BC_INST_PLUS, BC_INST_MINUS, 1216252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1217175a4d10SStefan Eßer BC_INST_PLACES, BC_INST_LSHIFT, 1218175a4d10SStefan Eßer BC_INST_RSHIFT, 1219252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1220175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1221175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1222175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1223252884aeSStefan Eßer BC_INST_BOOL_OR, BC_INST_BOOL_AND, 1224252884aeSStefan Eßer #if BC_ENABLED 1225175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1226175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1227175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1228252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1229175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1230175a4d10SStefan Eßer BC_INST_INVALID, 1231252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1232252884aeSStefan Eßer #endif // BC_ENABLED 1233175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1234175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_REL_GT, 1235175a4d10SStefan Eßer BC_INST_REL_LT, BC_INST_INVALID, 1236175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1237175a4d10SStefan Eßer BC_INST_REL_GE, BC_INST_INVALID, 1238175a4d10SStefan Eßer BC_INST_REL_LE, BC_INST_INVALID, 123978bc019dSStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1240252884aeSStefan Eßer #if BC_ENABLED 124178bc019dSStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1242175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1243175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1244175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1245175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1246175a4d10SStefan Eßer BC_INST_INVALID, 1247252884aeSStefan Eßer #endif // BC_ENABLED 1248175a4d10SStefan Eßer BC_INST_IBASE, BC_INST_OBASE, 1249175a4d10SStefan Eßer BC_INST_SCALE, 125044d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1251252884aeSStefan Eßer BC_INST_SEED, 125244d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1253175a4d10SStefan Eßer BC_INST_LENGTH, BC_INST_PRINT, 1254175a4d10SStefan Eßer BC_INST_SQRT, BC_INST_ABS, 1255175a4d10SStefan Eßer BC_INST_IS_NUMBER, BC_INST_IS_STRING, 125644d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1257252884aeSStefan Eßer BC_INST_IRAND, 125844d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1259175a4d10SStefan Eßer BC_INST_ASCIIFY, BC_INST_MODEXP, 1260175a4d10SStefan Eßer BC_INST_DIVMOD, BC_INST_QUIT, 1261175a4d10SStefan Eßer BC_INST_INVALID, 126244d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1263252884aeSStefan Eßer BC_INST_RAND, 126444d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1265175a4d10SStefan Eßer BC_INST_MAXIBASE, BC_INST_MAXOBASE, 1266175a4d10SStefan Eßer BC_INST_MAXSCALE, 126744d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1268252884aeSStefan Eßer BC_INST_MAXRAND, 1269252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1270d43fa8efSStefan Eßer BC_INST_LINE_LENGTH, 1271d43fa8efSStefan Eßer #if BC_ENABLED 1272d43fa8efSStefan Eßer BC_INST_INVALID, 1273d43fa8efSStefan Eßer #endif // BC_ENABLED 1274175a4d10SStefan Eßer BC_INST_LEADING_ZERO, BC_INST_PRINT_STREAM, 1275175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_EXTENDED_REGISTERS, 1276175a4d10SStefan Eßer BC_INST_REL_EQ, BC_INST_INVALID, 1277175a4d10SStefan Eßer BC_INST_EXECUTE, BC_INST_PRINT_STACK, 1278175a4d10SStefan Eßer BC_INST_CLEAR_STACK, BC_INST_INVALID, 1279175a4d10SStefan Eßer BC_INST_STACK_LEN, BC_INST_DUPLICATE, 1280175a4d10SStefan Eßer BC_INST_SWAP, BC_INST_POP, 1281103d7cdfSStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1282175a4d10SStefan Eßer BC_INST_INVALID, 1283252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1284252884aeSStefan Eßer BC_INST_INVALID, 1285252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1286175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_INVALID, 1287175a4d10SStefan Eßer BC_INST_INVALID, BC_INST_PRINT_POP, 1288175a4d10SStefan Eßer BC_INST_NQUIT, BC_INST_EXEC_STACK_LEN, 128944d4804dSStefan Eßer BC_INST_SCALE_FUNC, BC_INST_INVALID, 1290252884aeSStefan Eßer }; 1291252884aeSStefan Eßer #endif // DC_ENABLED 1292252884aeSStefan Eßer 129350696a6eSStefan Eßer #endif // !BC_ENABLE_LIBRARY 129450696a6eSStefan Eßer 129544d4804dSStefan Eßer #if BC_ENABLE_EXTRA_MATH 129650696a6eSStefan Eßer 129744d4804dSStefan Eßer /// A constant for the rand multiplier. 129850696a6eSStefan Eßer const BcRandState bc_rand_multiplier = BC_RAND_MULTIPLIER; 129950696a6eSStefan Eßer 130044d4804dSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 130150696a6eSStefan Eßer 130278bc019dSStefan Eßer // clang-format off 130378bc019dSStefan Eßer 1304252884aeSStefan Eßer #if BC_LONG_BIT >= 64 130544d4804dSStefan Eßer 130644d4804dSStefan Eßer /// A constant array for the max of a bigdig number as a BcDig array. 1307252884aeSStefan Eßer const BcDig bc_num_bigdigMax[] = { 1308252884aeSStefan Eßer 709551616U, 1309252884aeSStefan Eßer 446744073U, 131050696a6eSStefan Eßer 18U, 131150696a6eSStefan Eßer }; 131244d4804dSStefan Eßer 131344d4804dSStefan Eßer /// A constant array for the max of 2 times a bigdig number as a BcDig array. 131450696a6eSStefan Eßer const BcDig bc_num_bigdigMax2[] = { 131550696a6eSStefan Eßer 768211456U, 131650696a6eSStefan Eßer 374607431U, 131750696a6eSStefan Eßer 938463463U, 131850696a6eSStefan Eßer 282366920U, 131950696a6eSStefan Eßer 340U, 1320252884aeSStefan Eßer }; 132144d4804dSStefan Eßer 1322252884aeSStefan Eßer #else // BC_LONG_BIT >= 64 132344d4804dSStefan Eßer 132444d4804dSStefan Eßer /// A constant array for the max of a bigdig number as a BcDig array. 1325252884aeSStefan Eßer const BcDig bc_num_bigdigMax[] = { 1326252884aeSStefan Eßer 7296U, 1327252884aeSStefan Eßer 9496U, 1328252884aeSStefan Eßer 42U, 1329252884aeSStefan Eßer }; 133044d4804dSStefan Eßer 133144d4804dSStefan Eßer /// A constant array for the max of 2 times a bigdig number as a BcDig array. 133250696a6eSStefan Eßer const BcDig bc_num_bigdigMax2[] = { 133350696a6eSStefan Eßer 1616U, 133450696a6eSStefan Eßer 955U, 133550696a6eSStefan Eßer 737U, 133650696a6eSStefan Eßer 6744U, 133750696a6eSStefan Eßer 1844U, 133850696a6eSStefan Eßer }; 133944d4804dSStefan Eßer 1340252884aeSStefan Eßer #endif // BC_LONG_BIT >= 64 1341252884aeSStefan Eßer 134278bc019dSStefan Eßer // clang-format on 134378bc019dSStefan Eßer 134444d4804dSStefan Eßer /// The size of the bigdig max array. 1345252884aeSStefan Eßer const size_t bc_num_bigdigMax_size = sizeof(bc_num_bigdigMax) / sizeof(BcDig); 134644d4804dSStefan Eßer 134744d4804dSStefan Eßer /// The size of the bigdig max times 2 array. 134850696a6eSStefan Eßer const size_t bc_num_bigdigMax2_size = sizeof(bc_num_bigdigMax2) / sizeof(BcDig); 1349252884aeSStefan Eßer 135044d4804dSStefan Eßer /// A string of digits for easy conversion from characters to digits. 1351252884aeSStefan Eßer const char bc_num_hex_digits[] = "0123456789ABCDEF"; 1352252884aeSStefan Eßer 135378bc019dSStefan Eßer // clang-format off 135478bc019dSStefan Eßer 135544d4804dSStefan Eßer /// An array for easy conversion from exponent to power of 10. 1356252884aeSStefan Eßer const BcBigDig bc_num_pow10[BC_BASE_DIGS + 1] = { 1357252884aeSStefan Eßer 1, 1358252884aeSStefan Eßer 10, 1359252884aeSStefan Eßer 100, 1360252884aeSStefan Eßer 1000, 1361252884aeSStefan Eßer 10000, 1362252884aeSStefan Eßer #if BC_BASE_DIGS > 4 1363252884aeSStefan Eßer 100000, 1364252884aeSStefan Eßer 1000000, 1365252884aeSStefan Eßer 10000000, 1366252884aeSStefan Eßer 100000000, 1367252884aeSStefan Eßer 1000000000, 1368252884aeSStefan Eßer #endif // BC_BASE_DIGS > 4 1369252884aeSStefan Eßer }; 1370252884aeSStefan Eßer 137178bc019dSStefan Eßer // clang-format on 137278bc019dSStefan Eßer 137350696a6eSStefan Eßer #if !BC_ENABLE_LIBRARY 137450696a6eSStefan Eßer 137544d4804dSStefan Eßer /// An array of functions for binary operators corresponding to the order of 137644d4804dSStefan Eßer /// the instructions for the operators. 1377252884aeSStefan Eßer const BcNumBinaryOp bc_program_ops[] = { 137878bc019dSStefan Eßer bc_num_pow, bc_num_mul, bc_num_div, 137978bc019dSStefan Eßer bc_num_mod, bc_num_add, bc_num_sub, 1380252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1381252884aeSStefan Eßer bc_num_places, bc_num_lshift, bc_num_rshift, 1382252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1383252884aeSStefan Eßer }; 1384252884aeSStefan Eßer 138544d4804dSStefan Eßer /// An array of functions for binary operators allocation requests corresponding 138644d4804dSStefan Eßer /// to the order of the instructions for the operators. 1387252884aeSStefan Eßer const BcNumBinaryOpReq bc_program_opReqs[] = { 138878bc019dSStefan Eßer bc_num_powReq, bc_num_mulReq, bc_num_divReq, 138978bc019dSStefan Eßer bc_num_divReq, bc_num_addReq, bc_num_addReq, 1390252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1391252884aeSStefan Eßer bc_num_placesReq, bc_num_placesReq, bc_num_placesReq, 1392252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1393252884aeSStefan Eßer }; 1394252884aeSStefan Eßer 139544d4804dSStefan Eßer /// An array of unary operator functions corresponding to the order of the 139644d4804dSStefan Eßer /// instructions. 1397252884aeSStefan Eßer const BcProgramUnary bc_program_unarys[] = { 139878bc019dSStefan Eßer bc_program_negate, 139978bc019dSStefan Eßer bc_program_not, 1400252884aeSStefan Eßer #if BC_ENABLE_EXTRA_MATH 1401252884aeSStefan Eßer bc_program_trunc, 1402252884aeSStefan Eßer #endif // BC_ENABLE_EXTRA_MATH 1403252884aeSStefan Eßer }; 1404252884aeSStefan Eßer 140544d4804dSStefan Eßer /// A filename for when parsing expressions. 1406252884aeSStefan Eßer const char bc_program_exprs_name[] = "<exprs>"; 1407252884aeSStefan Eßer 140844d4804dSStefan Eßer /// A filename for when parsing stdin.. 1409252884aeSStefan Eßer const char bc_program_stdin_name[] = "<stdin>"; 141044d4804dSStefan Eßer 141144d4804dSStefan Eßer /// A ready message for SIGINT catching. 1412252884aeSStefan Eßer const char bc_program_ready_msg[] = "ready for more input\n"; 141344d4804dSStefan Eßer 141444d4804dSStefan Eßer /// The length of the ready message. 1415252884aeSStefan Eßer const size_t bc_program_ready_msg_len = sizeof(bc_program_ready_msg) - 1; 141644d4804dSStefan Eßer 141744d4804dSStefan Eßer /// A list of escape characters that a print statement should treat specially. 1418252884aeSStefan Eßer const char bc_program_esc_chars[] = "ab\\efnqrt"; 141944d4804dSStefan Eßer 142044d4804dSStefan Eßer /// A list of characters corresponding to the escape characters above. 1421252884aeSStefan Eßer const char bc_program_esc_seqs[] = "\a\b\\\\\f\n\"\r\t"; 142250696a6eSStefan Eßer 142350696a6eSStefan Eßer #endif // !BC_ENABLE_LIBRARY 1424