+added an OS statement; *refactored platform dependent macros.

This commit is contained in:
paladin-t 2016-03-01 13:21:19 +08:00
parent b3a461e796
commit 32e93a758c
5 changed files with 162 additions and 73 deletions

View File

@ -1,3 +1,7 @@
Mar. 1 2016
Added an OS statement
Refactored platform dependent macros
Feb. 29 2016 Feb. 29 2016
Added multi-line comment support Added multi-line comment support
Fixed a crash bug with an invalid expression Fixed a crash bug with an invalid expression

View File

@ -30,15 +30,15 @@
#endif /* _MSC_VER */ #endif /* _MSC_VER */
#include "my_basic.h" #include "my_basic.h"
#ifdef _MSC_VER #ifdef MB_CP_VC
# include <conio.h> # include <conio.h>
# include <malloc.h> # include <malloc.h>
#else /* _MSC_VER */ #else /* MB_CP_VC */
# include <stdint.h> # include <stdint.h>
#endif /* _MSC_VER */ #endif /* MB_CP_VC */
#ifndef ARDUINO #ifndef MB_CP_ARDUINO
# include <memory.h> # include <memory.h>
#endif /* ARDUINO */ #endif /* MB_CP_ARDUINO */
#include <assert.h> #include <assert.h>
#include <ctype.h> #include <ctype.h>
#include <limits.h> #include <limits.h>
@ -51,26 +51,26 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifdef _MSC_VER #ifdef MB_CP_VC
# pragma warning(push) # pragma warning(push)
# pragma warning(disable : 4127) # pragma warning(disable : 4127)
# pragma warning(disable : 4305) # pragma warning(disable : 4305)
# pragma warning(disable : 4309) # pragma warning(disable : 4309)
# pragma warning(disable : 4805) # pragma warning(disable : 4805)
# pragma warning(disable : 4996) # pragma warning(disable : 4996)
#endif /* _MSC_VER */ #endif /* MB_CP_VC */
#ifdef __APPLE__ #ifdef MB_CP_CLANG
# pragma clang diagnostic push # pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wunused-function" # pragma clang diagnostic ignored "-Wunused-function"
# pragma clang diagnostic ignored "-Wunused-variable" # pragma clang diagnostic ignored "-Wunused-variable"
#endif /* __APPLE__ */ #endif /* MB_CP_CLANG */
#ifdef __BORLANDC__ #ifdef MB_CP_BORLANDC
# pragma warn -8004 # pragma warn -8004
# pragma warn -8008 # pragma warn -8008
# pragma warn -8012 # pragma warn -8012
#endif /* __BORLANDC__ */ #endif /* MB_CP_BORLANDC */
#ifdef MB_COMPACT_MODE #ifdef MB_COMPACT_MODE
# pragma pack(1) # pragma pack(1)
@ -1684,22 +1684,22 @@ static int _close_coll_lib(mb_interpreter_t* s);
*/ */
/** Macro */ /** Macro */
#ifdef _MSC_VER #ifdef MB_CP_VC
# if _MSC_VER < 1300 # if MB_CP_VC < 1300
# define MB_FUNC 0 # define MB_FUNC 0
# else /* _MSC_VER < 1300 */ # else /* MB_CP_VC < 1300 */
# define MB_FUNC __FUNCTION__ # define MB_FUNC __FUNCTION__
# endif /* _MSC_VER < 1300 */ # endif /* MB_CP_VC < 1300 */
#elif defined __BORLANDC__ #elif defined MB_CP_BORLANDC
# define MB_FUNC __FUNC__ # define MB_FUNC __FUNC__
#elif defined __POCC__ #elif defined MB_CP_PELLESC
# define MB_FUNC __func__ # define MB_FUNC __func__
#else /* _MSC_VER */ #else /* MB_CP_VC */
# define MB_FUNC __FUNCTION__ # define MB_FUNC __FUNCTION__
#endif /* _MSC_VER */ #endif /* MB_CP_VC */
#ifdef _MSC_VER #ifdef MB_CP_VC
# if _MSC_VER < 1300 # if MB_CP_VC < 1300
# define _do_nothing(__s, __l, __exit, __result) \ # define _do_nothing(__s, __l, __exit, __result) \
do { \ do { \
_ls_node_t* ast = 0; static int i = 0; ++i; \ _ls_node_t* ast = 0; static int i = 0; ++i; \
@ -1707,8 +1707,8 @@ static int _close_coll_lib(mb_interpreter_t* s);
ast = (_ls_node_t*)(*(__l)); \ ast = (_ls_node_t*)(*(__l)); \
_handle_error_on_obj((__s), SE_RN_WRONG_FUNCTION_REACHED, (__s)->source_file, DON(ast), MB_FUNC_ERR, __exit, __result); \ _handle_error_on_obj((__s), SE_RN_WRONG_FUNCTION_REACHED, (__s)->source_file, DON(ast), MB_FUNC_ERR, __exit, __result); \
} while(0) } while(0)
# endif /* _MSC_VER < 1300 */ # endif /* MB_CP_VC < 1300 */
#endif /* _MSC_VER */ #endif /* MB_CP_VC */
#ifndef _do_nothing #ifndef _do_nothing
# define _do_nothing(__s, __l, __exit, __result) \ # define _do_nothing(__s, __l, __exit, __result) \
do { \ do { \
@ -4145,7 +4145,7 @@ static mb_input_func_t _get_inputer(mb_interpreter_t* s) {
static char* _load_file(mb_interpreter_t* s, const char* f, const char* prefix) { static char* _load_file(mb_interpreter_t* s, const char* f, const char* prefix) {
/* Read all content of a file into a buffer */ /* Read all content of a file into a buffer */
#ifndef ARDUINO #ifndef MB_CP_ARDUINO
FILE* fp = 0; FILE* fp = 0;
char* buf = 0; char* buf = 0;
long curpos = 0; long curpos = 0;
@ -4186,9 +4186,9 @@ static char* _load_file(mb_interpreter_t* s, const char* f, const char* prefix)
} }
return buf; return buf;
#else /* ARDUINO */ #else /* MB_CP_ARDUINO */
return 0; return 0;
#endif /* ARDUINO */ #endif /* MB_CP_ARDUINO */
} }
static void _end_of_file(_parsing_context_t* context) { static void _end_of_file(_parsing_context_t* context) {
@ -15093,11 +15093,11 @@ static int _std_input(mb_interpreter_t* s, void** l) {
obj = (_object_t*)ast->data; obj = (_object_t*)ast->data;
if(!obj || obj->type == _DT_EOS) { if(!obj || obj->type == _DT_EOS) {
#ifdef _MSC_VER #ifdef MB_CP_VC
getch(); getch();
#else /* _MSC_VER */ #else /* MB_CP_VC */
_get_inputer(s)(line, sizeof(line)); _get_inputer(s)(line, sizeof(line));
#endif /* _MSC_VER */ #endif /* MB_CP_VC */
goto _exit; goto _exit;
} }
@ -15906,19 +15906,19 @@ _exit:
# pragma pack() # pragma pack()
#endif /* MB_COMPACT_MODE */ #endif /* MB_COMPACT_MODE */
#ifdef __BORLANDC__ #ifdef MB_CP_BORLANDC
# pragma warn .8004 # pragma warn .8004
# pragma warn .8008 # pragma warn .8008
# pragma warn .8012 # pragma warn .8012
#endif /* __BORLANDC__ */ #endif /* MB_CP_BORLANDC */
#ifdef __APPLE__ #ifdef MB_CP_CLANG
# pragma clang diagnostic pop # pragma clang diagnostic pop
#endif /* __APPLE__ */ #endif /* MB_CP_CLANG */
#ifdef _MSC_VER #ifdef MB_CP_VC
# pragma warning(pop) # pragma warning(pop)
#endif /* _MSC_VER */ #endif /* MB_CP_VC */
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -30,6 +30,60 @@
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#if defined _MSC_VER
# define MB_CP_VC _MSC_VER
#elif defined __clang__
# define MB_CP_CLANG
#elif defined __CYGWIN__
# define MB_CP_CYGWIN
#elif defined __MINGW32__
# define MB_CP_MINGW32
#elif defined __BORLANDC__
# define MB_CP_BORLANDC
#elif defined __POCC__
# define MB_CP_PELLESC
#elif defined __TINYC__
# define MB_CP_TCC
#elif defined __GNUC__ || defined __GNUG__
# define MB_CP_GCC
#elif defined __ICC || defined __INTEL_COMPILER
# define MB_CP_ICC
#elif defined __HP_cc || defined __HP_aCC
# define MB_CP_HPC
#elif defined __IBMC__ || defined __IBMCPP__
# define MB_CP_IBMC
#elif defined __PGI
# define MB_CP_PGCC
#elif defined __SUNPRO_C || defined__SUNPRO_CC
# define MB_CP_SOLARISC
#elif defined ARDUINO
# define MB_CP_ARDUINO
#else
# define MB_CP_UNKNOWN
#endif /* Compiler dependent macro */
#if defined _WIN32 || defined _WIN64
# define MB_OS_WIN
#elif defined __APPLE__
# include <TargetConditionals.h>
# define MB_OS_APPLE
# ifdef TARGET_OS_IPHONE
# define MB_OS_IOS
# elif defined TARGET_IPHONE_SIMULATOR
# define MB_OS_IOS_SIM
# elif defined TARGET_OS_MAC
# define MB_OS_MAC
# endif
#elif defined __unix__
# define MB_OS_UNIX
#elif defined __linux__
# define MB_OS_LINUX
#elif defined __ANDROID__
# define MB_OS_ANDROID
#else
# define MB_OS_UNKNOWN
#endif /* OS dependent macro */
#ifndef MBAPI #ifndef MBAPI
# define MBAPI # define MBAPI
#endif /* MBAPI */ #endif /* MBAPI */
@ -156,17 +210,17 @@ extern "C" {
#endif /* MB_NULL_STRING */ #endif /* MB_NULL_STRING */
#ifndef mb_stricmp #ifndef mb_stricmp
# ifdef _MSC_VER # ifdef MB_CP_VC
# define mb_stricmp _strcmpi # define mb_stricmp _strcmpi
# else /* _MSC_VER */ # else /* MB_CP_VC */
# ifdef __BORLANDC__ # ifdef MB_CP_BORLANDC
# define mb_stricmp stricmp # define mb_stricmp stricmp
# elif defined __POCC__ # elif defined MB_CP_PELLESC
# define mb_stricmp _stricmp # define mb_stricmp _stricmp
# else # else
# define mb_stricmp strcasecmp # define mb_stricmp strcasecmp
# endif # endif
# endif /* _MSC_VER */ # endif /* MB_CP_VC */
#endif /* mb_stricmp */ #endif /* mb_stricmp */
#ifndef mb_assert #ifndef mb_assert

Binary file not shown.

View File

@ -30,59 +30,59 @@
#endif /* _MSC_VER */ #endif /* _MSC_VER */
#include "../core/my_basic.h" #include "../core/my_basic.h"
#ifdef _MSC_VER #ifdef MB_CP_VC
# include <crtdbg.h> # include <crtdbg.h>
# include <conio.h> # include <conio.h>
# include <Windows.h> # include <Windows.h>
#elif !defined __BORLANDC__ && !defined __TINYC__ #elif !defined MB_CP_BORLANDC && !defined MB_CP_TCC
# include <unistd.h> # include <unistd.h>
#endif /* _MSC_VER */ #endif /* MB_CP_VC */
#ifndef _MSC_VER #ifndef MB_CP_VC
# include <stdint.h> # include <stdint.h>
#endif /* _MSC_VER */ #endif /* MB_CP_VC */
#ifdef MB_CP_CLANG
# include <sys/time.h>
#endif /* MB_CP_CLANG */
#include <assert.h> #include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <stdarg.h> #include <stdarg.h>
#include <time.h> #include <time.h>
#ifdef __APPLE__
# include <sys/time.h>
#endif /* __APPLE__ */
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif /* __cplusplus */ #endif /* __cplusplus */
#ifdef _MSC_VER #ifdef MB_CP_VC
# pragma warning(disable : 4127) # pragma warning(disable : 4127)
# pragma warning(disable : 4706) # pragma warning(disable : 4706)
# pragma warning(disable : 4996) # pragma warning(disable : 4996)
#endif /* _MSC_VER */ #endif /* MB_CP_VC */
#ifdef __BORLANDC__ #ifdef MB_CP_BORLANDC
# pragma warn -8004 # pragma warn -8004
# pragma warn -8008 # pragma warn -8008
# pragma warn -8066 # pragma warn -8066
#endif /* __BORLANDC__ */ #endif /* MB_CP_BORLANDC */
#ifdef __POCC__ #ifdef MB_CP_PELLESC
# define strdup _strdup # define strdup _strdup
# define unlink _unlink # define unlink _unlink
#endif /* __POCC__ */ #endif /* MB_CP_PELLESC */
/* /*
** {======================================================== ** {========================================================
** Common declarations ** Common declarations
*/ */
#ifdef _MSC_VER #ifdef MB_OS_WIN
# define _BIN_FILE_NAME "my_basic" # define _BIN_FILE_NAME "my_basic"
#elif defined __APPLE__ #elif defined MB_OS_MAC
# define _BIN_FILE_NAME "my_basic_mac" # define _BIN_FILE_NAME "my_basic_mac"
#else /* _MSC_VER */ #else
# define _BIN_FILE_NAME "my_basic_bin" # define _BIN_FILE_NAME "my_basic_bin"
#endif /* _MSC_VER */ #endif
/* Define as 1 to use memory pool, 0 to disable */ /* Define as 1 to use memory pool, 0 to disable */
#define _USE_MEM_POOL 1 #define _USE_MEM_POOL 1
@ -646,11 +646,11 @@ static bool_t _try_import(struct mb_interpreter_t* s, const char* p) {
*/ */
static void _clear_screen(void) { static void _clear_screen(void) {
#ifdef _MSC_VER #ifdef MB_OS_WIN
system("cls"); system("cls");
#else /* _MSC_VER */ #else /* MB_OS_WIN */
system("clear"); system("clear");
#endif /* _MSC_VER */ #endif /* MB_OS_WIN */
} }
static int _new_program(void) { static int _new_program(void) {
@ -821,13 +821,13 @@ static void _kill_program(const char* path) {
static void _list_directory(const char* path) { static void _list_directory(const char* path) {
char line[_MAX_LINE_LENGTH]; char line[_MAX_LINE_LENGTH];
#ifdef _MSC_VER #ifdef MB_OS_WIN
if(path && *path) sprintf(line, "dir %s", path); if(path && *path) sprintf(line, "dir %s", path);
else sprintf(line, "dir"); else sprintf(line, "dir");
#else /* _MSC_VER */ #else /* MB_OS_WIN */
if(path && *path) sprintf(line, "ls %s", path); if(path && *path) sprintf(line, "ls %s", path);
else sprintf(line, "ls"); else sprintf(line, "ls");
#endif /* _MSC_VER */ #endif /* MB_OS_WIN */
system(line); system(line);
} }
@ -1065,8 +1065,24 @@ static bool_t _process_parameters(int argc, char* argv[]) {
** Scripting interfaces ** Scripting interfaces
*/ */
#ifdef MB_OS_WIN
# define _OS "WIN"
#elif defined MB_OS_IOS || MB_OS_IOS_SIM
# define _OS "IOS"
#elif defined MB_OS_MAC
# define _OS "MAC"
#elif defined MB_OS_UNIX
# define _OS "UNIX"
#elif defined MB_OS_LINUX
# define _OS "LINUX"
#elif defined MB_OS_ANDROID
# define _OS "ANDROID"
#else
# define _OS "UNKNOWN"
#endif /* MB_OS_WIN */
#define _HAS_TICKS #define _HAS_TICKS
#if defined _MSC_VER #if defined MB_CP_VC
static int_t _ticks(void) { static int_t _ticks(void) {
LARGE_INTEGER li; LARGE_INTEGER li;
double freq = 0.0; double freq = 0.0;
@ -1079,7 +1095,7 @@ static int_t _ticks(void) {
return ret; return ret;
} }
#elif defined __APPLE__ #elif defined MB_CP_CLANG
static int_t _ticks(void) { static int_t _ticks(void) {
struct timespec ts; struct timespec ts;
struct timeval now; struct timeval now;
@ -1092,7 +1108,7 @@ static int_t _ticks(void) {
return (int_t)(ts.tv_sec * 1000 + ts.tv_nsec / 1000000); return (int_t)(ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
} }
#elif defined __GNUC__ #elif defined MB_CP_GCC
static int_t _ticks(void) { static int_t _ticks(void) {
struct timespec ts; struct timespec ts;
@ -1100,9 +1116,9 @@ static int_t _ticks(void) {
return (int_t)(ts.tv_sec * 1000 + ts.tv_nsec / 1000000); return (int_t)(ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
} }
#else /* _MSC_VER */ #else /* MB_CP_VC */
# undef _HAS_TICKS # undef _HAS_TICKS
#endif /* _MSC_VER */ #endif /* MB_CP_VC */
#ifdef _HAS_TICKS #ifdef _HAS_TICKS
static int ticks(struct mb_interpreter_t* s, void** l) { static int ticks(struct mb_interpreter_t* s, void** l) {
@ -1167,6 +1183,20 @@ static int set_importing_dirs(struct mb_interpreter_t* s, void** l) {
return result; return result;
} }
static int os(struct mb_interpreter_t* s, void** l) {
int result = MB_FUNC_OK;
mb_assert(s && l);
mb_check(mb_attempt_open_bracket(s, l));
mb_check(mb_attempt_close_bracket(s, l));
mb_check(mb_push_string(s, l, mb_memdup(_OS, (unsigned)(strlen(_OS) + 1))));
return result;
}
static int sys(struct mb_interpreter_t* s, void** l) { static int sys(struct mb_interpreter_t* s, void** l) {
int result = MB_FUNC_OK; int result = MB_FUNC_OK;
char* arg = 0; char* arg = 0;
@ -1345,6 +1375,7 @@ static void _on_startup(void) {
#endif /* _HAS_TICKS */ #endif /* _HAS_TICKS */
mb_reg_fun(bas, now); mb_reg_fun(bas, now);
mb_reg_fun(bas, set_importing_dirs); mb_reg_fun(bas, set_importing_dirs);
mb_reg_fun(bas, os);
mb_reg_fun(bas, sys); mb_reg_fun(bas, sys);
mb_reg_fun(bas, trace); mb_reg_fun(bas, trace);
mb_reg_fun(bas, raise); mb_reg_fun(bas, raise);
@ -1365,11 +1396,11 @@ static void _on_exit(void) {
_close_mem_pool(); _close_mem_pool();
#endif /* _USE_MEM_POOL */ #endif /* _USE_MEM_POOL */
#if defined _MSC_VER && !defined _WIN64 #if defined MB_CP_VC && !defined _WIN64
if(!!_CrtDumpMemoryLeaks()) { _asm { int 3 } } if(!!_CrtDumpMemoryLeaks()) { _asm { int 3 } }
#elif _USE_MEM_POOL #elif _USE_MEM_POOL
if(alloc_count > 0 || alloc_bytes > 0) { mb_assert(0 && "Memory leak."); } if(alloc_count > 0 || alloc_bytes > 0) { mb_assert(0 && "Memory leak."); }
#endif /* _MSC_VER && !_WIN64 */ #endif /* MB_CP_VC && !_WIN64 */
} }
/* ========================================================} */ /* ========================================================} */
@ -1382,9 +1413,9 @@ static void _on_exit(void) {
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
int status = 0; int status = 0;
#if defined _MSC_VER && !defined _WIN64 #if defined MB_CP_VC && !defined _WIN64
_CrtSetBreakAlloc(0); _CrtSetBreakAlloc(0);
#endif /* _MSC_VER && !_WIN64 */ #endif /* MB_CP_VC && !_WIN64 */
atexit(_on_exit); atexit(_on_exit);