From 97a480249e7c8f605efd7a4252449791eabc90a8 Mon Sep 17 00:00:00 2001 From: unwox Date: Thu, 6 Jun 2024 16:08:13 +0600 Subject: refactor main.go into several files --- lua.go | 124 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 lua.go (limited to 'lua.go') diff --git a/lua.go b/lua.go new file mode 100644 index 0000000..874dac8 --- /dev/null +++ b/lua.go @@ -0,0 +1,124 @@ +package main + +/* +#cgo LDFLAGS: -llua +#include +#include +#include +#include +*/ +import "C" +import ( + "errors" + "unsafe" +) + +type LuaRef C.longlong +type Lua struct { + l *C.lua_State +} + +func (l *Lua) Start () { + l.l = C.luaL_newstate() + C.luaL_openlibs(l.l) +} + +func (l *Lua) Close () { + C.lua_close(l.l) + C.free(unsafe.Pointer(l.l)) +} + +func (l *Lua) Require (file string) (LuaRef, error) { + if !l.LoadFile(file) { + return 0, errors.New("could not open the file") + } + if !l.PCall(0, C.LUA_MULTRET) { + return 0, errors.New("could not execute the file") + } + if !l.IsTable(-1) { + return 0, errors.New("module did not return a table") + } + return l.PopToRef(), nil +} + + +func (l *Lua) PCall (nargs int, nresults int) bool { + res := C.lua_pcallk(l.l, C.int(nargs), C.int(nresults), 0, 0, nil) + return res == C.LUA_OK +} + +func (l *Lua) LoadFile (file string) bool { + cfile := C.CString(file) + defer C.free(unsafe.Pointer(cfile)) + res := C.luaL_loadfilex(l.l, cfile, nil) + return res == C.LUA_OK +} + +func (l *Lua) StackLen () int { + return int(C.lua_gettop(l.l)) +} + +func (l *Lua) ToString (index int) string { + return C.GoString(C.lua_tolstring(l.l, C.int(index), nil)) +} + +func (l *Lua) ToInt (index int) int { + return int(C.lua_tonumberx(l.l, C.int(index), nil)) +} + +func (l *Lua) PopToRef () LuaRef { + return LuaRef(C.luaL_ref(l.l, C.LUA_REGISTRYINDEX)) +} + +func (l *Lua) Pop (n int) { + C.lua_settop(l.l, C.int(-n - 1)) +} + +func (l *Lua) PushNil () { + C.lua_pushnil(l.l) +} + +func (l *Lua) PushString (str string) { + cstr := C.CString(str) + defer C.free(unsafe.Pointer(cstr)) + C.lua_pushstring(l.l, cstr) +} + +func (l *Lua) PushTable (table map[string]string) { + C.lua_createtable(l.l, 0, C.int(len(table))) + for k, v := range table { + l.PushString(v) + C.lua_setfield(l.l, -2, C.CString(k)) + } +} + +func (l *Lua) PushFromRef (ref LuaRef) { + C.lua_rawgeti(l.l, C.LUA_REGISTRYINDEX, C.longlong(ref)); +} + +func (l *Lua) IsString (index int) bool { + return C.lua_isstring(l.l, C.int(index)) == 1 +} + +func (l *Lua) IsNumber (index int) bool { + return C.lua_isnumber(l.l, C.int(index)) == 1 +} + +func (l *Lua) IsFunction (index int) bool { + return C.lua_type(l.l, C.int(index)) == C.LUA_TFUNCTION +} + +func (l *Lua) IsTable (index int) bool { + return C.lua_type(l.l, C.int(index)) == C.LUA_TTABLE +} + +func (l *Lua) Next () bool { + return C.lua_next(l.l, -2) != 0 +} + +func (l *Lua) PushTableItem (key string) { + ckey := C.CString(key) + defer C.free(unsafe.Pointer(ckey)) + C.lua_pushstring(l.l, ckey); + C.lua_gettable(l.l, -2); +} -- cgit v1.2.3