summaryrefslogtreecommitdiff
path: root/src/pkg/strings
diff options
context:
space:
mode:
authorBrad Fitzpatrick <bradfitz@golang.org>2013-10-24 15:51:19 -0700
committerBrad Fitzpatrick <bradfitz@golang.org>2013-10-24 15:51:19 -0700
commitfb7ccddb0795c0e6f1a17866509fcfb63d6f069d (patch)
tree592c03e661392a59c0e1a71f1ea692109c55868a /src/pkg/strings
parentd2911418c21e376d325be80bc6455581088cc56c (diff)
downloadgo-fb7ccddb0795c0e6f1a17866509fcfb63d6f069d.tar.gz
strings: fix Replacer bug with prefix matches
singleStringReplacer had a bug where if a string was replaced at the beginning and no output had yet been produced into the temp buffer before matching ended, an invalid nil check (used as a proxy for having matched anything) meant it always returned its input. Fixes issue 6659 R=golang-dev, r CC=golang-dev https://codereview.appspot.com/16880043
Diffstat (limited to 'src/pkg/strings')
-rw-r--r--src/pkg/strings/replace.go5
-rw-r--r--src/pkg/strings/replace_test.go11
2 files changed, 14 insertions, 2 deletions
diff --git a/src/pkg/strings/replace.go b/src/pkg/strings/replace.go
index f63b1792c..54c9323e0 100644
--- a/src/pkg/strings/replace.go
+++ b/src/pkg/strings/replace.go
@@ -364,17 +364,18 @@ func makeSingleStringReplacer(pattern string, value string) *singleStringReplace
func (r *singleStringReplacer) Replace(s string) string {
var buf []byte
- i := 0
+ i, matched := 0, false
for {
match := r.finder.next(s[i:])
if match == -1 {
break
}
+ matched = true
buf = append(buf, s[i:i+match]...)
buf = append(buf, r.value...)
i += match + len(r.finder.pattern)
}
- if buf == nil {
+ if !matched {
return s
}
buf = append(buf, s[i:]...)
diff --git a/src/pkg/strings/replace_test.go b/src/pkg/strings/replace_test.go
index d33dea95b..82e4b6ef0 100644
--- a/src/pkg/strings/replace_test.go
+++ b/src/pkg/strings/replace_test.go
@@ -261,10 +261,21 @@ func TestReplacer(t *testing.T) {
testCases = append(testCases,
testCase{abcMatcher, "", ""},
testCase{abcMatcher, "ab", "ab"},
+ testCase{abcMatcher, "abc", "[match]"},
testCase{abcMatcher, "abcd", "[match]d"},
testCase{abcMatcher, "cabcabcdabca", "c[match][match]d[match]a"},
)
+ // Issue 6659 cases (more single string replacer)
+
+ noHello := NewReplacer("Hello", "")
+ testCases = append(testCases,
+ testCase{noHello, "Hello", ""},
+ testCase{noHello, "Hellox", "x"},
+ testCase{noHello, "xHello", "x"},
+ testCase{noHello, "xHellox", "xx"},
+ )
+
// No-arg test cases.
nop := NewReplacer()