10
"github.com/klauspost/compress/huff0"
17
llDec, ofDec, mlDec sequenceDec
23
var dictMagic = [4]byte{0x37, 0xa4, 0x30, 0xec}
26
func (d *dict) ID() uint32 {
34
func (d *dict) DictContentSize() int {
43
func loadDict(b []byte) (*dict, error) {
45
if len(b) <= 8+(3*4) {
46
return nil, io.ErrUnexpectedEOF
49
llDec: sequenceDec{fse: &fseDecoder{}},
50
ofDec: sequenceDec{fse: &fseDecoder{}},
51
mlDec: sequenceDec{fse: &fseDecoder{}},
53
if !bytes.Equal(b[:4], dictMagic[:]) {
54
return nil, ErrMagicMismatch
56
d.id = binary.LittleEndian.Uint32(b[4:8])
58
return nil, errors.New("dictionaries cannot have ID 0")
63
d.litEnc, b, err = huff0.ReadTable(b[8:], nil)
67
d.litEnc.Reuse = huff0.ReusePolicyMust
73
readDec := func(i tableIndex, dec *fseDecoder) error {
74
if err := dec.readNCount(&br, uint16(maxTableSymbol[i])); err != nil {
78
return io.ErrUnexpectedEOF
80
err = dec.transform(symbolTableX[i])
82
println("Transform table error:", err)
85
if debugDecoder || debugEncoder {
86
println("Read table ok", "symbolLen:", dec.symbolLen)
93
if err := readDec(tableOffsets, d.ofDec.fse); err != nil {
96
if err := readDec(tableMatchLengths, d.mlDec.fse); err != nil {
99
if err := readDec(tableLiteralLengths, d.llDec.fse); err != nil {
102
if br.remain() < 12 {
103
return nil, io.ErrUnexpectedEOF
106
d.offsets[0] = int(br.Uint32())
108
d.offsets[1] = int(br.Uint32())
110
d.offsets[2] = int(br.Uint32())
112
if d.offsets[0] <= 0 || d.offsets[1] <= 0 || d.offsets[2] <= 0 {
113
return nil, errors.New("invalid offset in dictionary")
115
d.content = make([]byte, br.remain())
116
copy(d.content, br.unread())
117
if d.offsets[0] > len(d.content) || d.offsets[1] > len(d.content) || d.offsets[2] > len(d.content) {
118
return nil, fmt.Errorf("initial offset bigger than dictionary content size %d, offsets: %v", len(d.content), d.offsets)