source: code/trunk/vendor/github.com/klauspost/compress/flate/inflate_gen.go@ 145

Last change on this file since 145 was 145, checked in by Izuru Yakumo, 22 months ago

Updated the Makefile and vendored depedencies

Signed-off-by: Izuru Yakumo <yakumo.izuru@…>

File size: 31.8 KB
Line 
1// Code generated by go generate gen_inflate.go. DO NOT EDIT.
2
3package flate
4
5import (
6 "bufio"
7 "bytes"
8 "fmt"
9 "math/bits"
10 "strings"
11)
12
13// Decode a single Huffman block from f.
14// hl and hd are the Huffman states for the lit/length values
15// and the distance values, respectively. If hd == nil, using the
16// fixed distance encoding associated with fixed Huffman blocks.
17func (f *decompressor) huffmanBytesBuffer() {
18 const (
19 stateInit = iota // Zero value must be stateInit
20 stateDict
21 )
22 fr := f.r.(*bytes.Buffer)
23
24 // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers,
25 // but is smart enough to keep local variables in registers, so use nb and b,
26 // inline call to moreBits and reassign b,nb back to f on return.
27 fnb, fb := f.nb, f.b
28
29 switch f.stepState {
30 case stateInit:
31 goto readLiteral
32 case stateDict:
33 goto copyHistory
34 }
35
36readLiteral:
37 // Read literal and/or (length, distance) according to RFC section 3.2.3.
38 {
39 var v int
40 {
41 // Inlined v, err := f.huffSym(f.hl)
42 // Since a huffmanDecoder can be empty or be composed of a degenerate tree
43 // with single element, huffSym must error on these two edge cases. In both
44 // cases, the chunks slice will be 0 for the invalid sequence, leading it
45 // satisfy the n == 0 check below.
46 n := uint(f.hl.maxRead)
47 for {
48 for fnb < n {
49 c, err := fr.ReadByte()
50 if err != nil {
51 f.b, f.nb = fb, fnb
52 f.err = noEOF(err)
53 return
54 }
55 f.roffset++
56 fb |= uint32(c) << (fnb & regSizeMaskUint32)
57 fnb += 8
58 }
59 chunk := f.hl.chunks[fb&(huffmanNumChunks-1)]
60 n = uint(chunk & huffmanCountMask)
61 if n > huffmanChunkBits {
62 chunk = f.hl.links[chunk>>huffmanValueShift][(fb>>huffmanChunkBits)&f.hl.linkMask]
63 n = uint(chunk & huffmanCountMask)
64 }
65 if n <= fnb {
66 if n == 0 {
67 f.b, f.nb = fb, fnb
68 if debugDecode {
69 fmt.Println("huffsym: n==0")
70 }
71 f.err = CorruptInputError(f.roffset)
72 return
73 }
74 fb = fb >> (n & regSizeMaskUint32)
75 fnb = fnb - n
76 v = int(chunk >> huffmanValueShift)
77 break
78 }
79 }
80 }
81
82 var length int
83 switch {
84 case v < 256:
85 f.dict.writeByte(byte(v))
86 if f.dict.availWrite() == 0 {
87 f.toRead = f.dict.readFlush()
88 f.step = (*decompressor).huffmanBytesBuffer
89 f.stepState = stateInit
90 f.b, f.nb = fb, fnb
91 return
92 }
93 goto readLiteral
94 case v == 256:
95 f.b, f.nb = fb, fnb
96 f.finishBlock()
97 return
98 // otherwise, reference to older data
99 case v < 265:
100 length = v - (257 - 3)
101 case v < maxNumLit:
102 val := decCodeToLen[(v - 257)]
103 length = int(val.length) + 3
104 n := uint(val.extra)
105 for fnb < n {
106 c, err := fr.ReadByte()
107 if err != nil {
108 f.b, f.nb = fb, fnb
109 if debugDecode {
110 fmt.Println("morebits n>0:", err)
111 }
112 f.err = err
113 return
114 }
115 f.roffset++
116 fb |= uint32(c) << (fnb & regSizeMaskUint32)
117 fnb += 8
118 }
119 length += int(fb & bitMask32[n])
120 fb >>= n & regSizeMaskUint32
121 fnb -= n
122 default:
123 if debugDecode {
124 fmt.Println(v, ">= maxNumLit")
125 }
126 f.err = CorruptInputError(f.roffset)
127 f.b, f.nb = fb, fnb
128 return
129 }
130
131 var dist uint32
132 if f.hd == nil {
133 for fnb < 5 {
134 c, err := fr.ReadByte()
135 if err != nil {
136 f.b, f.nb = fb, fnb
137 if debugDecode {
138 fmt.Println("morebits f.nb<5:", err)
139 }
140 f.err = err
141 return
142 }
143 f.roffset++
144 fb |= uint32(c) << (fnb & regSizeMaskUint32)
145 fnb += 8
146 }
147 dist = uint32(bits.Reverse8(uint8(fb & 0x1F << 3)))
148 fb >>= 5
149 fnb -= 5
150 } else {
151 // Since a huffmanDecoder can be empty or be composed of a degenerate tree
152 // with single element, huffSym must error on these two edge cases. In both
153 // cases, the chunks slice will be 0 for the invalid sequence, leading it
154 // satisfy the n == 0 check below.
155 n := uint(f.hd.maxRead)
156 // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers,
157 // but is smart enough to keep local variables in registers, so use nb and b,
158 // inline call to moreBits and reassign b,nb back to f on return.
159 for {
160 for fnb < n {
161 c, err := fr.ReadByte()
162 if err != nil {
163 f.b, f.nb = fb, fnb
164 f.err = noEOF(err)
165 return
166 }
167 f.roffset++
168 fb |= uint32(c) << (fnb & regSizeMaskUint32)
169 fnb += 8
170 }
171 chunk := f.hd.chunks[fb&(huffmanNumChunks-1)]
172 n = uint(chunk & huffmanCountMask)
173 if n > huffmanChunkBits {
174 chunk = f.hd.links[chunk>>huffmanValueShift][(fb>>huffmanChunkBits)&f.hd.linkMask]
175 n = uint(chunk & huffmanCountMask)
176 }
177 if n <= fnb {
178 if n == 0 {
179 f.b, f.nb = fb, fnb
180 if debugDecode {
181 fmt.Println("huffsym: n==0")
182 }
183 f.err = CorruptInputError(f.roffset)
184 return
185 }
186 fb = fb >> (n & regSizeMaskUint32)
187 fnb = fnb - n
188 dist = uint32(chunk >> huffmanValueShift)
189 break
190 }
191 }
192 }
193
194 switch {
195 case dist < 4:
196 dist++
197 case dist < maxNumDist:
198 nb := uint(dist-2) >> 1
199 // have 1 bit in bottom of dist, need nb more.
200 extra := (dist & 1) << (nb & regSizeMaskUint32)
201 for fnb < nb {
202 c, err := fr.ReadByte()
203 if err != nil {
204 f.b, f.nb = fb, fnb
205 if debugDecode {
206 fmt.Println("morebits f.nb<nb:", err)
207 }
208 f.err = err
209 return
210 }
211 f.roffset++
212 fb |= uint32(c) << (fnb & regSizeMaskUint32)
213 fnb += 8
214 }
215 extra |= fb & bitMask32[nb]
216 fb >>= nb & regSizeMaskUint32
217 fnb -= nb
218 dist = 1<<((nb+1)&regSizeMaskUint32) + 1 + extra
219 // slower: dist = bitMask32[nb+1] + 2 + extra
220 default:
221 f.b, f.nb = fb, fnb
222 if debugDecode {
223 fmt.Println("dist too big:", dist, maxNumDist)
224 }
225 f.err = CorruptInputError(f.roffset)
226 return
227 }
228
229 // No check on length; encoding can be prescient.
230 if dist > uint32(f.dict.histSize()) {
231 f.b, f.nb = fb, fnb
232 if debugDecode {
233 fmt.Println("dist > f.dict.histSize():", dist, f.dict.histSize())
234 }
235 f.err = CorruptInputError(f.roffset)
236 return
237 }
238
239 f.copyLen, f.copyDist = length, int(dist)
240 goto copyHistory
241 }
242
243copyHistory:
244 // Perform a backwards copy according to RFC section 3.2.3.
245 {
246 cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen)
247 if cnt == 0 {
248 cnt = f.dict.writeCopy(f.copyDist, f.copyLen)
249 }
250 f.copyLen -= cnt
251
252 if f.dict.availWrite() == 0 || f.copyLen > 0 {
253 f.toRead = f.dict.readFlush()
254 f.step = (*decompressor).huffmanBytesBuffer // We need to continue this work
255 f.stepState = stateDict
256 f.b, f.nb = fb, fnb
257 return
258 }
259 goto readLiteral
260 }
261 // Not reached
262}
263
264// Decode a single Huffman block from f.
265// hl and hd are the Huffman states for the lit/length values
266// and the distance values, respectively. If hd == nil, using the
267// fixed distance encoding associated with fixed Huffman blocks.
268func (f *decompressor) huffmanBytesReader() {
269 const (
270 stateInit = iota // Zero value must be stateInit
271 stateDict
272 )
273 fr := f.r.(*bytes.Reader)
274
275 // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers,
276 // but is smart enough to keep local variables in registers, so use nb and b,
277 // inline call to moreBits and reassign b,nb back to f on return.
278 fnb, fb := f.nb, f.b
279
280 switch f.stepState {
281 case stateInit:
282 goto readLiteral
283 case stateDict:
284 goto copyHistory
285 }
286
287readLiteral:
288 // Read literal and/or (length, distance) according to RFC section 3.2.3.
289 {
290 var v int
291 {
292 // Inlined v, err := f.huffSym(f.hl)
293 // Since a huffmanDecoder can be empty or be composed of a degenerate tree
294 // with single element, huffSym must error on these two edge cases. In both
295 // cases, the chunks slice will be 0 for the invalid sequence, leading it
296 // satisfy the n == 0 check below.
297 n := uint(f.hl.maxRead)
298 for {
299 for fnb < n {
300 c, err := fr.ReadByte()
301 if err != nil {
302 f.b, f.nb = fb, fnb
303 f.err = noEOF(err)
304 return
305 }
306 f.roffset++
307 fb |= uint32(c) << (fnb & regSizeMaskUint32)
308 fnb += 8
309 }
310 chunk := f.hl.chunks[fb&(huffmanNumChunks-1)]
311 n = uint(chunk & huffmanCountMask)
312 if n > huffmanChunkBits {
313 chunk = f.hl.links[chunk>>huffmanValueShift][(fb>>huffmanChunkBits)&f.hl.linkMask]
314 n = uint(chunk & huffmanCountMask)
315 }
316 if n <= fnb {
317 if n == 0 {
318 f.b, f.nb = fb, fnb
319 if debugDecode {
320 fmt.Println("huffsym: n==0")
321 }
322 f.err = CorruptInputError(f.roffset)
323 return
324 }
325 fb = fb >> (n & regSizeMaskUint32)
326 fnb = fnb - n
327 v = int(chunk >> huffmanValueShift)
328 break
329 }
330 }
331 }
332
333 var length int
334 switch {
335 case v < 256:
336 f.dict.writeByte(byte(v))
337 if f.dict.availWrite() == 0 {
338 f.toRead = f.dict.readFlush()
339 f.step = (*decompressor).huffmanBytesReader
340 f.stepState = stateInit
341 f.b, f.nb = fb, fnb
342 return
343 }
344 goto readLiteral
345 case v == 256:
346 f.b, f.nb = fb, fnb
347 f.finishBlock()
348 return
349 // otherwise, reference to older data
350 case v < 265:
351 length = v - (257 - 3)
352 case v < maxNumLit:
353 val := decCodeToLen[(v - 257)]
354 length = int(val.length) + 3
355 n := uint(val.extra)
356 for fnb < n {
357 c, err := fr.ReadByte()
358 if err != nil {
359 f.b, f.nb = fb, fnb
360 if debugDecode {
361 fmt.Println("morebits n>0:", err)
362 }
363 f.err = err
364 return
365 }
366 f.roffset++
367 fb |= uint32(c) << (fnb & regSizeMaskUint32)
368 fnb += 8
369 }
370 length += int(fb & bitMask32[n])
371 fb >>= n & regSizeMaskUint32
372 fnb -= n
373 default:
374 if debugDecode {
375 fmt.Println(v, ">= maxNumLit")
376 }
377 f.err = CorruptInputError(f.roffset)
378 f.b, f.nb = fb, fnb
379 return
380 }
381
382 var dist uint32
383 if f.hd == nil {
384 for fnb < 5 {
385 c, err := fr.ReadByte()
386 if err != nil {
387 f.b, f.nb = fb, fnb
388 if debugDecode {
389 fmt.Println("morebits f.nb<5:", err)
390 }
391 f.err = err
392 return
393 }
394 f.roffset++
395 fb |= uint32(c) << (fnb & regSizeMaskUint32)
396 fnb += 8
397 }
398 dist = uint32(bits.Reverse8(uint8(fb & 0x1F << 3)))
399 fb >>= 5
400 fnb -= 5
401 } else {
402 // Since a huffmanDecoder can be empty or be composed of a degenerate tree
403 // with single element, huffSym must error on these two edge cases. In both
404 // cases, the chunks slice will be 0 for the invalid sequence, leading it
405 // satisfy the n == 0 check below.
406 n := uint(f.hd.maxRead)
407 // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers,
408 // but is smart enough to keep local variables in registers, so use nb and b,
409 // inline call to moreBits and reassign b,nb back to f on return.
410 for {
411 for fnb < n {
412 c, err := fr.ReadByte()
413 if err != nil {
414 f.b, f.nb = fb, fnb
415 f.err = noEOF(err)
416 return
417 }
418 f.roffset++
419 fb |= uint32(c) << (fnb & regSizeMaskUint32)
420 fnb += 8
421 }
422 chunk := f.hd.chunks[fb&(huffmanNumChunks-1)]
423 n = uint(chunk & huffmanCountMask)
424 if n > huffmanChunkBits {
425 chunk = f.hd.links[chunk>>huffmanValueShift][(fb>>huffmanChunkBits)&f.hd.linkMask]
426 n = uint(chunk & huffmanCountMask)
427 }
428 if n <= fnb {
429 if n == 0 {
430 f.b, f.nb = fb, fnb
431 if debugDecode {
432 fmt.Println("huffsym: n==0")
433 }
434 f.err = CorruptInputError(f.roffset)
435 return
436 }
437 fb = fb >> (n & regSizeMaskUint32)
438 fnb = fnb - n
439 dist = uint32(chunk >> huffmanValueShift)
440 break
441 }
442 }
443 }
444
445 switch {
446 case dist < 4:
447 dist++
448 case dist < maxNumDist:
449 nb := uint(dist-2) >> 1
450 // have 1 bit in bottom of dist, need nb more.
451 extra := (dist & 1) << (nb & regSizeMaskUint32)
452 for fnb < nb {
453 c, err := fr.ReadByte()
454 if err != nil {
455 f.b, f.nb = fb, fnb
456 if debugDecode {
457 fmt.Println("morebits f.nb<nb:", err)
458 }
459 f.err = err
460 return
461 }
462 f.roffset++
463 fb |= uint32(c) << (fnb & regSizeMaskUint32)
464 fnb += 8
465 }
466 extra |= fb & bitMask32[nb]
467 fb >>= nb & regSizeMaskUint32
468 fnb -= nb
469 dist = 1<<((nb+1)&regSizeMaskUint32) + 1 + extra
470 // slower: dist = bitMask32[nb+1] + 2 + extra
471 default:
472 f.b, f.nb = fb, fnb
473 if debugDecode {
474 fmt.Println("dist too big:", dist, maxNumDist)
475 }
476 f.err = CorruptInputError(f.roffset)
477 return
478 }
479
480 // No check on length; encoding can be prescient.
481 if dist > uint32(f.dict.histSize()) {
482 f.b, f.nb = fb, fnb
483 if debugDecode {
484 fmt.Println("dist > f.dict.histSize():", dist, f.dict.histSize())
485 }
486 f.err = CorruptInputError(f.roffset)
487 return
488 }
489
490 f.copyLen, f.copyDist = length, int(dist)
491 goto copyHistory
492 }
493
494copyHistory:
495 // Perform a backwards copy according to RFC section 3.2.3.
496 {
497 cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen)
498 if cnt == 0 {
499 cnt = f.dict.writeCopy(f.copyDist, f.copyLen)
500 }
501 f.copyLen -= cnt
502
503 if f.dict.availWrite() == 0 || f.copyLen > 0 {
504 f.toRead = f.dict.readFlush()
505 f.step = (*decompressor).huffmanBytesReader // We need to continue this work
506 f.stepState = stateDict
507 f.b, f.nb = fb, fnb
508 return
509 }
510 goto readLiteral
511 }
512 // Not reached
513}
514
515// Decode a single Huffman block from f.
516// hl and hd are the Huffman states for the lit/length values
517// and the distance values, respectively. If hd == nil, using the
518// fixed distance encoding associated with fixed Huffman blocks.
519func (f *decompressor) huffmanBufioReader() {
520 const (
521 stateInit = iota // Zero value must be stateInit
522 stateDict
523 )
524 fr := f.r.(*bufio.Reader)
525
526 // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers,
527 // but is smart enough to keep local variables in registers, so use nb and b,
528 // inline call to moreBits and reassign b,nb back to f on return.
529 fnb, fb := f.nb, f.b
530
531 switch f.stepState {
532 case stateInit:
533 goto readLiteral
534 case stateDict:
535 goto copyHistory
536 }
537
538readLiteral:
539 // Read literal and/or (length, distance) according to RFC section 3.2.3.
540 {
541 var v int
542 {
543 // Inlined v, err := f.huffSym(f.hl)
544 // Since a huffmanDecoder can be empty or be composed of a degenerate tree
545 // with single element, huffSym must error on these two edge cases. In both
546 // cases, the chunks slice will be 0 for the invalid sequence, leading it
547 // satisfy the n == 0 check below.
548 n := uint(f.hl.maxRead)
549 for {
550 for fnb < n {
551 c, err := fr.ReadByte()
552 if err != nil {
553 f.b, f.nb = fb, fnb
554 f.err = noEOF(err)
555 return
556 }
557 f.roffset++
558 fb |= uint32(c) << (fnb & regSizeMaskUint32)
559 fnb += 8
560 }
561 chunk := f.hl.chunks[fb&(huffmanNumChunks-1)]
562 n = uint(chunk & huffmanCountMask)
563 if n > huffmanChunkBits {
564 chunk = f.hl.links[chunk>>huffmanValueShift][(fb>>huffmanChunkBits)&f.hl.linkMask]
565 n = uint(chunk & huffmanCountMask)
566 }
567 if n <= fnb {
568 if n == 0 {
569 f.b, f.nb = fb, fnb
570 if debugDecode {
571 fmt.Println("huffsym: n==0")
572 }
573 f.err = CorruptInputError(f.roffset)
574 return
575 }
576 fb = fb >> (n & regSizeMaskUint32)
577 fnb = fnb - n
578 v = int(chunk >> huffmanValueShift)
579 break
580 }
581 }
582 }
583
584 var length int
585 switch {
586 case v < 256:
587 f.dict.writeByte(byte(v))
588 if f.dict.availWrite() == 0 {
589 f.toRead = f.dict.readFlush()
590 f.step = (*decompressor).huffmanBufioReader
591 f.stepState = stateInit
592 f.b, f.nb = fb, fnb
593 return
594 }
595 goto readLiteral
596 case v == 256:
597 f.b, f.nb = fb, fnb
598 f.finishBlock()
599 return
600 // otherwise, reference to older data
601 case v < 265:
602 length = v - (257 - 3)
603 case v < maxNumLit:
604 val := decCodeToLen[(v - 257)]
605 length = int(val.length) + 3
606 n := uint(val.extra)
607 for fnb < n {
608 c, err := fr.ReadByte()
609 if err != nil {
610 f.b, f.nb = fb, fnb
611 if debugDecode {
612 fmt.Println("morebits n>0:", err)
613 }
614 f.err = err
615 return
616 }
617 f.roffset++
618 fb |= uint32(c) << (fnb & regSizeMaskUint32)
619 fnb += 8
620 }
621 length += int(fb & bitMask32[n])
622 fb >>= n & regSizeMaskUint32
623 fnb -= n
624 default:
625 if debugDecode {
626 fmt.Println(v, ">= maxNumLit")
627 }
628 f.err = CorruptInputError(f.roffset)
629 f.b, f.nb = fb, fnb
630 return
631 }
632
633 var dist uint32
634 if f.hd == nil {
635 for fnb < 5 {
636 c, err := fr.ReadByte()
637 if err != nil {
638 f.b, f.nb = fb, fnb
639 if debugDecode {
640 fmt.Println("morebits f.nb<5:", err)
641 }
642 f.err = err
643 return
644 }
645 f.roffset++
646 fb |= uint32(c) << (fnb & regSizeMaskUint32)
647 fnb += 8
648 }
649 dist = uint32(bits.Reverse8(uint8(fb & 0x1F << 3)))
650 fb >>= 5
651 fnb -= 5
652 } else {
653 // Since a huffmanDecoder can be empty or be composed of a degenerate tree
654 // with single element, huffSym must error on these two edge cases. In both
655 // cases, the chunks slice will be 0 for the invalid sequence, leading it
656 // satisfy the n == 0 check below.
657 n := uint(f.hd.maxRead)
658 // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers,
659 // but is smart enough to keep local variables in registers, so use nb and b,
660 // inline call to moreBits and reassign b,nb back to f on return.
661 for {
662 for fnb < n {
663 c, err := fr.ReadByte()
664 if err != nil {
665 f.b, f.nb = fb, fnb
666 f.err = noEOF(err)
667 return
668 }
669 f.roffset++
670 fb |= uint32(c) << (fnb & regSizeMaskUint32)
671 fnb += 8
672 }
673 chunk := f.hd.chunks[fb&(huffmanNumChunks-1)]
674 n = uint(chunk & huffmanCountMask)
675 if n > huffmanChunkBits {
676 chunk = f.hd.links[chunk>>huffmanValueShift][(fb>>huffmanChunkBits)&f.hd.linkMask]
677 n = uint(chunk & huffmanCountMask)
678 }
679 if n <= fnb {
680 if n == 0 {
681 f.b, f.nb = fb, fnb
682 if debugDecode {
683 fmt.Println("huffsym: n==0")
684 }
685 f.err = CorruptInputError(f.roffset)
686 return
687 }
688 fb = fb >> (n & regSizeMaskUint32)
689 fnb = fnb - n
690 dist = uint32(chunk >> huffmanValueShift)
691 break
692 }
693 }
694 }
695
696 switch {
697 case dist < 4:
698 dist++
699 case dist < maxNumDist:
700 nb := uint(dist-2) >> 1
701 // have 1 bit in bottom of dist, need nb more.
702 extra := (dist & 1) << (nb & regSizeMaskUint32)
703 for fnb < nb {
704 c, err := fr.ReadByte()
705 if err != nil {
706 f.b, f.nb = fb, fnb
707 if debugDecode {
708 fmt.Println("morebits f.nb<nb:", err)
709 }
710 f.err = err
711 return
712 }
713 f.roffset++
714 fb |= uint32(c) << (fnb & regSizeMaskUint32)
715 fnb += 8
716 }
717 extra |= fb & bitMask32[nb]
718 fb >>= nb & regSizeMaskUint32
719 fnb -= nb
720 dist = 1<<((nb+1)&regSizeMaskUint32) + 1 + extra
721 // slower: dist = bitMask32[nb+1] + 2 + extra
722 default:
723 f.b, f.nb = fb, fnb
724 if debugDecode {
725 fmt.Println("dist too big:", dist, maxNumDist)
726 }
727 f.err = CorruptInputError(f.roffset)
728 return
729 }
730
731 // No check on length; encoding can be prescient.
732 if dist > uint32(f.dict.histSize()) {
733 f.b, f.nb = fb, fnb
734 if debugDecode {
735 fmt.Println("dist > f.dict.histSize():", dist, f.dict.histSize())
736 }
737 f.err = CorruptInputError(f.roffset)
738 return
739 }
740
741 f.copyLen, f.copyDist = length, int(dist)
742 goto copyHistory
743 }
744
745copyHistory:
746 // Perform a backwards copy according to RFC section 3.2.3.
747 {
748 cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen)
749 if cnt == 0 {
750 cnt = f.dict.writeCopy(f.copyDist, f.copyLen)
751 }
752 f.copyLen -= cnt
753
754 if f.dict.availWrite() == 0 || f.copyLen > 0 {
755 f.toRead = f.dict.readFlush()
756 f.step = (*decompressor).huffmanBufioReader // We need to continue this work
757 f.stepState = stateDict
758 f.b, f.nb = fb, fnb
759 return
760 }
761 goto readLiteral
762 }
763 // Not reached
764}
765
766// Decode a single Huffman block from f.
767// hl and hd are the Huffman states for the lit/length values
768// and the distance values, respectively. If hd == nil, using the
769// fixed distance encoding associated with fixed Huffman blocks.
770func (f *decompressor) huffmanStringsReader() {
771 const (
772 stateInit = iota // Zero value must be stateInit
773 stateDict
774 )
775 fr := f.r.(*strings.Reader)
776
777 // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers,
778 // but is smart enough to keep local variables in registers, so use nb and b,
779 // inline call to moreBits and reassign b,nb back to f on return.
780 fnb, fb := f.nb, f.b
781
782 switch f.stepState {
783 case stateInit:
784 goto readLiteral
785 case stateDict:
786 goto copyHistory
787 }
788
789readLiteral:
790 // Read literal and/or (length, distance) according to RFC section 3.2.3.
791 {
792 var v int
793 {
794 // Inlined v, err := f.huffSym(f.hl)
795 // Since a huffmanDecoder can be empty or be composed of a degenerate tree
796 // with single element, huffSym must error on these two edge cases. In both
797 // cases, the chunks slice will be 0 for the invalid sequence, leading it
798 // satisfy the n == 0 check below.
799 n := uint(f.hl.maxRead)
800 for {
801 for fnb < n {
802 c, err := fr.ReadByte()
803 if err != nil {
804 f.b, f.nb = fb, fnb
805 f.err = noEOF(err)
806 return
807 }
808 f.roffset++
809 fb |= uint32(c) << (fnb & regSizeMaskUint32)
810 fnb += 8
811 }
812 chunk := f.hl.chunks[fb&(huffmanNumChunks-1)]
813 n = uint(chunk & huffmanCountMask)
814 if n > huffmanChunkBits {
815 chunk = f.hl.links[chunk>>huffmanValueShift][(fb>>huffmanChunkBits)&f.hl.linkMask]
816 n = uint(chunk & huffmanCountMask)
817 }
818 if n <= fnb {
819 if n == 0 {
820 f.b, f.nb = fb, fnb
821 if debugDecode {
822 fmt.Println("huffsym: n==0")
823 }
824 f.err = CorruptInputError(f.roffset)
825 return
826 }
827 fb = fb >> (n & regSizeMaskUint32)
828 fnb = fnb - n
829 v = int(chunk >> huffmanValueShift)
830 break
831 }
832 }
833 }
834
835 var length int
836 switch {
837 case v < 256:
838 f.dict.writeByte(byte(v))
839 if f.dict.availWrite() == 0 {
840 f.toRead = f.dict.readFlush()
841 f.step = (*decompressor).huffmanStringsReader
842 f.stepState = stateInit
843 f.b, f.nb = fb, fnb
844 return
845 }
846 goto readLiteral
847 case v == 256:
848 f.b, f.nb = fb, fnb
849 f.finishBlock()
850 return
851 // otherwise, reference to older data
852 case v < 265:
853 length = v - (257 - 3)
854 case v < maxNumLit:
855 val := decCodeToLen[(v - 257)]
856 length = int(val.length) + 3
857 n := uint(val.extra)
858 for fnb < n {
859 c, err := fr.ReadByte()
860 if err != nil {
861 f.b, f.nb = fb, fnb
862 if debugDecode {
863 fmt.Println("morebits n>0:", err)
864 }
865 f.err = err
866 return
867 }
868 f.roffset++
869 fb |= uint32(c) << (fnb & regSizeMaskUint32)
870 fnb += 8
871 }
872 length += int(fb & bitMask32[n])
873 fb >>= n & regSizeMaskUint32
874 fnb -= n
875 default:
876 if debugDecode {
877 fmt.Println(v, ">= maxNumLit")
878 }
879 f.err = CorruptInputError(f.roffset)
880 f.b, f.nb = fb, fnb
881 return
882 }
883
884 var dist uint32
885 if f.hd == nil {
886 for fnb < 5 {
887 c, err := fr.ReadByte()
888 if err != nil {
889 f.b, f.nb = fb, fnb
890 if debugDecode {
891 fmt.Println("morebits f.nb<5:", err)
892 }
893 f.err = err
894 return
895 }
896 f.roffset++
897 fb |= uint32(c) << (fnb & regSizeMaskUint32)
898 fnb += 8
899 }
900 dist = uint32(bits.Reverse8(uint8(fb & 0x1F << 3)))
901 fb >>= 5
902 fnb -= 5
903 } else {
904 // Since a huffmanDecoder can be empty or be composed of a degenerate tree
905 // with single element, huffSym must error on these two edge cases. In both
906 // cases, the chunks slice will be 0 for the invalid sequence, leading it
907 // satisfy the n == 0 check below.
908 n := uint(f.hd.maxRead)
909 // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers,
910 // but is smart enough to keep local variables in registers, so use nb and b,
911 // inline call to moreBits and reassign b,nb back to f on return.
912 for {
913 for fnb < n {
914 c, err := fr.ReadByte()
915 if err != nil {
916 f.b, f.nb = fb, fnb
917 f.err = noEOF(err)
918 return
919 }
920 f.roffset++
921 fb |= uint32(c) << (fnb & regSizeMaskUint32)
922 fnb += 8
923 }
924 chunk := f.hd.chunks[fb&(huffmanNumChunks-1)]
925 n = uint(chunk & huffmanCountMask)
926 if n > huffmanChunkBits {
927 chunk = f.hd.links[chunk>>huffmanValueShift][(fb>>huffmanChunkBits)&f.hd.linkMask]
928 n = uint(chunk & huffmanCountMask)
929 }
930 if n <= fnb {
931 if n == 0 {
932 f.b, f.nb = fb, fnb
933 if debugDecode {
934 fmt.Println("huffsym: n==0")
935 }
936 f.err = CorruptInputError(f.roffset)
937 return
938 }
939 fb = fb >> (n & regSizeMaskUint32)
940 fnb = fnb - n
941 dist = uint32(chunk >> huffmanValueShift)
942 break
943 }
944 }
945 }
946
947 switch {
948 case dist < 4:
949 dist++
950 case dist < maxNumDist:
951 nb := uint(dist-2) >> 1
952 // have 1 bit in bottom of dist, need nb more.
953 extra := (dist & 1) << (nb & regSizeMaskUint32)
954 for fnb < nb {
955 c, err := fr.ReadByte()
956 if err != nil {
957 f.b, f.nb = fb, fnb
958 if debugDecode {
959 fmt.Println("morebits f.nb<nb:", err)
960 }
961 f.err = err
962 return
963 }
964 f.roffset++
965 fb |= uint32(c) << (fnb & regSizeMaskUint32)
966 fnb += 8
967 }
968 extra |= fb & bitMask32[nb]
969 fb >>= nb & regSizeMaskUint32
970 fnb -= nb
971 dist = 1<<((nb+1)&regSizeMaskUint32) + 1 + extra
972 // slower: dist = bitMask32[nb+1] + 2 + extra
973 default:
974 f.b, f.nb = fb, fnb
975 if debugDecode {
976 fmt.Println("dist too big:", dist, maxNumDist)
977 }
978 f.err = CorruptInputError(f.roffset)
979 return
980 }
981
982 // No check on length; encoding can be prescient.
983 if dist > uint32(f.dict.histSize()) {
984 f.b, f.nb = fb, fnb
985 if debugDecode {
986 fmt.Println("dist > f.dict.histSize():", dist, f.dict.histSize())
987 }
988 f.err = CorruptInputError(f.roffset)
989 return
990 }
991
992 f.copyLen, f.copyDist = length, int(dist)
993 goto copyHistory
994 }
995
996copyHistory:
997 // Perform a backwards copy according to RFC section 3.2.3.
998 {
999 cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen)
1000 if cnt == 0 {
1001 cnt = f.dict.writeCopy(f.copyDist, f.copyLen)
1002 }
1003 f.copyLen -= cnt
1004
1005 if f.dict.availWrite() == 0 || f.copyLen > 0 {
1006 f.toRead = f.dict.readFlush()
1007 f.step = (*decompressor).huffmanStringsReader // We need to continue this work
1008 f.stepState = stateDict
1009 f.b, f.nb = fb, fnb
1010 return
1011 }
1012 goto readLiteral
1013 }
1014 // Not reached
1015}
1016
1017// Decode a single Huffman block from f.
1018// hl and hd are the Huffman states for the lit/length values
1019// and the distance values, respectively. If hd == nil, using the
1020// fixed distance encoding associated with fixed Huffman blocks.
1021func (f *decompressor) huffmanGenericReader() {
1022 const (
1023 stateInit = iota // Zero value must be stateInit
1024 stateDict
1025 )
1026 fr := f.r.(Reader)
1027
1028 // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers,
1029 // but is smart enough to keep local variables in registers, so use nb and b,
1030 // inline call to moreBits and reassign b,nb back to f on return.
1031 fnb, fb := f.nb, f.b
1032
1033 switch f.stepState {
1034 case stateInit:
1035 goto readLiteral
1036 case stateDict:
1037 goto copyHistory
1038 }
1039
1040readLiteral:
1041 // Read literal and/or (length, distance) according to RFC section 3.2.3.
1042 {
1043 var v int
1044 {
1045 // Inlined v, err := f.huffSym(f.hl)
1046 // Since a huffmanDecoder can be empty or be composed of a degenerate tree
1047 // with single element, huffSym must error on these two edge cases. In both
1048 // cases, the chunks slice will be 0 for the invalid sequence, leading it
1049 // satisfy the n == 0 check below.
1050 n := uint(f.hl.maxRead)
1051 for {
1052 for fnb < n {
1053 c, err := fr.ReadByte()
1054 if err != nil {
1055 f.b, f.nb = fb, fnb
1056 f.err = noEOF(err)
1057 return
1058 }
1059 f.roffset++
1060 fb |= uint32(c) << (fnb & regSizeMaskUint32)
1061 fnb += 8
1062 }
1063 chunk := f.hl.chunks[fb&(huffmanNumChunks-1)]
1064 n = uint(chunk & huffmanCountMask)
1065 if n > huffmanChunkBits {
1066 chunk = f.hl.links[chunk>>huffmanValueShift][(fb>>huffmanChunkBits)&f.hl.linkMask]
1067 n = uint(chunk & huffmanCountMask)
1068 }
1069 if n <= fnb {
1070 if n == 0 {
1071 f.b, f.nb = fb, fnb
1072 if debugDecode {
1073 fmt.Println("huffsym: n==0")
1074 }
1075 f.err = CorruptInputError(f.roffset)
1076 return
1077 }
1078 fb = fb >> (n & regSizeMaskUint32)
1079 fnb = fnb - n
1080 v = int(chunk >> huffmanValueShift)
1081 break
1082 }
1083 }
1084 }
1085
1086 var length int
1087 switch {
1088 case v < 256:
1089 f.dict.writeByte(byte(v))
1090 if f.dict.availWrite() == 0 {
1091 f.toRead = f.dict.readFlush()
1092 f.step = (*decompressor).huffmanGenericReader
1093 f.stepState = stateInit
1094 f.b, f.nb = fb, fnb
1095 return
1096 }
1097 goto readLiteral
1098 case v == 256:
1099 f.b, f.nb = fb, fnb
1100 f.finishBlock()
1101 return
1102 // otherwise, reference to older data
1103 case v < 265:
1104 length = v - (257 - 3)
1105 case v < maxNumLit:
1106 val := decCodeToLen[(v - 257)]
1107 length = int(val.length) + 3
1108 n := uint(val.extra)
1109 for fnb < n {
1110 c, err := fr.ReadByte()
1111 if err != nil {
1112 f.b, f.nb = fb, fnb
1113 if debugDecode {
1114 fmt.Println("morebits n>0:", err)
1115 }
1116 f.err = err
1117 return
1118 }
1119 f.roffset++
1120 fb |= uint32(c) << (fnb & regSizeMaskUint32)
1121 fnb += 8
1122 }
1123 length += int(fb & bitMask32[n])
1124 fb >>= n & regSizeMaskUint32
1125 fnb -= n
1126 default:
1127 if debugDecode {
1128 fmt.Println(v, ">= maxNumLit")
1129 }
1130 f.err = CorruptInputError(f.roffset)
1131 f.b, f.nb = fb, fnb
1132 return
1133 }
1134
1135 var dist uint32
1136 if f.hd == nil {
1137 for fnb < 5 {
1138 c, err := fr.ReadByte()
1139 if err != nil {
1140 f.b, f.nb = fb, fnb
1141 if debugDecode {
1142 fmt.Println("morebits f.nb<5:", err)
1143 }
1144 f.err = err
1145 return
1146 }
1147 f.roffset++
1148 fb |= uint32(c) << (fnb & regSizeMaskUint32)
1149 fnb += 8
1150 }
1151 dist = uint32(bits.Reverse8(uint8(fb & 0x1F << 3)))
1152 fb >>= 5
1153 fnb -= 5
1154 } else {
1155 // Since a huffmanDecoder can be empty or be composed of a degenerate tree
1156 // with single element, huffSym must error on these two edge cases. In both
1157 // cases, the chunks slice will be 0 for the invalid sequence, leading it
1158 // satisfy the n == 0 check below.
1159 n := uint(f.hd.maxRead)
1160 // Optimization. Compiler isn't smart enough to keep f.b,f.nb in registers,
1161 // but is smart enough to keep local variables in registers, so use nb and b,
1162 // inline call to moreBits and reassign b,nb back to f on return.
1163 for {
1164 for fnb < n {
1165 c, err := fr.ReadByte()
1166 if err != nil {
1167 f.b, f.nb = fb, fnb
1168 f.err = noEOF(err)
1169 return
1170 }
1171 f.roffset++
1172 fb |= uint32(c) << (fnb & regSizeMaskUint32)
1173 fnb += 8
1174 }
1175 chunk := f.hd.chunks[fb&(huffmanNumChunks-1)]
1176 n = uint(chunk & huffmanCountMask)
1177 if n > huffmanChunkBits {
1178 chunk = f.hd.links[chunk>>huffmanValueShift][(fb>>huffmanChunkBits)&f.hd.linkMask]
1179 n = uint(chunk & huffmanCountMask)
1180 }
1181 if n <= fnb {
1182 if n == 0 {
1183 f.b, f.nb = fb, fnb
1184 if debugDecode {
1185 fmt.Println("huffsym: n==0")
1186 }
1187 f.err = CorruptInputError(f.roffset)
1188 return
1189 }
1190 fb = fb >> (n & regSizeMaskUint32)
1191 fnb = fnb - n
1192 dist = uint32(chunk >> huffmanValueShift)
1193 break
1194 }
1195 }
1196 }
1197
1198 switch {
1199 case dist < 4:
1200 dist++
1201 case dist < maxNumDist:
1202 nb := uint(dist-2) >> 1
1203 // have 1 bit in bottom of dist, need nb more.
1204 extra := (dist & 1) << (nb & regSizeMaskUint32)
1205 for fnb < nb {
1206 c, err := fr.ReadByte()
1207 if err != nil {
1208 f.b, f.nb = fb, fnb
1209 if debugDecode {
1210 fmt.Println("morebits f.nb<nb:", err)
1211 }
1212 f.err = err
1213 return
1214 }
1215 f.roffset++
1216 fb |= uint32(c) << (fnb & regSizeMaskUint32)
1217 fnb += 8
1218 }
1219 extra |= fb & bitMask32[nb]
1220 fb >>= nb & regSizeMaskUint32
1221 fnb -= nb
1222 dist = 1<<((nb+1)&regSizeMaskUint32) + 1 + extra
1223 // slower: dist = bitMask32[nb+1] + 2 + extra
1224 default:
1225 f.b, f.nb = fb, fnb
1226 if debugDecode {
1227 fmt.Println("dist too big:", dist, maxNumDist)
1228 }
1229 f.err = CorruptInputError(f.roffset)
1230 return
1231 }
1232
1233 // No check on length; encoding can be prescient.
1234 if dist > uint32(f.dict.histSize()) {
1235 f.b, f.nb = fb, fnb
1236 if debugDecode {
1237 fmt.Println("dist > f.dict.histSize():", dist, f.dict.histSize())
1238 }
1239 f.err = CorruptInputError(f.roffset)
1240 return
1241 }
1242
1243 f.copyLen, f.copyDist = length, int(dist)
1244 goto copyHistory
1245 }
1246
1247copyHistory:
1248 // Perform a backwards copy according to RFC section 3.2.3.
1249 {
1250 cnt := f.dict.tryWriteCopy(f.copyDist, f.copyLen)
1251 if cnt == 0 {
1252 cnt = f.dict.writeCopy(f.copyDist, f.copyLen)
1253 }
1254 f.copyLen -= cnt
1255
1256 if f.dict.availWrite() == 0 || f.copyLen > 0 {
1257 f.toRead = f.dict.readFlush()
1258 f.step = (*decompressor).huffmanGenericReader // We need to continue this work
1259 f.stepState = stateDict
1260 f.b, f.nb = fb, fnb
1261 return
1262 }
1263 goto readLiteral
1264 }
1265 // Not reached
1266}
1267
1268func (f *decompressor) huffmanBlockDecoder() func() {
1269 switch f.r.(type) {
1270 case *bytes.Buffer:
1271 return f.huffmanBytesBuffer
1272 case *bytes.Reader:
1273 return f.huffmanBytesReader
1274 case *bufio.Reader:
1275 return f.huffmanBufioReader
1276 case *strings.Reader:
1277 return f.huffmanStringsReader
1278 case Reader:
1279 return f.huffmanGenericReader
1280 default:
1281 return f.huffmanGenericReader
1282 }
1283}
Note: See TracBrowser for help on using the repository browser.