X-Git-Url: http://www.git.stargrave.org/?p=glocate.git;a=blobdiff_plain;f=writer.go;fp=writer.go;h=e12a19c0d7f2103ae9c88e4c4f3c237bb3d03f62819ea98eb33c93210f221256;hp=0000000000000000000000000000000000000000000000000000000000000000;hb=d5b8c235a1f3088c6c1e7261df3d1b565d042db2ba2ad1bbd1018782b9178e1f;hpb=411a031ec7cc707b8269acc3dfe28bc8db1bab5a9a91781c26809ae9853c6f6a diff --git a/writer.go b/writer.go new file mode 100644 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) + } +}