Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 51 additions & 11 deletions data/buffer.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ func NewBuffer(size int) *Buffer {
if size < 0 {
size = 0
}

return &Buffer{
buf: make([]byte, 0, size),
pos: 0,
Expand All @@ -33,12 +34,12 @@ func NewBuffer(size int) *Buffer {
const maxSize = 100000

func (v *Buffer) Reset() {
l := len(v.buf)
if l > maxSize {
if len(v.buf) > maxSize {
v.buf = v.buf[:0:maxSize]
} else {
v.buf = v.buf[:0]
}

v.pos = 0
}

Expand All @@ -62,6 +63,7 @@ func (v *Buffer) Truncate(c int) {
if c <= 0 {
return
}

n := v.Size() - c
if n <= 0 {
v.Reset()
Expand Down Expand Up @@ -89,6 +91,7 @@ func (v *Buffer) Truncate(c int) {

func (v *Buffer) Write(p []byte) (int, error) {
v.buf = append(v.buf, p...)

return len(p), nil
}

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

func (v *Buffer) WriteByte(b byte) error {
v.buf = append(v.buf, b)

return nil
}

func (v *Buffer) WriteRune(r rune) (n int, err error) {
n = v.Size()
v.buf = utf8.AppendRune(v.buf, r)
n = v.Size() - n

return
}

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

func (v *Buffer) WriteToN(w io.Writer, size int) (n int64, err error) {
if v.Len() <= 0 {
return 0, io.EOF
return 0, nil
}

b := make([]byte, size)
Expand All @@ -128,17 +133,21 @@ func (v *Buffer) WriteToN(w io.Writer, size int) (n int64, err error) {
err = fmt.Errorf("invalid write result")
break
}

if wn != rn {
v.Seek(int64(-rn+wn), SeekCurr) //nolint: errcheck
}

n += int64(wn)

if we != nil {
if !errors.Is(we, io.EOF) {
err = we
}
break
}
}

if re != nil {
if !errors.Is(re, io.EOF) {
err = re
Expand Down Expand Up @@ -171,104 +180,125 @@ func (v *Buffer) ReadFrom(r io.Reader) (int64, error) {
func (v *Buffer) ReadFromN(r io.Reader, size int) (int64, error) {
n := 0
b := make([]byte, size)

for {
m, err := r.Read(b)
if m < 0 {
return 0, fmt.Errorf("negative read bytes")
}

if err != nil && !errors.Is(err, io.EOF) {
return 0, err
}

n += m

v.buf = append(v.buf, b[:m]...)
if m < size || errors.Is(err, io.EOF) {
break
}
}

return int64(n), nil
}

func (v *Buffer) Read(p []byte) (int, error) {
if len(p) == 0 {
return 0, fmt.Errorf("got zero buffer arg")
return 0, fmt.Errorf("got zero buffer")
}

if v.Len() == 0 {
return 0, io.EOF
}

n := copy(p[:], v.buf[v.pos:])
v.pos += n
return n, nil
}

func (v *Buffer) ReadAt(p []byte, off int64) (int, error) {
if len(p) == 0 {
return 0, fmt.Errorf("got zero buffer arg")
return 0, fmt.Errorf("got zero buffer")
}

if off < 0 || int(off) >= v.Size() {
return 0, io.EOF
}

n := copy(p[:], v.buf[int(off):])

return n, nil
}

func (v *Buffer) Discard(n int) int {
if n <= 0 {
return 0
}

np, _ := v.Seek(int64(n), SeekCurr) //nolint: errcheck

return int(np)
}

func (v *Buffer) Resume(n int) int {
if n <= 0 {
return 0
}

np, _ := v.Seek(-int64(n), SeekCurr) //nolint: errcheck

return int(np)
}

func (v *Buffer) Next(n int) []byte {
if n <= 0 {
return nil
}

m := v.Len()
if m == 0 {
return nil
}

if n > m {
n = m
}

b := make([]byte, n)
v.pos += copy(b[:], v.buf[v.pos:])

return b
}

func (v *Buffer) ReadByte() (byte, error) {
m := v.Len()
if m == 0 {
if v.Len() == 0 {
return 0, io.EOF
}

b := v.buf[v.pos]
v.pos++

return b, nil
}

func (v *Buffer) UnreadByte() error {
if v.pos <= 0 {
return fmt.Errorf("at beginning")
}

v.pos--

return nil
}

func (v *Buffer) ReadRune() (rune, int, error) {
m := v.Len()
if m == 0 {
if v.Len() == 0 {
return 0, 0, io.EOF
}

r, n := utf8.DecodeRune(v.buf[v.pos:])
v.pos += n

return r, n, nil
}

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

func (v *Buffer) ReadBytes(delim byte) ([]byte, error) {
m := v.Len()
if m == 0 {
if v.Len() == 0 {
return nil, io.EOF
}

i := bytes.IndexByte(v.buf[v.pos:], delim)
end := v.pos + i + 1
if i < 0 {
end = v.Size()
}

b := v.buf[v.pos:end]
v.pos = end

return b, nil
}

func (v *Buffer) ReadNextBytes(delim []byte) ([]byte, error) {
if v.Len() == 0 {
return nil, io.EOF
}

i := bytes.Index(v.buf[v.pos:], delim)
end := v.pos + i + len(delim)

if i < 0 {
end = v.Size()
}

b := v.buf[v.pos:end]
v.pos = end

return b, nil
}

Expand Down Expand Up @@ -367,6 +403,7 @@ func (v *Buffer) ReadString(delim byte) (string, error) {
if err != nil {
return "", err
}

return string(b), nil
}

Expand All @@ -375,6 +412,7 @@ func (v *Buffer) ReadNextString(delim string) (string, error) {
if err != nil {
return "", err
}

return string(b), nil
}

Expand All @@ -395,10 +433,12 @@ func (v *Buffer) Seek(offset int64, whence int) (int64, error) {
default:
return 0, fmt.Errorf("invalid whence")
}

if v.pos < 0 {
v.pos = 0
} else if v.pos > v.Size() {
v.pos = v.Size()
}

return int64(v.pos), nil
}
2 changes: 1 addition & 1 deletion data/buffer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -204,7 +204,7 @@ func TestUnit_Data1(t *testing.T) {
casecheck.Equal(t, "123aФ卉**123", bb.String())

i, err = d.WriteTo(bb)
casecheck.Error(t, err)
casecheck.NoError(t, err)
casecheck.Equal(t, int64(0), i)

d.Seek(0, 0)
Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ go 1.24.6
require (
github.com/BurntSushi/toml v1.5.0
go.osspkg.com/casecheck v0.3.0
go.osspkg.com/errors v0.3.1
go.osspkg.com/errors v0.4.0
go.osspkg.com/random v0.5.0
go.osspkg.com/routine v0.4.0
go.osspkg.com/syncing v0.4.0
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
go.osspkg.com/casecheck v0.3.0 h1:x15blEszElbrHrEH5H02JIIhGIg/lGZzIt1kQlD3pwM=
go.osspkg.com/casecheck v0.3.0/go.mod h1:TRFXDMFJEOtnlp3ET2Hix3osbxwPWhvaiT/HfD3+gBA=
go.osspkg.com/errors v0.3.1 h1:F9m/EEd/Ot2jba/TV7tvVRIpWXzIpNLc7vRJKcBD86A=
go.osspkg.com/errors v0.3.1/go.mod h1:dKXe6Rt07nzY7OyKQNZ8HGBicZ2uQ5TKEoVFnVFOK44=
go.osspkg.com/errors v0.4.0 h1:E17+WyUzTXEHCTxGm8lOMPOOojzHG1lsOuQtTVGoATQ=
go.osspkg.com/errors v0.4.0/go.mod h1:s75ZovPemYtrCtRPVsbQNq9MgMbmLMK1NEypr+uwjXI=
go.osspkg.com/random v0.5.0 h1:6x2CQ5Vb6PVyuGi6Ao3K6Pr2fzVviBPCEEJC5HQNSmg=
go.osspkg.com/random v0.5.0/go.mod h1:lsg3FI87PQdjhVWIVo2GXyPBclipljUxjMlWqRl2cck=
go.osspkg.com/routine v0.4.0 h1:fEDOI3BTaM/rt5pYT+qPq4gFxvw8WJVY2jMeczB7F9A=
Expand Down