Created
September 25, 2022 14:34
-
-
Save karuna/de787fe576cdf45d0081b50b5704bf8f to your computer and use it in GitHub Desktop.
Revisions
-
karuna created this gist
Sep 25, 2022 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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] }