package main import ( "encoding/binary" "io" "log" ) func mustReadFull(r io.Reader, buf []byte) { if _, err := io.ReadFull(r, buf); err != nil { log.Fatalln(err) } } func reader(r io.Reader, sink chan Ent) { var err error num := make([]byte, 8) var cols []string var namePrev string var nameLen uint16 var depth, depthPrev uint8 for { _, err = io.ReadFull(r, num[:2]) if err != nil { if err == io.EOF { break } log.Fatalln(err) } nameLen = binary.BigEndian.Uint16(num[:2]) nameRaw := make([]byte, nameLen) mustReadFull(r, nameRaw) name := string(nameRaw) mustReadFull(r, num[:1]) depth = uint8(num[0]) mustReadFull(r, num) ent := Ent{mtime: int64(binary.BigEndian.Uint64(num))} mustReadFull(r, num) ent.size = int64(binary.BigEndian.Uint64(num)) if depth > depthPrev { cols = append(cols, namePrev[:len(namePrev)-1]) } else if depth < depthPrev { cols = cols[:len(cols)-int(depthPrev-depth)] } ent.name = append([]string{}, append(cols, name)...) sink <- ent namePrev = name depthPrev = depth } close(sink) }