1
0
forked from redo/BlockLua

Fix all warnings and errors in C++

This commit is contained in:
2025-10-06 12:03:51 -04:00
parent 93a47d54be
commit e47f6d4651
17 changed files with 1373 additions and 1123 deletions

View File

@@ -2,16 +2,19 @@
// Includes
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <Windows.h>
#include <Psapi.h>
#include "lua.hpp"
#include "BlHooks.cpp"
#include "BlFuncs.cpp"
#include "BlHooks.cpp"
#include "lua.hpp"
#include "luainterp.cpp"
#include "lualibts.cpp"
lua_State* gL;
lua_State *gL;
#include "tsliblua.cpp"
// Global variables
@@ -19,87 +22,92 @@ lua_State* gL;
// Setup
// Hack to encode the contents of text files as static strings
#define INCLUDE_BIN(varname, filename) \
asm("_" #varname ": .incbin \"" filename "\""); \
asm(".byte 0"); \
extern char varname[];
#define INCLUDE_BIN(varname, filename) \
asm("_" #varname ": .incbin \"" filename "\""); \
asm(".byte 0"); \
extern char varname[];
INCLUDE_BIN(bll_fileLuaEnvSafe, "lua-env-safe.lua");
INCLUDE_BIN(bll_fileLuaEnv , "lua-env.lua");
INCLUDE_BIN(bll_fileTsEnv , "ts-env.cs" );
INCLUDE_BIN(bll_fileLuaStd , "util/std.lua");
INCLUDE_BIN(bll_fileLuaVector , "util/vector.lua");
INCLUDE_BIN(bll_fileLuaLibts , "util/libts-lua.lua");
INCLUDE_BIN(bll_fileTsLibts , "util/libts-ts.cs");
INCLUDE_BIN(bll_fileLuaLibbl , "util/libbl.lua" );
INCLUDE_BIN(bll_fileLuaLibblTypes , "util/libbl-types.lua");
INCLUDE_BIN(bll_fileLuaEnv, "lua-env.lua");
INCLUDE_BIN(bll_fileTsEnv, "ts-env.cs");
INCLUDE_BIN(bll_fileLuaStd, "util/std.lua");
INCLUDE_BIN(bll_fileLuaVector, "util/vector.lua");
INCLUDE_BIN(bll_fileLuaLibts, "util/libts-lua.lua");
INCLUDE_BIN(bll_fileTsLibts, "util/libts-ts.cs");
INCLUDE_BIN(bll_fileLuaLibbl, "util/libbl.lua");
INCLUDE_BIN(bll_fileLuaLibblTypes, "util/libbl-types.lua");
INCLUDE_BIN(bll_fileTsLibblSupport, "util/libbl-support.cs");
INCLUDE_BIN(bll_fileLoadaddons , "util/loadaddons.cs");
INCLUDE_BIN(bll_fileLoadaddons, "util/loadaddons.cs");
#define BLL_LOAD_LUA(lstate, vname) \
if(!bll_LuaEval(lstate, vname)) { \
BlPrintf(" Error executing " #vname); \
return false; \
}
#define BLL_LOAD_LUA(lstate, vname) \
if (!bll_LuaEval(lstate, vname)) { \
BlPrintf(" Error executing " #vname); \
return false; \
}
bool init() {
BlHooksInit();
BlPrintf("BlockLua: Loading");
BlFuncsInit();
// Initialize Lua environment
gL = lua_open();
luaL_openlibs(gL);
// Expose TS API to Lua
llibbl_init(gL);
// Set up Lua environment
BLL_LOAD_LUA(gL, bll_fileLuaEnv);
#ifndef BLLUA_UNSAFE
BLL_LOAD_LUA(gL, bll_fileLuaEnvSafe);
#endif
// Expose Lua API to TS
BlAddFunction(NULL, NULL, "_bllua_luacall", bll_ts_luacall, "LuaCall(name, ...) - Call Lua function and return result", 2, 20);
BlEval(bll_fileTsEnv);
// Load utilities
BLL_LOAD_LUA(gL, bll_fileLuaStd);
BLL_LOAD_LUA(gL, bll_fileLuaVector);
BLL_LOAD_LUA(gL, bll_fileLuaLibts);
BlEval(bll_fileTsLibts);
BLL_LOAD_LUA(gL, bll_fileLuaLibbl);
BLL_LOAD_LUA(gL, bll_fileLuaLibblTypes);
BlEval(bll_fileTsLibblSupport);
BlEval(bll_fileLoadaddons);
BlEval("$_bllua_active = 1;");
BlPrintf(" BlockLua: Done Loading");
return true;
BlHooksInit();
BlPrintf("BlockLua: Loading");
BlFuncsInit();
// Initialize Lua environment
gL = lua_open();
luaL_openlibs(gL);
// Expose TS API to Lua
llibbl_init(gL);
// Set up Lua environment
BLL_LOAD_LUA(gL, bll_fileLuaEnv);
#ifndef BLLUA_UNSAFE
BLL_LOAD_LUA(gL, bll_fileLuaEnvSafe);
#endif
// Expose Lua API to TS
BlAddFunction(NULL, NULL, "_bllua_luacall", bll_ts_luacall,
"LuaCall(name, ...) - Call Lua function and return result", 2,
20);
BlEval(bll_fileTsEnv);
// Load utilities
BLL_LOAD_LUA(gL, bll_fileLuaStd);
BLL_LOAD_LUA(gL, bll_fileLuaVector);
BLL_LOAD_LUA(gL, bll_fileLuaLibts);
BlEval(bll_fileTsLibts);
BLL_LOAD_LUA(gL, bll_fileLuaLibbl);
BLL_LOAD_LUA(gL, bll_fileLuaLibblTypes);
BlEval(bll_fileTsLibblSupport);
BlEval(bll_fileLoadaddons);
BlEval("$_bllua_active = 1;");
BlPrintf(" BlockLua: Done Loading");
return true;
}
bool deinit() {
BlPrintf("BlockLua: Unloading");
BlEval("deactivatePackage(_bllua_main);");
BlEval("$_bllua_active = 0;");
bll_LuaEval(gL, "for _,f in pairs(_bllua_on_unload) do f() end");
lua_close(gL);
BlHooksDeinit();
BlFuncsDeinit();
BlPrintf(" BlockLua: Done Unloading");
return true;
BlPrintf("BlockLua: Unloading");
BlEval("deactivatePackage(_bllua_main);");
BlEval("$_bllua_active = 0;");
bll_LuaEval(gL, "for _,f in pairs(_bllua_on_unload) do f() end");
lua_close(gL);
BlHooksDeinit();
BlFuncsDeinit();
BlPrintf(" BlockLua: Done Unloading");
return true;
}
bool __stdcall DllMain(HINSTANCE hinstance, DWORD reason, void* reserved) {
switch(reason) {
case DLL_PROCESS_ATTACH: return init();
case DLL_PROCESS_DETACH: return deinit();
default : return true;
}
bool __stdcall DllMain(HINSTANCE hinstance, DWORD reason, void *reserved) {
switch (reason) {
case DLL_PROCESS_ATTACH:
return init();
case DLL_PROCESS_DETACH:
return deinit();
default:
return true;
}
}

View File

@@ -1,68 +1,78 @@
// Handle errors with a Lua function, defined in lua-env.lua
#include "luainterp.hpp"
#include "BlHooks.hpp"
#include "lauxlib.h"
#include "lua.h"
#include <cstring>
int bll_error_handler(lua_State *L) {
lua_getfield(L, LUA_GLOBALSINDEX, "_bllua_on_error");
if (!lua_isfunction(L, -1)) {
BlPrintf(" Lua error handler: _bllua_on_error not defined.");
lua_pop(L, 1);
return 1;
}
// move function to before arg
int hpos = lua_gettop(L) - 1;
lua_insert(L, hpos);
lua_pcall(L, 1, 1, 0);
return 1;
lua_getfield(L, LUA_GLOBALSINDEX, "_bllua_on_error");
if (!lua_isfunction(L, -1)) {
BlPrintf(" Lua error handler: _bllua_on_error not defined.");
lua_pop(L, 1);
return 1;
}
// move function to before arg
int hpos = lua_gettop(L) - 1;
lua_insert(L, hpos);
lua_pcall(L, 1, 1, 0);
return 1;
}
int bll_pcall(lua_State* L, int nargs, int nret) {
// calculate stack position for message handler
int hpos = lua_gettop(L) - nargs;
// push custom error message handler
lua_pushcfunction(L, bll_error_handler);
// move it before function and arguments
lua_insert(L, hpos);
// call lua_pcall function with custom handler
int ret = lua_pcall(L, nargs, nret, hpos);
// remove custom error message handler from stack
lua_remove(L, hpos);
return ret;
int bll_pcall(lua_State *L, int nargs, int nret) {
// calculate stack position for message handler
int hpos = lua_gettop(L) - nargs;
// push custom error message handler
lua_pushcfunction(L, bll_error_handler);
// move it before function and arguments
lua_insert(L, hpos);
// call lua_pcall function with custom handler
int ret = lua_pcall(L, nargs, nret, hpos);
// remove custom error message handler from stack
lua_remove(L, hpos);
return ret;
}
// Display the last Lua error in the BL console
void bll_printError(lua_State* L, const char* operation, const char* item) {
//error_handler(L);
BlPrintf("\x03Lua error: %s", lua_tostring(L, -1));
BlPrintf("\x03 (%s: %s)", operation, item);
lua_pop(L, 1);
void bll_printError(lua_State *L, const char *operation, const char *item) {
// error_handler(L);
BlPrintf("\x03Lua error: %s", lua_tostring(L, -1));
BlPrintf("\x03 (%s: %s)", operation, item);
lua_pop(L, 1);
}
// Eval a string of Lua code
bool bll_LuaEval(lua_State* L, const char* str) {
if(luaL_loadbuffer(L, str, strlen(str), "input") || bll_pcall(L, 0, 1)) {
bll_printError(L, "eval", str);
return false;
}
return true;
bool bll_LuaEval(lua_State *L, const char *str) {
if (luaL_loadbuffer(L, str, strlen(str), "input") || bll_pcall(L, 0, 1)) {
bll_printError(L, "eval", str);
return false;
}
return true;
}
// Convert a Lua stack entry into a string for providing to TS
// Use static buffer to avoid excessive malloc
#define BLL_ARG_COUNT 20
#define BLL_ARG_MAX 8192
char bll_arg_buffer[BLL_ARG_COUNT][BLL_ARG_MAX];
bool bll_toarg(lua_State* L, char* buf, int i, bool err) {
if(lua_isstring(L, i)) {
const char* str = lua_tostring(L, i);
if(strlen(str) >= BLL_ARG_MAX) {
if(err) luaL_error(L, "argument to TS is too long - max length is 8192");
return true;
} else {
strcpy(buf, str);
return false;
}
} else {
if(err) luaL_error(L, "argument to TS must be a string");
return true;
}
bool bll_toarg(lua_State *L, char *buf, int i, bool err) {
if (lua_isstring(L, i)) {
const char *str = lua_tostring(L, i);
if (strlen(str) >= BLL_ARG_MAX) {
if (err)
luaL_error(L, "argument to TS is too long - max length is 8192");
return true;
} else {
#ifdef _MSC_VER
strncpy_s(buf, BLL_ARG_MAX, str, _TRUNCATE);
#else
strncpy(buf, str, BLL_ARG_MAX - 1);
buf[BLL_ARG_MAX - 1] = '\0';
#endif
return false;
}
} else {
if (err)
luaL_error(L, "argument to TS must be a string");
return true;
}
}

16
src/luainterp.hpp Normal file
View File

@@ -0,0 +1,16 @@
// Shared declarations for Lua <-> TS argument handling
#ifndef _H_LUAINTERP_SHARED
#define _H_LUAINTERP_SHARED
#include "lua.h"
#define BLL_ARG_COUNT 20
#define BLL_ARG_MAX 8192
extern char bll_arg_buffer[BLL_ARG_COUNT][BLL_ARG_MAX];
bool bll_toarg(lua_State *L, char *buf, int i, bool err);
int bll_pcall(lua_State *L, int nargs, int nret);
void bll_printError(lua_State *L, const char *operation, const char *item);
extern lua_State *gL;
#endif

View File

@@ -1,159 +1,303 @@
//run ../compile
// run ../compile
// TS -> Lua API
// Call a TS function from Lua, push the result to Lua stack
int bll_TsCall(lua_State* L, const char* oname, const char* fname, int argc, int ofs) {
ADDR obj = (ADDR)NULL;
if(oname) {
obj = BlObject(oname);
if(!obj) { return luaL_error(L, "Lua->TS call: Object not found"); }
}
if(argc > BLL_ARG_COUNT) { return luaL_error(L, "Lua->TS call: Too many arguments (Max is 19)"); }
char* argv[BLL_ARG_COUNT];
for(int i=0; i<argc; i++) {
char* argbuf = bll_arg_buffer[i];
argv[i] = argbuf;
bll_toarg(L, argbuf, i+ofs+1, true);
}
// /:^| /
const char* res;
if(obj) {
switch(argc) {
case 0: res = BlCallObj(obj, fname); break; // no idea why this happens sometimes, it shouldnt be possible
case 1: res = BlCallObj(obj, fname); break;
case 2: res = BlCallObj(obj, fname, argv[0]); break;
case 3: res = BlCallObj(obj, fname, argv[0], argv[1]); break;
case 4: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2]); break;
case 5: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3]); break;
case 6: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4]); break;
case 7: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]); break;
case 8: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]); break;
case 9: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]); break;
case 10: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]); break;
case 11: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]); break;
case 12: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]); break;
case 13: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11]); break;
case 14: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12]); break;
case 15: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13]); break;
case 16: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14]); break;
case 17: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15]); break;
case 18: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16]); break;
case 19: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17]); break;
case 20: res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17], argv[18]); break;
default: res = ""; luaL_error(L, "Lua->TS object call: Too many arguments (Max is 19)");
}
} else {
switch(argc) {
case 0: res = BlCall(fname); break;
case 1: res = BlCall(fname, argv[0]); break;
case 2: res = BlCall(fname, argv[0], argv[1]); break;
case 3: res = BlCall(fname, argv[0], argv[1], argv[2]); break;
case 4: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3]); break;
case 5: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4]); break;
case 6: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]); break;
case 7: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6]); break;
case 8: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7]); break;
case 9: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8]); break;
case 10: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9]); break;
case 11: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]); break;
case 12: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11]); break;
case 13: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12]); break;
case 14: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13]); break;
case 15: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14]); break;
case 16: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15]); break;
case 17: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16]); break;
case 18: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17]); break;
case 19: res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5], argv[6], argv[7], argv[8], argv[9], argv[10], argv[11], argv[12], argv[13], argv[14], argv[15], argv[16], argv[17], argv[18]); break;
default: res = ""; luaL_error(L, "Lua->TS call: Too many arguments (Max is 19)");
}
}
lua_pushstring(L, res);
return 1;
#include "BlFuncs.hpp"
#include "BlHooks.hpp"
#include "lauxlib.h"
#include "lua.h"
#include "luainterp.hpp"
int bll_TsCall(lua_State *L, const char *oname, const char *fname, int argc,
int ofs) {
ADDR obj = (ADDR)NULL;
if (oname) {
obj = BlObject(oname);
if (!obj) {
return luaL_error(L, "Lua->TS call: Object not found");
}
}
if (argc > BLL_ARG_COUNT) {
return luaL_error(L, "Lua->TS call: Too many arguments (Max is 19)");
}
char *argv[BLL_ARG_COUNT];
for (int i = 0; i < argc; i++) {
char *argbuf = bll_arg_buffer[i];
argv[i] = argbuf;
bll_toarg(L, argbuf, i + ofs + 1, true);
}
// /:^| /
const char *res;
if (obj) {
switch (argc) {
case 0:
res = BlCallObj(obj, fname);
break; // no idea why this happens sometimes, it shouldnt be possible
case 1:
res = BlCallObj(obj, fname);
break;
case 2:
res = BlCallObj(obj, fname, argv[0]);
break;
case 3:
res = BlCallObj(obj, fname, argv[0], argv[1]);
break;
case 4:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2]);
break;
case 5:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3]);
break;
case 6:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4]);
break;
case 7:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5]);
break;
case 8:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6]);
break;
case 9:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7]);
break;
case 10:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8]);
break;
case 11:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8], argv[9]);
break;
case 12:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8], argv[9], argv[10]);
break;
case 13:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
argv[11]);
break;
case 14:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
argv[11], argv[12]);
break;
case 15:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
argv[11], argv[12], argv[13]);
break;
case 16:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
argv[11], argv[12], argv[13], argv[14]);
break;
case 17:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
argv[11], argv[12], argv[13], argv[14], argv[15]);
break;
case 18:
res =
BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
argv[11], argv[12], argv[13], argv[14], argv[15], argv[16]);
break;
case 19:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
argv[11], argv[12], argv[13], argv[14], argv[15],
argv[16], argv[17]);
break;
case 20:
res = BlCallObj(obj, fname, argv[0], argv[1], argv[2], argv[3], argv[4],
argv[5], argv[6], argv[7], argv[8], argv[9], argv[10],
argv[11], argv[12], argv[13], argv[14], argv[15],
argv[16], argv[17], argv[18]);
break;
default:
res = "";
luaL_error(L, "Lua->TS object call: Too many arguments (Max is 19)");
}
} else {
switch (argc) {
case 0:
res = BlCall(fname);
break;
case 1:
res = BlCall(fname, argv[0]);
break;
case 2:
res = BlCall(fname, argv[0], argv[1]);
break;
case 3:
res = BlCall(fname, argv[0], argv[1], argv[2]);
break;
case 4:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3]);
break;
case 5:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4]);
break;
case 6:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5]);
break;
case 7:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6]);
break;
case 8:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7]);
break;
case 9:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8]);
break;
case 10:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9]);
break;
case 11:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9], argv[10]);
break;
case 12:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9], argv[10], argv[11]);
break;
case 13:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
argv[12]);
break;
case 14:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
argv[12], argv[13]);
break;
case 15:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
argv[12], argv[13], argv[14]);
break;
case 16:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
argv[12], argv[13], argv[14], argv[15]);
break;
case 17:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
argv[12], argv[13], argv[14], argv[15], argv[16]);
break;
case 18:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
argv[12], argv[13], argv[14], argv[15], argv[16], argv[17]);
break;
case 19:
res = BlCall(fname, argv[0], argv[1], argv[2], argv[3], argv[4], argv[5],
argv[6], argv[7], argv[8], argv[9], argv[10], argv[11],
argv[12], argv[13], argv[14], argv[15], argv[16], argv[17],
argv[18]);
break;
default:
res = "";
luaL_error(L, "Lua->TS call: Too many arguments (Max is 19)");
}
}
lua_pushstring(L, res);
return 1;
}
// Lua lib function: ts.call
int bll_lua_tscall(lua_State* L) {
int argc = lua_gettop(L)-1; // number of arguments after function name
if(argc < 0) return luaL_error(L, "_bllua_ts.call: Must provide a function name");
const char* fname = luaL_checkstring(L, 1);
return bll_TsCall(L, NULL, fname, argc, 1);
int bll_lua_tscall(lua_State *L) {
int argc = lua_gettop(L) - 1; // number of arguments after function name
if (argc < 0)
return luaL_error(L, "_bllua_ts.call: Must provide a function name");
const char *fname = luaL_checkstring(L, 1);
return bll_TsCall(L, NULL, fname, argc, 1);
}
// Lua lib function: ts.callobj
int bll_lua_tscallobj(lua_State* L) {
int argc = lua_gettop(L)-2; // number of arguments after function name and object?
if(argc < 0) return luaL_error(L, "_bllua_ts.callobj: Must provide an object and function name");
const char* oname = luaL_checkstring(L, 1);
const char* fname = luaL_checkstring(L, 2);
return bll_TsCall(L, oname, fname, argc, 2);
int bll_lua_tscallobj(lua_State *L) {
int argc =
lua_gettop(L) - 2; // number of arguments after function name and object?
if (argc < 0)
return luaL_error(
L, "_bllua_ts.callobj: Must provide an object and function name");
const char *oname = luaL_checkstring(L, 1);
const char *fname = luaL_checkstring(L, 2);
return bll_TsCall(L, oname, fname, argc, 2);
}
// Lua lib function: ts.getvar
int bll_lua_tsgetvar(lua_State* L) {
const char* vname = luaL_checkstring(L, 1);
const char* var = BlGetVar(vname);
lua_pushstring(L, var);
return 1;
int bll_lua_tsgetvar(lua_State *L) {
const char *vname = luaL_checkstring(L, 1);
const char *var = BlGetVar(vname);
lua_pushstring(L, var);
return 1;
}
// Lua lib function: ts.getfield
int bll_lua_tsgetfield(lua_State* L) {
const char* oname = luaL_checkstring(L, 1);
const char* vname = luaL_checkstring(L, 2);
ADDR obj = BlObject(oname);
if(!obj) { return luaL_error(L, "_bllua_ts.getfield: Object not found"); }
const char* val = BlGetField(obj, vname, NULL);
lua_pushstring(L, val);
return 1;
int bll_lua_tsgetfield(lua_State *L) {
const char *oname = luaL_checkstring(L, 1);
const char *vname = luaL_checkstring(L, 2);
ADDR obj = BlObject(oname);
if (!obj) {
return luaL_error(L, "_bllua_ts.getfield: Object not found");
}
const char *val = BlGetField(obj, vname, NULL);
lua_pushstring(L, val);
return 1;
}
// Lua lib function: ts.setfield
int bll_lua_tssetfield(lua_State* L) {
const char* oname = luaL_checkstring(L, 1);
const char* vname = luaL_checkstring(L, 2);
const char* val = luaL_checkstring(L, 3);
ADDR obj = BlObject(oname);
if(!obj) { return luaL_error(L, "_bllua_ts.setfield: Object not found"); }
BlSetField(obj, vname, NULL, val);
return 0;
int bll_lua_tssetfield(lua_State *L) {
const char *oname = luaL_checkstring(L, 1);
const char *vname = luaL_checkstring(L, 2);
const char *val = luaL_checkstring(L, 3);
ADDR obj = BlObject(oname);
if (!obj) {
return luaL_error(L, "_bllua_ts.setfield: Object not found");
}
BlSetField(obj, vname, NULL, val);
return 0;
}
// Lua lib function: ts.eval
int bll_lua_tseval(lua_State* L) {
const char* str = luaL_checkstring(L, 1);
const char* res = BlEval(str);
lua_pushstring(L, res);
return 1;
int bll_lua_tseval(lua_State *L) {
const char *str = luaL_checkstring(L, 1);
const char *res = BlEval(str);
lua_pushstring(L, res);
return 1;
}
// Lua lib function: ts.echo
// Print to BL console - used in Lua print implementation
int bll_lua_tsecho(lua_State* L) {
const char* str = luaL_checkstring(L, 1);
BlPrintf("%s", str);
return 0;
int bll_lua_tsecho(lua_State *L) {
const char *str = luaL_checkstring(L, 1);
BlPrintf("%s", str);
return 0;
}
const luaL_Reg bll_lua_reg[] = {
{"call" , bll_lua_tscall },
{"callobj" , bll_lua_tscallobj },
{"getvar" , bll_lua_tsgetvar },
{"getfield", bll_lua_tsgetfield},
{"setfield", bll_lua_tssetfield},
{"eval" , bll_lua_tseval },
{"echo" , bll_lua_tsecho },
{NULL, NULL},
{"call", bll_lua_tscall}, {"callobj", bll_lua_tscallobj},
{"getvar", bll_lua_tsgetvar}, {"getfield", bll_lua_tsgetfield},
{"setfield", bll_lua_tssetfield}, {"eval", bll_lua_tseval},
{"echo", bll_lua_tsecho}, {NULL, NULL},
};
void llibbl_init(lua_State* L) {
luaL_register(L, "_bllua_ts", bll_lua_reg);
}
void llibbl_init(lua_State *L) { luaL_register(L, "_bllua_ts", bll_lua_reg); }

View File

@@ -1,25 +1,32 @@
// Call a Lua function from TS, return true if success - result will be on Lua stack
bool bll_LuaCall(const char* fname, int argc, const char* argv[]) {
lua_getglobal(gL, fname);
for(int i=0; i<argc; i++) {
lua_pushstring(gL, argv[i]);
}
if(bll_pcall(gL, argc, 1)) {
bll_printError(gL, "call", fname);
return false;
}
return true;
// Call a Lua function from TS, return true if success - result will be on Lua
// stack
#include "BlFuncs.hpp"
#include "BlHooks.hpp"
#include "luainterp.hpp"
bool bll_LuaCall(const char *fname, int argc, const char *argv[]) {
lua_getglobal(gL, fname);
for (int i = 0; i < argc; i++) {
lua_pushstring(gL, argv[i]);
}
if (bll_pcall(gL, argc, 1)) {
bll_printError(gL, "call", fname);
return false;
}
return true;
}
// TS lib function: luacall
const char* bll_ts_luacall(ADDR obj, int argc, const char* argv[]) {
if(argc<2) return "";
if(!bll_LuaCall(argv[1], argc-2, &argv[2])) { return ""; }
char* retbuf = BlReturnBuffer(BLL_ARG_MAX);
bll_toarg(gL, retbuf, -1, false); // provide returned value to ts
lua_pop(gL, 1); // pop returned value
return retbuf;
const char *bll_ts_luacall(ADDR obj, int argc, const char *argv[]) {
if (argc < 2)
return "";
if (!bll_LuaCall(argv[1], argc - 2, &argv[2])) {
return "";
}
char *retbuf = BlReturnBuffer(BLL_ARG_MAX);
bll_toarg(gL, retbuf, -1, false); // provide returned value to ts
lua_pop(gL, 1); // pop returned value
return retbuf;
}

View File

@@ -135,8 +135,8 @@ end
---@diagnostic disable-next-line: duplicate-set-field
function io.lines(fn)
local fi, err, fn2 = io.open(fn, nil, 2)
if not fi then error('Error opening file \'' .. fn2 .. '\': ' .. err, 2) end
local fi, err, fn2 = io.open(fn, 'r', 2)
if not fi then error('Error opening file \'' .. tostring(fn2) .. '\': ' .. tostring(err), 2) end
return fi:lines()
end
@@ -156,7 +156,7 @@ function dofile(fn, errn)
errn = errn or 1
local fi, err, fn2 = io.open(fn, 'r', errn + 1)
if not fi then error('Error executing file \'' .. fn2 .. '\': ' .. err, errn + 1) end
if not fi then error('Error executing file \'' .. tostring(fn2) .. '\': ' .. tostring(err), errn + 1) end
print('Executing ' .. fn2)
local text = fi:read('*a')