2005-04-16 15:20:36 -07:00
/* inftrees.c -- generate Huffman trees for efficient decoding
* Copyright ( C ) 1995 - 1998 Mark Adler
* For conditions of distribution and use , see copyright notice in zlib . h
*/
# include <linux/zutil.h>
# include "inftrees.h"
# include "infutil.h"
static const char inflate_copyright [ ] __attribute_used__ =
" inflate 1.1.3 Copyright 1995-1998 Mark Adler " ;
/*
If you use the zlib library in a product , an acknowledgment is welcome
in the documentation of your product . If for some reason you cannot
include such an acknowledgment , I would appreciate that you keep this
copyright string in the executable of your product .
*/
struct internal_state ;
/* simplify the use of the inflate_huft type with some defines */
# define exop word.what.Exop
# define bits word.what.Bits
static int huft_build (
uInt * , /* code lengths in bits */
uInt , /* number of codes */
uInt , /* number of "simple" codes */
const uInt * , /* list of base values for non-simple codes */
const uInt * , /* list of extra bits for non-simple codes */
inflate_huft * * , /* result: starting table */
uInt * , /* maximum lookup bits (returns actual) */
inflate_huft * , /* space for trees */
uInt * , /* hufts used in space */
uInt * ) ; /* space for values */
/* Tables for deflate from PKZIP's appnote.txt. */
static const uInt cplens [ 31 ] = { /* Copy lengths for literal codes 257..285 */
3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 13 , 15 , 17 , 19 , 23 , 27 , 31 ,
35 , 43 , 51 , 59 , 67 , 83 , 99 , 115 , 131 , 163 , 195 , 227 , 258 , 0 , 0 } ;
/* see note #13 above about 258 */
static const uInt cplext [ 31 ] = { /* Extra bits for literal codes 257..285 */
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 , 112 , 112 } ; /* 112==invalid */
static const uInt cpdist [ 30 ] = { /* Copy offsets for distance codes 0..29 */
1 , 2 , 3 , 4 , 5 , 7 , 9 , 13 , 17 , 25 , 33 , 49 , 65 , 97 , 129 , 193 ,
257 , 385 , 513 , 769 , 1025 , 1537 , 2049 , 3073 , 4097 , 6145 ,
8193 , 12289 , 16385 , 24577 } ;
static const uInt cpdext [ 30 ] = { /* Extra bits for distance codes */
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 } ;
/*
Huffman code decoding is performed using a multi - level table lookup .
The fastest way to decode is to simply build a lookup table whose
size is determined by the longest code . However , the time it takes
to build this table can also be a factor if the data being decoded
is not very long . The most common codes are necessarily the
shortest codes , so those codes dominate the decoding time , and hence
the speed . The idea is you can have a shorter table that decodes the
shorter , more probable codes , and then point to subsidiary tables for
the longer codes . The time it costs to decode the longer codes is
then traded against the time it takes to make longer tables .
This results of this trade are in the variables lbits and dbits
below . lbits is the number of bits the first level table for literal /
length codes can decode in one step , and dbits is the same thing for
the distance codes . Subsequent tables are also less than or equal to
those sizes . These values may be adjusted either when all of the
codes are shorter than that , in which case the longest code length in
bits is used , or when the shortest code is * longer * than the requested
table size , in which case the length of the shortest code in bits is
used .
There are two different values for the two tables , since they code a
different number of possibilities each . The literal / length table
codes 286 possible values , or in a flat code , a little over eight
bits . The distance table codes 30 possible values , or a little less
than five bits , flat . The optimum values for speed end up being
about one bit more than those , so lbits is 8 + 1 and dbits is 5 + 1.
The optimum values may differ though from machine to machine , and
possibly even between compilers . Your mileage may vary .
*/
/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
# define BMAX 15 /* maximum bit length of any code */
static int huft_build (
uInt * b , /* code lengths in bits (all assumed <= BMAX) */
uInt n , /* number of codes (assumed <= 288) */
uInt s , /* number of simple-valued codes (0..s-1) */
const uInt * d , /* list of base values for non-simple codes */
const uInt * e , /* list of extra bits for non-simple codes */
inflate_huft * * t , /* result: starting table */
uInt * m , /* maximum lookup bits, returns actual */
inflate_huft * hp , /* space for trees */
uInt * hn , /* hufts used in space */
uInt * v /* working area: values in order of bit length */
)
/* Given a list of code lengths and a maximum table size, make a set of
tables to decode that set of codes . Return Z_OK on success , Z_BUF_ERROR
if the given code set is incomplete ( the tables are still built in this
case ) , Z_DATA_ERROR if the input is invalid ( an over - subscribed set of
lengths ) , or Z_MEM_ERROR if not enough memory . */
{
uInt a ; /* counter for codes of length k */
uInt c [ BMAX + 1 ] ; /* bit length count table */
uInt f ; /* i repeats in table every f entries */
int g ; /* maximum code length */
int h ; /* table level */
register uInt i ; /* counter, current code */
register uInt j ; /* counter */
register int k ; /* number of bits in current code */
int l ; /* bits per table (returned in m) */
uInt mask ; /* (1 << w) - 1, to avoid cc -O bug on HP */
register uInt * p ; /* pointer into c[], b[], or v[] */
inflate_huft * q ; /* points to current table */
struct inflate_huft_s r ; /* table entry for structure assignment */
inflate_huft * u [ BMAX ] ; /* table stack */
register int w ; /* bits before this table == (l * h) */
uInt x [ BMAX + 1 ] ; /* bit offsets, then code stack */
uInt * xp ; /* pointer into x */
int y ; /* number of dummy codes added */
uInt z ; /* number of entries in current table */
/* Generate counts for each bit length */
p = c ;
# define C0 *p++ = 0;
# define C2 C0 C0 C0 C0
# define C4 C2 C2 C2 C2
C4 /* clear c[]--assume BMAX+1 is 16 */
p = b ; i = n ;
do {
c [ * p + + ] + + ; /* assume all entries <= BMAX */
} while ( - - i ) ;
if ( c [ 0 ] = = n ) /* null input--all zero length codes */
{
* t = NULL ;
* m = 0 ;
2005-08-17 13:07:28 -07:00
return Z_OK ;
2005-04-16 15:20:36 -07:00
}
/* Find minimum and maximum length, bound *m by those */
l = * m ;
for ( j = 1 ; j < = BMAX ; j + + )
if ( c [ j ] )
break ;
k = j ; /* minimum code length */
if ( ( uInt ) l < j )
l = j ;
for ( i = BMAX ; i ; i - - )
if ( c [ i ] )
break ;
g = i ; /* maximum code length */
if ( ( uInt ) l > i )
l = i ;
* m = l ;
/* Adjust last length count to fill out codes, if needed */
for ( y = 1 < < j ; j < i ; j + + , y < < = 1 )
if ( ( y - = c [ j ] ) < 0 )
return Z_DATA_ERROR ;
if ( ( y - = c [ i ] ) < 0 )
return Z_DATA_ERROR ;
c [ i ] + = y ;
/* Generate starting offsets into the value table for each length */
x [ 1 ] = j = 0 ;
p = c + 1 ; xp = x + 2 ;
while ( - - i ) { /* note that i == g from above */
* xp + + = ( j + = * p + + ) ;
}
/* Make a table of values in order of bit lengths */
p = b ; i = 0 ;
do {
if ( ( j = * p + + ) ! = 0 )
v [ x [ j ] + + ] = i ;
} while ( + + i < n ) ;
n = x [ g ] ; /* set n to length of v */
/* Generate the Huffman codes and for each, make the table entries */
x [ 0 ] = i = 0 ; /* first Huffman code is zero */
p = v ; /* grab values in bit order */
h = - 1 ; /* no tables yet--level -1 */
w = - l ; /* bits decoded == (l * h) */
u [ 0 ] = NULL ; /* just to keep compilers happy */
q = NULL ; /* ditto */
z = 0 ; /* ditto */
/* go through the bit lengths (k already is bits in shortest code) */
for ( ; k < = g ; k + + )
{
a = c [ k ] ;
while ( a - - )
{
/* here i is the Huffman code of length k bits for value *p */
/* make tables up to required level */
while ( k > w + l )
{
h + + ;
w + = l ; /* previous table always l bits */
/* compute minimum size table less than or equal to l bits */
z = g - w ;
z = z > ( uInt ) l ? l : z ; /* table size upper limit */
if ( ( f = 1 < < ( j = k - w ) ) > a + 1 ) /* try a k-w bit table */
{ /* too few codes for k-w bit table */
f - = a + 1 ; /* deduct codes from patterns left */
xp = c + k ;
if ( j < z )
while ( + + j < z ) /* try smaller tables up to z bits */
{
if ( ( f < < = 1 ) < = * + + xp )
break ; /* enough codes to use up j bits */
f - = * xp ; /* else deduct codes from patterns */
}
}
z = 1 < < j ; /* table entries for j-bit table */
/* allocate new table */
if ( * hn + z > MANY ) /* (note: doesn't matter for fixed) */
return Z_DATA_ERROR ; /* overflow of MANY */
u [ h ] = q = hp + * hn ;
* hn + = z ;
/* connect to last table, if there is one */
if ( h )
{
x [ h ] = i ; /* save pattern for backing up */
r . bits = ( Byte ) l ; /* bits to dump before this table */
r . exop = ( Byte ) j ; /* bits in this table */
j = i > > ( w - l ) ;
r . base = ( uInt ) ( q - u [ h - 1 ] - j ) ; /* offset to this table */
u [ h - 1 ] [ j ] = r ; /* connect to last table */
}
else
* t = q ; /* first table is returned result */
}
/* set up table entry in r */
r . bits = ( Byte ) ( k - w ) ;
if ( p > = v + n )
r . exop = 128 + 64 ; /* out of values--invalid code */
else if ( * p < s )
{
r . exop = ( Byte ) ( * p < 256 ? 0 : 32 + 64 ) ; /* 256 is end-of-block */
r . base = * p + + ; /* simple code is just the value */
}
else
{
r . exop = ( Byte ) ( e [ * p - s ] + 16 + 64 ) ; /* non-simple--look up in lists */
r . base = d [ * p + + - s ] ;
}
/* fill code-like entries with r */
f = 1 < < ( k - w ) ;
for ( j = i > > w ; j < z ; j + = f )
q [ j ] = r ;
/* backwards increment the k-bit code i */
for ( j = 1 < < ( k - 1 ) ; i & j ; j > > = 1 )
i ^ = j ;
i ^ = j ;
/* backup over finished tables */
mask = ( 1 < < w ) - 1 ; /* needed on HP, cc -O bug */
while ( ( i & mask ) ! = x [ h ] )
{
h - - ; /* don't need to update q */
w - = l ;
mask = ( 1 < < w ) - 1 ;
}
}
}
/* Return Z_BUF_ERROR if we were given an incomplete table */
return y ! = 0 & & g ! = 1 ? Z_BUF_ERROR : Z_OK ;
}
int zlib_inflate_trees_bits (
uInt * c , /* 19 code lengths */
uInt * bb , /* bits tree desired/actual depth */
inflate_huft * * tb , /* bits tree result */
inflate_huft * hp , /* space for trees */
z_streamp z /* for messages */
)
{
int r ;
uInt hn = 0 ; /* hufts used in space */
uInt * v ; /* work area for huft_build */
v = WS ( z ) - > tree_work_area_1 ;
r = huft_build ( c , 19 , 19 , NULL , NULL , tb , bb , hp , & hn , v ) ;
if ( r = = Z_DATA_ERROR )
z - > msg = ( char * ) " oversubscribed dynamic bit lengths tree " ;
else if ( r = = Z_BUF_ERROR | | * bb = = 0 )
{
z - > msg = ( char * ) " incomplete dynamic bit lengths tree " ;
r = Z_DATA_ERROR ;
}
return r ;
}
int zlib_inflate_trees_dynamic (
uInt nl , /* number of literal/length codes */
uInt nd , /* number of distance codes */
uInt * c , /* that many (total) code lengths */
uInt * bl , /* literal desired/actual bit depth */
uInt * bd , /* distance desired/actual bit depth */
inflate_huft * * tl , /* literal/length tree result */
inflate_huft * * td , /* distance tree result */
inflate_huft * hp , /* space for trees */
z_streamp z /* for messages */
)
{
int r ;
uInt hn = 0 ; /* hufts used in space */
uInt * v ; /* work area for huft_build */
/* allocate work area */
v = WS ( z ) - > tree_work_area_2 ;
/* build literal/length tree */
r = huft_build ( c , nl , 257 , cplens , cplext , tl , bl , hp , & hn , v ) ;
if ( r ! = Z_OK | | * bl = = 0 )
{
if ( r = = Z_DATA_ERROR )
z - > msg = ( char * ) " oversubscribed literal/length tree " ;
else if ( r ! = Z_MEM_ERROR )
{
z - > msg = ( char * ) " incomplete literal/length tree " ;
r = Z_DATA_ERROR ;
}
return r ;
}
/* build distance tree */
r = huft_build ( c + nl , nd , 0 , cpdist , cpdext , td , bd , hp , & hn , v ) ;
if ( r ! = Z_OK | | ( * bd = = 0 & & nl > 257 ) )
{
if ( r = = Z_DATA_ERROR )
z - > msg = ( char * ) " oversubscribed distance tree " ;
else if ( r = = Z_BUF_ERROR ) {
# ifdef PKZIP_BUG_WORKAROUND
r = Z_OK ;
}
# else
z - > msg = ( char * ) " incomplete distance tree " ;
r = Z_DATA_ERROR ;
}
else if ( r ! = Z_MEM_ERROR )
{
z - > msg = ( char * ) " empty distance tree with lengths " ;
r = Z_DATA_ERROR ;
}
return r ;
# endif
}
/* done */
return Z_OK ;
}
int zlib_inflate_trees_fixed (
uInt * bl , /* literal desired/actual bit depth */
uInt * bd , /* distance desired/actual bit depth */
inflate_huft * * tl , /* literal/length tree result */
inflate_huft * * td , /* distance tree result */
inflate_huft * hp , /* space for trees */
z_streamp z /* for memory allocation */
)
{
int i ; /* temporary variable */
unsigned l [ 288 ] ; /* length list for huft_build */
uInt * v ; /* work area for huft_build */
/* set up literal table */
for ( i = 0 ; i < 144 ; i + + )
l [ i ] = 8 ;
for ( ; i < 256 ; i + + )
l [ i ] = 9 ;
for ( ; i < 280 ; i + + )
l [ i ] = 7 ;
for ( ; i < 288 ; i + + ) /* make a complete, but wrong code set */
l [ i ] = 8 ;
* bl = 9 ;
v = WS ( z ) - > tree_work_area_1 ;
if ( ( i = huft_build ( l , 288 , 257 , cplens , cplext , tl , bl , hp , & i , v ) ) ! = 0 )
return i ;
/* set up distance table */
for ( i = 0 ; i < 30 ; i + + ) /* make an incomplete code set */
l [ i ] = 5 ;
* bd = 5 ;
if ( ( i = huft_build ( l , 30 , 0 , cpdist , cpdext , td , bd , hp , & i , v ) ) > 1 )
return i ;
return Z_OK ;
}