diff options
author | Russ Cox <rsc@golang.org> | 2008-11-18 18:45:51 -0800 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2008-11-18 18:45:51 -0800 |
commit | 6e160f185b07be86556fbbad266fc8203473b9a7 (patch) | |
tree | 7f0f73b668b48f90d8f1b7fb8c183f60dc29245d | |
parent | ae72bed05aeaa6156af109e2d8d35d357c63e5e6 (diff) | |
download | golang-6e160f185b07be86556fbbad266fc8203473b9a7.tar.gz |
make Copyn take and return int64.
add Copy.
R=gri
DELTA=52 (37 added, 1 deleted, 14 changed)
OCL=19557
CL=19559
-rw-r--r-- | src/lib/io.go | 66 |
1 files changed, 51 insertions, 15 deletions
diff --git a/src/lib/io.go b/src/lib/io.go index 699f9196c..b74911d4d 100644 --- a/src/lib/io.go +++ b/src/lib/io.go @@ -40,7 +40,7 @@ export func WriteString(w Write, s string) (n int, err *os.Error) { return r, e } -// Read until buffer is full, EOF, or error +// Read until buffer is full, EOF, or error export func Readn(fd Read, buf *[]byte) (n int, err *os.Error) { n = 0; for n < len(buf) { @@ -79,34 +79,70 @@ export func MakeFullReader(fd Read) Read { // Copies n bytes (or until EOF is reached) from src to dst. // Returns the number of bytes copied and the error, if any. -export func Copyn(src Read, dst Write, n int) (c int, err *os.Error) { - buf := new([]byte, 32*1024); // BUG 6g crashes on non-pointer array slices - c = 0; - for c < n { - l := n - c; - if l > len(buf) { - l = len(buf) +export func Copyn(src Read, dst Write, n int64) (written int64, err *os.Error) { + buf := new([]byte, 32*1024); + for written < n { + var l int; + if n - written > int64(len(buf)) { + l = len(buf); + } else { + l = int(n - written); } nr, er := src.Read(buf[0 : l]); if nr > 0 { nw, ew := dst.Write(buf[0 : nr]); - if nw != nr || ew != nil { - c += nw; - if ew == nil { - ew = os.EIO - } + if nw > 0 { + written += int64(nw); + } + if ew != nil { err = ew; break; } - c += nr; + if nr != nw { + err = os.EIO; + break; + } } if er != nil { err = er; break; } if nr == 0 { + err = ErrEOF; break; } } - return c, err + return written, err } + +// Copies from src to dst until EOF is reached. +// Returns the number of bytes copied and the error, if any. +export func Copy(src Read, dst Write) (written int64, err *os.Error) { + buf := new([]byte, 32*1024); + for { + nr, er := src.Read(buf); + 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 = os.EIO; + break; + } + } + if er != nil { + err = er; + break; + } + if nr == 0 { + break; + } + } + return written, err +} + |