MCPcopy
hub / github.com/klauspost/compress / decodeSync

Method decodeSync

zstd/seqdec.go:221–434  ·  view source on GitHub ↗

decode sequences from the stream with the provided history.

(hist []byte)

Source from the content-addressed store, hash-verified

219
220// decode sequences from the stream with the provided history.
221func (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 {

Callers 3

decodeCompressedMethod · 0.80
Test_seqdec_decodeSyncFunction · 0.80

Calls 14

decodeSyncSimpleMethod · 0.95
nextMethod · 0.95
printlnFunction · 0.85
printfFunction · 0.85
newStateMethod · 0.80
get32BitsFastMethod · 0.80
remainMethod · 0.45
overreadMethod · 0.45
finalMethod · 0.45
fillFastMethod · 0.45
getBitsMethod · 0.45
fillMethod · 0.45

Tested by 2

Test_seqdec_decodeSyncFunction · 0.64