bytealg.IndexByteString
This commit is contained in:
6
c/c.go
6
c/c.go
@@ -75,6 +75,12 @@ func Memmove(dst, src Pointer, n uintptr) Pointer
|
||||
//go:linkname Memset C.memset
|
||||
func Memset(s Pointer, c Int, n uintptr) Pointer
|
||||
|
||||
//go:linkname Memchr C.memchr
|
||||
func Memchr(s Pointer, c Int, n uintptr) Pointer
|
||||
|
||||
//go:linkname Memcmp C.memcmp
|
||||
func Memcmp(s1, s2 Pointer, n uintptr) Int
|
||||
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
//go:linkname Strlen C.strlen
|
||||
|
||||
@@ -18,5 +18,25 @@ package bytealg
|
||||
|
||||
// llgo:skip init
|
||||
import (
|
||||
_ "unsafe"
|
||||
"unsafe"
|
||||
|
||||
"github.com/goplus/llgo/c"
|
||||
)
|
||||
|
||||
func IndexByte(b []byte, ch byte) int {
|
||||
ptr := unsafe.Pointer(unsafe.SliceData(b))
|
||||
ret := c.Memchr(ptr, c.Int(ch), uintptr(len(b)))
|
||||
if ret != nil {
|
||||
return int(uintptr(ret) - uintptr(ptr))
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
func IndexByteString(s string, ch byte) int {
|
||||
ptr := unsafe.Pointer(unsafe.StringData(s))
|
||||
ret := c.Memchr(ptr, c.Int(ch), uintptr(len(s)))
|
||||
if ret != nil {
|
||||
return int(uintptr(ret) - uintptr(ptr))
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
@@ -966,6 +966,8 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) {
|
||||
case "Slice": // unsafe.Slice
|
||||
size := args[1].impl
|
||||
return b.unsafeSlice(args[0], size, size)
|
||||
case "StringData":
|
||||
return b.StringData(args[0]) // TODO(xsw): check return type
|
||||
case "SliceData":
|
||||
return b.SliceData(args[0]) // TODO(xsw): check return type
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user