*polished code.
This commit is contained in:
parent
80fe1da2a4
commit
6d579b2478
236
core/my_basic.c
236
core/my_basic.c
@ -172,6 +172,7 @@ typedef int (* _common_compare)(void*, void*);
|
|||||||
/* Container operation */
|
/* Container operation */
|
||||||
#define _OP_RESULT_NORMAL 0
|
#define _OP_RESULT_NORMAL 0
|
||||||
#define _OP_RESULT_DEL_NODE -1
|
#define _OP_RESULT_DEL_NODE -1
|
||||||
|
|
||||||
typedef int (* _common_operation)(void*, void*);
|
typedef int (* _common_operation)(void*, void*);
|
||||||
|
|
||||||
/** List */
|
/** List */
|
||||||
@ -320,26 +321,20 @@ typedef enum _data_e {
|
|||||||
_DT_EOS /* End of statement */
|
_DT_EOS /* End of statement */
|
||||||
} _data_e;
|
} _data_e;
|
||||||
|
|
||||||
typedef struct _func_t {
|
#ifdef MB_ENABLE_COLLECTION_LIB
|
||||||
char* name;
|
# define _HAS_REF_OBJ_LOCK
|
||||||
mb_func_t pointer;
|
#endif /* MB_ENABLE_COLLECTION_LIB */
|
||||||
} _func_t;
|
|
||||||
|
|
||||||
typedef struct _var_t {
|
#ifdef _HAS_REF_OBJ_LOCK
|
||||||
char* name;
|
typedef short _lock_t;
|
||||||
struct _object_t* data;
|
#endif /* _HAS_REF_OBJ_LOCK */
|
||||||
#ifdef MB_ENABLE_CLASS
|
|
||||||
int pathing;
|
|
||||||
bool_t isme;
|
|
||||||
#endif /* MB_ENABLE_CLASS */
|
|
||||||
} _var_t;
|
|
||||||
|
|
||||||
struct _ref_t;
|
struct _ref_t;
|
||||||
|
|
||||||
#define _NONE_REF 1
|
|
||||||
|
|
||||||
typedef void (* _unref_func_t)(struct _ref_t*, void*);
|
typedef void (* _unref_func_t)(struct _ref_t*, void*);
|
||||||
|
|
||||||
|
#define _NONE_REF 1
|
||||||
|
|
||||||
typedef unsigned _ref_count_t;
|
typedef unsigned _ref_count_t;
|
||||||
|
|
||||||
typedef struct _ref_t {
|
typedef struct _ref_t {
|
||||||
@ -350,8 +345,6 @@ typedef struct _ref_t {
|
|||||||
struct mb_interpreter_t* s;
|
struct mb_interpreter_t* s;
|
||||||
} _ref_t;
|
} _ref_t;
|
||||||
|
|
||||||
typedef short _lock_t;
|
|
||||||
|
|
||||||
typedef struct _gc_t {
|
typedef struct _gc_t {
|
||||||
_ht_node_t* table;
|
_ht_node_t* table;
|
||||||
_ht_node_t* recursive_table;
|
_ht_node_t* recursive_table;
|
||||||
@ -379,6 +372,20 @@ typedef struct _usertype_ref_t {
|
|||||||
_override_func_info_t overrides;
|
_override_func_info_t overrides;
|
||||||
} _usertype_ref_t;
|
} _usertype_ref_t;
|
||||||
|
|
||||||
|
typedef struct _func_t {
|
||||||
|
char* name;
|
||||||
|
mb_func_t pointer;
|
||||||
|
} _func_t;
|
||||||
|
|
||||||
|
typedef struct _var_t {
|
||||||
|
char* name;
|
||||||
|
struct _object_t* data;
|
||||||
|
#ifdef MB_ENABLE_CLASS
|
||||||
|
int pathing;
|
||||||
|
bool_t isme;
|
||||||
|
#endif /* MB_ENABLE_CLASS */
|
||||||
|
} _var_t;
|
||||||
|
|
||||||
typedef struct _array_t {
|
typedef struct _array_t {
|
||||||
#ifdef MB_ENABLE_ARRAY_REF
|
#ifdef MB_ENABLE_ARRAY_REF
|
||||||
_ref_t ref;
|
_ref_t ref;
|
||||||
@ -429,6 +436,8 @@ typedef struct _dict_t {
|
|||||||
_ht_node_t* dict;
|
_ht_node_t* dict;
|
||||||
} _dict_t;
|
} _dict_t;
|
||||||
|
|
||||||
|
#define _INVALID_DICT_IT ((_ls_node_t*)(intptr_t)~0)
|
||||||
|
|
||||||
typedef struct _dict_it_t {
|
typedef struct _dict_it_t {
|
||||||
_ref_t weak_ref;
|
_ref_t weak_ref;
|
||||||
_dict_t* dict;
|
_dict_t* dict;
|
||||||
@ -444,13 +453,12 @@ typedef struct _label_t {
|
|||||||
} _label_t;
|
} _label_t;
|
||||||
|
|
||||||
#ifdef MB_ENABLE_CLASS
|
#ifdef MB_ENABLE_CLASS
|
||||||
# define _CLASS_ME "ME"
|
#define _CLASS_ME "ME"
|
||||||
# define _CLASS_HASH_FUNC "HASH"
|
|
||||||
# define _CLASS_COMPARE_FUNC "COMPARE"
|
#define _CLASS_HASH_FUNC "HASH"
|
||||||
# define _CLASS_TO_STRING_FUNC "TOSTRING"
|
#define _CLASS_COMPARE_FUNC "COMPARE"
|
||||||
#endif /* MB_ENABLE_CLASS */
|
#define _CLASS_TO_STRING_FUNC "TOSTRING"
|
||||||
|
|
||||||
#ifdef MB_ENABLE_CLASS
|
|
||||||
typedef struct _class_t {
|
typedef struct _class_t {
|
||||||
_ref_t ref;
|
_ref_t ref;
|
||||||
char* name;
|
char* name;
|
||||||
@ -599,21 +607,21 @@ MBAPI const size_t MB_SIZEOF_LSN = _MB_MEM_TAG_SIZE + sizeof(_ls_node_t);
|
|||||||
MBAPI const size_t MB_SIZEOF_HTN = _MB_MEM_TAG_SIZE + sizeof(_ht_node_t);
|
MBAPI const size_t MB_SIZEOF_HTN = _MB_MEM_TAG_SIZE + sizeof(_ht_node_t);
|
||||||
MBAPI const size_t MB_SIZEOF_HTA = _MB_MEM_TAG_SIZE + sizeof(_ht_node_t*) * _HT_ARRAY_SIZE_DEFAULT;
|
MBAPI const size_t MB_SIZEOF_HTA = _MB_MEM_TAG_SIZE + sizeof(_ht_node_t*) * _HT_ARRAY_SIZE_DEFAULT;
|
||||||
MBAPI const size_t MB_SIZEOF_OBJ = _MB_MEM_TAG_SIZE + sizeof(_object_t);
|
MBAPI const size_t MB_SIZEOF_OBJ = _MB_MEM_TAG_SIZE + sizeof(_object_t);
|
||||||
MBAPI const size_t MB_SIZEOF_FUN = _MB_MEM_TAG_SIZE + sizeof(_func_t);
|
|
||||||
MBAPI const size_t MB_SIZEOF_VAR = _MB_MEM_TAG_SIZE + sizeof(_var_t);
|
|
||||||
#ifdef MB_ENABLE_USERTYPE_REF
|
#ifdef MB_ENABLE_USERTYPE_REF
|
||||||
MBAPI const size_t MB_SIZEOF_UTR = _MB_MEM_TAG_SIZE + sizeof(_usertype_ref_t);
|
MBAPI const size_t MB_SIZEOF_UTR = _MB_MEM_TAG_SIZE + sizeof(_usertype_ref_t);
|
||||||
#endif /* MB_ENABLE_USERTYPE_REF */
|
#endif /* MB_ENABLE_USERTYPE_REF */
|
||||||
|
MBAPI const size_t MB_SIZEOF_FUN = _MB_MEM_TAG_SIZE + sizeof(_func_t);
|
||||||
|
MBAPI const size_t MB_SIZEOF_VAR = _MB_MEM_TAG_SIZE + sizeof(_var_t);
|
||||||
MBAPI const size_t MB_SIZEOF_ARR = _MB_MEM_TAG_SIZE + sizeof(_array_t);
|
MBAPI const size_t MB_SIZEOF_ARR = _MB_MEM_TAG_SIZE + sizeof(_array_t);
|
||||||
MBAPI const size_t MB_SIZEOF_LBL = _MB_MEM_TAG_SIZE + sizeof(_label_t);
|
|
||||||
#ifdef MB_ENABLE_COLLECTION_LIB
|
#ifdef MB_ENABLE_COLLECTION_LIB
|
||||||
MBAPI const size_t MB_SIZEOF_LST = _MB_MEM_TAG_SIZE + sizeof(_list_t);
|
MBAPI const size_t MB_SIZEOF_LST = _MB_MEM_TAG_SIZE + sizeof(_list_t);
|
||||||
MBAPI const size_t MB_SIZEOF_DCT = _MB_MEM_TAG_SIZE + sizeof(_dict_t);
|
MBAPI const size_t MB_SIZEOF_DCT = _MB_MEM_TAG_SIZE + sizeof(_dict_t);
|
||||||
#endif /* MB_ENABLE_COLLECTION_LIB */
|
#endif /* MB_ENABLE_COLLECTION_LIB */
|
||||||
MBAPI const size_t MB_SIZEOF_RTN = _MB_MEM_TAG_SIZE + sizeof(_routine_t);
|
MBAPI const size_t MB_SIZEOF_LBL = _MB_MEM_TAG_SIZE + sizeof(_label_t);
|
||||||
#ifdef MB_ENABLE_CLASS
|
#ifdef MB_ENABLE_CLASS
|
||||||
MBAPI const size_t MB_SIZEOF_CLS = _MB_MEM_TAG_SIZE + sizeof(_class_t);
|
MBAPI const size_t MB_SIZEOF_CLS = _MB_MEM_TAG_SIZE + sizeof(_class_t);
|
||||||
#endif /* MB_ENABLE_CLASS */
|
#endif /* MB_ENABLE_CLASS */
|
||||||
|
MBAPI const size_t MB_SIZEOF_RTN = _MB_MEM_TAG_SIZE + sizeof(_routine_t);
|
||||||
#else /* MB_ENABLE_ALLOC_STAT */
|
#else /* MB_ENABLE_ALLOC_STAT */
|
||||||
MBAPI const size_t MB_SIZEOF_INT = sizeof(int);
|
MBAPI const size_t MB_SIZEOF_INT = sizeof(int);
|
||||||
MBAPI const size_t MB_SIZEOF_PTR = sizeof(intptr_t);
|
MBAPI const size_t MB_SIZEOF_PTR = sizeof(intptr_t);
|
||||||
@ -621,21 +629,21 @@ MBAPI const size_t MB_SIZEOF_LSN = sizeof(_ls_node_t);
|
|||||||
MBAPI const size_t MB_SIZEOF_HTN = sizeof(_ht_node_t);
|
MBAPI const size_t MB_SIZEOF_HTN = sizeof(_ht_node_t);
|
||||||
MBAPI const size_t MB_SIZEOF_HTA = sizeof(_ht_node_t*) * _HT_ARRAY_SIZE_DEFAULT;
|
MBAPI const size_t MB_SIZEOF_HTA = sizeof(_ht_node_t*) * _HT_ARRAY_SIZE_DEFAULT;
|
||||||
MBAPI const size_t MB_SIZEOF_OBJ = sizeof(_object_t);
|
MBAPI const size_t MB_SIZEOF_OBJ = sizeof(_object_t);
|
||||||
MBAPI const size_t MB_SIZEOF_FUN = sizeof(_func_t);
|
|
||||||
MBAPI const size_t MB_SIZEOF_VAR = sizeof(_var_t);
|
|
||||||
#ifdef MB_ENABLE_USERTYPE_REF
|
#ifdef MB_ENABLE_USERTYPE_REF
|
||||||
MBAPI const size_t MB_SIZEOF_UTR = sizeof(_usertype_ref_t);
|
MBAPI const size_t MB_SIZEOF_UTR = sizeof(_usertype_ref_t);
|
||||||
#endif /* MB_ENABLE_USERTYPE_REF */
|
#endif /* MB_ENABLE_USERTYPE_REF */
|
||||||
|
MBAPI const size_t MB_SIZEOF_FUN = sizeof(_func_t);
|
||||||
|
MBAPI const size_t MB_SIZEOF_VAR = sizeof(_var_t);
|
||||||
MBAPI const size_t MB_SIZEOF_ARR = sizeof(_array_t);
|
MBAPI const size_t MB_SIZEOF_ARR = sizeof(_array_t);
|
||||||
MBAPI const size_t MB_SIZEOF_LBL = sizeof(_label_t);
|
|
||||||
#ifdef MB_ENABLE_COLLECTION_LIB
|
#ifdef MB_ENABLE_COLLECTION_LIB
|
||||||
MBAPI const size_t MB_SIZEOF_LST = sizeof(_list_t);
|
MBAPI const size_t MB_SIZEOF_LST = sizeof(_list_t);
|
||||||
MBAPI const size_t MB_SIZEOF_DCT = sizeof(_dict_t);
|
MBAPI const size_t MB_SIZEOF_DCT = sizeof(_dict_t);
|
||||||
#endif /* MB_ENABLE_COLLECTION_LIB */
|
#endif /* MB_ENABLE_COLLECTION_LIB */
|
||||||
MBAPI const size_t MB_SIZEOF_RTN = sizeof(_routine_t);
|
MBAPI const size_t MB_SIZEOF_LBL = sizeof(_label_t);
|
||||||
#ifdef MB_ENABLE_CLASS
|
#ifdef MB_ENABLE_CLASS
|
||||||
MBAPI const size_t MB_SIZEOF_CLS = sizeof(_class_t);
|
MBAPI const size_t MB_SIZEOF_CLS = sizeof(_class_t);
|
||||||
#endif /* MB_ENABLE_CLASS */
|
#endif /* MB_ENABLE_CLASS */
|
||||||
|
MBAPI const size_t MB_SIZEOF_RTN = sizeof(_routine_t);
|
||||||
#endif /* MB_ENABLE_ALLOC_STAT */
|
#endif /* MB_ENABLE_ALLOC_STAT */
|
||||||
|
|
||||||
#ifdef MB_ENABLE_SOURCE_TRACE
|
#ifdef MB_ENABLE_SOURCE_TRACE
|
||||||
@ -1256,17 +1264,24 @@ 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);
|
||||||
static void _end_of_file(_parsing_context_t* context);
|
static void _end_of_file(_parsing_context_t* context);
|
||||||
|
|
||||||
static bool_t _is_blank(char c);
|
#define _ZERO_CHAR '\0'
|
||||||
static bool_t _is_eof(char c);
|
#define _NEWLINE_CHAR '\n'
|
||||||
static bool_t _is_newline(char c);
|
#define _RETURN_CHAR '\r'
|
||||||
static bool_t _is_separator(char c);
|
#define _STRING_POSTFIX '$'
|
||||||
static bool_t _is_bracket(char c);
|
#define _DUMMY_ASSIGN "#"
|
||||||
static bool_t _is_quotation_mark(char c);
|
|
||||||
static bool_t _is_comment(char c);
|
static bool_t _is_blank_char(char c);
|
||||||
static bool_t _is_accessor(char c);
|
static bool_t _is_eof_char(char c);
|
||||||
|
static bool_t _is_newline_char(char c);
|
||||||
|
static bool_t _is_separator_char(char c);
|
||||||
|
static bool_t _is_bracket_char(char c);
|
||||||
|
static bool_t _is_quotation_char(char c);
|
||||||
|
static bool_t _is_comment_char(char c);
|
||||||
|
static bool_t _is_accessor_char(char c);
|
||||||
static bool_t _is_numeric_char(char c);
|
static bool_t _is_numeric_char(char c);
|
||||||
static bool_t _is_identifier_char(char c);
|
static bool_t _is_identifier_char(char c);
|
||||||
static bool_t _is_operator_char(char c);
|
static bool_t _is_operator_char(char c);
|
||||||
|
static bool_t _is_exponential_char(char c);
|
||||||
static bool_t _is_using_char(char c);
|
static bool_t _is_using_char(char c);
|
||||||
static bool_t _is_exponent_prefix(char* s, int begin, int end);
|
static bool_t _is_exponent_prefix(char* s, int begin, int end);
|
||||||
|
|
||||||
@ -1454,9 +1469,11 @@ static char* _extract_string(_object_t* obj);
|
|||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _HAS_REF_OBJ_LOCK
|
||||||
static bool_t _lock_ref_object(_lock_t* lk, _ref_t* ref, void* obj);
|
static bool_t _lock_ref_object(_lock_t* lk, _ref_t* ref, void* obj);
|
||||||
static bool_t _unlock_ref_object(_lock_t* lk, _ref_t* ref, void* obj);
|
static bool_t _unlock_ref_object(_lock_t* lk, _ref_t* ref, void* obj);
|
||||||
static bool_t _write_on_ref_object(_lock_t* lk, _ref_t* ref, void* obj);
|
static bool_t _write_on_ref_object(_lock_t* lk, _ref_t* ref, void* obj);
|
||||||
|
#endif /* _HAS_REF_OBJ_LOCK */
|
||||||
|
|
||||||
static _ref_count_t _ref(_ref_t* ref, void* data);
|
static _ref_count_t _ref(_ref_t* ref, void* data);
|
||||||
static bool_t _unref(_ref_t* ref, void* data);
|
static bool_t _unref(_ref_t* ref, void* data);
|
||||||
@ -1837,7 +1854,7 @@ static int _coll_move_next(mb_interpreter_t* s, void** l);
|
|||||||
|
|
||||||
/** Lib information */
|
/** Lib information */
|
||||||
static const _func_t _core_libs[] = {
|
static const _func_t _core_libs[] = {
|
||||||
{ "#", _core_dummy_assign },
|
{ _DUMMY_ASSIGN, _core_dummy_assign },
|
||||||
{ "+", _core_add },
|
{ "+", _core_add },
|
||||||
{ "-", _core_min },
|
{ "-", _core_min },
|
||||||
{ "*", _core_mul },
|
{ "*", _core_mul },
|
||||||
@ -2973,7 +2990,7 @@ static int mb_uu_substr(char* ch, int begin, int count, char** o) {
|
|||||||
l = (int)(e - b);
|
l = (int)(e - b);
|
||||||
*o = (char*)mb_malloc(l + 1);
|
*o = (char*)mb_malloc(l + 1);
|
||||||
memcpy(*o, b, l);
|
memcpy(*o, b, l);
|
||||||
(*o)[l] = '\0';
|
(*o)[l] = _ZERO_CHAR;
|
||||||
|
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
@ -3053,7 +3070,7 @@ static bool_t _is_binary(mb_func_t op) {
|
|||||||
|
|
||||||
static char _get_priority(mb_func_t op1, mb_func_t op2) {
|
static char _get_priority(mb_func_t op1, mb_func_t op2) {
|
||||||
/* Get the priority of two operators */
|
/* Get the priority of two operators */
|
||||||
char result = '\0';
|
char result = _ZERO_CHAR;
|
||||||
int idx1 = 0;
|
int idx1 = 0;
|
||||||
int idx2 = 0;
|
int idx2 = 0;
|
||||||
|
|
||||||
@ -3179,7 +3196,7 @@ static int _calc_expression(mb_interpreter_t* s, _ls_node_t** l, _object_t** val
|
|||||||
_object_t* b = 0;
|
_object_t* b = 0;
|
||||||
_object_t* r = 0;
|
_object_t* r = 0;
|
||||||
_object_t* theta = 0;
|
_object_t* theta = 0;
|
||||||
char pri = '\0';
|
char pri = _ZERO_CHAR;
|
||||||
int* inep = 0;
|
int* inep = 0;
|
||||||
int f = 0;
|
int f = 0;
|
||||||
|
|
||||||
@ -3221,8 +3238,8 @@ static int _calc_expression(mb_interpreter_t* s, _ls_node_t** l, _object_t** val
|
|||||||
ast = ast->next;
|
ast = ast->next;
|
||||||
_ls_pushback(optr, _exp_assign);
|
_ls_pushback(optr, _exp_assign);
|
||||||
while(
|
while(
|
||||||
!(c->type == _DT_FUNC && strcmp(c->data.func->name, "#") == 0) ||
|
!(c->type == _DT_FUNC && strcmp(c->data.func->name, _DUMMY_ASSIGN) == 0) ||
|
||||||
!(((_object_t*)(_ls_back(optr)->data))->type == _DT_FUNC && strcmp(((_object_t*)(_ls_back(optr)->data))->data.func->name, "#") == 0)) {
|
!(((_object_t*)(_ls_back(optr)->data))->type == _DT_FUNC && strcmp(((_object_t*)(_ls_back(optr)->data))->data.func->name, _DUMMY_ASSIGN) == 0)) {
|
||||||
if(!hack) {
|
if(!hack) {
|
||||||
if(_IS_FUNC(c, _core_open_bracket)) {
|
if(_IS_FUNC(c, _core_open_bracket)) {
|
||||||
++bracket_count;
|
++bracket_count;
|
||||||
@ -4189,7 +4206,7 @@ static char* _load_file(mb_interpreter_t* s, const char* f, const char* prefix)
|
|||||||
}
|
}
|
||||||
fread(buf + i, 1, l, fp);
|
fread(buf + i, 1, l, fp);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
buf[l] = '\0';
|
buf[l] = _ZERO_CHAR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4205,7 +4222,7 @@ static void _end_of_file(_parsing_context_t* context) {
|
|||||||
context->parsing_state = _PS_NORMAL;
|
context->parsing_state = _PS_NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_blank(char c) {
|
static bool_t _is_blank_char(char c) {
|
||||||
/* Determine whether a character is blank */
|
/* Determine whether a character is blank */
|
||||||
return
|
return
|
||||||
(c == ' ') || (c == '\t') ||
|
(c == ' ') || (c == '\t') ||
|
||||||
@ -4213,44 +4230,44 @@ static bool_t _is_blank(char c) {
|
|||||||
(c == -2) || (c == -1);
|
(c == -2) || (c == -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_eof(char c) {
|
static bool_t _is_eof_char(char c) {
|
||||||
/* Determine whether a character is end of file */
|
/* Determine whether a character is end of file */
|
||||||
return (c == EOF);
|
return (c == EOF);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_newline(char c) {
|
static bool_t _is_newline_char(char c) {
|
||||||
/* Determine whether a character is newline */
|
/* Determine whether a character is newline */
|
||||||
return (c == '\r') || (c == '\n') || _is_eof(c);
|
return (c == _RETURN_CHAR) || (c == _NEWLINE_CHAR) || _is_eof_char(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_separator(char c) {
|
static bool_t _is_separator_char(char c) {
|
||||||
/* Determine whether a character is separator */
|
/* Determine whether a character is separator */
|
||||||
return (c == ',') || (c == ';') || (c == ':');
|
return (c == ',') || (c == ';') || (c == ':');
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_bracket(char c) {
|
static bool_t _is_bracket_char(char c) {
|
||||||
/* Determine whether a character is bracket */
|
/* Determine whether a character is bracket */
|
||||||
return (c == '(') || (c == ')');
|
return (c == '(') || (c == ')');
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_quotation_mark(char c) {
|
static bool_t _is_quotation_char(char c) {
|
||||||
/* Determine whether a character is quotation mark */
|
/* Determine whether a character is quotation mark */
|
||||||
return (c == '"');
|
return (c == '"');
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_comment(char c) {
|
static bool_t _is_comment_char(char c) {
|
||||||
/* Determine whether a character is comment mark */
|
/* Determine whether a character is comment mark */
|
||||||
return (c == '\'');
|
return (c == '\'');
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_accessor(char c) {
|
static bool_t _is_accessor_char(char c) {
|
||||||
/* Determine whether a character is accessor char */
|
/* Determine whether a character is accessor char */
|
||||||
return (c == '.');
|
return (c == '.');
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_numeric_char(char c) {
|
static bool_t _is_numeric_char(char c) {
|
||||||
/* Determine whether a character is numeric char */
|
/* Determine whether a character is numeric char */
|
||||||
return (c >= '0' && c <= '9') || _is_accessor(c);
|
return (c >= '0' && c <= '9') || _is_accessor_char(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_identifier_char(char c) {
|
static bool_t _is_identifier_char(char c) {
|
||||||
@ -4259,7 +4276,7 @@ static bool_t _is_identifier_char(char c) {
|
|||||||
(c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
|
(c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
|
||||||
(c == '_') ||
|
(c == '_') ||
|
||||||
_is_numeric_char(c) ||
|
_is_numeric_char(c) ||
|
||||||
(c == '$');
|
(c == _STRING_POSTFIX);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool_t _is_operator_char(char c) {
|
static bool_t _is_operator_char(char c) {
|
||||||
@ -4272,6 +4289,11 @@ static bool_t _is_operator_char(char c) {
|
|||||||
(c == '>') || (c == '<');
|
(c == '>') || (c == '<');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool_t _is_exponential_char(char c) {
|
||||||
|
/* Determine whether a character is a exponential char */
|
||||||
|
return (c == 'e') || (c == 'E');
|
||||||
|
}
|
||||||
|
|
||||||
static bool_t _is_using_char(char c) {
|
static bool_t _is_using_char(char c) {
|
||||||
/* Determine whether a character is module using char */
|
/* Determine whether a character is module using char */
|
||||||
return (c == '@');
|
return (c == '@');
|
||||||
@ -4303,7 +4325,7 @@ static int _append_char_to_symbol(mb_interpreter_t* s, char c) {
|
|||||||
|
|
||||||
context = s->parsing_context;
|
context = s->parsing_context;
|
||||||
|
|
||||||
if(_is_accessor(c))
|
if(_is_accessor_char(c))
|
||||||
context->current_symbol_contains_accessor++;
|
context->current_symbol_contains_accessor++;
|
||||||
|
|
||||||
if(context->current_symbol_nonius + 1 >= _SINGLE_SYMBOL_MAX_LENGTH) {
|
if(context->current_symbol_nonius + 1 >= _SINGLE_SYMBOL_MAX_LENGTH) {
|
||||||
@ -4329,7 +4351,7 @@ static int _cut_symbol(mb_interpreter_t* s, int pos, unsigned short row, unsigne
|
|||||||
mb_assert(s);
|
mb_assert(s);
|
||||||
|
|
||||||
context = s->parsing_context;
|
context = s->parsing_context;
|
||||||
if(context->current_symbol_nonius && context->current_symbol[0] != '\0') {
|
if(context->current_symbol_nonius && context->current_symbol[0] != _ZERO_CHAR) {
|
||||||
sym = (char*)mb_malloc(context->current_symbol_nonius + 1);
|
sym = (char*)mb_malloc(context->current_symbol_nonius + 1);
|
||||||
memcpy(sym, context->current_symbol, context->current_symbol_nonius + 1);
|
memcpy(sym, context->current_symbol, context->current_symbol_nonius + 1);
|
||||||
|
|
||||||
@ -4450,7 +4472,7 @@ static int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object
|
|||||||
size_t _sl = strlen(sym);
|
size_t _sl = strlen(sym);
|
||||||
(*obj)->data.string = (char*)mb_malloc(_sl - 2 + 1);
|
(*obj)->data.string = (char*)mb_malloc(_sl - 2 + 1);
|
||||||
memcpy((*obj)->data.string, sym + sizeof(char), _sl - 2);
|
memcpy((*obj)->data.string, sym + sizeof(char), _sl - 2);
|
||||||
(*obj)->data.string[_sl - 2] = '\0';
|
(*obj)->data.string[_sl - 2] = _ZERO_CHAR;
|
||||||
*delsym = true;
|
*delsym = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4580,7 +4602,7 @@ static int _create_symbol(mb_interpreter_t* s, _ls_node_t* l, char* sym, _object
|
|||||||
memset(tmp.var, 0, sizeof(_var_t));
|
memset(tmp.var, 0, sizeof(_var_t));
|
||||||
tmp.var->name = sym;
|
tmp.var->name = sym;
|
||||||
tmp.var->data = _create_object();
|
tmp.var->data = _create_object();
|
||||||
tmp.var->data->type = (sym[strlen(sym) - 1] == '$') ? _DT_STRING : _DT_INT;
|
tmp.var->data->type = (sym[strlen(sym) - 1] == _STRING_POSTFIX) ? _DT_STRING : _DT_INT;
|
||||||
tmp.var->data->data.integer = 0;
|
tmp.var->data->data.integer = 0;
|
||||||
#ifdef MB_ENABLE_CLASS
|
#ifdef MB_ENABLE_CLASS
|
||||||
if(context->class_state != _CLASS_STATE_NONE)
|
if(context->class_state != _CLASS_STATE_NONE)
|
||||||
@ -4667,7 +4689,7 @@ static _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) {
|
|||||||
|
|
||||||
/* int_t */
|
/* int_t */
|
||||||
tmp.integer = (int_t)mb_strtol(sym, &conv_suc, 0);
|
tmp.integer = (int_t)mb_strtol(sym, &conv_suc, 0);
|
||||||
if(*conv_suc == '\0') {
|
if(*conv_suc == _ZERO_CHAR) {
|
||||||
memcpy(*value, tmp.any, sizeof(_raw_t));
|
memcpy(*value, tmp.any, sizeof(_raw_t));
|
||||||
|
|
||||||
result = _DT_INT;
|
result = _DT_INT;
|
||||||
@ -4676,7 +4698,7 @@ static _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) {
|
|||||||
}
|
}
|
||||||
/* real_t */
|
/* real_t */
|
||||||
tmp.float_point = (real_t)mb_strtod(sym, &conv_suc);
|
tmp.float_point = (real_t)mb_strtod(sym, &conv_suc);
|
||||||
if(*conv_suc == '\0') {
|
if(*conv_suc == _ZERO_CHAR) {
|
||||||
memcpy(*value, tmp.any, sizeof(_raw_t));
|
memcpy(*value, tmp.any, sizeof(_raw_t));
|
||||||
|
|
||||||
result = _DT_REAL;
|
result = _DT_REAL;
|
||||||
@ -4684,7 +4706,7 @@ static _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) {
|
|||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
/* String */
|
/* String */
|
||||||
if(sym[0] == '"' && sym[_sl - 1] == '"' && _sl >= 2) {
|
if(_is_quotation_char(sym[0]) && _is_quotation_char(sym[_sl - 1]) && _sl >= 2) {
|
||||||
result = _DT_STRING;
|
result = _DT_STRING;
|
||||||
|
|
||||||
if(context->last_symbol && _IS_FUNC(context->last_symbol, _core_import)) {
|
if(context->last_symbol && _IS_FUNC(context->last_symbol, _core_import)) {
|
||||||
@ -4696,7 +4718,7 @@ static _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) {
|
|||||||
memset(context->current_symbol, 0, sizeof(current_symbol));
|
memset(context->current_symbol, 0, sizeof(current_symbol));
|
||||||
context->current_symbol_nonius = 0;
|
context->current_symbol_nonius = 0;
|
||||||
context->last_symbol = 0;
|
context->last_symbol = 0;
|
||||||
sym[_sl - 1] = '\0';
|
sym[_sl - 1] = _ZERO_CHAR;
|
||||||
context->parsing_state = _PS_NORMAL;
|
context->parsing_state = _PS_NORMAL;
|
||||||
/* Using a module */
|
/* Using a module */
|
||||||
if(_is_using_char(*(sym + 1))) {
|
if(_is_using_char(*(sym + 1))) {
|
||||||
@ -4738,7 +4760,7 @@ static _data_e _get_symbol_type(mb_interpreter_t* s, char* sym, _raw_t* value) {
|
|||||||
|
|
||||||
_end_import:
|
_end_import:
|
||||||
context->parsing_state = _PS_STRING;
|
context->parsing_state = _PS_STRING;
|
||||||
sym[_sl - 1] = '\"';
|
sym[_sl - 1] = '"';
|
||||||
context->current_symbol_nonius = n;
|
context->current_symbol_nonius = n;
|
||||||
memcpy(context->current_symbol, current_symbol, sizeof(current_symbol));
|
memcpy(context->current_symbol, current_symbol, sizeof(current_symbol));
|
||||||
result = _DT_NIL;
|
result = _DT_NIL;
|
||||||
@ -4747,7 +4769,7 @@ _end_import:
|
|||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
/* Nil */
|
/* Nil */
|
||||||
if(!strcmp(sym, "NIL")) {
|
if(!strcmp(sym, MB_NIL)) {
|
||||||
tmp.integer = ~0;
|
tmp.integer = ~0;
|
||||||
memcpy(*value, tmp.any, sizeof(_raw_t));
|
memcpy(*value, tmp.any, sizeof(_raw_t));
|
||||||
|
|
||||||
@ -4767,7 +4789,7 @@ _end_import:
|
|||||||
}
|
}
|
||||||
if(context->last_symbol && _IS_FUNC(context->last_symbol, _core_dim)) {
|
if(context->last_symbol && _IS_FUNC(context->last_symbol, _core_dim)) {
|
||||||
#ifdef MB_SIMPLE_ARRAY
|
#ifdef MB_SIMPLE_ARRAY
|
||||||
en = (sym[_sl - 1] == '$' ? _DT_STRING : _DT_REAL);
|
en = (sym[_sl - 1] == _STRING_POSTFIX ? _DT_STRING : _DT_REAL);
|
||||||
#else /* MB_SIMPLE_ARRAY */
|
#else /* MB_SIMPLE_ARRAY */
|
||||||
en = _DT_REAL;
|
en = _DT_REAL;
|
||||||
#endif /* MB_SIMPLE_ARRAY */
|
#endif /* MB_SIMPLE_ARRAY */
|
||||||
@ -4823,7 +4845,7 @@ _end_import:
|
|||||||
}
|
}
|
||||||
#endif /* MB_ENABLE_CLASS */
|
#endif /* MB_ENABLE_CLASS */
|
||||||
/* _routine_t */
|
/* _routine_t */
|
||||||
if(context->last_symbol && !_is_bracket(sym[0])) {
|
if(context->last_symbol && !_is_bracket_char(sym[0])) {
|
||||||
glbsyminscope = _search_identifier_in_scope_chain(s, 0, sym, 0, 0, 0);
|
glbsyminscope = _search_identifier_in_scope_chain(s, 0, sym, 0, 0, 0);
|
||||||
if(glbsyminscope && ((_object_t*)glbsyminscope->data)->type == _DT_ROUTINE) {
|
if(glbsyminscope && ((_object_t*)glbsyminscope->data)->type == _DT_ROUTINE) {
|
||||||
if(_IS_FUNC(context->last_symbol, _core_def))
|
if(_IS_FUNC(context->last_symbol, _core_def))
|
||||||
@ -4914,7 +4936,7 @@ _end_import:
|
|||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
/* Separator */
|
/* Separator */
|
||||||
if(_sl == 1 && _is_separator(sym[0])) {
|
if(_sl == 1 && _is_separator_char(sym[0])) {
|
||||||
result = _DT_SEP;
|
result = _DT_SEP;
|
||||||
|
|
||||||
goto _exit;
|
goto _exit;
|
||||||
@ -4959,7 +4981,7 @@ static int _parse_char(mb_interpreter_t* s, char c, int pos, unsigned short row,
|
|||||||
/* Parse a character */
|
/* Parse a character */
|
||||||
int result = MB_FUNC_OK;
|
int result = MB_FUNC_OK;
|
||||||
_parsing_context_t* context = 0;
|
_parsing_context_t* context = 0;
|
||||||
char last_char = '\0';
|
char last_char = _ZERO_CHAR;
|
||||||
|
|
||||||
mb_assert(s && s->parsing_context);
|
mb_assert(s && s->parsing_context);
|
||||||
|
|
||||||
@ -4972,21 +4994,21 @@ static int _parse_char(mb_interpreter_t* s, char c, int pos, unsigned short row,
|
|||||||
case _PS_NORMAL:
|
case _PS_NORMAL:
|
||||||
c = toupper(c);
|
c = toupper(c);
|
||||||
|
|
||||||
if(_is_blank(c)) { /* \t ' ' */
|
if(_is_blank_char(c)) { /* \t space */
|
||||||
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
||||||
} else if(_is_newline(c)) { /* \r \n EOF */
|
} else if(_is_newline_char(c)) { /* \r \n EOF */
|
||||||
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
||||||
_mb_check(result = _append_char_to_symbol(s, MB_EOS), _exit);
|
_mb_check(result = _append_char_to_symbol(s, MB_EOS), _exit);
|
||||||
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
||||||
} else if(_is_separator(c) || _is_bracket(c)) { /* , ; : ( ) */
|
} else if(_is_separator_char(c) || _is_bracket_char(c)) { /* , ; : ( ) */
|
||||||
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
||||||
_mb_check(result = _append_char_to_symbol(s, c), _exit);
|
_mb_check(result = _append_char_to_symbol(s, c), _exit);
|
||||||
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
||||||
} else if(_is_quotation_mark(c)) { /* " */
|
} else if(_is_quotation_char(c)) { /* " */
|
||||||
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
||||||
_mb_check(result = _append_char_to_symbol(s, c), _exit);
|
_mb_check(result = _append_char_to_symbol(s, c), _exit);
|
||||||
context->parsing_state = _PS_STRING;
|
context->parsing_state = _PS_STRING;
|
||||||
} else if(_is_comment(c)) { /* ' */
|
} else if(_is_comment_char(c)) { /* ' */
|
||||||
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
||||||
_mb_check(result = _append_char_to_symbol(s, MB_EOS), _exit);
|
_mb_check(result = _append_char_to_symbol(s, MB_EOS), _exit);
|
||||||
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
||||||
@ -4997,7 +5019,7 @@ static int _parse_char(mb_interpreter_t* s, char c, int pos, unsigned short row,
|
|||||||
if(_is_identifier_char(c)) {
|
if(_is_identifier_char(c)) {
|
||||||
_mb_check(result = _append_char_to_symbol(s, c), _exit);
|
_mb_check(result = _append_char_to_symbol(s, c), _exit);
|
||||||
} else if(_is_operator_char(c)) {
|
} else if(_is_operator_char(c)) {
|
||||||
if(_is_exponent_prefix(context->current_symbol, 0, context->current_symbol_nonius - 2) && (last_char == 'e' || last_char == 'E') && c == '-') {
|
if(_is_exponent_prefix(context->current_symbol, 0, context->current_symbol_nonius - 2) && _is_exponential_char(last_char) && c == '-') {
|
||||||
_mb_check(result = _append_char_to_symbol(s, c), _exit);
|
_mb_check(result = _append_char_to_symbol(s, c), _exit);
|
||||||
} else {
|
} else {
|
||||||
context->symbol_state = _SS_OPERATOR;
|
context->symbol_state = _SS_OPERATOR;
|
||||||
@ -5026,7 +5048,7 @@ static int _parse_char(mb_interpreter_t* s, char c, int pos, unsigned short row,
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case _PS_STRING:
|
case _PS_STRING:
|
||||||
if(_is_quotation_mark(c)) { /* " */
|
if(_is_quotation_char(c)) { /* " */
|
||||||
_mb_check(result = _append_char_to_symbol(s, c), _exit);
|
_mb_check(result = _append_char_to_symbol(s, c), _exit);
|
||||||
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
_mb_check(result = _cut_symbol(s, pos, row, col), _exit);
|
||||||
context->parsing_state = _PS_NORMAL;
|
context->parsing_state = _PS_NORMAL;
|
||||||
@ -5036,7 +5058,7 @@ static int _parse_char(mb_interpreter_t* s, char c, int pos, unsigned short row,
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case _PS_COMMENT:
|
case _PS_COMMENT:
|
||||||
if(_is_eof(c)) { /* EOF */
|
if(_is_eof_char(c)) { /* EOF */
|
||||||
context->parsing_state = _PS_NORMAL;
|
context->parsing_state = _PS_NORMAL;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -5053,17 +5075,17 @@ static int _parse_char(mb_interpreter_t* s, char c, int pos, unsigned short row,
|
|||||||
} else {
|
} else {
|
||||||
context->multi_line_comment_count = 0;
|
context->multi_line_comment_count = 0;
|
||||||
}
|
}
|
||||||
if(_is_newline(c)) /* \r \n EOF */
|
if(_is_newline_char(c)) /* \r \n EOF */
|
||||||
context->parsing_state = _PS_NORMAL;
|
context->parsing_state = _PS_NORMAL;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case _PS_MULTI_LINE_COMMENT:
|
case _PS_MULTI_LINE_COMMENT:
|
||||||
if(_is_eof(c)) { /* EOF */
|
if(_is_eof_char(c)) { /* EOF */
|
||||||
context->parsing_state = _PS_NORMAL;
|
context->parsing_state = _PS_NORMAL;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if(_is_comment(c) && context->multi_line_comment_count == 0) {
|
if(_is_comment_char(c) && context->multi_line_comment_count == 0) {
|
||||||
context->multi_line_comment_count = 1;
|
context->multi_line_comment_count = 1;
|
||||||
} else if(context->multi_line_comment_count != 0 && c == _MULTI_LINE_COMMENT_POSTFIX[context->multi_line_comment_count++]) {
|
} else if(context->multi_line_comment_count != 0 && c == _MULTI_LINE_COMMENT_POSTFIX[context->multi_line_comment_count++]) {
|
||||||
if(context->multi_line_comment_count >= _countof(_MULTI_LINE_COMMENT_POSTFIX) - 1) {
|
if(context->multi_line_comment_count >= _countof(_MULTI_LINE_COMMENT_POSTFIX) - 1) {
|
||||||
@ -5273,6 +5295,7 @@ static char* _extract_string(_object_t* obj) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef _HAS_REF_OBJ_LOCK
|
||||||
static bool_t _lock_ref_object(_lock_t* lk, _ref_t* ref, void* obj) {
|
static bool_t _lock_ref_object(_lock_t* lk, _ref_t* ref, void* obj) {
|
||||||
/* Lock a referenced object */
|
/* Lock a referenced object */
|
||||||
mb_assert(lk);
|
mb_assert(lk);
|
||||||
@ -5318,6 +5341,7 @@ static bool_t _write_on_ref_object(_lock_t* lk, _ref_t* ref, void* obj) {
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
#endif /* _HAS_REF_OBJ_LOCK */
|
||||||
|
|
||||||
static _ref_count_t _ref(_ref_t* ref, void* data) {
|
static _ref_count_t _ref(_ref_t* ref, void* data) {
|
||||||
/* Increase the reference of a stub by 1 */
|
/* Increase the reference of a stub by 1 */
|
||||||
@ -6325,7 +6349,7 @@ static _dict_it_t* _create_dict_it(_dict_t* coll, bool_t lock) {
|
|||||||
result->dict = coll;
|
result->dict = coll;
|
||||||
result->locking = lock;
|
result->locking = lock;
|
||||||
result->curr_bucket = 0;
|
result->curr_bucket = 0;
|
||||||
result->curr_node = (_ls_node_t*)(intptr_t)~0;
|
result->curr_node = _INVALID_DICT_IT;
|
||||||
if(lock)
|
if(lock)
|
||||||
_lock_ref_object(&coll->lock, &coll->ref, coll);
|
_lock_ref_object(&coll->lock, &coll->ref, coll);
|
||||||
_weak_ref(&coll->ref, coll, &result->weak_ref);
|
_weak_ref(&coll->ref, coll, &result->weak_ref);
|
||||||
@ -6356,12 +6380,12 @@ static _dict_it_t* _move_dict_it_next(_dict_it_t* it) {
|
|||||||
if(!it->dict->lock)
|
if(!it->dict->lock)
|
||||||
goto _exit;
|
goto _exit;
|
||||||
|
|
||||||
if(it->curr_node && it->curr_node != (_ls_node_t*)(intptr_t)~0) {
|
if(it->curr_node && it->curr_node != _INVALID_DICT_IT) {
|
||||||
it->curr_node = it->curr_node->next;
|
it->curr_node = it->curr_node->next;
|
||||||
if(!it->curr_node)
|
if(!it->curr_node)
|
||||||
++it->curr_bucket;
|
++it->curr_bucket;
|
||||||
}
|
}
|
||||||
if(!it->curr_node || it->curr_node == (_ls_node_t*)(intptr_t)~0) {
|
if(!it->curr_node || it->curr_node == _INVALID_DICT_IT) {
|
||||||
for( ; it->curr_bucket < it->dict->dict->array_size; ++it->curr_bucket) {
|
for( ; it->curr_bucket < it->dict->dict->array_size; ++it->curr_bucket) {
|
||||||
it->curr_node = it->dict->dict->array[it->curr_bucket];
|
it->curr_node = it->dict->dict->array[it->curr_bucket];
|
||||||
if(it->curr_node && it->curr_node->next) {
|
if(it->curr_node && it->curr_node->next) {
|
||||||
@ -7222,7 +7246,7 @@ static bool_t _is_valid_class_accessor_following_routine(mb_interpreter_t* s, _v
|
|||||||
|
|
||||||
if(out) *out = 0;
|
if(out) *out = 0;
|
||||||
|
|
||||||
if(_is_accessor(*var->name) && (ast && ast->prev && _IS_FUNC(ast->prev->data, _core_close_bracket)) && running->intermediate_value.type == MB_DT_CLASS) {
|
if(_is_accessor_char(*var->name) && (ast && ast->prev && _IS_FUNC(ast->prev->data, _core_close_bracket)) && running->intermediate_value.type == MB_DT_CLASS) {
|
||||||
_class_t* instance = (_class_t*)running->intermediate_value.value.instance;
|
_class_t* instance = (_class_t*)running->intermediate_value.value.instance;
|
||||||
_ls_node_t* fn = _search_identifier_in_class(s, instance, var->name + 1, 0, 0);
|
_ls_node_t* fn = _search_identifier_in_class(s, instance, var->name + 1, 0, 0);
|
||||||
result = true;
|
result = true;
|
||||||
@ -7778,8 +7802,8 @@ static _ls_node_t* _search_identifier_accessor(mb_interpreter_t* s, _running_con
|
|||||||
|
|
||||||
while((i == 0) || (i > 0 && n[i - 1])) {
|
while((i == 0) || (i > 0 && n[i - 1])) {
|
||||||
acc[j] = n[i];
|
acc[j] = n[i];
|
||||||
if(_is_accessor(acc[j]) || acc[j] == '\0') {
|
if(_is_accessor_char(acc[j]) || acc[j] == _ZERO_CHAR) {
|
||||||
acc[j] = '\0';
|
acc[j] = _ZERO_CHAR;
|
||||||
if(instance)
|
if(instance)
|
||||||
result = _search_identifier_in_class(s, instance, acc, ht, sp);
|
result = _search_identifier_in_class(s, instance, acc, ht, sp);
|
||||||
else
|
else
|
||||||
@ -9937,9 +9961,9 @@ static int _open_constant(mb_interpreter_t* s) {
|
|||||||
|
|
||||||
running = s->running_context;
|
running = s->running_context;
|
||||||
|
|
||||||
ul = _ht_set_or_insert(running->var_dict, "TRUE", _OBJ_BOOL_TRUE);
|
ul = _ht_set_or_insert(running->var_dict, MB_TRUE, _OBJ_BOOL_TRUE);
|
||||||
mb_assert(ul);
|
mb_assert(ul);
|
||||||
ul = _ht_set_or_insert(running->var_dict, "FALSE", _OBJ_BOOL_FALSE);
|
ul = _ht_set_or_insert(running->var_dict, MB_FALSE, _OBJ_BOOL_FALSE);
|
||||||
mb_assert(ul);
|
mb_assert(ul);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -10060,19 +10084,19 @@ int mb_init(void) {
|
|||||||
_exp_assign->type = _DT_FUNC;
|
_exp_assign->type = _DT_FUNC;
|
||||||
_exp_assign->data.func = (_func_t*)mb_malloc(sizeof(_func_t));
|
_exp_assign->data.func = (_func_t*)mb_malloc(sizeof(_func_t));
|
||||||
memset(_exp_assign->data.func, 0, sizeof(_func_t));
|
memset(_exp_assign->data.func, 0, sizeof(_func_t));
|
||||||
_exp_assign->data.func->name = (char*)mb_malloc(strlen("#") + 1);
|
_exp_assign->data.func->name = (char*)mb_malloc(strlen(_DUMMY_ASSIGN) + 1);
|
||||||
memcpy(_exp_assign->data.func->name, "#", strlen("#") + 1);
|
memcpy(_exp_assign->data.func->name, _DUMMY_ASSIGN, strlen(_DUMMY_ASSIGN) + 1);
|
||||||
_exp_assign->data.func->pointer = _core_dummy_assign;
|
_exp_assign->data.func->pointer = _core_dummy_assign;
|
||||||
|
|
||||||
mb_assert(!_OBJ_BOOL_TRUE);
|
mb_assert(!_OBJ_BOOL_TRUE);
|
||||||
if(!_OBJ_BOOL_TRUE) {
|
if(!_OBJ_BOOL_TRUE) {
|
||||||
_var_t* bvar = _create_var(&_OBJ_BOOL_TRUE, "TRUE", strlen("TRUE") + 1, true);
|
_var_t* bvar = _create_var(&_OBJ_BOOL_TRUE, MB_TRUE, strlen(MB_TRUE) + 1, true);
|
||||||
bvar->data->type = _DT_INT;
|
bvar->data->type = _DT_INT;
|
||||||
bvar->data->data.integer = 1;
|
bvar->data->data.integer = 1;
|
||||||
}
|
}
|
||||||
mb_assert(!_OBJ_BOOL_FALSE);
|
mb_assert(!_OBJ_BOOL_FALSE);
|
||||||
if(!_OBJ_BOOL_FALSE) {
|
if(!_OBJ_BOOL_FALSE) {
|
||||||
_var_t* bvar = _create_var(&_OBJ_BOOL_FALSE, "FALSE", strlen("FALSE") + 1, true);
|
_var_t* bvar = _create_var(&_OBJ_BOOL_FALSE, MB_FALSE, strlen(MB_FALSE) + 1, true);
|
||||||
bvar->data->type = _DT_INT;
|
bvar->data->type = _DT_INT;
|
||||||
bvar->data->data.integer = 0;
|
bvar->data->data.integer = 0;
|
||||||
}
|
}
|
||||||
@ -11585,7 +11609,7 @@ int mb_load_string(struct mb_interpreter_t* s, const char* l, bool_t reset) {
|
|||||||
int i = 0;
|
int i = 0;
|
||||||
unsigned short _row = 0;
|
unsigned short _row = 0;
|
||||||
unsigned short _col = 0;
|
unsigned short _col = 0;
|
||||||
char wrapped = '\0';
|
char wrapped = _ZERO_CHAR;
|
||||||
_parsing_context_t* context = 0;
|
_parsing_context_t* context = 0;
|
||||||
|
|
||||||
mb_assert(s && s->parsing_context);
|
mb_assert(s && s->parsing_context);
|
||||||
@ -11594,12 +11618,12 @@ int mb_load_string(struct mb_interpreter_t* s, const char* l, bool_t reset) {
|
|||||||
|
|
||||||
while(l[i]) {
|
while(l[i]) {
|
||||||
ch = l[i];
|
ch = l[i];
|
||||||
if((ch == '\n' || ch == '\r') && (!wrapped || wrapped == ch)) {
|
if((ch == _NEWLINE_CHAR || ch == _RETURN_CHAR) && (!wrapped || wrapped == ch)) {
|
||||||
wrapped = ch;
|
wrapped = ch;
|
||||||
++context->parsing_row;
|
++context->parsing_row;
|
||||||
context->parsing_col = 0;
|
context->parsing_col = 0;
|
||||||
} else {
|
} else {
|
||||||
wrapped = '\0';
|
wrapped = _ZERO_CHAR;
|
||||||
++context->parsing_col;
|
++context->parsing_col;
|
||||||
}
|
}
|
||||||
status = _parse_char(s, ch, context->parsing_pos, _row, _col);
|
status = _parse_char(s, ch, context->parsing_pos, _row, _col);
|
||||||
@ -12007,8 +12031,8 @@ int mb_gets(char* buf, int s) {
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
result = (int)strlen(buf);
|
result = (int)strlen(buf);
|
||||||
if(buf[result - 1] == '\n')
|
if(buf[result - 1] == _NEWLINE_CHAR)
|
||||||
buf[result - 1] = '\0';
|
buf[result - 1] = _ZERO_CHAR;
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -14546,7 +14570,7 @@ static int _std_asc(mb_interpreter_t* s, void** l) {
|
|||||||
|
|
||||||
mb_check(mb_attempt_close_bracket(s, l));
|
mb_check(mb_attempt_close_bracket(s, l));
|
||||||
|
|
||||||
if(arg[0] == '\0') {
|
if(arg[0] == _ZERO_CHAR) {
|
||||||
result = MB_FUNC_ERR;
|
result = MB_FUNC_ERR;
|
||||||
|
|
||||||
goto _exit;
|
goto _exit;
|
||||||
@ -14616,7 +14640,7 @@ static int _std_left(mb_interpreter_t* s, void** l) {
|
|||||||
#else /* MB_ENABLE_UNICODE */
|
#else /* MB_ENABLE_UNICODE */
|
||||||
sub = (char*)mb_malloc(count + 1);
|
sub = (char*)mb_malloc(count + 1);
|
||||||
memcpy(sub, arg, count);
|
memcpy(sub, arg, count);
|
||||||
sub[count] = '\0';
|
sub[count] = _ZERO_CHAR;
|
||||||
#endif /* MB_ENABLE_UNICODE */
|
#endif /* MB_ENABLE_UNICODE */
|
||||||
mb_check(mb_push_string(s, l, sub));
|
mb_check(mb_push_string(s, l, sub));
|
||||||
|
|
||||||
@ -14662,7 +14686,7 @@ static int _std_mid(mb_interpreter_t* s, void** l) {
|
|||||||
#else /* MB_ENABLE_UNICODE */
|
#else /* MB_ENABLE_UNICODE */
|
||||||
sub = (char*)mb_malloc(count + 1);
|
sub = (char*)mb_malloc(count + 1);
|
||||||
memcpy(sub, arg + start, count);
|
memcpy(sub, arg + start, count);
|
||||||
sub[count] = '\0';
|
sub[count] = _ZERO_CHAR;
|
||||||
#endif /* MB_ENABLE_UNICODE */
|
#endif /* MB_ENABLE_UNICODE */
|
||||||
mb_check(mb_push_string(s, l, sub));
|
mb_check(mb_push_string(s, l, sub));
|
||||||
|
|
||||||
@ -14706,7 +14730,7 @@ static int _std_right(mb_interpreter_t* s, void** l) {
|
|||||||
#else /* MB_ENABLE_UNICODE */
|
#else /* MB_ENABLE_UNICODE */
|
||||||
sub = (char*)mb_malloc(count + 1);
|
sub = (char*)mb_malloc(count + 1);
|
||||||
memcpy(sub, arg + (strlen(arg) - count), count);
|
memcpy(sub, arg + (strlen(arg) - count), count);
|
||||||
sub[count] = '\0';
|
sub[count] = _ZERO_CHAR;
|
||||||
#endif /* MB_ENABLE_UNICODE */
|
#endif /* MB_ENABLE_UNICODE */
|
||||||
mb_check(mb_push_string(s, l, sub));
|
mb_check(mb_push_string(s, l, sub));
|
||||||
|
|
||||||
@ -14771,14 +14795,14 @@ static int _std_val(mb_interpreter_t* s, void** l) {
|
|||||||
switch(arg.type) {
|
switch(arg.type) {
|
||||||
case MB_DT_STRING:
|
case MB_DT_STRING:
|
||||||
ret.value.integer = (int_t)mb_strtol(arg.value.string, &conv_suc, 0);
|
ret.value.integer = (int_t)mb_strtol(arg.value.string, &conv_suc, 0);
|
||||||
if(*conv_suc == '\0') {
|
if(*conv_suc == _ZERO_CHAR) {
|
||||||
ret.type = MB_DT_INT;
|
ret.type = MB_DT_INT;
|
||||||
mb_check(mb_push_value(s, l, ret));
|
mb_check(mb_push_value(s, l, ret));
|
||||||
|
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
ret.value.float_point = (real_t)mb_strtod(arg.value.string, &conv_suc);
|
ret.value.float_point = (real_t)mb_strtod(arg.value.string, &conv_suc);
|
||||||
if(*conv_suc == '\0') {
|
if(*conv_suc == _ZERO_CHAR) {
|
||||||
ret.type = MB_DT_REAL;
|
ret.type = MB_DT_REAL;
|
||||||
mb_check(mb_push_value(s, l, ret));
|
mb_check(mb_push_value(s, l, ret));
|
||||||
|
|
||||||
@ -15159,10 +15183,10 @@ static int _std_input(mb_interpreter_t* s, void** l) {
|
|||||||
_get_inputer(s)(line, sizeof(line));
|
_get_inputer(s)(line, sizeof(line));
|
||||||
obj->data.variable->data->type = _DT_INT;
|
obj->data.variable->data->type = _DT_INT;
|
||||||
obj->data.variable->data->data.integer = (int_t)mb_strtol(line, &conv_suc, 0);
|
obj->data.variable->data->data.integer = (int_t)mb_strtol(line, &conv_suc, 0);
|
||||||
if(*conv_suc != '\0') {
|
if(*conv_suc != _ZERO_CHAR) {
|
||||||
obj->data.variable->data->type = _DT_REAL;
|
obj->data.variable->data->type = _DT_REAL;
|
||||||
obj->data.variable->data->data.float_point = (real_t)mb_strtod(line, &conv_suc);
|
obj->data.variable->data->data.float_point = (real_t)mb_strtod(line, &conv_suc);
|
||||||
if(*conv_suc != '\0') {
|
if(*conv_suc != _ZERO_CHAR) {
|
||||||
result = MB_FUNC_ERR;
|
result = MB_FUNC_ERR;
|
||||||
|
|
||||||
goto _exit;
|
goto _exit;
|
||||||
|
@ -203,10 +203,16 @@ extern "C" {
|
|||||||
# define MB_EOS '\n'
|
# define MB_EOS '\n'
|
||||||
#endif /* MB_EOS */
|
#endif /* MB_EOS */
|
||||||
#ifndef MB_NIL
|
#ifndef MB_NIL
|
||||||
# define MB_NIL "nil"
|
# define MB_NIL "NIL"
|
||||||
#endif /* MB_NIL */
|
#endif /* MB_NIL */
|
||||||
|
#ifndef MB_TRUE
|
||||||
|
# define MB_TRUE "TRUE"
|
||||||
|
#endif /* MB_TRUE */
|
||||||
|
#ifndef MB_FALSE
|
||||||
|
# define MB_FALSE "FALSE"
|
||||||
|
#endif /* MB_FALSE */
|
||||||
#ifndef MB_NULL_STRING
|
#ifndef MB_NULL_STRING
|
||||||
# define MB_NULL_STRING "(empty)"
|
# define MB_NULL_STRING "(EMPTY)"
|
||||||
#endif /* MB_NULL_STRING */
|
#endif /* MB_NULL_STRING */
|
||||||
|
|
||||||
#ifndef mb_stricmp
|
#ifndef mb_stricmp
|
||||||
|
14
shell/main.c
14
shell/main.c
@ -133,15 +133,14 @@ extern MBAPI const size_t MB_SIZEOF_LSN;
|
|||||||
extern MBAPI const size_t MB_SIZEOF_HTN;
|
extern MBAPI const size_t MB_SIZEOF_HTN;
|
||||||
extern MBAPI const size_t MB_SIZEOF_HTA;
|
extern MBAPI const size_t MB_SIZEOF_HTA;
|
||||||
extern MBAPI const size_t MB_SIZEOF_OBJ;
|
extern MBAPI const size_t MB_SIZEOF_OBJ;
|
||||||
extern MBAPI const size_t MB_SIZEOF_FUN;
|
|
||||||
extern MBAPI const size_t MB_SIZEOF_VAR;
|
|
||||||
#ifdef MB_ENABLE_USERTYPE_REF
|
#ifdef MB_ENABLE_USERTYPE_REF
|
||||||
extern MBAPI const size_t MB_SIZEOF_UTR;
|
extern MBAPI const size_t MB_SIZEOF_UTR;
|
||||||
#else /* MB_ENABLE_USERTYPE_REF */
|
#else /* MB_ENABLE_USERTYPE_REF */
|
||||||
static const size_t MB_SIZEOF_UTR = 16;
|
static const size_t MB_SIZEOF_UTR = 16;
|
||||||
#endif /* MB_ENABLE_USERTYPE_REF */
|
#endif /* MB_ENABLE_USERTYPE_REF */
|
||||||
|
extern MBAPI const size_t MB_SIZEOF_FUN;
|
||||||
|
extern MBAPI const size_t MB_SIZEOF_VAR;
|
||||||
extern MBAPI const size_t MB_SIZEOF_ARR;
|
extern MBAPI const size_t MB_SIZEOF_ARR;
|
||||||
extern MBAPI const size_t MB_SIZEOF_LBL;
|
|
||||||
#ifdef MB_ENABLE_COLLECTION_LIB
|
#ifdef MB_ENABLE_COLLECTION_LIB
|
||||||
extern MBAPI const size_t MB_SIZEOF_LST;
|
extern MBAPI const size_t MB_SIZEOF_LST;
|
||||||
extern MBAPI const size_t MB_SIZEOF_DCT;
|
extern MBAPI const size_t MB_SIZEOF_DCT;
|
||||||
@ -149,12 +148,13 @@ extern MBAPI const size_t MB_SIZEOF_DCT;
|
|||||||
static const size_t MB_SIZEOF_LST = 16;
|
static const size_t MB_SIZEOF_LST = 16;
|
||||||
static const size_t MB_SIZEOF_DCT = 16;
|
static const size_t MB_SIZEOF_DCT = 16;
|
||||||
#endif /* MB_ENABLE_COLLECTION_LIB */
|
#endif /* MB_ENABLE_COLLECTION_LIB */
|
||||||
extern MBAPI const size_t MB_SIZEOF_RTN;
|
extern MBAPI const size_t MB_SIZEOF_LBL;
|
||||||
#ifdef MB_ENABLE_CLASS
|
#ifdef MB_ENABLE_CLASS
|
||||||
extern MBAPI const size_t MB_SIZEOF_CLS;
|
extern MBAPI const size_t MB_SIZEOF_CLS;
|
||||||
#else /* MB_ENABLE_CLASS */
|
#else /* MB_ENABLE_CLASS */
|
||||||
static const size_t MB_SIZEOF_CLS = 16;
|
static const size_t MB_SIZEOF_CLS = 16;
|
||||||
#endif /* MB_ENABLE_CLASS */
|
#endif /* MB_ENABLE_CLASS */
|
||||||
|
extern MBAPI const size_t MB_SIZEOF_RTN;
|
||||||
|
|
||||||
typedef unsigned _pool_chunk_size_t;
|
typedef unsigned _pool_chunk_size_t;
|
||||||
|
|
||||||
@ -244,15 +244,15 @@ static void _open_mem_pool(void) {
|
|||||||
szs[i++] = MB_SIZEOF_HTN;
|
szs[i++] = MB_SIZEOF_HTN;
|
||||||
szs[i++] = MB_SIZEOF_HTA;
|
szs[i++] = MB_SIZEOF_HTA;
|
||||||
szs[i++] = MB_SIZEOF_OBJ;
|
szs[i++] = MB_SIZEOF_OBJ;
|
||||||
|
szs[i++] = MB_SIZEOF_UTR;
|
||||||
szs[i++] = MB_SIZEOF_FUN;
|
szs[i++] = MB_SIZEOF_FUN;
|
||||||
szs[i++] = MB_SIZEOF_VAR;
|
szs[i++] = MB_SIZEOF_VAR;
|
||||||
szs[i++] = MB_SIZEOF_UTR;
|
|
||||||
szs[i++] = MB_SIZEOF_ARR;
|
szs[i++] = MB_SIZEOF_ARR;
|
||||||
szs[i++] = MB_SIZEOF_LBL;
|
|
||||||
szs[i++] = MB_SIZEOF_LST;
|
szs[i++] = MB_SIZEOF_LST;
|
||||||
szs[i++] = MB_SIZEOF_DCT;
|
szs[i++] = MB_SIZEOF_DCT;
|
||||||
szs[i++] = MB_SIZEOF_RTN;
|
szs[i++] = MB_SIZEOF_LBL;
|
||||||
szs[i++] = MB_SIZEOF_CLS;
|
szs[i++] = MB_SIZEOF_CLS;
|
||||||
|
szs[i++] = MB_SIZEOF_RTN;
|
||||||
|
|
||||||
mb_assert(i == N);
|
mb_assert(i == N);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user