decode sequences from the stream with the provided history.
(hist []byte)
| 219 | |
| 220 | // decode sequences from the stream with the provided history. |
| 221 | func (s *sequenceDecs) decodeSync(hist []byte) error { |
| 222 | supported, err := s.decodeSyncSimple(hist) |
| 223 | if supported { |
| 224 | return err |
| 225 | } |
| 226 | |
| 227 | br := s.br |
| 228 | seqs := s.nSeqs |
| 229 | startSize := len(s.out) |
| 230 | // Grab full sizes tables, to avoid bounds checks. |
| 231 | llTable, mlTable, ofTable := s.litLengths.fse.dt[:maxTablesize], s.matchLengths.fse.dt[:maxTablesize], s.offsets.fse.dt[:maxTablesize] |
| 232 | llState, mlState, ofState := s.litLengths.state.state, s.matchLengths.state.state, s.offsets.state.state |
| 233 | out := s.out |
| 234 | maxBlockSize := min(s.windowSize, maxCompressedBlockSize) |
| 235 | |
| 236 | if debugDecoder { |
| 237 | println("decodeSync: decoding", seqs, "sequences", br.remain(), "bits remain on stream") |
| 238 | } |
| 239 | for i := seqs - 1; i >= 0; i-- { |
| 240 | if br.overread() { |
| 241 | printf("reading sequence %d, exceeded available data. Overread by %d\n", seqs-i, -br.remain()) |
| 242 | return io.ErrUnexpectedEOF |
| 243 | } |
| 244 | var ll, mo, ml int |
| 245 | if br.cursor > 4+((maxOffsetBits+16+16)>>3) { |
| 246 | // inlined function: |
| 247 | // ll, mo, ml = s.nextFast(br, llState, mlState, ofState) |
| 248 | |
| 249 | // Final will not read from stream. |
| 250 | var llB, mlB, moB uint8 |
| 251 | ll, llB = llState.final() |
| 252 | ml, mlB = mlState.final() |
| 253 | mo, moB = ofState.final() |
| 254 | |
| 255 | // extra bits are stored in reverse order. |
| 256 | br.fillFast() |
| 257 | mo += br.getBits(moB) |
| 258 | if s.maxBits > 32 { |
| 259 | br.fillFast() |
| 260 | } |
| 261 | ml += br.getBits(mlB) |
| 262 | ll += br.getBits(llB) |
| 263 | |
| 264 | if moB > 1 { |
| 265 | s.prevOffset[2] = s.prevOffset[1] |
| 266 | s.prevOffset[1] = s.prevOffset[0] |
| 267 | s.prevOffset[0] = mo |
| 268 | } else { |
| 269 | // mo = s.adjustOffset(mo, ll, moB) |
| 270 | // Inlined for rather big speedup |
| 271 | if ll == 0 { |
| 272 | // There is an exception though, when current sequence's literals_length = 0. |
| 273 | // In this case, repeated offsets are shifted by one, so an offset_value of 1 means Repeated_Offset2, |
| 274 | // an offset_value of 2 means Repeated_Offset3, and an offset_value of 3 means Repeated_Offset1 - 1_byte. |
| 275 | mo++ |
| 276 | } |
| 277 | |
| 278 | if mo == 0 { |