1
2
3
4
5
6
7
8 package flate
9
10 import (
11 "bufio"
12 "io"
13 "os"
14 "strconv"
15 )
16
17 const (
18 maxCodeLen = 16
19 maxHist = 32768
20 maxLit = 286
21 maxDist = 32
22 numCodes = 19
23 )
24
25
26 type CorruptInputError int64
27
28 func (e CorruptInputError) String() string {
29 return "flate: corrupt input before offset " + strconv.Itoa64(int64(e))
30 }
31
32
33 type InternalError string
34
35 func (e InternalError) String() string { return "flate: internal error: " + string(e) }
36
37
38 type ReadError struct {
39 Offset int64
40 Error os.Error
41 }
42
43 func (e *ReadError) String() string {
44 return "flate: read error at offset " + strconv.Itoa64(e.Offset) + ": " + e.Error.String()
45 }
46
47
48 type WriteError struct {
49 Offset int64
50 Error os.Error
51 }
52
53 func (e *WriteError) String() string {
54 return "flate: write error at offset " + strconv.Itoa64(e.Offset) + ": " + e.Error.String()
55 }
56
57
58
59
60 type huffmanDecoder struct {
61
62 min, max int
63
64
65
66
67 limit [maxCodeLen + 1]int
68
69
70 base [maxCodeLen + 1]int
71
72
73
74
75 codes []int
76 }
77
78
79 func (h *huffmanDecoder) init(bits []int) bool {
80
81
82 var count [maxCodeLen + 1]int
83 var min, max int
84 for _, n := range bits {
85 if n == 0 {
86 continue
87 }
88 if min == 0 || n < min {
89 min = n
90 }
91 if n > max {
92 max = n
93 }
94 count[n]++
95 }
96 if max == 0 {
97 return false
98 }
99
100 h.min = min
101 h.max = max
102
103
104
105
106
107 code := 0
108 seq := 0
109 var nextcode [maxCodeLen]int
110 for i := min; i <= max; i++ {
111 n := count[i]
112 nextcode[i] = code
113 h.base[i] = code - seq
114 code += n
115 seq += n
116 h.limit[i] = code - 1
117 code <<= 1
118 }
119
120
121 if len(h.codes) < len(bits) {
122 h.codes = make([]int, len(bits))
123 }
124 for i, n := range bits {
125 if n == 0 {
126 continue
127 }
128 code := nextcode[n]
129 nextcode[n]++
130 seq := code - h.base[n]
131 h.codes[seq] = i
132 }
133 return true
134 }
135
136
137
138 var fixedHuffmanDecoder = huffmanDecoder{
139 7, 9,
140 [maxCodeLen + 1]int{7: 23, 199, 511},
141 [maxCodeLen + 1]int{7: 0, 24, 224},
142 []int{
143
144 256, 257, 258, 259, 260, 261, 262,
145 263, 264, 265, 266, 267, 268, 269,
146 270, 271, 272, 273, 274, 275, 276,
147 277, 278, 279,
148
149
150 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
151 12, 13, 14, 15, 16, 17, 18, 19, 20, 21,
152 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
153 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
154 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
155 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
156 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,
157 72, 73, 74, 75, 76, 77, 78, 79, 80, 81,
158 82, 83, 84, 85, 86, 87, 88, 89, 90, 91,
159 92, 93, 94, 95, 96, 97, 98, 99, 100,
160 101, 102, 103, 104, 105, 106, 107, 108,
161 109, 110, 111, 112, 113, 114, 115, 116,
162 117, 118, 119, 120, 121, 122, 123, 124,
163 125, 126, 127, 128, 129, 130, 131, 132,
164 133, 134, 135, 136, 137, 138, 139, 140,
165 141, 142, 143,
166
167
168 280, 281, 282, 283, 284, 285, 286, 287,
169
170
171 144, 145, 146, 147, 148, 149, 150, 151,
172 152, 153, 154, 155, 156, 157, 158, 159,
173 160, 161, 162, 163, 164, 165, 166, 167,
174 168, 169, 170, 171, 172, 173, 174, 175,
175 176, 177, 178, 179, 180, 181, 182, 183,
176 184, 185, 186, 187, 188, 189, 190, 191,
177 192, 193, 194, 195, 196, 197, 198, 199,
178 200, 201, 202, 203, 204, 205, 206, 207,
179 208, 209, 210, 211, 212, 213, 214, 215,
180 216, 217, 218, 219, 220, 221, 222, 223,
181 224, 225, 226, 227, 228, 229, 230, 231,
182 232, 233, 234, 235, 236, 237, 238, 239,
183 240, 241, 242, 243, 244, 245, 246, 247,
184 248, 249, 250, 251, 252, 253, 254, 255,
185 },
186 }
187
188
189
190
191 type Reader interface {
192 io.Reader
193 ReadByte() (c byte, err os.Error)
194 }
195
196
197 type decompressor struct {
198
199 r Reader
200 roffset int64
201 woffset int64
202
203
204 b uint32
205 nb uint
206
207
208 h1, h2 huffmanDecoder
209
210
211 bits [maxLit + maxDist]int
212 codebits [numCodes]int
213
214
215 hist [maxHist]byte
216 hp int
217 hw int
218 hfull bool
219
220
221 buf [4]byte
222
223
224
225 step func(*decompressor)
226 final bool
227 err os.Error
228 toRead []byte
229 hl, hd *huffmanDecoder
230 copyLen int
231 copyDist int
232 }
233
234 func (f *decompressor) nextBlock() {
235 if f.final {
236 if f.hw != f.hp {
237 f.flush((*decompressor).nextBlock)
238 return
239 }
240 f.err = os.EOF
241 return
242 }
243 for f.nb < 1+2 {
244 if f.err = f.moreBits(); f.err != nil {
245 return
246 }
247 }
248 f.final = f.b&1 == 1
249 f.b >>= 1
250 typ := f.b & 3
251 f.b >>= 2
252 f.nb -= 1 + 2
253 switch typ {
254 case 0:
255 f.dataBlock()
256 case 1:
257
258 f.hl = &fixedHuffmanDecoder
259 f.hd = nil
260 f.huffmanBlock()
261 case 2:
262
263 if f.err = f.readHuffman(); f.err != nil {
264 break
265 }
266 f.hl = &f.h1
267 f.hd = &f.h2
268 f.huffmanBlock()
269 default:
270
271 f.err = CorruptInputError(f.roffset)
272 }
273 }
274
275 func (f *decompressor) Read(b []byte) (int, os.Error) {
276 for {
277 if len(f.toRead) > 0 {
278 n := copy(b, f.toRead)
279 f.toRead = f.toRead[n:]
280 return n, nil
281 }
282 if f.err != nil {
283 return 0, f.err
284 }
285 f.step(f)
286 }
287 panic("unreachable")
288 }
289
290 func (f *decompressor) Close() os.Error {
291 if f.err == os.EOF {
292 return nil
293 }
294 return f.err
295 }
296
297
298
299
300 var codeOrder = [...]int{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15}
301
302 func (f *decompressor) readHuffman() os.Error {
303
304 for f.nb < 5+5+4 {
305 if err := f.moreBits(); err != nil {
306 return err
307 }
308 }
309 nlit := int(f.b&0x1F) + 257
310 f.b >>= 5
311 ndist := int(f.b&0x1F) + 1
312 f.b >>= 5
313 nclen := int(f.b&0xF) + 4
314 f.b >>= 4
315 f.nb -= 5 + 5 + 4
316
317
318 for i := 0; i < nclen; i++ {
319 for f.nb < 3 {
320 if err := f.moreBits(); err != nil {
321 return err
322 }
323 }
324 f.codebits[codeOrder[i]] = int(f.b & 0x7)
325 f.b >>= 3
326 f.nb -= 3
327 }
328 for i := nclen; i < len(codeOrder); i++ {
329 f.codebits[codeOrder[i]] = 0
330 }
331 if !f.h1.init(f.codebits[0:]) {
332 return CorruptInputError(f.roffset)
333 }
334
335
336
337 for i, n := 0, nlit+ndist; i < n; {
338 x, err := f.huffSym(&f.h1)
339 if err != nil {
340 return err
341 }
342 if x < 16 {
343
344 f.bits[i] = x
345 i++
346 continue
347 }
348
349 var rep int
350 var nb uint
351 var b int
352 switch x {
353 default:
354 return InternalError("unexpected length code")
355 case 16:
356 rep = 3
357 nb = 2
358 if i == 0 {
359 return CorruptInputError(f.roffset)
360 }
361 b = f.bits[i-1]
362 case 17:
363 rep = 3
364 nb = 3
365 b = 0
366 case 18:
367 rep = 11
368 nb = 7
369 b = 0
370 }
371 for f.nb < nb {
372 if err := f.moreBits(); err != nil {
373 return err
374 }
375 }
376 rep += int(f.b & uint32(1<<nb-1))
377 f.b >>= nb
378 f.nb -= nb
379 if i+rep > n {
380 return CorruptInputError(f.roffset)
381 }
382 for j := 0; j < rep; j++ {
383 f.bits[i] = b
384 i++
385 }
386 }
387
388 if !f.h1.init(f.bits[0:nlit]) || !f.h2.init(f.bits[nlit:nlit+ndist]) {
389 return CorruptInputError(f.roffset)
390 }
391
392 return nil
393 }
394
395
396
397
398
399 func (f *decompressor) huffmanBlock() {
400 for {
401 v, err := f.huffSym(f.hl)
402 if err != nil {
403 f.err = err
404 return
405 }
406 var n uint
407 var length int
408 switch {
409 case v < 256:
410 f.hist[f.hp] = byte(v)
411 f.hp++
412 if f.hp == len(f.hist) {
413
414 f.flush((*decompressor).huffmanBlock)
415 return
416 }
417 continue
418 case v == 256:
419
420 f.step = (*decompressor).nextBlock
421 return
422
423 case v < 265:
424 length = v - (257 - 3)
425 n = 0
426 case v < 269:
427 length = v*2 - (265*2 - 11)
428 n = 1
429 case v < 273:
430 length = v*4 - (269*4 - 19)
431 n = 2
432 case v < 277:
433 length = v*8 - (273*8 - 35)
434 n = 3
435 case v < 281:
436 length = v*16 - (277*16 - 67)
437 n = 4
438 case v < 285:
439 length = v*32 - (281*32 - 131)
440 n = 5
441 default:
442 length = 258
443 n = 0
444 }
445 if n > 0 {
446 for f.nb < n {
447 if err = f.moreBits(); err != nil {
448 f.err = err
449 return
450 }
451 }
452 length += int(f.b & uint32(1<<n-1))
453 f.b >>= n
454 f.nb -= n
455 }
456
457 var dist int
458 if f.hd == nil {
459 for f.nb < 5 {
460 if err = f.moreBits(); err != nil {
461 f.err = err
462 return
463 }
464 }
465 dist = int(reverseByte[(f.b&0x1F)<<3])
466 f.b >>= 5
467 f.nb -= 5
468 } else {
469 if dist, err = f.huffSym(f.hd); err != nil {
470 f.err = err
471 return
472 }
473 }
474
475 switch {
476 case dist < 4:
477 dist++
478 case dist >= 30:
479 f.err = CorruptInputError(f.roffset)
480 return
481 default:
482 nb := uint(dist-2) >> 1
483
484 extra := (dist & 1) << nb
485 for f.nb < nb {
486 if err = f.moreBits(); err != nil {
487 f.err = err
488 return
489 }
490 }
491 extra |= int(f.b & uint32(1<<nb-1))
492 f.b >>= nb
493 f.nb -= nb
494 dist = 1<<(nb+1) + 1 + extra
495 }
496
497
498 if dist > len(f.hist) {
499 f.err = InternalError("bad history distance")
500 return
501 }
502
503
504 if !f.hfull && dist > f.hp {
505 f.err = CorruptInputError(f.roffset)
506 return
507 }
508
509 p := f.hp - dist
510 if p < 0 {
511 p += len(f.hist)
512 }
513 for i := 0; i < length; i++ {
514 f.hist[f.hp] = f.hist[p]
515 f.hp++
516 p++
517 if f.hp == len(f.hist) {
518
519 f.copyLen = length - (i + 1)
520 f.copyDist = dist
521 f.flush((*decompressor).copyHuff)
522 return
523 }
524 if p == len(f.hist) {
525 p = 0
526 }
527 }
528 }
529 panic("unreached")
530 }
531
532 func (f *decompressor) copyHuff() {
533 length := f.copyLen
534 dist := f.copyDist
535 p := f.hp - dist
536 if p < 0 {
537 p += len(f.hist)
538 }
539 for i := 0; i < length; i++ {
540 f.hist[f.hp] = f.hist[p]
541 f.hp++
542 p++
543 if f.hp == len(f.hist) {
544 f.copyLen = length - (i + 1)
545 f.flush((*decompressor).copyHuff)
546 return
547 }
548 if p == len(f.hist) {
549 p = 0
550 }
551 }
552
553
554 f.huffmanBlock()
555 }
556
557
558 func (f *decompressor) dataBlock() {
559
560
561 f.nb = 0
562 f.b = 0
563
564
565 nr, err := io.ReadFull(f.r, f.buf[0:4])
566 f.roffset += int64(nr)
567 if err != nil {
568 f.err = &ReadError{f.roffset, err}
569 return
570 }
571 n := int(f.buf[0]) | int(f.buf[1])<<8
572 nn := int(f.buf[2]) | int(f.buf[3])<<8
573 if uint16(nn) != uint16(^n) {
574 f.err = CorruptInputError(f.roffset)
575 return
576 }
577
578 if n == 0 {
579
580 f.flush((*decompressor).nextBlock)
581 return
582 }
583
584 f.copyLen = n
585 f.copyData()
586 }
587
588 func (f *decompressor) copyData() {
589
590
591 n := f.copyLen
592 for n > 0 {
593 m := len(f.hist) - f.hp
594 if m > n {
595 m = n
596 }
597 m, err := io.ReadFull(f.r, f.hist[f.hp:f.hp+m])
598 f.roffset += int64(m)
599 if err != nil {
600 f.err = &ReadError{f.roffset, err}
601 return
602 }
603 n -= m
604 f.hp += m
605 if f.hp == len(f.hist) {
606 f.copyLen = n
607 f.flush((*decompressor).copyData)
608 return
609 }
610 }
611 f.step = (*decompressor).nextBlock
612 }
613
614 func (f *decompressor) setDict(dict []byte) {
615 if len(dict) > len(f.hist) {
616
617 dict = dict[len(dict)-len(f.hist):]
618 }
619
620 f.hp = copy(f.hist[:], dict)
621 if f.hp == len(f.hist) {
622 f.hp = 0
623 f.hfull = true
624 }
625 f.hw = f.hp
626 }
627
628 func (f *decompressor) moreBits() os.Error {
629 c, err := f.r.ReadByte()
630 if err != nil {
631 if err == os.EOF {
632 err = io.ErrUnexpectedEOF
633 }
634 return err
635 }
636 f.roffset++
637 f.b |= uint32(c) << f.nb
638 f.nb += 8
639 return nil
640 }
641
642
643 func (f *decompressor) huffSym(h *huffmanDecoder) (int, os.Error) {
644 for n := uint(h.min); n <= uint(h.max); n++ {
645 lim := h.limit[n]
646 if lim == -1 {
647 continue
648 }
649 for f.nb < n {
650 if err := f.moreBits(); err != nil {
651 return 0, err
652 }
653 }
654 v := int(f.b & uint32(1<<n-1))
655 v <<= 16 - n
656 v = int(reverseByte[v>>8]) | int(reverseByte[v&0xFF])<<8
657 if v <= lim {
658 f.b >>= n
659 f.nb -= n
660 return h.codes[v-h.base[n]], nil
661 }
662 }
663 return 0, CorruptInputError(f.roffset)
664 }
665
666
667 func (f *decompressor) flush(step func(*decompressor)) {
668 f.toRead = f.hist[f.hw:f.hp]
669 f.woffset += int64(f.hp - f.hw)
670 f.hw = f.hp
671 if f.hp == len(f.hist) {
672 f.hp = 0
673 f.hw = 0
674 f.hfull = true
675 }
676 f.step = step
677 }
678
679 func makeReader(r io.Reader) Reader {
680 if rr, ok := r.(Reader); ok {
681 return rr
682 }
683 return bufio.NewReader(r)
684 }
685
686
687
688
689
690 func NewReader(r io.Reader) io.ReadCloser {
691 var f decompressor
692 f.r = makeReader(r)
693 f.step = (*decompressor).nextBlock
694 return &f
695 }
696
697
698
699
700
701
702 func NewReaderDict(r io.Reader, dict []byte) io.ReadCloser {
703 var f decompressor
704 f.setDict(dict)
705 f.r = makeReader(r)
706 f.step = (*decompressor).nextBlock
707 return &f
708 }