package main
import (
+ "bufio"
"encoding/binary"
"io"
"log"
+
+ "github.com/klauspost/compress/zstd"
)
func mustReadFull(r io.Reader, buf []byte) {
}
}
-func reader(r io.Reader, sink chan Ent) {
- var err error
+func reader(src io.Reader, sink chan Ent) {
+ comp, err := zstd.NewReader(src)
+ if err != nil {
+ log.Fatalln(err)
+ }
+ br := bufio.NewReaderSize(comp, 1<<17)
+
num := make([]byte, 8)
var cols []string
var namePrev string
var nameLen uint16
var depth, depthPrev uint8
for {
- _, err = io.ReadFull(r, num[:2])
+ _, err = io.ReadFull(br, num[:2])
if err != nil {
if err == io.EOF {
break
}
nameLen = binary.BigEndian.Uint16(num[:2])
nameRaw := make([]byte, nameLen)
- mustReadFull(r, nameRaw)
+ mustReadFull(br, nameRaw)
name := string(nameRaw)
- mustReadFull(r, num[:1])
+ mustReadFull(br, num[:1])
depth = uint8(num[0])
- mustReadFull(r, num)
+ mustReadFull(br, num)
ent := Ent{mtime: int64(binary.BigEndian.Uint64(num))}
- mustReadFull(r, num)
+ mustReadFull(br, num)
ent.size = int64(binary.BigEndian.Uint64(num))
if depth > depthPrev {
cols = append(cols, namePrev[:len(namePrev)-1])
depthPrev = depth
}
close(sink)
+ comp.Close()
}