llgo/c/lua

This commit is contained in:
luoliwoshang
2024-06-27 18:19:45 +08:00
parent af3e326178
commit 7a294e6d4e
11 changed files with 679 additions and 0 deletions

View File

@@ -0,0 +1,21 @@
package main
import (
_ "unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func main() {
L := lua.NewState()
defer L.Close()
L.OpenLibs()
if res := L.LoadString(c.Str("function doubleNumber(x) ! return x * 2 end")); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
}
/* Expected output:
error: [string "function doubleNumber(x) ! return x * 2 end"]:1: unexpected symbol near '!'
*/

View File

@@ -0,0 +1,32 @@
package main
import (
_ "unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func main() {
L := lua.NewState()
defer L.Close()
L.OpenLibs()
if res := L.Dostring(c.Str("function combineParams(num, str) return 'Result: ' .. str .. ' ' .. num end")); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
L.GetGlobal(c.Str("combineParams"))
L.PushNumber(3.14159)
L.PushString(c.Str("Hello, World!"))
if res := L.PCall(2, 1, 0); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
if res := L.IsString(-1); res != 0 {
result := L.ToString(-1)
c.Printf(result)
}
}
/* Expected output:
Result: Hello, World! 3.14159
*/

View File

@@ -0,0 +1,39 @@
package main
import (
_ "unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func main() {
L := lua.NewState()
defer L.Close()
L.OpenLibs()
if res := L.LoadString(c.Str("function doubleNumber(x) return x * 2 end")); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
if res := L.PCall(0, 0, 0); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
L.GetGlobal(c.Str("doubleNumber"))
L.PushNumber(10)
if res := L.PCall(1, 1, 0); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
if res := L.IsNumber(-1); res != 0 {
result := L.ToInteger(-1)
c.Printf(c.Str("result: %lld\n"), result)
} else {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
}
/* Expected output:
result: 20
*/

View File

@@ -0,0 +1,48 @@
package main
import (
_ "unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func main() {
L := lua.NewState()
defer L.Close()
L.OpenLibs()
code := c.Str(
`function processStrings(a, b, c)
print('Received string a: ' .. a)
print('Received string b: ', b)
print('Received string c (formatted): ' .. c)
return a .. b .. c
end`)
if res := L.Dostring(code); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
L.GetGlobal(c.Str("processStrings"))
L.PushString(c.Str("Hello, World!"))
L.PushLString(c.Str(`Hello Lua In LLGO`), 17)
L.PushFString(c.Str(`Hello %s In %d`), c.Str("LLGO"), 2024)
if res := L.PCall(3, 1, 0); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
if res := L.IsString(-1); res != 0 {
result := L.ToString(-1)
c.Printf(c.Str("result: %s\n"), result)
}
}
/* Expected output:
Received string a: Hello, World!
Received string b: Hello Lua In LLGO
Received string c (formatted): Hello LLGO In 2024
result: Hello, World!Hello Lua In LLGOHello LLGO In 2024
*/

View File

@@ -0,0 +1,17 @@
package main
import (
_ "unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func main() {
L := lua.NewState()
defer L.Close()
L.OpenLibs()
if res := L.Dostring(c.Str("print('hello world')")); res != lua.OK {
println("error")
}
}

View File

@@ -0,0 +1,22 @@
package main
import (
_ "unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func main() {
L := lua.NewState()
defer L.Close()
L.OpenLibs()
if res := L.LoadString(c.Str("print('hello world')")); res != lua.OK {
println("error")
}
if res := L.PCall(0, 0, 0); res != lua.OK {
println("error")
}
}

View File

@@ -0,0 +1,42 @@
package main
import (
_ "unsafe"
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
func main() {
L := lua.NewState()
defer L.Close()
L.OpenLibs()
// TODO(zzy): fix push interger got stuck
code := c.Str(`function combineParams(x)
return x * 2
end`)
if res := L.Dostring(code); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
L.GetGlobal(c.Str("combineParams"))
c.Printf(c.Str("stack lens:%d\n"), L.GetTop()) // stack lens:1
L.PushInteger(lua.Integer(42))
pushed := L.ToInteger(-1)
c.Printf(c.Str("pushed: %lld\n"), pushed) // pushed: 0
c.Printf(c.Str("stack lens:%d\n"), L.GetTop()) // stack lens:1
// L.PushNumber(42)
// pushed := L.ToNumber(-1)
// c.Printf(c.Str("pushed: %f\n"), pushed)
if res := L.PCall(1, 1, 0); res != lua.OK {
c.Printf(c.Str("error: %s\n"), L.ToString(-1))
}
if res := L.IsNumber(-1); res != 0 {
result := L.ToInteger(-1)
c.Printf(c.Str("result %f"), result)
}
}

View File

@@ -0,0 +1,80 @@
package main
import (
"github.com/goplus/llgo/c"
"github.com/goplus/llgo/c/lua"
)
// printStack prints the current stack of the given Lua state.
func printStack(L *lua.Lua_State, stateName *c.Char) {
top := L.GetTop()
// c.Printf(c.Str("%s stack (top=%d): "), c.GoStringData("sdasd"), top)
c.Printf(c.Str("%s stack (top=%d):"), stateName, top)
for i := 1; i <= int(top); i++ {
c.Printf(c.Str("%s "), L.ToString(c.Int(i)))
}
c.Printf(c.Str("\n"))
}
func main() {
// Create a new Lua state and open libraries
L := lua.NewState()
defer L.Close()
L.OpenLibs()
// Push initial values onto the stack
L.PushString(c.Str("Hello"))
L.PushString(c.Str("LLGO"))
L.PushNumber(2024)
// Print initial stack
c.Printf(c.Str("Initial stack:\n"))
printStack(L, c.Str("L1"))
// Use absindex to ensure the index is positive
idx := -2
absIdx := L.AbsIndex(c.Int(idx))
c.Printf(c.Str("Absolute index of 'LLGO': %d\n"), absIdx)
// Copy 'LLGO' to the top of the stack
L.PushValue(absIdx)
c.Printf(c.Str("\nAfter pushing 'LLGO' to the top:\n"))
printStack(L, c.Str("L1"))
// Rotate stack elements
L.Rotate(c.Int(1), c.Int(-1))
c.Printf(c.Str("\nAfter rotating the stack:\n"))
printStack(L, c.Str("L1"))
// Copy the top element to index 2
L.Copy(c.Int(-1), c.Int(2))
c.Printf(c.Str("\nAfter copying the top element to index 2:\n"))
printStack(L, c.Str("L1"))
// Check if we can grow the stack
if L.CheckStack(c.Int(2)) == 0 {
c.Printf(c.Str("Cannot grow stack\n"))
return
}
// Push additional elements
L.PushNumber(3.14)
L.PushString(c.Str("Lua"))
c.Printf(c.Str("\nAfter pushing more elements:\n"))
printStack(L, c.Str("L1"))
// Set the top of the stack, clearing extra elements
L.SetTop(c.Int(5))
c.Printf(c.Str("\nAfter setting top to 5:\n"))
printStack(L, c.Str("L1"))
// Create a second Lua state
L1 := lua.NewState()
defer L1.Close()
// Move two elements to the new state
L.Xmove(L1, c.Int(2))
c.Printf(c.Str("\nAfter moving two elements to L1:\n"))
printStack(L, c.Str("L1"))
printStack(L1, c.Str("L2"))
}