When existing data in buffer does not have delimiter,
and new data is added with b.fill(), continue search from
previous point instead of starting from beginning.
Change-Id: Id78332afe2b0281b4a3c86bd1ffe9449cfea7848
GitHub-Last-Rev:
08e7d2f50151a00b22800e3f7020d0de8dee7dcf
GitHub-Pull-Request: golang/go#25441
Reviewed-on: https://go-review.googlesource.com/113535
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
// ReadBytes or ReadString instead.
// ReadSlice returns err != nil if and only if line does not end in delim.
func (b *Reader) ReadSlice(delim byte) (line []byte, err error) {
+ s := 0 // search start index
for {
// Search buffer.
- if i := bytes.IndexByte(b.buf[b.r:b.w], delim); i >= 0 {
+ if i := bytes.IndexByte(b.buf[b.r+s:b.w], delim); i >= 0 {
+ i += s
line = b.buf[b.r : b.r+i+1]
b.r += i + 1
break
break
}
+ s = b.w - b.r // do not rescan area we scanned before
+
b.fill() // buffer is not full
}