Skip to content

Instantly share code, notes, and snippets.

@karuna
Created September 25, 2022 14:34
Show Gist options
  • Save karuna/de787fe576cdf45d0081b50b5704bf8f to your computer and use it in GitHub Desktop.
Save karuna/de787fe576cdf45d0081b50b5704bf8f to your computer and use it in GitHub Desktop.

Revisions

  1. karuna created this gist Sep 25, 2022.
    183 changes: 183 additions & 0 deletions parser.go
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,183 @@
    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]
    }