1
0
mirror of https://github.com/golang/go synced 2024-11-22 01:14:40 -07:00

bytes: fix bugs in buffer.ReadBytes

Fixes #1498.

R=golang-dev, mattn, r, rsc
CC=golang-dev
https://golang.org/cl/4140041
This commit is contained in:
Evan Shaw 2011-02-11 12:39:18 -05:00 committed by Russ Cox
parent 4ee90b764e
commit bbfad5f1cc
2 changed files with 25 additions and 13 deletions

View File

@ -312,13 +312,14 @@ func (b *Buffer) UnreadByte() os.Error {
// delim. // delim.
func (b *Buffer) ReadBytes(delim byte) (line []byte, err os.Error) { func (b *Buffer) ReadBytes(delim byte) (line []byte, err os.Error) {
i := IndexByte(b.buf[b.off:], delim) i := IndexByte(b.buf[b.off:], delim)
size := i + 1 - b.off size := i + 1
if i < 0 { if i < 0 {
size = len(b.buf) - b.off size = len(b.buf) - b.off
err = os.EOF err = os.EOF
} }
line = make([]byte, size) line = make([]byte, size)
copy(line, b.buf[b.off:]) copy(line, b.buf[b.off:])
b.off += size
return return
} }

View File

@ -350,25 +350,36 @@ func TestNext(t *testing.T) {
} }
var readBytesTests = []struct { var readBytesTests = []struct {
buffer []byte buffer string
delim byte delim byte
expected []byte expected []string
err os.Error err os.Error
}{ }{
{err: os.EOF}, {"", 0, []string{""}, os.EOF},
{[]byte{}, 0, []byte{}, os.EOF}, {"a\x00", 0, []string{"a\x00"}, nil},
{[]byte("a\x00"), 0, []byte("a\x00"), nil}, {"abbbaaaba", 'b', []string{"ab", "b", "b", "aaab"}, nil},
{[]byte("hello\x01world"), 1, []byte("hello\x01"), nil}, {"hello\x01world", 1, []string{"hello\x01"}, nil},
{[]byte("foo\nbar"), 0, []byte("foo\nbar"), os.EOF}, {"foo\nbar", 0, []string{"foo\nbar"}, os.EOF},
{[]byte("alpha beta gamma"), ' ', []byte("alpha "), nil}, {"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) { func TestReadBytes(t *testing.T) {
for _, test := range readBytesTests { for _, test := range readBytesTests {
buf := NewBuffer(test.buffer) buf := NewBufferString(test.buffer)
bytes, err := buf.ReadBytes(test.delim) var err os.Error
if !Equal(bytes, test.expected) || err != test.err { for _, expected := range test.expected {
t.Errorf("expected %q, %v got %q, %v", test.expected, test.err, bytes, err) 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)
} }
} }
} }