Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/inflate.c view on Meta::CPAN
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, 16, INVALID_CODE, INVALID_CODE};
#else
# define cplext32 cplext
#endif
static ZCONST uch cplext32[] = {
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, INVALID_CODE, INVALID_CODE};
/* - Copy offsets for distance codes 0..29 (0..31 for Deflate64) */
static ZCONST ush cpdist[] = {
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,
#if (defined(USE_DEFLATE64) || defined(PKZIP_BUG_WORKAROUND))
8193, 12289, 16385, 24577, 32769, 49153};
#else
8193, 12289, 16385, 24577};
#endif
/* - Extra bits for distance codes 0..29 (0..31 for Deflate64) */
#ifdef USE_DEFLATE64
static ZCONST uch cpdext64[] = {
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, 14, 14};
#else
# define cpdext32 cpdext
#endif
static ZCONST uch cpdext32[] = {
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,
#ifdef PKZIP_BUG_WORKAROUND
12, 12, 13, 13, INVALID_CODE, INVALID_CODE};
#else
12, 12, 13, 13};
#endif
#ifdef PKZIP_BUG_WORKAROUND
# define MAXLITLENS 288
#else
# define MAXLITLENS 286
#endif
#if (defined(USE_DEFLATE64) || defined(PKZIP_BUG_WORKAROUND))
# define MAXDISTS 32
#else
# define MAXDISTS 30
#endif
/* moved to consts.h (included in unzip.c), resp. funzip.c */
#if 0
/* And'ing with mask_bits[n] masks the lower n bits */
ZCONST unsigned near mask_bits[17] = {
0x0000,
0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
};
#endif /* 0 */
/* Macros for inflate() bit peeking and grabbing.
The usage is:
NEEDBITS(j)
x = b & mask_bits[j];
DUMPBITS(j)
where NEEDBITS makes sure that b has at least j bits in it, and
DUMPBITS removes the bits from b. The macros use the variable k
for the number of bits in b. Normally, b and k are register
variables for speed and are initialized at the beginning of a
routine that uses these macros from a global bit buffer and count.
In order to not ask for more bits than there are in the compressed
stream, the Huffman tables are constructed to only ask for just
enough bits to make up the end-of-block code (value 256). Then no
bytes need to be "returned" to the buffer at the end of the last
block. See the huft_build() routine.
Actually, the precautions mentioned above are not sufficient to
prevent fetches of bits beyound the end of the last block in every
case. When the last code fetched before the end-of-block code was
a very short distance code (shorter than "distance-prefetch-bits" -
"end-of-block code bits"), this last distance code fetch already
exausts the available data. To prevent failure of extraction in this
case, the "read beyond EOF" check delays the raise of the "invalid
data" error until an actual overflow of "used data" is detected.
This error condition is only fulfilled when the "number of available
bits" counter k is found to be negative in the NEEDBITS() macro.
An alternate fix for that problem adjusts the size of the distance code
base table so that it does not exceed the length of the end-of-block code
plus the minimum length of a distance code. This alternate fix can be
enabled by defining the preprocessor symbol FIX_PAST_EOB_BY_TABLEADJUST.
*/
/* These have been moved to globals.h */
#if 0
ulg bb; /* bit buffer */
unsigned bk; /* bits in bit buffer */
#endif
#ifndef CHECK_EOF
# define CHECK_EOF /* default as of 5.13/5.2 */
#endif
#ifndef CHECK_EOF
# define NEEDBITS(n) {while(k<(n)){b|=((ulg)NEXTBYTE)<<k;k+=8;}}
#else
# ifdef FIX_PAST_EOB_BY_TABLEADJUST
# define NEEDBITS(n) {while(k<(n)){int c=NEXTBYTE;\
if(c==EOF){retval=1;goto cleanup_and_exit;}\
b|=((ulg)c)<<k;k+=8;}}
# else
# define NEEDBITS(n) {while((int)k<(int)(n)){int c=NEXTBYTE;\
if(c==EOF){if((int)k>=0)break;retval=1;goto cleanup_and_exit;}\
b|=((ulg)c)<<k;k+=8;}}
# endif
#endif
#define DUMPBITS(n) {b>>=(n);k-=(n);}
( run in 1.485 second using v1.01-cache-2.11-cpan-97f6503c9c8 )