summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2010-06-02 16:17:18 -0700
committerRuss Cox <rsc@golang.org>2010-06-02 16:17:18 -0700
commit959c2f651e03ff0e7c40855176750bf3dd11508f (patch)
tree92e39f2aa751b928f572364ad489db9452318d03 /src
parent0669199dc83c16239a7706d67958402d6f429d48 (diff)
downloadgolang-959c2f651e03ff0e7c40855176750bf3dd11508f.tar.gz
bufio: change ReadSlice to match description
On error, ReadSlice is defined to return the available data and advance past that data, but it was not behaving that way for err == ErrBufferFull, making it harder for callers to handle well. R=r CC=golang-dev http://codereview.appspot.com/1480041
Diffstat (limited to 'src')
-rw-r--r--src/pkg/bufio/bufio.go20
-rw-r--r--src/pkg/bufio/bufio_test.go12
2 files changed, 17 insertions, 15 deletions
diff --git a/src/pkg/bufio/bufio.go b/src/pkg/bufio/bufio.go
index 1af9545dc..6a73c41ef 100644
--- a/src/pkg/bufio/bufio.go
+++ b/src/pkg/bufio/bufio.go
@@ -229,7 +229,8 @@ func (b *Reader) ReadSlice(delim byte) (line []byte, err os.Error) {
// Buffer is full?
if b.Buffered() >= len(b.buf) {
- return nil, ErrBufferFull
+ b.r = b.w
+ return b.buf, ErrBufferFull
}
}
panic("not reached")
@@ -259,20 +260,9 @@ func (b *Reader) ReadBytes(delim byte) (line []byte, err os.Error) {
break
}
- // Read bytes out of buffer.
- buf := make([]byte, b.Buffered())
- var n int
- n, e = b.Read(buf)
- if e != nil {
- frag = buf[0:n]
- err = e
- break
- }
- if n != len(buf) {
- frag = buf[0:n]
- err = errInternal
- break
- }
+ // Make a copy of the buffer.
+ buf := make([]byte, len(frag))
+ copy(buf, frag)
// Grow list if needed.
if full == nil {
diff --git a/src/pkg/bufio/bufio_test.go b/src/pkg/bufio/bufio_test.go
index a19c46ec9..2279fe3b1 100644
--- a/src/pkg/bufio/bufio_test.go
+++ b/src/pkg/bufio/bufio_test.go
@@ -407,3 +407,15 @@ func TestWriteString(t *testing.T) {
t.Errorf("WriteString wants %q gets %q", s, string(buf.Bytes()))
}
}
+
+func TestBufferFull(t *testing.T) {
+ buf, _ := NewReaderSize(strings.NewReader("hello, world"), 5)
+ line, err := buf.ReadSlice(',')
+ if string(line) != "hello" || err != ErrBufferFull {
+ t.Errorf("first ReadSlice(,) = %q, %v", line, err)
+ }
+ line, err = buf.ReadSlice(',')
+ if string(line) != "," || err != nil {
+ t.Errorf("second ReadSlice(,) = %q, %v", line, err)
+ }
+}