package main
import (
+ "bufio"
"encoding/binary"
"io"
"log"
+
+ "github.com/klauspost/compress/zstd"
)
func mustWrite(w io.Writer, buf []byte) {
}
}
-func writer(w io.Writer, sink chan Ent) {
+func writer(dst io.Writer, sink chan Ent) {
+ comp, err := zstd.NewWriter(dst)
+ if err != nil {
+ log.Fatalln(err)
+ }
+ bw := bufio.NewWriterSize(comp, 1<<17)
num := make([]byte, 8)
var name string
for ent := range sink {
panic("too long")
}
binary.BigEndian.PutUint16(num[:2], uint16(len(name)))
- mustWrite(w, num[:2])
- mustWrite(w, []byte(name))
+ mustWrite(bw, num[:2])
+ mustWrite(bw, []byte(name))
if len(ent.name) >= 1<<8 {
panic("too deep")
}
- mustWrite(w, []byte{byte(len(ent.name) - 1)})
+ mustWrite(bw, []byte{byte(len(ent.name) - 1)})
binary.BigEndian.PutUint64(num, uint64(ent.mtime))
- mustWrite(w, num)
+ mustWrite(bw, num)
binary.BigEndian.PutUint64(num, uint64(ent.size))
- mustWrite(w, num)
+ mustWrite(bw, num)
+ }
+ if err = bw.Flush(); err != nil {
+ log.Fatalln(err)
+ }
+ if err = comp.Close(); err != nil {
+ log.Fatalln(err)
}
}