aboutsummaryrefslogtreecommitdiff
path: root/src/bytes/bytes.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/bytes/bytes.go')
-rw-r--r--src/bytes/bytes.go23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/bytes/bytes.go b/src/bytes/bytes.go
index 5dfc441b81..40c7c23cd7 100644
--- a/src/bytes/bytes.go
+++ b/src/bytes/bytes.go
@@ -130,13 +130,28 @@ func LastIndexByte(s []byte, c byte) int {
// IndexRune interprets s as a sequence of UTF-8-encoded Unicode code points.
// It returns the byte index of the first occurrence in s of the given rune.
// It returns -1 if rune is not present in s.
+// If r is utf8.RuneError, it returns the first instance of any
+// invalid UTF-8 byte sequence.
func IndexRune(s []byte, r rune) int {
- if r < utf8.RuneSelf {
+ switch {
+ case 0 <= r && r < utf8.RuneSelf:
return IndexByte(s, byte(r))
+ case r == utf8.RuneError:
+ for i := 0; i < len(s); {
+ r1, n := utf8.DecodeRune(s[i:])
+ if r1 == utf8.RuneError {
+ return i
+ }
+ i += n
+ }
+ return -1
+ case !utf8.ValidRune(r):
+ return -1
+ default:
+ var b [utf8.UTFMax]byte
+ n := utf8.EncodeRune(b[:], r)
+ return Index(s, b[:n])
}
- var b [utf8.UTFMax]byte
- n := utf8.EncodeRune(b[:], r)
- return Index(s, b[:n])
}
// IndexAny interprets s as a sequence of UTF-8-encoded Unicode code points.