*fixed a float number parsing bug, thanks to Cybermonkey342 for pointing it out; +added directly expression evaluation shell command.
This commit is contained in:
parent
db122e960e
commit
09f005b50a
4
HISTORY
4
HISTORY
@ -1,3 +1,7 @@
|
|||||||
|
Sep. 18 2015
|
||||||
|
Fixed a float number parsing bug, thanks to Cybermonkey342 for pointing it out
|
||||||
|
Added directly expression evaluation shell command
|
||||||
|
|
||||||
Sep. 17 2015
|
Sep. 17 2015
|
||||||
Allowed string in a boolean expression
|
Allowed string in a boolean expression
|
||||||
Added support for sub routine in PRINT
|
Added support for sub routine in PRINT
|
||||||
|
@ -79,7 +79,7 @@ extern "C" {
|
|||||||
/** Macros */
|
/** Macros */
|
||||||
#define _VER_MAJOR 1
|
#define _VER_MAJOR 1
|
||||||
#define _VER_MINOR 1
|
#define _VER_MINOR 1
|
||||||
#define _VER_REVISION 70
|
#define _VER_REVISION 71
|
||||||
#define _MB_VERSION ((_VER_MAJOR * 0x01000000) + (_VER_MINOR * 0x00010000) + (_VER_REVISION))
|
#define _MB_VERSION ((_VER_MAJOR * 0x01000000) + (_VER_MINOR * 0x00010000) + (_VER_REVISION))
|
||||||
|
|
||||||
/* Uncomment the line below to treat warning as error */
|
/* Uncomment the line below to treat warning as error */
|
||||||
|
@ -50,18 +50,9 @@ extern "C" {
|
|||||||
# define MB_ENABLE_SOURCE_TRACE
|
# define MB_ENABLE_SOURCE_TRACE
|
||||||
#endif /* MB_ENABLE_SOURCE_TRACE */
|
#endif /* MB_ENABLE_SOURCE_TRACE */
|
||||||
|
|
||||||
#ifndef MB_COMPACT_MODE
|
|
||||||
# define MB_COMPACT_MODE
|
|
||||||
#endif /* MB_COMPACT_MODE */
|
|
||||||
|
|
||||||
#ifdef MB_COMPACT_MODE
|
|
||||||
# pragma pack(1)
|
|
||||||
#endif /* MB_COMPACT_MODE */
|
|
||||||
|
|
||||||
#ifndef MB_CONVERT_TO_INT_LEVEL_NONE
|
#ifndef MB_CONVERT_TO_INT_LEVEL_NONE
|
||||||
# define MB_CONVERT_TO_INT_LEVEL_NONE 0
|
# define MB_CONVERT_TO_INT_LEVEL_NONE 0
|
||||||
#endif /* MB_CONVERT_TO_INT_LEVEL_NONE */
|
#endif /* MB_CONVERT_TO_INT_LEVEL_NONE */
|
||||||
|
|
||||||
#ifndef MB_CONVERT_TO_INT_LEVEL_ALL
|
#ifndef MB_CONVERT_TO_INT_LEVEL_ALL
|
||||||
# define MB_CONVERT_TO_INT_LEVEL_ALL 1
|
# define MB_CONVERT_TO_INT_LEVEL_ALL 1
|
||||||
#endif /* MB_CONVERT_TO_INT_LEVEL_ALL */
|
#endif /* MB_CONVERT_TO_INT_LEVEL_ALL */
|
||||||
@ -70,6 +61,14 @@ extern "C" {
|
|||||||
# define MB_CONVERT_TO_INT_LEVEL MB_CONVERT_TO_INT_LEVEL_ALL
|
# define MB_CONVERT_TO_INT_LEVEL MB_CONVERT_TO_INT_LEVEL_ALL
|
||||||
#endif /* MB_CONVERT_TO_INT_LEVEL */
|
#endif /* MB_CONVERT_TO_INT_LEVEL */
|
||||||
|
|
||||||
|
#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
|
#ifndef true
|
||||||
# define true (!0)
|
# define true (!0)
|
||||||
#endif /* true */
|
#endif /* true */
|
||||||
@ -261,6 +260,7 @@ typedef enum mb_data_e {
|
|||||||
MB_DT_REAL = 1 << 2,
|
MB_DT_REAL = 1 << 2,
|
||||||
MB_DT_STRING = 1 << 3,
|
MB_DT_STRING = 1 << 3,
|
||||||
MB_DT_USERTYPE = 1 << 4,
|
MB_DT_USERTYPE = 1 << 4,
|
||||||
|
MB_DT_CLASS = 1 << 5,
|
||||||
MB_DT_ARRAY = 1 << 12
|
MB_DT_ARRAY = 1 << 12
|
||||||
} mb_data_e;
|
} mb_data_e;
|
||||||
|
|
||||||
@ -269,6 +269,7 @@ typedef union mb_value_u {
|
|||||||
real_t float_point;
|
real_t float_point;
|
||||||
char* string;
|
char* string;
|
||||||
void* usertype;
|
void* usertype;
|
||||||
|
void* instance;
|
||||||
void* array;
|
void* array;
|
||||||
} mb_value_u;
|
} mb_value_u;
|
||||||
|
|
||||||
|
Binary file not shown.
Binary file not shown.
@ -36,8 +36,8 @@
|
|||||||
IDI_ICON_MAIN ICON "icon.ico"
|
IDI_ICON_MAIN ICON "icon.ico"
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,1,70,0
|
FILEVERSION 1,1,71,0
|
||||||
PRODUCTVERSION 1,1,70,0
|
PRODUCTVERSION 1,1,71,0
|
||||||
FILEFLAGSMASK 0x17L
|
FILEFLAGSMASK 0x17L
|
||||||
# ifdef _DEBUG
|
# ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
@ -55,13 +55,13 @@
|
|||||||
VALUE "Comments", "MY-BASIC"
|
VALUE "Comments", "MY-BASIC"
|
||||||
VALUE "CompanyName", "Wang Renxin"
|
VALUE "CompanyName", "Wang Renxin"
|
||||||
VALUE "FileDescription", "MY-BASIC Interpreter for Windows"
|
VALUE "FileDescription", "MY-BASIC Interpreter for Windows"
|
||||||
VALUE "FileVersion", "1, 1, 70, 0"
|
VALUE "FileVersion", "1, 1, 71, 0"
|
||||||
VALUE "InternalName", "my_basic"
|
VALUE "InternalName", "my_basic"
|
||||||
VALUE "LegalCopyright", "Copyright (C) 2011 - 2015 Wang Renxin"
|
VALUE "LegalCopyright", "Copyright (C) 2011 - 2015 Wang Renxin"
|
||||||
VALUE "LegalTrademarks", "MY-BASIC"
|
VALUE "LegalTrademarks", "MY-BASIC"
|
||||||
VALUE "OriginalFilename", "my_basic.exe"
|
VALUE "OriginalFilename", "my_basic.exe"
|
||||||
VALUE "ProductName", "MY-BASIC"
|
VALUE "ProductName", "MY-BASIC"
|
||||||
VALUE "ProductVersion", "1, 1, 70, 0"
|
VALUE "ProductVersion", "1, 1, 71, 0"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
124
shell/main.c
124
shell/main.c
@ -63,6 +63,14 @@
|
|||||||
** Common declarations
|
** Common declarations
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
# define _BIN_FILE_NAME "my_basic"
|
||||||
|
#elif defined __APPLE__
|
||||||
|
# define _BIN_FILE_NAME "my_basic_mac"
|
||||||
|
#else
|
||||||
|
# define _BIN_FILE_NAME "my_basic_bin"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define _USE_MEM_POOL /* Comment this macro to disable memory pool */
|
#define _USE_MEM_POOL /* Comment this macro to disable memory pool */
|
||||||
|
|
||||||
#define _MAX_LINE_LENGTH 256
|
#define _MAX_LINE_LENGTH 256
|
||||||
@ -527,14 +535,14 @@ static void _load_program(const char* path) {
|
|||||||
printf("Load done. %d lines loaded.\n", c->count);
|
printf("Load done. %d lines loaded.\n", c->count);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
printf("Cannot load file \"%s\"\n", path);
|
printf("Cannot load file \"%s\".\n", path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _save_program(const char* path) {
|
static void _save_program(const char* path) {
|
||||||
char* txt = _get_code(c);
|
char* txt = _get_code(c);
|
||||||
if(!_save_file(path, txt)) {
|
if(!_save_file(path, txt)) {
|
||||||
printf("Cannot save file \"%s\"\n", path);
|
printf("Cannot save file \"%s\".\n", path);
|
||||||
} else {
|
} else {
|
||||||
if(c->count == 1) {
|
if(c->count == 1) {
|
||||||
printf("Save done. %d line saved.\n", c->count);
|
printf("Save done. %d line saved.\n", c->count);
|
||||||
@ -561,7 +569,11 @@ static void _show_tip(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void _show_help(void) {
|
static void _show_help(void) {
|
||||||
printf("Commands:\n");
|
printf("Parameters:\n");
|
||||||
|
printf(" %s - Start interactive mode without arguments.\n", _BIN_FILE_NAME);
|
||||||
|
printf(" %s *.* - Load and run a file.\n", _BIN_FILE_NAME);
|
||||||
|
printf(" %s -e \"expr\" - Evaluate an expression directly.\n", _BIN_FILE_NAME);
|
||||||
|
printf("Interactive commands:\n");
|
||||||
printf(" CLS - Clear screen\n");
|
printf(" CLS - Clear screen\n");
|
||||||
printf(" NEW - Clear current program\n");
|
printf(" NEW - Clear current program\n");
|
||||||
printf(" RUN - Run current program\n");
|
printf(" RUN - Run current program\n");
|
||||||
@ -647,6 +659,100 @@ static int _do_line(void) {
|
|||||||
|
|
||||||
/* ========================================================} */
|
/* ========================================================} */
|
||||||
|
|
||||||
|
/*
|
||||||
|
** {========================================================
|
||||||
|
** Parameter processing
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _CHECK_ARG(__c, __i, __e) \
|
||||||
|
do { \
|
||||||
|
if(__c <= __i + 1) { \
|
||||||
|
printf(__e); \
|
||||||
|
return; \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
static void _run_file(char* path) {
|
||||||
|
if(mb_load_file(bas, path) == MB_FUNC_OK) {
|
||||||
|
mb_run(bas);
|
||||||
|
} else {
|
||||||
|
printf("Invalid file or error code.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _evaluate_expression(char* p) {
|
||||||
|
char pr[8];
|
||||||
|
int l = 0;
|
||||||
|
int k = 0;
|
||||||
|
bool_t a = true;
|
||||||
|
char* e = 0;
|
||||||
|
|
||||||
|
const char* const print = "PRINT ";
|
||||||
|
|
||||||
|
if(!p) {
|
||||||
|
printf("Invalid expression.\n");
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
l = (int)strlen(p);
|
||||||
|
k = (int)strlen(print);
|
||||||
|
if(l >= k) {
|
||||||
|
memcpy(pr, p, k);
|
||||||
|
pr[k] = '\0';
|
||||||
|
if(_str_eq(pr, print))
|
||||||
|
a = false;
|
||||||
|
}
|
||||||
|
if(a) {
|
||||||
|
e = (char*)malloc(l + k + 1);
|
||||||
|
memcpy(e, print, k);
|
||||||
|
memcpy(e + k, p, l);
|
||||||
|
e[l + k] = '\0';
|
||||||
|
p = e;
|
||||||
|
}
|
||||||
|
if(mb_load_string(bas, p) == MB_FUNC_OK) {
|
||||||
|
mb_run(bas);
|
||||||
|
} else {
|
||||||
|
printf("Invalid expression.\n");
|
||||||
|
}
|
||||||
|
if(a) {
|
||||||
|
free(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _process_parameters(int argc, char* argv[]) {
|
||||||
|
int i = 1;
|
||||||
|
char* p = 0;
|
||||||
|
char m = '\0';
|
||||||
|
|
||||||
|
while(i < argc) {
|
||||||
|
if(!memcmp(argv[i], "-", 1)) {
|
||||||
|
if(!memcmp(argv[i] + 1, "e", 1)) {
|
||||||
|
m = 'e';
|
||||||
|
_CHECK_ARG(argc, i, "-e: Expression expected.\n");
|
||||||
|
p = argv[++i];
|
||||||
|
} else {
|
||||||
|
printf("Unknown argument: %s.\n", argv[i]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
p = argv[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(m) {
|
||||||
|
case '\0':
|
||||||
|
_run_file(p);
|
||||||
|
break;
|
||||||
|
case 'e':
|
||||||
|
_evaluate_expression(p);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ========================================================} */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** {========================================================
|
** {========================================================
|
||||||
** Scripting interfaces
|
** Scripting interfaces
|
||||||
@ -684,7 +790,7 @@ static void _on_error(struct mb_interpreter_t* s, mb_error_e e, char* m, char* f
|
|||||||
mb_unrefvar(f);
|
mb_unrefvar(f);
|
||||||
mb_unrefvar(p);
|
mb_unrefvar(p);
|
||||||
if(SE_NO_ERR != e) {
|
if(SE_NO_ERR != e) {
|
||||||
printf("Error:\n [LINE] %d, [COL] %d,\n [CODE] %d, [MESSAGE] %s, [ABORT CODE] %d\n", row, col, e, m, abort_code);
|
printf("Error:\n [LINE] %d, [COL] %d,\n [CODE] %d, [MESSAGE] %s, [ABORT CODE] %d.\n", row, col, e, m, abort_code);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -753,14 +859,10 @@ int main(int argc, char* argv[]) {
|
|||||||
do {
|
do {
|
||||||
status = _do_line();
|
status = _do_line();
|
||||||
} while(_NO_END(status));
|
} while(_NO_END(status));
|
||||||
} else if(argc == 2) {
|
} else if(argc >= 2) {
|
||||||
if(mb_load_file(bas, argv[1]) == MB_FUNC_OK) {
|
_process_parameters(argc, argv);
|
||||||
mb_run(bas);
|
|
||||||
} else {
|
|
||||||
printf("Invalid file\n");
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
printf("Unknown arguments\n");
|
printf("Unknown arguments.\n");
|
||||||
_show_tip();
|
_show_tip();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user