2008-07-30 00:01:23 +04:00
/* trees.c -- output deflated data using Huffman coding
* Copyright ( C ) 1995 - 2005 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.
*/
/* @(#) $Id$ */
/* #define GEN_TREES_H */
# include "deflate.h"
# ifdef DEBUG
# 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) */
local 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 } ;
local 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 } ;
local 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 } ;
local 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 .
*/
# define Buf_size (8 * 2*sizeof(char))
/* Number of bits used within bi_buf. (bi_buf might be implemented on
* more than 16 bits on some systems . )
*/
/* ===========================================================================
* Local data . These are initialized only once .
*/
# define DIST_CODE_LEN 512 /* see definition of array dist_code below */
# if defined(GEN_TREES_H) || !defined(STDC)
/* non ANSI compilers may not accept trees.h */
local 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 _tr_init
* below ) .
*/
local ct_data static_dtree [ D_CODES ] ;
/* The static distance tree. (Actually a trivial tree since all codes use
* 5 bits . )
*/
uch _dist_code [ DIST_CODE_LEN ] ;
/* 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 .
*/
uch _length_code [ MAX_MATCH - MIN_MATCH + 1 ] ;
/* length code for each normalized match length (0 == MIN_MATCH) */
local int base_length [ LENGTH_CODES ] ;
/* First normalized length for each code (0 = MIN_MATCH) */
local int base_dist [ D_CODES ] ;
/* First normalized distance for each code (0 = distance of 1) */
# else
# include "trees.h"
# endif /* GEN_TREES_H */
struct static_tree_desc_s {
const ct_data * static_tree ; /* static tree or NULL */
const intf * 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 */
} ;
local static_tree_desc static_l_desc =
{ static_ltree , extra_lbits , LITERALS + 1 , L_CODES , MAX_BITS } ;
local static_tree_desc static_d_desc =
{ static_dtree , extra_dbits , 0 , D_CODES , MAX_BITS } ;
local static_tree_desc static_bl_desc =
{ ( const ct_data * ) 0 , extra_blbits , 0 , BL_CODES , MAX_BL_BITS } ;
/* ===========================================================================
* Local ( static ) routines in this file .
*/
local void tr_static_init OF ( ( void ) ) ;
local void init_block OF ( ( deflate_state * s ) ) ;
local void pqdownheap OF ( ( deflate_state * s , ct_data * tree , int k ) ) ;
local void gen_bitlen OF ( ( deflate_state * s , tree_desc * desc ) ) ;
local void gen_codes OF ( ( ct_data * tree , int max_code , ushf * bl_count ) ) ;
local void build_tree OF ( ( deflate_state * s , tree_desc * desc ) ) ;
local void scan_tree OF ( ( deflate_state * s , ct_data * tree , int max_code ) ) ;
local void send_tree OF ( ( deflate_state * s , ct_data * tree , int max_code ) ) ;
local int build_bl_tree OF ( ( deflate_state * s ) ) ;
local void send_all_trees OF ( ( deflate_state * s , int lcodes , int dcodes ,
int blcodes ) ) ;
2008-08-15 15:32:51 +04:00
local void compress_block OF ( ( deflate_state * s , const ct_data * ltree ,
const ct_data * dtree ) ) ;
2008-07-30 00:01:23 +04:00
local void set_data_type OF ( ( deflate_state * s ) ) ;
local unsigned bi_reverse OF ( ( unsigned value , int length ) ) ;
local void bi_windup OF ( ( deflate_state * s ) ) ;
local void bi_flush OF ( ( deflate_state * s ) ) ;
local void copy_block OF ( ( deflate_state * s , charf * buf , unsigned len ,
int header ) ) ;
# ifdef GEN_TREES_H
local void gen_trees_header OF ( ( void ) ) ;
# endif
# ifndef DEBUG
# 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 */
# 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
/* ===========================================================================
* Output a short LSB first on the stream .
* IN assertion : there is enough room in pendingBuf .
*/
# define put_short(s, w) { \
put_byte ( s , ( uch ) ( ( w ) & 0xff ) ) ; \
put_byte ( s , ( uch ) ( ( ush ) ( w ) > > 8 ) ) ; \
}
/* ===========================================================================
* Send a value on a given number of bits .
* IN assertion : length < = 16 and value fits in length bits .
*/
# ifdef DEBUG
local void send_bits OF ( ( deflate_state * s , int value , int length ) ) ;
local void send_bits ( s , value , length )
deflate_state * s ;
int value ; /* value to send */
int length ; /* number of bits */
{
Tracevv ( ( stderr , " l %2d v %4x " , length , value ) ) ;
Assert ( length > 0 & & length < = 15 , " invalid length " ) ;
s - > bits_sent + = ( ulg ) length ;
/* If not enough room in bi_buf, use (valid) bits from bi_buf and
* ( 16 - bi_valid ) bits from value , leaving ( width - ( 16 - bi_valid ) )
* unused bits in value .
*/
if ( s - > bi_valid > ( int ) Buf_size - length ) {
s - > bi_buf | = ( value < < s - > bi_valid ) ;
put_short ( s , s - > bi_buf ) ;
s - > bi_buf = ( ush ) value > > ( Buf_size - s - > bi_valid ) ;
s - > bi_valid + = length - Buf_size ;
} else {
s - > bi_buf | = value < < s - > bi_valid ;
s - > bi_valid + = length ;
}
}
# else /* !DEBUG */
# define send_bits(s, value, length) \
{ int len = length ; \
if ( s - > bi_valid > ( int ) Buf_size - len ) { \
int val = value ; \
s - > bi_buf | = ( val < < s - > bi_valid ) ; \
put_short ( s , s - > bi_buf ) ; \
s - > bi_buf = ( ush ) val > > ( Buf_size - s - > bi_valid ) ; \
s - > bi_valid + = len - Buf_size ; \
} else { \
s - > bi_buf | = ( value ) < < s - > bi_valid ; \
s - > bi_valid + = len ; \
} \
}
# endif /* DEBUG */
/* the arguments must not have side effects */
/* ===========================================================================
* Initialize the various ' constant ' tables .
*/
local void tr_static_init ( )
{
# if defined(GEN_TREES_H) || !defined(STDC)
static int static_init_done = 0 ;
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 ;
/* For some embedded targets, global variables are not initialized: */
static_l_desc . static_tree = static_ltree ;
static_l_desc . extra_bits = extra_lbits ;
static_d_desc . static_tree = static_dtree ;
static_d_desc . extra_bits = extra_dbits ;
static_bl_desc . extra_bits = extra_blbits ;
/* 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 ;
static_dtree [ n ] . Code = bi_reverse ( ( unsigned ) n , 5 ) ;
}
static_init_done = 1 ;
# ifdef GEN_TREES_H
gen_trees_header ( ) ;
# endif
# endif /* defined(GEN_TREES_H) || !defined(STDC) */
}
/* ===========================================================================
* Genererate the file trees . h describing the static trees .
*/
# ifdef GEN_TREES_H
# ifndef DEBUG
# include <stdio.h>
# endif
# define SEPARATOR(i, last, width) \
( ( i ) = = ( last ) ? " \n }; \n \n " : \
( ( i ) % ( width ) = = ( width ) - 1 ? " , \n " : " , " ) )
void gen_trees_header ( )
{
FILE * header = fopen ( " trees.h " , " w " ) ;
int i ;
Assert ( header ! = NULL , " Can't open trees.h " ) ;
fprintf ( header ,
" /* header created automatically with -DGEN_TREES_H */ \n \n " ) ;
fprintf ( header , " local const ct_data static_ltree[L_CODES+2] = { \n " ) ;
for ( i = 0 ; i < L_CODES + 2 ; i + + ) {
fprintf ( header , " {{%3u},{%3u}}%s " , static_ltree [ i ] . Code ,
static_ltree [ i ] . Len , SEPARATOR ( i , L_CODES + 1 , 5 ) ) ;
}
fprintf ( header , " local const ct_data static_dtree[D_CODES] = { \n " ) ;
for ( i = 0 ; i < D_CODES ; i + + ) {
fprintf ( header , " {{%2u},{%2u}}%s " , static_dtree [ i ] . Code ,
static_dtree [ i ] . Len , SEPARATOR ( i , D_CODES - 1 , 5 ) ) ;
}
fprintf ( header , " const uch _dist_code[DIST_CODE_LEN] = { \n " ) ;
for ( i = 0 ; i < DIST_CODE_LEN ; i + + ) {
fprintf ( header , " %2u%s " , _dist_code [ i ] ,
SEPARATOR ( i , DIST_CODE_LEN - 1 , 20 ) ) ;
}
fprintf ( header , " const uch _length_code[MAX_MATCH-MIN_MATCH+1]= { \n " ) ;
for ( i = 0 ; i < MAX_MATCH - MIN_MATCH + 1 ; i + + ) {
fprintf ( header , " %2u%s " , _length_code [ i ] ,
SEPARATOR ( i , MAX_MATCH - MIN_MATCH , 20 ) ) ;
}
fprintf ( header , " local const int base_length[LENGTH_CODES] = { \n " ) ;
for ( i = 0 ; i < LENGTH_CODES ; i + + ) {
fprintf ( header , " %1u%s " , base_length [ i ] ,
SEPARATOR ( i , LENGTH_CODES - 1 , 20 ) ) ;
}
fprintf ( header , " local const int base_dist[D_CODES] = { \n " ) ;
for ( i = 0 ; i < D_CODES ; i + + ) {
fprintf ( header , " %5u%s " , base_dist [ i ] ,
SEPARATOR ( i , D_CODES - 1 , 10 ) ) ;
}
fclose ( header ) ;
}
# endif /* GEN_TREES_H */
/* ===========================================================================
* Initialize the tree data structures for a new zlib stream .
*/
void _tr_init ( s )
deflate_state * s ;
{
tr_static_init ( ) ;
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
s - > compressed_len = 0L ;
s - > bits_sent = 0L ;
# endif
/* Initialize the first block of the first file: */
init_block ( s ) ;
}
/* ===========================================================================
* Initialize a new block .
*/
local void init_block ( s )
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 ) .
*/
local void pqdownheap ( s , tree , k )
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 .
*/
local void gen_bitlen ( s , desc )
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 intf * 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 ( ( unsigned ) 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 .
*/
local void gen_codes ( tree , max_code , bl_count )
ct_data * tree ; /* the tree to decorate */
int max_code ; /* largest code with non zero frequency */
ushf * 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 */
tree [ n ] . Code = bi_reverse ( next_code [ len ] + + , len ) ;
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 .
*/
local void build_tree ( s , desc )
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 ) ( ( s - > depth [ n ] > = s - > depth [ m ] ?
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 .
*/
local void scan_tree ( s , tree , max_code )
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 .
*/
local void send_tree ( s , tree , max_code )
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 .
*/
local int build_bl_tree ( s )
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.
*/
local void send_all_trees ( s , lcodes , dcodes , blcodes )
deflate_state * s ;
int lcodes , dcodes , 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 _tr_stored_block ( s , buf , stored_len , eof )
deflate_state * s ;
charf * 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 */
# ifdef DEBUG
s - > compressed_len = ( s - > compressed_len + 3 + 7 ) & ( ulg ) ~ 7L ;
s - > compressed_len + = ( stored_len + 4 ) < < 3 ;
# endif
copy_block ( s , buf , ( unsigned ) stored_len , 1 ) ; /* with header */
}
/* ===========================================================================
* 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 _tr_align ( s )
deflate_state * s ;
{
send_bits ( s , STATIC_TREES < < 1 , 3 ) ;
send_code ( s , END_BLOCK , static_ltree ) ;
# ifdef DEBUG
s - > compressed_len + = 10L ; /* 3 for block type, 7 for EOB */
# endif
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 ) ;
# ifdef DEBUG
s - > compressed_len + = 10L ;
# endif
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 .
*/
void _tr_flush_block ( s , buf , stored_len , eof )
deflate_state * s ;
charf * 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 binary or text */
if ( stored_len > 0 & & s - > strm - > 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 the block lengths 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 */
}
# 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 .
*/
_tr_stored_block ( s , buf , stored_len , eof ) ;
# ifdef FORCE_STATIC
} else if ( static_lenb > = 0 ) { /* force static trees */
# else
} else if ( s - > strategy = = Z_FIXED | | static_lenb = = opt_lenb ) {
# endif
send_bits ( s , ( STATIC_TREES < < 1 ) + eof , 3 ) ;
2008-08-15 15:32:51 +04:00
compress_block ( s , static_ltree , static_dtree ) ;
2008-07-30 00:01:23 +04:00
# ifdef DEBUG
s - > compressed_len + = 3 + s - > static_len ;
# endif
} 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 ) ;
2008-08-15 15:32:51 +04:00
compress_block ( s , s - > dyn_ltree , s - > dyn_dtree ) ;
2008-07-30 00:01:23 +04:00
# ifdef DEBUG
s - > compressed_len + = 3 + s - > opt_len ;
# endif
}
Assert ( s - > compressed_len = = s - > bits_sent , " bad compressed size " ) ;
/* The above check is made mod 2^32, for files larger than 512 MB
* and uLong implemented on 32 bits .
*/
init_block ( s ) ;
if ( eof ) {
bi_windup ( s ) ;
# ifdef DEBUG
s - > compressed_len + = 7 ; /* align on byte boundary */
# endif
}
Tracev ( ( stderr , " \n comprlen %lu(%lu) " , s - > compressed_len > > 3 ,
s - > compressed_len - 7 * eof ) ) ;
}
/* ===========================================================================
* Save the match info and tally the frequency counts . Return true if
* the current block must be flushed .
*/
int _tr_tally ( s , dist , lc )
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 , " _tr_tally: bad match " ) ;
s - > dyn_ltree [ _length_code [ lc ] + LITERALS + 1 ] . Freq + + ;
s - > dyn_dtree [ d_code ( dist ) ] . Freq + + ;
}
# ifdef TRUNCATE_BLOCK
/* Try to guess if it is profitable to stop the current block here */
if ( ( s - > last_lit & 0x1fff ) = = 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 ;
}
# endif
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
*/
local void compress_block ( s , ltree , dtree )
deflate_state * s ;
2008-08-15 15:32:51 +04:00
const ct_data * ltree ; /* literal tree */
const ct_data * dtree ; /* distance tree */
2008-07-30 00:01:23 +04:00
{
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 ( ( uInt ) ( 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 BINARY or TEXT , using a crude approximation :
* set it to Z_TEXT if all symbols are either printable characters ( 33 to 255 )
* or white spaces ( 9 to 13 , or 32 ) ; or set it to Z_BINARY otherwise .
* IN assertion : the fields Freq of dyn_ltree are set .
*/
local void set_data_type ( s )
deflate_state * s ;
{
int n ;
for ( n = 0 ; n < 9 ; n + + )
if ( s - > dyn_ltree [ n ] . Freq ! = 0 )
break ;
if ( n = = 9 )
for ( n = 14 ; n < 32 ; n + + )
if ( s - > dyn_ltree [ n ] . Freq ! = 0 )
break ;
s - > strm - > data_type = ( n = = 32 ) ? Z_TEXT : Z_BINARY ;
}
/* ===========================================================================
* Reverse the first len bits of a code , using straightforward code ( a faster
* method would use a table )
* IN assertion : 1 < = len < = 15
*/
local unsigned bi_reverse ( code , len )
unsigned code ; /* the value to invert */
int len ; /* its bit length */
{
register unsigned res = 0 ;
do {
res | = code & 1 ;
code > > = 1 , res < < = 1 ;
} while ( - - len > 0 ) ;
return res > > 1 ;
}
/* ===========================================================================
* Flush the bit buffer , keeping at most 7 bits in it .
*/
local void bi_flush ( s )
deflate_state * s ;
{
if ( s - > bi_valid = = 16 ) {
put_short ( s , s - > bi_buf ) ;
s - > bi_buf = 0 ;
s - > bi_valid = 0 ;
} else if ( s - > bi_valid > = 8 ) {
put_byte ( s , ( Byte ) s - > bi_buf ) ;
s - > bi_buf > > = 8 ;
s - > bi_valid - = 8 ;
}
}
/* ===========================================================================
* Flush the bit buffer and align the output on a byte boundary
*/
local void bi_windup ( s )
deflate_state * s ;
{
if ( s - > bi_valid > 8 ) {
put_short ( s , s - > bi_buf ) ;
} else if ( s - > bi_valid > 0 ) {
put_byte ( s , ( Byte ) s - > bi_buf ) ;
}
s - > bi_buf = 0 ;
s - > bi_valid = 0 ;
# ifdef DEBUG
s - > bits_sent = ( s - > bits_sent + 7 ) & ~ 7 ;
# endif
}
/* ===========================================================================
* Copy a stored block , storing first the length and its
* one ' s complement if requested .
*/
local void copy_block ( s , buf , len , header )
deflate_state * s ;
charf * 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
s - > bits_sent + = 2 * 16 ;
# endif
}
# ifdef DEBUG
s - > bits_sent + = ( ulg ) len < < 3 ;
# endif
while ( len - - ) {
put_byte ( s , * buf + + ) ;
}
}