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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? lzfind.c

?? Cromfs is a compressed read-only filesystem for Linux. Cromfs is best at archiving gigabytes of big
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* LzFind.c -- Match finder for LZ algorithms
2008-10-04 : Igor Pavlov : Public domain */

#include <string.h>

#include "LzFind.h"
#include "LzHash.h"

#define kEmptyHashValue 0
#define kMaxValForNormalize ((UInt32)0xFFFFFFFF)
#define kNormalizeStepMin (1 << 10) /* it must be power of 2 */
#define kNormalizeMask (~(kNormalizeStepMin - 1))
#define kMaxHistorySize ((UInt32)3 << 30)

#define kStartMaxLen 3

static void LzInWindow_Free(CMatchFinder *p, ISzAlloc *alloc)
{
  if (!p->directInput)
  {
    alloc->Free(alloc, p->bufferBase);
    p->bufferBase = 0;
  }
}

/* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */

static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAlloc *alloc)
{
  UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
  if (p->directInput)
  {
    p->blockSize = blockSize;
    return 1;
  }
  if (p->bufferBase == 0 || p->blockSize != blockSize)
  {
    LzInWindow_Free(p, alloc);
    p->blockSize = blockSize;
    p->bufferBase = (Byte *)alloc->Alloc(alloc, (size_t)blockSize);
  }
  return (p->bufferBase != 0);
}

Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
static Byte MatchFinder_GetIndexByte(CMatchFinder *p, Int32 bindex) { return p->buffer[bindex]; }

static UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }

void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
{
  p->posLimit -= subValue;
  p->pos -= subValue;
  p->streamPos -= subValue;
}

static void MatchFinder_ReadBlock(CMatchFinder *p)
{
  if (p->streamEndWasReached || p->result != SZ_OK)
    return;
  for (;;)
  {
    Byte *dest = p->buffer + (p->streamPos - p->pos);
    size_t size = (p->bufferBase + p->blockSize - dest);
    if (size == 0)
      return;
    p->result = p->stream->Read(p->stream, dest, &size);
    if (p->result != SZ_OK)
      return;
    if (size == 0)
    {
      p->streamEndWasReached = 1;
      return;
    }
    p->streamPos += (UInt32)size;
    if (p->streamPos - p->pos > p->keepSizeAfter)
      return;
  }
}

void MatchFinder_MoveBlock(CMatchFinder *p)
{
  memmove(p->bufferBase,
    p->buffer - p->keepSizeBefore,
    (size_t)(p->streamPos - p->pos + p->keepSizeBefore));
  p->buffer = p->bufferBase + p->keepSizeBefore;
}

int MatchFinder_NeedMove(CMatchFinder *p)
{
  /* if (p->streamEndWasReached) return 0; */
  return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
}

void MatchFinder_ReadIfRequired(CMatchFinder *p)
{
  if (p->streamEndWasReached)
    return;
  if (p->keepSizeAfter >= p->streamPos - p->pos)
    MatchFinder_ReadBlock(p);
}

static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
{
  if (MatchFinder_NeedMove(p))
    MatchFinder_MoveBlock(p);
  MatchFinder_ReadBlock(p);
}

static void MatchFinder_SetDefaultSettings(CMatchFinder *p)
{
  p->cutValue = 32;
  p->btMode = 1;
  p->numHashBytes = 4;
  /* p->skipModeBits = 0; */
  p->directInput = 0;
  p->bigHash = 0;
}

#define kCrcPoly 0xEDB88320

void MatchFinder_Construct(CMatchFinder *p)
{
  UInt32 i;
  p->bufferBase = 0;
  p->directInput = 0;
  p->hash = 0;
  MatchFinder_SetDefaultSettings(p);

  for (i = 0; i < 256; i++)
  {
    UInt32 r = i;
    int j;
    for (j = 0; j < 8; j++)
      r = (r >> 1) ^ (kCrcPoly & ~((r & 1) - 1));
    p->crc[i] = r;
  }
}

static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAlloc *alloc)
{
  alloc->Free(alloc, p->hash);
  p->hash = 0;
}

void MatchFinder_Free(CMatchFinder *p, ISzAlloc *alloc)
{
  MatchFinder_FreeThisClassMemory(p, alloc);
  LzInWindow_Free(p, alloc);
}

static CLzRef* AllocRefs(UInt32 num, ISzAlloc *alloc)
{
  size_t sizeInBytes = (size_t)num * sizeof(CLzRef);
  if (sizeInBytes / sizeof(CLzRef) != num)
    return 0;
  return (CLzRef *)alloc->Alloc(alloc, sizeInBytes);
}

