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 )