bytealg.IndexByteString

This commit is contained in:
xushiwei
2024-06-20 14:31:05 +08:00
parent f8b0a7105b
commit d4e7eb5888
3 changed files with 29 additions and 1 deletions

6
c/c.go
View File

@@ -75,6 +75,12 @@ func Memmove(dst, src Pointer, n uintptr) Pointer
//go:linkname Memset C.memset //go:linkname Memset C.memset
func Memset(s Pointer, c Int, n uintptr) Pointer 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 //go:linkname Strlen C.strlen

View File

@@ -18,5 +18,25 @@ package bytealg
// llgo:skip init // llgo:skip init
import ( 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
}

View File

@@ -966,6 +966,8 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) {
case "Slice": // unsafe.Slice case "Slice": // unsafe.Slice
size := args[1].impl size := args[1].impl
return b.unsafeSlice(args[0], size, size) return b.unsafeSlice(args[0], size, size)
case "StringData":
return b.StringData(args[0]) // TODO(xsw): check return type
case "SliceData": case "SliceData":
return b.SliceData(args[0]) // TODO(xsw): check return type return b.SliceData(args[0]) // TODO(xsw): check return type
} }