int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
    UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
    ISzAlloc *alloc)
{
  UInt32 sizeReserv;
  if (historySize > kMaxHistorySize)
  {
    MatchFinder_Free(p, alloc);
    return 0;
  }
  sizeReserv = historySize >> 1;
  if (historySize > ((UInt32)2 << 30))
    sizeReserv = historySize >> 2;
  sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19);

  p->keepSizeBefore = historySize + keepAddBufferBefore + 1;
  p->keepSizeAfter = matchMaxLen + keepAddBufferAfter;
  /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */
  if (LzInWindow_Create(p, sizeReserv, alloc))
  {
    UInt32 newCyclicBufferSize = (historySize /* >> p->skipModeBits */) + 1;
    UInt32 hs;
    p->matchMaxLen = matchMaxLen;
    {
      p->fixedHashSize = 0;
      if (p->numHashBytes == 2)
        hs = (1 << 16) - 1;
      else
      {
        hs = historySize - 1;
        hs |= (hs >> 1);
        hs |= (hs >> 2);
        hs |= (hs >> 4);
        hs |= (hs >> 8);
        hs >>= 1;
        /* hs >>= p->skipModeBits; */
        hs |= 0xFFFF; /* don't change it! It's required for Deflate */
        if (hs > (1 << 24))
        {
          if (p->numHashBytes == 3)
            hs = (1 << 24) - 1;
          else
            hs >>= 1;
        }
      }
      p->hashMask = hs;
      hs++;
      if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size;
      if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size;
      if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size;
      hs += p->fixedHashSize;
    }

    {
      UInt32 prevSize = p->hashSizeSum + p->numSons;
      UInt32 newSize;
      p->historySize = historySize;
      p->hashSizeSum = hs;
      p->cyclicBufferSize = newCyclicBufferSize;
      p->numSons = (p->btMode ? newCyclicBufferSize * 2 : newCyclicBufferSize);
      newSize = p->hashSizeSum + p->numSons;
      if (p->hash != 0 && prevSize == newSize)
        return 1;
      MatchFinder_FreeThisClassMemory(p, alloc);
      p->hash = AllocRefs(newSize, alloc);
      if (p->hash != 0)
      {
        p->son = p->hash + p->hashSizeSum;
        return 1;
      }
    }
  }
  MatchFinder_Free(p, alloc);
  return 0;
}

static void MatchFinder_SetLimits(CMatchFinder *p)
{
  UInt32 limit = kMaxValForNormalize - p->pos;
  UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos;
  if (limit2 < limit)
    limit = limit2;
  limit2 = p->streamPos - p->pos;
  if (limit2 <= p->keepSizeAfter)
  {
    if (limit2 > 0)
      limit2 = 1;
  }
  else
    limit2 -= p->keepSizeAfter;
  if (limit2 < limit)
    limit = limit2;
  {
    UInt32 lenLimit = p->streamPos - p->pos;
    if (lenLimit > p->matchMaxLen)
      lenLimit = p->matchMaxLen;
    p->lenLimit = lenLimit;
  }
  p->posLimit = p->pos + limit;
}

void MatchFinder_Init(CMatchFinder *p)
{
  UInt32 i;
  for (i = 0; i < p->hashSizeSum; i++)
    p->hash[i] = kEmptyHashValue;
  p->cyclicBufferPos = 0;
  p->buffer = p->bufferBase;
  p->pos = p->streamPos = p->cyclicBufferSize;
  p->result = SZ_OK;
  p->streamEndWasReached = 0;
  MatchFinder_ReadBlock(p);
  MatchFinder_SetLimits(p);
}

static UInt32 MatchFinder_GetSubValue(CMatchFinder *p)
{
  return (p->pos - p->historySize - 1) & kNormalizeMask;
}

void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, UInt32 numItems)
{
  UInt32 i;
  for (i = 0; i < numItems; i++)
  {
    UInt32 value = items[i];
    if (value <= subValue)
      value = kEmptyHashValue;
    else
      value -= subValue;
    items[i] = value;
  }
}

static void MatchFinder_Normalize(CMatchFinder *p)
{
  UInt32 subValue = MatchFinder_GetSubValue(p);
  MatchFinder_Normalize3(subValue, p->hash, p->hashSizeSum + p->numSons);
  MatchFinder_ReduceOffsets(p, subValue);
}

