#ifndef LUA_CJ_API #define LUA_CJ_API #define MAX_RESULT 4096 #include "lua_runner.hpp" /*内部使用结构体,仓颉无需关心*/ typedef struct redirectfuncs { int (*io_input)(); int (*io_output)(); }redirectfuncs; typedef struct iopath { char iopath[256]; redirectfuncs funcs; }iopath; #define LUAI_EXTRASPACE sizeof(iopath) typedef struct lua_runner { char result[4096];//返回值,每次调用run方法时更新脚本返回至result(当前支持单个字符串或整形返回) void *lua_obj;//cpp对象,指向在cpp中封装的luarunner对象 // typed interop:最近一次调用的结果类型与值(镜像 Lua_runner 同名字段) int tresult_type; // 0=nil, 1=bool, 2=int, 3=num, 4=str long long tresult_int; double tresult_num; int tresult_bool; }lua_runner; /*内部使用结构体,仓颉无需关心*/ #ifdef __cplusplus extern "C"{ #endif /// @brief 用于在仓颉中初始化lua解释器,返回void形指针 /// @param pathio 重定向终端输入出入到执行文件 /// @param pkgpath 用户包搜索路径 /// @param input 输入回调函数 /// @param output 输出回调函数 /// @return 成功返回对应指针,失败返回NULL void *init_lua_runner(const char *pathio,const char *pkgpath,int(*input)(),int(*output)()); /// @brief 用于在lua状态机中加载lua源码 /// @param selfd init_lua_runner返回的void指针 /// @param path 源码路径 /// @param name 为加载的源码命名(unload时使用) /// @return 成功返回0,失败返回-1 int load_lib(void *selfd,const char *path,const char *name); /// @brief 用于在lua状态机中卸载加载过的lua源码 /// @param selfd init_lua_runner返回的void指针 /// @param name 加载库时候的命名 /// @return 成功返回0,失败返回-1 int unload_lib(void *selfd,const char *name); /// @brief 预加载lua文件到内存:加载文件、执行顶层代码、捕获返回的函数并存入 Registry,供后续 callfunction 多次调用 /// @param selfd init_lua_runner返回的void指针 /// @param path 需要加载的文件路径 /// @param name 函数名称(callfunction/unloadfunction时使用) /// @return 0代表正常结束,-1表示异常退出 int loadfunction(void *selfd,const char *path,const char *name); /// @brief 卸载预加载的函数(释放 Registry 引用) /// @param selfd init_lua_runner返回的void指针 /// @param name loadfunction加载时的函数名称 /// @return 0代表正常结束,-1表示异常退出 int unloadfunction(void *selfd,const char *name); /// @brief 按名称调用已预加载的函数(从 Registry 取出,不消耗该函数,可重复调用) /// @param selfd init_lua_runner返回的void指针 /// @param name loadfunction加载时的函数名称 /// @param arg 传递给函数的单参数(可为NULL) /// @return 成功返回0,失败返回-1,并将lua出错原因拷贝至result中 int callfunction(void *selfd,const char *name,const char *arg); /*-------------typed interop(v0.2.2)------------------------*/ // 原始类型直通映射:仓颉 Int64/Float64/Bool 与 Lua integer/number/boolean // 直接互转,无需序列化为字符串。调用后用 result_type/result_int/result_num/ // result_bool/getresult 读取结果。 /// @brief 按名称调用预加载函数,传递 Int64 参数(Lua integer) /// @return 成功返回0,失败返回-1 int callfunction_int(void *selfd,const char *name,long long val); /// @brief 按名称调用预加载函数,传递 Float64 参数(Lua number) int callfunction_num(void *selfd,const char *name,double val); /// @brief 按名称调用预加载函数,传递 Bool 参数(Lua boolean) int callfunction_bool(void *selfd,const char *name,int val); /// @brief 按名称调用预加载函数,不传参数 int callfunction_void(void *selfd,const char *name); /// @brief 运行脚本,传递 Int64 参数 int run_int(void *selfd,const char *path,long long val); /// @brief 运行脚本,传递 Float64 参数 int run_num(void *selfd,const char *path,double val); /// @brief 运行脚本,传递 Bool 参数 int run_bool(void *selfd,const char *path,int val); /// @brief 运行脚本,不带参数 int run_void(void *selfd,const char *path); #define CJT_NIL 0 #define CJT_BOOL 1 #define CJT_INT 2 #define CJT_NUM 3 #define CJT_STR 4 /// @brief 获取最近一次 typed 调用的结果类型 /// @return CJT_NIL/CJT_BOOL/CJT_INT/CJT_NUM/CJT_STR int result_type(void *selfd); /// @brief 获取最近一次 typed 调用的整数结果(非整型结果时为转换值) long long result_int(void *selfd); /// @brief 获取最近一次 typed 调用的浮点结果(非浮点结果时为转换值) double result_num(void *selfd); /// @brief 获取最近一次 typed 调用的布尔结果 int result_bool(void *selfd); /*-------------typed interop------------------------*/ /// @brief 运行lua脚本 /// @param selfd init_lua_runner返回的void指针 /// @param path 脚本路径 /// @param arg 脚本入参(字符串类型) /// @return 成功返回0,失败返回-1,并将lua出错原因拷贝至result中 int run(void *selfd,const char *path,const char *arg); /// @brief 执行单句lua语句 /// @param selfd init_lua_runner返回的void指针 /// @param target 执行语句(字符串类型) /// @return 成功返回0,失败返回-1,并将lua出错原因拷贝至result中 int dostring(void *selfd,const char *target); /// @brief 清理lua状态机缓存,不销毁状态机 /// @param selfd init_lua_runner返回的void指针 /// @return 成功返回0,失败返回-1 int cleanup(void *selfd); /// @brief 获取lua状态机执行过程中产生的错误码 /// @param 不需要入参 /// @return 返回errrors中定义的错误码 int get_errno(void); /// @brief 用于获取脚本返回值 /// @param selfd init_lua_runner返回的void指针 /// @return 返回运行结果 char *getresult(void *selfd); /// @brief 清理lua状态机并释放内存 /// @param selfd init_lua_runner返回的void指针 /// @return 成功返回0,失败返回-1 int free_lua(void *selfd); #ifdef __cplusplus } #endif #endif