2005-04-17 02:20:36 +04:00
/* +++ trees.c */
/* trees.c -- output deflated data using Huffman coding
* Copyright ( C ) 1995 - 1996 Jean - loup Gailly
* For conditions of distribution and use , see copyright notice in zlib . h
*/
/*
* ALGORITHM
*
* The " deflation " process uses several Huffman trees . The more
* common source values are represented by shorter bit sequences .
*
* Each code tree is stored in a compressed form which is itself
* a Huffman encoding of the lengths of all the code strings ( in
* ascending order by source values ) . The actual code strings are
* reconstructed from the lengths in the inflate process , as described
* in the deflate specification .
*
* REFERENCES
*
* Deutsch , L . P . , " 'Deflate' Compressed Data Format Specification " .
* Available in ftp . uu . net : / pub / archiving / zip / doc / deflate - 1.1 . doc
*
* Storer , James A .
* Data Compression : Methods and Theory , pp . 49 - 50.
* Computer Science Press , 1988. ISBN 0 - 7167 - 8156 - 5.
*
* Sedgewick , R .
* Algorithms , p290 .
* Addison - Wesley , 1983. ISBN 0 - 201 - 06672 - 6.
*/
/* From: trees.c,v 1.11 1996/07/24 13:41:06 me Exp $ */
/* #include "deflate.h" */
# include <linux/zutil.h>
2015-09-10 01:39:18 +03:00
# include <linux/bitrev.h>
2005-04-17 02:20:36 +04:00
# include "defutil.h"
# ifdef DEBUG_ZLIB
# include <ctype.h>
# endif
/* ===========================================================================
* Constants
*/
# define MAX_BL_BITS 7
/* Bit length codes must not exceed MAX_BL_BITS bits */
# define END_BLOCK 256
/* end of block literal code */
# define REP_3_6 16
/* repeat previous bit length 3-6 times (2 bits of repeat count) */
# define REPZ_3_10 17
/* repeat a zero length 3-10 times (3 bits of repeat count) */
# define REPZ_11_138 18
/* repeat a zero length 11-138 times (7 bits of repeat count) */
static const int extra_lbits [ LENGTH_CODES ] /* extra bits for each length code */
= { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 2 , 2 , 2 , 2 , 3 , 3 , 3 , 3 , 4 , 4 , 4 , 4 , 5 , 5 , 5 , 5 , 0 } ;
static const int extra_dbits [ D_CODES ] /* extra bits for each distance code */
= { 0 , 0 , 0 , 0 , 1 , 1 , 2 , 2 , 3 , 3 , 4 , 4 , 5 , 5 , 6 , 6 , 7 , 7 , 8 , 8 , 9 , 9 , 10 , 10 , 11 , 11 , 12 , 12 , 13 , 13 } ;
static const int extra_blbits [ BL_CODES ] /* extra bits for each bit length code */
= { 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 3 , 7 } ;
static const uch bl_order [ BL_CODES ]
= { 16 , 17 , 18 , 0 , 8 , 7 , 9 , 6 , 10 , 5 , 11 , 4 , 12 , 3 , 13 , 2 , 14 , 1 , 15 } ;
/* The lengths of the bit length codes are sent in order of decreasing
* probability , to avoid transmitting the lengths for unused bit length codes .
*/
/* ===========================================================================
* Local data . These are initialized only once .
*/
static ct_data static_ltree [ L_CODES + 2 ] ;
/* The static literal tree. Since the bit lengths are imposed, there is no
* need for the L_CODES extra codes used during heap construction . However
* The codes 286 and 287 are needed to build a canonical tree ( see zlib_tr_init
* below ) .
*/
static ct_data static_dtree [ D_CODES ] ;
/* The static distance tree. (Actually a trivial tree since all codes use
* 5 bits . )
*/
static uch dist_code [ 512 ] ;
/* distance codes. The first 256 values correspond to the distances
* 3 . . 258 , the last 256 values correspond to the top 8 bits of
* the 15 bit distances .
*/
static uch length_code [ MAX_MATCH - MIN_MATCH + 1 ] ;
/* length code for each normalized match length (0 == MIN_MATCH) */
static int base_length [ LENGTH_CODES ] ;
/* First normalized length for each code (0 = MIN_MATCH) */
static int base_dist [ D_CODES ] ;
/* First normalized distance for each code (0 = distance of 1) */
struct static_tree_desc_s {
const ct_data * static_tree ; /* static tree or NULL */
const int * extra_bits ; /* extra bits for each code or NULL */
int extra_base ; /* base index for extra_bits */
int elems ; /* max number of elements in the tree */
int max_length ; /* max bit length for the codes */
} ;
static static_tree_desc static_l_desc =
{ static_ltree , extra_lbits , LITERALS + 1 , L_CODES , MAX_BITS } ;
static static_tree_desc static_d_desc =
{ static_dtree , extra_dbits , 0 , D_CODES , MAX_BITS } ;
static static_tree_desc static_bl_desc =
{ ( const ct_data * ) 0 , extra_blbits , 0 , BL_CODES , MAX_BL_BITS } ;
/* ===========================================================================
* Local ( static ) routines in this file .
*/
static void tr_static_init ( void ) ;
static void init_block ( deflate_state * s ) ;
static void pqdownheap ( deflate_state * s , ct_data * tree , int k ) ;
static void gen_bitlen ( deflate_state * s , tree_desc * desc ) ;
static void gen_codes ( ct_data * tree , int max_code , ush * bl_count ) ;
static void build_tree ( deflate_state * s , tree_desc * desc ) ;
static void scan_tree ( deflate_state * s , ct_data * tree , int max_code ) ;
static void send_tree ( deflate_state * s , ct_data * tree , int max_code ) ;
static int build_bl_tree ( deflate_state * s ) ;
static void send_all_trees ( deflate_state * s , int lcodes , int dcodes ,
int blcodes ) ;
static void compress_block ( deflate_state * s , ct_data * ltree ,
ct_data * dtree ) ;
static void set_data_type ( deflate_state * s ) ;
static void bi_flush ( deflate_state * s ) ;
static void copy_block ( deflate_state * s , char * buf , unsigned len ,
int header ) ;
# ifndef DEBUG_ZLIB
# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
/* Send a code of the given tree. c and tree must not have side effects */
# else /* DEBUG_ZLIB */
# define send_code(s, c, tree) \
{ if ( z_verbose > 2 ) fprintf ( stderr , " \n cd %3d " , ( c ) ) ; \
send_bits ( s , tree [ c ] . Code , tree [ c ] . Len ) ; }
# endif
# define d_code(dist) \
( ( dist ) < 256 ? dist_code [ dist ] : dist_code [ 256 + ( ( dist ) > > 7 ) ] )
/* Mapping from a distance to a distance code. dist is the distance - 1 and
* must not have side effects . dist_code [ 256 ] and dist_code [ 257 ] are never
* used .
*/
/* ===========================================================================
* Initialize the various ' constant ' tables . In a multi - threaded environment ,
* this function may be called by two threads concurrently , but this is
* harmless since both invocations do exactly the same thing .
*/
static void tr_static_init ( void )
{
static int static_init_done ;
int n ; /* iterates over tree elements */
int bits ; /* bit counter */
int length ; /* length value */
int code ; /* code value */
int dist ; /* distance index */
ush bl_count [ MAX_BITS + 1 ] ;
/* number of codes at each bit length for an optimal tree */
if ( static_init_done ) return ;
/* Initialize the mapping length (0..255) -> length code (0..28) */
length = 0 ;
for ( code = 0 ; code < LENGTH_CODES - 1 ; code + + ) {
base_length [ code ] = length ;
for ( n = 0 ; n < ( 1 < < extra_lbits [ code ] ) ; n + + ) {
length_code [ length + + ] = ( uch ) code ;
}
}
Assert ( length = = 256 , " tr_static_init: length != 256 " ) ;
/* Note that the length 255 (match length 258) can be represented
* in two different ways : code 284 + 5 bits or code 285 , so we
* overwrite length_code [ 255 ] to use the best encoding :
*/
length_code [ length - 1 ] = ( uch ) code ;
/* Initialize the mapping dist (0..32K) -> dist code (0..29) */
dist = 0 ;
for ( code = 0 ; code < 16 ; code + + ) {
base_dist [ code ] = dist ;
for ( n = 0 ; n < ( 1 < < extra_dbits [ code ] ) ; n + + ) {
dist_code [ dist + + ] = ( uch ) code ;
}
}
Assert ( dist = = 256 , " tr_static_init: dist != 256 " ) ;
dist > > = 7 ; /* from now on, all distances are divided by 128 */
for ( ; code < D_CODES ; code + + ) {
base_dist [ code ] = dist < < 7 ;
for ( n = 0 ; n < ( 1 < < ( extra_dbits [ code ] - 7 ) ) ; n + + ) {
dist_code [ 256 + dist + + ] = ( uch ) code ;
}
}
Assert ( dist = = 256 , " tr_static_init: 256+dist != 512 " ) ;
/* Construct the codes of the static literal tree */
for ( bits = 0 ; bits < = MAX_BITS ; bits + + ) bl_count [ bits ] = 0 ;
n = 0 ;
while ( n < = 143 ) static_ltree [ n + + ] . Len = 8 , bl_count [ 8 ] + + ;
while ( n < = 255 ) static_ltree [ n + + ] . Len = 9 , bl_count [ 9 ] + + ;
while ( n < = 279 ) static_ltree [ n + + ] . Len = 7 , bl_count [ 7 ] + + ;
while ( n < = 287 ) static_ltree [ n + + ] . Len = 8 , bl_count [ 8 ] + + ;
/* Codes 286 and 287 do not exist, but we must include them in the
* tree construction to get a canonical Huffman tree ( longest code
* all ones )
*/
gen_codes ( ( ct_data * ) static_ltree , L_CODES + 1 , bl_count ) ;
/* The static distance tree is trivial: */
for ( n = 0 ; n < D_CODES ; n + + ) {
static_dtree [ n ] . Len = 5 ;
2015-09-10 01:39:18 +03:00
static_dtree [ n ] . Code = bitrev32 ( ( u32 ) n ) > > ( 32 - 5 ) ;
2005-04-17 02:20:36 +04:00
}
static_init_done = 1 ;
}
/* ===========================================================================
* Initialize the tree data structures for a new zlib stream .
*/
void zlib_tr_init (
deflate_state * s
)
{
tr_static_init ( ) ;
s - > compressed_len = 0L ;
s - > l_desc . dyn_tree = s - > dyn_ltree ;
s - > l_desc . stat_desc = & static_l_desc ;
s - > d_desc . dyn_tree = s - > dyn_dtree ;
s - > d_desc . stat_desc = & static_d_desc ;
s - > bl_desc . dyn_tree = s - > bl_tree ;
s - > bl_desc . stat_desc = & static_bl_desc ;
s - > bi_buf = 0 ;
s - > bi_valid = 0 ;
s - > last_eob_len = 8 ; /* enough lookahead for inflate */
# ifdef DEBUG_ZLIB
s - > bits_sent = 0L ;
# endif
/* Initialize the first block of the first file: */
init_block ( s ) ;
}
/* ===========================================================================
* Initialize a new block .
*/
static void init_block (
deflate_state * s
)
{
int n ; /* iterates over tree elements */
/* Initialize the trees. */
for ( n = 0 ; n < L_CODES ; n + + ) s - > dyn_ltree [ n ] . Freq = 0 ;
for ( n = 0 ; n < D_CODES ; n + + ) s - > dyn_dtree [ n ] . Freq = 0 ;
for ( n = 0 ; n < BL_CODES ; n + + ) s - > bl_tree [ n ] . Freq = 0 ;
s - > dyn_ltree [ END_BLOCK ] . Freq = 1 ;
s - > opt_len = s - > static_len = 0L ;
s - > last_lit = s - > matches = 0 ;
}
# define SMALLEST 1
/* Index within the heap array of least frequent node in the Huffman tree */
/* ===========================================================================
* Remove the smallest element from the heap and recreate the heap with
* one less element . Updates heap and heap_len .
*/
# define pqremove(s, tree, top) \
{ \
top = s - > heap [ SMALLEST ] ; \
s - > heap [ SMALLEST ] = s - > heap [ s - > heap_len - - ] ; \
pqdownheap ( s , tree , SMALLEST ) ; \
}
/* ===========================================================================
* Compares to subtrees , using the tree depth as tie breaker when
* the subtrees have equal frequency . This minimizes the worst case length .
*/
# define smaller(tree, n, m, depth) \
( tree [ n ] . Freq < tree [ m ] . Freq | | \
( tree [ n ] . Freq = = tree [ m ] . Freq & & depth [ n ] < = depth [ m ] ) )
/* ===========================================================================
* Restore the heap property by moving down the tree starting at node k ,
* exchanging a node with the smallest of its two sons if necessary , stopping
* when the heap property is re - established ( each father smaller than its
* two sons ) .
*/
static void pqdownheap (
deflate_state * s ,
ct_data * tree , /* the tree to restore */
int k /* node to move down */
)
{
int v = s - > heap [ k ] ;
int j = k < < 1 ; /* left son of k */
while ( j < = s - > heap_len ) {
/* Set j to the smallest of the two sons: */
if ( j < s - > heap_len & &
smaller ( tree , s - > heap [ j + 1 ] , s - > heap [ j ] , s - > depth ) ) {
j + + ;
}
/* Exit if v is smaller than both sons */
if ( smaller ( tree , v , s - > heap [ j ] , s - > depth ) ) break ;
/* Exchange v with the smallest son */
s - > heap [ k ] = s - > heap [ j ] ; k = j ;
/* And continue down the tree, setting j to the left son of k */
j < < = 1 ;
}
s - > heap [ k ] = v ;
}
/* ===========================================================================
* Compute the optimal bit lengths for a tree and update the total bit length
* for the current block .
* IN assertion : the fields freq and dad are set , heap [ heap_max ] and
* above are the tree nodes sorted by increasing frequency .
* OUT assertions : the field len is set to the optimal bit length , the
* array bl_count contains the frequencies for each bit length .
* The length opt_len is updated ; static_len is also updated if stree is
* not null .
*/
static void gen_bitlen (
deflate_state * s ,
tree_desc * desc /* the tree descriptor */
)
{
ct_data * tree = desc - > dyn_tree ;
int max_code = desc - > max_code ;
const ct_data * stree = desc - > stat_desc - > static_tree ;
const int * extra = desc - > stat_desc - > extra_bits ;
int base = desc - > stat_desc - > extra_base ;
int max_length = desc - > stat_desc - > max_length ;
int h ; /* heap index */
int n , m ; /* iterate over the tree elements */
int bits ; /* bit length */
int xbits ; /* extra bits */
ush f ; /* frequency */
int overflow = 0 ; /* number of elements with bit length too large */
for ( bits = 0 ; bits < = MAX_BITS ; bits + + ) s - > bl_count [ bits ] = 0 ;
/* In a first pass, compute the optimal bit lengths (which may
* overflow in the case of the bit length tree ) .
*/
tree [ s - > heap [ s - > heap_max ] ] . Len = 0 ; /* root of the heap */
for ( h = s - > heap_max + 1 ; h < HEAP_SIZE ; h + + ) {
n = s - > heap [ h ] ;
bits = tree [ tree [ n ] . Dad ] . Len + 1 ;
if ( bits > max_length ) bits = max_length , overflow + + ;
tree [ n ] . Len = ( ush ) bits ;
/* We overwrite tree[n].Dad which is no longer needed */
if ( n > max_code ) continue ; /* not a leaf node */
s - > bl_count [ bits ] + + ;
xbits = 0 ;
if ( n > = base ) xbits = extra [ n - base ] ;
f = tree [ n ] . Freq ;
s - > opt_len + = ( ulg ) f * ( bits + xbits ) ;
if ( stree ) s - > static_len + = ( ulg ) f * ( stree [ n ] . Len + xbits ) ;
}
if ( overflow = = 0 ) return ;
Trace ( ( stderr , " \n bit length overflow \n " ) ) ;
/* This happens for example on obj2 and pic of the Calgary corpus */
/* Find the first bit length which could increase: */
do {
bits = max_length - 1 ;
while ( s - > bl_count [ bits ] = = 0 ) bits - - ;
s - > bl_count [ bits ] - - ; /* move one leaf down the tree */
s - > bl_count [ bits + 1 ] + = 2 ; /* move one overflow item as its brother */
s - > bl_count [ max_length ] - - ;
/* The brother of the overflow item also moves one step up,
* but this does not affect bl_count [ max_length ]
*/
overflow - = 2 ;
} while ( overflow > 0 ) ;
/* Now recompute all bit lengths, scanning in increasing frequency.
* h is still equal to HEAP_SIZE . ( It is simpler to reconstruct all
* lengths instead of fixing only the wrong ones . This idea is taken
* from ' ar ' written by Haruhiko Okumura . )
*/
for ( bits = max_length ; bits ! = 0 ; bits - - ) {
n = s - > bl_count [ bits ] ;
while ( n ! = 0 ) {
m = s - > heap [ - - h ] ;
if ( m > max_code ) continue ;
if ( tree [ m ] . Len ! = ( unsigned ) bits ) {
Trace ( ( stderr , " code %d bits %d->%d \n " , m , tree [ m ] . Len , bits ) ) ;
s - > opt_len + = ( ( long ) bits - ( long ) tree [ m ] . Len )
* ( long ) tree [ m ] . Freq ;
tree [ m ] . Len = ( ush ) bits ;
}
n - - ;
}
}
}
/* ===========================================================================
* Generate the codes for a given tree and bit counts ( which need not be
* optimal ) .
* IN assertion : the array bl_count contains the bit length statistics for
* the given tree and the field len is set for all tree elements .
* OUT assertion : the field code is set for all tree elements of non
* zero code length .
*/
static void gen_codes (
ct_data * tree , /* the tree to decorate */
int max_code , /* largest code with non zero frequency */
ush * bl_count /* number of codes at each bit length */
)
{
ush next_code [ MAX_BITS + 1 ] ; /* next code value for each bit length */
ush code = 0 ; /* running code value */
int bits ; /* bit index */
int n ; /* code index */
/* The distribution counts are first used to generate the code values
* without bit reversal .
*/
for ( bits = 1 ; bits < = MAX_BITS ; bits + + ) {
next_code [ bits ] = code = ( code + bl_count [ bits - 1 ] ) < < 1 ;
}
/* Check that the bit counts in bl_count are consistent. The last code
* must be all ones .
*/
Assert ( code + bl_count [ MAX_BITS ] - 1 = = ( 1 < < MAX_BITS ) - 1 ,
" inconsistent bit counts " ) ;
Tracev ( ( stderr , " \n gen_codes: max_code %d " , max_code ) ) ;
for ( n = 0 ; n < = max_code ; n + + ) {
int len = tree [ n ] . Len ;
if ( len = = 0 ) continue ;
/* Now reverse the bits */
2015-09-10 01:39:18 +03:00
tree [ n ] . Code = bitrev32 ( ( u32 ) ( next_code [ len ] + + ) ) > > ( 32 - len ) ;
2005-04-17 02:20:36 +04:00
Tracecv ( tree ! = static_ltree , ( stderr , " \n n %3d %c l %2d c %4x (%x) " ,
n , ( isgraph ( n ) ? n : ' ' ) , len , tree [ n ] . Code , next_code [ len ] - 1 ) ) ;
}
}
/* ===========================================================================
* Construct one Huffman tree and assigns the code bit strings and lengths .
* Update the total bit length for the current block .
* IN assertion : the field freq is set for all tree elements .
* OUT assertions : the fields len and code are set to the optimal bit length
* and corresponding code . The length opt_len is updated ; static_len is
* also updated if stree is not null . The field max_code is set .
*/
static void build_tree (
deflate_state * s ,
tree_desc * desc /* the tree descriptor */
)
{
ct_data * tree = desc - > dyn_tree ;
const ct_data * stree = desc - > stat_desc - > static_tree ;
int elems = desc - > stat_desc - > elems ;
int n , m ; /* iterate over heap elements */
int max_code = - 1 ; /* largest code with non zero frequency */
int node ; /* new node being created */
/* Construct the initial heap, with least frequent element in
* heap [ SMALLEST ] . The sons of heap [ n ] are heap [ 2 * n ] and heap [ 2 * n + 1 ] .
* heap [ 0 ] is not used .
*/
s - > heap_len = 0 , s - > heap_max = HEAP_SIZE ;
for ( n = 0 ; n < elems ; n + + ) {
if ( tree [ n ] . Freq ! = 0 ) {
s - > heap [ + + ( s - > heap_len ) ] = max_code = n ;
s - > depth [ n ] = 0 ;
} else {
tree [ n ] . Len = 0 ;
}
}
/* The pkzip format requires that at least one distance code exists,
* and that at least one bit should be sent even if there is only one
* possible code . So to avoid special checks later on we force at least
* two codes of non zero frequency .
*/
while ( s - > heap_len < 2 ) {
node = s - > heap [ + + ( s - > heap_len ) ] = ( max_code < 2 ? + + max_code : 0 ) ;
tree [ node ] . Freq = 1 ;
s - > depth [ node ] = 0 ;
s - > opt_len - - ; if ( stree ) s - > static_len - = stree [ node ] . Len ;
/* node is 0 or 1 so it does not have extra bits */
}
desc - > max_code = max_code ;
/* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
* establish sub - heaps of increasing lengths :
*/
for ( n = s - > heap_len / 2 ; n > = 1 ; n - - ) pqdownheap ( s , tree , n ) ;
/* Construct the Huffman tree by repeatedly combining the least two
* frequent nodes .
*/
node = elems ; /* next internal node of the tree */
do {
pqremove ( s , tree , n ) ; /* n = node of least frequency */
m = s - > heap [ SMALLEST ] ; /* m = node of next least frequency */
s - > heap [ - - ( s - > heap_max ) ] = n ; /* keep the nodes sorted by frequency */
s - > heap [ - - ( s - > heap_max ) ] = m ;
/* Create a new node father of n and m */
tree [ node ] . Freq = tree [ n ] . Freq + tree [ m ] . Freq ;
s - > depth [ node ] = ( uch ) ( max ( s - > depth [ n ] , s - > depth [ m ] ) + 1 ) ;
tree [ n ] . Dad = tree [ m ] . Dad = ( ush ) node ;
# ifdef DUMP_BL_TREE
if ( tree = = s - > bl_tree ) {
fprintf ( stderr , " \n node %d(%d), sons %d(%d) %d(%d) " ,
node , tree [ node ] . Freq , n , tree [ n ] . Freq , m , tree [ m ] . Freq ) ;
}
# endif
/* and insert the new node in the heap */
s - > heap [ SMALLEST ] = node + + ;
pqdownheap ( s , tree , SMALLEST ) ;
} while ( s - > heap_len > = 2 ) ;
s - > heap [ - - ( s - > heap_max ) ] = s - > heap [ SMALLEST ] ;
/* At this point, the fields freq and dad are set. We can now
* generate the bit lengths .
*/
gen_bitlen ( s , ( tree_desc * ) desc ) ;
/* The field len is now set, we can generate the bit codes */
gen_codes ( ( ct_data * ) tree , max_code , s - > bl_count ) ;
}
/* ===========================================================================
* Scan a literal or distance tree to determine the frequencies of the codes
* in the bit length tree .
*/
static void scan_tree (
deflate_state * s ,
ct_data * tree , /* the tree to be scanned */
int max_code /* and its largest code of non zero frequency */
)
{
int n ; /* iterates over all tree elements */
int prevlen = - 1 ; /* last emitted length */
int curlen ; /* length of current code */
int nextlen = tree [ 0 ] . Len ; /* length of next code */
int count = 0 ; /* repeat count of the current code */
int max_count = 7 ; /* max repeat count */
int min_count = 4 ; /* min repeat count */
if ( nextlen = = 0 ) max_count = 138 , min_count = 3 ;
tree [ max_code + 1 ] . Len = ( ush ) 0xffff ; /* guard */
for ( n = 0 ; n < = max_code ; n + + ) {
curlen = nextlen ; nextlen = tree [ n + 1 ] . Len ;
if ( + + count < max_count & & curlen = = nextlen ) {
continue ;
} else if ( count < min_count ) {
s - > bl_tree [ curlen ] . Freq + = count ;
} else if ( curlen ! = 0 ) {
if ( curlen ! = prevlen ) s - > bl_tree [ curlen ] . Freq + + ;
s - > bl_tree [ REP_3_6 ] . Freq + + ;
} else if ( count < = 10 ) {
s - > bl_tree [ REPZ_3_10 ] . Freq + + ;
} else {
s - > bl_tree [ REPZ_11_138 ] . Freq + + ;
}
count = 0 ; prevlen = curlen ;
if ( nextlen = = 0 ) {
max_count = 138 , min_count = 3 ;
} else if ( curlen = = nextlen ) {
max_count = 6 , min_count = 3 ;
} else {
max_count = 7 , min_count = 4 ;
}
}
}
/* ===========================================================================
* Send a literal or distance tree in compressed form , using the codes in
* bl_tree .
*/
static void send_tree (
deflate_state * s ,
ct_data * tree , /* the tree to be scanned */
int max_code /* and its largest code of non zero frequency */
)
{
int n ; /* iterates over all tree elements */
int prevlen = - 1 ; /* last emitted length */
int curlen ; /* length of current code */
int nextlen = tree [ 0 ] . Len ; /* length of next code */
int count = 0 ; /* repeat count of the current code */
int max_count = 7 ; /* max repeat count */
int min_count = 4 ; /* min repeat count */
/* tree[max_code+1].Len = -1; */ /* guard already set */
if ( nextlen = = 0 ) max_count = 138 , min_count = 3 ;
for ( n = 0 ; n < = max_code ; n + + ) {
curlen = nextlen ; nextlen = tree [ n + 1 ] . Len ;
if ( + + count < max_count & & curlen = = nextlen ) {
continue ;
} else if ( count < min_count ) {
do { send_code ( s , curlen , s - > bl_tree ) ; } while ( - - count ! = 0 ) ;
} else if ( curlen ! = 0 ) {
if ( curlen ! = prevlen ) {
send_code ( s , curlen , s - > bl_tree ) ; count - - ;
}
Assert ( count > = 3 & & count < = 6 , " 3_6? " ) ;
send_code ( s , REP_3_6 , s - > bl_tree ) ; send_bits ( s , count - 3 , 2 ) ;
} else if ( count < = 10 ) {
send_code ( s , REPZ_3_10 , s - > bl_tree ) ; send_bits ( s , count - 3 , 3 ) ;
} else {
send_code ( s , REPZ_11_138 , s - > bl_tree ) ; send_bits ( s , count - 11 , 7 ) ;
}
count = 0 ; prevlen = curlen ;
if ( nextlen = = 0 ) {
max_count = 138 , min_count = 3 ;
} else if ( curlen = = nextlen ) {
max_count = 6 , min_count = 3 ;
} else {
max_count = 7 , min_count = 4 ;
}
}
}
/* ===========================================================================
* Construct the Huffman tree for the bit lengths and return the index in
* bl_order of the last bit length code to send .
*/
static int build_bl_tree (
deflate_state * s
)
{
int max_blindex ; /* index of last bit length code of non zero freq */
/* Determine the bit length frequencies for literal and distance trees */
scan_tree ( s , ( ct_data * ) s - > dyn_ltree , s - > l_desc . max_code ) ;
scan_tree ( s , ( ct_data * ) s - > dyn_dtree , s - > d_desc . max_code ) ;
/* Build the bit length tree: */
build_tree ( s , ( tree_desc * ) ( & ( s - > bl_desc ) ) ) ;
/* opt_len now includes the length of the tree representations, except
* the lengths of the bit lengths codes and the 5 + 5 + 4 bits for the counts .
*/
/* Determine the number of bit length codes to send. The pkzip format
* requires that at least 4 bit length codes be sent . ( appnote . txt says
* 3 but the actual value used is 4. )
*/
for ( max_blindex = BL_CODES - 1 ; max_blindex > = 3 ; max_blindex - - ) {
if ( s - > bl_tree [ bl_order [ max_blindex ] ] . Len ! = 0 ) break ;
}
/* Update opt_len to include the bit length tree and counts */
s - > opt_len + = 3 * ( max_blindex + 1 ) + 5 + 5 + 4 ;
Tracev ( ( stderr , " \n dyn trees: dyn %ld, stat %ld " ,
s - > opt_len , s - > static_len ) ) ;
return max_blindex ;
}
/* ===========================================================================
* Send the header for a block using dynamic Huffman trees : the counts , the
* lengths of the bit length codes , the literal tree and the distance tree .
* IN assertion : lcodes > = 257 , dcodes > = 1 , blcodes > = 4.
*/
static void send_all_trees (
deflate_state * s ,
int lcodes , /* number of codes for each tree */
int dcodes , /* number of codes for each tree */
int blcodes /* number of codes for each tree */
)
{
int rank ; /* index in bl_order */
Assert ( lcodes > = 257 & & dcodes > = 1 & & blcodes > = 4 , " not enough codes " ) ;
Assert ( lcodes < = L_CODES & & dcodes < = D_CODES & & blcodes < = BL_CODES ,
" too many codes " ) ;
Tracev ( ( stderr , " \n bl counts: " ) ) ;
send_bits ( s , lcodes - 257 , 5 ) ; /* not +255 as stated in appnote.txt */
send_bits ( s , dcodes - 1 , 5 ) ;
send_bits ( s , blcodes - 4 , 4 ) ; /* not -3 as stated in appnote.txt */
for ( rank = 0 ; rank < blcodes ; rank + + ) {
Tracev ( ( stderr , " \n bl code %2d " , bl_order [ rank ] ) ) ;
send_bits ( s , s - > bl_tree [ bl_order [ rank ] ] . Len , 3 ) ;
}
Tracev ( ( stderr , " \n bl tree: sent %ld " , s - > bits_sent ) ) ;
send_tree ( s , ( ct_data * ) s - > dyn_ltree , lcodes - 1 ) ; /* literal tree */
Tracev ( ( stderr , " \n lit tree: sent %ld " , s - > bits_sent ) ) ;
send_tree ( s , ( ct_data * ) s - > dyn_dtree , dcodes - 1 ) ; /* distance tree */
Tracev ( ( stderr , " \n dist tree: sent %ld " , s - > bits_sent ) ) ;
}
/* ===========================================================================
* Send a stored block
*/
void zlib_tr_stored_block (
deflate_state * s ,
char * buf , /* input block */
ulg stored_len , /* length of input block */
int eof /* true if this is the last block for a file */
)
{
send_bits ( s , ( STORED_BLOCK < < 1 ) + eof , 3 ) ; /* send block type */
s - > compressed_len = ( s - > compressed_len + 3 + 7 ) & ( ulg ) ~ 7L ;
s - > compressed_len + = ( stored_len + 4 ) < < 3 ;
copy_block ( s , buf , ( unsigned ) stored_len , 1 ) ; /* with header */
}
/* Send just the `stored block' type code without any length bytes or data.
*/
void zlib_tr_stored_type_only (
deflate_state * s
)
{
send_bits ( s , ( STORED_BLOCK < < 1 ) , 3 ) ;
bi_windup ( s ) ;
s - > compressed_len = ( s - > compressed_len + 3 ) & ~ 7L ;
}
/* ===========================================================================
* Send one empty static block to give enough lookahead for inflate .
* This takes 10 bits , of which 7 may remain in the bit buffer .
* The current inflate code requires 9 bits of lookahead . If the
* last two codes for the previous block ( real code plus EOB ) were coded
* on 5 bits or less , inflate may have only 5 + 3 bits of lookahead to decode
* the last real code . In this case we send two empty static blocks instead
* of one . ( There are no problems if the previous block is stored or fixed . )
* To simplify the code , we assume the worst case of last real code encoded
* on one bit only .
*/
void zlib_tr_align (
deflate_state * s
)
{
send_bits ( s , STATIC_TREES < < 1 , 3 ) ;
send_code ( s , END_BLOCK , static_ltree ) ;
s - > compressed_len + = 10L ; /* 3 for block type, 7 for EOB */
bi_flush ( s ) ;
/* Of the 10 bits for the empty block, we have already sent
* ( 10 - bi_valid ) bits . The lookahead for the last real code ( before
* the EOB of the previous block ) was thus at least one plus the length
* of the EOB plus what we have just sent of the empty static block .
*/
if ( 1 + s - > last_eob_len + 10 - s - > bi_valid < 9 ) {
send_bits ( s , STATIC_TREES < < 1 , 3 ) ;
send_code ( s , END_BLOCK , static_ltree ) ;
s - > compressed_len + = 10L ;
bi_flush ( s ) ;
}
s - > last_eob_len = 7 ;
}
/* ===========================================================================
* Determine the best encoding for the current block : dynamic trees , static
* trees or store , and output the encoded block to the zip file . This function
* returns the total compressed length for the file so far .
*/
ulg zlib_tr_flush_block (
deflate_state * s ,
char * buf , /* input block, or NULL if too old */
ulg stored_len , /* length of input block */
int eof /* true if this is the last block for a file */
)
{
ulg opt_lenb , static_lenb ; /* opt_len and static_len in bytes */
int max_blindex = 0 ; /* index of last bit length code of non zero freq */
/* Build the Huffman trees unless a stored block is forced */
if ( s - > level > 0 ) {
/* Check if the file is ascii or binary */
if ( s - > data_type = = Z_UNKNOWN ) set_data_type ( s ) ;
/* Construct the literal and distance trees */
build_tree ( s , ( tree_desc * ) ( & ( s - > l_desc ) ) ) ;
Tracev ( ( stderr , " \n lit data: dyn %ld, stat %ld " , s - > opt_len ,
s - > static_len ) ) ;
build_tree ( s , ( tree_desc * ) ( & ( s - > d_desc ) ) ) ;
Tracev ( ( stderr , " \n dist data: dyn %ld, stat %ld " , s - > opt_len ,
s - > static_len ) ) ;
/* At this point, opt_len and static_len are the total bit lengths of
* the compressed block data , excluding the tree representations .
*/
/* Build the bit length tree for the above two trees, and get the index
* in bl_order of the last bit length code to send .
*/
max_blindex = build_bl_tree ( s ) ;
/* Determine the best encoding. Compute first the block length in bytes*/
opt_lenb = ( s - > opt_len + 3 + 7 ) > > 3 ;
static_lenb = ( s - > static_len + 3 + 7 ) > > 3 ;
Tracev ( ( stderr , " \n opt %lu(%lu) stat %lu(%lu) stored %lu lit %u " ,
opt_lenb , s - > opt_len , static_lenb , s - > static_len , stored_len ,
s - > last_lit ) ) ;
if ( static_lenb < = opt_lenb ) opt_lenb = static_lenb ;
} else {
Assert ( buf ! = ( char * ) 0 , " lost buf " ) ;
opt_lenb = static_lenb = stored_len + 5 ; /* force a stored block */
}
/* If compression failed and this is the first and last block,
* and if the . zip file can be seeked ( to rewrite the local header ) ,
* the whole file is transformed into a stored file :
*/
# ifdef STORED_FILE_OK
# ifdef FORCE_STORED_FILE
if ( eof & & s - > compressed_len = = 0L ) { /* force stored file */
# else
if ( stored_len < = opt_lenb & & eof & & s - > compressed_len = = 0L & & seekable ( ) ) {
# endif
/* Since LIT_BUFSIZE <= 2*WSIZE, the input data must be there: */
if ( buf = = ( char * ) 0 ) error ( " block vanished " ) ;
copy_block ( s , buf , ( unsigned ) stored_len , 0 ) ; /* without header */
s - > compressed_len = stored_len < < 3 ;
s - > method = STORED ;
} else
# endif /* STORED_FILE_OK */
# ifdef FORCE_STORED
if ( buf ! = ( char * ) 0 ) { /* force stored block */
# else
if ( stored_len + 4 < = opt_lenb & & buf ! = ( char * ) 0 ) {
/* 4: two words for the lengths */
# endif
/* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
* Otherwise we can ' t have processed more than WSIZE input bytes since
* the last block flush , because compression would have been
* successful . If LIT_BUFSIZE < = WSIZE , it is never too late to
* transform a block into a stored block .
*/
zlib_tr_stored_block ( s , buf , stored_len , eof ) ;
# ifdef FORCE_STATIC
} else if ( static_lenb > = 0 ) { /* force static trees */
# else
} else if ( static_lenb = = opt_lenb ) {
# endif
send_bits ( s , ( STATIC_TREES < < 1 ) + eof , 3 ) ;
compress_block ( s , ( ct_data * ) static_ltree , ( ct_data * ) static_dtree ) ;
s - > compressed_len + = 3 + s - > static_len ;
} else {
send_bits ( s , ( DYN_TREES < < 1 ) + eof , 3 ) ;
send_all_trees ( s , s - > l_desc . max_code + 1 , s - > d_desc . max_code + 1 ,
max_blindex + 1 ) ;
compress_block ( s , ( ct_data * ) s - > dyn_ltree , ( ct_data * ) s - > dyn_dtree ) ;
s - > compressed_len + = 3 + s - > opt_len ;
}
Assert ( s - > compressed_len = = s - > bits_sent , " bad compressed size " ) ;
init_block ( s ) ;
if ( eof ) {
bi_windup ( s ) ;
s - > compressed_len + = 7 ; /* align on byte boundary */
}
Tracev ( ( stderr , " \n comprlen %lu(%lu) " , s - > compressed_len > > 3 ,
s - > compressed_len - 7 * eof ) ) ;
return s - > compressed_len > > 3 ;
}
/* ===========================================================================
* Save the match info and tally the frequency counts . Return true if
* the current block must be flushed .
*/
int zlib_tr_tally (
deflate_state * s ,
unsigned dist , /* distance of matched string */
unsigned lc /* match length-MIN_MATCH or unmatched char (if dist==0) */
)
{
s - > d_buf [ s - > last_lit ] = ( ush ) dist ;
s - > l_buf [ s - > last_lit + + ] = ( uch ) lc ;
if ( dist = = 0 ) {
/* lc is the unmatched char */
s - > dyn_ltree [ lc ] . Freq + + ;
} else {
s - > matches + + ;
/* Here, lc is the match length - MIN_MATCH */
dist - - ; /* dist = match distance - 1 */
Assert ( ( ush ) dist < ( ush ) MAX_DIST ( s ) & &
( ush ) lc < = ( ush ) ( MAX_MATCH - MIN_MATCH ) & &
( ush ) d_code ( dist ) < ( ush ) D_CODES , " zlib_tr_tally: bad match " ) ;
s - > dyn_ltree [ length_code [ lc ] + LITERALS + 1 ] . Freq + + ;
s - > dyn_dtree [ d_code ( dist ) ] . Freq + + ;
}
/* Try to guess if it is profitable to stop the current block here */
if ( ( s - > last_lit & 0xfff ) = = 0 & & s - > level > 2 ) {
/* Compute an upper bound for the compressed length */
ulg out_length = ( ulg ) s - > last_lit * 8L ;
ulg in_length = ( ulg ) ( ( long ) s - > strstart - s - > block_start ) ;
int dcode ;
for ( dcode = 0 ; dcode < D_CODES ; dcode + + ) {
out_length + = ( ulg ) s - > dyn_dtree [ dcode ] . Freq *
( 5L + extra_dbits [ dcode ] ) ;
}
out_length > > = 3 ;
Tracev ( ( stderr , " \n last_lit %u, in %ld, out ~%ld(%ld%%) " ,
s - > last_lit , in_length , out_length ,
100L - out_length * 100L / in_length ) ) ;
if ( s - > matches < s - > last_lit / 2 & & out_length < in_length / 2 ) return 1 ;
}
return ( s - > last_lit = = s - > lit_bufsize - 1 ) ;
/* We avoid equality with lit_bufsize because of wraparound at 64K
* on 16 bit machines and because stored blocks are restricted to
* 64 K - 1 bytes .
*/
}
/* ===========================================================================
* Send the block data compressed using the given Huffman trees
*/
static void compress_block (
deflate_state * s ,
ct_data * ltree , /* literal tree */
ct_data * dtree /* distance tree */
)
{
unsigned dist ; /* distance of matched string */
int lc ; /* match length or unmatched char (if dist == 0) */
unsigned lx = 0 ; /* running index in l_buf */
unsigned code ; /* the code to send */
int extra ; /* number of extra bits to send */
if ( s - > last_lit ! = 0 ) do {
dist = s - > d_buf [ lx ] ;
lc = s - > l_buf [ lx + + ] ;
if ( dist = = 0 ) {
send_code ( s , lc , ltree ) ; /* send a literal byte */
Tracecv ( isgraph ( lc ) , ( stderr , " '%c' " , lc ) ) ;
} else {
/* Here, lc is the match length - MIN_MATCH */
code = length_code [ lc ] ;
send_code ( s , code + LITERALS + 1 , ltree ) ; /* send the length code */
extra = extra_lbits [ code ] ;
if ( extra ! = 0 ) {
lc - = base_length [ code ] ;
send_bits ( s , lc , extra ) ; /* send the extra length bits */
}
dist - - ; /* dist is now the match distance - 1 */
code = d_code ( dist ) ;
Assert ( code < D_CODES , " bad d_code " ) ;
send_code ( s , code , dtree ) ; /* send the distance code */
extra = extra_dbits [ code ] ;
if ( extra ! = 0 ) {
dist - = base_dist [ code ] ;
send_bits ( s , dist , extra ) ; /* send the extra distance bits */
}
} /* literal or match pair ? */
/* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
Assert ( s - > pending < s - > lit_bufsize + 2 * lx , " pendingBuf overflow " ) ;
} while ( lx < s - > last_lit ) ;
send_code ( s , END_BLOCK , ltree ) ;
s - > last_eob_len = ltree [ END_BLOCK ] . Len ;
}
/* ===========================================================================
* Set the data type to ASCII or BINARY , using a crude approximation :
* binary if more than 20 % of the bytes are < = 6 or > = 128 , ascii otherwise .
* IN assertion : the fields freq of dyn_ltree are set and the total of all
* frequencies does not exceed 64 K ( to fit in an int on 16 bit machines ) .
*/
static void set_data_type (
deflate_state * s
)
{
int n = 0 ;
unsigned ascii_freq = 0 ;
unsigned bin_freq = 0 ;
while ( n < 7 ) bin_freq + = s - > dyn_ltree [ n + + ] . Freq ;
while ( n < 128 ) ascii_freq + = s - > dyn_ltree [ n + + ] . Freq ;
while ( n < LITERALS ) bin_freq + = s - > dyn_ltree [ n + + ] . Freq ;
s - > data_type = ( Byte ) ( bin_freq > ( ascii_freq > > 2 ) ? Z_BINARY : Z_ASCII ) ;
}
/* ===========================================================================
* Copy a stored block , storing first the length and its
* one ' s complement if requested .
*/
static void copy_block (
deflate_state * s ,
char * buf , /* the input data */
unsigned len , /* its length */
int header /* true if block header must be written */
)
{
bi_windup ( s ) ; /* align on byte boundary */
s - > last_eob_len = 8 ; /* enough lookahead for inflate */
if ( header ) {
put_short ( s , ( ush ) len ) ;
put_short ( s , ( ush ) ~ len ) ;
# ifdef DEBUG_ZLIB
s - > bits_sent + = 2 * 16 ;
# endif
}
# ifdef DEBUG_ZLIB
s - > bits_sent + = ( ulg ) len < < 3 ;
# endif
/* bundle up the put_byte(s, *buf++) calls */
memcpy ( & s - > pending_buf [ s - > pending ] , buf , len ) ;
s - > pending + = len ;
}