122 lines
2.9 KiB
C
122 lines
2.9 KiB
C
/**
|
|
* Copyright (c) 2025 Dominic Masters
|
|
*
|
|
* This software is released under the MIT License.
|
|
* https://opensource.org/licenses/MIT
|
|
*/
|
|
|
|
#pragma once
|
|
#include "script/scriptcontext.h"
|
|
#include "debug/debug.h"
|
|
#include "assert/assert.h"
|
|
#include "util/string.h"
|
|
#include "script/scriptmodule.h"
|
|
|
|
int moduleSysPrint(lua_State *L) {
|
|
assertNotNull(L, "Lua state cannot be NULL");
|
|
|
|
int n = lua_gettop(L);
|
|
luaL_Buffer b;
|
|
luaL_buffinit(L, &b);
|
|
|
|
for (int i = 1; i <= n; ++i) {
|
|
size_t len;
|
|
const char *s = luaL_tolstring(L, i, &len); // converts any value to string
|
|
luaL_addlstring(&b, s, len);
|
|
lua_pop(L, 1); // pop result of luaL_tolstring
|
|
if (i < n) luaL_addlstring(&b, "\t", 1);
|
|
}
|
|
|
|
luaL_pushresult(&b);
|
|
const char *msg = lua_tostring(L, -1);
|
|
debugPrint("%s\n", msg);
|
|
return 0; // no values returned to Lua
|
|
}
|
|
|
|
int moduleSysInclude(lua_State *L) {
|
|
assertNotNull(L, "Lua state cannot be NULL");
|
|
|
|
if(!lua_isstring(L, 1)) {
|
|
luaL_error(L, "Expected string filename");
|
|
return 0;
|
|
}
|
|
|
|
scriptcontext_t* ctx = *(scriptcontext_t**)lua_getextraspace(L);
|
|
if(ctx == NULL) {
|
|
luaL_error(L, "Script context is NULL");
|
|
return 0;
|
|
}
|
|
|
|
const char_t *filename = luaL_checkstring(L, 1);
|
|
if(filename == NULL || filename[0] == '\0') {
|
|
luaL_error(L, "Filename cannot be NULL");
|
|
return 0;
|
|
}
|
|
|
|
// Copy out filename to mutable buffer
|
|
char_t buffer[1024];
|
|
stringCopy(buffer, filename, 1024);
|
|
|
|
// Ensure it has .dsf extension
|
|
size_t len = strlen(buffer);
|
|
if(len < 4 || strcmp(&buffer[len - 4], ".dsf") != 0) {
|
|
// Append .dsf
|
|
if(len + 4 >= 1024) {
|
|
luaL_error(L, "Filename too long to append .dsf");
|
|
return 0;
|
|
}
|
|
stringCopy(&buffer[len], ".dsf", 5);
|
|
}
|
|
|
|
// Execute the script file
|
|
errorret_t err = scriptContextExecFile(
|
|
ctx,
|
|
buffer
|
|
);
|
|
if(err.code != ERROR_OK) {
|
|
luaL_error(L, "Failed to include script file");
|
|
errorCatch(errorPrint(err));
|
|
return 0;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
int moduleSysModule(lua_State *L) {
|
|
assertNotNull(L, "Lua state cannot be NULL");
|
|
|
|
if(!lua_isstring(L, 1)) {
|
|
luaL_error(L, "Expected string module name");
|
|
return 0;
|
|
}
|
|
|
|
const char_t *moduleName = luaL_checkstring(L, 1);
|
|
if(moduleName == NULL) {
|
|
luaL_error(L, "Module name cannot be NULL");
|
|
return 0;
|
|
}
|
|
|
|
const scriptmodule_t *module = scriptModuleGetByName(moduleName);
|
|
if(module == NULL) {
|
|
luaL_error(L, "Module '%s' not found", moduleName);
|
|
return 0;
|
|
}
|
|
|
|
scriptcontext_t* ctx = *(scriptcontext_t**)lua_getextraspace(L);
|
|
if(ctx == NULL) {
|
|
luaL_error(L, "Script context is NULL");
|
|
return 0;
|
|
}
|
|
|
|
module->callback(ctx);
|
|
|
|
return 0;
|
|
}
|
|
|
|
void moduleSystem(scriptcontext_t *context) {
|
|
assertNotNull(context, "Script context cannot be NULL");
|
|
|
|
scriptContextRegFunc(context, "print", moduleSysPrint);
|
|
scriptContextRegFunc(context, "include", moduleSysInclude);
|
|
scriptContextRegFunc(context, "module", moduleSysModule);
|
|
} |