static void MatchFinder_CheckLimits(CMatchFinder *p)
{
  if (p->pos == kMaxValForNormalize)
    MatchFinder_Normalize(p);
  if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos)
    MatchFinder_CheckAndMoveAndRead(p);
  if (p->cyclicBufferPos == p->cyclicBufferSize)
    p->cyclicBufferPos = 0;
  MatchFinder_SetLimits(p);
}

static UInt32 * Hc_GetMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
    UInt32 *distances, UInt32 maxLen)
{
  son[_cyclicBufferPos] = curMatch;
  for (;;)
  {
    UInt32 delta = pos - curMatch;
    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
      return distances;
    {
      const Byte *pb = cur - delta;
      curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
      if (pb[maxLen] == cur[maxLen] && *pb == *cur)
      {
        UInt32 len = 0;
        while (++len != lenLimit)
          if (pb[len] != cur[len])
            break;
        if (maxLen < len)
        {
          *distances++ = maxLen = len;
          *distances++ = delta - 1;
          if (len == lenLimit)
            return distances;
        }
      }
    }
  }
}

UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
    UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
    UInt32 *distances, UInt32 maxLen)
{
  CLzRef *ptr0 = son + (_cyclicBufferPos << 1) + 1;
  CLzRef *ptr1 = son + (_cyclicBufferPos << 1);
  UInt32 len0 = 0, len1 = 0;
  for (;;)
  {
    UInt32 delta = pos - curMatch;
    if (cutValue-- == 0 || delta >= _cyclicBufferSize)
    {
      *ptr0 = *ptr1 = kEmptyHashValue;
      return distances;
    }
    {
      CLzRef *pair = son + ((_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
      const Byte *pb = cur - delta;
      UInt32 len = (len0 < len1 ? len0 : len1);
      if (pb[len] == cur[len])
      {
        if (++len != lenLimit && pb[len] == cur[len])
          while (++len != lenLimit)
            if (pb[len] != cur[len])
              break;
        if (maxLen < len)
        {
          *distances++ = maxLen = len;
          *distances++ = delta - 1;
          if (len == lenLimit)
          {
            *ptr1 = pair[0];
            *ptr0 = pair[1];
            return distances;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一区二区三区在线免费观看| 日韩免费福利电影在线观看| 中文久久乱码一区二区| 国产精品99久| 国产精品人成在线观看免费| 99久久精品国产毛片| 一区二区三区免费网站| 欧美日韩一级片在线观看| 天天影视色香欲综合网老头| 日韩精品专区在线| 风流少妇一区二区| 樱桃视频在线观看一区| 欧美一区二区三区在线视频| 黑人精品欧美一区二区蜜桃| 国产欧美一二三区| 欧洲av在线精品| 开心九九激情九九欧美日韩精美视频电影| 欧美精品一区二区三区在线| 欧美日韩三级视频| 国产在线精品一区二区夜色| 日本一区二区电影| 欧美日韩国产在线观看| 精品在线你懂的| 亚洲色图20p| 欧美一区二区久久久| 国产成人一区二区精品非洲| 亚洲一区二区四区蜜桃| 精品国产麻豆免费人成网站| 色综合中文综合网| 亚洲成va人在线观看| 欧美va在线播放| 色婷婷av一区| 国产一区二区中文字幕| 亚洲免费高清视频在线| 久久欧美一区二区| 欧美日韩视频在线第一区| 国产不卡视频在线播放| 日本欧美加勒比视频| 中文字幕一区二区三区蜜月| 欧美一级生活片| 欧美在线|欧美| 成人av影视在线观看| 三级精品在线观看| 亚洲精品欧美激情| 久久精品在线免费观看| 51精品秘密在线观看| 99久久综合精品| 国产精品69毛片高清亚洲| 天天做天天摸天天爽国产一区| 国产精品不卡在线| 久久亚洲私人国产精品va媚药| 欧美亚洲动漫精品| 91浏览器在线视频| 成人综合婷婷国产精品久久蜜臀| 99视频国产精品| 国产成人av自拍| 精品一区二区综合| 久久机这里只有精品| 日韩在线播放一区二区| 亚洲成人黄色影院| 亚洲中国最大av网站| 亚洲少妇中出一区| 自拍av一区二区三区| 国产欧美一区二区三区沐欲| 精品粉嫩超白一线天av| 日韩亚洲国产中文字幕欧美| 欧美午夜电影在线播放| 日本久久一区二区三区| 91麻豆福利精品推荐| 99久久99久久免费精品蜜臀| 成人自拍视频在线| 成人小视频在线| 高清不卡一区二区| 成人禁用看黄a在线| 国产999精品久久| 成人美女视频在线观看| 成人av动漫网站| 成人av免费在线| 99国产精品国产精品久久| 成人午夜av影视| kk眼镜猥琐国模调教系列一区二区| 成人免费av在线| 91麻豆免费在线观看| 日本韩国欧美一区二区三区| 在线一区二区三区四区| 欧美日韩一区二区欧美激情| 欧美电影在哪看比较好| 4438x亚洲最大成人网| 欧美一区二区视频免费观看| 精品国产一二三| 中文字幕欧美三区| 一区二区三区精品| 视频在线观看国产精品| 在线精品视频免费播放| 欧美日韩色一区| 精品国产免费视频| 国产精品理论在线观看| 一区二区三区在线观看国产| 丝袜a∨在线一区二区三区不卡| 首页国产欧美日韩丝袜| 国产一区二区三区香蕉| gogo大胆日本视频一区| 欧美最猛黑人xxxxx猛交| 制服丝袜亚洲精品中文字幕| 精品国产伦一区二区三区观看方式 | 狠狠v欧美v日韩v亚洲ⅴ| 国v精品久久久网| 在线精品视频小说1| 欧美一级一级性生活免费录像| 国产亚洲人成网站| 一区二区三区**美女毛片| 青青草精品视频| 国产成人在线观看| 欧美日韩小视频| 国产日韩成人精品| 午夜精品国产更新| 国产+成+人+亚洲欧洲自线| 欧美视频在线播放| 国产女人aaa级久久久级 | 久久九九99视频| 亚洲一区二区视频在线| 国产中文字幕一区| 欧美在线观看视频一区二区三区| 欧美电视剧在线看免费| 亚洲欧美另类图片小说| 另类综合日韩欧美亚洲| 99这里只有久久精品视频| 日韩一区国产二区欧美三区| 亚洲国产精品v| 日韩电影在线观看一区| 9久草视频在线视频精品| 日韩你懂的电影在线观看| 亚洲黄一区二区三区| 国产精品一品二品| 国产性做久久久久久| 亚洲图片欧美视频| 成人av综合一区| 久久人人爽人人爽| 日本欧美一区二区| 欧美视频完全免费看| 1区2区3区精品视频| 国产成人在线免费| 精品国产乱码久久久久久老虎| 视频一区视频二区中文| 色网综合在线观看| 国产精品每日更新| 国产成人精品亚洲日本在线桃色| 91精品国产色综合久久不卡电影| 又紧又大又爽精品一区二区| 成人夜色视频网站在线观看| 久久综合九色综合97婷婷| 免费不卡在线观看| 欧美日韩精品三区| 亚洲一区二区三区四区在线免费观看| www.亚洲色图.com| 中文字幕 久热精品 视频在线| 激情偷乱视频一区二区三区| 91精品婷婷国产综合久久| 午夜免费久久看| 欧美日韩中文另类| 亚洲成人免费电影| 欧美精选午夜久久久乱码6080| 亚洲美女在线一区| 色婷婷久久综合| 一级女性全黄久久生活片免费| 91在线视频观看| 亚洲一区在线视频观看| 色综合久久综合中文综合网| 亚洲欧洲综合另类| 欧美在线一区二区| 亚洲观看高清完整版在线观看| 欧美中文字幕一区二区三区| 亚洲一区免费在线观看| 欧美人伦禁忌dvd放荡欲情| 日韩在线一二三区| 日韩一区二区免费视频| 青青草精品视频| 欧美一级二级三级蜜桃| 激情丁香综合五月| 欧美国产激情一区二区三区蜜月| 国产69精品久久99不卡| 亚洲情趣在线观看| 欧美日韩激情在线| 久久精品噜噜噜成人av农村| 精品国产乱码久久久久久久| 国产盗摄一区二区| 亚洲欧美一区二区三区国产精品| 91黄视频在线观看| 亚洲午夜国产一区99re久久| 337p亚洲精品色噜噜狠狠| 久久av资源站| 国产精品午夜电影| 欧美午夜电影在线播放| 日本不卡一区二区三区| 久久久久久久av麻豆果冻| av在线播放不卡| 日韩精品国产欧美| 国产婷婷精品av在线| 在线亚洲一区观看| 精品一区二区三区在线播放|