]> Sergey Matveev's repositories - glocate.git/blobdiff - writer.go
Improved version
[glocate.git] / writer.go
diff --git a/writer.go b/writer.go
new file mode 100644 (file)
index 0000000..e12a19c
--- /dev/null
+++ b/writer.go
@@ -0,0 +1,35 @@
+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)
+       }
+}