Skip to content

Commit

Permalink
buf
Browse files Browse the repository at this point in the history
  • Loading branch information
vlorc committed Jan 21, 2020
1 parent b495019 commit 94b0763
Show file tree
Hide file tree
Showing 8 changed files with 131 additions and 37 deletions.
73 changes: 47 additions & 26 deletions base/buffer.go
Expand Up @@ -2,7 +2,7 @@ package base

import (
"bytes"
"layeh.com/gopher-luar"
luar "layeh.com/gopher-luar"
"unicode/utf8"
"unsafe"
)
Expand Down Expand Up @@ -31,6 +31,14 @@ func (BufferFactory) FormString(val ...string) Buffer {
return __stringBuffer(val...)
}

func (b Buffer) Split(L *luar.LState) int {
sep := __toBuffer(L.LState)
ret := bytes.Split(b, sep)

L.Push(luar.New(L.LState, *(*[]Buffer)(unsafe.Pointer(&ret))))
return 1
}

func (b Buffer) Slice(args ...int) Buffer {
begin, end := 0, len(b)
if len(args) > 0 {
Expand All @@ -41,6 +49,16 @@ func (b Buffer) Slice(args ...int) Buffer {
return b[begin:end]
}

func (b Buffer) Peek(i int) Buffer {
if i > 0 {
if i >= len(b) {
return Buffer{}
}
return b[i-1:]
}
return b
}

func (b Buffer) IndexAny(str string) int {
return bytes.IndexAny(b, str) + 1
}
Expand All @@ -49,8 +67,12 @@ func (b Buffer) IndexByte(val int) int {
return bytes.IndexByte(b, byte(val)) + 1
}

func (b Buffer) Index(buf Buffer) int {
return bytes.Index(b, buf) + 1
func (b Buffer) Index(L *luar.LState) int {
sep := __newBufferN(L.LState)
ret := bytes.Index(b, sep) + 1

L.Push(luar.New(L.LState, ret))
return 1
}

func (b Buffer) IndexString(str string) int {
Expand All @@ -65,8 +87,12 @@ func (b Buffer) LastByte(val int) int {
return bytes.LastIndexByte(b, byte(val)) + 1
}

func (b Buffer) Last(buf Buffer) int {
return bytes.LastIndex(b, buf) + 1
func (b Buffer) Last(L *luar.LState) int {
sep := __newBufferN(L.LState)
ret := bytes.LastIndex(b, sep) + 1

L.Push(luar.New(L.LState, ret))
return 1
}

func (b Buffer) LastString(str string) int {
Expand All @@ -85,14 +111,14 @@ func (b Buffer) Copy(src Buffer, args ...int) int {
}

func (b Buffer) Concat(src ...Buffer) Buffer {
i := len(b)
l := len(b)
for _, v := range src {
i += len(v)
l += len(v)
}
dst := make(Buffer, i)
i = copy(dst, b)
dst := make(Buffer, l)
l = copy(dst, b)
for _, v := range src {
i += copy(dst[i:], v)
l += copy(dst[l:], v)
}
return dst
}
Expand All @@ -115,12 +141,6 @@ func (b Buffer) ToString(args ...string) string {
return ""
}

func (b Buffer) ToRune(args ...int) rune {
n := b.Slice(args...)
r, _ := utf8.DecodeRune(n)
return r
}

func (b Buffer) Reverse(args ...int) Buffer {
n := b.Slice(args...)
for i, j := 0, len(n)-1; i < j; i, j = i+1, j-1 {
Expand All @@ -129,18 +149,19 @@ func (b Buffer) Reverse(args ...int) Buffer {
return n
}

func (b Buffer) ToNumber(args ...int) (r uint64) {
func (b Buffer) ToChar(args ...int) int {
n := b.Slice(args...)
if 3 != len(args) {
for i := len(n) - 1; i >= 0; i-- {
r = (r << 8) + uint64(n[i])
}
} else {
for _, v := range n {
r = (r << 8) + uint64(v)
}
r, _ := utf8.DecodeRune(n)
return int(r)
}

func (b Buffer) ToNumber(args ...int) uint64 {
n := b.Slice(args...)
i := 0
if len(args) > 2 && args[2] >= 0 && args[2] < len(__number) {
i = args[2]
}
return r
return __number[i](n)
}

func (b Buffer) ToLine(args ...int) string {
Expand Down
47 changes: 47 additions & 0 deletions base/encode.go
Expand Up @@ -15,6 +15,8 @@ var EncodeTable = map[string]func(Buffer) string{
"utf8": __rawString,
"HEX": __HEXString,
"hex": __hexString,
"BCD": __BCDString,
"bcd": __bcdString,
"base32": __base32String,
"base64": __base64String,
"gbk": __gbkString,
Expand All @@ -25,6 +27,33 @@ var EncodeTable = map[string]func(Buffer) string{
"SHA1": __SHA1String,
}

var __number = []func(Buffer) uint64{
func(n Buffer) (r uint64) {
for i := len(n) - 1; i >= 0; i-- {
r = (r << 8) + uint64(n[i])
}
return
},
func(n Buffer) (r uint64) {
for _, v := range n {
r = (r << 8) + uint64(v)
}
return
},
func(n Buffer) (r uint64) {
for _, v := range n {
r = r*100 + uint64(v>>4)*10 + uint64(v&0x0f)
}
return
},
func(n Buffer) (r uint64) {
for i := len(n) - 1; i >= 0; i-- {
r = r*100 + uint64(n[i]>>4)*10 + uint64(n[i]&0x0f)
}
return
},
}

func __HEXString(src Buffer) string {
return __hex(src, "0123456789ABCDEF")
}
Expand Down Expand Up @@ -91,3 +120,21 @@ func __SHA1String(src Buffer) string {
dst := h.Sum(nil)
return __HEXString(dst)
}

func __BCDString(src Buffer) string {
dst := make([]byte, len(src)*2)
for i, v := range src {
dst[i*2+0] = 48 + (v >> 4)
dst[i*2+1] = 48 + (v & 0x0f)
}
return *(*string)(unsafe.Pointer(&dst))
}

func __bcdString(src Buffer) string {
dst := make([]byte, len(src)*2)
for i := len(src) - 1; i >= 0; i-- {
dst[i*2+0] = 48 + (src[i] >> 4)
dst[i*2+1] = 48 + (src[i] & 0x0f)
}
return *(*string)(unsafe.Pointer(&dst))
}
12 changes: 6 additions & 6 deletions base/tobuffer.go
Expand Up @@ -30,17 +30,17 @@ func __newBufferN(L *lua.LState) Buffer {
v := L.Get(1)
switch v.Type() {
case lua.LTString:
r := make([]string, L.GetTop())
b := &bytes.Buffer{}
for i := L.GetTop(); i > 0; i-- {
r[i-1] = string(L.Get(i).(lua.LString))
b.WriteString(string(L.Get(i).(lua.LString)))
}
return __stringBuffer(r...)
return Buffer(b.Bytes())
case lua.LTNumber:
r := make([]int, L.GetTop())
b := make(Buffer, L.GetTop())
for i := L.GetTop(); i > 0; i-- {
r[i-1] = int(L.Get(i).(lua.LNumber))
b[i-1] = byte(L.Get(i).(lua.LNumber))
}
return __numberBuffer(r...)
return b
case lua.LTUserData:
r := make([]interface{}, L.GetTop())
for i := L.GetTop(); i > 0; i-- {
Expand Down
5 changes: 4 additions & 1 deletion demo/buffer.lua
Expand Up @@ -2,4 +2,7 @@ local buffer = require("buffer")

local buf = buffer:form(1,2,3,4,5,6,7,8,9)

print(buf:toHash())
print(buf:toHash())
print(buf:toNumber(1,1))
print(buf:toString("BCD"))
print(buf:index(5))
14 changes: 14 additions & 0 deletions demo/fibr.lua
@@ -0,0 +1,14 @@
function fibt(n0, n1, c)
if c == 0 then
return n0
elseif c == 1 then
return n1
end
return fibt(n1, n0+n1, c-1)
end

function fib(n)
fibt(0, 1, n)
end

fib(1000000)
4 changes: 2 additions & 2 deletions go.mod
Expand Up @@ -3,9 +3,9 @@ module github.com/vlorc/lua-vm
require (
github.com/mitchellh/mapstructure v1.1.2 // indirect
github.com/yuin/gluamapper v0.0.0-20150323120927-d836955830e7
github.com/yuin/gopher-lua v0.0.0-20190514113301-1cd887cd7036
github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7 // indirect
golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect
golang.org/x/sys v0.0.0-20190913121621-c3b328c6e5a7 // indirect
golang.org/x/text v0.3.2
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Expand Up @@ -10,6 +10,8 @@ github.com/yuin/gopher-lua v0.0.0-20180827083657-b942cacc89fe/go.mod h1:aEV29Xrm
github.com/yuin/gopher-lua v0.0.0-20190206043414-8bfc7677f583/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
github.com/yuin/gopher-lua v0.0.0-20190514113301-1cd887cd7036 h1:1b6PAtenNyhsmo/NKXVe34h7JEZKva1YB/ne7K7mqKM=
github.com/yuin/gopher-lua v0.0.0-20190514113301-1cd887cd7036/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb h1:ZkM6LRnq40pR1Ox0hTHlnpkcOTuFIDQpZ1IN8rKKhX0=
github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
Expand All @@ -21,6 +23,8 @@ golang.org/x/net v0.0.0-20190724013045-ca1201d0de80 h1:Ao/3l156eZf2AW5wK8a7/smto
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2 h1:4dVFTC832rPn4pomLSz1vA+are2+dU19w1H8OngV7nc=
golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa h1:F+8P+gmewFQYRk6JoLQLwjBCTu3mcIURZfNkVweuRKA=
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
Expand Down
9 changes: 7 additions & 2 deletions main/main.go
@@ -1,6 +1,7 @@
package main

import (
"fmt"
"github.com/vlorc/lua-vm/base"
"github.com/vlorc/lua-vm/crypto/hash"
"github.com/vlorc/lua-vm/crypto/rand"
Expand All @@ -16,6 +17,7 @@ import (
"github.com/vlorc/lua-vm/pool"
"github.com/vlorc/lua-vm/regexp"
"github.com/vlorc/lua-vm/store"
"time"
)

func main() {
Expand Down Expand Up @@ -47,8 +49,11 @@ func main() {
pool.Module("store", store.NewStoreFactory(nil)),
)

err := p.DoFile("demo/http.lua")
begin := time.Now().UnixNano()
err := p.DoFile("demo/buffer.lua")
if nil != err {
println("error: ", err.Error())
fmt.Println("error: ", err.Error())
}
end := time.Now().UnixNano()
fmt.Printf("use: %f", float64(end-begin)/float64(1000000))
}

0 comments on commit 94b0763

Please sign in to comment.