From 81ba399a6ad45e6dcc995b83dfdd7bf17a657285 Mon Sep 17 00:00:00 2001 From: Roger Peppe Date: Thu, 23 Sep 2010 20:40:11 +1000 Subject: [PATCH] bytes, strings: change lastIndexFunc to use DecodeLastRune R=r CC=golang-dev, rsc https://golang.org/cl/2271041 --- src/pkg/bytes/bytes.go | 30 ++++-------------------------- src/pkg/strings/strings.go | 30 ++++-------------------------- 2 files changed, 8 insertions(+), 52 deletions(-) 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 } -- 2.48.1