亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? infblock.cpp

?? 一個C語言實現的壓縮解壓的工具代碼
?? CPP
字號:
/* infblock.c -- interpret and process block types to last block
 * Copyright (C) 1995-1998 Mark Adler
 * For conditions of distribution and use, see copyright notice in zlib.h 
 */
#include "stdafx.h"

#include "zutil.h"
#include "infblock.h"
#include "inftrees.h"
#include "infcodes.h"
#include "infutil.h"

struct inflate_codes_state {int dummy;}; /* for buggy compilers */

/* simplify the use of the inflate_huft type with some defines */
#define exop word.what.Exop
#define bits word.what.Bits

/* Table for deflate from PKZIP's appnote.txt. */
local const uInt 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};

/*
   Notes beyond the 1.93a appnote.txt:

   1. Distance pointers never point before the beginning of the output
      stream.
   2. Distance pointers can point back across blocks, up to 32k away.
   3. There is an implied maximum of 7 bits for the bit length table and
      15 bits for the actual data.
   4. If only one code exists, then it is encoded using one bit.  (Zero
      would be more efficient, but perhaps a little confusing.)  If two
      codes exist, they are coded using one bit each (0 and 1).
   5. There is no way of sending zero distance codes--a dummy must be
      sent if there are none.  (History: a pre 2.0 version of PKZIP would
      store blocks with no distance codes, but this was discovered to be
      too harsh a criterion.)  Valid only for 1.93a.  2.04c does allow
      zero distance codes, which is sent as one code of zero bits in
      length.
   6. There are up to 286 literal/length codes.  Code 256 represents the
      end-of-block.  Note however that the static length tree defines
      288 codes just to fill out the Huffman codes.  Codes 286 and 287
      cannot be used though, since there is no length base or extra bits
      defined for them.  Similarily, there are up to 30 distance codes.
      However, static trees define 32 codes (all 5 bits) to fill out the
      Huffman codes, but the last two had better not show up in the data.
   7. Unzip can check dynamic Huffman blocks for complete code sets.
      The exception is that a single code would not be complete (see #4).
   8. The five bits following the block type is really the number of
      literal codes sent minus 257.
   9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
      (1+6+6).  Therefore, to output three times the length, you output
      three codes (1+1+1), whereas to output four times the same length,
      you only need two codes (1+3).  Hmm.
  10. In the tree reconstruction algorithm, Code = Code + Increment
      only if BitLength(i) is not zero.  (Pretty obvious.)
  11. Correction: 4 Bits: # of Bit Length codes - 4     (4 - 19)
  12. Note: length code 284 can represent 227-258, but length code 285
      really is 258.  The last length deserves its own, short code
      since it gets used a lot in very redundant files.  The length
      258 is special since 258 - 3 (the min match length) is 255.
  13. The literal/length and distance code bit lengths are read as a
      single stream of lengths.  It is possible (and advantageous) for
      a repeat code (16, 17, or 18) to go across the boundary between
      the two sets of lengths.
 */


void inflate_blocks_reset(inflate_blocks_statef *s,
z_streamp z,
uLongf *c)

{
  if (c != Z_NULL)
    *c = s->check;
  if (s->mode == BTREE || s->mode == DTREE)
    ZFREE(z, s->sub.trees.blens);
  if (s->mode == CODES)
    inflate_codes_free(s->sub.decode.codes, z);
  s->mode = TYPE;
  s->bitk = 0;
  s->bitb = 0;
  s->read = s->write = s->window;
  if (s->checkfn != Z_NULL)
    z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
  Tracev((stderr, "inflate:   blocks reset\n"));
}


inflate_blocks_statef *inflate_blocks_new(z_streamp z,
check_func c,
uInt w)

