Files
LuaCangjia_api/lib/lua_cj_api.h
JianFeeeee 42e8b7676d feat: 实现loadFunction预加载函数能力 + AI辅助编程标识
- 新增 loadFunction/callFunction/unloadFunction 预加载函数 API
- 预加载语义:加载文件→顶层执行一次→返回函数存入Lua Registry→可多次调用
- 与管道模式(load/runScript)存储完全解耦:funcs[]+Registry vs pkgs[]+虚拟栈
- 新增错误码 5023/5024/5025
- 新增单元测试:仓颉侧 8 个 + C++ GTest 侧 11 个
- 本机以 Cangjie 1.1.0 实编译并通过功能运行验证
- README/doc 增加 AI 辅助编程标识及预加载函数模式说明
2026-08-23 12:03:04 +08:00

114 lines
3.9 KiB
C
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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对象
}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);
/// @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