From a6f30a68784dc7dd23bfb89e8513a3e900bc96f2 Mon Sep 17 00:00:00 2001 From: Garet Halliday <me@garet.holiday> Date: Fri, 10 May 2024 18:50:57 -0500 Subject: [PATCH] cool --- lib/fed/decoder.go | 25 +++++++++++++++++-------- lib/fed/encoder.go | 7 +++---- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/fed/decoder.go b/lib/fed/decoder.go index f5fbee71..db750827 100644 --- a/lib/fed/decoder.go +++ b/lib/fed/decoder.go @@ -47,7 +47,7 @@ func (T *Decoder) refill() error { func (T *Decoder) discard(n int) error { for n > 0 { if T.bufferWrite != 0 { - count := max(n, T.bufferWrite-T.bufferRead) + count := min(n, T.bufferWrite-T.bufferRead) T.bufferRead += count n -= count if T.bufferRead == T.bufferWrite { @@ -67,6 +67,9 @@ func (T *Decoder) discard(n int) error { } func (T *Decoder) read(b []byte) (n int, err error) { + if len(b) == 0 { + return + } if T.bufferWrite != 0 { n = copy(b, T.buffer[T.bufferRead:T.bufferWrite]) T.bufferRead += n @@ -83,8 +86,8 @@ func (T *Decoder) read(b []byte) (n int, err error) { // read into buffer first err = T.refill() - n = copy(b, T.buffer[:T.bufferWrite]) - T.bufferRead = n + n = copy(b, T.buffer[T.bufferRead:T.bufferWrite]) + T.bufferRead += n if T.bufferRead == T.bufferWrite { T.bufferRead = 0 T.bufferWrite = 0 @@ -159,10 +162,10 @@ func (T *Decoder) Next(typed bool) error { var err error if typed { - _, err = T.read(T.decodeBuf[:5]) + _, err = T.readFull(T.decodeBuf[:5]) } else { T.decodeBuf[0] = 0 - _, err = T.read(T.decodeBuf[1:5]) + _, err = T.readFull(T.decodeBuf[1:5]) } if err != nil { return err @@ -249,18 +252,20 @@ func (T *Decoder) String() (string, error) { for i, v := range T.buffer[T.bufferRead:T.bufferWrite] { if v == 0 { res := string(T.buffer[T.bufferRead : T.bufferRead+i]) - T.bufferRead += i + T.bufferRead += i + 1 if T.bufferRead == T.bufferWrite { T.bufferRead = 0 T.bufferWrite = 0 } - T.packetPos += i + T.packetPos += i + 1 return res, nil } } var builder strings.Builder builder.Write(T.buffer[T.bufferRead:T.bufferWrite]) + T.bufferRead = 0 + T.bufferWrite = 0 for { if err := T.refill(); err != nil { T.packetPos += builder.Len() @@ -270,7 +275,7 @@ func (T *Decoder) String() (string, error) { for i, v := range T.buffer[T.bufferRead:T.bufferWrite] { if v == 0 { builder.Write(T.buffer[T.bufferRead : T.bufferRead+i]) - T.bufferRead += i + T.bufferRead += i + 1 if T.bufferRead == T.bufferWrite { T.bufferRead = 0 T.bufferWrite = 0 @@ -279,5 +284,9 @@ func (T *Decoder) String() (string, error) { return builder.String(), nil } } + + builder.Write(T.buffer[T.bufferRead:T.bufferWrite]) + T.bufferRead = 0 + T.bufferWrite = 0 } } diff --git a/lib/fed/encoder.go b/lib/fed/encoder.go index 809ea82c..6d88d48a 100644 --- a/lib/fed/encoder.go +++ b/lib/fed/encoder.go @@ -9,7 +9,7 @@ import ( "gfx.cafe/gfx/pggat/lib/util/decorator" ) -const defaultBufferSize = 16 * 1024 +const defaultBufferSize = 4 * 1024 type Encoder struct { noCopy decorator.NoCopy @@ -60,9 +60,8 @@ func (T *Encoder) ReadFrom(r *Decoder) (int, error) { } func (T *Encoder) Flush() error { - pos := T.bufferPos + _, err := T.writer.Write(T.buffer[:T.bufferPos]) T.bufferPos = 0 - _, err := T.writer.Write(T.buffer[:pos]) return err } @@ -197,12 +196,12 @@ func (T *Encoder) String(v string) error { n := copy(T.buffer[T.bufferPos:], v) T.bufferPos += n T.packetPos += n + v = v[n:] if T.bufferPos >= len(T.buffer) { if err := T.Flush(); err != nil { return err } } - v = v[n:] } if err := T.writeByte(0); err != nil { return err -- GitLab