--- /dev/null
+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)
+}