Load a dictionary as described in https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#dictionary-format
(b []byte)
| 69 | // Load a dictionary as described in |
| 70 | // https://github.com/facebook/zstd/blob/master/doc/zstd_compression_format.md#dictionary-format |
| 71 | func loadDict(b []byte) (*dict, error) { |
| 72 | // Check static field size. |
| 73 | if len(b) <= 8+(3*4) { |
| 74 | return nil, io.ErrUnexpectedEOF |
| 75 | } |
| 76 | d := dict{ |
| 77 | llDec: sequenceDec{fse: &fseDecoder{}}, |
| 78 | ofDec: sequenceDec{fse: &fseDecoder{}}, |
| 79 | mlDec: sequenceDec{fse: &fseDecoder{}}, |
| 80 | } |
| 81 | if string(b[:4]) != dictMagic { |
| 82 | return nil, ErrMagicMismatch |
| 83 | } |
| 84 | d.id = binary.LittleEndian.Uint32(b[4:8]) |
| 85 | if d.id == 0 { |
| 86 | return nil, errors.New("dictionaries cannot have ID 0") |
| 87 | } |
| 88 | |
| 89 | // Read literal table |
| 90 | var err error |
| 91 | d.litEnc, b, err = huff0.ReadTable(b[8:], nil) |
| 92 | if err != nil { |
| 93 | return nil, fmt.Errorf("loading literal table: %w", err) |
| 94 | } |
| 95 | d.litEnc.Reuse = huff0.ReusePolicyMust |
| 96 | |
| 97 | br := byteReader{ |
| 98 | b: b, |
| 99 | off: 0, |
| 100 | } |
| 101 | readDec := func(i tableIndex, dec *fseDecoder) error { |
| 102 | if err := dec.readNCount(&br, uint16(maxTableSymbol[i])); err != nil { |
| 103 | return err |
| 104 | } |
| 105 | if br.overread() { |
| 106 | return io.ErrUnexpectedEOF |
| 107 | } |
| 108 | err = dec.transform(symbolTableX[i]) |
| 109 | if err != nil { |
| 110 | println("Transform table error:", err) |
| 111 | return err |
| 112 | } |
| 113 | if debugDecoder || debugEncoder { |
| 114 | println("Read table ok", "symbolLen:", dec.symbolLen) |
| 115 | } |
| 116 | // Set decoders as predefined so they aren't reused. |
| 117 | dec.preDefined = true |
| 118 | return nil |
| 119 | } |
| 120 | |
| 121 | if err := readDec(tableOffsets, d.ofDec.fse); err != nil { |
| 122 | return nil, err |
| 123 | } |
| 124 | if err := readDec(tableMatchLengths, d.mlDec.fse); err != nil { |
| 125 | return nil, err |
| 126 | } |
| 127 | if err := readDec(tableLiteralLengths, d.llDec.fse); err != nil { |
| 128 | return nil, err |
no test coverage detected
searching dependent graphs…