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
|
//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
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user