1 /*
2 ** This source file is part of MY-BASIC
3 **
4 ** For the latest info, see http://code.google.com/p/my-basic/
5 **
6 ** Copyright (c) 2011 - 2014 paladin_t
7 **
8 ** Permission is hereby granted, free of charge, to any person obtaining a copy of
9 ** this software and associated documentation files (the "Software"), to deal in
10 ** the Software without restriction, including without limitation the rights to
11 ** use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
12 ** the Software, and to permit persons to whom the Software is furnished to do so,
13 ** subject to the following conditions:
14 **
15 ** The above copyright notice and this permission notice shall be included in all
16 ** copies or substantial portions of the Software.
17 **
18 ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 ** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
20 ** FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
21 ** COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
22 ** IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23 ** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24 */
25 
26 #ifndef __MY_BASIC_H__
27 #define __MY_BASIC_H__
28 
29 #ifdef __cplusplus
30 extern "C" {
31 #endif /* __cplusplus */
32 
33 #ifndef MBAPI
34 #	define MBAPI
35 #endif /* MBAPI */
36 
37 #ifndef MB_COMPACT_MODE
38 #	define MB_COMPACT_MODE
39 #endif /* MB_COMPACT_MODE */
40 
41 #ifdef MB_COMPACT_MODE
42 #	pragma pack(1)
43 #endif /* MB_COMPACT_MODE */
44 
45 #ifndef true
46 #	define true (!0)
47 #endif
48 #ifndef false
49 #	define false (0)
50 #endif
51 
52 #ifndef bool_t
53 #	define bool_t int
54 #endif
55 #ifndef byte_t
56 #	define byte_t unsigned char
57 #endif
58 #ifndef int_t
59 #	define int_t int
60 #endif
61 #ifndef real_t
62 #	define real_t float
63 #endif
64 
65 #ifndef _MSC_VER
66 #	ifndef _strcmpi
67 #		define _strcmpi strcasecmp
68 #	endif /* _strcmpi */
69 #endif /* _MSC_VER */
70 
71 #ifndef mb_assert
72 #	define mb_assert(__a) do { ((void)(__a)); assert(__a); } while(0)
73 #endif /* mb_assert */
74 
75 #ifndef mb_unrefvar
76 #	define mb_unrefvar(__v) ((void)(__v))
77 #endif /* mb_unrefvar */
78 
79 #ifndef MB_CODES
80 #	define MB_CODES
81 #	define MB_FUNC_OK 0
82 #	define MB_FUNC_BYE 1001
83 #	define MB_FUNC_WARNING 1002
84 #	define MB_FUNC_ERR 1003
85 #	define MB_FUNC_END 1004
86 #	define MB_FUNC_SUSPEND 1005
87 #	define MB_PARSING_ERR 3001
88 #	define MB_LOOP_BREAK 5001
89 #	define MB_LOOP_CONTINUE 5002
90 #	define MB_SUB_RETURN 5101
91 #	define MB_EXTENDED_ABORT 9001
92 #endif /* MB_CODES */
93 
94 #ifndef mb_check
95 #	define mb_check(__r) { int __hr = __r; if(__hr != MB_FUNC_OK) { return __hr; } }
96 #endif /* mb_check */
97 
98 #ifndef mb_reg_fun
99 #	define mb_reg_fun(__s, __f) mb_register_func(__s, #__f, __f)
100 #endif /* mb_reg_fun */
101 #ifndef mb_rem_fun
102 #	define mb_rem_fun(__s, __f) mb_remove_func(__s, #__f)
103 #endif /* mb_rem_fun */
104 
105 struct mb_interpreter_t;
106 
107 typedef enum mb_error_e {
108 	SE_NO_ERR = 0,
109 	/** Common */
110 	SE_CM_MB_OPEN_FAILED,
111 	SE_CM_FUNC_EXISTS,
112 	SE_CM_FUNC_NOT_EXISTS,
113 	/** Parsing */
114 	SE_PS_FILE_OPEN_FAILED,
115 	SE_PS_SYMBOL_TOO_LONG,
116 	SE_PS_INVALID_CHAR,
117 	/** Running */
118 	SE_RN_NOT_SUPPORTED,
119 	SE_RN_EMPTY_PROGRAM,
120 	SE_RN_SYNTAX,
121 	SE_RN_INVALID_DATA_TYPE,
122 	SE_RN_TYPE_NOT_MATCH,
123 	SE_RN_ILLEGAL_BOUND,
124 	SE_RN_DIMENSION_TOO_MUCH,
125 	SE_RN_OPERATION_FAILED,
126 	SE_RN_DIMENSION_OUT_OF_BOUND,
127 	SE_RN_ARRAY_OUT_OF_BOUND,
128 	SE_RN_LABEL_NOT_EXISTS,
129 	SE_RN_NO_RETURN_POINT,
130 	SE_RN_COLON_EXPECTED,
131 	SE_RN_COMMA_OR_SEMICOLON_EXPECTED,
132 	SE_RN_ARRAY_IDENTIFIER_EXPECTED,
133 	SE_RN_OPEN_BRACKET_EXPECTED,
134 	SE_RN_CLOSE_BRACKET_EXPECTED,
135 	SE_RN_ARRAY_SUBSCRIPT_EXPECTED,
136 	SE_RN_STRUCTURE_NOT_COMPLETED,
137 	SE_RN_FUNCTION_EXPECTED,
138 	SE_RN_STRING_EXPECTED,
139 	SE_RN_VAR_OR_ARRAY_EXPECTED,
140 	SE_RN_ASSIGN_OPERATOR_EXPECTED,
141 	SE_RN_INTEGER_EXPECTED,
142 	SE_RN_ELSE_EXPECTED,
143 	SE_RN_TO_EXPECTED,
144 	SE_RN_NEXT_EXPECTED,
145 	SE_RN_UNTIL_EXPECTED,
146 	SE_RN_LOOP_VAR_EXPECTED,
147 	SE_RN_JUMP_LABEL_EXPECTED,
148 	SE_RN_VARIABLE_EXPECTED,
149 	SE_RN_INVALID_ID_USAGE,
150 	SE_RN_CALCULATION_ERROR,
151 	SE_RN_DIVIDE_BY_ZERO,
152 	SE_RN_MOD_BY_ZERO,
153 	SE_RN_INVALID_EXPRESSION,
154 	SE_RN_OUT_OF_MEMORY,
155 	/** Extended abort */
156 	SE_EA_EXTENDED_ABORT,
157 } mb_error_e;
158 
159 typedef enum mb_data_e {
160 	MB_DT_NIL = -1,
161 	MB_DT_INT = 0,
162 	MB_DT_REAL,
163 	MB_DT_STRING,
164 } mb_data_e;
165 
166 typedef union mb_value_u {
167 	int_t integer;
168 	real_t float_point;
169 	char* string;
170 } mb_value_u;
171 
172 typedef struct mb_value_t {
173 	mb_data_e type;
174 	mb_value_u value;
175 } mb_value_t;
176 
177 typedef void (* mb_error_handler_t)(struct mb_interpreter_t*, enum mb_error_e, char*, int, unsigned short, unsigned short, int);
178 typedef int (* mb_func_t)(struct mb_interpreter_t*, void**);
179 typedef int (* mb_print_func_t)(const char*, ...);
180 
181 typedef struct mb_interpreter_t {
182 	void* local_func_dict;
183 	void* global_func_dict;
184 	void* global_var_dict;
185 	void* ast;
186 	void* parsing_context;
187 	void* running_context;
188 	mb_error_e last_error;
189 	int last_error_pos;
190 	unsigned short last_error_row;
191 	unsigned short last_error_col;
192 	mb_error_handler_t error_handler;
193 	mb_print_func_t printer;
194 	void* userdata;
195 } mb_interpreter_t;
196 
197 MBAPI unsigned int mb_ver(void);
198 MBAPI const char* mb_ver_string(void);
199 
200 MBAPI int mb_init(void);
201 MBAPI int mb_dispose(void);
202 MBAPI int mb_open(mb_interpreter_t** s);
203 MBAPI int mb_close(mb_interpreter_t** s);
204 MBAPI int mb_reset(mb_interpreter_t** s, bool_t clrf);
205 
206 MBAPI int mb_register_func(mb_interpreter_t* s, const char* n, mb_func_t f);
207 MBAPI int mb_remove_func(mb_interpreter_t* s, const char* n);
208 
209 MBAPI int mb_attempt_func_begin(mb_interpreter_t* s, void** l);
210 MBAPI int mb_attempt_func_end(mb_interpreter_t* s, void** l);
211 MBAPI int mb_attempt_open_bracket(mb_interpreter_t* s, void** l);
212 MBAPI int mb_attempt_close_bracket(mb_interpreter_t* s, void** l);
213 MBAPI int mb_pop_int(mb_interpreter_t* s, void** l, int_t* val);
214 MBAPI int mb_pop_real(mb_interpreter_t* s, void** l, real_t* val);
215 MBAPI int mb_pop_string(mb_interpreter_t* s, void** l, char** val);
216 MBAPI int mb_pop_value(mb_interpreter_t* s, void** l, mb_value_t* val);
217 MBAPI int mb_push_int(mb_interpreter_t* s, void** l, int_t val);
218 MBAPI int mb_push_real(mb_interpreter_t* s, void** l, real_t val);
219 MBAPI int mb_push_string(mb_interpreter_t* s, void** l, char* val);
220 MBAPI int mb_push_value(mb_interpreter_t* s, void** l, mb_value_t val);
221 
222 MBAPI int mb_load_string(mb_interpreter_t* s, const char* l);
223 MBAPI int mb_load_file(mb_interpreter_t* s, const char* f);
224 MBAPI int mb_run(mb_interpreter_t* s);
225 MBAPI int mb_suspend(mb_interpreter_t* s, void** l);
226 
227 MBAPI mb_error_e mb_get_last_error(mb_interpreter_t* s);
228 MBAPI const char* mb_get_error_desc(mb_error_e err);
229 MBAPI int mb_set_error_handler(mb_interpreter_t* s, mb_error_handler_t h);
230 MBAPI int mb_set_printer(mb_interpreter_t* s, mb_print_func_t p);
231 
232 MBAPI int mb_gets(char* buf, int s);
233 
234 MBAPI void mb_set_user_data(mb_interpreter_t* s, void *ptr);
235 MBAPI void *mb_get_user_data(mb_interpreter_t* s);
236 
237 #ifdef MB_COMPACT_MODE
238 #	pragma pack()
239 #endif /* MB_COMPACT_MODE */
240 
241 #ifdef __cplusplus
242 }
243 #endif /* __cplusplus */
244 
245 #endif /* __MY_BASIC_H__ */
246