-
Notifications
You must be signed in to change notification settings - Fork 0
/
section_read_seeker.go
62 lines (57 loc) · 1.07 KB
/
section_read_seeker.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
package missinggo
import (
"fmt"
"io"
"os"
)
type sectionReadSeeker struct {
base io.ReadSeeker
off, size int64
}
// Returns a ReadSeeker on a section of another ReadSeeker.
func NewSectionReadSeeker(base io.ReadSeeker, off, size int64) (ret io.ReadSeeker) {
ret = §ionReadSeeker{
base: base,
off: off,
size: size,
}
seekOff, err := ret.Seek(0, os.SEEK_SET)
if err != nil {
panic(err)
}
if seekOff != 0 {
panic(seekOff)
}
return
}
func (me *sectionReadSeeker) Seek(off int64, whence int) (ret int64, err error) {
switch whence {
case os.SEEK_SET:
off += me.off
case os.SEEK_CUR:
case os.SEEK_END:
off += me.off + me.size
whence = os.SEEK_SET
default:
err = fmt.Errorf("unhandled whence: %d", whence)
return
}
ret, err = me.base.Seek(off, whence)
ret -= me.off
return
}
func (me *sectionReadSeeker) Read(b []byte) (n int, err error) {
off, err := me.Seek(0, os.SEEK_CUR)
if err != nil {
return
}
left := me.size - off
if left <= 0 {
err = io.EOF
return
}
if int64(len(b)) > left {
b = b[:left]
}
return me.base.Read(b)
}