{
  inflate_blocks_statef *s;

  if ((s = (inflate_blocks_statef *)ZALLOC
       (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
    return s;
  if ((s->hufts =
       (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
  {
    ZFREE(z, s);
    return Z_NULL;
  }
  if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
  {
    ZFREE(z, s->hufts);
    ZFREE(z, s);
    return Z_NULL;
  }
  s->end = s->window + w;
  s->checkfn = c;
  s->mode = TYPE;
  Tracev((stderr, "inflate:   blocks allocated\n"));
  inflate_blocks_reset(s, z, Z_NULL);
  return s;
}


int inflate_blocks(inflate_blocks_statef *s,
z_streamp z,
int r)

{
  uInt t;               /* temporary storage */
  uLong b;              /* bit buffer */
  uInt k;               /* bits in bit buffer */
  Bytef *p;             /* input data pointer */
  uInt n;               /* bytes available there */
  Bytef *q;             /* output window write pointer */
  uInt m;               /* bytes to end of window or read pointer */

  /* copy input/output information to locals (UPDATE macro restores) */
  LOAD

  /* process input based on current state */
  while (1) switch (s->mode)
  {
    case TYPE:
      NEEDBITS(3)
      t = (uInt)b & 7;
      s->last = t & 1;
      switch (t >> 1)
      {
        case 0:                         /* stored */
          Tracev((stderr, "inflate:     stored block%s\n",
                 s->last ? " (last)" : ""));
          DUMPBITS(3)
          t = k & 7;                    /* go to byte boundary */
          DUMPBITS(t)
          s->mode = LENS;               /* get length of stored block */
          break;
        case 1:                         /* fixed */
          Tracev((stderr, "inflate:     fixed codes block%s\n",
                 s->last ? " (last)" : ""));
          {
            uInt bl, bd;
            inflate_huft *tl, *td;

            inflate_trees_fixed(&bl, &bd, &tl, &td, z);
            s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
            if (s->sub.decode.codes == Z_NULL)
            {
              r = Z_MEM_ERROR;
              LEAVE
            }
          }
          DUMPBITS(3)
          s->mode = CODES;
          break;
        case 2:                         /* dynamic */
          Tracev((stderr, "inflate:     dynamic codes block%s\n",
                 s->last ? " (last)" : ""));
          DUMPBITS(3)
          s->mode = TABLE;
          break;
        case 3:                         /* illegal */
          DUMPBITS(3)
          s->mode = BAD;
          z->msg = (char*)"invalid block type";
          r = Z_DATA_ERROR;
          LEAVE
      }
      break;
    case LENS:
      NEEDBITS(32)
      if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
      {
        s->mode = BAD;
        z->msg = (char*)"invalid stored block lengths";
        r = Z_DATA_ERROR;
        LEAVE
      }
      s->sub.left = (uInt)b & 0xffff;
      b = k = 0;                      /* dump bits */
      Tracev((stderr, "inflate:       stored length %u\n", s->sub.left));
      s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
      break;
    case STORED:
      if (n == 0)
        LEAVE
      NEEDOUT
      t = s->sub.left;
      if (t > n) t = n;
      if (t > m) t = m;
      zmemcpy(q, p, t);
      p += t;  n -= t;
      q += t;  m -= t;
      if ((s->sub.left -= t) != 0)
        break;
      Tracev((stderr, "inflate:       stored end, %lu total out\n",
              z->total_out + (q >= s->read ? q - s->read :
              (s->end - s->read) + (q - s->window))));
      s->mode = s->last ? DRY : TYPE;
      break;
    case TABLE:
      NEEDBITS(14)
      s->sub.trees.table = t = (uInt)b & 0x3fff;
#ifndef PKZIP_BUG_WORKAROUND
      if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
      {
        s->mode = BAD;
        z->msg = (char*)"too many length or distance symbols";
        r = Z_DATA_ERROR;
        LEAVE
      }
#endif
      t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
      if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
      {
        r = Z_MEM_ERROR;
        LEAVE
      }
      DUMPBITS(14)
      s->sub.trees.index = 0;
      Tracev((stderr, "inflate:       table sizes ok\n"));
      s->mode = BTREE;
    case BTREE:
      while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
      {
        NEEDBITS(3)
        s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
        DUMPBITS(3)
      }
      while (s->sub.trees.index < 19)
        s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
      s->sub.trees.bb = 7;
      t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
                             &s->sub.trees.tb, s->hufts, z);
      if (t != Z_OK)
      {
        ZFREE(z, s->sub.trees.blens);
        r = t;
        if (r == Z_DATA_ERROR)
          s->mode = BAD;
        LEAVE
      }
      s->sub.trees.index = 0;
      Tracev((stderr, "inflate:       bits tree ok\n"));
      s->mode = DTREE;
    case DTREE:
      while (t = s->sub.trees.table,
             s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
      {
        inflate_huft *h;
        uInt i, j, c;

        t = s->sub.trees.bb;
        NEEDBITS(t)
        h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
        t = h->bits;
        c = h->base;
        if (c < 16)
        {
          DUMPBITS(t)
          s->sub.trees.blens[s->sub.trees.index++] = c;
        }
        else /* c == 16..18 */
        {
          i = c == 18 ? 7 : c - 14;
          j = c == 18 ? 11 : 3;
          NEEDBITS(t + i)
          DUMPBITS(t)
          j += (uInt)b & inflate_mask[i];
          DUMPBITS(i)
          i = s->sub.trees.index;
          t = s->sub.trees.table;
          if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
              (c == 16 && i < 1))
          {
            ZFREE(z, s->sub.trees.blens);
            s->mode = BAD;
            z->msg = (char*)"invalid bit length repeat";
            r = Z_DATA_ERROR;
            LEAVE
          }
          c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
          do {
            s->sub.trees.blens[i++] = c;
          } while (--j);
          s->sub.trees.index = i;
        }
      }
      s->sub.trees.tb = Z_NULL;
      {
        uInt bl, bd;
        inflate_huft *tl, *td;
        inflate_codes_statef *c;

        bl = 9;         /* must be <= 9 for lookahead assumptions */
        bd = 6;         /* must be <= 9 for lookahead assumptions */
        t = s->sub.trees.table;
        t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
                                  s->sub.trees.blens, &bl, &bd, &tl, &td,
                                  s->hufts, z);
        ZFREE(z, s->sub.trees.blens);
        if (t != Z_OK)
        {
          if (t == (uInt)Z_DATA_ERROR)
            s->mode = BAD;
          r = t;
          LEAVE
        }
        Tracev((stderr, "inflate:       trees ok\n"));
        if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
        {
          r = Z_MEM_ERROR;
          LEAVE
        }
        s->sub.decode.codes = c;
      }
      s->mode = CODES;
    case CODES:
      UPDATE
      if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
        return inflate_flush(s, z, r);
      r = Z_OK;
      inflate_codes_free(s->sub.decode.codes, z);
      LOAD
      Tracev((stderr, "inflate:       codes end, %lu total out\n",
              z->total_out + (q >= s->read ? q - s->read :
              (s->end - s->read) + (q - s->window))));
      if (!s->last)
      {
        s->mode = TYPE;
        break;
      }
      s->mode = DRY;
    case DRY:
      FLUSH
      if (s->read != s->write)
        LEAVE
      s->mode = DONE;
    case DONE:
      r = Z_STREAM_END;
      LEAVE
    case BAD:
      r = Z_DATA_ERROR;
      LEAVE
    default:
      r = Z_STREAM_ERROR;
      LEAVE
  }
}


int inflate_blocks_free(inflate_blocks_statef *s,
z_streamp z)

{
  inflate_blocks_reset(s, z, Z_NULL);
  ZFREE(z, s->window);
  ZFREE(z, s->hufts);
  ZFREE(z, s);
  Tracev((stderr, "inflate:   blocks freed\n"));
  return Z_OK;
}


void inflate_set_dictionary(inflate_blocks_statef *s,
const Bytef *d,
uInt  n)

{
  zmemcpy(s->window, d, n);
  s->read = s->write = s->window + n;
}


/* Returns true if inflate is currently at the end of a block generated
 * by Z_SYNC_FLUSH or Z_FULL_FLUSH. 
 * IN assertion: s != Z_NULL
 */
int inflate_blocks_sync_point(inflate_blocks_statef *s)

{
  return s->mode == LENS;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区在线视频| 色婷婷激情一区二区三区| 亚洲男人都懂的| www国产亚洲精品久久麻豆| 91丝袜高跟美女视频| 极品美女销魂一区二区三区 | 日本国产一区二区| 久久精品99国产精品| 亚洲人成精品久久久久| 欧美精品一区二区三区蜜臀| 色吊一区二区三区| 国产另类ts人妖一区二区| 午夜精品国产更新| 亚洲人成网站精品片在线观看| 久久久精品一品道一区| 日韩视频一区二区三区在线播放 | 国产精品久久久久久久久图文区| 欧美精品久久一区二区三区| 99国产精品99久久久久久| 精品一二线国产| 日韩高清一级片| 一区二区三区免费在线观看| 国产精品久久久久影院老司| 久久综合视频网| 日韩手机在线导航| 91精品国产91热久久久做人人| 欧美专区日韩专区| 在线亚洲一区观看| 色婷婷综合在线| 99视频精品在线| 99精品欧美一区二区三区小说| 国产精品白丝jk白祙喷水网站| 蜜臀久久99精品久久久久宅男| 午夜欧美在线一二页| 亚洲国产精品一区二区www在线 | 国产精品国产三级国产aⅴ无密码| 精品福利二区三区| 亚洲精品在线免费播放| 日韩久久久久久| 精品国产一区二区亚洲人成毛片| 日韩一卡二卡三卡四卡| 日韩三级视频中文字幕| 日韩欧美一二三区| 精品理论电影在线观看 | 精品日韩在线一区| 久久久久亚洲蜜桃| 国产日韩欧美一区二区三区综合| 久久久99久久精品欧美| 国产精品丝袜在线| 亚洲色图视频网| 亚洲一区电影777| 日本欧美加勒比视频| 精一区二区三区| 国产成人激情av| 97久久超碰精品国产| 欧美在线不卡视频| 欧美乱妇20p| 精品黑人一区二区三区久久| 国产女主播在线一区二区| 亚洲人成精品久久久久| 婷婷国产v国产偷v亚洲高清| 蜜桃一区二区三区在线观看| 国产一区二区电影| av电影在线观看不卡| 欧美无乱码久久久免费午夜一区| 91精品国产综合久久福利软件 | 视频一区视频二区在线观看| 久久99热国产| 成a人片亚洲日本久久| 在线免费观看成人短视频| 日韩欧美一区在线| 国产精品久久久久久久久免费樱桃| 亚洲欧美日韩在线| 日本va欧美va欧美va精品| 欧美在线你懂的| 日韩美女一区二区三区四区| 中文字幕在线免费不卡| 首页综合国产亚洲丝袜| 国产成人精品一区二| 欧美天堂一区二区三区| 久久五月婷婷丁香社区| 一区二区成人在线视频 | 成人污污视频在线观看| 欧美系列在线观看| 久久网站热最新地址| 亚洲国产日韩a在线播放性色| 国产麻豆成人传媒免费观看| 欧美伊人久久大香线蕉综合69| 欧美本精品男人aⅴ天堂| 亚洲视频你懂的| 国产乱理伦片在线观看夜一区 | 欧美色视频在线观看| 国产日韩精品视频一区| 亚洲va国产va欧美va观看| 高清国产一区二区三区| 4438成人网| 亚洲精品中文在线影院| 狠狠色综合日日| 欧美精品1区2区3区| 国产精品福利影院| 激情综合色丁香一区二区| 欧美中文字幕一二三区视频| 中文乱码免费一区二区| 美洲天堂一区二卡三卡四卡视频 | 欧美综合一区二区三区| 日本一区二区成人在线| 免费观看30秒视频久久| 色综合夜色一区| 久久久久99精品一区| 喷白浆一区二区| 欧美在线不卡视频| 亚洲欧美一区二区久久 | av成人免费在线| 欧美精品一区视频| 青青草国产成人99久久| 欧美性色欧美a在线播放| 亚洲欧洲美洲综合色网| 国产成人亚洲综合a∨婷婷图片| 欧美一区二区三区免费大片| 亚洲一区二区三区中文字幕| 99久久精品国产毛片| 一区二区三区资源| 大美女一区二区三区| 91精品国产免费| 亚洲一区二区在线免费观看视频| 国产成人午夜99999| 精品日韩在线观看| 裸体一区二区三区| 欧美一区二区三区色| 奇米在线7777在线精品| 欧美中文字幕亚洲一区二区va在线| 亚洲色图丝袜美腿| 色婷婷激情久久| 亚洲女人小视频在线观看| 97se亚洲国产综合自在线观| 中文字幕在线不卡| 91免费精品国自产拍在线不卡| 国产精品国产三级国产专播品爱网| 成人性视频免费网站| 中文欧美字幕免费| 91丨九色丨尤物| 一区二区三区在线免费| 色综合网色综合| 亚洲黄色免费网站| 欧美日韩不卡一区二区| 日韩电影在线免费观看| 精品入口麻豆88视频| 国产盗摄女厕一区二区三区| 国产精品午夜久久| 色一区在线观看| 天天做天天摸天天爽国产一区 | 成人午夜碰碰视频| 亚洲欧洲av在线| 欧美在线观看视频一区二区三区| 亚洲mv大片欧洲mv大片精品| 欧美一个色资源| 国产一区二区三区免费在线观看| 中文字幕乱码一区二区免费| 91视视频在线观看入口直接观看www | 欧美在线播放高清精品| 日韩高清国产一区在线| 久久久久免费观看| 色综合一个色综合| 日日摸夜夜添夜夜添精品视频| 日韩一区二区三区av| 国产91丝袜在线播放| 一区二区免费在线播放| 91精品国产色综合久久| 成人小视频免费观看| 亚洲电影第三页| 久久女同互慰一区二区三区| 91影视在线播放| 日本va欧美va瓶| 中文字幕亚洲视频| 欧美日韩一卡二卡| 国产成人欧美日韩在线电影| 一级精品视频在线观看宜春院 | 一区二区三区国产精华| 欧美大片拔萝卜| 不卡欧美aaaaa| 日本美女一区二区| 中文字幕一区av| 精品毛片乱码1区2区3区 | 久久久美女艺术照精彩视频福利播放| 99精品视频在线播放观看| 另类的小说在线视频另类成人小视频在线 | 国产精品一区二区三区乱码| 国产精品福利一区| 日韩欧美一区电影| 色一区在线观看| 国产成人av网站| 男男成人高潮片免费网站| 中文字幕一区二区在线播放| 精品日韩成人av| 欧美猛男gaygay网站| 色婷婷狠狠综合| 粉嫩aⅴ一区二区三区四区五区 | 日韩有码一区二区三区| 国产精品久99| 精品粉嫩aⅴ一区二区三区四区|