1*5a6e8488SAndroid Build Coastguard Worker /* 2*5a6e8488SAndroid Build Coastguard Worker * ***************************************************************************** 3*5a6e8488SAndroid Build Coastguard Worker * 4*5a6e8488SAndroid Build Coastguard Worker * SPDX-License-Identifier: BSD-2-Clause 5*5a6e8488SAndroid Build Coastguard Worker * 6*5a6e8488SAndroid Build Coastguard Worker * Copyright (c) 2018-2024 Gavin D. Howard and contributors. 7*5a6e8488SAndroid Build Coastguard Worker * 8*5a6e8488SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 9*5a6e8488SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions are met: 10*5a6e8488SAndroid Build Coastguard Worker * 11*5a6e8488SAndroid Build Coastguard Worker * * Redistributions of source code must retain the above copyright notice, this 12*5a6e8488SAndroid Build Coastguard Worker * list of conditions and the following disclaimer. 13*5a6e8488SAndroid Build Coastguard Worker * 14*5a6e8488SAndroid Build Coastguard Worker * * Redistributions in binary form must reproduce the above copyright notice, 15*5a6e8488SAndroid Build Coastguard Worker * this list of conditions and the following disclaimer in the documentation 16*5a6e8488SAndroid Build Coastguard Worker * and/or other materials provided with the distribution. 17*5a6e8488SAndroid Build Coastguard Worker * 18*5a6e8488SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 19*5a6e8488SAndroid Build Coastguard Worker * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20*5a6e8488SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21*5a6e8488SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 22*5a6e8488SAndroid Build Coastguard Worker * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23*5a6e8488SAndroid Build Coastguard Worker * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24*5a6e8488SAndroid Build Coastguard Worker * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25*5a6e8488SAndroid Build Coastguard Worker * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26*5a6e8488SAndroid Build Coastguard Worker * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27*5a6e8488SAndroid Build Coastguard Worker * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28*5a6e8488SAndroid Build Coastguard Worker * POSSIBILITY OF SUCH DAMAGE. 29*5a6e8488SAndroid Build Coastguard Worker * 30*5a6e8488SAndroid Build Coastguard Worker * ***************************************************************************** 31*5a6e8488SAndroid Build Coastguard Worker * 32*5a6e8488SAndroid Build Coastguard Worker * Definitions for bc's VM. 33*5a6e8488SAndroid Build Coastguard Worker * 34*5a6e8488SAndroid Build Coastguard Worker */ 35*5a6e8488SAndroid Build Coastguard Worker 36*5a6e8488SAndroid Build Coastguard Worker #ifndef BC_VM_H 37*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_H 38*5a6e8488SAndroid Build Coastguard Worker 39*5a6e8488SAndroid Build Coastguard Worker #include <assert.h> 40*5a6e8488SAndroid Build Coastguard Worker #include <stddef.h> 41*5a6e8488SAndroid Build Coastguard Worker #include <limits.h> 42*5a6e8488SAndroid Build Coastguard Worker 43*5a6e8488SAndroid Build Coastguard Worker #include <signal.h> 44*5a6e8488SAndroid Build Coastguard Worker 45*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_NLS 46*5a6e8488SAndroid Build Coastguard Worker 47*5a6e8488SAndroid Build Coastguard Worker #ifdef _WIN32 48*5a6e8488SAndroid Build Coastguard Worker #error NLS is not supported on Windows. 49*5a6e8488SAndroid Build Coastguard Worker #endif // _WIN32 50*5a6e8488SAndroid Build Coastguard Worker 51*5a6e8488SAndroid Build Coastguard Worker #include <nl_types.h> 52*5a6e8488SAndroid Build Coastguard Worker 53*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_NLS 54*5a6e8488SAndroid Build Coastguard Worker 55*5a6e8488SAndroid Build Coastguard Worker #include <version.h> 56*5a6e8488SAndroid Build Coastguard Worker #include <status.h> 57*5a6e8488SAndroid Build Coastguard Worker #include <num.h> 58*5a6e8488SAndroid Build Coastguard Worker #include <lex.h> 59*5a6e8488SAndroid Build Coastguard Worker #include <parse.h> 60*5a6e8488SAndroid Build Coastguard Worker #include <program.h> 61*5a6e8488SAndroid Build Coastguard Worker #include <history.h> 62*5a6e8488SAndroid Build Coastguard Worker #include <bc.h> 63*5a6e8488SAndroid Build Coastguard Worker 64*5a6e8488SAndroid Build Coastguard Worker // We don't want to include this file for the library because it's unused. 65*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLE_LIBRARY 66*5a6e8488SAndroid Build Coastguard Worker #include <file.h> 67*5a6e8488SAndroid Build Coastguard Worker #endif // !BC_ENABLE_LIBRARY 68*5a6e8488SAndroid Build Coastguard Worker 69*5a6e8488SAndroid Build Coastguard Worker // This should be obvious. If neither calculator is enabled, barf. 70*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLED && !DC_ENABLED 71*5a6e8488SAndroid Build Coastguard Worker #error Must define BC_ENABLED, DC_ENABLED, or both 72*5a6e8488SAndroid Build Coastguard Worker #endif 73*5a6e8488SAndroid Build Coastguard Worker 74*5a6e8488SAndroid Build Coastguard Worker // CHAR_BIT must be at least 6, for various reasons. I might want to bump this 75*5a6e8488SAndroid Build Coastguard Worker // to 8 in the future. 76*5a6e8488SAndroid Build Coastguard Worker #if CHAR_BIT < 6 77*5a6e8488SAndroid Build Coastguard Worker #error CHAR_BIT must be at least 6. 78*5a6e8488SAndroid Build Coastguard Worker #endif 79*5a6e8488SAndroid Build Coastguard Worker 80*5a6e8488SAndroid Build Coastguard Worker // Set defaults. 81*5a6e8488SAndroid Build Coastguard Worker 82*5a6e8488SAndroid Build Coastguard Worker #ifndef MAINEXEC 83*5a6e8488SAndroid Build Coastguard Worker #define MAINEXEC bc 84*5a6e8488SAndroid Build Coastguard Worker #endif // MAINEXEC 85*5a6e8488SAndroid Build Coastguard Worker 86*5a6e8488SAndroid Build Coastguard Worker #ifndef _WIN32 87*5a6e8488SAndroid Build Coastguard Worker #ifndef EXECPREFIX 88*5a6e8488SAndroid Build Coastguard Worker #define EXECPREFIX 89*5a6e8488SAndroid Build Coastguard Worker #endif // EXECPREFIX 90*5a6e8488SAndroid Build Coastguard Worker #else // _WIN32 91*5a6e8488SAndroid Build Coastguard Worker #undef EXECPREFIX 92*5a6e8488SAndroid Build Coastguard Worker #endif // _WIN32 93*5a6e8488SAndroid Build Coastguard Worker 94*5a6e8488SAndroid Build Coastguard Worker /** 95*5a6e8488SAndroid Build Coastguard Worker * Generate a string from text. 96*5a6e8488SAndroid Build Coastguard Worker * @parm V The text to generate a string for. 97*5a6e8488SAndroid Build Coastguard Worker */ 98*5a6e8488SAndroid Build Coastguard Worker #define GEN_STR(V) #V 99*5a6e8488SAndroid Build Coastguard Worker 100*5a6e8488SAndroid Build Coastguard Worker /** 101*5a6e8488SAndroid Build Coastguard Worker * Help generate a string from text. The preprocessor requires this two-step 102*5a6e8488SAndroid Build Coastguard Worker * process. Trust me. 103*5a6e8488SAndroid Build Coastguard Worker * @parm V The text to generate a string for. 104*5a6e8488SAndroid Build Coastguard Worker */ 105*5a6e8488SAndroid Build Coastguard Worker #define GEN_STR2(V) GEN_STR(V) 106*5a6e8488SAndroid Build Coastguard Worker 107*5a6e8488SAndroid Build Coastguard Worker /// The version as a string. VERSION must be defined previously, usually by the 108*5a6e8488SAndroid Build Coastguard Worker /// build system. 109*5a6e8488SAndroid Build Coastguard Worker #define BC_VERSION GEN_STR2(VERSION) 110*5a6e8488SAndroid Build Coastguard Worker 111*5a6e8488SAndroid Build Coastguard Worker /// The main executable name as a string. MAINEXEC must be defined previously, 112*5a6e8488SAndroid Build Coastguard Worker /// usually by the build system. 113*5a6e8488SAndroid Build Coastguard Worker #define BC_MAINEXEC GEN_STR2(MAINEXEC) 114*5a6e8488SAndroid Build Coastguard Worker 115*5a6e8488SAndroid Build Coastguard Worker /// The build type as a string. BUILD_TYPE must be defined previously, usually 116*5a6e8488SAndroid Build Coastguard Worker /// by the build system. 117*5a6e8488SAndroid Build Coastguard Worker #define BC_BUILD_TYPE GEN_STR2(BUILD_TYPE) 118*5a6e8488SAndroid Build Coastguard Worker 119*5a6e8488SAndroid Build Coastguard Worker // We only allow an empty executable prefix on Windows. 120*5a6e8488SAndroid Build Coastguard Worker #ifndef _WIN32 121*5a6e8488SAndroid Build Coastguard Worker #define BC_EXECPREFIX GEN_STR2(EXECPREFIX) 122*5a6e8488SAndroid Build Coastguard Worker #else // _WIN32 123*5a6e8488SAndroid Build Coastguard Worker #define BC_EXECPREFIX "" 124*5a6e8488SAndroid Build Coastguard Worker #endif // _WIN32 125*5a6e8488SAndroid Build Coastguard Worker 126*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLE_LIBRARY 127*5a6e8488SAndroid Build Coastguard Worker 128*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED 129*5a6e8488SAndroid Build Coastguard Worker 130*5a6e8488SAndroid Build Coastguard Worker /// The flag for the extended register option. 131*5a6e8488SAndroid Build Coastguard Worker #define DC_FLAG_X (UINTMAX_C(1) << 0) 132*5a6e8488SAndroid Build Coastguard Worker 133*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED 134*5a6e8488SAndroid Build Coastguard Worker 135*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED 136*5a6e8488SAndroid Build Coastguard Worker 137*5a6e8488SAndroid Build Coastguard Worker /// The flag for the POSIX warning option. 138*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_W (UINTMAX_C(1) << 1) 139*5a6e8488SAndroid Build Coastguard Worker 140*5a6e8488SAndroid Build Coastguard Worker /// The flag for the POSIX error option. 141*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_S (UINTMAX_C(1) << 2) 142*5a6e8488SAndroid Build Coastguard Worker 143*5a6e8488SAndroid Build Coastguard Worker /// The flag for the math library option. 144*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_L (UINTMAX_C(1) << 3) 145*5a6e8488SAndroid Build Coastguard Worker 146*5a6e8488SAndroid Build Coastguard Worker /// The flag for the global stacks option. 147*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_G (UINTMAX_C(1) << 4) 148*5a6e8488SAndroid Build Coastguard Worker 149*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED 150*5a6e8488SAndroid Build Coastguard Worker 151*5a6e8488SAndroid Build Coastguard Worker /// The flag for quiet, though this one is reversed; the option clears the flag. 152*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_Q (UINTMAX_C(1) << 5) 153*5a6e8488SAndroid Build Coastguard Worker 154*5a6e8488SAndroid Build Coastguard Worker /// The flag for interactive. 155*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_I (UINTMAX_C(1) << 6) 156*5a6e8488SAndroid Build Coastguard Worker 157*5a6e8488SAndroid Build Coastguard Worker /// The flag for prompt. This is also reversed; the option clears the flag. 158*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_P (UINTMAX_C(1) << 7) 159*5a6e8488SAndroid Build Coastguard Worker 160*5a6e8488SAndroid Build Coastguard Worker /// The flag for read prompt. This is also reversed; the option clears the flag. 161*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_R (UINTMAX_C(1) << 8) 162*5a6e8488SAndroid Build Coastguard Worker 163*5a6e8488SAndroid Build Coastguard Worker /// The flag for a leading zero. 164*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_Z (UINTMAX_C(1) << 9) 165*5a6e8488SAndroid Build Coastguard Worker 166*5a6e8488SAndroid Build Coastguard Worker /// The flag for stdin being a TTY. 167*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_TTYIN (UINTMAX_C(1) << 10) 168*5a6e8488SAndroid Build Coastguard Worker 169*5a6e8488SAndroid Build Coastguard Worker /// The flag for TTY mode. 170*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_TTY (UINTMAX_C(1) << 11) 171*5a6e8488SAndroid Build Coastguard Worker 172*5a6e8488SAndroid Build Coastguard Worker /// The flag for reset on SIGINT. 173*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_SIGINT (UINTMAX_C(1) << 12) 174*5a6e8488SAndroid Build Coastguard Worker 175*5a6e8488SAndroid Build Coastguard Worker /// The flag for exiting with expressions. 176*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_EXPR_EXIT (UINTMAX_C(1) << 13) 177*5a6e8488SAndroid Build Coastguard Worker 178*5a6e8488SAndroid Build Coastguard Worker /// The flag for digit clamping. 179*5a6e8488SAndroid Build Coastguard Worker #define BC_FLAG_DIGIT_CLAMP (UINTMAX_C(1) << 14) 180*5a6e8488SAndroid Build Coastguard Worker 181*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the TTYIN flag. 182*5a6e8488SAndroid Build Coastguard Worker #define BC_TTYIN (vm->flags & BC_FLAG_TTYIN) 183*5a6e8488SAndroid Build Coastguard Worker 184*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the TTY flag. 185*5a6e8488SAndroid Build Coastguard Worker #define BC_TTY (vm->flags & BC_FLAG_TTY) 186*5a6e8488SAndroid Build Coastguard Worker 187*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the SIGINT flag. 188*5a6e8488SAndroid Build Coastguard Worker #define BC_SIGINT (vm->flags & BC_FLAG_SIGINT) 189*5a6e8488SAndroid Build Coastguard Worker 190*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED 191*5a6e8488SAndroid Build Coastguard Worker 192*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the POSIX error flag. 193*5a6e8488SAndroid Build Coastguard Worker #define BC_S (vm->flags & BC_FLAG_S) 194*5a6e8488SAndroid Build Coastguard Worker 195*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the POSIX warning flag. 196*5a6e8488SAndroid Build Coastguard Worker #define BC_W (vm->flags & BC_FLAG_W) 197*5a6e8488SAndroid Build Coastguard Worker 198*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the math library flag. 199*5a6e8488SAndroid Build Coastguard Worker #define BC_L (vm->flags & BC_FLAG_L) 200*5a6e8488SAndroid Build Coastguard Worker 201*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the global stacks flag. 202*5a6e8488SAndroid Build Coastguard Worker #define BC_G (vm->flags & BC_FLAG_G) 203*5a6e8488SAndroid Build Coastguard Worker 204*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED 205*5a6e8488SAndroid Build Coastguard Worker 206*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED 207*5a6e8488SAndroid Build Coastguard Worker 208*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the extended register flag. 209*5a6e8488SAndroid Build Coastguard Worker #define DC_X (vm->flags & DC_FLAG_X) 210*5a6e8488SAndroid Build Coastguard Worker 211*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED 212*5a6e8488SAndroid Build Coastguard Worker 213*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the interactive flag. 214*5a6e8488SAndroid Build Coastguard Worker #define BC_I (vm->flags & BC_FLAG_I) 215*5a6e8488SAndroid Build Coastguard Worker 216*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the prompt flag. 217*5a6e8488SAndroid Build Coastguard Worker #define BC_P (vm->flags & BC_FLAG_P) 218*5a6e8488SAndroid Build Coastguard Worker 219*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the read prompt flag. 220*5a6e8488SAndroid Build Coastguard Worker #define BC_R (vm->flags & BC_FLAG_R) 221*5a6e8488SAndroid Build Coastguard Worker 222*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the leading zero flag. 223*5a6e8488SAndroid Build Coastguard Worker #define BC_Z (vm->flags & BC_FLAG_Z) 224*5a6e8488SAndroid Build Coastguard Worker 225*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the expression exit flag. 226*5a6e8488SAndroid Build Coastguard Worker #define BC_EXPR_EXIT (vm->flags & BC_FLAG_EXPR_EXIT) 227*5a6e8488SAndroid Build Coastguard Worker 228*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for getting the digit clamp flag. 229*5a6e8488SAndroid Build Coastguard Worker #define BC_DIGIT_CLAMP (vm->flags & BC_FLAG_DIGIT_CLAMP) 230*5a6e8488SAndroid Build Coastguard Worker 231*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED 232*5a6e8488SAndroid Build Coastguard Worker 233*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for checking if bc is in POSIX mode. 234*5a6e8488SAndroid Build Coastguard Worker #define BC_IS_POSIX (BC_S || BC_W) 235*5a6e8488SAndroid Build Coastguard Worker 236*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED 237*5a6e8488SAndroid Build Coastguard Worker 238*5a6e8488SAndroid Build Coastguard Worker /// Returns true if bc is running. 239*5a6e8488SAndroid Build Coastguard Worker #define BC_IS_BC (vm->name[0] != 'd') 240*5a6e8488SAndroid Build Coastguard Worker 241*5a6e8488SAndroid Build Coastguard Worker /// Returns true if dc is running. 242*5a6e8488SAndroid Build Coastguard Worker #define BC_IS_DC (vm->name[0] == 'd') 243*5a6e8488SAndroid Build Coastguard Worker 244*5a6e8488SAndroid Build Coastguard Worker /// Returns the correct read prompt. 245*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_READ_PROMPT (BC_IS_BC ? "read> " : "?> ") 246*5a6e8488SAndroid Build Coastguard Worker 247*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the line length environment variable. 248*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_LINE_LENGTH_STR (BC_IS_BC ? "BC_LINE_LENGTH" : "DC_LINE_LENGTH") 249*5a6e8488SAndroid Build Coastguard Worker 250*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the environment args environment variable. 251*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_ENV_ARGS_STR (BC_IS_BC ? "BC_ENV_ARGS" : "DC_ENV_ARGS") 252*5a6e8488SAndroid Build Coastguard Worker 253*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the expression exit environment variable. 254*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_EXPR_EXIT_STR (BC_IS_BC ? "BC_EXPR_EXIT" : "DC_EXPR_EXIT") 255*5a6e8488SAndroid Build Coastguard Worker 256*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the expression exit environment variable. 257*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_EXPR_EXIT_DEF \ 258*5a6e8488SAndroid Build Coastguard Worker (BC_IS_BC ? BC_DEFAULT_EXPR_EXIT : DC_DEFAULT_EXPR_EXIT) 259*5a6e8488SAndroid Build Coastguard Worker 260*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the digit clamp environment variable. 261*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_DIGIT_CLAMP_STR (BC_IS_BC ? "BC_DIGIT_CLAMP" : "DC_DIGIT_CLAMP") 262*5a6e8488SAndroid Build Coastguard Worker 263*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the digit clamp environment variable. 264*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_DIGIT_CLAMP_DEF \ 265*5a6e8488SAndroid Build Coastguard Worker (BC_IS_BC ? BC_DEFAULT_DIGIT_CLAMP : DC_DEFAULT_DIGIT_CLAMP) 266*5a6e8488SAndroid Build Coastguard Worker 267*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the TTY mode environment variable. 268*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_TTY_MODE_STR (BC_IS_BC ? "BC_TTY_MODE" : "DC_TTY_MODE") 269*5a6e8488SAndroid Build Coastguard Worker 270*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the TTY mode environment variable. 271*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_TTY_MODE_DEF \ 272*5a6e8488SAndroid Build Coastguard Worker (BC_IS_BC ? BC_DEFAULT_TTY_MODE : DC_DEFAULT_TTY_MODE) 273*5a6e8488SAndroid Build Coastguard Worker 274*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the prompt environment variable. 275*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_PROMPT_STR (BC_IS_BC ? "BC_PROMPT" : "DC_PROMPT") 276*5a6e8488SAndroid Build Coastguard Worker 277*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the prompt environment variable. 278*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_PROMPT_DEF (BC_IS_BC ? BC_DEFAULT_PROMPT : DC_DEFAULT_PROMPT) 279*5a6e8488SAndroid Build Coastguard Worker 280*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the SIGINT reset environment variable. 281*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_SIGINT_RESET_STR \ 282*5a6e8488SAndroid Build Coastguard Worker (BC_IS_BC ? "BC_SIGINT_RESET" : "DC_SIGINT_RESET") 283*5a6e8488SAndroid Build Coastguard Worker 284*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the SIGINT reset environment variable. 285*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_SIGINT_RESET_DEF \ 286*5a6e8488SAndroid Build Coastguard Worker (BC_IS_BC ? BC_DEFAULT_SIGINT_RESET : DC_DEFAULT_SIGINT_RESET) 287*5a6e8488SAndroid Build Coastguard Worker 288*5a6e8488SAndroid Build Coastguard Worker /// Returns true if the calculator should run stdin. 289*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_RUN_STDIN(has_file) (BC_IS_BC || !(has_file)) 290*5a6e8488SAndroid Build Coastguard Worker 291*5a6e8488SAndroid Build Coastguard Worker #else // DC_ENABLED 292*5a6e8488SAndroid Build Coastguard Worker 293*5a6e8488SAndroid Build Coastguard Worker /// Returns true if bc is running. 294*5a6e8488SAndroid Build Coastguard Worker #define BC_IS_BC (1) 295*5a6e8488SAndroid Build Coastguard Worker 296*5a6e8488SAndroid Build Coastguard Worker /// Returns true if dc is running. 297*5a6e8488SAndroid Build Coastguard Worker #define BC_IS_DC (0) 298*5a6e8488SAndroid Build Coastguard Worker 299*5a6e8488SAndroid Build Coastguard Worker /// Returns the correct read prompt. 300*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_READ_PROMPT ("read> ") 301*5a6e8488SAndroid Build Coastguard Worker 302*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the line length environment variable. 303*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_LINE_LENGTH_STR ("BC_LINE_LENGTH") 304*5a6e8488SAndroid Build Coastguard Worker 305*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the environment args environment variable. 306*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_ENV_ARGS_STR ("BC_ENV_ARGS") 307*5a6e8488SAndroid Build Coastguard Worker 308*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the expression exit environment variable. 309*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_EXPR_EXIT_STR ("BC_EXPR_EXIT") 310*5a6e8488SAndroid Build Coastguard Worker 311*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the expression exit environment variable. 312*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_EXPR_EXIT_DEF (BC_DEFAULT_EXPR_EXIT) 313*5a6e8488SAndroid Build Coastguard Worker 314*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the digit clamp environment variable. 315*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_DIGIT_CLAMP_STR ("BC_DIGIT_CLAMP") 316*5a6e8488SAndroid Build Coastguard Worker 317*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the digit clamp environment variable. 318*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_DIGIT_CLAMP_DEF (BC_DEFAULT_DIGIT_CLAMP) 319*5a6e8488SAndroid Build Coastguard Worker 320*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the TTY mode environment variable. 321*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_TTY_MODE_STR ("BC_TTY_MODE") 322*5a6e8488SAndroid Build Coastguard Worker 323*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the TTY mode environment variable. 324*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_TTY_MODE_DEF (BC_DEFAULT_TTY_MODE) 325*5a6e8488SAndroid Build Coastguard Worker 326*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the prompt environment variable. 327*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_PROMPT_STR ("BC_PROMPT") 328*5a6e8488SAndroid Build Coastguard Worker 329*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the SIGINT reset environment variable. 330*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_PROMPT_DEF (BC_DEFAULT_PROMPT) 331*5a6e8488SAndroid Build Coastguard Worker 332*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the SIGINT reset environment variable. 333*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_SIGINT_RESET_STR ("BC_SIGINT_RESET") 334*5a6e8488SAndroid Build Coastguard Worker 335*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the SIGINT reset environment variable. 336*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_SIGINT_RESET_DEF (BC_DEFAULT_SIGINT_RESET) 337*5a6e8488SAndroid Build Coastguard Worker 338*5a6e8488SAndroid Build Coastguard Worker /// Returns true if the calculator should run stdin. 339*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_RUN_STDIN(has_file) (BC_IS_BC) 340*5a6e8488SAndroid Build Coastguard Worker 341*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED 342*5a6e8488SAndroid Build Coastguard Worker 343*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLED 344*5a6e8488SAndroid Build Coastguard Worker 345*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for checking if bc is in POSIX mode. 346*5a6e8488SAndroid Build Coastguard Worker #define BC_IS_POSIX (0) 347*5a6e8488SAndroid Build Coastguard Worker 348*5a6e8488SAndroid Build Coastguard Worker /// Returns true if bc is running. 349*5a6e8488SAndroid Build Coastguard Worker #define BC_IS_BC (0) 350*5a6e8488SAndroid Build Coastguard Worker 351*5a6e8488SAndroid Build Coastguard Worker /// Returns true if dc is running. 352*5a6e8488SAndroid Build Coastguard Worker #define BC_IS_DC (1) 353*5a6e8488SAndroid Build Coastguard Worker 354*5a6e8488SAndroid Build Coastguard Worker /// Returns the correct read prompt. 355*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_READ_PROMPT ("?> ") 356*5a6e8488SAndroid Build Coastguard Worker 357*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the line length environment variable. 358*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_LINE_LENGTH_STR ("DC_LINE_LENGTH") 359*5a6e8488SAndroid Build Coastguard Worker 360*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the environment args environment variable. 361*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_ENV_ARGS_STR ("DC_ENV_ARGS") 362*5a6e8488SAndroid Build Coastguard Worker 363*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the expression exit environment variable. 364*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_EXPR_EXIT_STR ("DC_EXPR_EXIT") 365*5a6e8488SAndroid Build Coastguard Worker 366*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the expression exit environment variable. 367*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_EXPR_EXIT_DEF (DC_DEFAULT_EXPR_EXIT) 368*5a6e8488SAndroid Build Coastguard Worker 369*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the digit clamp environment variable. 370*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_DIGIT_CLAMP_STR ("DC_DIGIT_CLAMP") 371*5a6e8488SAndroid Build Coastguard Worker 372*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the digit clamp environment variable. 373*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_DIGIT_CLAMP_DEF (DC_DEFAULT_DIGIT_CLAMP) 374*5a6e8488SAndroid Build Coastguard Worker 375*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the TTY mode environment variable. 376*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_TTY_MODE_STR ("DC_TTY_MODE") 377*5a6e8488SAndroid Build Coastguard Worker 378*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the TTY mode environment variable. 379*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_TTY_MODE_DEF (DC_DEFAULT_TTY_MODE) 380*5a6e8488SAndroid Build Coastguard Worker 381*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the prompt environment variable. 382*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_PROMPT_STR ("DC_PROMPT") 383*5a6e8488SAndroid Build Coastguard Worker 384*5a6e8488SAndroid Build Coastguard Worker /// Returns the default for the SIGINT reset environment variable. 385*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_PROMPT_DEF (DC_DEFAULT_PROMPT) 386*5a6e8488SAndroid Build Coastguard Worker 387*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the SIGINT reset environment variable. 388*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_SIGINT_RESET_STR ("DC_SIGINT_RESET") 389*5a6e8488SAndroid Build Coastguard Worker 390*5a6e8488SAndroid Build Coastguard Worker /// Returns the string for the SIGINT reset environment variable. 391*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_SIGINT_RESET_DEF (DC_DEFAULT_SIGINT_RESET) 392*5a6e8488SAndroid Build Coastguard Worker 393*5a6e8488SAndroid Build Coastguard Worker /// Returns true if the calculator should run stdin. 394*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_RUN_STDIN(has_file) (!(has_file)) 395*5a6e8488SAndroid Build Coastguard Worker 396*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED 397*5a6e8488SAndroid Build Coastguard Worker 398*5a6e8488SAndroid Build Coastguard Worker /// A convenience macro for checking if the prompt is enabled. 399*5a6e8488SAndroid Build Coastguard Worker #define BC_PROMPT (BC_P) 400*5a6e8488SAndroid Build Coastguard Worker 401*5a6e8488SAndroid Build Coastguard Worker #else // !BC_ENABLE_LIBRARY 402*5a6e8488SAndroid Build Coastguard Worker 403*5a6e8488SAndroid Build Coastguard Worker #define BC_Z (vm->leading_zeroes) 404*5a6e8488SAndroid Build Coastguard Worker 405*5a6e8488SAndroid Build Coastguard Worker #define BC_DIGIT_CLAMP (vm->digit_clamp) 406*5a6e8488SAndroid Build Coastguard Worker 407*5a6e8488SAndroid Build Coastguard Worker #endif // !BC_ENABLE_LIBRARY 408*5a6e8488SAndroid Build Coastguard Worker 409*5a6e8488SAndroid Build Coastguard Worker /** 410*5a6e8488SAndroid Build Coastguard Worker * Returns the max of its two arguments. This evaluates arguments twice, so be 411*5a6e8488SAndroid Build Coastguard Worker * careful what args you give it. 412*5a6e8488SAndroid Build Coastguard Worker * @param a The first argument. 413*5a6e8488SAndroid Build Coastguard Worker * @param b The second argument. 414*5a6e8488SAndroid Build Coastguard Worker * @return The max of the two arguments. 415*5a6e8488SAndroid Build Coastguard Worker */ 416*5a6e8488SAndroid Build Coastguard Worker #define BC_MAX(a, b) ((a) > (b) ? (a) : (b)) 417*5a6e8488SAndroid Build Coastguard Worker 418*5a6e8488SAndroid Build Coastguard Worker /** 419*5a6e8488SAndroid Build Coastguard Worker * Returns the min of its two arguments. This evaluates arguments twice, so be 420*5a6e8488SAndroid Build Coastguard Worker * careful what args you give it. 421*5a6e8488SAndroid Build Coastguard Worker * @param a The first argument. 422*5a6e8488SAndroid Build Coastguard Worker * @param b The second argument. 423*5a6e8488SAndroid Build Coastguard Worker * @return The min of the two arguments. 424*5a6e8488SAndroid Build Coastguard Worker */ 425*5a6e8488SAndroid Build Coastguard Worker #define BC_MIN(a, b) ((a) < (b) ? (a) : (b)) 426*5a6e8488SAndroid Build Coastguard Worker 427*5a6e8488SAndroid Build Coastguard Worker /// Returns the max obase that is allowed. 428*5a6e8488SAndroid Build Coastguard Worker #define BC_MAX_OBASE ((BcBigDig) (BC_BASE_POW)) 429*5a6e8488SAndroid Build Coastguard Worker 430*5a6e8488SAndroid Build Coastguard Worker /// Returns the max array size that is allowed. 431*5a6e8488SAndroid Build Coastguard Worker #define BC_MAX_DIM ((BcBigDig) (SIZE_MAX - 1)) 432*5a6e8488SAndroid Build Coastguard Worker 433*5a6e8488SAndroid Build Coastguard Worker /// Returns the max scale that is allowed. 434*5a6e8488SAndroid Build Coastguard Worker #define BC_MAX_SCALE ((BcBigDig) (BC_NUM_BIGDIG_MAX - 1)) 435*5a6e8488SAndroid Build Coastguard Worker 436*5a6e8488SAndroid Build Coastguard Worker /// Returns the max string length that is allowed. 437*5a6e8488SAndroid Build Coastguard Worker #define BC_MAX_STRING ((BcBigDig) (BC_NUM_BIGDIG_MAX - 1)) 438*5a6e8488SAndroid Build Coastguard Worker 439*5a6e8488SAndroid Build Coastguard Worker /// Returns the max identifier length that is allowed. 440*5a6e8488SAndroid Build Coastguard Worker #define BC_MAX_NAME BC_MAX_STRING 441*5a6e8488SAndroid Build Coastguard Worker 442*5a6e8488SAndroid Build Coastguard Worker /// Returns the max number size that is allowed. 443*5a6e8488SAndroid Build Coastguard Worker #define BC_MAX_NUM BC_MAX_SCALE 444*5a6e8488SAndroid Build Coastguard Worker 445*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH 446*5a6e8488SAndroid Build Coastguard Worker 447*5a6e8488SAndroid Build Coastguard Worker /// Returns the max random integer that can be returned. 448*5a6e8488SAndroid Build Coastguard Worker #define BC_MAX_RAND ((BcBigDig) (((BcRand) 0) - 1)) 449*5a6e8488SAndroid Build Coastguard Worker 450*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH 451*5a6e8488SAndroid Build Coastguard Worker 452*5a6e8488SAndroid Build Coastguard Worker /// Returns the max exponent that is allowed. 453*5a6e8488SAndroid Build Coastguard Worker #define BC_MAX_EXP ((ulong) (BC_NUM_BIGDIG_MAX)) 454*5a6e8488SAndroid Build Coastguard Worker 455*5a6e8488SAndroid Build Coastguard Worker /// Returns the max number of variables that is allowed. 456*5a6e8488SAndroid Build Coastguard Worker #define BC_MAX_VARS ((ulong) (SIZE_MAX - 1)) 457*5a6e8488SAndroid Build Coastguard Worker 458*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_LINE_LIB 459*5a6e8488SAndroid Build Coastguard Worker 460*5a6e8488SAndroid Build Coastguard Worker /// The size of the global buffer. 461*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_BUF_SIZE (1 << 10) 462*5a6e8488SAndroid Build Coastguard Worker 463*5a6e8488SAndroid Build Coastguard Worker /// The amount of the global buffer allocated to stdin. 464*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_STDIN_BUF_SIZE (BC_VM_BUF_SIZE - 1) 465*5a6e8488SAndroid Build Coastguard Worker 466*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLE_LINE_LIB 467*5a6e8488SAndroid Build Coastguard Worker 468*5a6e8488SAndroid Build Coastguard Worker /// The size of the global buffer. 469*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_BUF_SIZE (1 << 12) 470*5a6e8488SAndroid Build Coastguard Worker 471*5a6e8488SAndroid Build Coastguard Worker /// The amount of the global buffer allocated to stdout. 472*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_STDOUT_BUF_SIZE (1 << 11) 473*5a6e8488SAndroid Build Coastguard Worker 474*5a6e8488SAndroid Build Coastguard Worker /// The amount of the global buffer allocated to stderr. 475*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_STDERR_BUF_SIZE (1 << 10) 476*5a6e8488SAndroid Build Coastguard Worker 477*5a6e8488SAndroid Build Coastguard Worker /// The amount of the global buffer allocated to stdin. 478*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_STDIN_BUF_SIZE (BC_VM_STDERR_BUF_SIZE - 1) 479*5a6e8488SAndroid Build Coastguard Worker 480*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_LINE_LIB 481*5a6e8488SAndroid Build Coastguard Worker 482*5a6e8488SAndroid Build Coastguard Worker /// The max number of temporary BcNums that can be kept. 483*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_MAX_TEMPS (1 << 9) 484*5a6e8488SAndroid Build Coastguard Worker 485*5a6e8488SAndroid Build Coastguard Worker /// The capacity of the one BcNum, which is a constant. 486*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_ONE_CAP (1) 487*5a6e8488SAndroid Build Coastguard Worker 488*5a6e8488SAndroid Build Coastguard Worker /** 489*5a6e8488SAndroid Build Coastguard Worker * Returns true if a BcResult is safe for garbage collection. 490*5a6e8488SAndroid Build Coastguard Worker * @param r The BcResult to test. 491*5a6e8488SAndroid Build Coastguard Worker * @return True if @a r is safe to garbage collect. 492*5a6e8488SAndroid Build Coastguard Worker */ 493*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_SAFE_RESULT(r) ((r)->t >= BC_RESULT_TEMP) 494*5a6e8488SAndroid Build Coastguard Worker 495*5a6e8488SAndroid Build Coastguard Worker /// The invalid locale catalog return value. 496*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_INVALID_CATALOG ((nl_catd) - 1) 497*5a6e8488SAndroid Build Coastguard Worker 498*5a6e8488SAndroid Build Coastguard Worker /** 499*5a6e8488SAndroid Build Coastguard Worker * Returns true if the *unsigned* multiplication overflows. 500*5a6e8488SAndroid Build Coastguard Worker * @param a The first operand. 501*5a6e8488SAndroid Build Coastguard Worker * @param b The second operand. 502*5a6e8488SAndroid Build Coastguard Worker * @param r The product. 503*5a6e8488SAndroid Build Coastguard Worker * @return True if the multiplication of @a a and @a b overflows. 504*5a6e8488SAndroid Build Coastguard Worker */ 505*5a6e8488SAndroid Build Coastguard Worker #define BC_VM_MUL_OVERFLOW(a, b, r) \ 506*5a6e8488SAndroid Build Coastguard Worker ((r) >= SIZE_MAX || ((a) != 0 && (r) / (a) != (b))) 507*5a6e8488SAndroid Build Coastguard Worker 508*5a6e8488SAndroid Build Coastguard Worker /// The global vm struct. This holds all of the global data besides the file 509*5a6e8488SAndroid Build Coastguard Worker /// buffers. 510*5a6e8488SAndroid Build Coastguard Worker typedef struct BcVm 511*5a6e8488SAndroid Build Coastguard Worker { 512*5a6e8488SAndroid Build Coastguard Worker /// The current status. This is volatile sig_atomic_t because it is also 513*5a6e8488SAndroid Build Coastguard Worker /// used in the signal handler. See the development manual 514*5a6e8488SAndroid Build Coastguard Worker /// (manuals/development.md#async-signal-safe-signal-handling) for more 515*5a6e8488SAndroid Build Coastguard Worker /// information. 516*5a6e8488SAndroid Build Coastguard Worker volatile sig_atomic_t status; 517*5a6e8488SAndroid Build Coastguard Worker 518*5a6e8488SAndroid Build Coastguard Worker /// Non-zero if a jump series is in progress and items should be popped off 519*5a6e8488SAndroid Build Coastguard Worker /// the jmp_bufs vector. This is volatile sig_atomic_t because it is also 520*5a6e8488SAndroid Build Coastguard Worker /// used in the signal handler. See the development manual 521*5a6e8488SAndroid Build Coastguard Worker /// (manuals/development.md#async-signal-safe-signal-handling) for more 522*5a6e8488SAndroid Build Coastguard Worker /// information. 523*5a6e8488SAndroid Build Coastguard Worker volatile sig_atomic_t sig_pop; 524*5a6e8488SAndroid Build Coastguard Worker 525*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLE_LIBRARY 526*5a6e8488SAndroid Build Coastguard Worker 527*5a6e8488SAndroid Build Coastguard Worker /// The parser. 528*5a6e8488SAndroid Build Coastguard Worker BcParse prs; 529*5a6e8488SAndroid Build Coastguard Worker 530*5a6e8488SAndroid Build Coastguard Worker /// The program. 531*5a6e8488SAndroid Build Coastguard Worker BcProgram prog; 532*5a6e8488SAndroid Build Coastguard Worker 533*5a6e8488SAndroid Build Coastguard Worker /// A buffer for lines for stdin. 534*5a6e8488SAndroid Build Coastguard Worker BcVec line_buf; 535*5a6e8488SAndroid Build Coastguard Worker 536*5a6e8488SAndroid Build Coastguard Worker /// A buffer to hold a series of lines from stdin. Sometimes, multiple lines 537*5a6e8488SAndroid Build Coastguard Worker /// are necessary for parsing, such as a comment that spans multiple lines. 538*5a6e8488SAndroid Build Coastguard Worker BcVec buffer; 539*5a6e8488SAndroid Build Coastguard Worker 540*5a6e8488SAndroid Build Coastguard Worker /// A parser to parse read expressions. 541*5a6e8488SAndroid Build Coastguard Worker BcParse read_prs; 542*5a6e8488SAndroid Build Coastguard Worker 543*5a6e8488SAndroid Build Coastguard Worker /// A buffer for read expressions. 544*5a6e8488SAndroid Build Coastguard Worker BcVec read_buf; 545*5a6e8488SAndroid Build Coastguard Worker 546*5a6e8488SAndroid Build Coastguard Worker #endif // !BC_ENABLE_LIBRARY 547*5a6e8488SAndroid Build Coastguard Worker 548*5a6e8488SAndroid Build Coastguard Worker /// A vector of jmp_bufs for doing a jump series. This allows exception-type 549*5a6e8488SAndroid Build Coastguard Worker /// error handling, while allowing me to do cleanup on the way. 550*5a6e8488SAndroid Build Coastguard Worker BcVec jmp_bufs; 551*5a6e8488SAndroid Build Coastguard Worker 552*5a6e8488SAndroid Build Coastguard Worker /// The number of temps in the temps array. 553*5a6e8488SAndroid Build Coastguard Worker size_t temps_len; 554*5a6e8488SAndroid Build Coastguard Worker 555*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_LIBRARY 556*5a6e8488SAndroid Build Coastguard Worker 557*5a6e8488SAndroid Build Coastguard Worker /// The vector of contexts for the library. 558*5a6e8488SAndroid Build Coastguard Worker BcVec ctxts; 559*5a6e8488SAndroid Build Coastguard Worker 560*5a6e8488SAndroid Build Coastguard Worker /// The vector for creating strings to pass to the client. 561*5a6e8488SAndroid Build Coastguard Worker BcVec out; 562*5a6e8488SAndroid Build Coastguard Worker 563*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH 564*5a6e8488SAndroid Build Coastguard Worker 565*5a6e8488SAndroid Build Coastguard Worker /// The PRNG. 566*5a6e8488SAndroid Build Coastguard Worker BcRNG rng; 567*5a6e8488SAndroid Build Coastguard Worker 568*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH 569*5a6e8488SAndroid Build Coastguard Worker 570*5a6e8488SAndroid Build Coastguard Worker /// The current error. 571*5a6e8488SAndroid Build Coastguard Worker BclError err; 572*5a6e8488SAndroid Build Coastguard Worker 573*5a6e8488SAndroid Build Coastguard Worker /// Whether or not bcl should abort on fatal errors. 574*5a6e8488SAndroid Build Coastguard Worker bool abrt; 575*5a6e8488SAndroid Build Coastguard Worker 576*5a6e8488SAndroid Build Coastguard Worker /// Whether or not to print leading zeros. 577*5a6e8488SAndroid Build Coastguard Worker bool leading_zeroes; 578*5a6e8488SAndroid Build Coastguard Worker 579*5a6e8488SAndroid Build Coastguard Worker /// Whether or not to clamp digits that are greater than or equal to the 580*5a6e8488SAndroid Build Coastguard Worker /// current ibase. 581*5a6e8488SAndroid Build Coastguard Worker bool digit_clamp; 582*5a6e8488SAndroid Build Coastguard Worker 583*5a6e8488SAndroid Build Coastguard Worker /// The number of "references," or times that the library was initialized. 584*5a6e8488SAndroid Build Coastguard Worker unsigned int refs; 585*5a6e8488SAndroid Build Coastguard Worker 586*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLE_LIBRARY 587*5a6e8488SAndroid Build Coastguard Worker 588*5a6e8488SAndroid Build Coastguard Worker /// A pointer to the filename of the current file. This is not owned by the 589*5a6e8488SAndroid Build Coastguard Worker /// BcVm struct. 590*5a6e8488SAndroid Build Coastguard Worker const char* file; 591*5a6e8488SAndroid Build Coastguard Worker 592*5a6e8488SAndroid Build Coastguard Worker /// The message printed when SIGINT happens. 593*5a6e8488SAndroid Build Coastguard Worker const char* sigmsg; 594*5a6e8488SAndroid Build Coastguard Worker 595*5a6e8488SAndroid Build Coastguard Worker /// Non-zero when signals are "locked." This is volatile sig_atomic_t 596*5a6e8488SAndroid Build Coastguard Worker /// because it is also used in the signal handler. See the development 597*5a6e8488SAndroid Build Coastguard Worker /// manual (manuals/development.md#async-signal-safe-signal-handling) for 598*5a6e8488SAndroid Build Coastguard Worker /// more information. 599*5a6e8488SAndroid Build Coastguard Worker volatile sig_atomic_t sig_lock; 600*5a6e8488SAndroid Build Coastguard Worker 601*5a6e8488SAndroid Build Coastguard Worker /// Non-zero when a signal has been received, but not acted on. This is 602*5a6e8488SAndroid Build Coastguard Worker /// volatile sig_atomic_t because it is also used in the signal handler. See 603*5a6e8488SAndroid Build Coastguard Worker /// the development manual 604*5a6e8488SAndroid Build Coastguard Worker /// (manuals/development.md#async-signal-safe-signal-handling) for more 605*5a6e8488SAndroid Build Coastguard Worker /// information. 606*5a6e8488SAndroid Build Coastguard Worker volatile sig_atomic_t sig; 607*5a6e8488SAndroid Build Coastguard Worker 608*5a6e8488SAndroid Build Coastguard Worker /// The length of sigmsg. 609*5a6e8488SAndroid Build Coastguard Worker uchar siglen; 610*5a6e8488SAndroid Build Coastguard Worker 611*5a6e8488SAndroid Build Coastguard Worker /// The instruction used for returning from a read() call. 612*5a6e8488SAndroid Build Coastguard Worker uchar read_ret; 613*5a6e8488SAndroid Build Coastguard Worker 614*5a6e8488SAndroid Build Coastguard Worker /// The flags field used by most macros above. 615*5a6e8488SAndroid Build Coastguard Worker uint16_t flags; 616*5a6e8488SAndroid Build Coastguard Worker 617*5a6e8488SAndroid Build Coastguard Worker /// The number of characters printed in the current line. This is used 618*5a6e8488SAndroid Build Coastguard Worker /// because bc has a limit of the number of characters it can print per 619*5a6e8488SAndroid Build Coastguard Worker /// line. 620*5a6e8488SAndroid Build Coastguard Worker uint16_t nchars; 621*5a6e8488SAndroid Build Coastguard Worker 622*5a6e8488SAndroid Build Coastguard Worker /// The length of the line we can print. The user can set this if they wish. 623*5a6e8488SAndroid Build Coastguard Worker uint16_t line_len; 624*5a6e8488SAndroid Build Coastguard Worker 625*5a6e8488SAndroid Build Coastguard Worker /// True if bc should error if expressions are encountered during option 626*5a6e8488SAndroid Build Coastguard Worker /// parsing, false otherwise. 627*5a6e8488SAndroid Build Coastguard Worker bool no_exprs; 628*5a6e8488SAndroid Build Coastguard Worker 629*5a6e8488SAndroid Build Coastguard Worker /// True if bc should exit if expresions are encountered. 630*5a6e8488SAndroid Build Coastguard Worker bool exit_exprs; 631*5a6e8488SAndroid Build Coastguard Worker 632*5a6e8488SAndroid Build Coastguard Worker /// True if EOF was encountered. 633*5a6e8488SAndroid Build Coastguard Worker bool eof; 634*5a6e8488SAndroid Build Coastguard Worker 635*5a6e8488SAndroid Build Coastguard Worker /// The mode that the program is in. 636*5a6e8488SAndroid Build Coastguard Worker uchar mode; 637*5a6e8488SAndroid Build Coastguard Worker 638*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED 639*5a6e8488SAndroid Build Coastguard Worker 640*5a6e8488SAndroid Build Coastguard Worker /// True if keywords should not be redefined. This is only true for the 641*5a6e8488SAndroid Build Coastguard Worker /// builtin math libraries for bc. 642*5a6e8488SAndroid Build Coastguard Worker bool no_redefine; 643*5a6e8488SAndroid Build Coastguard Worker 644*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED 645*5a6e8488SAndroid Build Coastguard Worker 646*5a6e8488SAndroid Build Coastguard Worker /// A vector of filenames to process. 647*5a6e8488SAndroid Build Coastguard Worker BcVec files; 648*5a6e8488SAndroid Build Coastguard Worker 649*5a6e8488SAndroid Build Coastguard Worker /// A vector of expressions to process. 650*5a6e8488SAndroid Build Coastguard Worker BcVec exprs; 651*5a6e8488SAndroid Build Coastguard Worker 652*5a6e8488SAndroid Build Coastguard Worker /// The name of the calculator under use. This is used by BC_IS_BC and 653*5a6e8488SAndroid Build Coastguard Worker /// BC_IS_DC. 654*5a6e8488SAndroid Build Coastguard Worker const char* name; 655*5a6e8488SAndroid Build Coastguard Worker 656*5a6e8488SAndroid Build Coastguard Worker /// The help text for the calculator. 657*5a6e8488SAndroid Build Coastguard Worker const char* help; 658*5a6e8488SAndroid Build Coastguard Worker 659*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_HISTORY 660*5a6e8488SAndroid Build Coastguard Worker 661*5a6e8488SAndroid Build Coastguard Worker /// The history data. 662*5a6e8488SAndroid Build Coastguard Worker BcHistory history; 663*5a6e8488SAndroid Build Coastguard Worker 664*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_HISTORY 665*5a6e8488SAndroid Build Coastguard Worker 666*5a6e8488SAndroid Build Coastguard Worker /// The function to call to get the next lex token. 667*5a6e8488SAndroid Build Coastguard Worker BcLexNext next; 668*5a6e8488SAndroid Build Coastguard Worker 669*5a6e8488SAndroid Build Coastguard Worker /// The function to call to parse. 670*5a6e8488SAndroid Build Coastguard Worker BcParseParse parse; 671*5a6e8488SAndroid Build Coastguard Worker 672*5a6e8488SAndroid Build Coastguard Worker /// The function to call to parse expressions. 673*5a6e8488SAndroid Build Coastguard Worker BcParseExpr expr; 674*5a6e8488SAndroid Build Coastguard Worker 675*5a6e8488SAndroid Build Coastguard Worker /// The names of the categories of errors. 676*5a6e8488SAndroid Build Coastguard Worker const char* err_ids[BC_ERR_IDX_NELEMS + BC_ENABLED]; 677*5a6e8488SAndroid Build Coastguard Worker 678*5a6e8488SAndroid Build Coastguard Worker /// The messages for each error. 679*5a6e8488SAndroid Build Coastguard Worker const char* err_msgs[BC_ERR_NELEMS]; 680*5a6e8488SAndroid Build Coastguard Worker 681*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_NLS 682*5a6e8488SAndroid Build Coastguard Worker /// The locale. 683*5a6e8488SAndroid Build Coastguard Worker const char* locale; 684*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_NLS 685*5a6e8488SAndroid Build Coastguard Worker 686*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_LIBRARY 687*5a6e8488SAndroid Build Coastguard Worker 688*5a6e8488SAndroid Build Coastguard Worker /// An array of maxes for the globals. 689*5a6e8488SAndroid Build Coastguard Worker BcBigDig maxes[BC_PROG_GLOBALS_LEN + BC_ENABLE_EXTRA_MATH]; 690*5a6e8488SAndroid Build Coastguard Worker 691*5a6e8488SAndroid Build Coastguard Worker /// The last base used to parse. 692*5a6e8488SAndroid Build Coastguard Worker BcBigDig last_base; 693*5a6e8488SAndroid Build Coastguard Worker 694*5a6e8488SAndroid Build Coastguard Worker /// The last power of last_base used to parse. 695*5a6e8488SAndroid Build Coastguard Worker BcBigDig last_pow; 696*5a6e8488SAndroid Build Coastguard Worker 697*5a6e8488SAndroid Build Coastguard Worker /// The last exponent of base that equals last_pow. 698*5a6e8488SAndroid Build Coastguard Worker BcBigDig last_exp; 699*5a6e8488SAndroid Build Coastguard Worker 700*5a6e8488SAndroid Build Coastguard Worker /// BC_BASE_POW - last_pow. 701*5a6e8488SAndroid Build Coastguard Worker BcBigDig last_rem; 702*5a6e8488SAndroid Build Coastguard Worker 703*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLE_LIBRARY 704*5a6e8488SAndroid Build Coastguard Worker 705*5a6e8488SAndroid Build Coastguard Worker /// A buffer of environment arguments. This is the actual value of the 706*5a6e8488SAndroid Build Coastguard Worker /// environment variable. 707*5a6e8488SAndroid Build Coastguard Worker char* env_args_buffer; 708*5a6e8488SAndroid Build Coastguard Worker 709*5a6e8488SAndroid Build Coastguard Worker /// A vector for environment arguments after parsing. 710*5a6e8488SAndroid Build Coastguard Worker BcVec env_args; 711*5a6e8488SAndroid Build Coastguard Worker 712*5a6e8488SAndroid Build Coastguard Worker /// A BcNum set to constant 0. 713*5a6e8488SAndroid Build Coastguard Worker BcNum zero; 714*5a6e8488SAndroid Build Coastguard Worker 715*5a6e8488SAndroid Build Coastguard Worker #endif // !BC_ENABLE_LIBRARY 716*5a6e8488SAndroid Build Coastguard Worker 717*5a6e8488SAndroid Build Coastguard Worker /// A BcNum set to constant 1. 718*5a6e8488SAndroid Build Coastguard Worker BcNum one; 719*5a6e8488SAndroid Build Coastguard Worker 720*5a6e8488SAndroid Build Coastguard Worker /// A BcNum holding the max number held by a BcBigDig plus 1. 721*5a6e8488SAndroid Build Coastguard Worker BcNum max; 722*5a6e8488SAndroid Build Coastguard Worker 723*5a6e8488SAndroid Build Coastguard Worker /// A BcNum holding the max number held by a BcBigDig times 2 plus 1. 724*5a6e8488SAndroid Build Coastguard Worker BcNum max2; 725*5a6e8488SAndroid Build Coastguard Worker 726*5a6e8488SAndroid Build Coastguard Worker /// The BcDig array for max. 727*5a6e8488SAndroid Build Coastguard Worker BcDig max_num[BC_NUM_BIGDIG_LOG10]; 728*5a6e8488SAndroid Build Coastguard Worker 729*5a6e8488SAndroid Build Coastguard Worker /// The BcDig array for max2. 730*5a6e8488SAndroid Build Coastguard Worker BcDig max2_num[BC_NUM_BIGDIG_LOG10]; 731*5a6e8488SAndroid Build Coastguard Worker 732*5a6e8488SAndroid Build Coastguard Worker // The BcDig array for the one BcNum. 733*5a6e8488SAndroid Build Coastguard Worker BcDig one_num[BC_VM_ONE_CAP]; 734*5a6e8488SAndroid Build Coastguard Worker 735*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLE_LIBRARY 736*5a6e8488SAndroid Build Coastguard Worker 737*5a6e8488SAndroid Build Coastguard Worker // The BcDig array for the zero BcNum. 738*5a6e8488SAndroid Build Coastguard Worker BcDig zero_num[BC_VM_ONE_CAP]; 739*5a6e8488SAndroid Build Coastguard Worker 740*5a6e8488SAndroid Build Coastguard Worker /// The stdout file. 741*5a6e8488SAndroid Build Coastguard Worker BcFile fout; 742*5a6e8488SAndroid Build Coastguard Worker 743*5a6e8488SAndroid Build Coastguard Worker /// The stderr file. 744*5a6e8488SAndroid Build Coastguard Worker BcFile ferr; 745*5a6e8488SAndroid Build Coastguard Worker 746*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_NLS 747*5a6e8488SAndroid Build Coastguard Worker 748*5a6e8488SAndroid Build Coastguard Worker /// The locale catalog. 749*5a6e8488SAndroid Build Coastguard Worker nl_catd catalog; 750*5a6e8488SAndroid Build Coastguard Worker 751*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_NLS 752*5a6e8488SAndroid Build Coastguard Worker 753*5a6e8488SAndroid Build Coastguard Worker /// A pointer to the stdin buffer. 754*5a6e8488SAndroid Build Coastguard Worker char* buf; 755*5a6e8488SAndroid Build Coastguard Worker 756*5a6e8488SAndroid Build Coastguard Worker /// The number of items in the input buffer. 757*5a6e8488SAndroid Build Coastguard Worker size_t buf_len; 758*5a6e8488SAndroid Build Coastguard Worker 759*5a6e8488SAndroid Build Coastguard Worker /// The slabs vector for constants, strings, function names, and other 760*5a6e8488SAndroid Build Coastguard Worker /// string-like things. 761*5a6e8488SAndroid Build Coastguard Worker BcVec slabs; 762*5a6e8488SAndroid Build Coastguard Worker 763*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED 764*5a6e8488SAndroid Build Coastguard Worker 765*5a6e8488SAndroid Build Coastguard Worker /// An array of booleans for which bc keywords have been redefined if 766*5a6e8488SAndroid Build Coastguard Worker /// BC_REDEFINE_KEYWORDS is non-zero. 767*5a6e8488SAndroid Build Coastguard Worker bool redefined_kws[BC_LEX_NKWS]; 768*5a6e8488SAndroid Build Coastguard Worker 769*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED 770*5a6e8488SAndroid Build Coastguard Worker #endif // !BC_ENABLE_LIBRARY 771*5a6e8488SAndroid Build Coastguard Worker 772*5a6e8488SAndroid Build Coastguard Worker BcDig* temps_buf[BC_VM_MAX_TEMPS]; 773*5a6e8488SAndroid Build Coastguard Worker 774*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG_CODE 775*5a6e8488SAndroid Build Coastguard Worker 776*5a6e8488SAndroid Build Coastguard Worker /// The depth for BC_FUNC_ENTER and BC_FUNC_EXIT. 777*5a6e8488SAndroid Build Coastguard Worker size_t func_depth; 778*5a6e8488SAndroid Build Coastguard Worker 779*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG_CODE 780*5a6e8488SAndroid Build Coastguard Worker 781*5a6e8488SAndroid Build Coastguard Worker } BcVm; 782*5a6e8488SAndroid Build Coastguard Worker 783*5a6e8488SAndroid Build Coastguard Worker /** 784*5a6e8488SAndroid Build Coastguard Worker * Print the copyright banner and help if it's non-NULL. 785*5a6e8488SAndroid Build Coastguard Worker * @param help The help message to print if it's non-NULL. 786*5a6e8488SAndroid Build Coastguard Worker */ 787*5a6e8488SAndroid Build Coastguard Worker void 788*5a6e8488SAndroid Build Coastguard Worker bc_vm_info(const char* const help); 789*5a6e8488SAndroid Build Coastguard Worker 790*5a6e8488SAndroid Build Coastguard Worker /** 791*5a6e8488SAndroid Build Coastguard Worker * The entrance point for bc/dc together. 792*5a6e8488SAndroid Build Coastguard Worker * @param argc The count of arguments. 793*5a6e8488SAndroid Build Coastguard Worker * @param argv The argument array. 794*5a6e8488SAndroid Build Coastguard Worker * @return A status. 795*5a6e8488SAndroid Build Coastguard Worker */ 796*5a6e8488SAndroid Build Coastguard Worker BcStatus 797*5a6e8488SAndroid Build Coastguard Worker bc_vm_boot(int argc, const char* argv[]); 798*5a6e8488SAndroid Build Coastguard Worker 799*5a6e8488SAndroid Build Coastguard Worker /** 800*5a6e8488SAndroid Build Coastguard Worker * Initializes some of the BcVm global. This is separate to make things easier 801*5a6e8488SAndroid Build Coastguard Worker * on the library code. 802*5a6e8488SAndroid Build Coastguard Worker */ 803*5a6e8488SAndroid Build Coastguard Worker void 804*5a6e8488SAndroid Build Coastguard Worker bc_vm_init(void); 805*5a6e8488SAndroid Build Coastguard Worker 806*5a6e8488SAndroid Build Coastguard Worker /** 807*5a6e8488SAndroid Build Coastguard Worker * Frees the BcVm global. 808*5a6e8488SAndroid Build Coastguard Worker */ 809*5a6e8488SAndroid Build Coastguard Worker void 810*5a6e8488SAndroid Build Coastguard Worker bc_vm_shutdown(void); 811*5a6e8488SAndroid Build Coastguard Worker 812*5a6e8488SAndroid Build Coastguard Worker /** 813*5a6e8488SAndroid Build Coastguard Worker * Add a temp to the temp array. 814*5a6e8488SAndroid Build Coastguard Worker * @param num The BcDig array to add to the temp array. 815*5a6e8488SAndroid Build Coastguard Worker */ 816*5a6e8488SAndroid Build Coastguard Worker void 817*5a6e8488SAndroid Build Coastguard Worker bc_vm_addTemp(BcDig* num); 818*5a6e8488SAndroid Build Coastguard Worker 819*5a6e8488SAndroid Build Coastguard Worker /** 820*5a6e8488SAndroid Build Coastguard Worker * Return the temp on the top of the temp stack, or NULL if there are none. 821*5a6e8488SAndroid Build Coastguard Worker * @return A temp, or NULL if none exist. 822*5a6e8488SAndroid Build Coastguard Worker */ 823*5a6e8488SAndroid Build Coastguard Worker BcDig* 824*5a6e8488SAndroid Build Coastguard Worker bc_vm_takeTemp(void); 825*5a6e8488SAndroid Build Coastguard Worker 826*5a6e8488SAndroid Build Coastguard Worker /** 827*5a6e8488SAndroid Build Coastguard Worker * Gets the top temp of the temp stack. This is separate from bc_vm_takeTemp() 828*5a6e8488SAndroid Build Coastguard Worker * to quiet a GCC warning about longjmp() clobbering in bc_num_init(). 829*5a6e8488SAndroid Build Coastguard Worker * @return A temp, or NULL if none exist. 830*5a6e8488SAndroid Build Coastguard Worker */ 831*5a6e8488SAndroid Build Coastguard Worker BcDig* 832*5a6e8488SAndroid Build Coastguard Worker bc_vm_getTemp(void); 833*5a6e8488SAndroid Build Coastguard Worker 834*5a6e8488SAndroid Build Coastguard Worker /** 835*5a6e8488SAndroid Build Coastguard Worker * Frees all temporaries. 836*5a6e8488SAndroid Build Coastguard Worker */ 837*5a6e8488SAndroid Build Coastguard Worker void 838*5a6e8488SAndroid Build Coastguard Worker bc_vm_freeTemps(void); 839*5a6e8488SAndroid Build Coastguard Worker 840*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLE_HISTORY || BC_ENABLE_LINE_LIB || BC_ENABLE_LIBRARY 841*5a6e8488SAndroid Build Coastguard Worker 842*5a6e8488SAndroid Build Coastguard Worker /** 843*5a6e8488SAndroid Build Coastguard Worker * Erases the flush argument if history does not exist because it does not 844*5a6e8488SAndroid Build Coastguard Worker * matter if history does not exist. 845*5a6e8488SAndroid Build Coastguard Worker */ 846*5a6e8488SAndroid Build Coastguard Worker #define bc_vm_putchar(c, t) bc_vm_putchar_impl(c) 847*5a6e8488SAndroid Build Coastguard Worker 848*5a6e8488SAndroid Build Coastguard Worker #else // !BC_ENABLE_HISTORY || BC_ENABLE_LINE_LIB || BC_ENABLE_LIBRARY 849*5a6e8488SAndroid Build Coastguard Worker 850*5a6e8488SAndroid Build Coastguard Worker // This is here to satisfy a clang warning about recursive macros. 851*5a6e8488SAndroid Build Coastguard Worker #define bc_vm_putchar(c, t) bc_vm_putchar_impl(c, t) 852*5a6e8488SAndroid Build Coastguard Worker 853*5a6e8488SAndroid Build Coastguard Worker #endif // !BC_ENABLE_HISTORY || BC_ENABLE_LINE_LIB || BC_ENABLE_LIBRARY 854*5a6e8488SAndroid Build Coastguard Worker 855*5a6e8488SAndroid Build Coastguard Worker /** 856*5a6e8488SAndroid Build Coastguard Worker * Print to stdout with limited formating. 857*5a6e8488SAndroid Build Coastguard Worker * @param fmt The format string. 858*5a6e8488SAndroid Build Coastguard Worker */ 859*5a6e8488SAndroid Build Coastguard Worker void 860*5a6e8488SAndroid Build Coastguard Worker bc_vm_printf(const char* fmt, ...); 861*5a6e8488SAndroid Build Coastguard Worker 862*5a6e8488SAndroid Build Coastguard Worker /** 863*5a6e8488SAndroid Build Coastguard Worker * Puts a char into the stdout buffer. 864*5a6e8488SAndroid Build Coastguard Worker * @param c The character to put on the stdout buffer. 865*5a6e8488SAndroid Build Coastguard Worker * @param type The flush type. 866*5a6e8488SAndroid Build Coastguard Worker */ 867*5a6e8488SAndroid Build Coastguard Worker void 868*5a6e8488SAndroid Build Coastguard Worker bc_vm_putchar(int c, BcFlushType type); 869*5a6e8488SAndroid Build Coastguard Worker 870*5a6e8488SAndroid Build Coastguard Worker /** 871*5a6e8488SAndroid Build Coastguard Worker * Multiplies @a n and @a size and throws an allocation error if overflow 872*5a6e8488SAndroid Build Coastguard Worker * occurs. 873*5a6e8488SAndroid Build Coastguard Worker * @param n The number of elements. 874*5a6e8488SAndroid Build Coastguard Worker * @param size The size of each element. 875*5a6e8488SAndroid Build Coastguard Worker * @return The product of @a n and @a size. 876*5a6e8488SAndroid Build Coastguard Worker */ 877*5a6e8488SAndroid Build Coastguard Worker size_t 878*5a6e8488SAndroid Build Coastguard Worker bc_vm_arraySize(size_t n, size_t size); 879*5a6e8488SAndroid Build Coastguard Worker 880*5a6e8488SAndroid Build Coastguard Worker /** 881*5a6e8488SAndroid Build Coastguard Worker * Adds @a a and @a b and throws an error if overflow occurs. 882*5a6e8488SAndroid Build Coastguard Worker * @param a The first operand. 883*5a6e8488SAndroid Build Coastguard Worker * @param b The second operand. 884*5a6e8488SAndroid Build Coastguard Worker * @return The sum of @a a and @a b. 885*5a6e8488SAndroid Build Coastguard Worker */ 886*5a6e8488SAndroid Build Coastguard Worker size_t 887*5a6e8488SAndroid Build Coastguard Worker bc_vm_growSize(size_t a, size_t b); 888*5a6e8488SAndroid Build Coastguard Worker 889*5a6e8488SAndroid Build Coastguard Worker /** 890*5a6e8488SAndroid Build Coastguard Worker * Allocate @a n bytes and throw an allocation error if allocation fails. 891*5a6e8488SAndroid Build Coastguard Worker * @param n The bytes to allocate. 892*5a6e8488SAndroid Build Coastguard Worker * @return A pointer to the allocated memory. 893*5a6e8488SAndroid Build Coastguard Worker */ 894*5a6e8488SAndroid Build Coastguard Worker void* 895*5a6e8488SAndroid Build Coastguard Worker bc_vm_malloc(size_t n); 896*5a6e8488SAndroid Build Coastguard Worker 897*5a6e8488SAndroid Build Coastguard Worker /** 898*5a6e8488SAndroid Build Coastguard Worker * Reallocate @a ptr to be @a n bytes and throw an allocation error if 899*5a6e8488SAndroid Build Coastguard Worker * reallocation fails. 900*5a6e8488SAndroid Build Coastguard Worker * @param ptr The pointer to a memory allocation to reallocate. 901*5a6e8488SAndroid Build Coastguard Worker * @param n The bytes to allocate. 902*5a6e8488SAndroid Build Coastguard Worker * @return A pointer to the reallocated memory. 903*5a6e8488SAndroid Build Coastguard Worker */ 904*5a6e8488SAndroid Build Coastguard Worker void* 905*5a6e8488SAndroid Build Coastguard Worker bc_vm_realloc(void* ptr, size_t n); 906*5a6e8488SAndroid Build Coastguard Worker 907*5a6e8488SAndroid Build Coastguard Worker /** 908*5a6e8488SAndroid Build Coastguard Worker * Allocates space for, and duplicates, @a str. 909*5a6e8488SAndroid Build Coastguard Worker * @param str The string to allocate. 910*5a6e8488SAndroid Build Coastguard Worker * @return The allocated string. 911*5a6e8488SAndroid Build Coastguard Worker */ 912*5a6e8488SAndroid Build Coastguard Worker char* 913*5a6e8488SAndroid Build Coastguard Worker bc_vm_strdup(const char* str); 914*5a6e8488SAndroid Build Coastguard Worker 915*5a6e8488SAndroid Build Coastguard Worker /** 916*5a6e8488SAndroid Build Coastguard Worker * Reads a line from stdin into BcVm's buffer field. 917*5a6e8488SAndroid Build Coastguard Worker * @param clear True if the buffer should be cleared first, false otherwise. 918*5a6e8488SAndroid Build Coastguard Worker * @return True if a line was read, false otherwise. 919*5a6e8488SAndroid Build Coastguard Worker */ 920*5a6e8488SAndroid Build Coastguard Worker bool 921*5a6e8488SAndroid Build Coastguard Worker bc_vm_readLine(bool clear); 922*5a6e8488SAndroid Build Coastguard Worker 923*5a6e8488SAndroid Build Coastguard Worker /** 924*5a6e8488SAndroid Build Coastguard Worker * Reads a line from the command-line expressions into BcVm's buffer field. 925*5a6e8488SAndroid Build Coastguard Worker * @param clear True if the buffer should be cleared first, false otherwise. 926*5a6e8488SAndroid Build Coastguard Worker * @return True if a line was read, false otherwise. 927*5a6e8488SAndroid Build Coastguard Worker */ 928*5a6e8488SAndroid Build Coastguard Worker bool 929*5a6e8488SAndroid Build Coastguard Worker bc_vm_readBuf(bool clear); 930*5a6e8488SAndroid Build Coastguard Worker 931*5a6e8488SAndroid Build Coastguard Worker /** 932*5a6e8488SAndroid Build Coastguard Worker * A convenience and portability function for OpenBSD's pledge(). 933*5a6e8488SAndroid Build Coastguard Worker * @param promises The promises to pledge(). 934*5a6e8488SAndroid Build Coastguard Worker * @param execpromises The exec promises to pledge(). 935*5a6e8488SAndroid Build Coastguard Worker */ 936*5a6e8488SAndroid Build Coastguard Worker void 937*5a6e8488SAndroid Build Coastguard Worker bc_pledge(const char* promises, const char* execpromises); 938*5a6e8488SAndroid Build Coastguard Worker 939*5a6e8488SAndroid Build Coastguard Worker /** 940*5a6e8488SAndroid Build Coastguard Worker * Returns the value of an environment variable. 941*5a6e8488SAndroid Build Coastguard Worker * @param var The environment variable. 942*5a6e8488SAndroid Build Coastguard Worker * @return The value of the environment variable. 943*5a6e8488SAndroid Build Coastguard Worker */ 944*5a6e8488SAndroid Build Coastguard Worker char* 945*5a6e8488SAndroid Build Coastguard Worker bc_vm_getenv(const char* var); 946*5a6e8488SAndroid Build Coastguard Worker 947*5a6e8488SAndroid Build Coastguard Worker /** 948*5a6e8488SAndroid Build Coastguard Worker * Frees an environment variable value. 949*5a6e8488SAndroid Build Coastguard Worker * @param val The value to free. 950*5a6e8488SAndroid Build Coastguard Worker */ 951*5a6e8488SAndroid Build Coastguard Worker void 952*5a6e8488SAndroid Build Coastguard Worker bc_vm_getenvFree(char* val); 953*5a6e8488SAndroid Build Coastguard Worker 954*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG_CODE 955*5a6e8488SAndroid Build Coastguard Worker 956*5a6e8488SAndroid Build Coastguard Worker /** 957*5a6e8488SAndroid Build Coastguard Worker * Start executing a jump series. 958*5a6e8488SAndroid Build Coastguard Worker * @param f The name of the function that started the jump series. 959*5a6e8488SAndroid Build Coastguard Worker */ 960*5a6e8488SAndroid Build Coastguard Worker void 961*5a6e8488SAndroid Build Coastguard Worker bc_vm_jmp(const char* f); 962*5a6e8488SAndroid Build Coastguard Worker 963*5a6e8488SAndroid Build Coastguard Worker #else // BC_DEBUG_CODE 964*5a6e8488SAndroid Build Coastguard Worker 965*5a6e8488SAndroid Build Coastguard Worker /** 966*5a6e8488SAndroid Build Coastguard Worker * Start executing a jump series. 967*5a6e8488SAndroid Build Coastguard Worker */ 968*5a6e8488SAndroid Build Coastguard Worker void 969*5a6e8488SAndroid Build Coastguard Worker bc_vm_jmp(void); 970*5a6e8488SAndroid Build Coastguard Worker 971*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG_CODE 972*5a6e8488SAndroid Build Coastguard Worker 973*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_LIBRARY 974*5a6e8488SAndroid Build Coastguard Worker 975*5a6e8488SAndroid Build Coastguard Worker /** 976*5a6e8488SAndroid Build Coastguard Worker * Handle an error. This is the true error handler. It will start a jump series 977*5a6e8488SAndroid Build Coastguard Worker * if an error occurred. POSIX errors will not cause jumps when warnings are on 978*5a6e8488SAndroid Build Coastguard Worker * or no POSIX errors are enabled. 979*5a6e8488SAndroid Build Coastguard Worker * @param e The error. 980*5a6e8488SAndroid Build Coastguard Worker */ 981*5a6e8488SAndroid Build Coastguard Worker void 982*5a6e8488SAndroid Build Coastguard Worker bc_vm_handleError(BcErr e); 983*5a6e8488SAndroid Build Coastguard Worker 984*5a6e8488SAndroid Build Coastguard Worker /** 985*5a6e8488SAndroid Build Coastguard Worker * Handle a fatal error. 986*5a6e8488SAndroid Build Coastguard Worker * @param e The error. 987*5a6e8488SAndroid Build Coastguard Worker */ 988*5a6e8488SAndroid Build Coastguard Worker void 989*5a6e8488SAndroid Build Coastguard Worker bc_vm_fatalError(BcErr e); 990*5a6e8488SAndroid Build Coastguard Worker 991*5a6e8488SAndroid Build Coastguard Worker /** 992*5a6e8488SAndroid Build Coastguard Worker * A function to call at exit. 993*5a6e8488SAndroid Build Coastguard Worker */ 994*5a6e8488SAndroid Build Coastguard Worker void 995*5a6e8488SAndroid Build Coastguard Worker bc_vm_atexit(void); 996*5a6e8488SAndroid Build Coastguard Worker 997*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLE_LIBRARY 998*5a6e8488SAndroid Build Coastguard Worker 999*5a6e8488SAndroid Build Coastguard Worker /** 1000*5a6e8488SAndroid Build Coastguard Worker * Calculates the number of decimal digits in the argument. 1001*5a6e8488SAndroid Build Coastguard Worker * @param val The value to calculate the number of decimal digits in. 1002*5a6e8488SAndroid Build Coastguard Worker * @return The number of decimal digits in @a val. 1003*5a6e8488SAndroid Build Coastguard Worker */ 1004*5a6e8488SAndroid Build Coastguard Worker size_t 1005*5a6e8488SAndroid Build Coastguard Worker bc_vm_numDigits(size_t val); 1006*5a6e8488SAndroid Build Coastguard Worker 1007*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG 1008*5a6e8488SAndroid Build Coastguard Worker 1009*5a6e8488SAndroid Build Coastguard Worker /** 1010*5a6e8488SAndroid Build Coastguard Worker * Handle an error. This is the true error handler. It will start a jump series 1011*5a6e8488SAndroid Build Coastguard Worker * if an error occurred. POSIX errors will not cause jumps when warnings are on 1012*5a6e8488SAndroid Build Coastguard Worker * or no POSIX errors are enabled. 1013*5a6e8488SAndroid Build Coastguard Worker * @param e The error. 1014*5a6e8488SAndroid Build Coastguard Worker * @param file The source file where the error occurred. 1015*5a6e8488SAndroid Build Coastguard Worker * @param fline The line in the source file where the error occurred. 1016*5a6e8488SAndroid Build Coastguard Worker * @param line The bc source line where the error occurred. 1017*5a6e8488SAndroid Build Coastguard Worker */ 1018*5a6e8488SAndroid Build Coastguard Worker void 1019*5a6e8488SAndroid Build Coastguard Worker bc_vm_handleError(BcErr e, const char* file, int fline, size_t line, ...); 1020*5a6e8488SAndroid Build Coastguard Worker 1021*5a6e8488SAndroid Build Coastguard Worker #else // BC_DEBUG 1022*5a6e8488SAndroid Build Coastguard Worker 1023*5a6e8488SAndroid Build Coastguard Worker /** 1024*5a6e8488SAndroid Build Coastguard Worker * Handle an error. This is the true error handler. It will start a jump series 1025*5a6e8488SAndroid Build Coastguard Worker * if an error occurred. POSIX errors will not cause jumps when warnings are on 1026*5a6e8488SAndroid Build Coastguard Worker * or no POSIX errors are enabled. 1027*5a6e8488SAndroid Build Coastguard Worker * @param e The error. 1028*5a6e8488SAndroid Build Coastguard Worker * @param line The bc source line where the error occurred. 1029*5a6e8488SAndroid Build Coastguard Worker */ 1030*5a6e8488SAndroid Build Coastguard Worker void 1031*5a6e8488SAndroid Build Coastguard Worker bc_vm_handleError(BcErr e, size_t line, ...); 1032*5a6e8488SAndroid Build Coastguard Worker 1033*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG 1034*5a6e8488SAndroid Build Coastguard Worker 1035*5a6e8488SAndroid Build Coastguard Worker /** 1036*5a6e8488SAndroid Build Coastguard Worker * Handle a fatal error. 1037*5a6e8488SAndroid Build Coastguard Worker * @param e The error. 1038*5a6e8488SAndroid Build Coastguard Worker */ 1039*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLE_MEMCHECK 1040*5a6e8488SAndroid Build Coastguard Worker BC_NORETURN 1041*5a6e8488SAndroid Build Coastguard Worker #endif // !BC_ENABLE_MEMCHECK 1042*5a6e8488SAndroid Build Coastguard Worker void 1043*5a6e8488SAndroid Build Coastguard Worker bc_vm_fatalError(BcErr e); 1044*5a6e8488SAndroid Build Coastguard Worker 1045*5a6e8488SAndroid Build Coastguard Worker /** 1046*5a6e8488SAndroid Build Coastguard Worker * A function to call at exit. 1047*5a6e8488SAndroid Build Coastguard Worker * @param status The exit status. 1048*5a6e8488SAndroid Build Coastguard Worker */ 1049*5a6e8488SAndroid Build Coastguard Worker BcStatus 1050*5a6e8488SAndroid Build Coastguard Worker bc_vm_atexit(BcStatus status); 1051*5a6e8488SAndroid Build Coastguard Worker 1052*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_LIBRARY 1053*5a6e8488SAndroid Build Coastguard Worker 1054*5a6e8488SAndroid Build Coastguard Worker /// A reference to the copyright header. 1055*5a6e8488SAndroid Build Coastguard Worker extern const char bc_copyright[]; 1056*5a6e8488SAndroid Build Coastguard Worker 1057*5a6e8488SAndroid Build Coastguard Worker /// A reference to the array of default error category names. 1058*5a6e8488SAndroid Build Coastguard Worker extern const char* bc_errs[]; 1059*5a6e8488SAndroid Build Coastguard Worker 1060*5a6e8488SAndroid Build Coastguard Worker /// A reference to the array of error category indices for each error. 1061*5a6e8488SAndroid Build Coastguard Worker extern const uchar bc_err_ids[]; 1062*5a6e8488SAndroid Build Coastguard Worker 1063*5a6e8488SAndroid Build Coastguard Worker /// A reference to the array of default error messages. 1064*5a6e8488SAndroid Build Coastguard Worker extern const char* const bc_err_msgs[]; 1065*5a6e8488SAndroid Build Coastguard Worker 1066*5a6e8488SAndroid Build Coastguard Worker /// A reference to the pledge() promises at start. 1067*5a6e8488SAndroid Build Coastguard Worker extern const char bc_pledge_start[]; 1068*5a6e8488SAndroid Build Coastguard Worker 1069*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_HISTORY 1070*5a6e8488SAndroid Build Coastguard Worker 1071*5a6e8488SAndroid Build Coastguard Worker /// A reference to the end pledge() promises when using history. 1072*5a6e8488SAndroid Build Coastguard Worker extern const char bc_pledge_end_history[]; 1073*5a6e8488SAndroid Build Coastguard Worker 1074*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_HISTORY 1075*5a6e8488SAndroid Build Coastguard Worker 1076*5a6e8488SAndroid Build Coastguard Worker /// A reference to the end pledge() promises when *not* using history. 1077*5a6e8488SAndroid Build Coastguard Worker extern const char bc_pledge_end[]; 1078*5a6e8488SAndroid Build Coastguard Worker 1079*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLE_LIBRARY 1080*5a6e8488SAndroid Build Coastguard Worker 1081*5a6e8488SAndroid Build Coastguard Worker /// A reference to the global data. 1082*5a6e8488SAndroid Build Coastguard Worker extern BcVm* vm; 1083*5a6e8488SAndroid Build Coastguard Worker 1084*5a6e8488SAndroid Build Coastguard Worker /// The global data. 1085*5a6e8488SAndroid Build Coastguard Worker extern BcVm vm_data; 1086*5a6e8488SAndroid Build Coastguard Worker 1087*5a6e8488SAndroid Build Coastguard Worker /// A reference to the global output buffers. 1088*5a6e8488SAndroid Build Coastguard Worker extern char output_bufs[BC_VM_BUF_SIZE]; 1089*5a6e8488SAndroid Build Coastguard Worker 1090*5a6e8488SAndroid Build Coastguard Worker #endif // !BC_ENABLE_LIBRARY 1091*5a6e8488SAndroid Build Coastguard Worker 1092*5a6e8488SAndroid Build Coastguard Worker #endif // BC_VM_H 1093