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 programs. 33*5a6e8488SAndroid Build Coastguard Worker * 34*5a6e8488SAndroid Build Coastguard Worker */ 35*5a6e8488SAndroid Build Coastguard Worker 36*5a6e8488SAndroid Build Coastguard Worker #ifndef BC_PROGRAM_H 37*5a6e8488SAndroid Build Coastguard Worker #define BC_PROGRAM_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 42*5a6e8488SAndroid Build Coastguard Worker #include <status.h> 43*5a6e8488SAndroid Build Coastguard Worker #include <parse.h> 44*5a6e8488SAndroid Build Coastguard Worker #include <lang.h> 45*5a6e8488SAndroid Build Coastguard Worker #include <num.h> 46*5a6e8488SAndroid Build Coastguard Worker #include <rand.h> 47*5a6e8488SAndroid Build Coastguard Worker 48*5a6e8488SAndroid Build Coastguard Worker /// The index of ibase in the globals array. 49*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBALS_IBASE (0) 50*5a6e8488SAndroid Build Coastguard Worker 51*5a6e8488SAndroid Build Coastguard Worker /// The index of obase in the globals array. 52*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBALS_OBASE (1) 53*5a6e8488SAndroid Build Coastguard Worker 54*5a6e8488SAndroid Build Coastguard Worker /// The index of scale in the globals array. 55*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBALS_SCALE (2) 56*5a6e8488SAndroid Build Coastguard Worker 57*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH 58*5a6e8488SAndroid Build Coastguard Worker 59*5a6e8488SAndroid Build Coastguard Worker /// The index of the rand max in the maxes array. 60*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_MAX_RAND (3) 61*5a6e8488SAndroid Build Coastguard Worker 62*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH 63*5a6e8488SAndroid Build Coastguard Worker 64*5a6e8488SAndroid Build Coastguard Worker /// The length of the globals array. 65*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBALS_LEN (3 + BC_ENABLE_EXTRA_MATH) 66*5a6e8488SAndroid Build Coastguard Worker 67*5a6e8488SAndroid Build Coastguard Worker typedef struct BcProgram 68*5a6e8488SAndroid Build Coastguard Worker { 69*5a6e8488SAndroid Build Coastguard Worker /// The array of globals values. 70*5a6e8488SAndroid Build Coastguard Worker BcBigDig globals[BC_PROG_GLOBALS_LEN]; 71*5a6e8488SAndroid Build Coastguard Worker 72*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED 73*5a6e8488SAndroid Build Coastguard Worker /// The array of globals stacks. 74*5a6e8488SAndroid Build Coastguard Worker BcVec globals_v[BC_PROG_GLOBALS_LEN]; 75*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED 76*5a6e8488SAndroid Build Coastguard Worker 77*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH 78*5a6e8488SAndroid Build Coastguard Worker 79*5a6e8488SAndroid Build Coastguard Worker /// The pseudo-random number generator. 80*5a6e8488SAndroid Build Coastguard Worker BcRNG rng; 81*5a6e8488SAndroid Build Coastguard Worker 82*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH 83*5a6e8488SAndroid Build Coastguard Worker 84*5a6e8488SAndroid Build Coastguard Worker /// The results stack. 85*5a6e8488SAndroid Build Coastguard Worker BcVec results; 86*5a6e8488SAndroid Build Coastguard Worker 87*5a6e8488SAndroid Build Coastguard Worker /// The execution stack. 88*5a6e8488SAndroid Build Coastguard Worker BcVec stack; 89*5a6e8488SAndroid Build Coastguard Worker 90*5a6e8488SAndroid Build Coastguard Worker /// The constants encountered in the program. They are global to the program 91*5a6e8488SAndroid Build Coastguard Worker /// to prevent bad accesses when functions that used non-auto variables are 92*5a6e8488SAndroid Build Coastguard Worker /// replaced. 93*5a6e8488SAndroid Build Coastguard Worker BcVec consts; 94*5a6e8488SAndroid Build Coastguard Worker 95*5a6e8488SAndroid Build Coastguard Worker /// The map of constants to go with consts. 96*5a6e8488SAndroid Build Coastguard Worker BcVec const_map; 97*5a6e8488SAndroid Build Coastguard Worker 98*5a6e8488SAndroid Build Coastguard Worker /// The strings encountered in the program. They are global to the program 99*5a6e8488SAndroid Build Coastguard Worker /// to prevent bad accesses when functions that used non-auto variables are 100*5a6e8488SAndroid Build Coastguard Worker /// replaced. 101*5a6e8488SAndroid Build Coastguard Worker BcVec strs; 102*5a6e8488SAndroid Build Coastguard Worker 103*5a6e8488SAndroid Build Coastguard Worker /// The map of strings to go with strs. 104*5a6e8488SAndroid Build Coastguard Worker BcVec str_map; 105*5a6e8488SAndroid Build Coastguard Worker 106*5a6e8488SAndroid Build Coastguard Worker /// The array of functions. 107*5a6e8488SAndroid Build Coastguard Worker BcVec fns; 108*5a6e8488SAndroid Build Coastguard Worker 109*5a6e8488SAndroid Build Coastguard Worker /// The map of functions to go with fns. 110*5a6e8488SAndroid Build Coastguard Worker BcVec fn_map; 111*5a6e8488SAndroid Build Coastguard Worker 112*5a6e8488SAndroid Build Coastguard Worker /// The array of variables. 113*5a6e8488SAndroid Build Coastguard Worker BcVec vars; 114*5a6e8488SAndroid Build Coastguard Worker 115*5a6e8488SAndroid Build Coastguard Worker /// The map of variables to go with vars. 116*5a6e8488SAndroid Build Coastguard Worker BcVec var_map; 117*5a6e8488SAndroid Build Coastguard Worker 118*5a6e8488SAndroid Build Coastguard Worker /// The array of arrays. 119*5a6e8488SAndroid Build Coastguard Worker BcVec arrs; 120*5a6e8488SAndroid Build Coastguard Worker 121*5a6e8488SAndroid Build Coastguard Worker /// The map of arrays to go with arrs. 122*5a6e8488SAndroid Build Coastguard Worker BcVec arr_map; 123*5a6e8488SAndroid Build Coastguard Worker 124*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED 125*5a6e8488SAndroid Build Coastguard Worker 126*5a6e8488SAndroid Build Coastguard Worker /// A vector of tail calls. These are just integers, which are the number of 127*5a6e8488SAndroid Build Coastguard Worker /// tail calls that have been executed for each function (string) on the 128*5a6e8488SAndroid Build Coastguard Worker /// stack for dc. This is to prevent dc from constantly growing memory use 129*5a6e8488SAndroid Build Coastguard Worker /// because of pushing more and more string executions on the stack. 130*5a6e8488SAndroid Build Coastguard Worker BcVec tail_calls; 131*5a6e8488SAndroid Build Coastguard Worker 132*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED 133*5a6e8488SAndroid Build Coastguard Worker 134*5a6e8488SAndroid Build Coastguard Worker /// A BcNum that has the proper base for asciify. 135*5a6e8488SAndroid Build Coastguard Worker BcNum strmb; 136*5a6e8488SAndroid Build Coastguard Worker 137*5a6e8488SAndroid Build Coastguard Worker // A BcNum to run asciify. This is to prevent GCC longjmp() clobbering 138*5a6e8488SAndroid Build Coastguard Worker // warnings. 139*5a6e8488SAndroid Build Coastguard Worker BcNum asciify; 140*5a6e8488SAndroid Build Coastguard Worker 141*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED 142*5a6e8488SAndroid Build Coastguard Worker 143*5a6e8488SAndroid Build Coastguard Worker /// The last printed value for bc. 144*5a6e8488SAndroid Build Coastguard Worker BcNum last; 145*5a6e8488SAndroid Build Coastguard Worker 146*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED 147*5a6e8488SAndroid Build Coastguard Worker 148*5a6e8488SAndroid Build Coastguard Worker // The BcDig array for strmb. This uses BC_NUM_LONG_LOG10 because it is used 149*5a6e8488SAndroid Build Coastguard Worker // in bc_num_ulong2num(), which attempts to realloc, unless it is big 150*5a6e8488SAndroid Build Coastguard Worker // enough. This is big enough. 151*5a6e8488SAndroid Build Coastguard Worker BcDig strmb_num[BC_NUM_BIGDIG_LOG10]; 152*5a6e8488SAndroid Build Coastguard Worker 153*5a6e8488SAndroid Build Coastguard Worker } BcProgram; 154*5a6e8488SAndroid Build Coastguard Worker 155*5a6e8488SAndroid Build Coastguard Worker /** 156*5a6e8488SAndroid Build Coastguard Worker * Returns true if the stack @a s has at least @a n items, false otherwise. 157*5a6e8488SAndroid Build Coastguard Worker * @param s The stack to check. 158*5a6e8488SAndroid Build Coastguard Worker * @param n The number of items the stack must have. 159*5a6e8488SAndroid Build Coastguard Worker * @return True if @a s has at least @a n items, false otherwise. 160*5a6e8488SAndroid Build Coastguard Worker */ 161*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_STACK(s, n) ((s)->len >= ((size_t) (n))) 162*5a6e8488SAndroid Build Coastguard Worker 163*5a6e8488SAndroid Build Coastguard Worker /** 164*5a6e8488SAndroid Build Coastguard Worker * Get a pointer to the top value in a global value stack. 165*5a6e8488SAndroid Build Coastguard Worker * @param v The global value stack. 166*5a6e8488SAndroid Build Coastguard Worker * @return A pointer to the top value in @a v. 167*5a6e8488SAndroid Build Coastguard Worker */ 168*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBAL_PTR(v) (bc_vec_top(v)) 169*5a6e8488SAndroid Build Coastguard Worker 170*5a6e8488SAndroid Build Coastguard Worker /** 171*5a6e8488SAndroid Build Coastguard Worker * Get the top value in a global value stack. 172*5a6e8488SAndroid Build Coastguard Worker * @param v The global value stack. 173*5a6e8488SAndroid Build Coastguard Worker * @return The top value in @a v. 174*5a6e8488SAndroid Build Coastguard Worker */ 175*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_GLOBAL(v) (*((BcBigDig*) BC_PROG_GLOBAL_PTR(v))) 176*5a6e8488SAndroid Build Coastguard Worker 177*5a6e8488SAndroid Build Coastguard Worker /** 178*5a6e8488SAndroid Build Coastguard Worker * Returns the current value of ibase. 179*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 180*5a6e8488SAndroid Build Coastguard Worker * @return The current ibase. 181*5a6e8488SAndroid Build Coastguard Worker */ 182*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_IBASE(p) ((p)->globals[BC_PROG_GLOBALS_IBASE]) 183*5a6e8488SAndroid Build Coastguard Worker 184*5a6e8488SAndroid Build Coastguard Worker /** 185*5a6e8488SAndroid Build Coastguard Worker * Returns the current value of obase. 186*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 187*5a6e8488SAndroid Build Coastguard Worker * @return The current obase. 188*5a6e8488SAndroid Build Coastguard Worker */ 189*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_OBASE(p) ((p)->globals[BC_PROG_GLOBALS_OBASE]) 190*5a6e8488SAndroid Build Coastguard Worker 191*5a6e8488SAndroid Build Coastguard Worker /** 192*5a6e8488SAndroid Build Coastguard Worker * Returns the current value of scale. 193*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 194*5a6e8488SAndroid Build Coastguard Worker * @return The current scale. 195*5a6e8488SAndroid Build Coastguard Worker */ 196*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_SCALE(p) ((p)->globals[BC_PROG_GLOBALS_SCALE]) 197*5a6e8488SAndroid Build Coastguard Worker 198*5a6e8488SAndroid Build Coastguard Worker /// The index for the main function in the functions array.// 199*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_MAIN (0) 200*5a6e8488SAndroid Build Coastguard Worker 201*5a6e8488SAndroid Build Coastguard Worker /// The index for the read function in the functions array. 202*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_READ (1) 203*5a6e8488SAndroid Build Coastguard Worker 204*5a6e8488SAndroid Build Coastguard Worker /** 205*5a6e8488SAndroid Build Coastguard Worker * Retires (completes the execution of) an instruction. Some instructions 206*5a6e8488SAndroid Build Coastguard Worker * require special retirement, but most can use this. This basically pops the 207*5a6e8488SAndroid Build Coastguard Worker * operands while preserving the result (which we assumed was pushed before the 208*5a6e8488SAndroid Build Coastguard Worker * actual operation). 209*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 210*5a6e8488SAndroid Build Coastguard Worker * @param nres The number of results returned by the instruction. 211*5a6e8488SAndroid Build Coastguard Worker * @param nops The number of operands used by the instruction. 212*5a6e8488SAndroid Build Coastguard Worker */ 213*5a6e8488SAndroid Build Coastguard Worker #define bc_program_retire(p, nres, nops) \ 214*5a6e8488SAndroid Build Coastguard Worker (bc_vec_npopAt(&(p)->results, (nops), (p)->results.len - (nres + nops))) 215*5a6e8488SAndroid Build Coastguard Worker 216*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED 217*5a6e8488SAndroid Build Coastguard Worker 218*5a6e8488SAndroid Build Coastguard Worker /// A constant that tells how many functions are required in dc. 219*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_REQ_FUNCS (2) 220*5a6e8488SAndroid Build Coastguard Worker 221*5a6e8488SAndroid Build Coastguard Worker #if !BC_ENABLED 222*5a6e8488SAndroid Build Coastguard Worker 223*5a6e8488SAndroid Build Coastguard Worker /// Returns true if the calculator should pop after printing. 224*5a6e8488SAndroid Build Coastguard Worker #define BC_PROGRAM_POP(pop) (pop) 225*5a6e8488SAndroid Build Coastguard Worker 226*5a6e8488SAndroid Build Coastguard Worker #else // !BC_ENABLED 227*5a6e8488SAndroid Build Coastguard Worker 228*5a6e8488SAndroid Build Coastguard Worker /// Returns true if the calculator should pop after printing. 229*5a6e8488SAndroid Build Coastguard Worker #define BC_PROGRAM_POP(pop) (BC_IS_BC || (pop)) 230*5a6e8488SAndroid Build Coastguard Worker 231*5a6e8488SAndroid Build Coastguard Worker #endif // !BC_ENABLED 232*5a6e8488SAndroid Build Coastguard Worker 233*5a6e8488SAndroid Build Coastguard Worker // This is here to satisfy a clang warning about recursive macros. 234*5a6e8488SAndroid Build Coastguard Worker #define bc_program_pushVar(p, code, bgn, pop, copy) \ 235*5a6e8488SAndroid Build Coastguard Worker bc_program_pushVar_impl(p, code, bgn, pop, copy) 236*5a6e8488SAndroid Build Coastguard Worker 237*5a6e8488SAndroid Build Coastguard Worker #else // DC_ENABLED 238*5a6e8488SAndroid Build Coastguard Worker 239*5a6e8488SAndroid Build Coastguard Worker // This define disappears pop and copy because for bc, 'pop' and 'copy' are 240*5a6e8488SAndroid Build Coastguard Worker // always false. 241*5a6e8488SAndroid Build Coastguard Worker #define bc_program_pushVar(p, code, bgn, pop, copy) \ 242*5a6e8488SAndroid Build Coastguard Worker bc_program_pushVar_impl(p, code, bgn) 243*5a6e8488SAndroid Build Coastguard Worker 244*5a6e8488SAndroid Build Coastguard Worker /// Returns true if the calculator should pop after printing. 245*5a6e8488SAndroid Build Coastguard Worker #define BC_PROGRAM_POP(pop) (BC_IS_BC) 246*5a6e8488SAndroid Build Coastguard Worker 247*5a6e8488SAndroid Build Coastguard Worker // In debug mode, we want bc to check the stack, but otherwise, we don't because 248*5a6e8488SAndroid Build Coastguard Worker // the bc language implicitly mandates that the stack should always have enough 249*5a6e8488SAndroid Build Coastguard Worker // items. 250*5a6e8488SAndroid Build Coastguard Worker #ifdef BC_DEBUG 251*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_NO_STACK_CHECK 252*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG 253*5a6e8488SAndroid Build Coastguard Worker 254*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED 255*5a6e8488SAndroid Build Coastguard Worker 256*5a6e8488SAndroid Build Coastguard Worker /** 257*5a6e8488SAndroid Build Coastguard Worker * Returns true if the BcNum @a n is acting as a string. 258*5a6e8488SAndroid Build Coastguard Worker * @param n The BcNum to test. 259*5a6e8488SAndroid Build Coastguard Worker * @return True if @a n is acting as a string, false otherwise. 260*5a6e8488SAndroid Build Coastguard Worker */ 261*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_STR(n) ((n)->num == NULL && !(n)->cap) 262*5a6e8488SAndroid Build Coastguard Worker 263*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED 264*5a6e8488SAndroid Build Coastguard Worker 265*5a6e8488SAndroid Build Coastguard Worker /** 266*5a6e8488SAndroid Build Coastguard Worker * Returns true if the result @a r and @a n is a number. 267*5a6e8488SAndroid Build Coastguard Worker * @param r The result. 268*5a6e8488SAndroid Build Coastguard Worker * @param n The number corresponding to the result. 269*5a6e8488SAndroid Build Coastguard Worker * @return True if the result holds a number, false otherwise. 270*5a6e8488SAndroid Build Coastguard Worker */ 271*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_NUM(r, n) \ 272*5a6e8488SAndroid Build Coastguard Worker ((r)->t != BC_RESULT_ARRAY && (r)->t != BC_RESULT_STR && !BC_PROG_STR(n)) 273*5a6e8488SAndroid Build Coastguard Worker 274*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLED 275*5a6e8488SAndroid Build Coastguard Worker 276*5a6e8488SAndroid Build Coastguard Worker /** 277*5a6e8488SAndroid Build Coastguard Worker * Returns true if the result @a r and @a n is a number. 278*5a6e8488SAndroid Build Coastguard Worker * @param r The result. 279*5a6e8488SAndroid Build Coastguard Worker * @param n The number corresponding to the result. 280*5a6e8488SAndroid Build Coastguard Worker * @return True if the result holds a number, false otherwise. 281*5a6e8488SAndroid Build Coastguard Worker */ 282*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_NUM(r, n) ((r)->t != BC_RESULT_STR && !BC_PROG_STR(n)) 283*5a6e8488SAndroid Build Coastguard Worker 284*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED 285*5a6e8488SAndroid Build Coastguard Worker 286*5a6e8488SAndroid Build Coastguard Worker /** 287*5a6e8488SAndroid Build Coastguard Worker * This is a function type for unary operations. Currently, these include 288*5a6e8488SAndroid Build Coastguard Worker * boolean not, negation, and truncation with extra math. 289*5a6e8488SAndroid Build Coastguard Worker * @param r The BcResult to store the result into. 290*5a6e8488SAndroid Build Coastguard Worker * @param n The parameter to the unary operation. 291*5a6e8488SAndroid Build Coastguard Worker */ 292*5a6e8488SAndroid Build Coastguard Worker typedef void (*BcProgramUnary)(BcResult* r, BcNum* n); 293*5a6e8488SAndroid Build Coastguard Worker 294*5a6e8488SAndroid Build Coastguard Worker /** 295*5a6e8488SAndroid Build Coastguard Worker * Initializes the BcProgram. 296*5a6e8488SAndroid Build Coastguard Worker * @param p The program to initialize. 297*5a6e8488SAndroid Build Coastguard Worker */ 298*5a6e8488SAndroid Build Coastguard Worker void 299*5a6e8488SAndroid Build Coastguard Worker bc_program_init(BcProgram* p); 300*5a6e8488SAndroid Build Coastguard Worker 301*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG 302*5a6e8488SAndroid Build Coastguard Worker 303*5a6e8488SAndroid Build Coastguard Worker /** 304*5a6e8488SAndroid Build Coastguard Worker * Frees a BcProgram. This is only used in debug builds because a BcProgram is 305*5a6e8488SAndroid Build Coastguard Worker * only freed on program exit, and we don't care about freeing resources on 306*5a6e8488SAndroid Build Coastguard Worker * exit. 307*5a6e8488SAndroid Build Coastguard Worker * @param p The program to initialize. 308*5a6e8488SAndroid Build Coastguard Worker */ 309*5a6e8488SAndroid Build Coastguard Worker void 310*5a6e8488SAndroid Build Coastguard Worker bc_program_free(BcProgram* p); 311*5a6e8488SAndroid Build Coastguard Worker 312*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG 313*5a6e8488SAndroid Build Coastguard Worker 314*5a6e8488SAndroid Build Coastguard Worker /** 315*5a6e8488SAndroid Build Coastguard Worker * Prints a stack trace of the bc functions or dc strings currently executing. 316*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 317*5a6e8488SAndroid Build Coastguard Worker */ 318*5a6e8488SAndroid Build Coastguard Worker void 319*5a6e8488SAndroid Build Coastguard Worker bc_program_printStackTrace(BcProgram* p); 320*5a6e8488SAndroid Build Coastguard Worker 321*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG_CODE 322*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED && DC_ENABLED 323*5a6e8488SAndroid Build Coastguard Worker 324*5a6e8488SAndroid Build Coastguard Worker /** 325*5a6e8488SAndroid Build Coastguard Worker * Prints the bytecode in a function. This is a debug-only function. 326*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 327*5a6e8488SAndroid Build Coastguard Worker */ 328*5a6e8488SAndroid Build Coastguard Worker void 329*5a6e8488SAndroid Build Coastguard Worker bc_program_code(const BcProgram* p); 330*5a6e8488SAndroid Build Coastguard Worker 331*5a6e8488SAndroid Build Coastguard Worker /** 332*5a6e8488SAndroid Build Coastguard Worker * Prints an instruction. This is a debug-only function. 333*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 334*5a6e8488SAndroid Build Coastguard Worker * @param code The bytecode array. 335*5a6e8488SAndroid Build Coastguard Worker * @param bgn A pointer to the current index. It is also updated to the next 336*5a6e8488SAndroid Build Coastguard Worker * index. 337*5a6e8488SAndroid Build Coastguard Worker */ 338*5a6e8488SAndroid Build Coastguard Worker void 339*5a6e8488SAndroid Build Coastguard Worker bc_program_printInst(const BcProgram* p, const char* code, 340*5a6e8488SAndroid Build Coastguard Worker size_t* restrict bgn); 341*5a6e8488SAndroid Build Coastguard Worker 342*5a6e8488SAndroid Build Coastguard Worker /** 343*5a6e8488SAndroid Build Coastguard Worker * Prints the stack. This is a debug-only function. 344*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 345*5a6e8488SAndroid Build Coastguard Worker */ 346*5a6e8488SAndroid Build Coastguard Worker void 347*5a6e8488SAndroid Build Coastguard Worker bc_program_printStackDebug(BcProgram* p); 348*5a6e8488SAndroid Build Coastguard Worker 349*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED && DC_ENABLED 350*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG_CODE 351*5a6e8488SAndroid Build Coastguard Worker 352*5a6e8488SAndroid Build Coastguard Worker /** 353*5a6e8488SAndroid Build Coastguard Worker * Returns the index of the variable or array in their respective arrays. 354*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 355*5a6e8488SAndroid Build Coastguard Worker * @param name The name of the variable or array. 356*5a6e8488SAndroid Build Coastguard Worker * @param var True if the search should be for a variable, false for an array. 357*5a6e8488SAndroid Build Coastguard Worker * @return The index of the variable or array in the correct array. 358*5a6e8488SAndroid Build Coastguard Worker */ 359*5a6e8488SAndroid Build Coastguard Worker size_t 360*5a6e8488SAndroid Build Coastguard Worker bc_program_search(BcProgram* p, const char* name, bool var); 361*5a6e8488SAndroid Build Coastguard Worker 362*5a6e8488SAndroid Build Coastguard Worker /** 363*5a6e8488SAndroid Build Coastguard Worker * Adds a string to the program and returns the string's index in the program. 364*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 365*5a6e8488SAndroid Build Coastguard Worker * @param str The string to add. 366*5a6e8488SAndroid Build Coastguard Worker * @return The string's index in the program. 367*5a6e8488SAndroid Build Coastguard Worker */ 368*5a6e8488SAndroid Build Coastguard Worker size_t 369*5a6e8488SAndroid Build Coastguard Worker bc_program_addString(BcProgram* p, const char* str); 370*5a6e8488SAndroid Build Coastguard Worker 371*5a6e8488SAndroid Build Coastguard Worker /** 372*5a6e8488SAndroid Build Coastguard Worker * Inserts a function into the program and returns the index of the function in 373*5a6e8488SAndroid Build Coastguard Worker * the fns array. 374*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 375*5a6e8488SAndroid Build Coastguard Worker * @param name The name of the function. 376*5a6e8488SAndroid Build Coastguard Worker * @return The index of the function after insertion. 377*5a6e8488SAndroid Build Coastguard Worker */ 378*5a6e8488SAndroid Build Coastguard Worker size_t 379*5a6e8488SAndroid Build Coastguard Worker bc_program_insertFunc(BcProgram* p, const char* name); 380*5a6e8488SAndroid Build Coastguard Worker 381*5a6e8488SAndroid Build Coastguard Worker /** 382*5a6e8488SAndroid Build Coastguard Worker * Resets a program, usually because of resetting after an error. 383*5a6e8488SAndroid Build Coastguard Worker * @param p The program to reset. 384*5a6e8488SAndroid Build Coastguard Worker */ 385*5a6e8488SAndroid Build Coastguard Worker void 386*5a6e8488SAndroid Build Coastguard Worker bc_program_reset(BcProgram* p); 387*5a6e8488SAndroid Build Coastguard Worker 388*5a6e8488SAndroid Build Coastguard Worker /** 389*5a6e8488SAndroid Build Coastguard Worker * Executes bc or dc code in the BcProgram. 390*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 391*5a6e8488SAndroid Build Coastguard Worker */ 392*5a6e8488SAndroid Build Coastguard Worker void 393*5a6e8488SAndroid Build Coastguard Worker bc_program_exec(BcProgram* p); 394*5a6e8488SAndroid Build Coastguard Worker 395*5a6e8488SAndroid Build Coastguard Worker /** 396*5a6e8488SAndroid Build Coastguard Worker * Negates a copy of a BcNum. This is a BcProgramUnary function. 397*5a6e8488SAndroid Build Coastguard Worker * @param r The BcResult to store the result into. 398*5a6e8488SAndroid Build Coastguard Worker * @param n The parameter to the unary operation. 399*5a6e8488SAndroid Build Coastguard Worker */ 400*5a6e8488SAndroid Build Coastguard Worker void 401*5a6e8488SAndroid Build Coastguard Worker bc_program_negate(BcResult* r, BcNum* n); 402*5a6e8488SAndroid Build Coastguard Worker 403*5a6e8488SAndroid Build Coastguard Worker /** 404*5a6e8488SAndroid Build Coastguard Worker * Returns a boolean not of a BcNum. This is a BcProgramUnary function. 405*5a6e8488SAndroid Build Coastguard Worker * @param r The BcResult to store the result into. 406*5a6e8488SAndroid Build Coastguard Worker * @param n The parameter to the unary operation. 407*5a6e8488SAndroid Build Coastguard Worker */ 408*5a6e8488SAndroid Build Coastguard Worker void 409*5a6e8488SAndroid Build Coastguard Worker bc_program_not(BcResult* r, BcNum* n); 410*5a6e8488SAndroid Build Coastguard Worker 411*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH 412*5a6e8488SAndroid Build Coastguard Worker 413*5a6e8488SAndroid Build Coastguard Worker /** 414*5a6e8488SAndroid Build Coastguard Worker * Truncates a copy of a BcNum. This is a BcProgramUnary function. 415*5a6e8488SAndroid Build Coastguard Worker * @param r The BcResult to store the result into. 416*5a6e8488SAndroid Build Coastguard Worker * @param n The parameter to the unary operation. 417*5a6e8488SAndroid Build Coastguard Worker */ 418*5a6e8488SAndroid Build Coastguard Worker void 419*5a6e8488SAndroid Build Coastguard Worker bc_program_trunc(BcResult* r, BcNum* n); 420*5a6e8488SAndroid Build Coastguard Worker 421*5a6e8488SAndroid Build Coastguard Worker /** 422*5a6e8488SAndroid Build Coastguard Worker * Assigns a value to the seed builtin variable. 423*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 424*5a6e8488SAndroid Build Coastguard Worker * @param val The value to assign to the seed. 425*5a6e8488SAndroid Build Coastguard Worker */ 426*5a6e8488SAndroid Build Coastguard Worker void 427*5a6e8488SAndroid Build Coastguard Worker bc_program_assignSeed(BcProgram* p, BcNum* val); 428*5a6e8488SAndroid Build Coastguard Worker 429*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH 430*5a6e8488SAndroid Build Coastguard Worker 431*5a6e8488SAndroid Build Coastguard Worker /** 432*5a6e8488SAndroid Build Coastguard Worker * Assigns a value to a builtin value that is not seed. 433*5a6e8488SAndroid Build Coastguard Worker * @param p The program. 434*5a6e8488SAndroid Build Coastguard Worker * @param scale True if the builtin is scale. 435*5a6e8488SAndroid Build Coastguard Worker * @param obase True if the builtin is obase. This cannot be true at the same 436*5a6e8488SAndroid Build Coastguard Worker * time @a scale is. 437*5a6e8488SAndroid Build Coastguard Worker * @param val The value to assign to the builtin. 438*5a6e8488SAndroid Build Coastguard Worker */ 439*5a6e8488SAndroid Build Coastguard Worker void 440*5a6e8488SAndroid Build Coastguard Worker bc_program_assignBuiltin(BcProgram* p, bool scale, bool obase, BcBigDig val); 441*5a6e8488SAndroid Build Coastguard Worker 442*5a6e8488SAndroid Build Coastguard Worker /// A reference to an array of binary operator functions. 443*5a6e8488SAndroid Build Coastguard Worker extern const BcNumBinaryOp bc_program_ops[]; 444*5a6e8488SAndroid Build Coastguard Worker 445*5a6e8488SAndroid Build Coastguard Worker /// A reference to an array of binary operator allocation request functions. 446*5a6e8488SAndroid Build Coastguard Worker extern const BcNumBinaryOpReq bc_program_opReqs[]; 447*5a6e8488SAndroid Build Coastguard Worker 448*5a6e8488SAndroid Build Coastguard Worker /// A reference to an array of unary operator functions. 449*5a6e8488SAndroid Build Coastguard Worker extern const BcProgramUnary bc_program_unarys[]; 450*5a6e8488SAndroid Build Coastguard Worker 451*5a6e8488SAndroid Build Coastguard Worker /// A reference to a filename for command-line expressions. 452*5a6e8488SAndroid Build Coastguard Worker extern const char bc_program_exprs_name[]; 453*5a6e8488SAndroid Build Coastguard Worker 454*5a6e8488SAndroid Build Coastguard Worker /// A reference to a filename for stdin. 455*5a6e8488SAndroid Build Coastguard Worker extern const char bc_program_stdin_name[]; 456*5a6e8488SAndroid Build Coastguard Worker 457*5a6e8488SAndroid Build Coastguard Worker /// A reference to the ready message printed on SIGINT. 458*5a6e8488SAndroid Build Coastguard Worker extern const char bc_program_ready_msg[]; 459*5a6e8488SAndroid Build Coastguard Worker 460*5a6e8488SAndroid Build Coastguard Worker /// A reference to the length of the ready message. 461*5a6e8488SAndroid Build Coastguard Worker extern const size_t bc_program_ready_msg_len; 462*5a6e8488SAndroid Build Coastguard Worker 463*5a6e8488SAndroid Build Coastguard Worker /// A reference to an array of escape characters for the print statement. 464*5a6e8488SAndroid Build Coastguard Worker extern const char bc_program_esc_chars[]; 465*5a6e8488SAndroid Build Coastguard Worker 466*5a6e8488SAndroid Build Coastguard Worker /// A reference to an array of the characters corresponding to the escape 467*5a6e8488SAndroid Build Coastguard Worker /// characters in bc_program_esc_chars. 468*5a6e8488SAndroid Build Coastguard Worker extern const char bc_program_esc_seqs[]; 469*5a6e8488SAndroid Build Coastguard Worker 470*5a6e8488SAndroid Build Coastguard Worker #if BC_HAS_COMPUTED_GOTO 471*5a6e8488SAndroid Build Coastguard Worker 472*5a6e8488SAndroid Build Coastguard Worker #if BC_DEBUG_CODE 473*5a6e8488SAndroid Build Coastguard Worker 474*5a6e8488SAndroid Build Coastguard Worker // clang-format off 475*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_JUMP(inst, code, ip) \ 476*5a6e8488SAndroid Build Coastguard Worker do \ 477*5a6e8488SAndroid Build Coastguard Worker { \ 478*5a6e8488SAndroid Build Coastguard Worker inst = (uchar) (code)[(ip)->idx++]; \ 479*5a6e8488SAndroid Build Coastguard Worker bc_file_printf(&vm->ferr, "inst: %s\n", bc_inst_names[inst]); \ 480*5a6e8488SAndroid Build Coastguard Worker bc_file_flush(&vm->ferr, bc_flush_none); \ 481*5a6e8488SAndroid Build Coastguard Worker goto *bc_program_inst_lbls[inst]; \ 482*5a6e8488SAndroid Build Coastguard Worker } \ 483*5a6e8488SAndroid Build Coastguard Worker while (0) 484*5a6e8488SAndroid Build Coastguard Worker // clang-format on 485*5a6e8488SAndroid Build Coastguard Worker 486*5a6e8488SAndroid Build Coastguard Worker #else // BC_DEBUG_CODE 487*5a6e8488SAndroid Build Coastguard Worker 488*5a6e8488SAndroid Build Coastguard Worker // clang-format off 489*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_JUMP(inst, code, ip) \ 490*5a6e8488SAndroid Build Coastguard Worker do \ 491*5a6e8488SAndroid Build Coastguard Worker { \ 492*5a6e8488SAndroid Build Coastguard Worker inst = (uchar) (code)[(ip)->idx++]; \ 493*5a6e8488SAndroid Build Coastguard Worker goto *bc_program_inst_lbls[inst]; \ 494*5a6e8488SAndroid Build Coastguard Worker } \ 495*5a6e8488SAndroid Build Coastguard Worker while (0) 496*5a6e8488SAndroid Build Coastguard Worker // clang-format on 497*5a6e8488SAndroid Build Coastguard Worker 498*5a6e8488SAndroid Build Coastguard Worker #endif // BC_DEBUG_CODE 499*5a6e8488SAndroid Build Coastguard Worker 500*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_DIRECT_JUMP(l) goto lbl_##l; 501*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBL(l) lbl_##l 502*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_FALLTHROUGH 503*5a6e8488SAndroid Build Coastguard Worker 504*5a6e8488SAndroid Build Coastguard Worker #if BC_C11 505*5a6e8488SAndroid Build Coastguard Worker 506*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS_SIZE (sizeof(bc_program_inst_lbls) / sizeof(void*)) 507*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS_ASSERT \ 508*5a6e8488SAndroid Build Coastguard Worker _Static_assert(BC_PROG_LBLS_SIZE == BC_INST_INVALID + 1, \ 509*5a6e8488SAndroid Build Coastguard Worker "bc_program_inst_lbls[] mismatches the instructions") 510*5a6e8488SAndroid Build Coastguard Worker 511*5a6e8488SAndroid Build Coastguard Worker #else // BC_C11 512*5a6e8488SAndroid Build Coastguard Worker 513*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS_ASSERT 514*5a6e8488SAndroid Build Coastguard Worker 515*5a6e8488SAndroid Build Coastguard Worker #endif // BC_C11 516*5a6e8488SAndroid Build Coastguard Worker 517*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLED 518*5a6e8488SAndroid Build Coastguard Worker 519*5a6e8488SAndroid Build Coastguard Worker #if DC_ENABLED 520*5a6e8488SAndroid Build Coastguard Worker 521*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH 522*5a6e8488SAndroid Build Coastguard Worker 523*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS \ 524*5a6e8488SAndroid Build Coastguard Worker static const void* const bc_program_inst_lbls[] = { \ 525*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_INC, \ 526*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DEC, \ 527*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NEG, \ 528*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_NOT, \ 529*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_TRUNC, \ 530*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POWER, \ 531*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MULTIPLY, \ 532*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DIVIDE, \ 533*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODULUS, \ 534*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PLUS, \ 535*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MINUS, \ 536*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PLACES, \ 537*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LSHIFT, \ 538*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RSHIFT, \ 539*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_EQ, \ 540*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_LE, \ 541*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_GE, \ 542*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_NE, \ 543*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_LT, \ 544*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_GT, \ 545*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_OR, \ 546*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_AND, \ 547*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_POWER, \ 548*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MULTIPLY, \ 549*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_DIVIDE, \ 550*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MODULUS, \ 551*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLUS, \ 552*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MINUS, \ 553*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLACES, \ 554*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_LSHIFT, \ 555*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_RSHIFT, \ 556*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN, \ 557*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_POWER_NO_VAL, \ 558*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MULTIPLY_NO_VAL, \ 559*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_DIVIDE_NO_VAL, \ 560*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MODULUS_NO_VAL, \ 561*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLUS_NO_VAL, \ 562*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MINUS_NO_VAL, \ 563*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLACES_NO_VAL, \ 564*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_LSHIFT_NO_VAL, \ 565*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_RSHIFT_NO_VAL, \ 566*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_NO_VAL, \ 567*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NUM, \ 568*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_VAR, \ 569*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ARRAY_ELEM, \ 570*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ARRAY, \ 571*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ZERO, \ 572*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ONE, \ 573*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LAST, \ 574*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IBASE, \ 575*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_OBASE, \ 576*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SCALE, \ 577*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SEED, \ 578*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LENGTH, \ 579*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SCALE_FUNC, \ 580*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SQRT, \ 581*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ABS, \ 582*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IS_NUMBER, \ 583*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IS_STRING, \ 584*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IRAND, \ 585*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASCIIFY, \ 586*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_READ, \ 587*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RAND, \ 588*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXIBASE, \ 589*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXOBASE, \ 590*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXSCALE, \ 591*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXRAND, \ 592*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LINE_LENGTH, \ 593*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_GLOBAL_STACKS, \ 594*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LEADING_ZERO, \ 595*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT, \ 596*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_POP, \ 597*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_STR, \ 598*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STR, \ 599*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_JUMP, \ 600*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_JUMP_ZERO, \ 601*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_CALL, \ 602*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET, \ 603*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET0, \ 604*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET_VOID, \ 605*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_HALT, \ 606*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POP, \ 607*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SWAP, \ 608*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODEXP, \ 609*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DIVMOD, \ 610*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STREAM, \ 611*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_EXTENDED_REGISTERS, \ 612*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POP_EXEC, \ 613*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_EXECUTE, \ 614*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_EXEC_COND, \ 615*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STACK, \ 616*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_CLEAR_STACK, \ 617*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REG_STACK_LEN, \ 618*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_STACK_LEN, \ 619*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DUPLICATE, \ 620*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LOAD, \ 621*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PUSH_VAR, \ 622*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PUSH_TO_VAR, \ 623*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_QUIT, \ 624*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NQUIT, \ 625*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_EXEC_STACK_LEN, \ 626*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_INVALID, \ 627*5a6e8488SAndroid Build Coastguard Worker } 628*5a6e8488SAndroid Build Coastguard Worker 629*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLE_EXTRA_MATH 630*5a6e8488SAndroid Build Coastguard Worker 631*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS \ 632*5a6e8488SAndroid Build Coastguard Worker static const void* const bc_program_inst_lbls[] = { \ 633*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_INC, \ 634*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DEC, \ 635*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NEG, \ 636*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_NOT, \ 637*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POWER, \ 638*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MULTIPLY, \ 639*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DIVIDE, \ 640*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODULUS, \ 641*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PLUS, \ 642*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MINUS, \ 643*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_EQ, \ 644*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_LE, \ 645*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_GE, \ 646*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_NE, \ 647*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_LT, \ 648*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_GT, \ 649*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_OR, \ 650*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_AND, \ 651*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_POWER, \ 652*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MULTIPLY, \ 653*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_DIVIDE, \ 654*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MODULUS, \ 655*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLUS, \ 656*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MINUS, \ 657*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN, \ 658*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_POWER_NO_VAL, \ 659*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MULTIPLY_NO_VAL, \ 660*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_DIVIDE_NO_VAL, \ 661*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MODULUS_NO_VAL, \ 662*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLUS_NO_VAL, \ 663*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MINUS_NO_VAL, \ 664*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_NO_VAL, \ 665*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NUM, \ 666*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_VAR, \ 667*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ARRAY_ELEM, \ 668*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ARRAY, \ 669*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ZERO, \ 670*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ONE, \ 671*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LAST, \ 672*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IBASE, \ 673*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_OBASE, \ 674*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SCALE, \ 675*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LENGTH, \ 676*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SCALE_FUNC, \ 677*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SQRT, \ 678*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ABS, \ 679*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IS_NUMBER, \ 680*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IS_STRING, \ 681*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASCIIFY, \ 682*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_READ, \ 683*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXIBASE, \ 684*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXOBASE, \ 685*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXSCALE, \ 686*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LINE_LENGTH, \ 687*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_GLOBAL_STACKS, \ 688*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LEADING_ZERO, \ 689*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT, \ 690*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_POP, \ 691*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_STR, \ 692*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STR, \ 693*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_JUMP, \ 694*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_JUMP_ZERO, \ 695*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_CALL, \ 696*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET, \ 697*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET0, \ 698*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET_VOID, \ 699*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_HALT, \ 700*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POP, \ 701*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SWAP, \ 702*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODEXP, \ 703*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DIVMOD, \ 704*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STREAM, \ 705*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_EXTENDED_REGISTERS, \ 706*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POP_EXEC, \ 707*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_EXECUTE, \ 708*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_EXEC_COND, \ 709*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STACK, \ 710*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_CLEAR_STACK, \ 711*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REG_STACK_LEN, \ 712*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_STACK_LEN, \ 713*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DUPLICATE, \ 714*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LOAD, \ 715*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PUSH_VAR, \ 716*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PUSH_TO_VAR, \ 717*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_QUIT, \ 718*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NQUIT, \ 719*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_EXEC_STACK_LEN, \ 720*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_INVALID, \ 721*5a6e8488SAndroid Build Coastguard Worker } 722*5a6e8488SAndroid Build Coastguard Worker 723*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH 724*5a6e8488SAndroid Build Coastguard Worker 725*5a6e8488SAndroid Build Coastguard Worker #else // DC_ENABLED 726*5a6e8488SAndroid Build Coastguard Worker 727*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH 728*5a6e8488SAndroid Build Coastguard Worker 729*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS \ 730*5a6e8488SAndroid Build Coastguard Worker static const void* const bc_program_inst_lbls[] = { \ 731*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_INC, \ 732*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DEC, \ 733*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NEG, \ 734*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_NOT, \ 735*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_TRUNC, \ 736*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POWER, \ 737*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MULTIPLY, \ 738*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DIVIDE, \ 739*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODULUS, \ 740*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PLUS, \ 741*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MINUS, \ 742*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PLACES, \ 743*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LSHIFT, \ 744*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RSHIFT, \ 745*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_EQ, \ 746*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_LE, \ 747*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_GE, \ 748*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_NE, \ 749*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_LT, \ 750*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_GT, \ 751*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_OR, \ 752*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_AND, \ 753*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_POWER, \ 754*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MULTIPLY, \ 755*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_DIVIDE, \ 756*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MODULUS, \ 757*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLUS, \ 758*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MINUS, \ 759*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLACES, \ 760*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_LSHIFT, \ 761*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_RSHIFT, \ 762*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN, \ 763*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_POWER_NO_VAL, \ 764*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MULTIPLY_NO_VAL, \ 765*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_DIVIDE_NO_VAL, \ 766*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MODULUS_NO_VAL, \ 767*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLUS_NO_VAL, \ 768*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MINUS_NO_VAL, \ 769*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLACES_NO_VAL, \ 770*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_LSHIFT_NO_VAL, \ 771*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_RSHIFT_NO_VAL, \ 772*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_NO_VAL, \ 773*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NUM, \ 774*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_VAR, \ 775*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ARRAY_ELEM, \ 776*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ARRAY, \ 777*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ZERO, \ 778*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ONE, \ 779*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LAST, \ 780*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IBASE, \ 781*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_OBASE, \ 782*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SCALE, \ 783*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SEED, \ 784*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LENGTH, \ 785*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SCALE_FUNC, \ 786*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SQRT, \ 787*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ABS, \ 788*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IS_NUMBER, \ 789*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IS_STRING, \ 790*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IRAND, \ 791*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASCIIFY, \ 792*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_READ, \ 793*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RAND, \ 794*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXIBASE, \ 795*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXOBASE, \ 796*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXSCALE, \ 797*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXRAND, \ 798*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LINE_LENGTH, \ 799*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_GLOBAL_STACKS, \ 800*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LEADING_ZERO, \ 801*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT, \ 802*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_POP, \ 803*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_STR, \ 804*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STR, \ 805*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_JUMP, \ 806*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_JUMP_ZERO, \ 807*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_CALL, \ 808*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET, \ 809*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET0, \ 810*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET_VOID, \ 811*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_HALT, \ 812*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POP, \ 813*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SWAP, \ 814*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODEXP, \ 815*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DIVMOD, \ 816*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STREAM, \ 817*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_INVALID, \ 818*5a6e8488SAndroid Build Coastguard Worker } 819*5a6e8488SAndroid Build Coastguard Worker 820*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLE_EXTRA_MATH 821*5a6e8488SAndroid Build Coastguard Worker 822*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS \ 823*5a6e8488SAndroid Build Coastguard Worker static const void* const bc_program_inst_lbls[] = { \ 824*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_INC, \ 825*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DEC, \ 826*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NEG, \ 827*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_NOT, \ 828*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POWER, \ 829*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MULTIPLY, \ 830*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DIVIDE, \ 831*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODULUS, \ 832*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PLUS, \ 833*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MINUS, \ 834*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_EQ, \ 835*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_LE, \ 836*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_GE, \ 837*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_NE, \ 838*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_LT, \ 839*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_GT, \ 840*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_OR, \ 841*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_AND, \ 842*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_POWER, \ 843*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MULTIPLY, \ 844*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_DIVIDE, \ 845*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MODULUS, \ 846*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLUS, \ 847*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MINUS, \ 848*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN, \ 849*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_POWER_NO_VAL, \ 850*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MULTIPLY_NO_VAL, \ 851*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_DIVIDE_NO_VAL, \ 852*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MODULUS_NO_VAL, \ 853*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_PLUS_NO_VAL, \ 854*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_MINUS_NO_VAL, \ 855*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_NO_VAL, \ 856*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NUM, \ 857*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_VAR, \ 858*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ARRAY_ELEM, \ 859*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ARRAY, \ 860*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ZERO, \ 861*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ONE, \ 862*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LAST, \ 863*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IBASE, \ 864*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_OBASE, \ 865*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SCALE, \ 866*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LENGTH, \ 867*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SCALE_FUNC, \ 868*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SQRT, \ 869*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ABS, \ 870*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IS_NUMBER, \ 871*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IS_STRING, \ 872*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASCIIFY, \ 873*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_READ, \ 874*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXIBASE, \ 875*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXOBASE, \ 876*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXSCALE, \ 877*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LINE_LENGTH, \ 878*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_GLOBAL_STACKS, \ 879*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LEADING_ZERO, \ 880*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT, \ 881*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_POP, \ 882*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_STR, \ 883*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STR, \ 884*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_JUMP, \ 885*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_JUMP_ZERO, \ 886*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_CALL, \ 887*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET, \ 888*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET0, \ 889*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RET_VOID, \ 890*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_HALT, \ 891*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POP, \ 892*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SWAP, \ 893*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODEXP, \ 894*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DIVMOD, \ 895*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STREAM, \ 896*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_INVALID, \ 897*5a6e8488SAndroid Build Coastguard Worker } 898*5a6e8488SAndroid Build Coastguard Worker 899*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH 900*5a6e8488SAndroid Build Coastguard Worker 901*5a6e8488SAndroid Build Coastguard Worker #endif // DC_ENABLED 902*5a6e8488SAndroid Build Coastguard Worker 903*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLED 904*5a6e8488SAndroid Build Coastguard Worker 905*5a6e8488SAndroid Build Coastguard Worker #if BC_ENABLE_EXTRA_MATH 906*5a6e8488SAndroid Build Coastguard Worker 907*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS \ 908*5a6e8488SAndroid Build Coastguard Worker static const void* const bc_program_inst_lbls[] = { \ 909*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NEG, &&lbl_BC_INST_BOOL_NOT, \ 910*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_TRUNC, &&lbl_BC_INST_POWER, \ 911*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MULTIPLY, &&lbl_BC_INST_DIVIDE, \ 912*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODULUS, &&lbl_BC_INST_PLUS, \ 913*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MINUS, &&lbl_BC_INST_PLACES, \ 914*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LSHIFT, &&lbl_BC_INST_RSHIFT, \ 915*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_EQ, &&lbl_BC_INST_REL_LE, \ 916*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_GE, &&lbl_BC_INST_REL_NE, \ 917*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_LT, &&lbl_BC_INST_REL_GT, \ 918*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_OR, &&lbl_BC_INST_BOOL_AND, \ 919*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_NO_VAL, &&lbl_BC_INST_NUM, \ 920*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_VAR, &&lbl_BC_INST_ARRAY_ELEM, \ 921*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ARRAY, &&lbl_BC_INST_ZERO, \ 922*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ONE, &&lbl_BC_INST_IBASE, \ 923*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_OBASE, &&lbl_BC_INST_SCALE, \ 924*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SEED, &&lbl_BC_INST_LENGTH, \ 925*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SCALE_FUNC, &&lbl_BC_INST_SQRT, \ 926*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ABS, &&lbl_BC_INST_IS_NUMBER, \ 927*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IS_STRING, &&lbl_BC_INST_IRAND, \ 928*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASCIIFY, &&lbl_BC_INST_READ, \ 929*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_RAND, &&lbl_BC_INST_MAXIBASE, \ 930*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXOBASE, &&lbl_BC_INST_MAXSCALE, \ 931*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXRAND, &&lbl_BC_INST_LINE_LENGTH, \ 932*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LEADING_ZERO, &&lbl_BC_INST_PRINT, \ 933*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_POP, &&lbl_BC_INST_STR, \ 934*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POP, &&lbl_BC_INST_SWAP, \ 935*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODEXP, &&lbl_BC_INST_DIVMOD, \ 936*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STREAM, &&lbl_BC_INST_EXTENDED_REGISTERS, \ 937*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POP_EXEC, &&lbl_BC_INST_EXECUTE, \ 938*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_EXEC_COND, &&lbl_BC_INST_PRINT_STACK, \ 939*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_CLEAR_STACK, &&lbl_BC_INST_REG_STACK_LEN, \ 940*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_STACK_LEN, &&lbl_BC_INST_DUPLICATE, \ 941*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LOAD, &&lbl_BC_INST_PUSH_VAR, \ 942*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PUSH_TO_VAR, &&lbl_BC_INST_QUIT, \ 943*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NQUIT, &&lbl_BC_INST_EXEC_STACK_LEN, \ 944*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_INVALID, \ 945*5a6e8488SAndroid Build Coastguard Worker } 946*5a6e8488SAndroid Build Coastguard Worker 947*5a6e8488SAndroid Build Coastguard Worker #else // BC_ENABLE_EXTRA_MATH 948*5a6e8488SAndroid Build Coastguard Worker 949*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS \ 950*5a6e8488SAndroid Build Coastguard Worker static const void* const bc_program_inst_lbls[] = { \ 951*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NEG, &&lbl_BC_INST_BOOL_NOT, \ 952*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POWER, &&lbl_BC_INST_MULTIPLY, \ 953*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_DIVIDE, &&lbl_BC_INST_MODULUS, \ 954*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PLUS, &&lbl_BC_INST_MINUS, \ 955*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_EQ, &&lbl_BC_INST_REL_LE, \ 956*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_GE, &&lbl_BC_INST_REL_NE, \ 957*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_REL_LT, &&lbl_BC_INST_REL_GT, \ 958*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_BOOL_OR, &&lbl_BC_INST_BOOL_AND, \ 959*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASSIGN_NO_VAL, &&lbl_BC_INST_NUM, \ 960*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_VAR, &&lbl_BC_INST_ARRAY_ELEM, \ 961*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ARRAY, &&lbl_BC_INST_ZERO, \ 962*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ONE, &&lbl_BC_INST_IBASE, \ 963*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_OBASE, &&lbl_BC_INST_SCALE, \ 964*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LENGTH, &&lbl_BC_INST_SCALE_FUNC, \ 965*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_SQRT, &&lbl_BC_INST_ABS, \ 966*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_IS_NUMBER, &&lbl_BC_INST_IS_STRING, \ 967*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_ASCIIFY, &&lbl_BC_INST_READ, \ 968*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXIBASE, &&lbl_BC_INST_MAXOBASE, \ 969*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MAXSCALE, &&lbl_BC_INST_LINE_LENGTH, \ 970*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LEADING_ZERO, &&lbl_BC_INST_PRINT, \ 971*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_POP, &&lbl_BC_INST_STR, \ 972*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POP, &&lbl_BC_INST_SWAP, \ 973*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_MODEXP, &&lbl_BC_INST_DIVMOD, \ 974*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PRINT_STREAM, &&lbl_BC_INST_EXTENDED_REGISTERS, \ 975*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_POP_EXEC, &&lbl_BC_INST_EXECUTE, \ 976*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_EXEC_COND, &&lbl_BC_INST_PRINT_STACK, \ 977*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_CLEAR_STACK, &&lbl_BC_INST_REG_STACK_LEN, \ 978*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_STACK_LEN, &&lbl_BC_INST_DUPLICATE, \ 979*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_LOAD, &&lbl_BC_INST_PUSH_VAR, \ 980*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_PUSH_TO_VAR, &&lbl_BC_INST_QUIT, \ 981*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_NQUIT, &&lbl_BC_INST_EXEC_STACK_LEN, \ 982*5a6e8488SAndroid Build Coastguard Worker &&lbl_BC_INST_INVALID, \ 983*5a6e8488SAndroid Build Coastguard Worker } 984*5a6e8488SAndroid Build Coastguard Worker 985*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLE_EXTRA_MATH 986*5a6e8488SAndroid Build Coastguard Worker 987*5a6e8488SAndroid Build Coastguard Worker #endif // BC_ENABLED 988*5a6e8488SAndroid Build Coastguard Worker 989*5a6e8488SAndroid Build Coastguard Worker #else // BC_HAS_COMPUTED_GOTO 990*5a6e8488SAndroid Build Coastguard Worker 991*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_JUMP(inst, code, ip) break 992*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_DIRECT_JUMP(l) 993*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBL(l) case l 994*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_FALLTHROUGH BC_FALLTHROUGH 995*5a6e8488SAndroid Build Coastguard Worker 996*5a6e8488SAndroid Build Coastguard Worker #define BC_PROG_LBLS 997*5a6e8488SAndroid Build Coastguard Worker 998*5a6e8488SAndroid Build Coastguard Worker #endif // BC_HAS_COMPUTED_GOTO 999*5a6e8488SAndroid Build Coastguard Worker 1000*5a6e8488SAndroid Build Coastguard Worker #endif // BC_PROGRAM_H 1001