summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2008-11-18 18:45:51 -0800
committerRuss Cox <rsc@golang.org>2008-11-18 18:45:51 -0800
commit6e160f185b07be86556fbbad266fc8203473b9a7 (patch)
tree7f0f73b668b48f90d8f1b7fb8c183f60dc29245d
parentae72bed05aeaa6156af109e2d8d35d357c63e5e6 (diff)
downloadgolang-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.go66
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
+}
+