@@ -98,150 +98,6 @@ func (s *sequenceDecs) initialize(br *bitReader, hist *history, out []byte) erro
98
98
return nil
99
99
}
100
100
101
- // decode sequences from the stream with the provided history.
102
- func (s * sequenceDecs ) decode (seqs []seqVals ) error {
103
- br := s .br
104
-
105
- // Grab full sizes tables, to avoid bounds checks.
106
- llTable , mlTable , ofTable := s .litLengths .fse .dt [:maxTablesize ], s .matchLengths .fse .dt [:maxTablesize ], s .offsets .fse .dt [:maxTablesize ]
107
- llState , mlState , ofState := s .litLengths .state .state , s .matchLengths .state .state , s .offsets .state .state
108
- s .seqSize = 0
109
- litRemain := len (s .literals )
110
- maxBlockSize := maxCompressedBlockSize
111
- if s .windowSize < maxBlockSize {
112
- maxBlockSize = s .windowSize
113
- }
114
- for i := range seqs {
115
- var ll , mo , ml int
116
- if br .off > 4 + ((maxOffsetBits + 16 + 16 )>> 3 ) {
117
- // inlined function:
118
- // ll, mo, ml = s.nextFast(br, llState, mlState, ofState)
119
-
120
- // Final will not read from stream.
121
- var llB , mlB , moB uint8
122
- ll , llB = llState .final ()
123
- ml , mlB = mlState .final ()
124
- mo , moB = ofState .final ()
125
-
126
- // extra bits are stored in reverse order.
127
- br .fillFast ()
128
- mo += br .getBits (moB )
129
- if s .maxBits > 32 {
130
- br .fillFast ()
131
- }
132
- ml += br .getBits (mlB )
133
- ll += br .getBits (llB )
134
-
135
- if moB > 1 {
136
- s .prevOffset [2 ] = s .prevOffset [1 ]
137
- s .prevOffset [1 ] = s .prevOffset [0 ]
138
- s .prevOffset [0 ] = mo
139
- } else {
140
- // mo = s.adjustOffset(mo, ll, moB)
141
- // Inlined for rather big speedup
142
- if ll == 0 {
143
- // There is an exception though, when current sequence's literals_length = 0.
144
- // In this case, repeated offsets are shifted by one, so an offset_value of 1 means Repeated_Offset2,
145
- // an offset_value of 2 means Repeated_Offset3, and an offset_value of 3 means Repeated_Offset1 - 1_byte.
146
- mo ++
147
- }
148
-
149
- if mo == 0 {
150
- mo = s .prevOffset [0 ]
151
- } else {
152
- var temp int
153
- if mo == 3 {
154
- temp = s .prevOffset [0 ] - 1
155
- } else {
156
- temp = s .prevOffset [mo ]
157
- }
158
-
159
- if temp == 0 {
160
- // 0 is not valid; input is corrupted; force offset to 1
161
- println ("WARNING: temp was 0" )
162
- temp = 1
163
- }
164
-
165
- if mo != 1 {
166
- s .prevOffset [2 ] = s .prevOffset [1 ]
167
- }
168
- s .prevOffset [1 ] = s .prevOffset [0 ]
169
- s .prevOffset [0 ] = temp
170
- mo = temp
171
- }
172
- }
173
- br .fillFast ()
174
- } else {
175
- if br .overread () {
176
- if debugDecoder {
177
- printf ("reading sequence %d, exceeded available data\n " , i )
178
- }
179
- return io .ErrUnexpectedEOF
180
- }
181
- ll , mo , ml = s .next (br , llState , mlState , ofState )
182
- br .fill ()
183
- }
184
-
185
- if debugSequences {
186
- println ("Seq" , i , "Litlen:" , ll , "mo:" , mo , "(abs) ml:" , ml )
187
- }
188
- // Evaluate.
189
- // We might be doing this async, so do it early.
190
- if mo == 0 && ml > 0 {
191
- return fmt .Errorf ("zero matchoff and matchlen (%d) > 0" , ml )
192
- }
193
- if ml > maxMatchLen {
194
- return fmt .Errorf ("match len (%d) bigger than max allowed length" , ml )
195
- }
196
- s .seqSize += ll + ml
197
- if s .seqSize > maxBlockSize {
198
- return fmt .Errorf ("output (%d) bigger than max block size (%d)" , s .seqSize , maxBlockSize )
199
- }
200
- litRemain -= ll
201
- if litRemain < 0 {
202
- return fmt .Errorf ("unexpected literal count, want %d bytes, but only %d is available" , ll , litRemain + ll )
203
- }
204
- seqs [i ] = seqVals {
205
- ll : ll ,
206
- ml : ml ,
207
- mo : mo ,
208
- }
209
- if i == len (seqs )- 1 {
210
- // This is the last sequence, so we shouldn't update state.
211
- break
212
- }
213
-
214
- // Manually inlined, ~ 5-20% faster
215
- // Update all 3 states at once. Approx 20% faster.
216
- nBits := llState .nbBits () + mlState .nbBits () + ofState .nbBits ()
217
- if nBits == 0 {
218
- llState = llTable [llState .newState ()& maxTableMask ]
219
- mlState = mlTable [mlState .newState ()& maxTableMask ]
220
- ofState = ofTable [ofState .newState ()& maxTableMask ]
221
- } else {
222
- bits := br .get32BitsFast (nBits )
223
- lowBits := uint16 (bits >> ((ofState .nbBits () + mlState .nbBits ()) & 31 ))
224
- llState = llTable [(llState .newState ()+ lowBits )& maxTableMask ]
225
-
226
- lowBits = uint16 (bits >> (ofState .nbBits () & 31 ))
227
- lowBits &= bitMask [mlState .nbBits ()& 15 ]
228
- mlState = mlTable [(mlState .newState ()+ lowBits )& maxTableMask ]
229
-
230
- lowBits = uint16 (bits ) & bitMask [ofState .nbBits ()& 15 ]
231
- ofState = ofTable [(ofState .newState ()+ lowBits )& maxTableMask ]
232
- }
233
- }
234
- s .seqSize += litRemain
235
- if s .seqSize > maxBlockSize {
236
- return fmt .Errorf ("output (%d) bigger than max block size (%d)" , s .seqSize , maxBlockSize )
237
- }
238
- err := br .close ()
239
- if err != nil {
240
- printf ("Closing sequences: %v, %+v\n " , err , * br )
241
- }
242
- return err
243
- }
244
-
245
101
// execute will execute the decoded sequence with the provided history.
246
102
// The sequence must be evaluated before being sent.
247
103
func (s * sequenceDecs ) execute (seqs []seqVals , hist []byte ) error {
0 commit comments