summaryrefslogtreecommitdiff
path: root/lua.go
diff options
context:
space:
mode:
authorunwox <me@unwox.com>2024-06-06 16:08:13 +0600
committerunwox <me@unwox.com>2024-06-06 16:08:26 +0600
commit97a480249e7c8f605efd7a4252449791eabc90a8 (patch)
treecdf6cdad3d05cb22681af039cf6a3a6faf10adcb /lua.go
parent6ef4939963e85fa044753598cd8456d48a155d4a (diff)
refactor main.go into several files
Diffstat (limited to 'lua.go')
-rw-r--r--lua.go124
1 files changed, 124 insertions, 0 deletions
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 <stdlib.h>
+#include <lua.h>
+#include <lualib.h>
+#include <lauxlib.h>
+*/
+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);
+}