mirror of
https://github.com/golang/go
synced 2024-11-25 11:57:58 -07:00
bufio: make Reader.Read implement io.Reader semantics
R=rsc CC=golang-dev https://golang.org/cl/3395042
This commit is contained in:
parent
cf6c212197
commit
24a78a026d
@ -128,43 +128,44 @@ func (b *Reader) Peek(n int) ([]byte, os.Error) {
|
|||||||
|
|
||||||
// Read reads data into p.
|
// Read reads data into p.
|
||||||
// It returns the number of bytes read into p.
|
// It returns the number of bytes read into p.
|
||||||
// If nn < len(p), also returns an error explaining
|
// It calls Read at most once on the underlying Reader,
|
||||||
// why the read is short. At EOF, the count will be
|
// hence n may be less than len(p).
|
||||||
// zero and err will be os.EOF.
|
// At EOF, the count will be zero and err will be os.EOF.
|
||||||
func (b *Reader) Read(p []byte) (nn int, err os.Error) {
|
func (b *Reader) Read(p []byte) (n int, err os.Error) {
|
||||||
nn = 0
|
n = len(p)
|
||||||
for len(p) > 0 {
|
if n == 0 {
|
||||||
n := len(p)
|
return 0, b.err
|
||||||
if b.w == b.r {
|
|
||||||
if b.err != nil {
|
|
||||||
return nn, b.err
|
|
||||||
}
|
|
||||||
if len(p) >= len(b.buf) {
|
|
||||||
// Large read, empty buffer.
|
|
||||||
// Read directly into p to avoid copy.
|
|
||||||
n, b.err = b.rd.Read(p)
|
|
||||||
if n > 0 {
|
|
||||||
b.lastByte = int(p[n-1])
|
|
||||||
b.lastRuneSize = -1
|
|
||||||
}
|
|
||||||
p = p[n:]
|
|
||||||
nn += n
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
b.fill()
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if n > b.w-b.r {
|
|
||||||
n = b.w - b.r
|
|
||||||
}
|
|
||||||
copy(p[0:n], b.buf[b.r:])
|
|
||||||
p = p[n:]
|
|
||||||
b.r += n
|
|
||||||
b.lastByte = int(b.buf[b.r-1])
|
|
||||||
b.lastRuneSize = -1
|
|
||||||
nn += n
|
|
||||||
}
|
}
|
||||||
return nn, nil
|
if b.w == b.r {
|
||||||
|
if b.err != nil {
|
||||||
|
return 0, b.err
|
||||||
|
}
|
||||||
|
if len(p) >= len(b.buf) {
|
||||||
|
// Large read, empty buffer.
|
||||||
|
// Read directly into p to avoid copy.
|
||||||
|
n, b.err = b.rd.Read(p)
|
||||||
|
if n > 0 {
|
||||||
|
b.lastByte = int(p[n-1])
|
||||||
|
b.lastRuneSize = -1
|
||||||
|
}
|
||||||
|
p = p[n:]
|
||||||
|
return n, b.err
|
||||||
|
}
|
||||||
|
b.fill()
|
||||||
|
if b.w == b.r {
|
||||||
|
return 0, b.err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if n > b.w-b.r {
|
||||||
|
n = b.w - b.r
|
||||||
|
}
|
||||||
|
copy(p[0:n], b.buf[b.r:])
|
||||||
|
p = p[n:]
|
||||||
|
b.r += n
|
||||||
|
b.lastByte = int(b.buf[b.r-1])
|
||||||
|
b.lastRuneSize = -1
|
||||||
|
return n, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// ReadByte reads and returns a single byte.
|
// ReadByte reads and returns a single byte.
|
||||||
|
Loading…
Reference in New Issue
Block a user