From 8cc575f7454983601726ab4877b91bdbfbc6df0d Mon Sep 17 00:00:00 2001 From: sgf Date: Wed, 22 Jun 2022 00:16:52 +0300 Subject: [PATCH] Save samovar v2. --- samovar.go | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 93 insertions(+), 1 deletion(-) diff --git a/samovar.go b/samovar.go index 8830ccb..7a081b9 100644 --- a/samovar.go +++ b/samovar.go @@ -8,6 +8,7 @@ import ( "os" "io" "errors" + "bufio" ) var rootPath = "samovar" @@ -61,8 +62,99 @@ func rewritePathes(p0 string, _ fs.DirEntry, err error) error { return nil } +type LineByLine struct { + input io.Reader + buf []byte + off int + end int +} + +var lineByLineDebug = false + +func (r *LineByLine) ReadLine() (line []byte, err error) { + if r.input == nil { return nil, nil } + if r.buf == nil || len(r.buf) == 0 { + var x [8]byte + r.buf = append(r.buf, x[:]...) + r.end = cap(r.buf) + fmt.Printf("Allocating buffer: %v, %v, %v\n", r.buf, len(r.buf), cap(r.buf)) + } + + var n int + if lineByLineDebug { fmt.Printf("Start line is: %q, off: %d, end: %d, buf: %q\n", line, r.off, r.end, r.buf) } + for { + + if r.off == 0 { + n, err = r.input.Read(r.buf) + if err != io.EOF && err != nil { return nil, err } + if lineByLineDebug { fmt.Printf("Read %q\n", r.buf) } + } else { + n = r.end + if lineByLineDebug { fmt.Printf("Continuing read from offset %d with %d\n", r.off, n) } + } + + for i, c := range r.buf[r.off:] { + if lineByLineDebug { fmt.Printf("%d %q ", i, c) } + if i >= n { + break + } + if c == '\n' { + line = append(line, r.buf[r.off:r.off+i+1]...) + r.off += i+1 + r.end = n + if lineByLineDebug { fmt.Printf("Found newline. Stopping at %d, %d with: %q\n", r.off, r.end, line) } + return line, nil + } + } + line = append(line, r.buf[r.off:n]...) + if lineByLineDebug { fmt.Printf("Newline not found. Line is: %q\n", line) } + if r.off != 0 { + r.off = 0 + r.end = cap(r.buf) + } + if err == io.EOF { + return line, io.EOF + } + } +} + func main() { - err := filepath.WalkDir(rootPath, copyToLower) + h0, err := os.Open("int.go") + if err != nil { panic("huynya") } + defer h0.Close() + + h1, err := os.OpenFile("2.tmp", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { panic("huynya") } + defer h1.Close() + + v := LineByLine{input: h0} + for { + l, err := v.ReadLine() + if err == io.EOF { break } + fmt.Printf("Received %q\n", l) + h1.Write(l) + } + + h2, err := os.Open("int.go") + if err != nil { panic("huynya") } + defer h2.Close() + + h3, err := os.OpenFile("3.tmp", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { panic("huynya") } + defer h3.Close() + + s := bufio.NewScanner(h2) + for { + b := s.Scan() + if !b { break } + fmt.Printf("Scanner Received %q\n", s.Text()) + l := s.Bytes() + l = append(l, "\n"...) + h3.Write(l) + } + return + + err = filepath.WalkDir(rootPath, copyToLower) if err != nil { fmt.Println(err) fmt.Println("huynya bro") -- 2.20.1