📄 lzmaramdecode.c
字号:
/* LzmaRamDecode.c */#include "LzmaRamDecode.h"#ifdef _SZ_ONE_DIRECTORY#include "LzmaDecode.h"#include "BranchX86.h"#else#include "../LZMA_C/LzmaDecode.h"#include "../Branch/BranchX86.h"#endif#define LZMA_PROPS_SIZE 14#define LZMA_SIZE_OFFSET 6int LzmaRamGetUncompressedSize( const unsigned char *inBuffer, size_t inSize, size_t *outSize){ unsigned int i; if (inSize < LZMA_PROPS_SIZE) return 1; *outSize = 0; for(i = 0; i < sizeof(size_t); i++) *outSize += ((size_t)inBuffer[LZMA_SIZE_OFFSET + i]) << (8 * i); for(; i < 8; i++) if (inBuffer[LZMA_SIZE_OFFSET + i] != 0) return 1; return 0;}#define SZE_DATA_ERROR (1)#define SZE_OUTOFMEMORY (2)int LzmaRamDecompress( const unsigned char *inBuffer, size_t inSize, unsigned char *outBuffer, size_t outSize, size_t *outSizeProcessed, void * (*allocFunc)(size_t size), void (*freeFunc)(void *)){ CLzmaDecoderState state; /* it's about 24 bytes structure, if int is 32-bit */ int result; SizeT outSizeProcessedLoc; SizeT inProcessed; int useFilter; if (inSize < LZMA_PROPS_SIZE) return 1; useFilter = inBuffer[0]; *outSizeProcessed = 0; if (useFilter > 1) return 1; if (LzmaDecodeProperties(&state.Properties, inBuffer + 1, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK) return 1; state.Probs = (CProb *)allocFunc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb)); if (state.Probs == 0) return SZE_OUTOFMEMORY; result = LzmaDecode(&state, inBuffer + LZMA_PROPS_SIZE, (SizeT)inSize - LZMA_PROPS_SIZE, &inProcessed, outBuffer, (SizeT)outSize, &outSizeProcessedLoc); freeFunc(state.Probs); if (result != LZMA_RESULT_OK) return 1; *outSizeProcessed = (size_t)outSizeProcessedLoc; if (useFilter == 1) { UInt32 _prevMask; UInt32 _prevPos; x86_Convert_Init(_prevMask, _prevPos); x86_Convert(outBuffer, (UInt32)outSizeProcessedLoc, 0, &_prevMask, &_prevPos, 0); } return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -