forked from itchio/savior
/
fullyrandom.go
65 lines (51 loc) 路 1 KB
/
fullyrandom.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package fullyrandom
import (
"bytes"
"io"
"math/rand"
)
const DefaultSeed = 0xfaadbeef
func Write(output io.Writer, length int64, seed int64) error {
lw := &limitedWriter{
w: output,
max: length,
}
rng := rand.New(rand.NewSource(seed))
bufsize := 1024
buf := make([]byte, bufsize)
for lw.NeedsMore() {
for i := 0; i < bufsize; i++ {
buf[i] = byte(rng.Intn(255))
}
lw.Write(buf)
}
return nil
}
func Bytes(length int64) []byte {
buf := new(bytes.Buffer)
Write(buf, length, DefaultSeed)
return buf.Bytes()
}
type limitedWriter struct {
w io.Writer
c int64
max int64
}
var _ io.Writer = (*limitedWriter)(nil)
func (lw *limitedWriter) Write(buf []byte) (int, error) {
if lw.c >= lw.max {
// just drop it!
return len(buf), nil
}
toWrite := len(buf)
nextEnd := lw.c + int64(toWrite)
if nextEnd > lw.max {
toWrite = int(lw.max - lw.c)
}
n, err := lw.w.Write(buf[:toWrite])
lw.c += int64(n)
return n, err
}
func (lw *limitedWriter) NeedsMore() bool {
return lw.c < lw.max
}