]> Sergey Matveev's repositories - glocate.git/blob - reader.go
269fc3295dac975ee17b8a4007c9995da5813562f989a1ff4ce3f92366daa7eb
[glocate.git] / reader.go
1 package main
2
3 import (
4         "encoding/binary"
5         "io"
6         "log"
7 )
8
9 func mustReadFull(r io.Reader, buf []byte) {
10         if _, err := io.ReadFull(r, buf); err != nil {
11                 log.Fatalln(err)
12         }
13 }
14
15 func reader(r io.Reader, sink chan Ent) {
16         var err error
17         num := make([]byte, 8)
18         var cols []string
19         var namePrev string
20         var nameLen uint16
21         var depth, depthPrev uint8
22         for {
23                 _, err = io.ReadFull(r, num[:2])
24                 if err != nil {
25                         if err == io.EOF {
26                                 break
27                         }
28                         log.Fatalln(err)
29                 }
30                 nameLen = binary.BigEndian.Uint16(num[:2])
31                 nameRaw := make([]byte, nameLen)
32                 mustReadFull(r, nameRaw)
33                 name := string(nameRaw)
34                 mustReadFull(r, num[:1])
35                 depth = uint8(num[0])
36                 mustReadFull(r, num)
37                 ent := Ent{mtime: int64(binary.BigEndian.Uint64(num))}
38                 mustReadFull(r, num)
39                 ent.size = int64(binary.BigEndian.Uint64(num))
40                 if depth > depthPrev {
41                         cols = append(cols, namePrev[:len(namePrev)-1])
42                 } else if depth < depthPrev {
43                         cols = cols[:len(cols)-int(depthPrev-depth)]
44                 }
45                 ent.name = append([]string{}, append(cols, name)...)
46                 sink <- ent
47                 namePrev = name
48                 depthPrev = depth
49         }
50         close(sink)
51 }