int LzmaRamDecompress( unsigned char *inBuffer, size_t inSize, unsigned char *outBuffer, size_t outSize, size_t *outSizeProcessed, void * (*allocFunc)(size_t size), void (*freeFunc)(void *)) { int lc, lp, pb; size_t lzmaInternalSize; void *lzmaInternalData; int result; UInt32 outSizeProcessedLoc; int useFilter = inBuffer[0]; *outSizeProcessed = 0; if (useFilter > 1) return 1; if (inSize < LZMA_PROPS_SIZE) return 1; lc = inBuffer[1]; if (lc >= (9 * 5 * 5)) return 1; for (pb = 0; lc >= (9 * 5); pb++, lc -= (9 * 5)); for (lp = 0; lc >= 9; lp++, lc -= 9); lzmaInternalSize = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp))) * sizeof(CProb); lzmaInternalData = allocFunc(lzmaInternalSize); if (lzmaInternalData == 0) return SZE_OUTOFMEMORY; result = LzmaDecode((unsigned char *)lzmaInternalData, (UInt32)lzmaInternalSize, lc, lp, pb, inBuffer + LZMA_PROPS_SIZE, (UInt32)inSize - LZMA_PROPS_SIZE, outBuffer, (UInt32)outSize, &outSizeProcessedLoc); freeFunc(lzmaInternalData); 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; }
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; }
extern "C" VoidPtr FB_DLL_EXPORT ib_util_malloc(long size) { return allocFunc ? allocFunc(size) : malloc(size); }
int SzByteBufferCreate(CSzByteBuffer *buffer, size_t newCapacity, void * (*allocFunc)(size_t size)) { buffer->Capacity = newCapacity; buffer->Items = (Byte *)allocFunc(newCapacity); return (buffer->Items != 0); }