2 * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20 FILE_LICENCE ( GPL2_OR_LATER );
27 #include <ipxe/uaccess.h>
28 #include <ipxe/deflate.h>
32 * DEFLATE decompression algorithm
34 * This file implements the decompression half of the DEFLATE
35 * algorithm specified in RFC 1951.
37 * Portions of this code are derived from wimboot's xca.c.
44 * For some insane reason, the DEFLATE format stores some values in
47 static uint8_t deflate_reverse[256];
49 /** Literal/length base values
51 * We include entries only for literal/length codes 257-284. Code 285
52 * does not fit the pattern (it represents a length of 258; following
53 * the pattern from the earlier codes would give a length of 259), and
54 * has no extra bits. Codes 286-287 are invalid, but can occur. We
55 * treat any code greater than 284 as meaning "length 285, no extra
58 static uint8_t deflate_litlen_base[28];
60 /** Distance base values
62 * We include entries for all possible codes 0-31, avoiding the need
63 * to check for undefined codes 30 and 31 before performing the
64 * lookup. Codes 30 and 31 are never initialised, and will therefore
65 * be treated as meaning "14 extra bits, base distance 0".
67 static uint16_t deflate_distance_base[32];
69 /** Code length map */
70 static uint8_t deflate_codelen_map[19] = {
71 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
74 /** Static Huffman alphabet length patterns */
75 static struct deflate_static_length_pattern deflate_static_length_patterns[] = {
76 /* Literal/length code lengths */
77 { 0x88, ( ( ( 143 - 0 ) + 1 ) / 2 ) },
78 { 0x99, ( ( ( 255 - 144 ) + 1 ) / 2 ) },
79 { 0x77, ( ( ( 279 - 256 ) + 1 ) / 2 ) },
80 { 0x88, ( ( ( 287 - 280 ) + 1 ) / 2 ) },
81 /* Distance code lengths */
82 { 0x55, ( ( ( 31 - 0 ) + 1 ) / 2 ) },
88 * Transcribe binary value (for debugging)
91 * @v bits Length of value (in bits)
92 * @ret string Transcribed value
94 static const char * deflate_bin ( unsigned long value, unsigned int bits ) {
95 static char buf[ ( 8 * sizeof ( value ) ) + 1 /* NUL */ ];
99 assert ( bits < sizeof ( buf ) );
101 /* Transcribe value */
103 *(out++) = ( ( value & ( 1 << bits ) ) ? '1' : '0' );
110 * Set Huffman symbol length
112 * @v deflate Decompressor
113 * @v index Index within lengths
114 * @v bits Symbol length (in bits)
116 static void deflate_set_length ( struct deflate *deflate, unsigned int index,
117 unsigned int bits ) {
119 deflate->lengths[ index / 2 ] |= ( bits << ( 4 * ( index % 2 ) ) );
123 * Get Huffman symbol length
125 * @v deflate Decompressor
126 * @v index Index within lengths
127 * @ret bits Symbol length (in bits)
129 static unsigned int deflate_length ( struct deflate *deflate,
130 unsigned int index ) {
132 return ( ( deflate->lengths[ index / 2 ] >> ( 4 * ( index % 2 ) ) )
137 * Determine Huffman alphabet name (for debugging)
139 * @v deflate Decompressor
140 * @v alphabet Huffman alphabet
141 * @ret name Alphabet name
143 static const char * deflate_alphabet_name ( struct deflate *deflate,
144 struct deflate_alphabet *alphabet ){
146 if ( alphabet == &deflate->litlen ) {
148 } else if ( alphabet == &deflate->distance_codelen ) {
149 return "distance/codelen";
156 * Dump Huffman alphabet (for debugging)
158 * @v deflate Decompressor
159 * @v alphabet Huffman alphabet
161 static void deflate_dump_alphabet ( struct deflate *deflate,
162 struct deflate_alphabet *alphabet ) {
163 struct deflate_huf_symbols *huf_sym;
168 /* Do nothing unless debugging is enabled */
172 /* Dump symbol table for each utilised length */
173 for ( bits = 1 ; bits <= ( sizeof ( alphabet->huf ) /
174 sizeof ( alphabet->huf[0] ) ) ; bits++ ) {
175 huf_sym = &alphabet->huf[ bits - 1 ];
176 if ( huf_sym->freq == 0 )
178 huf = ( huf_sym->start >> huf_sym->shift );
179 DBGC2 ( alphabet, "DEFLATE %p \"%s\" length %d start \"%s\" "
181 deflate_alphabet_name ( deflate, alphabet ), bits,
182 deflate_bin ( huf, huf_sym->bits ), huf_sym->freq );
183 for ( i = 0 ; i < huf_sym->freq ; i++ ) {
184 DBGC2 ( alphabet, " %03x",
185 huf_sym->raw[ huf + i ] );
187 DBGC2 ( alphabet, "\n" );
190 /* Dump quick lookup table */
191 DBGC2 ( alphabet, "DEFLATE %p \"%s\" quick lookup:", deflate,
192 deflate_alphabet_name ( deflate, alphabet ) );
193 for ( i = 0 ; i < ( sizeof ( alphabet->lookup ) /
194 sizeof ( alphabet->lookup[0] ) ) ; i++ ) {
195 DBGC2 ( alphabet, " %d", ( alphabet->lookup[i] + 1 ) );
197 DBGC2 ( alphabet, "\n" );
201 * Construct Huffman alphabet
203 * @v deflate Decompressor
204 * @v alphabet Huffman alphabet
205 * @v count Number of symbols
206 * @v offset Starting offset within length table
207 * @ret rc Return status code
209 static int deflate_alphabet ( struct deflate *deflate,
210 struct deflate_alphabet *alphabet,
211 unsigned int count, unsigned int offset ) {
212 struct deflate_huf_symbols *huf_sym;
214 unsigned int cum_freq;
217 unsigned int adjustment;
221 /* Clear symbol table */
222 memset ( alphabet->huf, 0, sizeof ( alphabet->huf ) );
224 /* Count number of symbols with each Huffman-coded length */
225 for ( raw = 0 ; raw < count ; raw++ ) {
226 bits = deflate_length ( deflate, ( raw + offset ) );
228 alphabet->huf[ bits - 1 ].freq++;
231 /* Populate Huffman-coded symbol table */
234 for ( bits = 1 ; bits <= ( sizeof ( alphabet->huf ) /
235 sizeof ( alphabet->huf[0] ) ) ; bits++ ) {
236 huf_sym = &alphabet->huf[ bits - 1 ];
237 huf_sym->bits = bits;
238 huf_sym->shift = ( 16 - bits );
239 huf_sym->start = ( huf << huf_sym->shift );
240 huf_sym->raw = &alphabet->raw[cum_freq];
241 huf += huf_sym->freq;
242 if ( huf > ( 1U << bits ) ) {
243 DBGC ( alphabet, "DEFLATE %p \"%s\" has too many "
244 "symbols with lengths <=%d\n", deflate,
245 deflate_alphabet_name ( deflate, alphabet ),
250 cum_freq += huf_sym->freq;
252 complete = ( huf == ( 1U << bits ) );
254 /* Populate raw symbol table */
255 for ( raw = 0 ; raw < count ; raw++ ) {
256 bits = deflate_length ( deflate, ( raw + offset ) );
258 huf_sym = &alphabet->huf[ bits - 1 ];
259 *(huf_sym->raw++) = raw;
263 /* Adjust Huffman-coded symbol table raw pointers and populate
264 * quick lookup table.
266 for ( bits = 1 ; bits <= ( sizeof ( alphabet->huf ) /
267 sizeof ( alphabet->huf[0] ) ) ; bits++ ) {
268 huf_sym = &alphabet->huf[ bits - 1 ];
270 /* Adjust raw pointer */
271 huf_sym->raw -= huf_sym->freq; /* Reset to first symbol */
272 adjustment = ( huf_sym->start >> huf_sym->shift );
273 huf_sym->raw -= adjustment; /* Adjust for quick indexing */
275 /* Populate quick lookup table */
276 for ( prefix = ( huf_sym->start >> DEFLATE_HUFFMAN_QL_SHIFT ) ;
277 prefix < ( 1 << DEFLATE_HUFFMAN_QL_BITS ) ; prefix++ ) {
278 alphabet->lookup[prefix] = ( bits - 1 );
282 /* Dump alphabet (for debugging) */
283 deflate_dump_alphabet ( deflate, alphabet );
285 /* Check that there are no invalid codes */
287 DBGC ( alphabet, "DEFLATE %p \"%s\" is incomplete\n", deflate,
288 deflate_alphabet_name ( deflate, alphabet ) );
296 * Attempt to accumulate bits from input stream
298 * @v deflate Decompressor
299 * @v in Compressed input data
300 * @v target Number of bits to accumulate
301 * @ret excess Number of excess bits accumulated (may be negative)
303 static int deflate_accumulate ( struct deflate *deflate,
304 struct deflate_chunk *in,
305 unsigned int target ) {
308 while ( deflate->bits < target ) {
310 /* Check for end of input */
311 if ( in->offset >= in->len )
314 /* Acquire byte from input */
315 copy_from_user ( &byte, in->data, in->offset++,
317 deflate->accumulator = ( deflate->accumulator |
318 ( byte << deflate->bits ) );
319 deflate->rotalumucca = ( deflate->rotalumucca |
320 ( deflate_reverse[byte] <<
321 ( 24 - deflate->bits ) ) );
325 assert ( deflate->bits <=
326 ( 8 * sizeof ( deflate->accumulator ) ) );
329 return ( deflate->bits - target );
333 * Consume accumulated bits from the input stream
335 * @v deflate Decompressor
336 * @v count Number of accumulated bits to consume
337 * @ret data Consumed bits
339 static int deflate_consume ( struct deflate *deflate, unsigned int count ) {
343 assert ( count <= deflate->bits );
345 /* Extract data and consume bits */
346 data = ( deflate->accumulator & ( ( 1 << count ) - 1 ) );
347 deflate->accumulator >>= count;
348 deflate->rotalumucca <<= count;
349 deflate->bits -= count;
355 * Attempt to extract a fixed number of bits from input stream
357 * @v deflate Decompressor
358 * @v in Compressed input data
359 * @v target Number of bits to extract
360 * @ret data Extracted bits (or negative if not yet accumulated)
362 static int deflate_extract ( struct deflate *deflate, struct deflate_chunk *in,
363 unsigned int target ) {
367 /* Return immediately if we are attempting to extract zero bits */
371 /* Attempt to accumulate bits */
372 excess = deflate_accumulate ( deflate, in, target );
376 /* Extract data and consume bits */
377 data = deflate_consume ( deflate, target );
378 DBGCP ( deflate, "DEFLATE %p extracted %s = %#x = %d\n", deflate,
379 deflate_bin ( data, target ), data, data );
385 * Attempt to decode a Huffman-coded symbol from input stream
387 * @v deflate Decompressor
388 * @v in Compressed input data
389 * @v alphabet Huffman alphabet
390 * @ret code Raw code (or negative if not yet accumulated)
392 static int deflate_decode ( struct deflate *deflate,
393 struct deflate_chunk *in,
394 struct deflate_alphabet *alphabet ) {
395 struct deflate_huf_symbols *huf_sym;
397 unsigned int lookup_index;
401 /* Attempt to accumulate maximum required number of bits.
402 * There may be fewer bits than this remaining in the stream,
403 * even if the stream still contains some complete
404 * Huffman-coded symbols.
406 deflate_accumulate ( deflate, in, DEFLATE_HUFFMAN_BITS );
408 /* Normalise the bit-reversed accumulated value to 16 bits */
409 huf = ( deflate->rotalumucca >> 16 );
411 /* Find symbol set for this length */
412 lookup_index = ( huf >> DEFLATE_HUFFMAN_QL_SHIFT );
413 huf_sym = &alphabet->huf[ alphabet->lookup[ lookup_index ] ];
414 while ( huf < huf_sym->start )
417 /* Calculate number of excess bits, and return if not yet complete */
418 excess = ( deflate->bits - huf_sym->bits );
423 deflate_consume ( deflate, huf_sym->bits );
425 /* Look up raw symbol */
426 raw = huf_sym->raw[ huf >> huf_sym->shift ];
427 DBGCP ( deflate, "DEFLATE %p decoded %s = %#x = %d\n", deflate,
428 deflate_bin ( ( huf >> huf_sym->shift ), huf_sym->bits ),
435 * Discard bits up to the next byte boundary
437 * @v deflate Decompressor
439 static void deflate_discard_to_byte ( struct deflate *deflate ) {
441 deflate_consume ( deflate, ( deflate->bits & 7 ) );
445 * Copy data to output buffer (if available)
447 * @v out Output data buffer
448 * @v start Source data
449 * @v offset Starting offset within source data
450 * @v len Length to copy
452 static void deflate_copy ( struct deflate_chunk *out,
453 userptr_t start, size_t offset, size_t len ) {
454 size_t out_offset = out->offset;
457 /* Copy data one byte at a time, to allow for overlap */
458 if ( out_offset < out->len ) {
459 copy_len = ( out->len - out_offset );
460 if ( copy_len > len )
462 while ( copy_len-- ) {
463 memcpy_user ( out->data, out_offset++,
464 start, offset++, 1 );
471 * Inflate compressed data
473 * @v deflate Decompressor
474 * @v in Compressed input data
475 * @v out Output data buffer
476 * @ret rc Return status code
478 * The caller can use deflate_finished() to determine whether a
479 * successful return indicates that the decompressor is merely waiting
482 * Data will not be written beyond the specified end of the output
483 * data buffer, but the offset within the output data buffer will be
484 * updated to reflect the amount that should have been written. The
485 * caller can use this to find the length of the decompressed data
486 * before allocating the output data buffer.
488 int deflate_inflate ( struct deflate *deflate,
489 struct deflate_chunk *in,
490 struct deflate_chunk *out ) {
492 /* This could be implemented more neatly if gcc offered a
493 * means for enforcing tail recursion.
495 if ( deflate->resume ) {
496 goto *(deflate->resume);
497 } else switch ( deflate->format ) {
498 case DEFLATE_RAW: goto block_header;
499 case DEFLATE_ZLIB: goto zlib_header;
500 default: assert ( 0 );
508 header = deflate_extract ( deflate, in, ZLIB_HEADER_BITS );
510 deflate->resume = &&zlib_header;
515 cm = ( ( header >> ZLIB_HEADER_CM_LSB ) & ZLIB_HEADER_CM_MASK );
516 if ( cm != ZLIB_HEADER_CM_DEFLATE ) {
517 DBGC ( deflate, "DEFLATE %p unsupported ZLIB "
518 "compression method %d\n", deflate, cm );
521 if ( header & ( 1 << ZLIB_HEADER_FDICT_BIT ) ) {
522 DBGC ( deflate, "DEFLATE %p unsupported ZLIB preset "
523 "dictionary\n", deflate );
527 /* Process first block header */
536 /* Extract block header */
537 header = deflate_extract ( deflate, in, DEFLATE_HEADER_BITS );
539 deflate->resume = &&block_header;
544 deflate->header = header;
545 bfinal = ( header & ( 1 << DEFLATE_HEADER_BFINAL_BIT ) );
546 btype = ( header >> DEFLATE_HEADER_BTYPE_LSB );
547 DBGC ( deflate, "DEFLATE %p found %sblock type %#x\n",
548 deflate, ( bfinal ? "final " : "" ), btype );
550 case DEFLATE_HEADER_BTYPE_LITERAL:
552 case DEFLATE_HEADER_BTYPE_STATIC:
554 case DEFLATE_HEADER_BTYPE_DYNAMIC:
557 DBGC ( deflate, "DEFLATE %p unsupported block type "
558 "%#x\n", deflate, btype );
565 /* Discard any bits up to the next byte boundary */
566 deflate_discard_to_byte ( deflate );
572 /* Extract LEN field */
573 len = deflate_extract ( deflate, in, DEFLATE_LITERAL_LEN_BITS );
575 deflate->resume = &&literal_len;
579 /* Record length of literal data */
580 deflate->remaining = len;
581 DBGC2 ( deflate, "DEFLATE %p literal block length %#04zx\n",
582 deflate, deflate->remaining );
588 /* Extract NLEN field */
589 nlen = deflate_extract ( deflate, in, DEFLATE_LITERAL_LEN_BITS);
591 deflate->resume = &&literal_nlen;
596 if ( ( ( deflate->remaining ^ ~nlen ) &
597 ( ( 1 << DEFLATE_LITERAL_LEN_BITS ) - 1 ) ) != 0 ) {
598 DBGC ( deflate, "DEFLATE %p invalid len/nlen "
599 "%#04zx/%#04x\n", deflate,
600 deflate->remaining, nlen );
609 /* Calculate available amount of literal data */
610 in_remaining = ( in->len - in->offset );
611 len = deflate->remaining;
612 if ( len > in_remaining )
615 /* Copy data to output buffer */
616 deflate_copy ( out, in->data, in->offset, len );
618 /* Consume data from input buffer */
620 deflate->remaining -= len;
622 /* Finish processing if we are blocked */
623 if ( deflate->remaining ) {
624 deflate->resume = &&literal_data;
628 /* Otherwise, finish block */
633 struct deflate_static_length_pattern *pattern;
634 uint8_t *lengths = deflate->lengths;
636 /* Construct static Huffman lengths as per RFC 1950 */
637 for ( pattern = deflate_static_length_patterns ;
638 pattern->count ; pattern++ ) {
639 memset ( lengths, pattern->fill, pattern->count );
640 lengths += pattern->count;
642 deflate->litlen_count = 288;
643 deflate->distance_count = 32;
644 goto construct_alphabets;
655 /* Extract block header */
656 header = deflate_extract ( deflate, in, DEFLATE_DYNAMIC_BITS );
658 deflate->resume = &&dynamic_header;
663 hlit = ( ( header >> DEFLATE_DYNAMIC_HLIT_LSB ) &
664 DEFLATE_DYNAMIC_HLIT_MASK );
665 hdist = ( ( header >> DEFLATE_DYNAMIC_HDIST_LSB ) &
666 DEFLATE_DYNAMIC_HDIST_MASK );
667 hclen = ( ( header >> DEFLATE_DYNAMIC_HCLEN_LSB ) &
668 DEFLATE_DYNAMIC_HCLEN_MASK );
669 deflate->litlen_count = ( hlit + 257 );
670 deflate->distance_count = ( hdist + 1 );
671 deflate->length_index = 0;
672 deflate->length_target = ( hclen + 4 );
673 DBGC2 ( deflate, "DEFLATE %p dynamic block %d codelen, %d "
674 "litlen, %d distance\n", deflate,
675 deflate->length_target, deflate->litlen_count,
676 deflate->distance_count );
678 /* Prepare for decoding code length code lengths */
679 memset ( &deflate->lengths, 0, sizeof ( deflate->lengths ) );
687 /* Extract all code lengths */
688 while ( deflate->length_index < deflate->length_target ) {
690 /* Extract code length length */
691 len = deflate_extract ( deflate, in,
692 DEFLATE_CODELEN_BITS );
694 deflate->resume = &&dynamic_codelen;
698 /* Store code length */
699 index = deflate_codelen_map[deflate->length_index++];
700 deflate_set_length ( deflate, index, len );
701 DBGCP ( deflate, "DEFLATE %p codelen for %d is %d\n",
702 deflate, index, len );
705 /* Generate code length alphabet */
706 if ( ( rc = deflate_alphabet ( deflate,
707 &deflate->distance_codelen,
708 ( DEFLATE_CODELEN_MAX_CODE + 1 ),
712 /* Prepare for decoding literal/length/distance code lengths */
713 memset ( &deflate->lengths, 0, sizeof ( deflate->lengths ) );
714 deflate->length_index = 0;
715 deflate->length_target = ( deflate->litlen_count +
716 deflate->distance_count );
720 dynamic_litlen_distance: {
724 /* Decode literal/length/distance code length */
725 len = deflate_decode ( deflate, in, &deflate->distance_codelen);
727 deflate->resume = &&dynamic_litlen_distance;
731 /* Prepare for extra bits */
733 deflate->length = len;
734 deflate->extra_bits = 0;
735 deflate->dup_len = 1;
737 static const uint8_t dup_len[3] = { 3, 3, 11 };
738 static const uint8_t extra_bits[3] = { 2, 3, 7 };
739 index = ( len - 16 );
740 deflate->dup_len = dup_len[index];
741 deflate->extra_bits = extra_bits[index];
747 dynamic_litlen_distance_extra: {
749 unsigned int dup_len;
751 /* Extract extra bits */
752 extra = deflate_extract ( deflate, in, deflate->extra_bits );
754 deflate->resume = &&dynamic_litlen_distance_extra;
758 /* Store code lengths */
759 dup_len = ( deflate->dup_len + extra );
760 while ( ( deflate->length_index < deflate->length_target ) &&
762 deflate_set_length ( deflate, deflate->length_index++,
766 /* Process next literal/length or distance code
767 * length, if more are required.
769 if ( deflate->length_index < deflate->length_target )
770 goto dynamic_litlen_distance;
772 /* Construct alphabets */
773 goto construct_alphabets;
776 construct_alphabets: {
777 unsigned int distance_offset = deflate->litlen_count;
778 unsigned int distance_count = deflate->distance_count;
781 /* Generate literal/length alphabet */
782 if ( ( rc = deflate_alphabet ( deflate, &deflate->litlen,
783 deflate->litlen_count, 0 ) ) !=0)
786 /* Handle degenerate case of a single distance code
787 * (for which it is impossible to construct a valid,
788 * complete Huffman alphabet). RFC 1951 states:
790 * If only one distance code is used, it is encoded
791 * using one bit, not zero bits; in this case there
792 * is a single code length of one, with one unused
793 * code. One distance code of zero bits means that
794 * there are no distance codes used at all (the data
797 * If we have only a single distance code, then we
798 * instead use two distance codes both with length 1.
799 * This results in a valid Huffman alphabet. The code
800 * "0" will mean distance code 0 (which is either
801 * correct or irrelevant), and the code "1" will mean
802 * distance code 1 (which is always irrelevant).
804 if ( deflate->distance_count == 1 ) {
806 deflate->lengths[0] = 0x11;
811 /* Generate distance alphabet */
812 if ( ( rc = deflate_alphabet ( deflate,
813 &deflate->distance_codelen,
815 distance_offset ) ) != 0 )
825 /* Decode Huffman codes */
828 /* Decode Huffman code */
829 code = deflate_decode ( deflate, in, &deflate->litlen );
831 deflate->resume = &&lzhuf_litlen;
835 /* Handle according to code type */
836 if ( code < DEFLATE_LITLEN_END ) {
838 /* Literal value: copy to output buffer */
840 DBGCP ( deflate, "DEFLATE %p literal %#02x "
841 "('%c')\n", deflate, byte,
842 ( isprint ( byte ) ? byte : '.' ) );
843 deflate_copy ( out, virt_to_user ( &byte ), 0,
846 } else if ( code == DEFLATE_LITLEN_END ) {
853 /* Length code: process extra bits */
854 extra = ( code - DEFLATE_LITLEN_END - 1 );
856 bits = ( extra / 4 );
859 deflate->extra_bits = bits;
861 deflate_litlen_base[extra];
863 deflate->extra_bits = 0;
864 deflate->dup_len = 258;
866 goto lzhuf_litlen_extra;
871 lzhuf_litlen_extra: {
874 /* Extract extra bits */
875 extra = deflate_extract ( deflate, in, deflate->extra_bits );
877 deflate->resume = &&lzhuf_litlen_extra;
881 /* Update duplicate length */
882 deflate->dup_len += extra;
890 /* Decode Huffman code */
891 code = deflate_decode ( deflate, in,
892 &deflate->distance_codelen );
894 deflate->resume = &&lzhuf_distance;
898 /* Process extra bits */
900 bits = ( extra / 2 );
903 deflate->extra_bits = bits;
904 deflate->dup_distance = deflate_distance_base[extra];
907 lzhuf_distance_extra: {
912 /* Extract extra bits */
913 extra = deflate_extract ( deflate, in, deflate->extra_bits );
915 deflate->resume = &&lzhuf_distance_extra;
919 /* Update duplicate distance */
920 dup_distance = ( deflate->dup_distance + extra );
921 dup_len = deflate->dup_len;
922 DBGCP ( deflate, "DEFLATE %p duplicate length %zd distance "
923 "%zd\n", deflate, dup_len, dup_distance );
926 if ( dup_distance > out->offset ) {
927 DBGC ( deflate, "DEFLATE %p bad distance %zd (max "
928 "%zd)\n", deflate, dup_distance, out->offset );
932 /* Copy data, allowing for overlap */
933 deflate_copy ( out, out->data, ( out->offset - dup_distance ),
936 /* Process next literal/length symbol */
942 DBGCP ( deflate, "DEFLATE %p end of block\n", deflate );
944 /* If this was not the final block, process next block header */
945 if ( ! ( deflate->header & ( 1 << DEFLATE_HEADER_BFINAL_BIT ) ))
948 /* Otherwise, process footer (if any) */
949 switch ( deflate->format ) {
950 case DEFLATE_RAW: goto finished;
951 case DEFLATE_ZLIB: goto zlib_footer;
952 default: assert ( 0 );
958 /* Discard any bits up to the next byte boundary */
959 deflate_discard_to_byte ( deflate );
965 /* Accumulate the 32 bits of checksum. We don't check
966 * the value, stop processing immediately afterwards,
967 * and so don't have to worry about the nasty corner
968 * cases involved in calling deflate_extract() to
969 * obtain a full 32 bits.
971 excess = deflate_accumulate ( deflate, in, ZLIB_ADLER32_BITS );
973 deflate->resume = &&zlib_adler32;
977 /* Finish processing */
982 /* Mark as finished and terminate */
983 DBGCP ( deflate, "DEFLATE %p finished\n", deflate );
984 deflate->resume = NULL;
990 * Initialise decompressor
992 * @v deflate Decompressor
993 * @v format Compression format code
995 void deflate_init ( struct deflate *deflate, enum deflate_format format ) {
996 static int global_init_done;
1003 /* Perform global initialisation if required */
1004 if ( ! global_init_done ) {
1006 /* Initialise byte reversal table */
1007 for ( i = 255 ; i ; i-- ) {
1008 for ( bit = 1, byte = 0 ; bit ; bit <<= 1 ) {
1013 deflate_reverse[i] = byte;
1016 /* Initialise literal/length extra bits table */
1018 for ( i = 0 ; i < 28 ; i++ ) {
1022 deflate_litlen_base[i] = base;
1023 base += ( 1 << bits );
1025 assert ( base == 259 ); /* sic */
1027 /* Initialise distance extra bits table */
1029 for ( i = 0 ; i < 30 ; i++ ) {
1033 deflate_distance_base[i] = base;
1034 base += ( 1 << bits );
1036 assert ( base == 32769 );
1038 /* Record global initialisation as complete */
1039 global_init_done = 1;
1042 /* Initialise structure */
1043 memset ( deflate, 0, sizeof ( *deflate ) );
1044 deflate->format = format;