c/lua:dump & load demo use go file operate

This commit is contained in:
luoliwoshang
2024-09-01 00:33:00 +08:00
parent d1f64d3059
commit 85c4a2fdc2
2 changed files with 49 additions and 21 deletions

View File

@@ -1,6 +1,7 @@
package main package main
import ( import (
"os"
"unsafe" "unsafe"
"github.com/goplus/llgo/c" "github.com/goplus/llgo/c"
@@ -8,11 +9,26 @@ import (
) )
func reader(L *lua.State, data c.Pointer, size *c.Ulong) *c.Char { func reader(L *lua.State, data c.Pointer, size *c.Ulong) *c.Char {
buffer := make([]c.Char, 4096) file := (*os.File)(data)
*size = c.Ulong(c.Fread(c.Pointer(unsafe.SliceData(buffer)), uintptr(1), uintptr(unsafe.Sizeof(buffer)), data))
if *size > 0 { fileInfo, err := file.Stat()
return &buffer[0] 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 return nil
} }
@@ -21,12 +37,14 @@ func main() {
defer L.Close() defer L.Close()
L.Openlibs() L.Openlibs()
file := c.Fopen(c.Str("../llgofunc.luac"), c.Str("rb")) file, err := os.Open("../llgofunc.luac")
if file == nil { if err != nil {
c.Printf(c.Str("Failed to open file for writing\n")) c.Printf(c.Str("Failed to open file for reading\n"))
return
} }
defer file.Close()
if L.Load(reader, file, c.Str("greet"), nil) != lua.OK { 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("Failed to dump Lua function\n"))
} }
@@ -42,3 +60,9 @@ func main() {
c.Printf(c.Str("Result: %s\n"), L.Tostring(-1)) 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!
*/

View File

@@ -1,17 +1,25 @@
package main package main
import ( import (
"os"
"unsafe"
"github.com/goplus/llgo/c" "github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua" "github.com/goplus/llgo/c/lua"
) )
func writer(L *lua.State, p c.Pointer, sz c.Ulong, ud c.Pointer) c.Int { func writer(L *lua.State, p c.Pointer, sz c.Ulong, ud c.Pointer) c.Int {
if c.Fwrite(p, uintptr(sz), 1, ud) == 1 { file := (*os.File)(ud)
return lua.OK data := unsafe.Slice((*byte)(p), sz)
}
n, err := file.Write(data)
if err != nil || n != int(sz) {
return 1 return 1
} }
return lua.OK
}
func main() { func main() {
L := lua.Newstate() L := lua.Newstate()
defer L.Close() defer L.Close()
@@ -34,19 +42,15 @@ func main() {
c.Printf(c.Str("Expected a function, but got %s"), L.Typename(L.Type(-1))) c.Printf(c.Str("Expected a function, but got %s"), L.Typename(L.Type(-1)))
} }
file := c.Fopen(c.Str("../llgofunc.luac"), c.Str("wb")) file, err := os.Create("../llgofunc.luac")
if file == nil { if err != nil {
c.Printf(c.Str("Failed to open file for writing\n")) c.Printf(c.Str("Failed to open file for writing\n"))
return
} }
defer file.Close()
if L.Dump(writer, file, 0) != lua.OK { if L.Dump(writer, c.Pointer(file), 0) != lua.OK {
c.Printf(c.Str("Failed to dump Lua function\n")) c.Printf(c.Str("Failed to dump Lua function\n"))
} }
} }
/* Expected output:
Stack size before call: 1
Top element type after call: function
Result: Hello, World!
*/