]> Sergey Matveev's repositories - glocate.git/blob - writer.go
e12a19c0d7f2103ae9c88e4c4f3c237bb3d03f62819ea98eb33c93210f221256
[glocate.git] / writer.go
1 package main
2
3 import (
4         "encoding/binary"
5         "io"
6         "log"
7 )
8
9 func mustWrite(w io.Writer, buf []byte) {
10         if _, err := w.Write(buf); err != nil {
11                 log.Fatalln(err)
12         }
13 }
14
15 func writer(w io.Writer, sink chan Ent) {
16         num := make([]byte, 8)
17         var name string
18         for ent := range sink {
19                 name = ent.name[len(ent.name)-1]
20                 if len(ent.name) >= 1<<16 {
21                         panic("too long")
22                 }
23                 binary.BigEndian.PutUint16(num[:2], uint16(len(name)))
24                 mustWrite(w, num[:2])
25                 mustWrite(w, []byte(name))
26                 if len(ent.name) >= 1<<8 {
27                         panic("too deep")
28                 }
29                 mustWrite(w, []byte{byte(len(ent.name) - 1)})
30                 binary.BigEndian.PutUint64(num, uint64(ent.mtime))
31                 mustWrite(w, num)
32                 binary.BigEndian.PutUint64(num, uint64(ent.size))
33                 mustWrite(w, num)
34         }
35 }