]> Cypherpunks repositories - gostls13.git/commitdiff
bufio: make Reader.Read implement io.Reader semantics
authorRoger Peppe <rogpeppe@gmail.com>
Tue, 7 Dec 2010 19:54:15 +0000 (14:54 -0500)
committerRuss Cox <rsc@golang.org>
Tue, 7 Dec 2010 19:54:15 +0000 (14:54 -0500)
R=rsc
CC=golang-dev
https://golang.org/cl/3395042

src/pkg/bufio/bufio.go

index 4e9f1cf3e4ce94586c9fc20455c97a1d9020d71c..fc4127a9402b16f04804a2c766fd8268646cc543 100644 (file)
@@ -128,43 +128,44 @@ func (b *Reader) Peek(n int) ([]byte, os.Error) {
 
 // Read reads data into p.
 // It returns the number of bytes read into p.
-// If nn < len(p), also returns an error explaining
-// why the read is short.  At EOF, the count will be
-// zero and err will be os.EOF.
-func (b *Reader) Read(p []byte) (nn int, err os.Error) {
-       nn = 0
-       for len(p) > 0 {
-               n := len(p)
-               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
+// It calls Read at most once on the underlying Reader,
+// hence n may be less than len(p).
+// At EOF, the count will be zero and err will be os.EOF.
+func (b *Reader) Read(p []byte) (n int, err os.Error) {
+       n = len(p)
+       if n == 0 {
+               return 0, b.err
+       }
+       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
                        }
-                       b.fill()
-                       continue
+                       p = p[n:]
+                       return n, b.err
                }
-               if n > b.w-b.r {
-                       n = b.w - b.r
+               b.fill()
+               if b.w == b.r {
+                       return 0, b.err
                }
-               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 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.