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

📄 explode.c

📁 完整的解压zip文件的源码。包含密码功能
💻 C
📖 第 1 页 / 共 3 页
字号:
      /* do the copy */      s -= n;      do {#if (defined(DLL) && !defined(NO_SLIDE_REDIR))        if (G.redirect_slide) {          /* &= w/ wsize not needed and wrong if redirect */          if (d >= wsize)            return 1;          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);        if (u && w <= d)        {          memzero(redirSlide + w, e);          w += e;          d += e;        }        else#ifndef NOMEMCPY          if (w - d >= e)       /* (this test assumes unsigned comparison) */          {            memcpy(redirSlide + w, redirSlide + d, e);            w += e;            d += e;          }          else                  /* do it slow to avoid memcpy() overlap */#endif /* !NOMEMCPY */            do {              redirSlide[w++] = redirSlide[d++];            } while (--e);        if (w == wsize)        {          flush(__G__ redirSlide, (ulg)w, 0);          w = u = 0;        }      } while (n);    }  }  /* flush out redirSlide */  flush(__G__ redirSlide, (ulg)w, 0);  if (G.csize + G.incnt + (k >> 3))   /* should have read csize bytes, but */  {                        /* sometimes read one too many:  k>>3 compensates */    G.used_csize = G.lrec.csize - G.csize - G.incnt - (k >> 3);    return 5;  }  return 0;}static int explode_lit4(__G__ tb, tl, td, bb, bl, bd)     __GDEFstruct huft *tb, *tl, *td;      /* literal, length, and distance tables */int bb, bl, bd;                 /* number of bits decoded by those *//* Decompress the imploded data using coded literals and a 4K sliding   window. */{  long s;               /* bytes to decompress */  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 mb, ml, md;  /* masks for bb, bl, and bd bits */  register ulg b;       /* bit buffer */  register unsigned k;  /* number of bits in bit buffer */  unsigned u;           /* true if unflushed */  /* explode the coded data */  b = k = w = 0;                /* initialize bit buffer, window */  u = 1;                        /* buffer unflushed */  mb = mask_bits[bb];           /* precompute masks for speed */  ml = mask_bits[bl];  md = mask_bits[bd];  s = G.ucsize;  while (s > 0)                 /* do until ucsize bytes uncompressed */  {    NEEDBITS(1)    if (b & 1)                  /* then literal--decode it */    {      DUMPBITS(1)      s--;      NEEDBITS((unsigned)bb)    /* get coded literal */      if ((e = (t = tb + ((~(unsigned)b) & mb))->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)      redirSlide[w++] = (uch)t->v.n;      if (w == wsize)      {        flush(__G__ redirSlide, (ulg)w, 0);        w = u = 0;      }    }    else                        /* else distance/length */    {      DUMPBITS(1)      NEEDBITS(6)               /* get distance low bits */      d = (unsigned)b & 0x3f;      DUMPBITS(6)      NEEDBITS((unsigned)bd)    /* get coded distance high bits */      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)      d = w - d - t->v.n;       /* construct offset */      NEEDBITS((unsigned)bl)    /* get coded length */      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)      n = t->v.n;      if (e)                    /* get length extra bits */      {        NEEDBITS(8)        n += (unsigned)b & 0xff;        DUMPBITS(8)      }      /* do the copy */      s -= n;      do {#if (defined(DLL) && !defined(NO_SLIDE_REDIR))        if (G.redirect_slide) {          /* &= w/ wsize not needed and wrong if redirect */          if (d >= wsize)            return 1;          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);        if (u && w <= d)        {          memzero(redirSlide + w, e);          w += e;          d += e;        }        else#ifndef NOMEMCPY          if (w - d >= e)       /* (this test assumes unsigned comparison) */          {            memcpy(redirSlide + w, redirSlide + d, e);            w += e;            d += e;          }          else                  /* do it slow to avoid memcpy() overlap */#endif /* !NOMEMCPY */            do {              redirSlide[w++] = redirSlide[d++];            } while (--e);        if (w == wsize)        {          flush(__G__ redirSlide, (ulg)w, 0);          w = u = 0;        }      } while (n);    }  }  /* flush out redirSlide */  flush(__G__ redirSlide, (ulg)w, 0);  if (G.csize + G.incnt + (k >> 3))   /* should have read csize bytes, but */  {                        /* sometimes read one too many:  k>>3 compensates */    G.used_csize = G.lrec.csize - G.csize - G.incnt - (k >> 3);    return 5;  }  return 0;}static int explode_nolit8(__G__ tl, td, bl, bd)     __GDEFstruct huft *tl, *td;   /* length and distance decoder tables */int bl, bd;             /* number of bits decoded by tl[] and td[] *//* Decompress the imploded data using uncoded literals and an 8K sliding   window. */{  long s;               /* bytes to decompress */  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 */  unsigned u;           /* true if unflushed */  /* explode the coded data */  b = k = w = 0;                /* initialize bit buffer, window */  u = 1;                        /* buffer unflushed */  ml = mask_bits[bl];           /* precompute masks for speed */  md = mask_bits[bd];  s = G.ucsize;  while (s > 0)                 /* do until ucsize bytes uncompressed */  {    NEEDBITS(1)    if (b & 1)                  /* then literal--get eight bits */    {      DUMPBITS(1)      s--;      NEEDBITS(8)      redirSlide[w++] = (uch)b;      if (w == wsize)      {        flush(__G__ redirSlide, (ulg)w, 0);        w = u = 0;      }      DUMPBITS(8)    }    else                        /* else distance/length */    {      DUMPBITS(1)      NEEDBITS(7)               /* get distance low bits */      d = (unsigned)b & 0x7f;      DUMPBITS(7)      NEEDBITS((unsigned)bd)    /* get coded distance high bits */      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)      d = w - d - t->v.n;       /* construct offset */      NEEDBITS((unsigned)bl)    /* get coded length */      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)      n = t->v.n;      if (e)                    /* get length extra bits */      {        NEEDBITS(8)        n += (unsigned)b & 0xff;        DUMPBITS(8)      }      /* do the copy */      s -= n;      do {#if (defined(DLL) && !defined(NO_SLIDE_REDIR))        if (G.redirect_slide) {          /* &= w/ wsize not needed and wrong if redirect */          if (d >= wsize)            return 1;          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);        if (u && w <= d)        {          memzero(redirSlide + w, e);          w += e;          d += e;        }        else#ifndef NOMEMCPY          if (w - d >= e)       /* (this test assumes unsigned comparison) */          {            memcpy(redirSlide + w, redirSlide + d, e);            w += e;            d += e;          }          else                  /* do it slow to avoid memcpy() overlap */#endif /* !NOMEMCPY */

⌨️ 快捷键说明

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