123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- package lua
- import (
- "sort"
- )
- func OpenTable(L *LState) int {
- tabmod := L.RegisterModule(TabLibName, tableFuncs)
- L.Push(tabmod)
- return 1
- }
- var tableFuncs = map[string]LGFunction{
- "getn": tableGetN,
- "concat": tableConcat,
- "insert": tableInsert,
- "maxn": tableMaxN,
- "remove": tableRemove,
- "sort": tableSort,
- }
- func tableSort(L *LState) int {
- tbl := L.CheckTable(1)
- sorter := lValueArraySorter{L, nil, tbl.array}
- if L.GetTop() != 1 {
- sorter.Fn = L.CheckFunction(2)
- }
- sort.Sort(sorter)
- return 0
- }
- func tableGetN(L *LState) int {
- L.Push(LNumber(L.CheckTable(1).Len()))
- return 1
- }
- func tableMaxN(L *LState) int {
- L.Push(LNumber(L.CheckTable(1).MaxN()))
- return 1
- }
- func tableRemove(L *LState) int {
- tbl := L.CheckTable(1)
- if L.GetTop() == 1 {
- L.Push(tbl.Remove(-1))
- } else {
- L.Push(tbl.Remove(L.CheckInt(2)))
- }
- return 1
- }
- func tableConcat(L *LState) int {
- tbl := L.CheckTable(1)
- sep := LString(L.OptString(2, ""))
- i := L.OptInt(3, 1)
- j := L.OptInt(4, tbl.Len())
- if L.GetTop() == 3 {
- if i > tbl.Len() || i < 1 {
- L.Push(emptyLString)
- return 1
- }
- }
- i = intMax(intMin(i, tbl.Len()), 1)
- j = intMin(intMin(j, tbl.Len()), tbl.Len())
- if i > j {
- L.Push(emptyLString)
- return 1
- }
- //TODO should flushing?
- retbottom := L.GetTop()
- for ; i <= j; i++ {
- v := tbl.RawGetInt(i)
- if !LVCanConvToString(v) {
- L.RaiseError("invalid value (%s) at index %d in table for concat", v.Type().String(), i)
- }
- L.Push(v)
- if i != j {
- L.Push(sep)
- }
- }
- L.Push(stringConcat(L, L.GetTop()-retbottom, L.reg.Top()-1))
- return 1
- }
- func tableInsert(L *LState) int {
- tbl := L.CheckTable(1)
- nargs := L.GetTop()
- if nargs == 1 {
- L.RaiseError("wrong number of arguments")
- }
- if L.GetTop() == 2 {
- tbl.Append(L.Get(2))
- return 0
- }
- tbl.Insert(int(L.CheckInt(2)), L.CheckAny(3))
- return 0
- }
- //
|