func (zr *Reader) decodePrefix(numSyms int) (syms []uint16) { numSyms += 2 // Remove 0 symbol, add RUNA, RUNB, and EOF symbols if numSyms < 3 { panic(ErrCorrupt) // Not possible to encode EOF marker } // Read information about the trees and tree selectors. var mtf internal.MoveToFront numTrees := int(zr.rd.ReadBitsBE64(3)) if numTrees < minNumTrees || numTrees > maxNumTrees { panic(ErrCorrupt) } numSels := int(zr.rd.ReadBitsBE64(15)) treeSels := make([]uint8, numSels) for i := range treeSels { sym, ok := zr.rd.TryReadSymbol(&decSel) if !ok { sym = zr.rd.ReadSymbol(&decSel) } if int(sym) >= numTrees { panic(ErrCorrupt) } treeSels[i] = uint8(sym) } mtf.Decode(treeSels) // Initialize prefix codes. var codes2D [maxNumTrees][maxNumSyms]prefix.PrefixCode var codes1D [maxNumTrees]prefix.PrefixCodes var trees1D [maxNumTrees]prefix.Decoder for i := range codes2D[:numTrees] { pc := codes2D[i][:numSyms] for j := range pc { pc[j].Sym = uint32(j) } codes1D[i] = pc } zr.rd.ReadPrefixCodes(codes1D[:numTrees], trees1D[:numTrees]) // Read prefix encoded symbols of compressed data. var tree *prefix.Decoder var blkLen, selIdx int for { if blkLen == 0 { blkLen = numBlockSyms if selIdx >= len(treeSels) { panic(ErrCorrupt) } tree = &trees1D[treeSels[selIdx]] selIdx++ } blkLen-- sym, ok := zr.rd.TryReadSymbol(tree) if !ok { sym = zr.rd.ReadSymbol(tree) } if int(sym) == numSyms-1 { break // EOF marker } if int(sym) >= numSyms { panic(ErrCorrupt) // Invalid symbol used } if len(syms) >= zr.level*blockSize { panic(ErrCorrupt) // Block is too large } syms = append(syms, uint16(sym)) } return syms }