diff options
Diffstat (limited to 'vendor/github.com/xi2/xz/reader.go')
-rw-r--r-- | vendor/github.com/xi2/xz/reader.go | 256 |
1 files changed, 0 insertions, 256 deletions
diff --git a/vendor/github.com/xi2/xz/reader.go b/vendor/github.com/xi2/xz/reader.go deleted file mode 100644 index e321d75..0000000 --- a/vendor/github.com/xi2/xz/reader.go +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Package xz Go Reader API - * - * Author: Michael Cross <https://github.com/xi2> - * - * This file has been put into the public domain. - * You can do whatever you want with this file. - */ - -package xz - -import ( - "errors" - "io" -) - -// Package specific errors. -var ( - ErrUnsupportedCheck = errors.New("xz: integrity check type not supported") - ErrMemlimit = errors.New("xz: LZMA2 dictionary size exceeds max") - ErrFormat = errors.New("xz: file format not recognized") - ErrOptions = errors.New("xz: compression options not supported") - ErrData = errors.New("xz: data is corrupt") - ErrBuf = errors.New("xz: data is truncated or corrupt") -) - -// DefaultDictMax is the default maximum dictionary size in bytes used -// by the decoder. This value is sufficient to decompress files -// created with XZ Utils "xz -9". -const DefaultDictMax = 1 << 26 // 64 MiB - -// inBufSize is the input buffer size used by the decoder. -const inBufSize = 1 << 13 // 8 KiB - -// A Reader is an io.Reader that can be used to retrieve uncompressed -// data from an XZ file. -// -// In general, an XZ file can be a concatenation of other XZ -// files. Reads from the Reader return the concatenation of the -// uncompressed data of each. -type Reader struct { - Header - r io.Reader // the wrapped io.Reader - multistream bool // true if reader is in multistream mode - rEOF bool // true after io.EOF received on r - dEOF bool // true after decoder has completed - padding int // bytes of stream padding read (or -1) - in [inBufSize]byte // backing array for buf.in - buf *xzBuf // decoder input/output buffers - dec *xzDec // decoder state - err error // the result of the last decoder call -} - -// NewReader creates a new Reader reading from r. The decompressor -// will use an LZMA2 dictionary size up to dictMax bytes in -// size. Passing a value of zero sets dictMax to DefaultDictMax. If -// an individual XZ stream requires a dictionary size greater than -// dictMax in order to decompress, Read will return ErrMemlimit. -// -// If NewReader is passed a value of nil for r then a Reader is -// created such that all read attempts will return io.EOF. This is -// useful if you just want to allocate memory for a Reader which will -// later be initialized with Reset. -// -// Due to internal buffering, the Reader may read more data than -// necessary from r. -func NewReader(r io.Reader, dictMax uint32) (*Reader, error) { - if dictMax == 0 { - dictMax = DefaultDictMax - } - z := &Reader{ - r: r, - multistream: true, - padding: -1, - buf: &xzBuf{}, - } - if r == nil { - z.rEOF, z.dEOF = true, true - } - z.dec = xzDecInit(dictMax, &z.Header) - var err error - if r != nil { - _, err = z.Read(nil) // read stream header - } - return z, err -} - -// decode is a wrapper around xzDecRun that additionally handles -// stream padding. It treats the padding as a kind of stream that -// decodes to nothing. -// -// When decoding padding, z.padding >= 0 -// When decoding a real stream, z.padding == -1 -func (z *Reader) decode() (ret xzRet) { - if z.padding >= 0 { - // read all padding in input buffer - for z.buf.inPos < len(z.buf.in) && - z.buf.in[z.buf.inPos] == 0 { - z.buf.inPos++ - z.padding++ - } - switch { - case z.buf.inPos == len(z.buf.in) && z.rEOF: - // case: out of padding. no more input data available - if z.padding%4 != 0 { - ret = xzDataError - } else { - ret = xzStreamEnd - } - case z.buf.inPos == len(z.buf.in): - // case: read more padding next loop iteration - ret = xzOK - default: - // case: out of padding. more input data available - if z.padding%4 != 0 { - ret = xzDataError - } else { - xzDecReset(z.dec) - ret = xzStreamEnd - } - } - } else { - ret = xzDecRun(z.dec, z.buf) - } - return -} - -func (z *Reader) Read(p []byte) (n int, err error) { - // restore err - err = z.err - // set decoder output buffer to p - z.buf.out = p - z.buf.outPos = 0 - for { - // update n - n = z.buf.outPos - // if last call to decoder ended with an error, return that error - if err != nil { - break - } - // if decoder has finished, return with err == io.EOF - if z.dEOF { - err = io.EOF - break - } - // if p full, return with err == nil, unless we have not yet - // read the stream header with Read(nil) - if n == len(p) && z.CheckType != checkUnset { - break - } - // if needed, read more data from z.r - if z.buf.inPos == len(z.buf.in) && !z.rEOF { - rn, e := z.r.Read(z.in[:]) - if e != nil && e != io.EOF { - // read error - err = e - break - } - if e == io.EOF { - z.rEOF = true - } - // set new input buffer in z.buf - z.buf.in = z.in[:rn] - z.buf.inPos = 0 - } - // decode more data - ret := z.decode() - switch ret { - case xzOK: - // no action needed - case xzStreamEnd: - if z.padding >= 0 { - z.padding = -1 - if !z.multistream || z.rEOF { - z.dEOF = true - } - } else { - z.padding = 0 - } - case xzUnsupportedCheck: - err = ErrUnsupportedCheck - case xzMemlimitError: - err = ErrMemlimit - case xzFormatError: - err = ErrFormat - case xzOptionsError: - err = ErrOptions - case xzDataError: - err = ErrData - case xzBufError: - err = ErrBuf - } - // save err - z.err = err - } - return -} - -// Multistream controls whether the reader is operating in multistream -// mode. -// -// If enabled (the default), the Reader expects the input to be a -// sequence of XZ streams, possibly interspersed with stream padding, -// which it reads one after another. The effect is that the -// concatenation of a sequence of XZ streams or XZ files is -// treated as equivalent to the compressed result of the concatenation -// of the sequence. This is standard behaviour for XZ readers. -// -// Calling Multistream(false) disables this behaviour; disabling the -// behaviour can be useful when reading file formats that distinguish -// individual XZ streams. In this mode, when the Reader reaches the -// end of the stream, Read returns io.EOF. To start the next stream, -// call z.Reset(nil) followed by z.Multistream(false). If there is no -// next stream, z.Reset(nil) will return io.EOF. -func (z *Reader) Multistream(ok bool) { - z.multistream = ok -} - -// Reset, for non-nil values of io.Reader r, discards the Reader z's -// state and makes it equivalent to the result of its original state -// from NewReader, but reading from r instead. This permits reusing a -// Reader rather than allocating a new one. -// -// If you wish to leave r unchanged use z.Reset(nil). This keeps r -// unchanged and ensures internal buffering is preserved. If the -// Reader was at the end of a stream it is then ready to read any -// follow on streams. If there are no follow on streams z.Reset(nil) -// returns io.EOF. If the Reader was not at the end of a stream then -// z.Reset(nil) does nothing. -func (z *Reader) Reset(r io.Reader) error { - switch { - case r == nil: - z.multistream = true - if !z.dEOF { - return nil - } - if z.rEOF { - return io.EOF - } - z.dEOF = false - _, err := z.Read(nil) // read stream header - return err - default: - z.r = r - z.multistream = true - z.rEOF = false - z.dEOF = false - z.padding = -1 - z.buf.in = nil - z.buf.inPos = 0 - xzDecReset(z.dec) - z.err = nil - _, err := z.Read(nil) // read stream header - return err - } -} |