--- /dev/null
+package main
+
+import (
+ "encoding/binary"
+ "io"
+ "log"
+)
+
+func mustWrite(w io.Writer, buf []byte) {
+ if _, err := w.Write(buf); err != nil {
+ log.Fatalln(err)
+ }
+}
+
+func writer(w io.Writer, sink chan Ent) {
+ num := make([]byte, 8)
+ var name string
+ for ent := range sink {
+ name = ent.name[len(ent.name)-1]
+ if len(ent.name) >= 1<<16 {
+ panic("too long")
+ }
+ binary.BigEndian.PutUint16(num[:2], uint16(len(name)))
+ mustWrite(w, num[:2])
+ mustWrite(w, []byte(name))
+ if len(ent.name) >= 1<<8 {
+ panic("too deep")
+ }
+ mustWrite(w, []byte{byte(len(ent.name) - 1)})
+ binary.BigEndian.PutUint64(num, uint64(ent.mtime))
+ mustWrite(w, num)
+ binary.BigEndian.PutUint64(num, uint64(ent.size))
+ mustWrite(w, num)
+ }
+}