From d89db8a70b4c2cedd723b2215f02311861e6dbcb Mon Sep 17 00:00:00 2001 From: Julien Schmidt Date: Thu, 14 Aug 2014 22:52:11 +0200 Subject: [PATCH] buffer: return io.ErrUnexpectedEOF and some small optimizations --- buffer.go | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/buffer.go b/buffer.go index 794ac3099..509ce89e4 100644 --- a/buffer.go +++ b/buffer.go @@ -34,9 +34,11 @@ func newBuffer(rd io.Reader) buffer { // fill reads into the buffer until at least _need_ bytes are in it func (b *buffer) fill(need int) error { + n := b.length + // move existing data to the beginning - if b.length > 0 && b.idx > 0 { - copy(b.buf[0:b.length], b.buf[b.idx:]) + if n > 0 && b.idx > 0 { + copy(b.buf[0:n], b.buf[b.idx:]) } // grow buffer if necessary @@ -52,19 +54,27 @@ func (b *buffer) fill(need int) error { b.idx = 0 for { - n, err := b.rd.Read(b.buf[b.length:]) - b.length += n + nn, err := b.rd.Read(b.buf[n:]) + n += nn - if err == nil { - if b.length < need { + switch err { + case nil: + if n < need { continue } + b.length = n return nil + + case io.EOF: + if n >= need { + b.length = n + return nil + } + return io.ErrUnexpectedEOF + + default: + return err } - if b.length >= need && err == io.EOF { - return nil - } - return err } }