From e872d26513b82b4e567c553330ad94f08d445b2d Mon Sep 17 00:00:00 2001 From: tony Date: Fri, 10 Apr 2015 22:04:41 +0800 Subject: [PATCH] Fixed a double precision float parsing bug on all 32bit systems, thanks to Pito for pointing it out; Fixed a exponential number parsing bug, thanks to Pito for pointing it out; Fixed a crash bug when a script begins with a meaningless negtive number. --- HISTORY | 6 + core/my_basic.c | 93 +++-- core/my_basic.h | 532 +++++++++++++------------- output/my_basic.exe | Bin 60416 -> 60416 bytes output/my_basic_mac | Bin 81736 -> 81728 bytes resource/my_basic.rc | 4 +- shell/main.c | 883 ++++++++++++++++++++++--------------------- 7 files changed, 784 insertions(+), 734 deletions(-) diff --git a/HISTORY b/HISTORY index d355df2..10052bd 100755 --- a/HISTORY +++ b/HISTORY @@ -1,3 +1,9 @@ +Apr. 10 2015 +Improved compatibility with PellesC +Fixed a double precision float parsing bug on all 32bit systems, thanks to Pito for pointing it out +Fixed a exponential number parsing bug, thanks to Pito for pointing it out +Fixed a crash bug when a script begins with a meaningless negtive number + Mar. 25 2015 Changed _strupr macro to mb_strupr function Added an mb_strdup function diff --git a/core/my_basic.c b/core/my_basic.c index 82c16f4..c71d025 100755 --- a/core/my_basic.c +++ b/core/my_basic.c @@ -78,7 +78,7 @@ extern "C" { /** Macros */ #define _VER_MAJOR 1 #define _VER_MINOR 0 -#define _VER_REVISION 46 +#define _VER_REVISION 47 #define _MB_VERSION ((_VER_MAJOR * 0x01000000) + (_VER_MINOR * 0x00010000) + (_VER_REVISION)) /* Uncomment this line to treat warnings as error */ @@ -258,6 +258,8 @@ typedef struct _label_t { _ls_node_t* node; } _label_t; +typedef unsigned char _raw_t[sizeof(union { int_t i; real_t r; void* p; })]; + typedef struct _object_t { _data_e type; union { @@ -270,6 +272,7 @@ typedef struct _object_t { _array_t* array; _label_t* label; char separator; + _raw_t raw; } data; bool_t ref; int source_pos; @@ -594,6 +597,8 @@ static void* mb_malloc(size_t s); static void* mb_realloc(void** p, size_t s); static void mb_free(void* p); +static size_t mb_memtest(void*p, size_t s); + static char* mb_strupr(char* s); #define safe_free(__p) do { if(__p) { mb_free(__p); __p = 0; } else { mb_assert(0 && "Memory already released"); } } while(0) @@ -656,7 +661,7 @@ static int _append_char_to_symbol(mb_interpreter_t* s, char c); static int _cut_symbol(mb_interpreter_t* s, int pos, unsigned short row, unsigned short col); static int _append_symbol(mb_interpreter_t* s, char* sym, bool_t* delsym, int pos, unsigned short row, unsigned short col); static int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** obj, _ls_node_t*** asgn, bool_t* delsym); -static _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, void** value); +static _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value); static int _parse_char(mb_interpreter_t* s, char c, int pos, unsigned short row, unsigned short col); static void _set_error_pos(mb_interpreter_t* s, int pos, unsigned short row, unsigned short col); @@ -722,6 +727,8 @@ MBAPI int mb_dispose_value(mb_interpreter_t* s, mb_value_t val); # endif /* _MSC_VER < 1300 */ #elif defined __BORLANDC__ # define _do_nothing do { printf("Unaccessable function: %s\n", __FUNC__); } while(0) +#elif defined __POCC__ +# define _do_nothing do { printf("Unaccessable function: %s\n", __func__); } while(0) #else /* _MSC_VER */ # define _do_nothing do { printf("Unaccessable function: %s\n", __FUNCTION__); } while(0) #endif /* _MSC_VER */ @@ -1545,6 +1552,16 @@ void mb_free(void* p) { free(p); } +size_t mb_memtest(void*p, size_t s) { + size_t result = 0; + size_t i = 0; + for(i = 0; i < s; i++) { + result += ((unsigned char*)p)[i]; + } + + return result; +} + char* mb_strupr(char* s) { char* t = s; @@ -2165,8 +2182,8 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob /* Create a syntax symbol */ int result = MB_FUNC_OK; _data_e type; - union { _func_t* func; _array_t* array; _var_t* var; _label_t* label; real_t float_point; int_t integer; void* any; } tmp; - void* value = 0; + union { _func_t* func; _array_t* array; _var_t* var; _label_t* label; real_t float_point; int_t integer; _raw_t any; } tmp; + _raw_t value; unsigned int ul = 0; _parsing_context_t* context = 0; _ls_node_t* glbsyminscope = 0; @@ -2174,6 +2191,8 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob mb_assert(s && sym && obj); + memset(value, 0, sizeof(_raw_t)); + context = (_parsing_context_t*)s->parsing_context; *obj = (_object_t*)mb_malloc(sizeof(_object_t)); @@ -2185,13 +2204,13 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob (*obj)->type = type; switch(type) { case _DT_INT: - tmp.any = value; + memcpy(tmp.any, value, sizeof(_raw_t)); (*obj)->data.integer = tmp.integer; safe_free(sym); break; case _DT_REAL: - tmp.any = value; + memcpy(tmp.any, value, sizeof(_raw_t)); (*obj)->data.float_point = tmp.float_point; safe_free(sym); @@ -2209,7 +2228,7 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob tmp.func = (_func_t*)mb_malloc(sizeof(_func_t)); memset(tmp.func, 0, sizeof(_func_t)); tmp.func->name = sym; - tmp.func->pointer = (mb_func_t)(intptr_t)value; + memcpy(&tmp.func->pointer, value, sizeof(tmp.func->pointer)); (*obj)->data.func = tmp.func; break; @@ -2223,7 +2242,7 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob tmp.array = (_array_t*)mb_malloc(sizeof(_array_t)); memset(tmp.array, 0, sizeof(_array_t)); tmp.array->name = sym; - tmp.array->type = (_data_e)(int)(long)(intptr_t)value; + memcpy(&tmp.array->type, value, sizeof(tmp.array->type)); (*obj)->data.array = tmp.array; ul = _ht_set_or_insert((_ht_node_t*)s->global_var_dict, sym, *obj); @@ -2266,8 +2285,8 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob break; case _DT_LABEL: if(context->current_char == ':') { - if(value) { - (*obj)->data.label = value; + if(mb_memtest(value, sizeof(_raw_t))) { + memcpy(&((*obj)->data.label), value, sizeof((*obj)->data.label)); (*obj)->ref = true; *delsym = true; } else { @@ -2309,15 +2328,17 @@ int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object_t** ob return result; } -_data_e _get_symbol_type(mb_interpreter_t* s, char* sym, void** value) { +_data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) { /* Get the type of a syntax symbol */ _data_e result = _DT_NIL; - union { real_t float_point; int_t integer; _object_t* obj; void* any; } tmp; + union { real_t float_point; int_t integer; _object_t* obj; _raw_t any; } tmp; char* conv_suc = 0; _parsing_context_t* context = 0; _ls_node_t* lclsyminscope = 0; _ls_node_t* glbsyminscope = 0; size_t _sl = 0; + _data_e en = _DT_ANY; + intptr_t ptr = 0; mb_assert(s && sym); _sl = strlen(sym); @@ -2328,7 +2349,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, void** value) { /* int_t */ tmp.integer = (int_t)strtol(sym, &conv_suc, 0); if(*conv_suc == '\0') { - *value = tmp.any; + memcpy(*value, tmp.any, sizeof(_raw_t)); result = _DT_INT; @@ -2337,7 +2358,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, void** value) { /* real_t */ tmp.float_point = (real_t)strtod(sym, &conv_suc); if(*conv_suc == '\0') { - *value = tmp.any; + memcpy(*value, tmp.any, sizeof(_raw_t)); result = _DT_REAL; @@ -2353,7 +2374,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, void** value) { glbsyminscope = _ht_find((_ht_node_t*)s->global_var_dict, sym); if(glbsyminscope && ((_object_t*)(glbsyminscope->data))->type == _DT_ARRAY) { tmp.obj = (_object_t*)(glbsyminscope->data); - *value = (void*)(intptr_t)(tmp.obj->data.array->type); + memcpy(*value, &(tmp.obj->data.array->type), sizeof(tmp.obj->data.array->type)); result = _DT_ARRAY; @@ -2361,7 +2382,8 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, void** value) { } if(context->last_symbol && context->last_symbol->type == _DT_FUNC) { if(strcmp("DIM", context->last_symbol->data.func->name) == 0) { - *value = (void*)(intptr_t)(sym[_sl - 1] == '$' ? _DT_STRING : _DT_REAL); + en = (sym[_sl - 1] == '$' ? _DT_STRING : _DT_REAL); + memcpy(*value, &en, sizeof(en)); result = _DT_ARRAY; @@ -2369,10 +2391,12 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, void** value) { } } /* _func_t */ - if(context->last_symbol && ((context->last_symbol->type == _DT_FUNC && context->last_symbol->data.func->pointer != _core_close_bracket) || - context->last_symbol->type == _DT_SEP)) { + if(!context->last_symbol || + (context->last_symbol && ((context->last_symbol->type == _DT_FUNC && context->last_symbol->data.func->pointer != _core_close_bracket) || + context->last_symbol->type == _DT_SEP))) { if(strcmp("-", sym) == 0) { - *value = (void*)(intptr_t)(_core_neg); + ptr = (intptr_t)_core_neg; + memcpy(*value, &ptr, sizeof(intptr_t)); result = _DT_FUNC; @@ -2382,7 +2406,8 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, void** value) { lclsyminscope = _ht_find((_ht_node_t*)s->local_func_dict, sym); glbsyminscope = _ht_find((_ht_node_t*)s->global_func_dict, sym); if(lclsyminscope || glbsyminscope) { - *value = lclsyminscope ? lclsyminscope->data : glbsyminscope->data; + ptr = lclsyminscope ? (intptr_t)lclsyminscope->data : (intptr_t)glbsyminscope->data; + memcpy(*value, &ptr, sizeof(intptr_t)); result = _DT_FUNC; @@ -2404,7 +2429,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, void** value) { glbsyminscope = _ht_find((_ht_node_t*)s->global_var_dict, sym); if(glbsyminscope) { if(((_object_t*)glbsyminscope->data)->type != _DT_LABEL) { - *value = glbsyminscope->data; + memcpy(*value, &glbsyminscope->data, sizeof(glbsyminscope->data)); result = _DT_VAR; @@ -2416,7 +2441,7 @@ _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, void** value) { if(!context->last_symbol || context->last_symbol->type == _DT_EOS) { glbsyminscope = _ht_find((_ht_node_t*)s->global_var_dict, sym); if(glbsyminscope) { - *value = glbsyminscope->data; + memcpy(*value, &glbsyminscope->data, sizeof(glbsyminscope->data)); } result = _DT_LABEL; @@ -2442,11 +2467,13 @@ int _parse_char(mb_interpreter_t* s, char c, int pos, unsigned short row, unsign /* Parse a char */ int result = MB_FUNC_OK; _parsing_context_t* context = 0; + char last_char = '\0'; mb_assert(s && s->parsing_context); context = (_parsing_context_t*)(s->parsing_context); + last_char = context->current_char; context->current_char = c; if(context->parsing_state == _PS_NORMAL) { @@ -2478,9 +2505,13 @@ int _parse_char(mb_interpreter_t* s, char c, int pos, unsigned short row, unsign if(_is_identifier_char(c)) { result += _append_char_to_symbol(s, c); } else if(_is_operator_char(c)) { - context->symbol_state = _SS_OPERATOR; - result += _cut_symbol(s, pos, row, col); - result += _append_char_to_symbol(s, c); + if((last_char == 'e' || last_char == 'E') && c == '-') { + result += _append_char_to_symbol(s, c); + } else { + context->symbol_state = _SS_OPERATOR; + result += _cut_symbol(s, pos, row, col); + result += _append_char_to_symbol(s, c); + } } else { _handle_error(s, SE_PS_INVALID_CHAR, pos, row, col, MB_FUNC_ERR, _exit, result); } @@ -4217,9 +4248,13 @@ int _core_neg(mb_interpreter_t* s, void** l) { running = (_running_context_t*)(s->running_context); - inep = (int*)_ls_back(running->in_neg_expr)->data; + if(!_ls_empty(running->in_neg_expr)) { + inep = (int*)_ls_back(running->in_neg_expr)->data; + } - (*inep)++; + if(inep) { + (*inep)++; + } mb_check(mb_attempt_func_begin(s, l)); @@ -4227,7 +4262,9 @@ int _core_neg(mb_interpreter_t* s, void** l) { mb_check(mb_attempt_func_end(s, l)); - (*inep)--; + if(inep) { + (*inep)--; + } switch(arg.type) { case MB_DT_INT: diff --git a/core/my_basic.h b/core/my_basic.h index a0174c5..f5582af 100755 --- a/core/my_basic.h +++ b/core/my_basic.h @@ -1,265 +1,267 @@ -/* -** This source file is part of MY-BASIC -** -** For the latest info, see https://github.com/paladin-t/my_basic/ -** -** Copyright (C) 2011 - 2015 W. Renxin -** -** Permission is hereby granted, free of charge, to any person obtaining a copy of -** this software and associated documentation files (the "Software"), to deal in -** the Software without restriction, including without limitation the rights to -** use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -** the Software, and to permit persons to whom the Software is furnished to do so, -** subject to the following conditions: -** -** The above copyright notice and this permission notice shall be included in all -** copies or substantial portions of the Software. -** -** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -** FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -** COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -** IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifndef __MY_BASIC_H__ -#define __MY_BASIC_H__ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#ifndef MBAPI -# define MBAPI -#endif /* MBAPI */ - -#ifndef MB_COMPACT_MODE -# define MB_COMPACT_MODE -#endif /* MB_COMPACT_MODE */ - -#ifdef MB_COMPACT_MODE -# pragma pack(1) -#endif /* MB_COMPACT_MODE */ - -#ifndef true -# define true (!0) -#endif -#ifndef false -# define false (0) -#endif - -#ifndef bool_t -# define bool_t int -#endif -#ifndef byte_t -# define byte_t unsigned char -#endif -#ifndef int_t -# define int_t int -#endif -#ifndef real_t -# define real_t float -#endif - -#ifndef _MSC_VER -# ifndef _strcmpi -# ifdef __BORLANDC__ -# define _strcmpi stricmp -# else /* __BORLANDC__*/ -# define _strcmpi strcasecmp -# endif /* __BORLANDC__ */ -# endif /* _strcmpi */ -#endif /* _MSC_VER */ - -#ifndef mb_assert -# define mb_assert(__a) do { ((void)(__a)); assert(__a); } while(0) -#endif /* mb_assert */ - -#ifndef mb_static_assert -# define _static_assert_impl(cond, msg) typedef char static_assertion_##msg[(!!(cond)) * 2 - 1] -# define _compile_time_assert3(x, l) _static_assert_impl(x, static_assertion_at_line_##l) -# define _compile_time_assert2(x, l) _compile_time_assert3(x, l) -# define mb_static_assert(x) _compile_time_assert2(x, __LINE__) -#endif /* mb_static_assert */ - -#ifndef mb_unrefvar -# define mb_unrefvar(__v) ((void)(__v)) -#endif /* mb_unrefvar */ - -#ifndef MB_CODES -# define MB_CODES -# define MB_FUNC_OK 0 -# define MB_FUNC_BYE 1001 -# define MB_FUNC_WARNING 1002 -# define MB_FUNC_ERR 1003 -# define MB_FUNC_END 1004 -# define MB_FUNC_SUSPEND 1005 -# define MB_PARSING_ERR 3001 -# define MB_LOOP_BREAK 5001 -# define MB_LOOP_CONTINUE 5002 -# define MB_SUB_RETURN 5101 -# define MB_EXTENDED_ABORT 9001 -#endif /* MB_CODES */ - -#ifndef mb_check -# define mb_check(__r) { int __hr = __r; if(__hr != MB_FUNC_OK) { return __hr; } } -#endif /* mb_check */ - -#ifndef mb_reg_fun -# define mb_reg_fun(__s, __f) mb_register_func(__s, #__f, __f) -#endif /* mb_reg_fun */ -#ifndef mb_rem_fun -# define mb_rem_fun(__s, __f) mb_remove_func(__s, #__f) -#endif /* mb_rem_fun */ -#ifndef mb_rem_res_fun -# define mb_rem_res_fun(__s, __f) mb_remove_reserved_func(__s, #__f) -#endif /* mb_rem_res_fun */ - -struct mb_interpreter_t; - -typedef enum mb_error_e { - SE_NO_ERR = 0, - /** Common */ - SE_CM_MB_OPEN_FAILED, - SE_CM_FUNC_EXISTS, - SE_CM_FUNC_NOT_EXISTS, - /** Parsing */ - SE_PS_FILE_OPEN_FAILED, - SE_PS_SYMBOL_TOO_LONG, - SE_PS_INVALID_CHAR, - /** Running */ - SE_RN_NOT_SUPPORTED, - SE_RN_EMPTY_PROGRAM, - SE_RN_SYNTAX, - SE_RN_INVALID_DATA_TYPE, - SE_RN_TYPE_NOT_MATCH, - SE_RN_ILLEGAL_BOUND, - SE_RN_DIMENSION_TOO_MUCH, - SE_RN_OPERATION_FAILED, - SE_RN_DIMENSION_OUT_OF_BOUND, - SE_RN_ARRAY_OUT_OF_BOUND, - SE_RN_LABEL_NOT_EXISTS, - SE_RN_NO_RETURN_POINT, - SE_RN_COLON_EXPECTED, - SE_RN_COMMA_OR_SEMICOLON_EXPECTED, - SE_RN_ARRAY_IDENTIFIER_EXPECTED, - SE_RN_OPEN_BRACKET_EXPECTED, - SE_RN_CLOSE_BRACKET_EXPECTED, - SE_RN_ARRAY_SUBSCRIPT_EXPECTED, - SE_RN_STRUCTURE_NOT_COMPLETED, - SE_RN_FUNCTION_EXPECTED, - SE_RN_STRING_EXPECTED, - SE_RN_VAR_OR_ARRAY_EXPECTED, - SE_RN_ASSIGN_OPERATOR_EXPECTED, - SE_RN_INTEGER_EXPECTED, - SE_RN_ELSE_EXPECTED, - SE_RN_TO_EXPECTED, - SE_RN_NEXT_EXPECTED, - SE_RN_UNTIL_EXPECTED, - SE_RN_LOOP_VAR_EXPECTED, - SE_RN_JUMP_LABEL_EXPECTED, - SE_RN_VARIABLE_EXPECTED, - SE_RN_INVALID_ID_USAGE, - SE_RN_OPERATOR_EXPECTED, - SE_RN_CALCULATION_ERROR, - SE_RN_DIVIDE_BY_ZERO, - SE_RN_MOD_BY_ZERO, - SE_RN_INVALID_EXPRESSION, - SE_RN_OUT_OF_MEMORY, - /** Extended abort */ - SE_EA_EXTENDED_ABORT, - /** Extra */ - SE_COUNT -} mb_error_e; - -typedef enum mb_data_e { - MB_DT_NIL = -1, - MB_DT_INT = 0, - MB_DT_REAL, - MB_DT_STRING -} mb_data_e; - -typedef union mb_value_u { - int_t integer; - real_t float_point; - char* string; -} mb_value_u; - -typedef struct mb_value_t { - mb_data_e type; - mb_value_u value; -} mb_value_t; - -typedef void (* mb_error_handler_t)(struct mb_interpreter_t*, enum mb_error_e, char*, int, unsigned short, unsigned short, int); -typedef int (* mb_func_t)(struct mb_interpreter_t*, void**); -typedef int (* mb_print_func_t)(const char*, ...); -typedef int (* mb_input_func_t)(char*, int); - -typedef struct mb_interpreter_t { - void* local_func_dict; - void* global_func_dict; - void* global_var_dict; - void* ast; - void* parsing_context; - void* running_context; - mb_error_e last_error; - int last_error_pos; - unsigned short last_error_row; - unsigned short last_error_col; - mb_error_handler_t error_handler; - mb_print_func_t printer; - mb_input_func_t inputer; - void* userdata; -} mb_interpreter_t; - -MBAPI unsigned int mb_ver(void); -MBAPI const char* mb_ver_string(void); - -MBAPI int mb_init(void); -MBAPI int mb_dispose(void); -MBAPI int mb_open(mb_interpreter_t** s); -MBAPI int mb_close(mb_interpreter_t** s); -MBAPI int mb_reset(mb_interpreter_t** s, bool_t clrf); - -MBAPI int mb_register_func(mb_interpreter_t* s, const char* n, mb_func_t f); -MBAPI int mb_remove_func(mb_interpreter_t* s, const char* n); -MBAPI int mb_remove_reserved_func(mb_interpreter_t* s, const char* n); - -MBAPI int mb_attempt_func_begin(mb_interpreter_t* s, void** l); -MBAPI int mb_attempt_func_end(mb_interpreter_t* s, void** l); -MBAPI int mb_attempt_open_bracket(mb_interpreter_t* s, void** l); -MBAPI int mb_attempt_close_bracket(mb_interpreter_t* s, void** l); -MBAPI int mb_pop_int(mb_interpreter_t* s, void** l, int_t* val); -MBAPI int mb_pop_real(mb_interpreter_t* s, void** l, real_t* val); -MBAPI int mb_pop_string(mb_interpreter_t* s, void** l, char** val); -MBAPI int mb_pop_value(mb_interpreter_t* s, void** l, mb_value_t* val); -MBAPI int mb_push_int(mb_interpreter_t* s, void** l, int_t val); -MBAPI int mb_push_real(mb_interpreter_t* s, void** l, real_t val); -MBAPI int mb_push_string(mb_interpreter_t* s, void** l, char* val); -MBAPI int mb_push_value(mb_interpreter_t* s, void** l, mb_value_t val); - -MBAPI int mb_load_string(mb_interpreter_t* s, const char* l); -MBAPI int mb_load_file(mb_interpreter_t* s, const char* f); -MBAPI int mb_run(mb_interpreter_t* s); -MBAPI int mb_suspend(mb_interpreter_t* s, void** l); - -MBAPI mb_error_e mb_get_last_error(mb_interpreter_t* s); -MBAPI const char* mb_get_error_desc(mb_error_e err); -MBAPI int mb_set_error_handler(mb_interpreter_t* s, mb_error_handler_t h); -MBAPI int mb_set_printer(mb_interpreter_t* s, mb_print_func_t p); -MBAPI int mb_set_inputer(mb_interpreter_t* s, mb_input_func_t p); - -MBAPI int mb_gets(char* buf, int s); - -MBAPI char* mb_strdup(char* val, unsigned size); - -#ifdef MB_COMPACT_MODE -# pragma pack() -#endif /* MB_COMPACT_MODE */ - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* __MY_BASIC_H__ */ +/* +** This source file is part of MY-BASIC +** +** For the latest info, see https://github.com/paladin-t/my_basic/ +** +** Copyright (C) 2011 - 2015 W. Renxin +** +** Permission is hereby granted, free of charge, to any person obtaining a copy of +** this software and associated documentation files (the "Software"), to deal in +** the Software without restriction, including without limitation the rights to +** use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +** the Software, and to permit persons to whom the Software is furnished to do so, +** subject to the following conditions: +** +** The above copyright notice and this permission notice shall be included in all +** copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +** FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +** COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +** IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef __MY_BASIC_H__ +#define __MY_BASIC_H__ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#ifndef MBAPI +# define MBAPI +#endif /* MBAPI */ + +#ifndef MB_COMPACT_MODE +# define MB_COMPACT_MODE +#endif /* MB_COMPACT_MODE */ + +#ifdef MB_COMPACT_MODE +# pragma pack(1) +#endif /* MB_COMPACT_MODE */ + +#ifndef true +# define true (!0) +#endif +#ifndef false +# define false (0) +#endif + +#ifndef bool_t +# define bool_t int +#endif +#ifndef byte_t +# define byte_t unsigned char +#endif +#ifndef int_t +# define int_t int +#endif +#ifndef real_t +# define real_t float +#endif + +#ifndef _MSC_VER +# ifndef _strcmpi +# ifdef __BORLANDC__ +# define _strcmpi stricmp +# elif defined __POCC__ +# define _strcmpi _stricmp +# else /* __BORLANDC__*/ +# define _strcmpi strcasecmp +# endif /* __BORLANDC__ */ +# endif /* _strcmpi */ +#endif /* _MSC_VER */ + +#ifndef mb_assert +# define mb_assert(__a) do { ((void)(__a)); assert(__a); } while(0) +#endif /* mb_assert */ + +#ifndef mb_static_assert +# define _static_assert_impl(cond, msg) typedef char static_assertion_##msg[(!!(cond)) * 2 - 1] +# define _compile_time_assert3(x, l) _static_assert_impl(x, static_assertion_at_line_##l) +# define _compile_time_assert2(x, l) _compile_time_assert3(x, l) +# define mb_static_assert(x) _compile_time_assert2(x, __LINE__) +#endif /* mb_static_assert */ + +#ifndef mb_unrefvar +# define mb_unrefvar(__v) ((void)(__v)) +#endif /* mb_unrefvar */ + +#ifndef MB_CODES +# define MB_CODES +# define MB_FUNC_OK 0 +# define MB_FUNC_BYE 1001 +# define MB_FUNC_WARNING 1002 +# define MB_FUNC_ERR 1003 +# define MB_FUNC_END 1004 +# define MB_FUNC_SUSPEND 1005 +# define MB_PARSING_ERR 3001 +# define MB_LOOP_BREAK 5001 +# define MB_LOOP_CONTINUE 5002 +# define MB_SUB_RETURN 5101 +# define MB_EXTENDED_ABORT 9001 +#endif /* MB_CODES */ + +#ifndef mb_check +# define mb_check(__r) { int __hr = __r; if(__hr != MB_FUNC_OK) { return __hr; } } +#endif /* mb_check */ + +#ifndef mb_reg_fun +# define mb_reg_fun(__s, __f) mb_register_func(__s, #__f, __f) +#endif /* mb_reg_fun */ +#ifndef mb_rem_fun +# define mb_rem_fun(__s, __f) mb_remove_func(__s, #__f) +#endif /* mb_rem_fun */ +#ifndef mb_rem_res_fun +# define mb_rem_res_fun(__s, __f) mb_remove_reserved_func(__s, #__f) +#endif /* mb_rem_res_fun */ + +struct mb_interpreter_t; + +typedef enum mb_error_e { + SE_NO_ERR = 0, + /** Common */ + SE_CM_MB_OPEN_FAILED, + SE_CM_FUNC_EXISTS, + SE_CM_FUNC_NOT_EXISTS, + /** Parsing */ + SE_PS_FILE_OPEN_FAILED, + SE_PS_SYMBOL_TOO_LONG, + SE_PS_INVALID_CHAR, + /** Running */ + SE_RN_NOT_SUPPORTED, + SE_RN_EMPTY_PROGRAM, + SE_RN_SYNTAX, + SE_RN_INVALID_DATA_TYPE, + SE_RN_TYPE_NOT_MATCH, + SE_RN_ILLEGAL_BOUND, + SE_RN_DIMENSION_TOO_MUCH, + SE_RN_OPERATION_FAILED, + SE_RN_DIMENSION_OUT_OF_BOUND, + SE_RN_ARRAY_OUT_OF_BOUND, + SE_RN_LABEL_NOT_EXISTS, + SE_RN_NO_RETURN_POINT, + SE_RN_COLON_EXPECTED, + SE_RN_COMMA_OR_SEMICOLON_EXPECTED, + SE_RN_ARRAY_IDENTIFIER_EXPECTED, + SE_RN_OPEN_BRACKET_EXPECTED, + SE_RN_CLOSE_BRACKET_EXPECTED, + SE_RN_ARRAY_SUBSCRIPT_EXPECTED, + SE_RN_STRUCTURE_NOT_COMPLETED, + SE_RN_FUNCTION_EXPECTED, + SE_RN_STRING_EXPECTED, + SE_RN_VAR_OR_ARRAY_EXPECTED, + SE_RN_ASSIGN_OPERATOR_EXPECTED, + SE_RN_INTEGER_EXPECTED, + SE_RN_ELSE_EXPECTED, + SE_RN_TO_EXPECTED, + SE_RN_NEXT_EXPECTED, + SE_RN_UNTIL_EXPECTED, + SE_RN_LOOP_VAR_EXPECTED, + SE_RN_JUMP_LABEL_EXPECTED, + SE_RN_VARIABLE_EXPECTED, + SE_RN_INVALID_ID_USAGE, + SE_RN_OPERATOR_EXPECTED, + SE_RN_CALCULATION_ERROR, + SE_RN_DIVIDE_BY_ZERO, + SE_RN_MOD_BY_ZERO, + SE_RN_INVALID_EXPRESSION, + SE_RN_OUT_OF_MEMORY, + /** Extended abort */ + SE_EA_EXTENDED_ABORT, + /** Extra */ + SE_COUNT +} mb_error_e; + +typedef enum mb_data_e { + MB_DT_NIL = -1, + MB_DT_INT = 0, + MB_DT_REAL, + MB_DT_STRING +} mb_data_e; + +typedef union mb_value_u { + int_t integer; + real_t float_point; + char* string; +} mb_value_u; + +typedef struct mb_value_t { + mb_data_e type; + mb_value_u value; +} mb_value_t; + +typedef void (* mb_error_handler_t)(struct mb_interpreter_t*, enum mb_error_e, char*, int, unsigned short, unsigned short, int); +typedef int (* mb_func_t)(struct mb_interpreter_t*, void**); +typedef int (* mb_print_func_t)(const char*, ...); +typedef int (* mb_input_func_t)(char*, int); + +typedef struct mb_interpreter_t { + void* local_func_dict; + void* global_func_dict; + void* global_var_dict; + void* ast; + void* parsing_context; + void* running_context; + mb_error_e last_error; + int last_error_pos; + unsigned short last_error_row; + unsigned short last_error_col; + mb_error_handler_t error_handler; + mb_print_func_t printer; + mb_input_func_t inputer; + void* userdata; +} mb_interpreter_t; + +MBAPI unsigned int mb_ver(void); +MBAPI const char* mb_ver_string(void); + +MBAPI int mb_init(void); +MBAPI int mb_dispose(void); +MBAPI int mb_open(mb_interpreter_t** s); +MBAPI int mb_close(mb_interpreter_t** s); +MBAPI int mb_reset(mb_interpreter_t** s, bool_t clrf); + +MBAPI int mb_register_func(mb_interpreter_t* s, const char* n, mb_func_t f); +MBAPI int mb_remove_func(mb_interpreter_t* s, const char* n); +MBAPI int mb_remove_reserved_func(mb_interpreter_t* s, const char* n); + +MBAPI int mb_attempt_func_begin(mb_interpreter_t* s, void** l); +MBAPI int mb_attempt_func_end(mb_interpreter_t* s, void** l); +MBAPI int mb_attempt_open_bracket(mb_interpreter_t* s, void** l); +MBAPI int mb_attempt_close_bracket(mb_interpreter_t* s, void** l); +MBAPI int mb_pop_int(mb_interpreter_t* s, void** l, int_t* val); +MBAPI int mb_pop_real(mb_interpreter_t* s, void** l, real_t* val); +MBAPI int mb_pop_string(mb_interpreter_t* s, void** l, char** val); +MBAPI int mb_pop_value(mb_interpreter_t* s, void** l, mb_value_t* val); +MBAPI int mb_push_int(mb_interpreter_t* s, void** l, int_t val); +MBAPI int mb_push_real(mb_interpreter_t* s, void** l, real_t val); +MBAPI int mb_push_string(mb_interpreter_t* s, void** l, char* val); +MBAPI int mb_push_value(mb_interpreter_t* s, void** l, mb_value_t val); + +MBAPI int mb_load_string(mb_interpreter_t* s, const char* l); +MBAPI int mb_load_file(mb_interpreter_t* s, const char* f); +MBAPI int mb_run(mb_interpreter_t* s); +MBAPI int mb_suspend(mb_interpreter_t* s, void** l); + +MBAPI mb_error_e mb_get_last_error(mb_interpreter_t* s); +MBAPI const char* mb_get_error_desc(mb_error_e err); +MBAPI int mb_set_error_handler(mb_interpreter_t* s, mb_error_handler_t h); +MBAPI int mb_set_printer(mb_interpreter_t* s, mb_print_func_t p); +MBAPI int mb_set_inputer(mb_interpreter_t* s, mb_input_func_t p); + +MBAPI int mb_gets(char* buf, int s); + +MBAPI char* mb_strdup(char* val, unsigned size); + +#ifdef MB_COMPACT_MODE +# pragma pack() +#endif /* MB_COMPACT_MODE */ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* __MY_BASIC_H__ */ diff --git a/output/my_basic.exe b/output/my_basic.exe index 740a3fca803f5ab80b5dcba0362627b51bbcd706..b53ac57280c6964a948f0b754ca4282d01c322cd 100755 GIT binary patch delta 11453 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 XGMQ{9kBN)H)2e>|E+G*~f$o0*j_9zk diff --git a/output/my_basic_mac b/output/my_basic_mac index c09e1ff40f973c0ca75231e7aa6e315a6a69532a..66e413aff56226f540142007df835ca566e363a9 100755 GIT binary patch literal 81728 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 KuyV%%-v15cj&1b- literal 81736 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≷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 G;QbHpCm59g diff --git a/resource/my_basic.rc b/resource/my_basic.rc index 1de3c05..c4883db 100755 --- a/resource/my_basic.rc +++ b/resource/my_basic.rc @@ -81,13 +81,13 @@ BEGIN VALUE "Comments", "MY-BASIC" VALUE "CompanyName", "W. Renxin" VALUE "FileDescription", "MY-BASIC interpreter" - VALUE "FileVersion", "1, 0, 0, 46" + VALUE "FileVersion", "1, 0, 0, 47" VALUE "InternalName", "my_basic" VALUE "LegalCopyright", "Copyright (C) 2011 - 2015 W. Renxin" VALUE "LegalTrademarks", "MY-BASIC" VALUE "OriginalFilename", "my_basic.exe" VALUE "ProductName", "MY-BASIC" - VALUE "ProductVersion", "1, 0, 0, 46" + VALUE "ProductVersion", "1, 0, 0, 47" END END BLOCK "VarFileInfo" diff --git a/shell/main.c b/shell/main.c index 15fdc5f..322e422 100755 --- a/shell/main.c +++ b/shell/main.c @@ -1,439 +1,444 @@ -/* -** This source file is part of MY-BASIC -** -** For the latest info, see https://github.com/paladin-t/my_basic/ -** -** Copyright (C) 2011 - 2015 W. Renxin -** -** Permission is hereby granted, free of charge, to any person obtaining a copy of -** this software and associated documentation files (the "Software"), to deal in -** the Software without restriction, including without limitation the rights to -** use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -** the Software, and to permit persons to whom the Software is furnished to do so, -** subject to the following conditions: -** -** The above copyright notice and this permission notice shall be included in all -** copies or substantial portions of the Software. -** -** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -** FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -** COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -** IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -#ifdef _MSC_VER -# ifndef _CRT_SECURE_NO_WARNINGS -# define _CRT_SECURE_NO_WARNINGS -# endif /* _CRT_SECURE_NO_WARNINGS */ -#endif /* _MSC_VER */ - -#include "../core/my_basic.h" -#ifdef _MSC_VER -# include -# include -#elif !defined __BORLANDC__ -# include -#endif /* _MSC_VER */ -#include -#include -#include -#include - -#ifdef _MSC_VER -# pragma warning(disable : 4127) -# pragma warning(disable : 4996) -#endif /* _MSC_VER */ - -#ifdef __BORLANDC__ -# pragma warn -8004 -# pragma warn -8008 -# pragma warn -8066 -#endif /* __BORLANDC__ */ - -#define _MAX_LINE_LENGTH 256 -#define _str_eq(__str1, __str2) (_strcmpi(__str1, __str2) == 0) - -#define _LINE_INC_STEP 16 - -#define _NO_END(s) (MB_FUNC_OK == s || MB_FUNC_SUSPEND == s || MB_FUNC_WARNING == s || MB_FUNC_ERR == s || MB_FUNC_END == s) - -typedef struct _code_line_t { - char** lines; - int count; - int size; -} _code_line_t; - -static mb_interpreter_t* bas = 0; - -static _code_line_t* c = 0; - -static _code_line_t* _create_code(void) { - _code_line_t* result = (_code_line_t*)malloc(sizeof(_code_line_t)); - result->count = 0; - result->size = _LINE_INC_STEP; - result->lines = (char**)malloc(sizeof(char*) * result->size); - - return result; -} - -static void _destroy_code(_code_line_t* code) { - int i = 0; - mb_assert(code); - for(i = 0; i < code->count; ++i) { - free(code->lines[i]); - } - free(code->lines); - free(code); -} - -static void _clear_code(_code_line_t* code) { - int i = 0; - mb_assert(code); - for(i = 0; i < code->count; ++i) { - free(code->lines[i]); - } - code->count = 0; -} - -static void _append_line(_code_line_t* code, char* txt) { - mb_assert(code && txt); - if(code->count + 1 == code->size) { - code->size += _LINE_INC_STEP; - code->lines = (char**)realloc(code->lines, sizeof(char*) * code->size); - } - code->lines[code->count++] = strdup(txt); -} - -static char* _get_code(_code_line_t* code) { - char* result = 0; - int i = 0; - mb_assert(code); - result = (char*)malloc((_MAX_LINE_LENGTH + 2) * code->count + 1); - result[0] = '\0'; - for(i = 0; i < code->count; ++i) { - result = strcat(result, code->lines[i]); - if(i != code->count - 1) { - result = strcat(result, "\r\n"); - } - } - - return result; -} - -static void _set_code(_code_line_t* code, char* txt) { - char* cursor = 0; - char _c = '\0'; - mb_assert(code); - if(!txt) { - return; - } - _clear_code(code); - cursor = txt; - do { - _c = *cursor; - if(_c == '\r' || _c == '\n' || _c == '\0') { - cursor[0] = '\0'; - if(_c == '\r' && *(cursor + 1) == '\n') { - ++cursor; - } - _append_line(code, txt); - txt = cursor + 1; - } - ++cursor; - } while(_c); -} - -static char* _load_file(const char* path) { - FILE* fp = 0; - char* result = 0; - long curpos = 0; - long l = 0; - mb_assert(path); - fp = fopen(path, "rb"); - if(fp) { - curpos = ftell(fp); - fseek(fp, 0L, SEEK_END); - l = ftell(fp); - fseek(fp, curpos, SEEK_SET); - result = (char*)malloc((size_t)(l + 1)); - mb_assert(result); - fread(result, 1, l, fp); - fclose(fp); - result[l] = '\0'; - } - - return result; -} - -static int _save_file(const char* path, const char* txt) { - FILE* fp = 0; - mb_assert(path && txt); - fp = fopen(path, "wb"); - if(fp) { - fwrite(txt, sizeof(char), strlen(txt), fp); - fclose(fp); - - return 1; - } - - return 0; -} - -static int beep(mb_interpreter_t* s, void** l) { - int result = MB_FUNC_OK; - - mb_assert(s && l); - - mb_check(mb_attempt_func_begin(s, l)); - mb_check(mb_attempt_func_end(s, l)); - - putchar('\a'); - - return result; -} - -static void _on_error(mb_interpreter_t* s, mb_error_e e, char* m, int p, unsigned short row, unsigned short col, int abort_code) { - mb_unrefvar(s); - if(SE_NO_ERR != e) { - printf("Error:\n [POS] %d, [ROW] %d, [COL] %d,\n [CODE] %d, [MESSAGE] %s, [ABORT CODE] %d\n", p, row, col, e, m, abort_code); - } -} - -static void _on_startup(void) { - c = _create_code(); - - mb_init(); - - mb_open(&bas); - mb_set_error_handler(bas, _on_error); - - mb_reg_fun(bas, beep); -} - -static void _on_exit(void) { - mb_close(&bas); - - mb_dispose(); - - _destroy_code(c); - c = 0; - -#if defined _MSC_VER && !defined _WIN64 - if(0 != _CrtDumpMemoryLeaks()) { _asm { int 3 } } -#endif /* _MSC_VER && !_WIN64 */ -} - -static void _clear_screen(void) { -#ifdef _MSC_VER - system("cls"); -#else /* _MSC_VER */ - system("clear"); -#endif /* _MSC_VER */ -} - -static int _new_program(void) { - _clear_code(c); - - return mb_reset(&bas, false); -} - -static void _list_program(const char* sn, const char* cn) { - long lsn = 0; - long lcn = 0; - mb_assert(sn && cn); - lsn = atoi(sn); - lcn = atoi(cn); - if(lsn == 0 && lcn == 0) { - char* txt = _get_code(c); - printf("%s\n", txt); - free(txt); - } else { - long i = 0; - long e = 0; - if(lsn < 1 || lsn > c->count) { - printf("Line number %ld out of bound.\n", lsn); - - return; - } - if(lcn < 0) { - printf("Invalid line count %ld.\n", lcn); - - return; - } - --lsn; - e = lcn ? lsn + lcn : c->count; - for(i = lsn; i < e; ++i) { - if(i >= c->count) { - break; - } - printf("%s\n", c->lines[i]); - } - } -} - -static void _edit_program(const char* no) { - char line[_MAX_LINE_LENGTH]; - long lno = 0; - mb_assert(no); - lno = atoi(no); - if(lno < 1 || lno > c->count) { - printf("Line number %ld out of bound.\n", lno); - - return; - } - --lno; - memset(line, 0, _MAX_LINE_LENGTH); - printf("%ld]", lno + 1); - mb_gets(line, _MAX_LINE_LENGTH); - c->lines[lno] = (char*)realloc(c->lines[lno], strlen(line) + 1); - strcpy(c->lines[lno], line); -} - -static void _load_program(const char* path) { - char* txt = _load_file(path); - if(txt) { - _new_program(); - _set_code(c, txt); - free(txt); - if(c->count == 1) { - printf("Load done. %d line loaded.\n", c->count); - } else { - printf("Load done. %d lines loaded.\n", c->count); - } - } else { - printf("Cannot load file \"%s\"\n", path); - } -} - -static void _save_program(const char* path) { - char* txt = _get_code(c); - if(!_save_file(path, txt)) { - printf("Cannot save file \"%s\"\n", path); - } else { - if(c->count == 1) { - printf("Save done. %d line saved.\n", c->count); - } else { - printf("Save done. %d lines saved.\n", c->count); - } - } - free(txt); -} - -static void _kill_program(const char* path) { - if(!unlink(path)) { - printf("Delete file \"%s\" successfully.\n", path); - } else { - printf("Delete file \"%s\" failed.\n", path); - } -} - -static void _show_tip(void) { - printf("MY-BASIC Interpreter Shell - %s.\n", mb_ver_string()); - printf("Copyright (C) 2011 - 2015 W. Renxin. All Rights Reserved.\n"); - printf("For more information, see https://github.com/paladin-t/my_basic/.\n"); - printf("Input HELP and hint enter to view help information.\n"); -} - -static void _show_help(void) { - printf("Commands:\n"); - printf(" CLS - Clear screen\n"); - printf(" NEW - Clear current program\n"); - printf(" RUN - Run current program\n"); - printf(" BYE - Quit interpreter\n"); - printf(" LIST - List current program\n"); - printf(" Usage: LIST [l [n]], l is start line number, n is line count\n"); - printf(" EDIT - Edit a line in current program\n"); - printf(" Usage: EDIT n, n is line number\n"); - printf(" LOAD - Load a file as current program\n"); - printf(" Usage: LOAD *.*\n"); - printf(" SAVE - Save current program to a file\n"); - printf(" Usage: SAVE *.*\n"); - printf(" KILL - Delete a file\n"); - printf(" Usage: KILL *.*\n"); -} - -static int _do_line(void) { - int result = MB_FUNC_OK; - char line[_MAX_LINE_LENGTH]; - char dup[_MAX_LINE_LENGTH]; - - mb_assert(bas); - - memset(line, 0, _MAX_LINE_LENGTH); - printf("]"); - mb_gets(line, _MAX_LINE_LENGTH); - - memcpy(dup, line, _MAX_LINE_LENGTH); - strtok(line, " "); - - if(_str_eq(line, "")) { - /* Do nothing */ - } else if(_str_eq(line, "HELP")) { - _show_help(); - } else if(_str_eq(line, "CLS")) { - _clear_screen(); - } else if(_str_eq(line, "NEW")) { - result = _new_program(); - } else if(_str_eq(line, "RUN")) { - char* txt = _get_code(c); - result = mb_reset(&bas, false); - result = mb_load_string(bas, txt); - free(txt); - result = mb_run(bas); - printf("\n"); - } else if(_str_eq(line, "BYE")) { - result = MB_FUNC_BYE; - } else if(_str_eq(line, "LIST")) { - char* sn = line + strlen(line) + 1; - char* cn = 0; - strtok(sn, " "); - cn = sn + strlen(sn) + 1; - _list_program(sn, cn); - } else if(_str_eq(line, "EDIT")) { - char* no = line + strlen(line) + 1; - _edit_program(no); - } else if(_str_eq(line, "LOAD")) { - char* path = line + strlen(line) + 1; - _load_program(path); - } else if(_str_eq(line, "SAVE")) { - char* path = line + strlen(line) + 1; - _save_program(path); - } else if(_str_eq(line, "KILL")) { - char* path = line + strlen(line) + 1; - _kill_program(path); - } else { - _append_line(c, dup); - } - - return result; -} - -int main(int argc, char* argv[]) { - int status = 0; - -#if defined _MSC_VER && !defined _WIN64 - _CrtSetBreakAlloc(0); -#endif /* _MSC_VER && !_WIN64 */ - - atexit(_on_exit); - - _on_startup(); - - if(argc == 1) { - _show_tip(); - do { - status = _do_line(); - } while(_NO_END(status)); - } else if(argc == 2) { - if(mb_load_file(bas, argv[1]) == MB_FUNC_OK) { - mb_run(bas); - } - } else { - printf("Unknown arguments\n"); - _show_tip(); - } - - return 0; -} +/* +** This source file is part of MY-BASIC +** +** For the latest info, see https://github.com/paladin-t/my_basic/ +** +** Copyright (C) 2011 - 2015 W. Renxin +** +** Permission is hereby granted, free of charge, to any person obtaining a copy of +** this software and associated documentation files (the "Software"), to deal in +** the Software without restriction, including without limitation the rights to +** use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +** the Software, and to permit persons to whom the Software is furnished to do so, +** subject to the following conditions: +** +** The above copyright notice and this permission notice shall be included in all +** copies or substantial portions of the Software. +** +** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +** IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +** FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +** COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +** IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +** CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifdef _MSC_VER +# ifndef _CRT_SECURE_NO_WARNINGS +# define _CRT_SECURE_NO_WARNINGS +# endif /* _CRT_SECURE_NO_WARNINGS */ +#endif /* _MSC_VER */ + +#include "../core/my_basic.h" +#ifdef _MSC_VER +# include +# include +#elif !defined __BORLANDC__ +# include +#endif /* _MSC_VER */ +#include +#include +#include +#include + +#ifdef _MSC_VER +# pragma warning(disable : 4127) +# pragma warning(disable : 4996) +#endif /* _MSC_VER */ + +#ifdef __BORLANDC__ +# pragma warn -8004 +# pragma warn -8008 +# pragma warn -8066 +#endif /* __BORLANDC__ */ + +#ifdef __POCC__ +# define unlink _unlink +# define strdup _strdup +#endif /* __POCC__ */ + +#define _MAX_LINE_LENGTH 256 +#define _str_eq(__str1, __str2) (_strcmpi(__str1, __str2) == 0) + +#define _LINE_INC_STEP 16 + +#define _NO_END(s) (MB_FUNC_OK == s || MB_FUNC_SUSPEND == s || MB_FUNC_WARNING == s || MB_FUNC_ERR == s || MB_FUNC_END == s) + +typedef struct _code_line_t { + char** lines; + int count; + int size; +} _code_line_t; + +static mb_interpreter_t* bas = 0; + +static _code_line_t* c = 0; + +static _code_line_t* _create_code(void) { + _code_line_t* result = (_code_line_t*)malloc(sizeof(_code_line_t)); + result->count = 0; + result->size = _LINE_INC_STEP; + result->lines = (char**)malloc(sizeof(char*) * result->size); + + return result; +} + +static void _destroy_code(_code_line_t* code) { + int i = 0; + mb_assert(code); + for(i = 0; i < code->count; ++i) { + free(code->lines[i]); + } + free(code->lines); + free(code); +} + +static void _clear_code(_code_line_t* code) { + int i = 0; + mb_assert(code); + for(i = 0; i < code->count; ++i) { + free(code->lines[i]); + } + code->count = 0; +} + +static void _append_line(_code_line_t* code, char* txt) { + mb_assert(code && txt); + if(code->count + 1 == code->size) { + code->size += _LINE_INC_STEP; + code->lines = (char**)realloc(code->lines, sizeof(char*) * code->size); + } + code->lines[code->count++] = strdup(txt); +} + +static char* _get_code(_code_line_t* code) { + char* result = 0; + int i = 0; + mb_assert(code); + result = (char*)malloc((_MAX_LINE_LENGTH + 2) * code->count + 1); + result[0] = '\0'; + for(i = 0; i < code->count; ++i) { + result = strcat(result, code->lines[i]); + if(i != code->count - 1) { + result = strcat(result, "\r\n"); + } + } + + return result; +} + +static void _set_code(_code_line_t* code, char* txt) { + char* cursor = 0; + char _c = '\0'; + mb_assert(code); + if(!txt) { + return; + } + _clear_code(code); + cursor = txt; + do { + _c = *cursor; + if(_c == '\r' || _c == '\n' || _c == '\0') { + cursor[0] = '\0'; + if(_c == '\r' && *(cursor + 1) == '\n') { + ++cursor; + } + _append_line(code, txt); + txt = cursor + 1; + } + ++cursor; + } while(_c); +} + +static char* _load_file(const char* path) { + FILE* fp = 0; + char* result = 0; + long curpos = 0; + long l = 0; + mb_assert(path); + fp = fopen(path, "rb"); + if(fp) { + curpos = ftell(fp); + fseek(fp, 0L, SEEK_END); + l = ftell(fp); + fseek(fp, curpos, SEEK_SET); + result = (char*)malloc((size_t)(l + 1)); + mb_assert(result); + fread(result, 1, l, fp); + fclose(fp); + result[l] = '\0'; + } + + return result; +} + +static int _save_file(const char* path, const char* txt) { + FILE* fp = 0; + mb_assert(path && txt); + fp = fopen(path, "wb"); + if(fp) { + fwrite(txt, sizeof(char), strlen(txt), fp); + fclose(fp); + + return 1; + } + + return 0; +} + +static int beep(mb_interpreter_t* s, void** l) { + int result = MB_FUNC_OK; + + mb_assert(s && l); + + mb_check(mb_attempt_func_begin(s, l)); + mb_check(mb_attempt_func_end(s, l)); + + putchar('\a'); + + return result; +} + +static void _on_error(mb_interpreter_t* s, mb_error_e e, char* m, int p, unsigned short row, unsigned short col, int abort_code) { + mb_unrefvar(s); + if(SE_NO_ERR != e) { + printf("Error:\n [POS] %d, [ROW] %d, [COL] %d,\n [CODE] %d, [MESSAGE] %s, [ABORT CODE] %d\n", p, row, col, e, m, abort_code); + } +} + +static void _on_startup(void) { + c = _create_code(); + + mb_init(); + + mb_open(&bas); + mb_set_error_handler(bas, _on_error); + + mb_reg_fun(bas, beep); +} + +static void _on_exit(void) { + mb_close(&bas); + + mb_dispose(); + + _destroy_code(c); + c = 0; + +#if defined _MSC_VER && !defined _WIN64 + if(0 != _CrtDumpMemoryLeaks()) { _asm { int 3 } } +#endif /* _MSC_VER && !_WIN64 */ +} + +static void _clear_screen(void) { +#ifdef _MSC_VER + system("cls"); +#else /* _MSC_VER */ + system("clear"); +#endif /* _MSC_VER */ +} + +static int _new_program(void) { + _clear_code(c); + + return mb_reset(&bas, false); +} + +static void _list_program(const char* sn, const char* cn) { + long lsn = 0; + long lcn = 0; + mb_assert(sn && cn); + lsn = atoi(sn); + lcn = atoi(cn); + if(lsn == 0 && lcn == 0) { + char* txt = _get_code(c); + printf("%s\n", txt); + free(txt); + } else { + long i = 0; + long e = 0; + if(lsn < 1 || lsn > c->count) { + printf("Line number %ld out of bound.\n", lsn); + + return; + } + if(lcn < 0) { + printf("Invalid line count %ld.\n", lcn); + + return; + } + --lsn; + e = lcn ? lsn + lcn : c->count; + for(i = lsn; i < e; ++i) { + if(i >= c->count) { + break; + } + printf("%s\n", c->lines[i]); + } + } +} + +static void _edit_program(const char* no) { + char line[_MAX_LINE_LENGTH]; + long lno = 0; + mb_assert(no); + lno = atoi(no); + if(lno < 1 || lno > c->count) { + printf("Line number %ld out of bound.\n", lno); + + return; + } + --lno; + memset(line, 0, _MAX_LINE_LENGTH); + printf("%ld]", lno + 1); + mb_gets(line, _MAX_LINE_LENGTH); + c->lines[lno] = (char*)realloc(c->lines[lno], strlen(line) + 1); + strcpy(c->lines[lno], line); +} + +static void _load_program(const char* path) { + char* txt = _load_file(path); + if(txt) { + _new_program(); + _set_code(c, txt); + free(txt); + if(c->count == 1) { + printf("Load done. %d line loaded.\n", c->count); + } else { + printf("Load done. %d lines loaded.\n", c->count); + } + } else { + printf("Cannot load file \"%s\"\n", path); + } +} + +static void _save_program(const char* path) { + char* txt = _get_code(c); + if(!_save_file(path, txt)) { + printf("Cannot save file \"%s\"\n", path); + } else { + if(c->count == 1) { + printf("Save done. %d line saved.\n", c->count); + } else { + printf("Save done. %d lines saved.\n", c->count); + } + } + free(txt); +} + +static void _kill_program(const char* path) { + if(!unlink(path)) { + printf("Delete file \"%s\" successfully.\n", path); + } else { + printf("Delete file \"%s\" failed.\n", path); + } +} + +static void _show_tip(void) { + printf("MY-BASIC Interpreter Shell - %s.\n", mb_ver_string()); + printf("Copyright (C) 2011 - 2015 W. Renxin. All Rights Reserved.\n"); + printf("For more information, see https://github.com/paladin-t/my_basic/.\n"); + printf("Input HELP and hint enter to view help information.\n"); +} + +static void _show_help(void) { + printf("Commands:\n"); + printf(" CLS - Clear screen\n"); + printf(" NEW - Clear current program\n"); + printf(" RUN - Run current program\n"); + printf(" BYE - Quit interpreter\n"); + printf(" LIST - List current program\n"); + printf(" Usage: LIST [l [n]], l is start line number, n is line count\n"); + printf(" EDIT - Edit a line in current program\n"); + printf(" Usage: EDIT n, n is line number\n"); + printf(" LOAD - Load a file as current program\n"); + printf(" Usage: LOAD *.*\n"); + printf(" SAVE - Save current program to a file\n"); + printf(" Usage: SAVE *.*\n"); + printf(" KILL - Delete a file\n"); + printf(" Usage: KILL *.*\n"); +} + +static int _do_line(void) { + int result = MB_FUNC_OK; + char line[_MAX_LINE_LENGTH]; + char dup[_MAX_LINE_LENGTH]; + + mb_assert(bas); + + memset(line, 0, _MAX_LINE_LENGTH); + printf("]"); + mb_gets(line, _MAX_LINE_LENGTH); + + memcpy(dup, line, _MAX_LINE_LENGTH); + strtok(line, " "); + + if(_str_eq(line, "")) { + /* Do nothing */ + } else if(_str_eq(line, "HELP")) { + _show_help(); + } else if(_str_eq(line, "CLS")) { + _clear_screen(); + } else if(_str_eq(line, "NEW")) { + result = _new_program(); + } else if(_str_eq(line, "RUN")) { + char* txt = _get_code(c); + result = mb_reset(&bas, false); + result = mb_load_string(bas, txt); + free(txt); + result = mb_run(bas); + printf("\n"); + } else if(_str_eq(line, "BYE")) { + result = MB_FUNC_BYE; + } else if(_str_eq(line, "LIST")) { + char* sn = line + strlen(line) + 1; + char* cn = 0; + strtok(sn, " "); + cn = sn + strlen(sn) + 1; + _list_program(sn, cn); + } else if(_str_eq(line, "EDIT")) { + char* no = line + strlen(line) + 1; + _edit_program(no); + } else if(_str_eq(line, "LOAD")) { + char* path = line + strlen(line) + 1; + _load_program(path); + } else if(_str_eq(line, "SAVE")) { + char* path = line + strlen(line) + 1; + _save_program(path); + } else if(_str_eq(line, "KILL")) { + char* path = line + strlen(line) + 1; + _kill_program(path); + } else { + _append_line(c, dup); + } + + return result; +} + +int main(int argc, char* argv[]) { + int status = 0; + +#if defined _MSC_VER && !defined _WIN64 + _CrtSetBreakAlloc(0); +#endif /* _MSC_VER && !_WIN64 */ + + atexit(_on_exit); + + _on_startup(); + + if(argc == 1) { + _show_tip(); + do { + status = _do_line(); + } while(_NO_END(status)); + } else if(argc == 2) { + if(mb_load_file(bas, argv[1]) == MB_FUNC_OK) { + mb_run(bas); + } + } else { + printf("Unknown arguments\n"); + _show_tip(); + } + + return 0; +}