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

📄 lzmadecode.c

📁 Linux Home Server 是专门为家庭和SOHO/SMB 设计的高性价比的ISCSI 存储服务器, 具有如下的特色: 强大的iscsi 存储服务器软件; 混合iscsi 和NAS 服务;
💻 C
📖 第 1 页 / 共 2 页
字号:
#endif  *outSizeProcessed = 0;  while(nowPos < outSize)  {    CProb *prob;    UInt32 bound;    int posState = (int)(        (nowPos         #ifdef _LZMA_OUT_READ        + globalPos        #endif        )        & posStateMask);    prob = p + IsMatch + (state << kNumPosBitsMax) + posState;    IfBit0(prob)    {      int symbol = 1;      UpdateBit0(prob)      prob = p + Literal + (LZMA_LIT_SIZE *         (((        (nowPos         #ifdef _LZMA_OUT_READ        + globalPos        #endif        )        & literalPosMask) << lc) + (previousByte >> (8 - lc))));      if (state >= kNumLitStates)      {        int matchByte;        #ifdef _LZMA_OUT_READ        UInt32 pos = dictionaryPos - rep0;        if (pos >= dictionarySize)          pos += dictionarySize;        matchByte = dictionary[pos];        #else        matchByte = outStream[nowPos - rep0];        #endif        do        {          int bit;          CProb *probLit;          matchByte <<= 1;          bit = (matchByte & 0x100);          probLit = prob + 0x100 + bit + symbol;          RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break)        }        while (symbol < 0x100);      }      while (symbol < 0x100)      {        CProb *probLit = prob + symbol;        RC_GET_BIT(probLit, symbol)      }      previousByte = (Byte)symbol;      outStream[nowPos++] = previousByte;      #ifdef _LZMA_OUT_READ      dictionary[dictionaryPos] = previousByte;      if (++dictionaryPos == dictionarySize)        dictionaryPos = 0;      #endif      if (state < 4) state = 0;      else if (state < 10) state -= 3;      else state -= 6;    }    else                 {      UpdateBit1(prob);      prob = p + IsRep + state;      IfBit0(prob)      {        UpdateBit0(prob);        rep3 = rep2;        rep2 = rep1;        rep1 = rep0;        state = state < kNumLitStates ? 0 : 3;        prob = p + LenCoder;      }      else      {        UpdateBit1(prob);        prob = p + IsRepG0 + state;        IfBit0(prob)        {          UpdateBit0(prob);          prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState;          IfBit0(prob)          {            #ifdef _LZMA_OUT_READ            UInt32 pos;            #endif            UpdateBit0(prob);            if (nowPos                 #ifdef _LZMA_OUT_READ                + globalPos                #endif                == 0)              return LZMA_RESULT_DATA_ERROR;            state = state < kNumLitStates ? 9 : 11;            #ifdef _LZMA_OUT_READ            pos = dictionaryPos - rep0;            if (pos >= dictionarySize)              pos += dictionarySize;            previousByte = dictionary[pos];            dictionary[dictionaryPos] = previousByte;            if (++dictionaryPos == dictionarySize)              dictionaryPos = 0;            #else            previousByte = outStream[nowPos - rep0];            #endif            outStream[nowPos++] = previousByte;            continue;          }          else          {            UpdateBit1(prob);          }        }        else        {          UInt32 distance;          UpdateBit1(prob);          prob = p + IsRepG1 + state;          IfBit0(prob)          {            UpdateBit0(prob);            distance = rep1;          }          else           {            UpdateBit1(prob);            prob = p + IsRepG2 + state;            IfBit0(prob)            {              UpdateBit0(prob);              distance = rep2;            }            else            {              UpdateBit1(prob);              distance = rep3;              rep3 = rep2;            }            rep2 = rep1;          }          rep1 = rep0;          rep0 = distance;        }        state = state < kNumLitStates ? 8 : 11;        prob = p + RepLenCoder;      }      {        int numBits, offset;        CProb *probLen = prob + LenChoice;        IfBit0(probLen)        {          UpdateBit0(probLen);          probLen = prob + LenLow + (posState << kLenNumLowBits);          offset = 0;          numBits = kLenNumLowBits;        }        else        {          UpdateBit1(probLen);          probLen = prob + LenChoice2;          IfBit0(probLen)          {            UpdateBit0(probLen);            probLen = prob + LenMid + (posState << kLenNumMidBits);            offset = kLenNumLowSymbols;            numBits = kLenNumMidBits;          }          else          {            UpdateBit1(probLen);            probLen = prob + LenHigh;            offset = kLenNumLowSymbols + kLenNumMidSymbols;            numBits = kLenNumHighBits;          }        }        RangeDecoderBitTreeDecode(probLen, numBits, len);        len += offset;      }      if (state < 4)      {        int posSlot;        state += kNumLitStates;        prob = p + PosSlot +            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<             kNumPosSlotBits);        RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot);        if (posSlot >= kStartPosModelIndex)        {          int numDirectBits = ((posSlot >> 1) - 1);          rep0 = (2 | ((UInt32)posSlot & 1));          if (posSlot < kEndPosModelIndex)          {            rep0 <<= numDirectBits;            prob = p + SpecPos + rep0 - posSlot - 1;          }          else          {            numDirectBits -= kNumAlignBits;            do            {              RC_NORMALIZE              Range >>= 1;              rep0 <<= 1;              if (Code >= Range)              {                Code -= Range;                rep0 |= 1;              }            }            while (--numDirectBits != 0);            prob = p + Align;            rep0 <<= kNumAlignBits;            numDirectBits = kNumAlignBits;          }          {            int i = 1;            int mi = 1;            do            {              CProb *prob3 = prob + mi;              RC_GET_BIT2(prob3, mi, ; , rep0 |= i);              i <<= 1;            }            while(--numDirectBits != 0);          }        }        else          rep0 = posSlot;        if (++rep0 == (UInt32)(0))        {          /* it's for stream version */          len = -1;          break;        }      }      len += kMatchMinLen;      if (rep0 > nowPos         #ifdef _LZMA_OUT_READ        + globalPos || rep0 > dictionarySize        #endif        )         return LZMA_RESULT_DATA_ERROR;      do      {        #ifdef _LZMA_OUT_READ        UInt32 pos = dictionaryPos - rep0;        if (pos >= dictionarySize)          pos += dictionarySize;        previousByte = dictionary[pos];        dictionary[dictionaryPos] = previousByte;        if (++dictionaryPos == dictionarySize)          dictionaryPos = 0;        #else        previousByte = outStream[nowPos - rep0];        #endif        len--;        outStream[nowPos++] = previousByte;      }      while(len != 0 && nowPos < outSize);    }  }  RC_NORMALIZE;  #ifdef _LZMA_OUT_READ  vs->Buffer = Buffer;  vs->BufferLim = BufferLim;  vs->Range = Range;  vs->Code = Code;  vs->DictionaryPos = dictionaryPos;  vs->GlobalPos = globalPos + nowPos;  vs->Reps[0] = rep0;  vs->Reps[1] = rep1;  vs->Reps[2] = rep2;  vs->Reps[3] = rep3;  vs->State = state;  vs->RemainLen = len;  vs->TempDictionary[0] = tempDictionary[0];  #endif  *outSizeProcessed = nowPos;  return LZMA_RESULT_OK;}

⌨️ 快捷键说明

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