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