]> Cypherpunks repositories - gostls13.git/commitdiff
make bytes.Copy both src- and dst- limited
authorRuss Cox <rsc@golang.org>
Wed, 24 Jun 2009 22:35:35 +0000 (15:35 -0700)
committerRuss Cox <rsc@golang.org>
Wed, 24 Jun 2009 22:35:35 +0000 (15:35 -0700)
and return the number of bytes copied.

R=r
DELTA=18  (6 added, 0 deleted, 12 changed)
OCL=30693
CL=30712

src/pkg/bytes/bytes.go
src/pkg/bytes/bytes_test.go

index dd299a82ee12c7bd8f8e2ef35d968e030cd06f56..17f82db7ce9820a5c70d379fce450c19aad96b94 100644 (file)
@@ -41,10 +41,14 @@ func Equal(a, b []byte) bool {
        return true
 }
 
-// Copy copies the source to the destination, stopping when the source
-// is all transferred.  The caller must guarantee that there is enough
-// room in the destination.  It returns the number of bytes copied
+// Copy copies bytes from src to dst,
+// stopping when either all of src has been copied
+// or all of dst has been filled.
+// It returns the number of bytes copied.
 func Copy(dst, src []byte) int {
+       if len(src) > len(dst) {
+               src = src[0:len(dst)];
+       }
        for i, x := range src {
                dst[i] = x
        }
index 4e7cdfad65285bc64b244bd3e94329b88b2bf8cd..3fbe21c30dcc3893bbc6c87b0cc820dded0828ae 100644 (file)
@@ -132,25 +132,27 @@ func TestSplit(t *testing.T) {
 type CopyTest struct {
        a       string;
        b       string;
+       n       int;
        res     string;
 }
 var copytests = []CopyTest {
-       CopyTest{ "", "", "" },
-       CopyTest{ "a", "", "a" },
-       CopyTest{ "a", "a", "a" },
-       CopyTest{ "a", "b", "b" },
-       CopyTest{ "xyz", "abc", "abc" },
-       CopyTest{ "wxyz", "abc", "abcz" },
+       CopyTest{ "", "", 0, "" },
+       CopyTest{ "a", "", 0, "a" },
+       CopyTest{ "a", "a", 1, "a" },
+       CopyTest{ "a", "b", 1, "b" },
+       CopyTest{ "xyz", "abc", 3, "abc" },
+       CopyTest{ "wxyz", "abc", 3, "abcz" },
+       CopyTest{ "xyz", "abcd", 3, "abc" },
 }
 
 func TestCopy(t *testing.T) {
        for i := 0; i < len(copytests); i++ {
                tt := copytests[i];
                dst := io.StringBytes(tt.a);
-               Copy(dst, io.StringBytes(tt.b));
+               n := Copy(dst, io.StringBytes(tt.b));
                result := string(dst);
-               if result != tt.res {
-                       t.Errorf(`Copy("%s", "%s") = "%s"; want "%s"`, tt.a, tt.b, result, tt.res);
+               if result != tt.res || n != tt.n {
+                       t.Errorf(`Copy(%q, %q) = %d, %q; want %d, %q`, tt.a, tt.b, n, result, tt.n, tt.res);
                        continue;
                }
        }