]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - include/lang.h
Import version 3.2.0
[FreeBSD/FreeBSD.git] / include / lang.h
1 /*
2  * *****************************************************************************
3  *
4  * SPDX-License-Identifier: BSD-2-Clause
5  *
6  * Copyright (c) 2018-2020 Gavin D. Howard and contributors.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions are met:
10  *
11  * * Redistributions of source code must retain the above copyright notice, this
12  *   list of conditions and the following disclaimer.
13  *
14  * * Redistributions in binary form must reproduce the above copyright notice,
15  *   this list of conditions and the following disclaimer in the documentation
16  *   and/or other materials provided with the distribution.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28  * POSSIBILITY OF SUCH DAMAGE.
29  *
30  * *****************************************************************************
31  *
32  * Definitions for program data.
33  *
34  */
35
36 #ifndef BC_LANG_H
37 #define BC_LANG_H
38
39 #include <stdbool.h>
40
41 #include <status.h>
42 #include <vector.h>
43 #include <num.h>
44
45 #if BC_ENABLED
46 #define BC_INST_IS_ASSIGN(i) \
47         ((i) == BC_INST_ASSIGN || (i) == BC_INST_ASSIGN_NO_VAL)
48 #define BC_INST_USE_VAL(i) ((i) <= BC_INST_ASSIGN)
49 #else // BC_ENABLED
50 #define BC_INST_IS_ASSIGN(i) ((i) == BC_INST_ASSIGN_NO_VAL)
51 #define BC_INST_USE_VAL(i) (false)
52 #endif // BC_ENABLED
53
54 #ifndef NDEBUG
55 #define BC_ENABLE_FUNC_FREE (1)
56 #else // NDEBUG
57 #define BC_ENABLE_FUNC_FREE DC_ENABLED
58 #endif // NDEBUG
59
60 typedef enum BcInst {
61
62 #if BC_ENABLED
63         BC_INST_INC = 0,
64         BC_INST_DEC,
65 #endif // BC_ENABLED
66
67         BC_INST_NEG,
68         BC_INST_BOOL_NOT,
69 #if BC_ENABLE_EXTRA_MATH
70         BC_INST_TRUNC,
71 #endif // BC_ENABLE_EXTRA_MATH
72
73         BC_INST_POWER,
74         BC_INST_MULTIPLY,
75         BC_INST_DIVIDE,
76         BC_INST_MODULUS,
77         BC_INST_PLUS,
78         BC_INST_MINUS,
79
80 #if BC_ENABLE_EXTRA_MATH
81         BC_INST_PLACES,
82
83         BC_INST_LSHIFT,
84         BC_INST_RSHIFT,
85 #endif // BC_ENABLE_EXTRA_MATH
86
87         BC_INST_REL_EQ,
88         BC_INST_REL_LE,
89         BC_INST_REL_GE,
90         BC_INST_REL_NE,
91         BC_INST_REL_LT,
92         BC_INST_REL_GT,
93
94         BC_INST_BOOL_OR,
95         BC_INST_BOOL_AND,
96
97 #if BC_ENABLED
98         BC_INST_ASSIGN_POWER,
99         BC_INST_ASSIGN_MULTIPLY,
100         BC_INST_ASSIGN_DIVIDE,
101         BC_INST_ASSIGN_MODULUS,
102         BC_INST_ASSIGN_PLUS,
103         BC_INST_ASSIGN_MINUS,
104 #if BC_ENABLE_EXTRA_MATH
105         BC_INST_ASSIGN_PLACES,
106         BC_INST_ASSIGN_LSHIFT,
107         BC_INST_ASSIGN_RSHIFT,
108 #endif // BC_ENABLE_EXTRA_MATH
109         BC_INST_ASSIGN,
110
111         BC_INST_ASSIGN_POWER_NO_VAL,
112         BC_INST_ASSIGN_MULTIPLY_NO_VAL,
113         BC_INST_ASSIGN_DIVIDE_NO_VAL,
114         BC_INST_ASSIGN_MODULUS_NO_VAL,
115         BC_INST_ASSIGN_PLUS_NO_VAL,
116         BC_INST_ASSIGN_MINUS_NO_VAL,
117 #if BC_ENABLE_EXTRA_MATH
118         BC_INST_ASSIGN_PLACES_NO_VAL,
119         BC_INST_ASSIGN_LSHIFT_NO_VAL,
120         BC_INST_ASSIGN_RSHIFT_NO_VAL,
121 #endif // BC_ENABLE_EXTRA_MATH
122 #endif // BC_ENABLED
123         BC_INST_ASSIGN_NO_VAL,
124
125         BC_INST_NUM,
126         BC_INST_VAR,
127         BC_INST_ARRAY_ELEM,
128 #if BC_ENABLED
129         BC_INST_ARRAY,
130 #endif // BC_ENABLED
131
132         BC_INST_ZERO,
133         BC_INST_ONE,
134
135 #if BC_ENABLED
136         BC_INST_LAST,
137 #endif // BC_ENABLED
138         BC_INST_IBASE,
139         BC_INST_OBASE,
140         BC_INST_SCALE,
141 #if BC_ENABLE_EXTRA_MATH && BC_ENABLE_RAND
142         BC_INST_SEED,
143 #endif // BC_ENABLE_EXTRA_MATH && BC_ENABLE_RAND
144         BC_INST_LENGTH,
145         BC_INST_SCALE_FUNC,
146         BC_INST_SQRT,
147         BC_INST_ABS,
148 #if BC_ENABLE_EXTRA_MATH && BC_ENABLE_RAND
149         BC_INST_IRAND,
150 #endif // BC_ENABLE_EXTRA_MATH && BC_ENABLE_RAND
151         BC_INST_READ,
152 #if BC_ENABLE_EXTRA_MATH && BC_ENABLE_RAND
153         BC_INST_RAND,
154 #endif // BC_ENABLE_EXTRA_MATH && BC_ENABLE_RAND
155         BC_INST_MAXIBASE,
156         BC_INST_MAXOBASE,
157         BC_INST_MAXSCALE,
158 #if BC_ENABLE_EXTRA_MATH && BC_ENABLE_RAND
159         BC_INST_MAXRAND,
160 #endif // BC_ENABLE_EXTRA_MATH && BC_ENABLE_RAND
161
162         BC_INST_PRINT,
163         BC_INST_PRINT_POP,
164         BC_INST_STR,
165         BC_INST_PRINT_STR,
166
167 #if BC_ENABLED
168         BC_INST_JUMP,
169         BC_INST_JUMP_ZERO,
170
171         BC_INST_CALL,
172
173         BC_INST_RET,
174         BC_INST_RET0,
175         BC_INST_RET_VOID,
176
177         BC_INST_HALT,
178 #endif // BC_ENABLED
179
180         BC_INST_POP,
181
182 #if DC_ENABLED
183         BC_INST_POP_EXEC,
184         BC_INST_MODEXP,
185         BC_INST_DIVMOD,
186
187         BC_INST_EXECUTE,
188         BC_INST_EXEC_COND,
189
190         BC_INST_ASCIIFY,
191         BC_INST_PRINT_STREAM,
192
193         BC_INST_PRINT_STACK,
194         BC_INST_CLEAR_STACK,
195         BC_INST_STACK_LEN,
196         BC_INST_DUPLICATE,
197         BC_INST_SWAP,
198
199         BC_INST_LOAD,
200         BC_INST_PUSH_VAR,
201         BC_INST_PUSH_TO_VAR,
202
203         BC_INST_QUIT,
204         BC_INST_NQUIT,
205 #endif // DC_ENABLED
206
207         BC_INST_INVALID = UCHAR_MAX,
208
209 } BcInst;
210
211 typedef struct BcId {
212         char *name;
213         size_t idx;
214 } BcId;
215
216 typedef struct BcLoc {
217         size_t loc;
218         size_t idx;
219 } BcLoc;
220
221 typedef struct BcConst {
222         char *val;
223         BcBigDig base;
224         BcNum num;
225 } BcConst;
226
227 typedef struct BcFunc {
228
229         BcVec code;
230 #if BC_ENABLED
231         BcVec labels;
232         BcVec autos;
233         size_t nparams;
234 #endif // BC_ENABLED
235
236         BcVec strs;
237         BcVec consts;
238
239         const char *name;
240 #if BC_ENABLED
241         bool voidfn;
242 #endif // BC_ENABLED
243
244 } BcFunc;
245
246 typedef enum BcResultType {
247
248         BC_RESULT_VAR,
249         BC_RESULT_ARRAY_ELEM,
250 #if BC_ENABLED
251         BC_RESULT_ARRAY,
252 #endif // BC_ENABLED
253
254         BC_RESULT_STR,
255
256         BC_RESULT_TEMP,
257
258         BC_RESULT_ZERO,
259         BC_RESULT_ONE,
260
261 #if BC_ENABLED
262         BC_RESULT_LAST,
263         BC_RESULT_VOID,
264 #endif // BC_ENABLED
265         BC_RESULT_IBASE,
266         BC_RESULT_OBASE,
267         BC_RESULT_SCALE,
268 #if BC_ENABLE_EXTRA_MATH
269         BC_RESULT_SEED,
270 #endif // BC_ENABLE_EXTRA_MATH
271
272 } BcResultType;
273
274 typedef union BcResultData {
275         BcNum n;
276         BcVec v;
277         BcLoc loc;
278 } BcResultData;
279
280 typedef struct BcResult {
281         BcResultType t;
282         BcResultData d;
283 } BcResult;
284
285 typedef struct BcInstPtr {
286         size_t func;
287         size_t idx;
288         size_t len;
289 } BcInstPtr;
290
291 typedef enum BcType {
292         BC_TYPE_VAR,
293         BC_TYPE_ARRAY,
294 #if BC_ENABLED
295         BC_TYPE_REF,
296 #endif // BC_ENABLED
297 } BcType;
298
299 struct BcProgram;
300
301 void bc_func_init(BcFunc *f, const char* name);
302 void bc_func_insert(BcFunc *f, struct BcProgram* p, char* name,
303                     BcType type, size_t line);
304 void bc_func_reset(BcFunc *f);
305 void bc_func_free(void *func);
306
307 void bc_array_init(BcVec *a, bool nums);
308 void bc_array_copy(BcVec *d, const BcVec *s);
309
310 void bc_string_free(void *string);
311 void bc_const_free(void *constant);
312 void bc_id_free(void *id);
313 void bc_result_clear(BcResult *r);
314 void bc_result_copy(BcResult *d, BcResult *src);
315 void bc_result_free(void *result);
316
317 void bc_array_expand(BcVec *a, size_t len);
318 int bc_id_cmp(const BcId *e1, const BcId *e2);
319
320 #if BC_DEBUG_CODE
321 extern const char* bc_inst_names[];
322 #endif // BC_DEBUG_CODE
323
324 extern const char bc_func_main[];
325 extern const char bc_func_read[];
326
327 #endif // BC_LANG_H