]> Cypherpunks repositories - gostls13.git/commitdiff
bytes, strings: change lastIndexFunc to use DecodeLastRune
authorRoger Peppe <rogpeppe@gmail.com>
Thu, 23 Sep 2010 10:40:11 +0000 (20:40 +1000)
committerRob Pike <r@golang.org>
Thu, 23 Sep 2010 10:40:11 +0000 (20:40 +1000)
R=r
CC=golang-dev, rsc
https://golang.org/cl/2271041

src/pkg/bytes/bytes.go
src/pkg/strings/strings.go

index e0b30b967783c713ac4bb1e097f9f1ca9778a738..b76dc3563e5c857e93e4d9b06448a45ff38c1b74 100644 (file)
@@ -490,34 +490,12 @@ func indexFunc(s []byte, f func(r int) bool, truth bool) int {
 // truth==false, the sense of the predicate function is
 // inverted.
 func lastIndexFunc(s []byte, f func(r int) bool, truth bool) int {
-       end := len(s)
-       for end > 0 {
-               start := end - 1
-               rune := int(s[start])
-               if rune >= utf8.RuneSelf {
-                       // Back up & look for beginning of rune. Mustn't pass start.
-                       for start--; start >= 0; start-- {
-                               if utf8.RuneStart(s[start]) {
-                                       break
-                               }
-                       }
-                       if start < 0 {
-                               return -1
-                       }
-                       var wid int
-                       rune, wid = utf8.DecodeRune(s[start:end])
-
-                       // If we've decoded fewer bytes than we expected,
-                       // we've got some invalid UTF-8, so make sure we return
-                       // the last possible index in s.
-                       if start+wid < end && f(utf8.RuneError) == truth {
-                               return end - 1
-                       }
-               }
+       for i := len(s); i > 0; {
+               rune, size := utf8.DecodeLastRune(s[0:i])
+               i -= size
                if f(rune) == truth {
-                       return start
+                       return i
                }
-               end = start
        }
        return -1
 }
index e3989c758224af1f60d25efe7b117bd3ff6a671f..6fbf67b3e6076b8dc2c6b91c094b6b74a1770151 100644 (file)
@@ -451,34 +451,12 @@ func indexFunc(s string, f func(r int) bool, truth bool) int {
 // truth==false, the sense of the predicate function is
 // inverted.
 func lastIndexFunc(s string, f func(r int) bool, truth bool) int {
-       end := len(s)
-       for end > 0 {
-               start := end - 1
-               rune := int(s[start])
-               if rune >= utf8.RuneSelf {
-                       // Back up & look for beginning of rune. Mustn't pass start.
-                       for start--; start >= 0; start-- {
-                               if utf8.RuneStart(s[start]) {
-                                       break
-                               }
-                       }
-                       if start < 0 {
-                               start = 0
-                       }
-                       var wid int
-                       rune, wid = utf8.DecodeRuneInString(s[start:end])
-
-                       // If we've decoded fewer bytes than we expected,
-                       // we've got some invalid UTF-8, so make sure we return
-                       // the last possible index in s.
-                       if start+wid < end && f(utf8.RuneError) == truth {
-                               return end - 1
-                       }
-               }
+       for i := len(s); i > 0; {
+               rune, size := utf8.DecodeLastRuneInString(s[0:i])
+               i -= size
                if f(rune) == truth {
-                       return start
+                       return i
                }
-               end = start
        }
        return -1
 }