c/lua:dump & load demo use go file operate
This commit is contained in:
@@ -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!
|
||||||
|
*/
|
||||||
|
|||||||
@@ -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!
|
|
||||||
*/
|
|
||||||
|
|||||||
Reference in New Issue
Block a user