aboutsummaryrefslogtreecommitdiff
path: root/trees.c
diff options
context:
space:
mode:
Diffstat (limited to 'trees.c')
-rw-r--r--trees.c526
1 files changed, 224 insertions, 302 deletions
diff --git a/trees.c b/trees.c
index 5f305c4..8dbdc40 100644
--- a/trees.c
+++ b/trees.c
@@ -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
125local 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
131local 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
128local const static_tree_desc static_d_desc = 134local 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
131local const static_tree_desc static_bl_desc = 137local 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 */
154local 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
138local void tr_static_init OF((void)); 163/* ===========================================================================
139local void init_block OF((deflate_state *s)); 164 * Flush the bit buffer, keeping at most 7 bits in it.
140local void pqdownheap OF((deflate_state *s, ct_data *tree, int k)); 165 */
141local void gen_bitlen OF((deflate_state *s, tree_desc *desc)); 166local void bi_flush(deflate_state *s) {
142local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count)); 167 if (s->bi_valid == 16) {
143local void build_tree OF((deflate_state *s, tree_desc *desc)); 168 put_short(s, s->bi_buf);
144local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code)); 169 s->bi_buf = 0;
145local void send_tree OF((deflate_state *s, ct_data *tree, int max_code)); 170 s->bi_valid = 0;
146local int build_bl_tree OF((deflate_state *s)); 171 } else if (s->bi_valid >= 8) {
147local 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;
149local void compress_block OF((deflate_state *s, const ct_data *ltree, 174 s->bi_valid -= 8;
150 const ct_data *dtree)); 175 }
151local int detect_data_type OF((deflate_state *s)); 176}
152local unsigned bi_reverse OF((unsigned code, int len)); 177
153local void bi_windup OF((deflate_state *s)); 178/* ===========================================================================
154local void bi_flush OF((deflate_state *s)); 179 * Flush the bit buffer and align the output on a byte boundary
180 */
181local 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 */
202local 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
157local void gen_trees_header OF((void)); 234local 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
184local void send_bits OF((deflate_state *s, int value, int length)); 252local void send_bits(deflate_state *s, int value, int length) {
185
186local 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 */
232local void tr_static_init() 294local 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
326void gen_trees_header() 387void 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 */
439local 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 */
379void ZLIB_INTERNAL _tr_init(s) 455void 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 */
407local 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 */
451local void pqdownheap(s, tree, k) 507local 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 */
486local void gen_bitlen(s, desc) 538local 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 */
572local 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 */
615local void build_tree(s, desc) 625local 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 */
703local void scan_tree(s, tree, max_code) 710local 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 */
748local void send_tree(s, tree, max_code) 751local 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 */
799local int build_bl_tree(s) 798local 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 */
834local void send_all_trees(s, lcodes, dcodes, blcodes) 831local 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 */
863void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last) 858void 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 */
887void ZLIB_INTERNAL _tr_flush_bits(s) 878void 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 */
897void ZLIB_INTERNAL _tr_align(s) 886void 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 */
898local 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 */
955local 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 */
912void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last) 986void 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 */
1014int ZLIB_INTERNAL _tr_tally(s, dist, lc) 1084int 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 */
1042local 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 */
1102local 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 */
1136local 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 */
1151local 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 */
1168local 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}