Expand file tree
/
Copy pathbuffer.go
More file actions
Latest commit
78 lines (65 loc) · 1.64 KB
/
Copy pathbuffer.go
File metadata and controls
78 lines (65 loc) · 1.64 KB
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
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
Copyright Medcl (m AT medcl.net)
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package main
import (
"errors"
"io"
)
//https://golangtc.com/t/5a49e2104ce40d740bbbc515
typebufferstruct {
reader io.Reader
buf []byte
startint
endint
}
funcnewBuffer(reader io.Reader, lenint) buffer {
buf:=make([]byte, len)
returnbuffer{reader, buf, 0, 0}
}
func (b*buffer) Len() int {
returnb.end-b.start
}
// 将有用的字节前移
func (b*buffer) grow() {
ifb.start==0 {
return
}
copy(b.buf, b.buf[b.start:b.end])
b.end-=b.start
b.start=0
}
// 从reader里面读取数据,如果reader阻塞,会发生阻塞
func (b*buffer) readFromReader() (int, error) {
b.grow()
n, err:=b.reader.Read(b.buf[b.end:])
iferr!=nil {
returnn, err
}
b.end+=n
returnn, nil
}
// 返回n个字节,而不产生移位
func (b*buffer) seek(nint) ([]byte, error) {
ifb.end-b.start>=n {
buf:=b.buf[b.start : b.start+n]
returnbuf, nil
}
returnnil, errors.New("not enough")
}
// 舍弃offset个字段,读取n个字段
func (b*buffer) read(offset, nint) []byte {
b.start+=offset
buf:=b.buf[b.start : b.start+n]
b.start+=n
returnbuf
}