if z.err != nil {
return 0, z.err
}
- if len(p) == 0 {
- return 0, nil
- }
- n, err = z.decompressor.Read(p)
+ n, z.err = z.decompressor.Read(p)
z.digest.Write(p[0:n])
z.size += uint32(n)
- if n != 0 || err != io.EOF {
- z.err = err
- return
+ if z.err != io.EOF {
+ // In the normal case we return here.
+ return n, z.err
}
// Finished file; check checksum + size.
err = io.ErrUnexpectedEOF
}
z.err = err
- return 0, err
+ return n, err
}
crc32, isize := get4(z.buf[0:4]), get4(z.buf[4:8])
sum := z.digest.Sum32()
if sum != crc32 || isize != z.size {
z.err = ErrChecksum
- return 0, z.err
+ return n, z.err
}
+ z.digest.Reset()
+ z.size = 0
- // File is ok; is there another?
+ // File is ok; check if there is another.
if !z.multistream {
- return 0, io.EOF
+ return n, io.EOF
}
+ z.err = nil // Remove io.EOF
- if err = z.readHeader(false); err != nil {
- z.err = err
- return
+ if z.err = z.readHeader(false); z.err != nil {
+ return n, z.err
}
- // Yes. Reset and read from it.
- z.digest.Reset()
- z.size = 0
+ // Read from next file, if necessary.
+ if n > 0 {
+ return n, nil
+ }
return z.Read(p)
}