⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 inflate.c

📁 完整的解压zip文件的源码。包含密码功能
💻 C
📖 第 1 页 / 共 3 页
字号:
/* Tables for deflate from PKZIP's appnote.txt. */static ZCONST unsigned border[] = { /* Order of the bit length code lengths */        16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};static ZCONST ush cplens[] = {  /* 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};        /* note: see note #13 above about the 258 in this list. */static ZCONST ush cplext[] = {  /* 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, 99, 99}; /* 99==invalid */static ZCONST ush cpdist[] = {  /* 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 ZCONST ush cpdext[] = {  /* 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};/* 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 ush near mask_bits[] = {    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 begining 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. *//* These have been moved to globals.h */#if 0ulg 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#  define NEEDBITS(n) {while(k<(n)){int c=NEXTBYTE;if(c==EOF)return 1;\    b|=((ulg)c)<<k;k+=8;}}#endif                      /* Piet Plomp:  change "return 1" to "break" */#define DUMPBITS(n) {b>>=(n);k-=(n);}/*   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   are 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. */static ZCONST int lbits = 9;    /* bits in base literal/length lookup table */static ZCONST int dbits = 6;    /* bits in base distance lookup table */#ifndef ASM_INFLATECODESint inflate_codes(__G__ tl, td, bl, bd)     __GDEFstruct huft *tl, *td;   /* literal/length and distance decoder tables */int bl, bd;             /* number of bits decoded by tl[] and td[] *//* inflate (decompress) the codes in a deflated (compressed) block.   Return an error code or zero if it all goes ok. */{  register unsigned e;  /* table entry flag/number of extra bits */  unsigned n, d;        /* length and index for copy */  unsigned w;           /* current window position */  struct huft *t;       /* pointer to table entry */  unsigned ml, md;      /* masks for bl and bd bits */  register ulg b;       /* bit buffer */  register unsigned k;  /* number of bits in bit buffer */  /* make local copies of globals */  b = G.bb;                       /* initialize bit buffer */  k = G.bk;  w = G.wp;                       /* initialize window position */  /* inflate the coded data */  ml = mask_bits[bl];           /* precompute masks for speed */  md = mask_bits[bd];  while (1)                     /* do until end of block */  {    NEEDBITS((unsigned)bl)    if ((e = (t = tl + ((unsigned)b & ml))->e) > 16)      do {        if (e == 99)          return 1;        DUMPBITS(t->b)        e -= 16;        NEEDBITS(e)      } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16);    DUMPBITS(t->b)    if (e == 16)                /* then it's a literal */    {      redirSlide[w++] = (uch)t->v.n;      if (w == wsize)      {        FLUSH(w);        w = 0;      }    }    else                        /* it's an EOB or a length */    {      /* exit if end of block */      if (e == 15)        break;      /* get length of block to copy */      NEEDBITS(e)      n = t->v.n + ((unsigned)b & mask_bits[e]);      DUMPBITS(e);      /* decode distance of block to copy */      NEEDBITS((unsigned)bd)      if ((e = (t = td + ((unsigned)b & md))->e) > 16)        do {          if (e == 99)            return 1;          DUMPBITS(t->b)          e -= 16;          NEEDBITS(e)        } while ((e = (t = t->v.t + ((unsigned)b & mask_bits[e]))->e) > 16);      DUMPBITS(t->b)      NEEDBITS(e)      d = w - t->v.n - ((unsigned)b & mask_bits[e]);      DUMPBITS(e)      /* do the copy */      do {#if (defined(DLL) && !defined(NO_SLIDE_REDIR))        if (G.redirect_slide) {/* &= w/ wsize unnecessary & wrong if redirect */          if (d >= wsize)            return 1;           /* invalid compressed data */          n -= (e = (e = wsize - (d > w ? d : w)) > n ? n : e);        }        else#endif          n -= (e = (e = wsize - ((d &= wsize-1) > w ? d : w)) > n ? n : e);#ifndef NOMEMCPY        if (w - d >= e)         /* (this test assumes unsigned comparison) */        {          memcpy(redirSlide + w, redirSlide + d, e);          w += e;          d += e;        }        else                    /* do it slowly to avoid memcpy() overlap */#endif /* !NOMEMCPY */          do {            redirSlide[w++] = redirSlide[d++];          } while (--e);        if (w == wsize)        {          FLUSH(w);          w = 0;        }      } while (n);    }  }  /* restore the globals from the locals */  G.wp = w;                       /* restore global window pointer */  G.bb = b;                       /* restore global bit buffer */  G.bk = k;  /* done */  return 0;}#endif /* ASM_INFLATECODES */static int inflate_stored(__G)     __GDEF/* "decompress" an inflated type 0 (stored) block. */{  unsigned n;           /* number of bytes in block */  unsigned w;           /* current window position */  register ulg b;       /* bit buffer */  register unsigned k;  /* number of bits in bit buffer */  /* make local copies of globals */  Trace((stderr, "\nstored block"));  b = G.bb;                       /* initialize bit buffer */  k = G.bk;  w = G.wp;                       /* initialize window position */  /* go to byte boundary */  n = k & 7;  DUMPBITS(n);  /* get the length and its complement */  NEEDBITS(16)  n = ((unsigned)b & 0xffff);  DUMPBITS(16)  NEEDBITS(16)  if (n != (unsigned)((~b) & 0xffff))    return 1;                   /* error in compressed data */  DUMPBITS(16)  /* read and output the compressed data */  while (n--)  {    NEEDBITS(8)    redirSlide[w++] = (uch)b;    if (w == wsize)    {      FLUSH(w);      w = 0;    }    DUMPBITS(8)  }  /* restore the globals from the locals */  G.wp = w;                       /* restore global window pointer */  G.bb = b;                       /* restore global bit buffer */  G.bk = k;  return 0;}/* Globals for literal tables (built once) *//* Moved to globals.h                      */#if 0struct huft *fixed_tl = (struct huft *)NULL;struct huft *fixed_td;int fixed_bl, fixed_bd;#endifstatic int inflate_fixed(__G)     __GDEF/* decompress an inflated type 1 (fixed Huffman codes) block.  We should   either replace this with a custom decoder, or at least precompute the   Huffman tables. */{  /* if first time, set up tables for fixed blocks */  Trace((stderr, "\nliteral block"));  if (G.fixed_tl == (struct huft *)NULL)  {    int i;                /* temporary variable */    unsigned l[288];      /* length list for huft_build */    /* 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;    G.fixed_bl = 7;    if ((i = huft_build(__G__ l, 288, 257, cplens, cplext,                        &G.fixed_tl, &G.fixed_bl)) != 0)    {      G.fixed_tl = (struct huft *)NULL;      return i;    }    /* distance table */    for (i = 0; i < 30; i++)      /* make an incomplete code set */      l[i] = 5;    G.fixed_bd = 5;    if ((i = huft_build(__G__ l, 30, 0, cpdist, cpdext,                        &G.fixed_td, &G.fixed_bd)) > 1)    {      huft_free(G.fixed_tl);      G.fixed_tl = (struct huft *)NULL;      return i;    }  }  /* decompress until an end-of-block code */  return inflate_codes(__G__ G.fixed_tl, G.fixed_td,                             G.fixed_bl, G.fixed_bd) != 0;}static int inflate_dynamic(__G)  __GDEF/* decompress an inflated type 2 (dynamic Huffman codes) block. */{  int i;                /* temporary variables */  unsigned j;  unsigned l;           /* last length */  unsigned m;           /* mask for bit lengths table */  unsigned n;           /* number of lengths to get */  struct huft *tl;      /* literal/length code table */  struct huft *td;      /* distance code table */  int bl;               /* lookup bits for tl */  int bd;               /* lookup bits for td */  unsigned nb;          /* number of bit length codes */  unsigned nl;          /* number of literal/length codes */  unsigned nd;          /* number of distance codes */#ifdef PKZIP_BUG_WORKAROUND  unsigned ll[288+32]; /* literal/length and distance code lengths */#else  unsigned ll[286+30]; /* literal/length and distance code lengths */#endif  register ulg b;       /* bit buffer */  register unsigned k;  /* number of bits in bit buffer */  /* make local bit buffer */  Trace((stderr, "\ndynamic block"));  b = G.bb;  k = G.bk;  /* read in table lengths */  NEEDBITS(5)  nl = 257 + ((unsigned)b & 0x1f);      /* number of literal/length codes */  DUMPBITS(5)  NEEDBITS(5)  nd = 1 + ((unsigned)b & 0x1f);        /* number of distance codes */  DUMPBITS(5)  NEEDBITS(4)  nb = 4 + ((unsigned)b & 0xf);         /* number of bit length codes */  DUMPBITS(4)#ifdef PKZIP_BUG_WORKAROUND  if (nl > 288 || nd > 32)#else  if (nl > 286 || nd > 30)#endif    return 1;                   /* bad lengths */  /* read in bit-length-code lengths */  for (j = 0; j < nb; j++)  {    NEEDBITS(3)    ll[border[j]] = (unsigned)b & 7;    DUMPBITS(3)  }  for (; j < 19; j++)    ll[border[j]] = 0;  /* build decoding table for trees--single level, 7 bit lookup */  bl = 7;  i = huft_build(__G__ ll, 19, 19, NULL, NULL, &tl, &bl);  if (bl == 0)                        /* no bit lengths */    i = 1;  if (i)  {    if (i == 1)      huft_free(tl);    return i;                   /* incomplete code set */  }  /* read in literal and distance code lengths */  n = nl + nd;  m = mask_bits[bl];  i = l = 0;  while ((unsigned)i < n)  {    NEEDBITS((unsigned)bl)    j = (td = tl + ((unsigned)b & m))->b;    DUMPBITS(j)    j = td->v.n;    if (j < 16)                 /* length of code in bits (0..15) */      ll[i++] = l = j;          /* save last length in l */    else if (j == 16)           /* repeat last length 3 to 6 times */    {      NEEDBITS(2)      j = 3 + ((unsigned)b & 3);      DUMPBITS(2)      if ((unsigned)i + j > n)        return 1;      while (j--)        ll[i++] = l;    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -