summaryrefslogtreecommitdiff
path: root/xdelta3/go/src/xdelta/rstream.go
diff options
context:
space:
mode:
authorJoshua MacDonald <josh.macdonald@gmail.com>2015-01-25 23:17:17 -0800
committerJoshua MacDonald <josh.macdonald@gmail.com>2015-01-25 23:17:17 -0800
commitb55fcf3dc4c775ef35dce116ab23d35a5f9ff326 (patch)
tree47a160fb2855434f17689a9028081b29bff8f1d8 /xdelta3/go/src/xdelta/rstream.go
parent57c7df665788bbb524c544ce5dea66b1aade63d3 (diff)
regtest.go tests a random stream and an offset copy
Diffstat (limited to 'xdelta3/go/src/xdelta/rstream.go')
-rw-r--r--xdelta3/go/src/xdelta/rstream.go56
1 files changed, 56 insertions, 0 deletions
diff --git a/xdelta3/go/src/xdelta/rstream.go b/xdelta3/go/src/xdelta/rstream.go
new file mode 100644
index 0000000..1666934
--- /dev/null
+++ b/xdelta3/go/src/xdelta/rstream.go
@@ -0,0 +1,56 @@
1package xdelta
2
3
4import (
5 "io"
6 "math/rand"
7)
8
9const (
10 blocksize = 16380 // A factor of 7
11)
12
13func WriteRstreams(seed, offset, len int64,
14 first, second io.WriteCloser) {
15 go writeOne(seed, 0, len, first)
16 go writeOne(seed, offset, len, second)
17}
18
19func writeOne(seed, offset, len int64, stream io.WriteCloser) {
20 if offset != 0 {
21 // Fill with other random data until the offset
22 writeRand(rand.New(rand.NewSource(^seed)),
23 offset, stream)
24 }
25 writeRand(rand.New(rand.NewSource(seed)),
26 len - offset, stream)
27 if err := stream.Close(); err != nil {
28 panic(err)
29 }
30}
31
32func writeRand(r *rand.Rand, len int64, s io.Writer) {
33 blk := make([]byte, blocksize)
34 for len > 0 {
35 fillRand(r, blk)
36 c := blocksize
37 if len < blocksize {
38 c = int(len)
39 }
40 if _, err := s.Write(blk[0:c]); err != nil {
41 panic(err)
42 }
43 len -= int64(c)
44 }
45}
46
47func fillRand(r *rand.Rand, blk []byte) {
48 for p := 0; p < blocksize; {
49 v := r.Int63()
50 for i := 7; i != 0; i-- {
51 blk[p] = byte(v)
52 p++
53 v >>= 8
54 }
55 }
56}