]> Cypherpunks repositories - gostls13.git/commitdiff
bytes: fix bugs in buffer.ReadBytes
authorEvan Shaw <chickencha@gmail.com>
Fri, 11 Feb 2011 17:39:18 +0000 (12:39 -0500)
committerRuss Cox <rsc@golang.org>
Fri, 11 Feb 2011 17:39:18 +0000 (12:39 -0500)
Fixes #1498.

R=golang-dev, mattn, r, rsc
CC=golang-dev
https://golang.org/cl/4140041

src/pkg/bytes/buffer.go
src/pkg/bytes/buffer_test.go

index 3da8008be485fe3ec20434031b9b2300d936fc51..1acd4e05cae3a8c1ec238cda8a3ac881117877bd 100644 (file)
@@ -312,13 +312,14 @@ func (b *Buffer) UnreadByte() os.Error {
 // delim.
 func (b *Buffer) ReadBytes(delim byte) (line []byte, err os.Error) {
        i := IndexByte(b.buf[b.off:], delim)
-       size := i + 1 - b.off
+       size := i + 1
        if i < 0 {
                size = len(b.buf) - b.off
                err = os.EOF
        }
        line = make([]byte, size)
        copy(line, b.buf[b.off:])
+       b.off += size
        return
 }
 
index 2af9ffdefa6e843b1fecaf67dd332f4baabed124..56a2d927539007b68433df33afb3a5f4f0950b54 100644 (file)
@@ -350,25 +350,36 @@ func TestNext(t *testing.T) {
 }
 
 var readBytesTests = []struct {
-       buffer   []byte
+       buffer   string
        delim    byte
-       expected []byte
+       expected []string
        err      os.Error
 }{
-       {err: os.EOF},
-       {[]byte{}, 0, []byte{}, os.EOF},
-       {[]byte("a\x00"), 0, []byte("a\x00"), nil},
-       {[]byte("hello\x01world"), 1, []byte("hello\x01"), nil},
-       {[]byte("foo\nbar"), 0, []byte("foo\nbar"), os.EOF},
-       {[]byte("alpha beta gamma"), ' ', []byte("alpha "), nil},
+       {"", 0, []string{""}, os.EOF},
+       {"a\x00", 0, []string{"a\x00"}, nil},
+       {"abbbaaaba", 'b', []string{"ab", "b", "b", "aaab"}, nil},
+       {"hello\x01world", 1, []string{"hello\x01"}, nil},
+       {"foo\nbar", 0, []string{"foo\nbar"}, os.EOF},
+       {"alpha\nbeta\ngamma\n", '\n', []string{"alpha\n", "beta\n", "gamma\n"}, nil},
+       {"alpha\nbeta\ngamma", '\n', []string{"alpha\n", "beta\n", "gamma"}, os.EOF},
 }
 
 func TestReadBytes(t *testing.T) {
        for _, test := range readBytesTests {
-               buf := NewBuffer(test.buffer)
-               bytes, err := buf.ReadBytes(test.delim)
-               if !Equal(bytes, test.expected) || err != test.err {
-                       t.Errorf("expected %q, %v got %q, %v", test.expected, test.err, bytes, err)
+               buf := NewBufferString(test.buffer)
+               var err os.Error
+               for _, expected := range test.expected {
+                       var bytes []byte
+                       bytes, err = buf.ReadBytes(test.delim)
+                       if string(bytes) != expected {
+                               t.Errorf("expected %q, got %q", expected, bytes)
+                       }
+                       if err != nil {
+                               break
+                       }
+               }
+               if err != test.err {
+                       t.Errorf("expected error %v, got %v", test.err, err)
                }
        }
 }