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