Skip to content

Instantly share code, notes, and snippets.

@karuna
Created September 25, 2022 14:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save karuna/de787fe576cdf45d0081b50b5704bf8f to your computer and use it in GitHub Desktop.
Save karuna/de787fe576cdf45d0081b50b5704bf8f to your computer and use it in GitHub Desktop.
debugging parser.go
package main
import (
"fmt"
"io"
"strings"
"time"
)
const (
defaultBufSize = 32
)
type parser struct {
//buffer is a slice of bigBuffer
bigBuffer, buffer []byte
reader io.Reader
lastRead time.Time
}
func newParser(reader io.Reader) *parser {
return &parser{reader: reader}
}
func (p *parser) readMore() (int, error) {
if len(p.buffer) == cap(p.buffer) {
var newBuffer []byte
switch {
//initialize the parser
case len(p.bigBuffer) == 0:
fmt.Println("------------------------ 0")
fmt.Println(p.bigBuffer)
fmt.Println(p.buffer)
p.bigBuffer = make([]byte, defaultBufSize)
newBuffer = p.bigBuffer[0:0]
//shift buffer back to the start of bigBuffer
case 2*len(p.buffer) <= len(p.bigBuffer):
fmt.Println("------------------------ 1")
fmt.Println(p.bigBuffer)
fmt.Println(p.buffer)
newBuffer = p.bigBuffer[0:len(p.buffer)]
//reallocate big buffer with enough space to shift buffer
default:
fmt.Println("------------------------ 3")
fmt.Println(p.bigBuffer)
fmt.Println(p.buffer)
p.bigBuffer = make([]byte, 2*len(p.buffer))
newBuffer = p.bigBuffer[0:len(p.buffer)]
}
copy(newBuffer, p.buffer)
fmt.Println("------------------------ 4")
fmt.Println(p.bigBuffer)
fmt.Println(p.buffer)
p.buffer = newBuffer
fmt.Println("------------------------ 5")
fmt.Println(p.bigBuffer)
fmt.Println(p.buffer)
}
n, e := p.reader.Read(p.buffer[len(p.buffer):cap(p.buffer)])
p.lastRead = time.Now()
p.buffer = p.buffer[:len(p.buffer)+n]
return n, e
}
func main() {
reader := strings.NewReader("Hello, Reader! 123456789abcdefghijklmnopqrstuABCDEFGHIJKLMNOPQRSTUVWXYZ")
parser := newParser(reader)
var newBuffer []byte
parser.bigBuffer = make([]byte, defaultBufSize)
newBuffer = parser.bigBuffer[0:0]
fmt.Println("------------------------ 0")
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
copy(newBuffer, parser.buffer)
fmt.Println("------------------------ 1")
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
parser.buffer = newBuffer
fmt.Println("------------------------ 2")
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
n, _ := parser.reader.Read(parser.buffer[len(parser.buffer):cap(parser.buffer)])
fmt.Println("------------------------ 3")
fmt.Println(n)
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
parser.lastRead = time.Now()
parser.buffer = parser.buffer[:len(parser.buffer)+n]
// -------------------------------------------------------------------
newBuffer = parser.bigBuffer[0:len(parser.buffer)]
fmt.Println("------------------------ 4")
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
copy(newBuffer, parser.buffer)
fmt.Println("------------------------ 5")
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
parser.buffer = newBuffer
fmt.Println("------------------------ 6")
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
n, _ = parser.reader.Read(parser.buffer[len(parser.buffer):cap(parser.buffer)])
fmt.Println("------------------------ 7")
fmt.Println(n)
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
parser.lastRead = time.Now()
parser.buffer = parser.buffer[:len(parser.buffer)+n]
// -------------------------------------------------------------------
parser.bigBuffer = make([]byte, 2*len(parser.buffer))
newBuffer = parser.bigBuffer[0:len(parser.buffer)]
fmt.Println("------------------------ 8")
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
copy(newBuffer, parser.buffer)
fmt.Println("------------------------ 9")
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
parser.buffer = newBuffer
fmt.Println("------------------------ 10")
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
n, _ = parser.reader.Read(parser.buffer[len(parser.buffer):cap(parser.buffer)])
fmt.Println("------------------------ 11")
fmt.Println(n)
fmt.Println(parser.bigBuffer)
fmt.Println(parser.buffer)
fmt.Println(string(parser.bigBuffer))
fmt.Println(string(parser.buffer))
parser.lastRead = time.Now()
parser.buffer = parser.buffer[:len(parser.buffer)+n]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment