diff options
| author | Russ Cox <rsc@golang.org> | 2010-06-02 16:17:18 -0700 |
|---|---|---|
| committer | Russ Cox <rsc@golang.org> | 2010-06-02 16:17:18 -0700 |
| commit | 959c2f651e03ff0e7c40855176750bf3dd11508f (patch) | |
| tree | 92e39f2aa751b928f572364ad489db9452318d03 /src | |
| parent | 0669199dc83c16239a7706d67958402d6f429d48 (diff) | |
| download | golang-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.go | 20 | ||||
| -rw-r--r-- | src/pkg/bufio/bufio_test.go | 12 |
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) + } +} |
