/* Copyright (C) 2015 Graham Sanderson, All Rights Reserved */ #include "extdll.h" #include "eiface.h" #include "util.h" #include "game.h" #include "gslua.h" #include "lua/lua.hpp" #define MAX_LUA_LIB_FUNCS 200 extern lua_State *g_L; extern BOOL g_bLuaInitialized; static const luaL_Reg gsLib_METHODS[] = { { "_Print_Console", LUA_PrintConsole }, { NULL, NULL } }; // --- Init/quit --- void LuaInit(void) { g_L = luaL_newstate(); g_bLuaInitialized = TRUE; ALERT(at_console, "[HLua] Lua initialized.\n"); LuaRegisterFunctions(); if(luaL_dostring(g_L, "_Print_Console(\"[HLua::Lua] Initialization success!\");") == TRUE) { LuaError("[HLua] Failed initial Lua test. Stopping Lua.\n"); } } void LuaQuit(void) { lua_close(g_L); ALERT(at_console, "[HLua] Lua shutdown.\n"); } // --- Error functions --- void LuaError(char *szFmt) { char const * szFmtC = (const char *) szFmt; ALERT(at_error, szFmt); g_bLuaInitialized = FALSE; LuaQuit(); g_L = NULL; } void LuaCheckNull(void const *vpToCheck) { if (vpToCheck == NULL) { LuaError ("[HLua] Null pointer exception!"); } } // --- Binded lua functions --- void LuaRegisterFunctions(void) { int i; ALERT(at_console, "[HLua] Registering functions.\n"); for(i = 0; i < MAX_LUA_LIB_FUNCS; i++) { if(gsLib_METHODS[i].name == NULL && gsLib_METHODS[i].func == NULL) break; lua_register(g_L, gsLib_METHODS[i].name, gsLib_METHODS[i].func); } ALERT(at_console, "[HLua] Register success, got %d functions.\n", i); } int LUA_PrintConsole(lua_State *L) { const char *szToWrite = luaL_checkstring(L, 1); LuaCheckNull(szToWrite); ALERT(at_console, "%s\n", szToWrite); return 0; }