c/lua:table field operate
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"unsafe"
|
||||||
|
|
||||||
"github.com/goplus/llgo/c"
|
"github.com/goplus/llgo/c"
|
||||||
"github.com/goplus/llgo/c/lua"
|
"github.com/goplus/llgo/c/lua"
|
||||||
)
|
)
|
||||||
@@ -8,9 +10,19 @@ import (
|
|||||||
func printTable(L *lua.State) {
|
func printTable(L *lua.State) {
|
||||||
L.Pushnil()
|
L.Pushnil()
|
||||||
for L.Next(-2) != 0 {
|
for L.Next(-2) != 0 {
|
||||||
key := L.Tostring(-2)
|
|
||||||
value := L.Tostring(-1)
|
value := L.Tostring(-1)
|
||||||
c.Printf(c.Str("%s - %s\n"), key, value)
|
switch L.Type(-2) {
|
||||||
|
case lua.STRING:
|
||||||
|
key := L.Tostring(-2)
|
||||||
|
c.Printf(c.Str("%s - %s\n"), key, value)
|
||||||
|
case lua.NUMBER:
|
||||||
|
key := L.Tonumber(-2)
|
||||||
|
c.Printf(c.Str("[%.0f] - %s\n"), key, value)
|
||||||
|
case lua.LIGHTUSERDATA:
|
||||||
|
c.Printf(c.Str("[pointer] - %s\n"), value)
|
||||||
|
default:
|
||||||
|
c.Printf(c.Str("unknown key type %s %d\n"), L.Typename(-2), L.Type(-2))
|
||||||
|
}
|
||||||
L.Pop(1)
|
L.Pop(1)
|
||||||
}
|
}
|
||||||
L.Pop(1)
|
L.Pop(1)
|
||||||
@@ -24,37 +36,65 @@ func main() {
|
|||||||
|
|
||||||
L.Newtable()
|
L.Newtable()
|
||||||
|
|
||||||
|
// set table name:John
|
||||||
L.Pushstring(c.Str("name"))
|
L.Pushstring(c.Str("name"))
|
||||||
L.Pushstring(c.Str("John"))
|
L.Pushstring(c.Str("John"))
|
||||||
L.Settable(-3)
|
L.Settable(-3)
|
||||||
|
|
||||||
|
// set table age:30
|
||||||
L.Pushstring(c.Str("age"))
|
L.Pushstring(c.Str("age"))
|
||||||
L.Pushnumber(30)
|
L.Pushnumber(30)
|
||||||
L.Settable(-3)
|
L.Settable(-3)
|
||||||
|
|
||||||
|
// set table field fullname:John Doe
|
||||||
L.Pushstring(c.Str("John Doe"))
|
L.Pushstring(c.Str("John Doe"))
|
||||||
L.Setfield(-2, c.Str("fullname"))
|
L.Setfield(-2, c.Str("fullname"))
|
||||||
|
|
||||||
|
// set index field
|
||||||
|
L.Pushinteger(123)
|
||||||
|
L.Seti(-2, c.Int(1))
|
||||||
|
|
||||||
|
// set pointer key field
|
||||||
|
pointerKey := c.AllocaCStr("pointer key")
|
||||||
|
L.Pushstring(c.Str("pointer value"))
|
||||||
|
L.Rawsetp(-2, unsafe.Pointer(pointerKey))
|
||||||
|
|
||||||
|
// get field by Getfield
|
||||||
L.Getfield(-1, c.Str("name"))
|
L.Getfield(-1, c.Str("name"))
|
||||||
c.Printf(c.Str("%s\n"), L.Tostring(-1))
|
c.Printf(c.Str("name: %s\n"), L.Tostring(-1))
|
||||||
L.Pop(1)
|
L.Pop(1)
|
||||||
|
|
||||||
|
// get field by Rawget
|
||||||
|
L.Pushstring(c.Str("fullname"))
|
||||||
|
L.Rawget(-2)
|
||||||
|
c.Printf(c.Str("fullname: %s\n"), L.Tostring(-1))
|
||||||
|
L.Pop(1)
|
||||||
|
|
||||||
|
// get field by Gettable
|
||||||
L.Pushstring(c.Str("age"))
|
L.Pushstring(c.Str("age"))
|
||||||
L.Gettable(-2)
|
L.Gettable(-2)
|
||||||
age := int(L.Tonumber(-1))
|
age := int(L.Tonumber(-1))
|
||||||
c.Printf(c.Str("Age: %d\n"), age)
|
c.Printf(c.Str("Age: %d\n"), age)
|
||||||
L.Pop(1)
|
L.Pop(1)
|
||||||
|
|
||||||
|
// get index field
|
||||||
|
L.Geti(-1, c.Int(1))
|
||||||
|
c.Printf(c.Str("Index[%d] value: %d\n"), 1, L.Tointeger(-1))
|
||||||
|
L.Pop(1)
|
||||||
|
|
||||||
c.Printf(c.Str("All entries in the table:\n"))
|
c.Printf(c.Str("All entries in the table:\n"))
|
||||||
printTable(L)
|
printTable(L)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Expected output:
|
/* Expected output:
|
||||||
John
|
name: John
|
||||||
|
fullname: John Doe
|
||||||
Age: 30
|
Age: 30
|
||||||
|
Index[1] value: 123
|
||||||
All entries in the table:
|
All entries in the table:
|
||||||
age - 30.0
|
[1] - 123
|
||||||
fullname - John Doe
|
|
||||||
name - John
|
name - John
|
||||||
|
[pointer] - pointer value
|
||||||
|
fullname - John Doe
|
||||||
|
age - 30.0
|
||||||
*/
|
*/
|
||||||
|
|||||||
31
c/lua/lua.go
31
c/lua/lua.go
@@ -301,10 +301,17 @@ func (L *State) Gettable(idx c.Int) c.Int { return 0 }
|
|||||||
// llgo:link (*State).Getfield C.lua_getfield
|
// llgo:link (*State).Getfield C.lua_getfield
|
||||||
func (L *State) Getfield(idx c.Int, k *c.Char) c.Int { return 0 }
|
func (L *State) Getfield(idx c.Int, k *c.Char) c.Int { return 0 }
|
||||||
|
|
||||||
// LUA_API int (lua_geti) (State *L, int idx, lua_Integer n);
|
// llgo:link (*State).Geti C.lua_geti
|
||||||
// LUA_API int (lua_rawget) (State *L, int idx);
|
func (L *State) Geti(idx c.Int, n Integer) c.Int { return 0 }
|
||||||
// LUA_API int (lua_rawgeti) (State *L, int idx, lua_Integer n);
|
|
||||||
// LUA_API int (lua_rawgetp) (State *L, int idx, const void *p);
|
// llgo:link (*State).Rawget C.lua_rawget
|
||||||
|
func (L *State) Rawget(idx c.Int) c.Int { return 0 }
|
||||||
|
|
||||||
|
// llgo:link (*State).Rawgeti C.lua_rawgeti
|
||||||
|
func (L *State) Rawgeti(idx c.Int, n Integer) c.Int { return 0 }
|
||||||
|
|
||||||
|
// llgo:link (*State).Rawgetp C.lua_rawgetp
|
||||||
|
func (L *State) Rawgetp(idx c.Int, p c.Pointer) c.Int { return 0 }
|
||||||
|
|
||||||
// llgo:link (*State).Createtable C.lua_createtable
|
// llgo:link (*State).Createtable C.lua_createtable
|
||||||
func (L *State) Createtable(narr c.Int, nrec c.Int) {}
|
func (L *State) Createtable(narr c.Int, nrec c.Int) {}
|
||||||
@@ -330,10 +337,17 @@ func (L *State) Settable(idx c.Int) {}
|
|||||||
// llgo:link (*State).Setfield C.lua_setfield
|
// llgo:link (*State).Setfield C.lua_setfield
|
||||||
func (L *State) Setfield(idx c.Int, k *c.Char) {}
|
func (L *State) Setfield(idx c.Int, k *c.Char) {}
|
||||||
|
|
||||||
//void (lua_seti) (State *L, int idx, lua_Integer n);
|
// llgo:link (*State).Seti C.lua_seti
|
||||||
//void (lua_rawset) (State *L, int idx);
|
func (L *State) Seti(idx c.Int, n Integer) {}
|
||||||
//void (lua_rawseti) (State *L, int idx, lua_Integer n);
|
|
||||||
//void (lua_rawsetp) (State *L, int idx, const void *p);
|
// llgo:link (*State).Rawset C.lua_rawset
|
||||||
|
func (L *State) Rawset(idx c.Int) {}
|
||||||
|
|
||||||
|
// llgo:link (*State).Rawseti C.lua_rawseti
|
||||||
|
func (L *State) Rawseti(idx c.Int, n Integer) {}
|
||||||
|
|
||||||
|
// llgo:link (*State).Rawsetp C.lua_rawsetp
|
||||||
|
func (L *State) Rawsetp(idx c.Int, p c.Pointer) {}
|
||||||
|
|
||||||
// llgo:link (*State).Setmetatable C.lua_setmetatable
|
// llgo:link (*State).Setmetatable C.lua_setmetatable
|
||||||
func (L *State) Setmetatable(objindex c.Int) c.Int { return 0 }
|
func (L *State) Setmetatable(objindex c.Int) c.Int { return 0 }
|
||||||
@@ -415,6 +429,7 @@ const (
|
|||||||
/*
|
/*
|
||||||
* miscellaneous functions
|
* miscellaneous functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// llgo:link (*State).Next C.lua_next
|
// llgo:link (*State).Next C.lua_next
|
||||||
func (L *State) Next(idx c.Int) c.Int { return 0 }
|
func (L *State) Next(idx c.Int) c.Int { return 0 }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user