From a6d2aff65baa37225a1f5404f38910a601717092 Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Fri, 15 Dec 2023 14:13:50 -0700 Subject: [PATCH] initial commit; recreate bufio reader because learning --- go.mod | 3 +++ main.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 go.mod create mode 100644 main.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..be2e8eb --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gitea/bufio + +go 1.21.4 diff --git a/main.go b/main.go new file mode 100644 index 0000000..974071d --- /dev/null +++ b/main.go @@ -0,0 +1,66 @@ +package main + +import ( + "io" + "log" + "math/rand" +) + +func main() { + reader := NewStreamOfStuff() + bufferedReader := NewBufferedReader(reader) + lenBits := make([]byte, 1) + for i := 0; i < 10; i++ { + if n, err := bufferedReader.Read(lenBits); err != nil || n != len(lenBits) { + panic(err) + } + payload := make([]byte, int(lenBits[0])) + if n, err := bufferedReader.Read(payload); err != nil || n != len(payload) { + panic(err) + } + log.Printf("[%d] (%d) %q", i, len(payload), payload) + } +} + +type BufferedReader struct { + buffer []byte + reader io.Reader +} + +func (r *BufferedReader) Read(b []byte) (int, error) { + for len(b) > len(r.buffer) { + more := make([]byte, 8) + n, err := r.reader.Read(more) + if err != nil { + return 0, err + } + r.buffer = append(r.buffer, more[:n]...) + } + n := len(b) + if copied := copy(b, r.buffer[:n]); copied != n { + panic(copied) + } + r.buffer = r.buffer[n:] + return n, nil +} + +func NewBufferedReader(r io.Reader) io.Reader { + return &BufferedReader{ + buffer: []byte{}, + reader: r, + } +} + +func NewStreamOfStuff() io.Reader { + return jitterReader{} +} + +type jitterReader struct{} + +func (jitterReader jitterReader) Read(b []byte) (int, error) { + n := rand.Int()%len(b) + 1 + for i := 0; i < n; i++ { + b[i] = 'a' + byte(rand.Int()%26) + } + return n, nil +}