github.com/bodgit/sevenzip@v1.5.1/internal/lzma2/reader.go (about) 1 package lzma2 2 3 import ( 4 "errors" 5 "io" 6 7 "github.com/ulikunitz/xz/lzma" 8 ) 9 10 type readCloser struct { 11 c io.Closer 12 r io.Reader 13 } 14 15 func (rc *readCloser) Close() error { 16 var err error 17 if rc.c != nil { 18 err = rc.c.Close() 19 rc.c, rc.r = nil, nil 20 } 21 22 return err 23 } 24 25 func (rc *readCloser) Read(p []byte) (int, error) { 26 if rc.r == nil { 27 return 0, errors.New("lzma2: Read after Close") 28 } 29 30 return rc.r.Read(p) 31 } 32 33 // NewReader returns a new LZMA2 io.ReadCloser. 34 func NewReader(p []byte, _ uint64, readers []io.ReadCloser) (io.ReadCloser, error) { 35 if len(readers) != 1 { 36 return nil, errors.New("lzma2: need exactly one reader") 37 } 38 39 if len(p) != 1 { 40 return nil, errors.New("lzma2: not enough properties") 41 } 42 43 config := lzma.Reader2Config{ 44 DictCap: (2 | (int(p[0]) & 1)) << (p[0]/2 + 11), // This gem came from Lzma2Dec.c 45 } 46 47 if err := config.Verify(); err != nil { 48 return nil, err 49 } 50 51 lr, err := config.NewReader2(readers[0]) 52 if err != nil { 53 return nil, err 54 } 55 56 return &readCloser{ 57 c: readers[0], 58 r: lr, 59 }, nil 60 }