diff options
author | Ondřej Surý <ondrej@sury.org> | 2011-02-14 13:23:51 +0100 |
---|---|---|
committer | Ondřej Surý <ondrej@sury.org> | 2011-02-14 13:23:51 +0100 |
commit | 758ff64c69e34965f8af5b2d6ffd65e8d7ab2150 (patch) | |
tree | 6d6b34f8c678862fe9b56c945a7b63f68502c245 /src/pkg/bytes | |
parent | 3e45412327a2654a77944249962b3652e6142299 (diff) | |
download | golang-upstream/2011-02-01.1.tar.gz |
Imported Upstream version 2011-02-01.1upstream/2011-02-01.1
Diffstat (limited to 'src/pkg/bytes')
-rw-r--r-- | src/pkg/bytes/buffer.go | 31 | ||||
-rw-r--r-- | src/pkg/bytes/buffer_test.go | 27 |
2 files changed, 56 insertions, 2 deletions
diff --git a/src/pkg/bytes/buffer.go b/src/pkg/bytes/buffer.go index 2574b4f43..4aa74371f 100644 --- a/src/pkg/bytes/buffer.go +++ b/src/pkg/bytes/buffer.go @@ -301,9 +301,38 @@ func (b *Buffer) UnreadByte() os.Error { return nil } +// ReadBytes reads until the first occurrence of delim in the input, +// returning a slice containing the data up to and including the delimiter. +// If ReadBytes encounters an error before finding a delimiter, +// it returns the data read before the error and the error itself (often os.EOF). +// ReadBytes returns err != nil if and only if the returned data does not end in +// delim. +func (b *Buffer) ReadBytes(delim byte) (line []byte, err os.Error) { + i := IndexByte(b.buf[b.off:], delim) + size := i + 1 - b.off + if i < 0 { + size = len(b.buf) - b.off + err = os.EOF + } + line = make([]byte, size) + copy(line, b.buf[b.off:]) + return +} + +// ReadString reads until the first occurrence of delim in the input, +// returning a string containing the data up to and including the delimiter. +// If ReadString encounters an error before finding a delimiter, +// it returns the data read before the error and the error itself (often os.EOF). +// ReadString returns err != nil if and only if the returned data does not end +// in delim. +func (b *Buffer) ReadString(delim byte) (line string, err os.Error) { + bytes, err := b.ReadBytes(delim) + return string(bytes), err +} + // NewBuffer creates and initializes a new Buffer using buf as its initial // contents. It is intended to prepare a Buffer to read existing data. It -// can also be used to to size the internal buffer for writing. To do that, +// can also be used to size the internal buffer for writing. To do that, // buf should have the desired capacity but a length of zero. func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} } diff --git a/src/pkg/bytes/buffer_test.go b/src/pkg/bytes/buffer_test.go index 509793d24..2af9ffdef 100644 --- a/src/pkg/bytes/buffer_test.go +++ b/src/pkg/bytes/buffer_test.go @@ -6,6 +6,7 @@ package bytes_test import ( . "bytes" + "os" "rand" "testing" "utf8" @@ -238,7 +239,7 @@ func TestMixedReadsAndWrites(t *testing.T) { func TestNil(t *testing.T) { var b *Buffer if b.String() != "<nil>" { - t.Errorf("expcted <nil>; got %q", b.String()) + t.Errorf("expected <nil>; got %q", b.String()) } } @@ -347,3 +348,27 @@ func TestNext(t *testing.T) { } } } + +var readBytesTests = []struct { + buffer []byte + delim byte + expected []byte + 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}, +} + +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) + } + } +} |