xref: /aosp_15_r20/external/bc/include/vm.h (revision 5a6e848804d15c18a0125914844ee4eb0bda4fcf)
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