Save samovar v2.
authorsgf <sgf.dma@gmail.com>
Tue, 21 Jun 2022 21:16:52 +0000 (00:16 +0300)
committersgf <sgf.dma@gmail.com>
Tue, 21 Jun 2022 21:16:52 +0000 (00:16 +0300)
samovar.go

index 8830ccb..7a081b9 100644 (file)
@@ -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")