1 Star 0 Fork 2

jjzhang166/my-basic

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
my_basic.h 24.83 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691
/*
** This source file is part of MY-BASIC
**
** For the latest info, see https://github.com/paladin-t/my_basic/
**
** Copyright (C) 2011 - 2021 Tony Wang
**
** 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 */
#if defined __EMSCRIPTEN__
# define MB_CP_EMSCRIPTEN
#elif defined ARDUINO
# define MB_CP_ARDUINO
#elif defined __BORLANDC__
# define MB_CP_BORLANDC
#elif defined __clang__
# define MB_CP_CLANG
#elif defined __CYGWIN__
# define MB_CP_CYGWIN
#elif defined __GNUC__ || defined __GNUG__
# define MB_CP_GCC
#elif defined __HP_cc || defined __HP_aCC
# define MB_CP_HPC
#elif defined __IBMC__ || defined __IBMCPP__
# define MB_CP_IBMC
#elif defined __ICC || defined __INTEL_COMPILER
# define MB_CP_ICC
#elif defined __MINGW32__
# define MB_CP_MINGW32
#elif defined __POCC__
# define MB_CP_PELLESC
#elif defined __PGI
# define MB_CP_PGCC
#elif defined __SUNPRO_C || defined __SUNPRO_CC
# define MB_CP_SOLARISC
#elif defined __TINYC__
# define MB_CP_TCC
#elif defined _MSC_VER
# define MB_CP_VC _MSC_VER
#else
# define MB_CP_UNKNOWN
#endif /* Compiler dependent macro */
#if defined __EMSCRIPTEN__
# define MB_OS_HTML
#elif defined _WIN64
# define MB_OS_WIN
# define MB_OS_WIN64
#elif defined _WIN32
# define MB_OS_WIN
# define MB_OS_WIN32
#elif defined __APPLE__
# include <TargetConditionals.h>
# define MB_OS_APPLE
# if defined TARGET_OS_IPHONE && TARGET_OS_IPHONE == 1
# define MB_OS_IOS
# elif defined TARGET_IPHONE_SIMULATOR && TARGET_IPHONE_SIMULATOR == 1
# define MB_OS_IOS_SIM
# elif defined TARGET_OS_MAC && TARGET_OS_MAC == 1
# define MB_OS_MAC
# endif
#elif defined __ANDROID__
# define MB_OS_ANDROID
#elif defined __linux__
# define MB_OS_LINUX
#elif defined __unix__
# define MB_OS_UNIX
#else
# define MB_OS_UNKNOWN
#endif /* OS dependent macro */
#ifndef MBAPI
# define MBAPI
#endif /* MBAPI */
#ifndef MBIMPL
# define MBIMPL
#endif /* MBIMPL */
#ifndef MBCONST
# define MBCONST
#endif /* MBCONST */
#ifndef MB_SIMPLE_ARRAY
# define MB_SIMPLE_ARRAY
#endif /* MB_SIMPLE_ARRAY */
#ifndef MB_ENABLE_ARRAY_REF
# define MB_ENABLE_ARRAY_REF
#endif /* MB_ENABLE_ARRAY_REF */
#ifndef MB_MAX_DIMENSION_COUNT
# define MB_MAX_DIMENSION_COUNT 4
#endif /* MB_MAX_DIMENSION_COUNT */
#ifndef MB_ENABLE_COLLECTION_LIB
# define MB_ENABLE_COLLECTION_LIB
#endif /* MB_ENABLE_COLLECTION_LIB */
#ifndef MB_ENABLE_USERTYPE_REF
# define MB_ENABLE_USERTYPE_REF
#endif /* MB_ENABLE_USERTYPE_REF */
#ifdef MB_ENABLE_USERTYPE_REF
# ifndef MB_ENABLE_ALIVE_CHECKING_ON_USERTYPE_REF
# define MB_ENABLE_ALIVE_CHECKING_ON_USERTYPE_REF
# endif /* MB_ENABLE_ALIVE_CHECKING_ON_USERTYPE_REF */
#endif /* MB_ENABLE_USERTYPE_REF */
#ifndef MB_ENABLE_CLASS
# define MB_ENABLE_CLASS
#endif /* MB_ENABLE_CLASS */
#ifndef MB_ENABLE_LAMBDA
# define MB_ENABLE_LAMBDA
#endif /* MB_ENABLE_LAMBDA */
#ifndef MB_ENABLE_MODULE
# define MB_ENABLE_MODULE
#endif /* MB_ENABLE_MODULE */
#ifndef MB_ENABLE_UNICODE
# define MB_ENABLE_UNICODE
#endif /* MB_ENABLE_UNICODE */
#ifndef MB_ENABLE_UNICODE_ID
# define MB_ENABLE_UNICODE_ID
# if defined MB_ENABLE_UNICODE_ID && !defined MB_ENABLE_UNICODE
# error "Requires MB_ENABLE_UNICODE enabled."
# endif
#endif /* MB_ENABLE_UNICODE_ID */
#ifndef MB_ENABLE_FORK
# define MB_ENABLE_FORK
#endif /* MB_ENABLE_FORK */
#ifndef MB_GC_GARBAGE_THRESHOLD
# define MB_GC_GARBAGE_THRESHOLD 16
#endif /* MB_GC_GARBAGE_THRESHOLD */
#ifndef MB_ENABLE_ALLOC_STAT
# define MB_ENABLE_ALLOC_STAT
#endif /* MB_ENABLE_ALLOC_STAT */
#ifndef MB_ENABLE_SOURCE_TRACE
# define MB_ENABLE_SOURCE_TRACE
#endif /* MB_ENABLE_SOURCE_TRACE */
#ifndef MB_ENABLE_STACK_TRACE
# define MB_ENABLE_STACK_TRACE
#endif /* MB_ENABLE_STACK_TRACE */
#ifndef MB_ENABLE_FULL_ERROR
# define MB_ENABLE_FULL_ERROR
#endif /* MB_ENABLE_FULL_ERROR */
#ifndef MB_CONVERT_TO_INT_LEVEL_NONE
# define MB_CONVERT_TO_INT_LEVEL_NONE 0
#endif /* MB_CONVERT_TO_INT_LEVEL_NONE */
#ifndef MB_CONVERT_TO_INT_LEVEL_ALL
# define MB_CONVERT_TO_INT_LEVEL_ALL 1
#endif /* MB_CONVERT_TO_INT_LEVEL_ALL */
#ifndef MB_CONVERT_TO_INT_LEVEL
# define MB_CONVERT_TO_INT_LEVEL MB_CONVERT_TO_INT_LEVEL_ALL
#endif /* MB_CONVERT_TO_INT_LEVEL */
#ifndef MB_PREFER_SPEED
# define MB_PREFER_SPEED
#endif /* MB_PREFER_SPEED */
#ifndef MB_COMPACT_MODE
# define MB_COMPACT_MODE
#endif /* MB_COMPACT_MODE */
#ifdef MB_COMPACT_MODE
# pragma pack(1)
#endif /* MB_COMPACT_MODE */
#ifndef __cplusplus
# ifndef true
# define true (1)
# endif /* true */
# ifndef false
# define false (0)
# endif /* false */
#endif /* __cplusplus */
#ifndef bool_t
# define bool_t unsigned char
#endif /* bool_t */
#ifndef int_t
# define int_t int
#endif /* int_t */
#ifndef real_t
# ifdef MB_DOUBLE_FLOAT
# define real_t double
# else /* MB_DOUBLE_FLOAT */
# define real_t float
# endif /* MB_DOUBLE_FLOAT */
#endif /* real_t */
#ifndef mb_strtol
# define mb_strtol(__s, __e, __r) strtol((__s), (__e), (__r))
#endif /* mb_strtol */
#ifndef mb_strtod
# define mb_strtod(__s, __e) strtod((__s), (__e))
#endif /* mb_strtod */
#ifndef MB_INT_FMT
# define MB_INT_FMT "%d"
#endif /* MB_INT_FMT */
#ifndef MB_REAL_FMT
# define MB_REAL_FMT "%g"
#endif /* MB_REAL_FMT */
#ifndef MB_FNAN
# ifdef MB_DOUBLE_FLOAT
# define MB_FNAN 0x7FF8000000000000
# else /* MB_DOUBLE_FLOAT */
# define MB_FNAN 0x7FC00000
# endif /* MB_DOUBLE_FLOAT */
#endif /* MB_FNAN */
#ifndef MB_FINF
# ifdef MB_DOUBLE_FLOAT
# define MB_FINF 0x7FF0000000000000
# else /* MB_DOUBLE_FLOAT */
# define MB_FINF 0x7F800000
# endif /* MB_DOUBLE_FLOAT */
#endif /* MB_FINF */
#ifndef MB_EOS
# define MB_EOS '\n'
#endif /* MB_EOS */
#ifndef MB_NIL
# define MB_NIL "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
# define MB_NULL_STRING "(EMPTY)"
#endif /* MB_NULL_STRING */
#ifndef mb_min
# define mb_min(a, b) (((a) < (b)) ? (a) : (b))
#endif /* mb_min */
#ifndef mb_max
# define mb_max(a, b) (((a) > (b)) ? (a) : (b))
#endif /* mb_max */
#ifndef mb_stricmp
# ifdef MB_CP_VC
# define mb_stricmp _strcmpi
# else /* MB_CP_VC */
# ifdef MB_CP_BORLANDC
# define mb_stricmp stricmp
# elif defined MB_CP_PELLESC
# define mb_stricmp _stricmp
# else
# define mb_stricmp strcasecmp
# endif
# endif /* MB_CP_VC */
#endif /* mb_stricmp */
#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_mem_tag_t
typedef unsigned short mb_mem_tag_t;
#endif /* mb_mem_tag_t */
#ifndef mb_bytes_size
# define mb_bytes_size (mb_max(mb_max(mb_max(sizeof(void*), sizeof(unsigned long)), sizeof(int_t)), sizeof(real_t)))
#endif /* mb_bytes_size */
#ifndef mb_make_nil
# define mb_make_nil(__v) do { memset(&(__v).value.bytes, 0, sizeof(mb_val_bytes_t)); (__v).type = MB_DT_NIL; } while(0)
#endif /* mb_make_nil */
#ifndef mb_make_type
# define mb_make_type(__v, __d) do { (__v).value.type = (__d); (__v).type = MB_DT_TYPE; } while(0)
#endif /* mb_make_type */
#ifndef mb_make_bool
# define mb_make_bool(__v, __d) do { (__v).value.integer = (!!(__d) ? true : false); (__v).type = MB_DT_INT; } while(0)
#endif /* mb_make_bool */
#ifndef mb_make_int
# define mb_make_int(__v, __d) do { (__v).value.integer = (__d); (__v).type = MB_DT_INT; } while(0)
#endif /* mb_make_int */
#ifndef mb_make_real
# define mb_make_real(__v, __d) do { (__v).value.float_point = (__d); (__v).type = MB_DT_REAL; } while(0)
#endif /* mb_make_real */
#ifndef mb_make_string
# define mb_make_string(__v, __d) do { (__v).value.string = (__d); (__v).type = MB_DT_STRING; } while(0)
#endif /* mb_make_string */
#ifndef mb_make_usertype
# define mb_make_usertype(__v, __d) do { memset(&(__v).value.bytes, 0, sizeof(mb_val_bytes_t)); (__v).value.usertype = (__d); (__v).type = MB_DT_USERTYPE; } while(0)
#endif /* mb_make_usertype */
#ifndef mb_make_usertype_bytes
# define mb_make_usertype_bytes(__v, __d) do { mb_static_assert(sizeof(mb_val_bytes_t) >= sizeof(*__d)); memcpy(&(__v).value.bytes, (__d), mb_min(sizeof(mb_val_bytes_t), sizeof(*__d))); (__v).type = MB_DT_USERTYPE; } while(0)
#endif /* mb_make_usertype_bytes */
#ifndef mb_make_array
# define mb_make_array(__v, __d) do { (__v).value.array = (__d); (__v).type = MB_DT_ARRAY; } while(0)
#endif /* mb_make_array */
#ifdef MB_ENABLE_COLLECTION_LIB
# ifndef mb_make_list
# define mb_make_list(__v, __d) do { (__v).value.list = (__d); (__v).type = MB_DT_LIST; } while(0)
# endif /* mb_make_list */
# ifndef mb_make_dict
# define mb_make_dict(__v, __d) do { (__v).value.dict = (__d); (__v).type = MB_DT_DICT; } while(0)
# endif /* mb_make_dict */
#endif /* MB_ENABLE_COLLECTION_LIB */
#ifndef mb_int_val
# define mb_int_val(__v, __d) do { if((__v).type == MB_DT_INT) (__d) = (__v).value.integer; else if((__v).type == MB_DT_REAL) (__d) = (int_t)((__v).value.float_point); else (__d) = ~((int_t)0); } while(0)
#endif /* mb_int_val */
#ifndef MB_CODES
# define MB_CODES
# define MB_FUNC_OK 0
# define MB_FUNC_IGNORE 1
# define MB_FUNC_WARNING 2
# define MB_FUNC_ERR 3
# define MB_FUNC_BYE 4
# define MB_FUNC_SUSPEND 5
# define MB_FUNC_END 6
# define MB_LOOP_BREAK 101
# define MB_LOOP_CONTINUE 102
# define MB_SUB_RETURN 103
# define MB_EXTENDED_ABORT 201
#endif /* MB_CODES */
#ifndef mb_check
# define mb_check(__expr) do { int __hr = (__expr); if((__hr) != MB_FUNC_OK) { return (__hr); } } while(0)
#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 */
#ifndef mb_convert_to_int_if_posible
# if MB_CONVERT_TO_INT_LEVEL == MB_CONVERT_TO_INT_LEVEL_NONE
# define mb_convert_to_int_if_posible(__v) ((void)(__v))
# else /* MB_CONVERT_TO_INT_LEVEL == MB_CONVERT_TO_INT_LEVEL_NONE */
# define mb_convert_to_int_if_posible(__v) \
do { \
if((__v).type == MB_DT_REAL && (real_t)(int_t)(__v).value.float_point == (__v).value.float_point) { \
(__v).type = MB_DT_INT; \
(__v).value.integer = (int_t)(__v).value.float_point; \
} \
} while(0)
# endif /* MB_CONVERT_TO_INT_LEVEL == MB_CONVERT_TO_INT_LEVEL_NONE */
#endif /* mb_convert_to_int_if_posible */
struct mb_interpreter_t;
typedef enum mb_error_e {
SE_NO_ERR = 0,
/** Common */
SE_CM_FUNC_EXISTS,
SE_CM_FUNC_NOT_EXISTS,
SE_CM_NOT_SUPPORTED,
/** Parsing */
SE_PS_OPEN_FILE_FAILED,
SE_PS_SYMBOL_TOO_LONG,
SE_PS_INVALID_CHAR,
SE_PS_INVALID_MODULE,
/** Running */
SE_RN_EMPTY_PROGRAM,
SE_RN_PROGRAM_TOO_LONG,
SE_RN_SYNTAX_ERROR,
SE_RN_OUT_OF_MEMORY,
SE_RN_OVERFLOW,
SE_RN_UNEXPECTED_TYPE,
SE_RN_INVALID_STRING,
SE_RN_INTEGER_EXPECTED,
SE_RN_NUMBER_EXPECTED,
SE_RN_STRING_EXPECTED,
SE_RN_VAR_EXPECTED,
SE_RN_INDEX_OUT_OF_BOUND,
SE_RN_CANNOT_FIND_WITH_GIVEN_INDEX,
SE_RN_TOO_MANY_DIMENSIONS,
SE_RN_RANK_OUT_OF_BOUND,
SE_RN_INVALID_ID_USAGE,
SE_RN_DUPLICATE_ID,
SE_RN_INCOMPLETE_STRUCTURE,
SE_RN_LABEL_NOT_EXISTS,
SE_RN_NO_RETURN_POINT,
SE_RN_COLON_EXPECTED,
SE_RN_COMMA_EXPECTED,
SE_RN_COMMA_OR_SEMICOLON_EXPECTED,
SE_RN_OPEN_BRACKET_EXPECTED,
SE_RN_CLOSE_BRACKET_EXPECTED,
SE_RN_NESTED_TOO_MUCH,
SE_RN_OPERATION_FAILED,
SE_RN_OPERATOR_EXPECTED,
SE_RN_ASSIGN_OPERATOR_EXPECTED,
SE_RN_THEN_EXPECTED,
SE_RN_ELSE_EXPECTED,
SE_RN_ENDIF_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_CALCULATION_ERROR,
SE_RN_INVALID_EXPRESSION,
SE_RN_DIVIDE_BY_ZERO,
SE_RN_WRONG_FUNCTION_REACHED,
SE_RN_CANNOT_SUSPEND_HERE,
SE_RN_CANNOT_MIX_INSTRUCTIONAL_AND_STRUCTURED,
SE_RN_INVALID_ROUTINE,
SE_RN_ROUTINE_EXPECTED,
SE_RN_DUPLICATE_ROUTINE,
SE_RN_INVALID_CLASS,
SE_RN_CLASS_EXPECTED,
SE_RN_DUPLICATE_CLASS,
SE_RN_HASH_AND_COMPARE_MUST_BE_PROVIDED_TOGETHER,
SE_RN_INVALID_LAMBDA,
SE_RN_EMPTY_COLLECTION,
SE_RN_LIST_EXPECTED,
SE_RN_INVALID_ITERATOR,
SE_RN_ITERABLE_EXPECTED,
SE_RN_COLLECTION_EXPECTED,
SE_RN_COLLECTION_OR_ITERATOR_EXPECTED,
SE_RN_REFERENCED_TYPE_EXPECTED,
/** Extended abort */
SE_EA_EXTENDED_ABORT,
/** Extra */
SE_COUNT
} mb_error_e;
typedef enum mb_data_e {
MB_DT_NIL = 0,
MB_DT_UNKNOWN = 1 << 0,
MB_DT_INT = 1 << 1,
MB_DT_REAL = 1 << 2,
MB_DT_NUM = MB_DT_INT | MB_DT_REAL,
MB_DT_STRING = 1 << 3,
MB_DT_TYPE = 1 << 4,
MB_DT_USERTYPE = 1 << 5,
#ifdef MB_ENABLE_USERTYPE_REF
MB_DT_USERTYPE_REF = 1 << 6,
#endif /* MB_ENABLE_USERTYPE_REF */
MB_DT_ARRAY = 1 << 7,
#ifdef MB_ENABLE_COLLECTION_LIB
MB_DT_LIST = 1 << 8,
MB_DT_LIST_IT = 1 << 9,
MB_DT_DICT = 1 << 10,
MB_DT_DICT_IT = 1 << 11,
MB_DT_COLLECTION = MB_DT_LIST | MB_DT_DICT,
MB_DT_ITERATOR = MB_DT_LIST_IT | MB_DT_DICT_IT,
#endif /* MB_ENABLE_COLLECTION_LIB */
#ifdef MB_ENABLE_CLASS
MB_DT_CLASS = 1 << 12,
#endif /* MB_ENABLE_CLASS */
MB_DT_ROUTINE = 1 << 13
} mb_data_e;
typedef enum mb_meta_func_e {
MB_MF_IS = 1 << 0,
MB_MF_ADD = 1 << 1,
MB_MF_SUB = 1 << 2,
MB_MF_MUL = 1 << 3,
MB_MF_DIV = 1 << 4,
MB_MF_NEG = 1 << 5,
MB_MF_CALC = MB_MF_IS | MB_MF_ADD | MB_MF_SUB | MB_MF_MUL | MB_MF_DIV | MB_MF_NEG,
MB_MF_COLL = 1 << 6,
MB_MF_FUNC = 1 << 7
} mb_meta_func_e;
typedef enum mb_meta_status_e {
MB_MS_NONE = 0,
MB_MS_DONE = 1 << 0,
MB_MS_RETURNED = 1 << 1
} mb_meta_status_e;
typedef enum mb_routine_type_e {
MB_RT_NONE,
MB_RT_SCRIPT,
MB_RT_LAMBDA,
MB_RT_NATIVE
} mb_routine_type_e;
typedef unsigned char mb_val_bytes_t[mb_bytes_size];
typedef union mb_value_u {
int_t integer;
real_t float_point;
char* string;
mb_data_e type;
void* usertype;
#ifdef MB_ENABLE_USERTYPE_REF
void* usertype_ref;
#endif /* MB_ENABLE_USERTYPE_REF */
void* array;
#ifdef MB_ENABLE_COLLECTION_LIB
void* list;
void* list_it;
void* dict;
void* dict_it;
#endif /* MB_ENABLE_COLLECTION_LIB */
#ifdef MB_ENABLE_CLASS
void* instance;
#endif /* MB_ENABLE_CLASS */
void* routine;
mb_val_bytes_t bytes;
} mb_value_u;
mb_static_assert(sizeof(mb_val_bytes_t) >= sizeof(mb_value_u));
typedef struct mb_value_t {
mb_data_e type;
mb_value_u value;
} mb_value_t;
typedef int (* mb_func_t)(struct mb_interpreter_t*, void**);
typedef int (* mb_has_routine_arg_func_t)(struct mb_interpreter_t*, void**, mb_value_t*, unsigned, unsigned*, void*);
typedef int (* mb_pop_routine_arg_func_t)(struct mb_interpreter_t*, void**, mb_value_t*, unsigned, unsigned*, void*, mb_value_t*);
typedef int (* mb_routine_func_t)(struct mb_interpreter_t*, void**, mb_value_t*, unsigned, void*, mb_has_routine_arg_func_t, mb_pop_routine_arg_func_t);
typedef int (* mb_debug_stepped_handler_t)(struct mb_interpreter_t*, void**, const char*, int, unsigned short, unsigned short);
typedef void (* mb_error_handler_t)(struct mb_interpreter_t*, mb_error_e, const char*, const char*, int, unsigned short, unsigned short, int);
typedef int (* mb_print_func_t)(const char*, ...);
typedef int (* mb_input_func_t)(const char*, char*, int);
typedef int (* mb_import_handler_t)(struct mb_interpreter_t*, const char*);
typedef void (* mb_dtor_func_t)(struct mb_interpreter_t*, void*);
typedef void* (* mb_clone_func_t)(struct mb_interpreter_t*, void*);
typedef unsigned (* mb_hash_func_t)(struct mb_interpreter_t*, void*);
typedef int (* mb_cmp_func_t)(struct mb_interpreter_t*, void*, void*);
typedef int (* mb_fmt_func_t)(struct mb_interpreter_t*, void*, char*, unsigned);
typedef void (* mb_alive_marker_t)(struct mb_interpreter_t*, void*, mb_value_t);
typedef void (* mb_alive_checker_t)(struct mb_interpreter_t*, void*, mb_alive_marker_t);
typedef void (* mb_alive_value_checker_t)(struct mb_interpreter_t*, void*, mb_value_t, mb_alive_marker_t);
typedef int (* mb_meta_operator_t)(struct mb_interpreter_t*, void**, mb_value_t*, mb_value_t*, mb_value_t*);
typedef mb_meta_status_e (* mb_meta_func_t)(struct mb_interpreter_t*, void**, mb_value_t*, const char*);
typedef char* (* mb_memory_allocate_func_t)(unsigned);
typedef void (* mb_memory_free_func_t)(char*);
MBAPI unsigned long mb_ver(void);
MBAPI const char* mb_ver_string(void);
MBAPI int mb_init(void);
MBAPI int mb_dispose(void);
MBAPI int mb_open(struct mb_interpreter_t** s);
MBAPI int mb_close(struct mb_interpreter_t** s);
MBAPI int mb_reset(struct mb_interpreter_t** s, bool_t clrf/* = false*/);
MBAPI int mb_fork(struct mb_interpreter_t** s, struct mb_interpreter_t* r, bool_t clfk/* = true*/);
MBAPI int mb_join(struct mb_interpreter_t** s);
MBAPI int mb_get_forked_from(struct mb_interpreter_t* s, struct mb_interpreter_t** src);
MBAPI int mb_register_func(struct mb_interpreter_t* s, const char* n, mb_func_t f);
MBAPI int mb_remove_func(struct mb_interpreter_t* s, const char* n);
MBAPI int mb_remove_reserved_func(struct mb_interpreter_t* s, const char* n);
MBAPI int mb_begin_module(struct mb_interpreter_t* s, const char* n);
MBAPI int mb_end_module(struct mb_interpreter_t* s);
MBAPI int mb_attempt_func_begin(struct mb_interpreter_t* s, void** l);
MBAPI int mb_attempt_func_end(struct mb_interpreter_t* s, void** l);
MBAPI int mb_attempt_open_bracket(struct mb_interpreter_t* s, void** l);
MBAPI int mb_attempt_close_bracket(struct mb_interpreter_t* s, void** l);
MBAPI int mb_has_arg(struct mb_interpreter_t* s, void** l);
MBAPI int mb_pop_int(struct mb_interpreter_t* s, void** l, int_t* val);
MBAPI int mb_pop_real(struct mb_interpreter_t* s, void** l, real_t* val);
MBAPI int mb_pop_string(struct mb_interpreter_t* s, void** l, char** val);
MBAPI int mb_pop_usertype(struct mb_interpreter_t* s, void** l, void** val);
MBAPI int mb_pop_value(struct mb_interpreter_t* s, void** l, mb_value_t* val);
MBAPI int mb_push_int(struct mb_interpreter_t* s, void** l, int_t val);
MBAPI int mb_push_real(struct mb_interpreter_t* s, void** l, real_t val);
MBAPI int mb_push_string(struct mb_interpreter_t* s, void** l, char* val);
MBAPI int mb_push_usertype(struct mb_interpreter_t* s, void** l, void* val);
MBAPI int mb_push_value(struct mb_interpreter_t* s, void** l, mb_value_t val);
MBAPI int mb_begin_class(struct mb_interpreter_t* s, void** l, const char* n, mb_value_t** meta, int c, mb_value_t* out);
MBAPI int mb_end_class(struct mb_interpreter_t* s, void** l);
MBAPI int mb_get_class_userdata(struct mb_interpreter_t* s, void** l, void** d);
MBAPI int mb_set_class_userdata(struct mb_interpreter_t* s, void** l, void* d);
MBAPI int mb_get_value_by_name(struct mb_interpreter_t* s, void** l, const char* n, mb_value_t* val);
MBAPI int mb_add_var(struct mb_interpreter_t* s, void** l, const char* n, mb_value_t val, bool_t force);
MBAPI int mb_get_var(struct mb_interpreter_t* s, void** l, void** v, bool_t redir);
MBAPI int mb_get_var_name(struct mb_interpreter_t* s, void* v, char** n);
MBAPI int mb_get_var_value(struct mb_interpreter_t* s, void* v, mb_value_t* val);
MBAPI int mb_set_var_value(struct mb_interpreter_t* s, void* v, mb_value_t val);
MBAPI int mb_init_array(struct mb_interpreter_t* s, void** l, mb_data_e t, int* d, int c, void** a);
MBAPI int mb_get_array_len(struct mb_interpreter_t* s, void** l, void* a, int r, int* i);
MBAPI int mb_get_array_elem(struct mb_interpreter_t* s, void** l, void* a, int* d, int c, mb_value_t* val);
MBAPI int mb_set_array_elem(struct mb_interpreter_t* s, void** l, void* a, int* d, int c, mb_value_t val);
MBAPI int mb_init_coll(struct mb_interpreter_t* s, void** l, mb_value_t* coll);
MBAPI int mb_get_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, mb_value_t idx, mb_value_t* val);
MBAPI int mb_set_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, mb_value_t idx, mb_value_t val);
MBAPI int mb_remove_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, mb_value_t idx);
MBAPI int mb_count_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, int* c);
MBAPI int mb_keys_of_coll(struct mb_interpreter_t* s, void** l, mb_value_t coll, mb_value_t* keys, int c);
MBAPI int mb_make_ref_value(struct mb_interpreter_t* s, void* val, mb_value_t* out, mb_dtor_func_t un, mb_clone_func_t cl, mb_hash_func_t hs/* = NULL*/, mb_cmp_func_t cp/* = NULL*/, mb_fmt_func_t ft/* = NULL*/);
MBAPI int mb_get_ref_value(struct mb_interpreter_t* s, void** l, mb_value_t val, void** out);
MBAPI int mb_ref_value(struct mb_interpreter_t* s, void** l, mb_value_t val);
MBAPI int mb_unref_value(struct mb_interpreter_t* s, void** l, mb_value_t val);
MBAPI int mb_set_alive_checker(struct mb_interpreter_t* s, mb_alive_checker_t f);
MBAPI int mb_set_alive_checker_of_value(struct mb_interpreter_t* s, void** l, mb_value_t val, mb_alive_value_checker_t f);
MBAPI int mb_override_value(struct mb_interpreter_t* s, void** l, mb_value_t val, mb_meta_func_e m, void* f);
MBAPI int mb_dispose_value(struct mb_interpreter_t* s, mb_value_t val);
MBAPI int mb_get_routine(struct mb_interpreter_t* s, void** l, const char* n, mb_value_t* val);
MBAPI int mb_set_routine(struct mb_interpreter_t* s, void** l, const char* n, mb_routine_func_t f, bool_t force);
MBAPI int mb_eval_routine(struct mb_interpreter_t* s, void** l, mb_value_t val, mb_value_t* args, unsigned argc, mb_value_t* ret/* = NULL*/);
MBAPI int mb_get_routine_type(struct mb_interpreter_t* s, mb_value_t val, mb_routine_type_e* y);
MBAPI int mb_load_string(struct mb_interpreter_t* s, const char* l, bool_t reset/* = true*/);
MBAPI int mb_load_file(struct mb_interpreter_t* s, const char* f);
MBAPI int mb_run(struct mb_interpreter_t* s, bool_t clear_parser/* = true*/);
MBAPI int mb_suspend(struct mb_interpreter_t* s, void** l);
MBAPI int mb_schedule_suspend(struct mb_interpreter_t* s, int t);
MBAPI int mb_debug_get(struct mb_interpreter_t* s, const char* n, mb_value_t* val);
MBAPI int mb_debug_set(struct mb_interpreter_t* s, const char* n, mb_value_t val);
MBAPI int mb_debug_get_stack_trace(struct mb_interpreter_t* s, void** l, char** fs, unsigned fc);
MBAPI int mb_debug_set_stepped_handler(struct mb_interpreter_t* s, mb_debug_stepped_handler_t h);
MBAPI const char* mb_get_type_string(mb_data_e t);
MBAPI int mb_raise_error(struct mb_interpreter_t* s, void** l, mb_error_e err, int ret);
MBAPI mb_error_e mb_get_last_error(struct mb_interpreter_t* s, const char** file, int* pos, unsigned short* row, unsigned short* col);
MBAPI const char* mb_get_error_desc(mb_error_e err);
MBAPI int mb_set_error_handler(struct mb_interpreter_t* s, mb_error_handler_t h);
MBAPI int mb_set_printer(struct mb_interpreter_t* s, mb_print_func_t p);
MBAPI int mb_set_inputer(struct mb_interpreter_t* s, mb_input_func_t p);
MBAPI int mb_set_import_handler(struct mb_interpreter_t* s, mb_import_handler_t h);
MBAPI int mb_set_memory_manager(mb_memory_allocate_func_t a, mb_memory_free_func_t f);
MBAPI bool_t mb_get_gc_enabled(struct mb_interpreter_t* s);
MBAPI int mb_set_gc_enabled(struct mb_interpreter_t* s, bool_t gc);
MBAPI int mb_gc(struct mb_interpreter_t* s, int_t* collected/* = NULL*/);
MBAPI int mb_get_userdata(struct mb_interpreter_t* s, void** d);
MBAPI int mb_set_userdata(struct mb_interpreter_t* s, void* d);
MBAPI int mb_gets(const char* pmt, char* buf, int s);
MBAPI char* mb_memdup(const char* val, unsigned size);
#ifdef MB_COMPACT_MODE
# pragma pack()
#endif /* MB_COMPACT_MODE */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __MY_BASIC_H__ */
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C/C++
1
https://gitee.com/jjzhang166/my-basic.git
git@gitee.com:jjzhang166/my-basic.git
jjzhang166
my-basic
my-basic
master

搜索帮助