Files
llgo/c/lua/_demo/dump/load/load.go
2024-09-01 00:33:00 +08:00

69 lines
1.3 KiB
Go

package main
import (
"os"
"unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func reader(L *lua.State, data c.Pointer, size *c.Ulong) *c.Char {
file := (*os.File)(data)
fileInfo, err := file.Stat()
if err != nil {
return nil
}
fileSize := fileInfo.Size()
buffer := make([]byte, fileSize)
bytesRead, err := file.Read(buffer)
if err != nil {
return nil
}
*size = c.Ulong(bytesRead)
if bytesRead > 0 {
return (*c.Char)(unsafe.Pointer(unsafe.SliceData(buffer)))
}
return nil
}
func main() {
L := lua.Newstate()
defer L.Close()
L.Openlibs()
file, err := os.Open("../llgofunc.luac")
if err != nil {
c.Printf(c.Str("Failed to open file for reading\n"))
return
}
defer file.Close()
if L.Load(reader, c.Pointer(file), c.Str("greet"), nil) != lua.OK {
c.Printf(c.Str("Failed to dump Lua function\n"))
}
c.Printf(c.Str("Stack size before call: %d\n"), L.Gettop())
c.Printf(c.Str("Top element type after call: %s\n"), L.Typename(L.Type(-1)))
L.Pushstring(c.Str("World"))
if L.Pcall(1, 1, 0) != lua.OK {
c.Printf(c.Str("Failed to call function: %s\n"))
}
if L.Isstring(-1) != 0 {
c.Printf(c.Str("Result: %s\n"), L.Tostring(-1))
}
}
/* Expected output:
Stack size before call: 1
Top element type after call: function
Result: Hello, World!
*/