diff options
Diffstat (limited to 'trees.c')
-rw-r--r-- | trees.c | 526 |
1 files changed, 224 insertions, 302 deletions
@@ -122,39 +122,116 @@ struct static_tree_desc_s { | |||
122 | int max_length; /* max bit length for the codes */ | 122 | int max_length; /* max bit length for the codes */ |
123 | }; | 123 | }; |
124 | 124 | ||
125 | local const static_tree_desc static_l_desc = | 125 | #ifdef NO_INIT_GLOBAL_POINTERS |
126 | # define TCONST | ||
127 | #else | ||
128 | # define TCONST const | ||
129 | #endif | ||
130 | |||
131 | local TCONST static_tree_desc static_l_desc = | ||
126 | {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; | 132 | {static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS}; |
127 | 133 | ||
128 | local const static_tree_desc static_d_desc = | 134 | local TCONST static_tree_desc static_d_desc = |
129 | {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; | 135 | {static_dtree, extra_dbits, 0, D_CODES, MAX_BITS}; |
130 | 136 | ||
131 | local const static_tree_desc static_bl_desc = | 137 | local TCONST static_tree_desc static_bl_desc = |
132 | {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; | 138 | {(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS}; |
133 | 139 | ||
134 | /* =========================================================================== | 140 | /* =========================================================================== |
135 | * Local (static) routines in this file. | 141 | * Output a short LSB first on the stream. |
142 | * IN assertion: there is enough room in pendingBuf. | ||
143 | */ | ||
144 | #define put_short(s, w) { \ | ||
145 | put_byte(s, (uch)((w) & 0xff)); \ | ||
146 | put_byte(s, (uch)((ush)(w) >> 8)); \ | ||
147 | } | ||
148 | |||
149 | /* =========================================================================== | ||
150 | * Reverse the first len bits of a code, using straightforward code (a faster | ||
151 | * method would use a table) | ||
152 | * IN assertion: 1 <= len <= 15 | ||
136 | */ | 153 | */ |
154 | local unsigned bi_reverse(unsigned code, int len) { | ||
155 | register unsigned res = 0; | ||
156 | do { | ||
157 | res |= code & 1; | ||
158 | code >>= 1, res <<= 1; | ||
159 | } while (--len > 0); | ||
160 | return res >> 1; | ||
161 | } | ||
137 | 162 | ||
138 | local void tr_static_init OF((void)); | 163 | /* =========================================================================== |
139 | local void init_block OF((deflate_state *s)); | 164 | * Flush the bit buffer, keeping at most 7 bits in it. |
140 | local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); | 165 | */ |
141 | local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); | 166 | local void bi_flush(deflate_state *s) { |
142 | local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); | 167 | if (s->bi_valid == 16) { |
143 | local void build_tree OF((deflate_state *s, tree_desc *desc)); | 168 | put_short(s, s->bi_buf); |
144 | local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); | 169 | s->bi_buf = 0; |
145 | local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); | 170 | s->bi_valid = 0; |
146 | local int build_bl_tree OF((deflate_state *s)); | 171 | } else if (s->bi_valid >= 8) { |
147 | local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes, | 172 | put_byte(s, (Byte)s->bi_buf); |
148 | int blcodes)); | 173 | s->bi_buf >>= 8; |
149 | local void compress_block OF((deflate_state *s, const ct_data *ltree, | 174 | s->bi_valid -= 8; |
150 | const ct_data *dtree)); | 175 | } |
151 | local int detect_data_type OF((deflate_state *s)); | 176 | } |
152 | local unsigned bi_reverse OF((unsigned code, int len)); | 177 | |
153 | local void bi_windup OF((deflate_state *s)); | 178 | /* =========================================================================== |
154 | local void bi_flush OF((deflate_state *s)); | 179 | * Flush the bit buffer and align the output on a byte boundary |
180 | */ | ||
181 | local void bi_windup(deflate_state *s) { | ||
182 | if (s->bi_valid > 8) { | ||
183 | put_short(s, s->bi_buf); | ||
184 | } else if (s->bi_valid > 0) { | ||
185 | put_byte(s, (Byte)s->bi_buf); | ||
186 | } | ||
187 | s->bi_buf = 0; | ||
188 | s->bi_valid = 0; | ||
189 | #ifdef ZLIB_DEBUG | ||
190 | s->bits_sent = (s->bits_sent + 7) & ~7; | ||
191 | #endif | ||
192 | } | ||
193 | |||
194 | /* =========================================================================== | ||
195 | * Generate the codes for a given tree and bit counts (which need not be | ||
196 | * optimal). | ||
197 | * IN assertion: the array bl_count contains the bit length statistics for | ||
198 | * the given tree and the field len is set for all tree elements. | ||
199 | * OUT assertion: the field code is set for all tree elements of non | ||
200 | * zero code length. | ||
201 | */ | ||
202 | local void gen_codes(ct_data *tree, int max_code, ushf *bl_count) { | ||
203 | ush next_code[MAX_BITS+1]; /* next code value for each bit length */ | ||
204 | unsigned code = 0; /* running code value */ | ||
205 | int bits; /* bit index */ | ||
206 | int n; /* code index */ | ||
207 | |||
208 | /* The distribution counts are first used to generate the code values | ||
209 | * without bit reversal. | ||
210 | */ | ||
211 | for (bits = 1; bits <= MAX_BITS; bits++) { | ||
212 | code = (code + bl_count[bits - 1]) << 1; | ||
213 | next_code[bits] = (ush)code; | ||
214 | } | ||
215 | /* Check that the bit counts in bl_count are consistent. The last code | ||
216 | * must be all ones. | ||
217 | */ | ||
218 | Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, | ||
219 | "inconsistent bit counts"); | ||
220 | Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); | ||
221 | |||
222 | for (n = 0; n <= max_code; n++) { | ||
223 | int len = tree[n].Len; | ||
224 | if (len == 0) continue; | ||
225 | /* Now reverse the bits */ | ||
226 | tree[n].Code = (ush)bi_reverse(next_code[len]++, len); | ||
227 | |||
228 | Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", | ||
229 | n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1)); | ||
230 | } | ||
231 | } | ||
155 | 232 | ||
156 | #ifdef GEN_TREES_H | 233 | #ifdef GEN_TREES_H |
157 | local void gen_trees_header OF((void)); | 234 | local void gen_trees_header(void); |
158 | #endif | 235 | #endif |
159 | 236 | ||
160 | #ifndef ZLIB_DEBUG | 237 | #ifndef ZLIB_DEBUG |
@@ -168,26 +245,11 @@ local void gen_trees_header OF((void)); | |||
168 | #endif | 245 | #endif |
169 | 246 | ||
170 | /* =========================================================================== | 247 | /* =========================================================================== |
171 | * Output a short LSB first on the stream. | ||
172 | * IN assertion: there is enough room in pendingBuf. | ||
173 | */ | ||
174 | #define put_short(s, w) { \ | ||
175 | put_byte(s, (uch)((w) & 0xff)); \ | ||
176 | put_byte(s, (uch)((ush)(w) >> 8)); \ | ||
177 | } | ||
178 | |||
179 | /* =========================================================================== | ||
180 | * Send a value on a given number of bits. | 248 | * Send a value on a given number of bits. |
181 | * IN assertion: length <= 16 and value fits in length bits. | 249 | * IN assertion: length <= 16 and value fits in length bits. |
182 | */ | 250 | */ |
183 | #ifdef ZLIB_DEBUG | 251 | #ifdef ZLIB_DEBUG |
184 | local void send_bits OF((deflate_state *s, int value, int length)); | 252 | local void send_bits(deflate_state *s, int value, int length) { |
185 | |||
186 | local void send_bits(s, value, length) | ||
187 | deflate_state *s; | ||
188 | int value; /* value to send */ | ||
189 | int length; /* number of bits */ | ||
190 | { | ||
191 | Tracevv((stderr," l %2d v %4x ", length, value)); | 253 | Tracevv((stderr," l %2d v %4x ", length, value)); |
192 | Assert(length > 0 && length <= 15, "invalid length"); | 254 | Assert(length > 0 && length <= 15, "invalid length"); |
193 | s->bits_sent += (ulg)length; | 255 | s->bits_sent += (ulg)length; |
@@ -229,8 +291,7 @@ local void send_bits(s, value, length) | |||
229 | /* =========================================================================== | 291 | /* =========================================================================== |
230 | * Initialize the various 'constant' tables. | 292 | * Initialize the various 'constant' tables. |
231 | */ | 293 | */ |
232 | local void tr_static_init() | 294 | local void tr_static_init(void) { |
233 | { | ||
234 | #if defined(GEN_TREES_H) || !defined(STDC) | 295 | #if defined(GEN_TREES_H) || !defined(STDC) |
235 | static int static_init_done = 0; | 296 | static int static_init_done = 0; |
236 | int n; /* iterates over tree elements */ | 297 | int n; /* iterates over tree elements */ |
@@ -323,8 +384,7 @@ local void tr_static_init() | |||
323 | ((i) == (last)? "\n};\n\n" : \ | 384 | ((i) == (last)? "\n};\n\n" : \ |
324 | ((i) % (width) == (width) - 1 ? ",\n" : ", ")) | 385 | ((i) % (width) == (width) - 1 ? ",\n" : ", ")) |
325 | 386 | ||
326 | void gen_trees_header() | 387 | void gen_trees_header(void) { |
327 | { | ||
328 | FILE *header = fopen("trees.h", "w"); | 388 | FILE *header = fopen("trees.h", "w"); |
329 | int i; | 389 | int i; |
330 | 390 | ||
@@ -374,11 +434,25 @@ void gen_trees_header() | |||
374 | #endif /* GEN_TREES_H */ | 434 | #endif /* GEN_TREES_H */ |
375 | 435 | ||
376 | /* =========================================================================== | 436 | /* =========================================================================== |
437 | * Initialize a new block. | ||
438 | */ | ||
439 | local void init_block(deflate_state *s) { | ||
440 | int n; /* iterates over tree elements */ | ||
441 | |||
442 | /* Initialize the trees. */ | ||
443 | for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; | ||
444 | for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; | ||
445 | for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; | ||
446 | |||
447 | s->dyn_ltree[END_BLOCK].Freq = 1; | ||
448 | s->opt_len = s->static_len = 0L; | ||
449 | s->sym_next = s->matches = 0; | ||
450 | } | ||
451 | |||
452 | /* =========================================================================== | ||
377 | * Initialize the tree data structures for a new zlib stream. | 453 | * Initialize the tree data structures for a new zlib stream. |
378 | */ | 454 | */ |
379 | void ZLIB_INTERNAL _tr_init(s) | 455 | void ZLIB_INTERNAL _tr_init(deflate_state *s) { |
380 | deflate_state *s; | ||
381 | { | ||
382 | tr_static_init(); | 456 | tr_static_init(); |
383 | 457 | ||
384 | s->l_desc.dyn_tree = s->dyn_ltree; | 458 | s->l_desc.dyn_tree = s->dyn_ltree; |
@@ -401,24 +475,6 @@ void ZLIB_INTERNAL _tr_init(s) | |||
401 | init_block(s); | 475 | init_block(s); |
402 | } | 476 | } |
403 | 477 | ||
404 | /* =========================================================================== | ||
405 | * Initialize a new block. | ||
406 | */ | ||
407 | local void init_block(s) | ||
408 | deflate_state *s; | ||
409 | { | ||
410 | int n; /* iterates over tree elements */ | ||
411 | |||
412 | /* Initialize the trees. */ | ||
413 | for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0; | ||
414 | for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0; | ||
415 | for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0; | ||
416 | |||
417 | s->dyn_ltree[END_BLOCK].Freq = 1; | ||
418 | s->opt_len = s->static_len = 0L; | ||
419 | s->sym_next = s->matches = 0; | ||
420 | } | ||
421 | |||
422 | #define SMALLEST 1 | 478 | #define SMALLEST 1 |
423 | /* Index within the heap array of least frequent node in the Huffman tree */ | 479 | /* Index within the heap array of least frequent node in the Huffman tree */ |
424 | 480 | ||
@@ -448,11 +504,7 @@ local void init_block(s) | |||
448 | * when the heap property is re-established (each father smaller than its | 504 | * when the heap property is re-established (each father smaller than its |
449 | * two sons). | 505 | * two sons). |
450 | */ | 506 | */ |
451 | local void pqdownheap(s, tree, k) | 507 | local void pqdownheap(deflate_state *s, ct_data *tree, int k) { |
452 | deflate_state *s; | ||
453 | ct_data *tree; /* the tree to restore */ | ||
454 | int k; /* node to move down */ | ||
455 | { | ||
456 | int v = s->heap[k]; | 508 | int v = s->heap[k]; |
457 | int j = k << 1; /* left son of k */ | 509 | int j = k << 1; /* left son of k */ |
458 | while (j <= s->heap_len) { | 510 | while (j <= s->heap_len) { |
@@ -483,10 +535,7 @@ local void pqdownheap(s, tree, k) | |||
483 | * The length opt_len is updated; static_len is also updated if stree is | 535 | * The length opt_len is updated; static_len is also updated if stree is |
484 | * not null. | 536 | * not null. |
485 | */ | 537 | */ |
486 | local void gen_bitlen(s, desc) | 538 | local void gen_bitlen(deflate_state *s, tree_desc *desc) { |
487 | deflate_state *s; | ||
488 | tree_desc *desc; /* the tree descriptor */ | ||
489 | { | ||
490 | ct_data *tree = desc->dyn_tree; | 539 | ct_data *tree = desc->dyn_tree; |
491 | int max_code = desc->max_code; | 540 | int max_code = desc->max_code; |
492 | const ct_data *stree = desc->stat_desc->static_tree; | 541 | const ct_data *stree = desc->stat_desc->static_tree; |
@@ -561,48 +610,9 @@ local void gen_bitlen(s, desc) | |||
561 | } | 610 | } |
562 | } | 611 | } |
563 | 612 | ||
564 | /* =========================================================================== | 613 | #ifdef DUMP_BL_TREE |
565 | * Generate the codes for a given tree and bit counts (which need not be | 614 | # include <stdio.h> |
566 | * optimal). | 615 | #endif |
567 | * IN assertion: the array bl_count contains the bit length statistics for | ||
568 | * the given tree and the field len is set for all tree elements. | ||
569 | * OUT assertion: the field code is set for all tree elements of non | ||
570 | * zero code length. | ||
571 | */ | ||
572 | local void gen_codes(tree, max_code, bl_count) | ||
573 | ct_data *tree; /* the tree to decorate */ | ||
574 | int max_code; /* largest code with non zero frequency */ | ||
575 | ushf *bl_count; /* number of codes at each bit length */ | ||
576 | { | ||
577 | ush next_code[MAX_BITS+1]; /* next code value for each bit length */ | ||
578 | unsigned code = 0; /* running code value */ | ||
579 | int bits; /* bit index */ | ||
580 | int n; /* code index */ | ||
581 | |||
582 | /* The distribution counts are first used to generate the code values | ||
583 | * without bit reversal. | ||
584 | */ | ||
585 | for (bits = 1; bits <= MAX_BITS; bits++) { | ||
586 | code = (code + bl_count[bits - 1]) << 1; | ||
587 | next_code[bits] = (ush)code; | ||
588 | } | ||
589 | /* Check that the bit counts in bl_count are consistent. The last code | ||
590 | * must be all ones. | ||
591 | */ | ||
592 | Assert (code + bl_count[MAX_BITS] - 1 == (1 << MAX_BITS) - 1, | ||
593 | "inconsistent bit counts"); | ||
594 | Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); | ||
595 | |||
596 | for (n = 0; n <= max_code; n++) { | ||
597 | int len = tree[n].Len; | ||
598 | if (len == 0) continue; | ||
599 | /* Now reverse the bits */ | ||
600 | tree[n].Code = (ush)bi_reverse(next_code[len]++, len); | ||
601 | |||
602 | Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", | ||
603 | n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len] - 1)); | ||
604 | } | ||
605 | } | ||
606 | 616 | ||
607 | /* =========================================================================== | 617 | /* =========================================================================== |
608 | * Construct one Huffman tree and assigns the code bit strings and lengths. | 618 | * Construct one Huffman tree and assigns the code bit strings and lengths. |
@@ -612,10 +622,7 @@ local void gen_codes(tree, max_code, bl_count) | |||
612 | * and corresponding code. The length opt_len is updated; static_len is | 622 | * and corresponding code. The length opt_len is updated; static_len is |
613 | * also updated if stree is not null. The field max_code is set. | 623 | * also updated if stree is not null. The field max_code is set. |
614 | */ | 624 | */ |
615 | local void build_tree(s, desc) | 625 | local void build_tree(deflate_state *s, tree_desc *desc) { |
616 | deflate_state *s; | ||
617 | tree_desc *desc; /* the tree descriptor */ | ||
618 | { | ||
619 | ct_data *tree = desc->dyn_tree; | 626 | ct_data *tree = desc->dyn_tree; |
620 | const ct_data *stree = desc->stat_desc->static_tree; | 627 | const ct_data *stree = desc->stat_desc->static_tree; |
621 | int elems = desc->stat_desc->elems; | 628 | int elems = desc->stat_desc->elems; |
@@ -700,11 +707,7 @@ local void build_tree(s, desc) | |||
700 | * Scan a literal or distance tree to determine the frequencies of the codes | 707 | * Scan a literal or distance tree to determine the frequencies of the codes |
701 | * in the bit length tree. | 708 | * in the bit length tree. |
702 | */ | 709 | */ |
703 | local void scan_tree(s, tree, max_code) | 710 | local void scan_tree(deflate_state *s, ct_data *tree, int max_code) { |
704 | deflate_state *s; | ||
705 | ct_data *tree; /* the tree to be scanned */ | ||
706 | int max_code; /* and its largest code of non zero frequency */ | ||
707 | { | ||
708 | int n; /* iterates over all tree elements */ | 711 | int n; /* iterates over all tree elements */ |
709 | int prevlen = -1; /* last emitted length */ | 712 | int prevlen = -1; /* last emitted length */ |
710 | int curlen; /* length of current code */ | 713 | int curlen; /* length of current code */ |
@@ -745,11 +748,7 @@ local void scan_tree(s, tree, max_code) | |||
745 | * Send a literal or distance tree in compressed form, using the codes in | 748 | * Send a literal or distance tree in compressed form, using the codes in |
746 | * bl_tree. | 749 | * bl_tree. |
747 | */ | 750 | */ |
748 | local void send_tree(s, tree, max_code) | 751 | local void send_tree(deflate_state *s, ct_data *tree, int max_code) { |
749 | deflate_state *s; | ||
750 | ct_data *tree; /* the tree to be scanned */ | ||
751 | int max_code; /* and its largest code of non zero frequency */ | ||
752 | { | ||
753 | int n; /* iterates over all tree elements */ | 752 | int n; /* iterates over all tree elements */ |
754 | int prevlen = -1; /* last emitted length */ | 753 | int prevlen = -1; /* last emitted length */ |
755 | int curlen; /* length of current code */ | 754 | int curlen; /* length of current code */ |
@@ -796,9 +795,7 @@ local void send_tree(s, tree, max_code) | |||
796 | * Construct the Huffman tree for the bit lengths and return the index in | 795 | * Construct the Huffman tree for the bit lengths and return the index in |
797 | * bl_order of the last bit length code to send. | 796 | * bl_order of the last bit length code to send. |
798 | */ | 797 | */ |
799 | local int build_bl_tree(s) | 798 | local int build_bl_tree(deflate_state *s) { |
800 | deflate_state *s; | ||
801 | { | ||
802 | int max_blindex; /* index of last bit length code of non zero freq */ | 799 | int max_blindex; /* index of last bit length code of non zero freq */ |
803 | 800 | ||
804 | /* Determine the bit length frequencies for literal and distance trees */ | 801 | /* Determine the bit length frequencies for literal and distance trees */ |
@@ -831,10 +828,8 @@ local int build_bl_tree(s) | |||
831 | * lengths of the bit length codes, the literal tree and the distance tree. | 828 | * lengths of the bit length codes, the literal tree and the distance tree. |
832 | * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. | 829 | * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. |
833 | */ | 830 | */ |
834 | local void send_all_trees(s, lcodes, dcodes, blcodes) | 831 | local void send_all_trees(deflate_state *s, int lcodes, int dcodes, |
835 | deflate_state *s; | 832 | int blcodes) { |
836 | int lcodes, dcodes, blcodes; /* number of codes for each tree */ | ||
837 | { | ||
838 | int rank; /* index in bl_order */ | 833 | int rank; /* index in bl_order */ |
839 | 834 | ||
840 | Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); | 835 | Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); |
@@ -860,12 +855,8 @@ local void send_all_trees(s, lcodes, dcodes, blcodes) | |||
860 | /* =========================================================================== | 855 | /* =========================================================================== |
861 | * Send a stored block | 856 | * Send a stored block |
862 | */ | 857 | */ |
863 | void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) | 858 | void ZLIB_INTERNAL _tr_stored_block(deflate_state *s, charf *buf, |
864 | deflate_state *s; | 859 | ulg stored_len, int last) { |
865 | charf *buf; /* input block */ | ||
866 | ulg stored_len; /* length of input block */ | ||
867 | int last; /* one if this is the last block for a file */ | ||
868 | { | ||
869 | send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */ | 860 | send_bits(s, (STORED_BLOCK<<1) + last, 3); /* send block type */ |
870 | bi_windup(s); /* align on byte boundary */ | 861 | bi_windup(s); /* align on byte boundary */ |
871 | put_short(s, (ush)stored_len); | 862 | put_short(s, (ush)stored_len); |
@@ -884,9 +875,7 @@ void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) | |||
884 | /* =========================================================================== | 875 | /* =========================================================================== |
885 | * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) | 876 | * Flush the bits in the bit buffer to pending output (leaves at most 7 bits) |
886 | */ | 877 | */ |
887 | void ZLIB_INTERNAL _tr_flush_bits(s) | 878 | void ZLIB_INTERNAL _tr_flush_bits(deflate_state *s) { |
888 | deflate_state *s; | ||
889 | { | ||
890 | bi_flush(s); | 879 | bi_flush(s); |
891 | } | 880 | } |
892 | 881 | ||
@@ -894,9 +883,7 @@ void ZLIB_INTERNAL _tr_flush_bits(s) | |||
894 | * Send one empty static block to give enough lookahead for inflate. | 883 | * Send one empty static block to give enough lookahead for inflate. |
895 | * This takes 10 bits, of which 7 may remain in the bit buffer. | 884 | * This takes 10 bits, of which 7 may remain in the bit buffer. |
896 | */ | 885 | */ |
897 | void ZLIB_INTERNAL _tr_align(s) | 886 | void ZLIB_INTERNAL _tr_align(deflate_state *s) { |
898 | deflate_state *s; | ||
899 | { | ||
900 | send_bits(s, STATIC_TREES<<1, 3); | 887 | send_bits(s, STATIC_TREES<<1, 3); |
901 | send_code(s, END_BLOCK, static_ltree); | 888 | send_code(s, END_BLOCK, static_ltree); |
902 | #ifdef ZLIB_DEBUG | 889 | #ifdef ZLIB_DEBUG |
@@ -906,15 +893,98 @@ void ZLIB_INTERNAL _tr_align(s) | |||
906 | } | 893 | } |
907 | 894 | ||
908 | /* =========================================================================== | 895 | /* =========================================================================== |
896 | * Send the block data compressed using the given Huffman trees | ||
897 | */ | ||
898 | local void compress_block(deflate_state *s, const ct_data *ltree, | ||
899 | const ct_data *dtree) { | ||
900 | unsigned dist; /* distance of matched string */ | ||
901 | int lc; /* match length or unmatched char (if dist == 0) */ | ||
902 | unsigned sx = 0; /* running index in sym_buf */ | ||
903 | unsigned code; /* the code to send */ | ||
904 | int extra; /* number of extra bits to send */ | ||
905 | |||
906 | if (s->sym_next != 0) do { | ||
907 | dist = s->sym_buf[sx++] & 0xff; | ||
908 | dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; | ||
909 | lc = s->sym_buf[sx++]; | ||
910 | if (dist == 0) { | ||
911 | send_code(s, lc, ltree); /* send a literal byte */ | ||
912 | Tracecv(isgraph(lc), (stderr," '%c' ", lc)); | ||
913 | } else { | ||
914 | /* Here, lc is the match length - MIN_MATCH */ | ||
915 | code = _length_code[lc]; | ||
916 | send_code(s, code + LITERALS + 1, ltree); /* send length code */ | ||
917 | extra = extra_lbits[code]; | ||
918 | if (extra != 0) { | ||
919 | lc -= base_length[code]; | ||
920 | send_bits(s, lc, extra); /* send the extra length bits */ | ||
921 | } | ||
922 | dist--; /* dist is now the match distance - 1 */ | ||
923 | code = d_code(dist); | ||
924 | Assert (code < D_CODES, "bad d_code"); | ||
925 | |||
926 | send_code(s, code, dtree); /* send the distance code */ | ||
927 | extra = extra_dbits[code]; | ||
928 | if (extra != 0) { | ||
929 | dist -= (unsigned)base_dist[code]; | ||
930 | send_bits(s, dist, extra); /* send the extra distance bits */ | ||
931 | } | ||
932 | } /* literal or match pair ? */ | ||
933 | |||
934 | /* Check that the overlay between pending_buf and sym_buf is ok: */ | ||
935 | Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); | ||
936 | |||
937 | } while (sx < s->sym_next); | ||
938 | |||
939 | send_code(s, END_BLOCK, ltree); | ||
940 | } | ||
941 | |||
942 | /* =========================================================================== | ||
943 | * Check if the data type is TEXT or BINARY, using the following algorithm: | ||
944 | * - TEXT if the two conditions below are satisfied: | ||
945 | * a) There are no non-portable control characters belonging to the | ||
946 | * "block list" (0..6, 14..25, 28..31). | ||
947 | * b) There is at least one printable character belonging to the | ||
948 | * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). | ||
949 | * - BINARY otherwise. | ||
950 | * - The following partially-portable control characters form a | ||
951 | * "gray list" that is ignored in this detection algorithm: | ||
952 | * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). | ||
953 | * IN assertion: the fields Freq of dyn_ltree are set. | ||
954 | */ | ||
955 | local int detect_data_type(deflate_state *s) { | ||
956 | /* block_mask is the bit mask of block-listed bytes | ||
957 | * set bits 0..6, 14..25, and 28..31 | ||
958 | * 0xf3ffc07f = binary 11110011111111111100000001111111 | ||
959 | */ | ||
960 | unsigned long block_mask = 0xf3ffc07fUL; | ||
961 | int n; | ||
962 | |||
963 | /* Check for non-textual ("block-listed") bytes. */ | ||
964 | for (n = 0; n <= 31; n++, block_mask >>= 1) | ||
965 | if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0)) | ||
966 | return Z_BINARY; | ||
967 | |||
968 | /* Check for textual ("allow-listed") bytes. */ | ||
969 | if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 | ||
970 | || s->dyn_ltree[13].Freq != 0) | ||
971 | return Z_TEXT; | ||
972 | for (n = 32; n < LITERALS; n++) | ||
973 | if (s->dyn_ltree[n].Freq != 0) | ||
974 | return Z_TEXT; | ||
975 | |||
976 | /* There are no "block-listed" or "allow-listed" bytes: | ||
977 | * this stream either is empty or has tolerated ("gray-listed") bytes only. | ||
978 | */ | ||
979 | return Z_BINARY; | ||
980 | } | ||
981 | |||
982 | /* =========================================================================== | ||
909 | * Determine the best encoding for the current block: dynamic trees, static | 983 | * Determine the best encoding for the current block: dynamic trees, static |
910 | * trees or store, and write out the encoded block. | 984 | * trees or store, and write out the encoded block. |
911 | */ | 985 | */ |
912 | void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) | 986 | void ZLIB_INTERNAL _tr_flush_block(deflate_state *s, charf *buf, |
913 | deflate_state *s; | 987 | ulg stored_len, int last) { |
914 | charf *buf; /* input block, or NULL if too old */ | ||
915 | ulg stored_len; /* length of input block */ | ||
916 | int last; /* one if this is the last block for a file */ | ||
917 | { | ||
918 | ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ | 988 | ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */ |
919 | int max_blindex = 0; /* index of last bit length code of non zero freq */ | 989 | int max_blindex = 0; /* index of last bit length code of non zero freq */ |
920 | 990 | ||
@@ -1011,11 +1081,7 @@ void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) | |||
1011 | * Save the match info and tally the frequency counts. Return true if | 1081 | * Save the match info and tally the frequency counts. Return true if |
1012 | * the current block must be flushed. | 1082 | * the current block must be flushed. |
1013 | */ | 1083 | */ |
1014 | int ZLIB_INTERNAL _tr_tally(s, dist, lc) | 1084 | int ZLIB_INTERNAL _tr_tally(deflate_state *s, unsigned dist, unsigned lc) { |
1015 | deflate_state *s; | ||
1016 | unsigned dist; /* distance of matched string */ | ||
1017 | unsigned lc; /* match length - MIN_MATCH or unmatched char (dist==0) */ | ||
1018 | { | ||
1019 | s->sym_buf[s->sym_next++] = (uch)dist; | 1085 | s->sym_buf[s->sym_next++] = (uch)dist; |
1020 | s->sym_buf[s->sym_next++] = (uch)(dist >> 8); | 1086 | s->sym_buf[s->sym_next++] = (uch)(dist >> 8); |
1021 | s->sym_buf[s->sym_next++] = (uch)lc; | 1087 | s->sym_buf[s->sym_next++] = (uch)lc; |
@@ -1035,147 +1101,3 @@ int ZLIB_INTERNAL _tr_tally(s, dist, lc) | |||
1035 | } | 1101 | } |
1036 | return (s->sym_next == s->sym_end); | 1102 | return (s->sym_next == s->sym_end); |
1037 | } | 1103 | } |
1038 | |||
1039 | /* =========================================================================== | ||
1040 | * Send the block data compressed using the given Huffman trees | ||
1041 | */ | ||
1042 | local void compress_block(s, ltree, dtree) | ||
1043 | deflate_state *s; | ||
1044 | const ct_data *ltree; /* literal tree */ | ||
1045 | const ct_data *dtree; /* distance tree */ | ||
1046 | { | ||
1047 | unsigned dist; /* distance of matched string */ | ||
1048 | int lc; /* match length or unmatched char (if dist == 0) */ | ||
1049 | unsigned sx = 0; /* running index in sym_buf */ | ||
1050 | unsigned code; /* the code to send */ | ||
1051 | int extra; /* number of extra bits to send */ | ||
1052 | |||
1053 | if (s->sym_next != 0) do { | ||
1054 | dist = s->sym_buf[sx++] & 0xff; | ||
1055 | dist += (unsigned)(s->sym_buf[sx++] & 0xff) << 8; | ||
1056 | lc = s->sym_buf[sx++]; | ||
1057 | if (dist == 0) { | ||
1058 | send_code(s, lc, ltree); /* send a literal byte */ | ||
1059 | Tracecv(isgraph(lc), (stderr," '%c' ", lc)); | ||
1060 | } else { | ||
1061 | /* Here, lc is the match length - MIN_MATCH */ | ||
1062 | code = _length_code[lc]; | ||
1063 | send_code(s, code + LITERALS + 1, ltree); /* send length code */ | ||
1064 | extra = extra_lbits[code]; | ||
1065 | if (extra != 0) { | ||
1066 | lc -= base_length[code]; | ||
1067 | send_bits(s, lc, extra); /* send the extra length bits */ | ||
1068 | } | ||
1069 | dist--; /* dist is now the match distance - 1 */ | ||
1070 | code = d_code(dist); | ||
1071 | Assert (code < D_CODES, "bad d_code"); | ||
1072 | |||
1073 | send_code(s, code, dtree); /* send the distance code */ | ||
1074 | extra = extra_dbits[code]; | ||
1075 | if (extra != 0) { | ||
1076 | dist -= (unsigned)base_dist[code]; | ||
1077 | send_bits(s, dist, extra); /* send the extra distance bits */ | ||
1078 | } | ||
1079 | } /* literal or match pair ? */ | ||
1080 | |||
1081 | /* Check that the overlay between pending_buf and sym_buf is ok: */ | ||
1082 | Assert(s->pending < s->lit_bufsize + sx, "pendingBuf overflow"); | ||
1083 | |||
1084 | } while (sx < s->sym_next); | ||
1085 | |||
1086 | send_code(s, END_BLOCK, ltree); | ||
1087 | } | ||
1088 | |||
1089 | /* =========================================================================== | ||
1090 | * Check if the data type is TEXT or BINARY, using the following algorithm: | ||
1091 | * - TEXT if the two conditions below are satisfied: | ||
1092 | * a) There are no non-portable control characters belonging to the | ||
1093 | * "block list" (0..6, 14..25, 28..31). | ||
1094 | * b) There is at least one printable character belonging to the | ||
1095 | * "allow list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). | ||
1096 | * - BINARY otherwise. | ||
1097 | * - The following partially-portable control characters form a | ||
1098 | * "gray list" that is ignored in this detection algorithm: | ||
1099 | * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). | ||
1100 | * IN assertion: the fields Freq of dyn_ltree are set. | ||
1101 | */ | ||
1102 | local int detect_data_type(s) | ||
1103 | deflate_state *s; | ||
1104 | { | ||
1105 | /* block_mask is the bit mask of block-listed bytes | ||
1106 | * set bits 0..6, 14..25, and 28..31 | ||
1107 | * 0xf3ffc07f = binary 11110011111111111100000001111111 | ||
1108 | */ | ||
1109 | unsigned long block_mask = 0xf3ffc07fUL; | ||
1110 | int n; | ||
1111 | |||
1112 | /* Check for non-textual ("block-listed") bytes. */ | ||
1113 | for (n = 0; n <= 31; n++, block_mask >>= 1) | ||
1114 | if ((block_mask & 1) && (s->dyn_ltree[n].Freq != 0)) | ||
1115 | return Z_BINARY; | ||
1116 | |||
1117 | /* Check for textual ("allow-listed") bytes. */ | ||
1118 | if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0 | ||
1119 | || s->dyn_ltree[13].Freq != 0) | ||
1120 | return Z_TEXT; | ||
1121 | for (n = 32; n < LITERALS; n++) | ||
1122 | if (s->dyn_ltree[n].Freq != 0) | ||
1123 | return Z_TEXT; | ||
1124 | |||
1125 | /* There are no "block-listed" or "allow-listed" bytes: | ||
1126 | * this stream either is empty or has tolerated ("gray-listed") bytes only. | ||
1127 | */ | ||
1128 | return Z_BINARY; | ||
1129 | } | ||
1130 | |||
1131 | /* =========================================================================== | ||
1132 | * Reverse the first len bits of a code, using straightforward code (a faster | ||
1133 | * method would use a table) | ||
1134 | * IN assertion: 1 <= len <= 15 | ||
1135 | */ | ||
1136 | local unsigned bi_reverse(code, len) | ||
1137 | unsigned code; /* the value to invert */ | ||
1138 | int len; /* its bit length */ | ||
1139 | { | ||
1140 | register unsigned res = 0; | ||
1141 | do { | ||
1142 | res |= code & 1; | ||
1143 | code >>= 1, res <<= 1; | ||
1144 | } while (--len > 0); | ||
1145 | return res >> 1; | ||
1146 | } | ||
1147 | |||
1148 | /* =========================================================================== | ||
1149 | * Flush the bit buffer, keeping at most 7 bits in it. | ||
1150 | */ | ||
1151 | local void bi_flush(s) | ||
1152 | deflate_state *s; | ||
1153 | { | ||
1154 | if (s->bi_valid == 16) { | ||
1155 | put_short(s, s->bi_buf); | ||
1156 | s->bi_buf = 0; | ||
1157 | s->bi_valid = 0; | ||
1158 | } else if (s->bi_valid >= 8) { | ||
1159 | put_byte(s, (Byte)s->bi_buf); | ||
1160 | s->bi_buf >>= 8; | ||
1161 | s->bi_valid -= 8; | ||
1162 | } | ||
1163 | } | ||
1164 | |||
1165 | /* =========================================================================== | ||
1166 | * Flush the bit buffer and align the output on a byte boundary | ||
1167 | */ | ||
1168 | local void bi_windup(s) | ||
1169 | deflate_state *s; | ||
1170 | { | ||
1171 | if (s->bi_valid > 8) { | ||
1172 | put_short(s, s->bi_buf); | ||
1173 | } else if (s->bi_valid > 0) { | ||
1174 | put_byte(s, (Byte)s->bi_buf); | ||
1175 | } | ||
1176 | s->bi_buf = 0; | ||
1177 | s->bi_valid = 0; | ||
1178 | #ifdef ZLIB_DEBUG | ||
1179 | s->bits_sent = (s->bits_sent + 7) & ~7; | ||
1180 | #endif | ||
1181 | } | ||