]> Cypherpunks repositories - gostls13.git/commitdiff
io: Simplify CopyN implementation by delegating to Copy.
authorJeremy Schlatter <jeremy.schlatter@gmail.com>
Fri, 8 Feb 2013 04:26:12 +0000 (20:26 -0800)
committerBrad Fitzpatrick <bradfitz@golang.org>
Fri, 8 Feb 2013 04:26:12 +0000 (20:26 -0800)
R=golang-dev, dave, minux.ma, bradfitz, rsc
CC=golang-dev
https://golang.org/cl/7312055

src/pkg/io/io.go

index 5b24f062efc4842901f164e8c15b9c4a0cbb5fa2..f198448344b374814b211a79b1c1b156bd3f8356 100644 (file)
@@ -299,43 +299,12 @@ func ReadFull(r Reader, buf []byte) (n int, err error) {
 // If dst implements the ReaderFrom interface,
 // the copy is implemented using it.
 func CopyN(dst Writer, src Reader, n int64) (written int64, err error) {
-       // If the writer has a ReadFrom method, use it to do the copy.
-       // Avoids a buffer allocation and a copy.
-       if rt, ok := dst.(ReaderFrom); ok {
-               written, err = rt.ReadFrom(LimitReader(src, n))
-               if written < n && err == nil {
-                       // rt stopped early; must have been EOF.
-                       err = EOF
-               }
-               return
+       written, err = Copy(dst, LimitReader(src, n))
+       if written < n && err == nil {
+               // src stopped early; must have been EOF.
+               err = EOF
        }
-       buf := make([]byte, 32*1024)
-       for written < n {
-               l := len(buf)
-               if d := n - written; d < int64(l) {
-                       l = int(d)
-               }
-               nr, er := src.Read(buf[0:l])
-               if nr > 0 {
-                       nw, ew := dst.Write(buf[0:nr])
-                       if nw > 0 {
-                               written += int64(nw)
-                       }
-                       if ew != nil {
-                               err = ew
-                               break
-                       }
-                       if nr != nw {
-                               err = ErrShortWrite
-                               break
-                       }
-               }
-               if er != nil {
-                       err = er
-                       break
-               }
-       }
-       return written, err
+       return
 }
 
 // Copy copies from src to dst until either EOF is reached