📄 002-lzma_decompress.patch
字号:
+int LzmaLenDecode(CProb *p, CRangeDecoder *rd, int posState)+{+ if(RangeDecoderBitDecode(p + LenChoice, rd) == 0)+ return RangeDecoderBitTreeDecode(p + LenLow ++ (posState << kLenNumLowBits), kLenNumLowBits, rd);+ if(RangeDecoderBitDecode(p + LenChoice2, rd) == 0)+ return kLenNumLowSymbols + RangeDecoderBitTreeDecode(p + LenMid ++ (posState << kLenNumMidBits), kLenNumMidBits, rd);+ return kLenNumLowSymbols + kLenNumMidSymbols ++ RangeDecoderBitTreeDecode(p + LenHigh, kLenNumHighBits, rd);+}++#define kNumStates 12++#define kStartPosModelIndex 4+#define kEndPosModelIndex 14+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))++#define kNumPosSlotBits 6+#define kNumLenToPosStates 4++#define kNumAlignBits 4+#define kAlignTableSize (1 << kNumAlignBits)++#define kMatchMinLen 2++#define IsMatch 0+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))+#define IsRepG0 (IsRep + kNumStates)+#define IsRepG1 (IsRepG0 + kNumStates)+#define IsRepG2 (IsRepG1 + kNumStates)+#define IsRep0Long (IsRepG2 + kNumStates)+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)+#define LenCoder (Align + kAlignTableSize)+#define RepLenCoder (LenCoder + kNumLenProbs)+#define Literal (RepLenCoder + kNumLenProbs)++#if Literal != LZMA_BASE_SIZE+StopCompilingDueBUG+#endif++#ifdef _LZMA_OUT_READ++typedef struct _LzmaVarState+{+ CRangeDecoder RangeDecoder;+ Byte *Dictionary;+ UInt32 DictionarySize;+ UInt32 DictionaryPos;+ UInt32 GlobalPos;+ UInt32 Reps[4];+ int lc;+ int lp;+ int pb;+ int State;+ int PreviousIsMatch;+ int RemainLen;+} LzmaVarState;++int LzmaDecoderInit(+ unsigned char *buffer, UInt32 bufferSize,+ int lc, int lp, int pb,+ unsigned char *dictionary, UInt32 dictionarySize,+ #ifdef _LZMA_IN_CB+ ILzmaInCallback *inCallback+ #else+ unsigned char *inStream, UInt32 inSize+ #endif+ )+{+ LzmaVarState *vs = (LzmaVarState *)buffer;+ CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));+ UInt32 i;+ if (bufferSize < numProbs * sizeof(CProb) + sizeof(LzmaVarState))+ return LZMA_RESULT_NOT_ENOUGH_MEM;+ vs->Dictionary = dictionary;+ vs->DictionarySize = dictionarySize;+ vs->DictionaryPos = 0;+ vs->GlobalPos = 0;+ vs->Reps[0] = vs->Reps[1] = vs->Reps[2] = vs->Reps[3] = 1;+ vs->lc = lc;+ vs->lp = lp;+ vs->pb = pb;+ vs->State = 0;+ vs->PreviousIsMatch = 0;+ vs->RemainLen = 0;+ dictionary[dictionarySize - 1] = 0;+ for (i = 0; i < numProbs; i++)+ p[i] = kBitModelTotal >> 1;+ RangeDecoderInit(&vs->RangeDecoder,+ #ifdef _LZMA_IN_CB+ inCallback+ #else+ inStream, inSize+ #endif+ );+ return LZMA_RESULT_OK;+}++int LzmaDecode(unsigned char *buffer,+ unsigned char *outStream, UInt32 outSize,+ UInt32 *outSizeProcessed)+{+ LzmaVarState *vs = (LzmaVarState *)buffer;+ CProb *p = (CProb *)(buffer + sizeof(LzmaVarState));+ CRangeDecoder rd = vs->RangeDecoder;+ int state = vs->State;+ int previousIsMatch = vs->PreviousIsMatch;+ Byte previousByte;+ UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];+ UInt32 nowPos = 0;+ UInt32 posStateMask = (1 << (vs->pb)) - 1;+ UInt32 literalPosMask = (1 << (vs->lp)) - 1;+ int lc = vs->lc;+ int len = vs->RemainLen;+ UInt32 globalPos = vs->GlobalPos;++ Byte *dictionary = vs->Dictionary;+ UInt32 dictionarySize = vs->DictionarySize;+ UInt32 dictionaryPos = vs->DictionaryPos;++ if (len == -1)+ {+ *outSizeProcessed = 0;+ return LZMA_RESULT_OK;+ }++ while(len > 0 && nowPos < outSize)+ {+ UInt32 pos = dictionaryPos - rep0;+ if (pos >= dictionarySize)+ pos += dictionarySize;+ outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos];+ if (++dictionaryPos == dictionarySize)+ dictionaryPos = 0;+ len--;+ }+ if (dictionaryPos == 0)+ previousByte = dictionary[dictionarySize - 1];+ else+ previousByte = dictionary[dictionaryPos - 1];+#else++int LzmaDecode(+ Byte *buffer, UInt32 bufferSize,+ int lc, int lp, int pb,+ #ifdef _LZMA_IN_CB+ ILzmaInCallback *inCallback,+ #else+ unsigned char *inStream, UInt32 inSize,+ #endif+ unsigned char *outStream, UInt32 outSize,+ UInt32 *outSizeProcessed)+{+ UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + lp));+ CProb *p = (CProb *)buffer;+ CRangeDecoder rd;+ UInt32 i;+ int state = 0;+ int previousIsMatch = 0;+ Byte previousByte = 0;+ UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;+ UInt32 nowPos = 0;+ UInt32 posStateMask = (1 << pb) - 1;+ UInt32 literalPosMask = (1 << lp) - 1;+ int len = 0;+ if (bufferSize < numProbs * sizeof(CProb))+ return LZMA_RESULT_NOT_ENOUGH_MEM;+ for (i = 0; i < numProbs; i++)+ p[i] = kBitModelTotal >> 1;+ RangeDecoderInit(&rd,+ #ifdef _LZMA_IN_CB+ inCallback+ #else+ inStream, inSize+ #endif+ );+#endif++ *outSizeProcessed = 0;+ while(nowPos < outSize)+ {+ int posState = (int)(+ (nowPos+ #ifdef _LZMA_OUT_READ+ + globalPos+ #endif+ )+ & posStateMask);+ #ifdef _LZMA_IN_CB+ if (rd.Result != LZMA_RESULT_OK)+ return rd.Result;+ #endif+ if (rd.ExtraBytes != 0)+ return LZMA_RESULT_DATA_ERROR;+ if (RangeDecoderBitDecode(p + IsMatch + (state << kNumPosBitsMax) + posState, &rd) == 0)+ {+ CProb *probs = p + Literal + (LZMA_LIT_SIZE *+ (((+ (nowPos+ #ifdef _LZMA_OUT_READ+ + globalPos+ #endif+ )+ & literalPosMask) << lc) + (previousByte >> (8 - lc))));++ if (state < 4) state = 0;+ else if (state < 10) state -= 3;+ else state -= 6;+ if (previousIsMatch)+ {+ Byte matchByte;+ #ifdef _LZMA_OUT_READ+ UInt32 pos = dictionaryPos - rep0;+ if (pos >= dictionarySize)+ pos += dictionarySize;+ matchByte = dictionary[pos];+ #else+ matchByte = outStream[nowPos - rep0];+ #endif+ previousByte = LzmaLiteralDecodeMatch(probs, &rd, matchByte);+ previousIsMatch = 0;+ }+ else+ previousByte = LzmaLiteralDecode(probs, &rd);+ outStream[nowPos++] = previousByte;+ #ifdef _LZMA_OUT_READ+ dictionary[dictionaryPos] = previousByte;+ if (++dictionaryPos == dictionarySize)+ dictionaryPos = 0;+ #endif+ }+ else+ {+ previousIsMatch = 1;+ if (RangeDecoderBitDecode(p + IsRep + state, &rd) == 1)+ {+ if (RangeDecoderBitDecode(p + IsRepG0 + state, &rd) == 0)+ {+ if (RangeDecoderBitDecode(p + IsRep0Long + (state << kNumPosBitsMax) + posState, &rd) == 0)+ {+ #ifdef _LZMA_OUT_READ+ UInt32 pos;+ #endif+ if (+ (nowPos+ #ifdef _LZMA_OUT_READ+ + globalPos+ #endif+ )+ == 0)+ return LZMA_RESULT_DATA_ERROR;+ state = state < 7 ? 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+ {+ UInt32 distance;+ if(RangeDecoderBitDecode(p + IsRepG1 + state, &rd) == 0)+ distance = rep1;+ else+ {+ if(RangeDecoderBitDecode(p + IsRepG2 + state, &rd) == 0)+ distance = rep2;+ else+ {+ distance = rep3;+ rep3 = rep2;+ }+ rep2 = rep1;+ }+ rep1 = rep0;+ rep0 = distance;+ }+ len = LzmaLenDecode(p + RepLenCoder, &rd, posState);+ state = state < 7 ? 8 : 11;+ }+ else+ {+ int posSlot;+ rep3 = rep2;+ rep2 = rep1;+ rep1 = rep0;+ state = state < 7 ? 7 : 10;+ len = LzmaLenDecode(p + LenCoder, &rd, posState);+ posSlot = RangeDecoderBitTreeDecode(p + PosSlot ++ ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<+ kNumPosSlotBits), kNumPosSlotBits, &rd);+ if (posSlot >= kStartPosModelIndex)+ {+ int numDirectBits = ((posSlot >> 1) - 1);+ rep0 = ((2 | ((UInt32)posSlot & 1)) << numDirectBits);+ if (posSlot < kEndPosModelIndex)+ {+ rep0 += RangeDecoderReverseBitTreeDecode(+ p + SpecPos + rep0 - posSlot - 1, numDirectBits, &rd);+ }+ else+ {+ rep0 += RangeDecoderDecodeDirectBits(&rd,+ numDirectBits - kNumAlignBits) << kNumAlignBits;+ rep0 += RangeDecoderReverseBitTreeDecode(p + Align, kNumAlignBits, &rd);+ }+ }+ else+ rep0 = posSlot;+ rep0++;+ }+ if (rep0 == (UInt32)(0))+ {+ /* it's for stream version */+ len = -1;+ break;+ }+ if (rep0 > nowPos+ #ifdef _LZMA_OUT_READ+ + globalPos+ #endif+ )+ {+ return LZMA_RESULT_DATA_ERROR;+ }+ len += kMatchMinLen;+ 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+ outStream[nowPos++] = previousByte;+ len--;+ }+ while(len > 0 && nowPos < outSize);+ }+ }++ #ifdef _LZMA_OUT_READ+ vs->RangeDecoder = rd;+ 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->PreviousIsMatch = previousIsMatch;+ vs->RemainLen = len;+ #endif++ *outSizeProcessed = nowPos;+ return LZMA_RESULT_OK;+}Index: linux-2.6.21.7/lib/Makefile===================================================================--- linux-2.6.21.7.orig/lib/Makefile+++ linux-2.6.21.7/lib/Makefile@@ -12,7 +12,7 @@ lib-$(CONFIG_SMP) += cpumask.o lib-y += kobject.o kref.o kobject_uevent.o klist.o -obj-y += sort.o parser.o halfmd4.o debug_locks.o random32.o+obj-y += sort.o parser.o halfmd4.o debug_locks.o random32.o bust_spinlocks.o LzmaDecode.o ifeq ($(CONFIG_DEBUG_KOBJECT),y) CFLAGS_kobject.o += -DDEBUG@@ -56,6 +56,7 @@ obj-$(CONFIG_SMP) += percpu_counter.o obj-$(CONFIG_AUDIT_GENERIC) += audit.o obj-$(CONFIG_SWIOTLB) += swiotlb.o+ obj-$(CONFIG_FAULT_INJECTION) += fault-inject.o lib-$(CONFIG_GENERIC_BUG) += bug.o
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -