From: Roger Peppe Date: Thu, 23 Sep 2010 10:40:11 +0000 (+1000) Subject: bytes, strings: change lastIndexFunc to use DecodeLastRune X-Git-Tag: weekly.2010-09-29~79 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=81ba399a6ad45e6dcc995b83dfdd7bf17a657285;p=gostls13.git bytes, strings: change lastIndexFunc to use DecodeLastRune R=r CC=golang-dev, rsc https://golang.org/cl/2271041 --- diff --git a/src/pkg/bytes/bytes.go b/src/pkg/bytes/bytes.go index e0b30b9677..b76dc3563e 100644 --- a/src/pkg/bytes/bytes.go +++ b/src/pkg/bytes/bytes.go @@ -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 } diff --git a/src/pkg/strings/strings.go b/src/pkg/strings/strings.go index e3989c7582..6fbf67b3e6 100644 --- a/src/pkg/strings/strings.go +++ b/src/pkg/strings/strings.go @@ -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 }