]> Sergey Matveev's repositories - glocate.git/blobdiff - reader.go
Improved version
[glocate.git] / reader.go
diff --git a/reader.go b/reader.go
new file mode 100644 (file)
index 0000000..269fc32
--- /dev/null
+++ b/reader.go
@@ -0,0 +1,51 @@
+package main
+
+import (
+       "encoding/binary"
+       "io"
+       "log"
+)
+
+func mustReadFull(r io.Reader, buf []byte) {
+       if _, err := io.ReadFull(r, buf); err != nil {
+               log.Fatalln(err)
+       }
+}
+
+func reader(r io.Reader, sink chan Ent) {
+       var err error
+       num := make([]byte, 8)
+       var cols []string
+       var namePrev string
+       var nameLen uint16
+       var depth, depthPrev uint8
+       for {
+               _, err = io.ReadFull(r, num[:2])
+               if err != nil {
+                       if err == io.EOF {
+                               break
+                       }
+                       log.Fatalln(err)
+               }
+               nameLen = binary.BigEndian.Uint16(num[:2])
+               nameRaw := make([]byte, nameLen)
+               mustReadFull(r, nameRaw)
+               name := string(nameRaw)
+               mustReadFull(r, num[:1])
+               depth = uint8(num[0])
+               mustReadFull(r, num)
+               ent := Ent{mtime: int64(binary.BigEndian.Uint64(num))}
+               mustReadFull(r, num)
+               ent.size = int64(binary.BigEndian.Uint64(num))
+               if depth > depthPrev {
+                       cols = append(cols, namePrev[:len(namePrev)-1])
+               } else if depth < depthPrev {
+                       cols = cols[:len(cols)-int(depthPrev-depth)]
+               }
+               ent.name = append([]string{}, append(cols, name)...)
+               sink <- ent
+               namePrev = name
+               depthPrev = depth
+       }
+       close(sink)
+}