diff --git a/src/pkg/bytes/bytes.go b/src/pkg/bytes/bytes.go index dd299a82ee1..17f82db7ce9 100644 --- a/src/pkg/bytes/bytes.go +++ b/src/pkg/bytes/bytes.go @@ -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 } diff --git a/src/pkg/bytes/bytes_test.go b/src/pkg/bytes/bytes_test.go index 4e7cdfad652..3fbe21c30dc 100644 --- a/src/pkg/bytes/bytes_test.go +++ b/src/pkg/bytes/bytes_test.go @@ -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; } }