Skip to content

Commit 8af848e

Browse files
authored
fix EOF in buffer (#12)
1 parent 72ed054 commit 8af848e

File tree

4 files changed

+55
-15
lines changed

4 files changed

+55
-15
lines changed

data/buffer.go

Lines changed: 51 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ func NewBuffer(size int) *Buffer {
2424
if size < 0 {
2525
size = 0
2626
}
27+
2728
return &Buffer{
2829
buf: make([]byte, 0, size),
2930
pos: 0,
@@ -33,12 +34,12 @@ func NewBuffer(size int) *Buffer {
3334
const maxSize = 100000
3435

3536
func (v *Buffer) Reset() {
36-
l := len(v.buf)
37-
if l > maxSize {
37+
if len(v.buf) > maxSize {
3838
v.buf = v.buf[:0:maxSize]
3939
} else {
4040
v.buf = v.buf[:0]
4141
}
42+
4243
v.pos = 0
4344
}
4445

@@ -62,6 +63,7 @@ func (v *Buffer) Truncate(c int) {
6263
if c <= 0 {
6364
return
6465
}
66+
6567
n := v.Size() - c
6668
if n <= 0 {
6769
v.Reset()
@@ -89,6 +91,7 @@ func (v *Buffer) Truncate(c int) {
8991

9092
func (v *Buffer) Write(p []byte) (int, error) {
9193
v.buf = append(v.buf, p...)
94+
9295
return len(p), nil
9396
}
9497

@@ -98,13 +101,15 @@ func (v *Buffer) WriteString(s string) (int, error) {
98101

99102
func (v *Buffer) WriteByte(b byte) error {
100103
v.buf = append(v.buf, b)
104+
101105
return nil
102106
}
103107

104108
func (v *Buffer) WriteRune(r rune) (n int, err error) {
105109
n = v.Size()
106110
v.buf = utf8.AppendRune(v.buf, r)
107111
n = v.Size() - n
112+
108113
return
109114
}
110115

@@ -114,7 +119,7 @@ func (v *Buffer) WriteTo(w io.Writer) (n int64, err error) {
114119

115120
func (v *Buffer) WriteToN(w io.Writer, size int) (n int64, err error) {
116121
if v.Len() <= 0 {
117-
return 0, io.EOF
122+
return 0, nil
118123
}
119124

120125
b := make([]byte, size)
@@ -128,17 +133,21 @@ func (v *Buffer) WriteToN(w io.Writer, size int) (n int64, err error) {
128133
err = fmt.Errorf("invalid write result")
129134
break
130135
}
136+
131137
if wn != rn {
132138
v.Seek(int64(-rn+wn), SeekCurr) //nolint: errcheck
133139
}
140+
134141
n += int64(wn)
142+
135143
if we != nil {
136144
if !errors.Is(we, io.EOF) {
137145
err = we
138146
}
139147
break
140148
}
141149
}
150+
142151
if re != nil {
143152
if !errors.Is(re, io.EOF) {
144153
err = re
@@ -171,104 +180,125 @@ func (v *Buffer) ReadFrom(r io.Reader) (int64, error) {
171180
func (v *Buffer) ReadFromN(r io.Reader, size int) (int64, error) {
172181
n := 0
173182
b := make([]byte, size)
183+
174184
for {
175185
m, err := r.Read(b)
176186
if m < 0 {
177187
return 0, fmt.Errorf("negative read bytes")
178188
}
189+
179190
if err != nil && !errors.Is(err, io.EOF) {
180191
return 0, err
181192
}
193+
182194
n += m
195+
183196
v.buf = append(v.buf, b[:m]...)
184197
if m < size || errors.Is(err, io.EOF) {
185198
break
186199
}
187200
}
201+
188202
return int64(n), nil
189203
}
190204

191205
func (v *Buffer) Read(p []byte) (int, error) {
192206
if len(p) == 0 {
193-
return 0, fmt.Errorf("got zero buffer arg")
207+
return 0, fmt.Errorf("got zero buffer")
194208
}
209+
195210
if v.Len() == 0 {
196211
return 0, io.EOF
197212
}
213+
198214
n := copy(p[:], v.buf[v.pos:])
199215
v.pos += n
200216
return n, nil
201217
}
202218

203219
func (v *Buffer) ReadAt(p []byte, off int64) (int, error) {
204220
if len(p) == 0 {
205-
return 0, fmt.Errorf("got zero buffer arg")
221+
return 0, fmt.Errorf("got zero buffer")
206222
}
223+
207224
if off < 0 || int(off) >= v.Size() {
208225
return 0, io.EOF
209226
}
227+
210228
n := copy(p[:], v.buf[int(off):])
229+
211230
return n, nil
212231
}
213232

214233
func (v *Buffer) Discard(n int) int {
215234
if n <= 0 {
216235
return 0
217236
}
237+
218238
np, _ := v.Seek(int64(n), SeekCurr) //nolint: errcheck
239+
219240
return int(np)
220241
}
221242

222243
func (v *Buffer) Resume(n int) int {
223244
if n <= 0 {
224245
return 0
225246
}
247+
226248
np, _ := v.Seek(-int64(n), SeekCurr) //nolint: errcheck
249+
227250
return int(np)
228251
}
229252

230253
func (v *Buffer) Next(n int) []byte {
231254
if n <= 0 {
232255
return nil
233256
}
257+
234258
m := v.Len()
235259
if m == 0 {
236260
return nil
237261
}
262+
238263
if n > m {
239264
n = m
240265
}
266+
241267
b := make([]byte, n)
242268
v.pos += copy(b[:], v.buf[v.pos:])
269+
243270
return b
244271
}
245272

246273
func (v *Buffer) ReadByte() (byte, error) {
247-
m := v.Len()
248-
if m == 0 {
274+
if v.Len() == 0 {
249275
return 0, io.EOF
250276
}
277+
251278
b := v.buf[v.pos]
252279
v.pos++
280+
253281
return b, nil
254282
}
255283

256284
func (v *Buffer) UnreadByte() error {
257285
if v.pos <= 0 {
258286
return fmt.Errorf("at beginning")
259287
}
288+
260289
v.pos--
290+
261291
return nil
262292
}
263293

264294
func (v *Buffer) ReadRune() (rune, int, error) {
265-
m := v.Len()
266-
if m == 0 {
295+
if v.Len() == 0 {
267296
return 0, 0, io.EOF
268297
}
269298

270299
r, n := utf8.DecodeRune(v.buf[v.pos:])
271300
v.pos += n
301+
272302
return r, n, nil
273303
}
274304

@@ -293,31 +323,37 @@ func (v *Buffer) UnreadRune() error {
293323
}
294324

295325
func (v *Buffer) ReadBytes(delim byte) ([]byte, error) {
296-
m := v.Len()
297-
if m == 0 {
326+
if v.Len() == 0 {
298327
return nil, io.EOF
299328
}
329+
300330
i := bytes.IndexByte(v.buf[v.pos:], delim)
301331
end := v.pos + i + 1
302332
if i < 0 {
303333
end = v.Size()
304334
}
335+
305336
b := v.buf[v.pos:end]
306337
v.pos = end
338+
307339
return b, nil
308340
}
309341

310342
func (v *Buffer) ReadNextBytes(delim []byte) ([]byte, error) {
311343
if v.Len() == 0 {
312344
return nil, io.EOF
313345
}
346+
314347
i := bytes.Index(v.buf[v.pos:], delim)
315348
end := v.pos + i + len(delim)
349+
316350
if i < 0 {
317351
end = v.Size()
318352
}
353+
319354
b := v.buf[v.pos:end]
320355
v.pos = end
356+
321357
return b, nil
322358
}
323359

@@ -367,6 +403,7 @@ func (v *Buffer) ReadString(delim byte) (string, error) {
367403
if err != nil {
368404
return "", err
369405
}
406+
370407
return string(b), nil
371408
}
372409

@@ -375,6 +412,7 @@ func (v *Buffer) ReadNextString(delim string) (string, error) {
375412
if err != nil {
376413
return "", err
377414
}
415+
378416
return string(b), nil
379417
}
380418

@@ -395,10 +433,12 @@ func (v *Buffer) Seek(offset int64, whence int) (int64, error) {
395433
default:
396434
return 0, fmt.Errorf("invalid whence")
397435
}
436+
398437
if v.pos < 0 {
399438
v.pos = 0
400439
} else if v.pos > v.Size() {
401440
v.pos = v.Size()
402441
}
442+
403443
return int64(v.pos), nil
404444
}

data/buffer_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ func TestUnit_Data1(t *testing.T) {
204204
casecheck.Equal(t, "123aФ卉**123", bb.String())
205205

206206
i, err = d.WriteTo(bb)
207-
casecheck.Error(t, err)
207+
casecheck.NoError(t, err)
208208
casecheck.Equal(t, int64(0), i)
209209

210210
d.Seek(0, 0)

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ go 1.24.6
55
require (
66
github.com/BurntSushi/toml v1.5.0
77
go.osspkg.com/casecheck v0.3.0
8-
go.osspkg.com/errors v0.3.1
8+
go.osspkg.com/errors v0.4.0
99
go.osspkg.com/random v0.5.0
1010
go.osspkg.com/routine v0.4.0
1111
go.osspkg.com/syncing v0.4.0

go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg
22
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
33
go.osspkg.com/casecheck v0.3.0 h1:x15blEszElbrHrEH5H02JIIhGIg/lGZzIt1kQlD3pwM=
44
go.osspkg.com/casecheck v0.3.0/go.mod h1:TRFXDMFJEOtnlp3ET2Hix3osbxwPWhvaiT/HfD3+gBA=
5-
go.osspkg.com/errors v0.3.1 h1:F9m/EEd/Ot2jba/TV7tvVRIpWXzIpNLc7vRJKcBD86A=
6-
go.osspkg.com/errors v0.3.1/go.mod h1:dKXe6Rt07nzY7OyKQNZ8HGBicZ2uQ5TKEoVFnVFOK44=
5+
go.osspkg.com/errors v0.4.0 h1:E17+WyUzTXEHCTxGm8lOMPOOojzHG1lsOuQtTVGoATQ=
6+
go.osspkg.com/errors v0.4.0/go.mod h1:s75ZovPemYtrCtRPVsbQNq9MgMbmLMK1NEypr+uwjXI=
77
go.osspkg.com/random v0.5.0 h1:6x2CQ5Vb6PVyuGi6Ao3K6Pr2fzVviBPCEEJC5HQNSmg=
88
go.osspkg.com/random v0.5.0/go.mod h1:lsg3FI87PQdjhVWIVo2GXyPBclipljUxjMlWqRl2cck=
99
go.osspkg.com/routine v0.4.0 h1:fEDOI3BTaM/rt5pYT+qPq4gFxvw8WJVY2jMeczB7F9A=

0 commit comments

Comments
 (0)