]> Cypherpunks repositories - gostls13.git/commitdiff
bufio: change ReadSlice to match description
authorRuss Cox <rsc@golang.org>
Wed, 2 Jun 2010 23:17:18 +0000 (16:17 -0700)
committerRuss Cox <rsc@golang.org>
Wed, 2 Jun 2010 23:17:18 +0000 (16:17 -0700)
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
https://golang.org/cl/1480041

src/pkg/bufio/bufio.go
src/pkg/bufio/bufio_test.go

index 1af9545dc5351548ff6a350d96f50cce3633798d..6a73c41ef5d2a4450af6d58fd2b0319fe6f6dbd3 100644 (file)
@@ -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 {
index a19c46ec9c13990767f01f4d2c0954ee67d35e9d..2279fe3b12ea20560d30e5e87f4c63d6850cc5e6 100644 (file)
@@ -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)
+       }
+}