NewReader returns a new BCJ2 io.ReadCloser.
(_ []byte, _ uint64, readers []io.ReadCloser)
| 62 | |
| 63 | // NewReader returns a new BCJ2 io.ReadCloser. |
| 64 | func NewReader(_ []byte, _ uint64, readers []io.ReadCloser) (io.ReadCloser, error) { |
| 65 | if len(readers) != 4 { |
| 66 | return nil, errNeedFourReaders |
| 67 | } |
| 68 | |
| 69 | rc := &readCloser{ |
| 70 | main: util.ByteReadCloser(readers[0]), |
| 71 | call: readers[1], |
| 72 | jump: readers[2], |
| 73 | rd: util.ByteReadCloser(readers[3]), |
| 74 | nrange: 0xffffffff, |
| 75 | buf: new(bytes.Buffer), |
| 76 | } |
| 77 | rc.buf.Grow(1 << 16) |
| 78 | |
| 79 | b := make([]byte, 5) |
| 80 | if _, err := io.ReadFull(rc.rd, b); err != nil { |
| 81 | if !errors.Is(err, io.EOF) { |
| 82 | err = fmt.Errorf("bcj2: error reading initial state: %w", err) |
| 83 | } |
| 84 | |
| 85 | return nil, err |
| 86 | } |
| 87 | |
| 88 | for _, x := range b { |
| 89 | rc.code = (rc.code << 8) | uint(x) |
| 90 | } |
| 91 | |
| 92 | for i := range rc.sd { |
| 93 | rc.sd[i] = bitModelTotal >> 1 |
| 94 | } |
| 95 | |
| 96 | return rc, nil |
| 97 | } |
| 98 | |
| 99 | func (rc *readCloser) Close() error { |
| 100 | if rc.main == nil || rc.call == nil || rc.jump == nil || rc.rd == nil { |
nothing calls this directly
no test coverage detected
searching dependent graphs…