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