1/* Lzma86Dec.c -- LZMA + x86 (BCJ) Filter Decoder 22016-05-16 : Igor Pavlov : Public domain */ 3 4#include "Precomp.h" 5 6#include "Lzma86.h" 7 8#include "Alloc.h" 9#include "Bra.h" 10#include "LzmaDec.h" 11 12SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize) 13{ 14 unsigned i; 15 if (srcLen < LZMA86_HEADER_SIZE) 16 return SZ_ERROR_INPUT_EOF; 17 *unpackSize = 0; 18 for (i = 0; i < sizeof(UInt64); i++) 19 *unpackSize += ((UInt64)src[LZMA86_SIZE_OFFSET + i]) << (8 * i); 20 return SZ_OK; 21} 22 23SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen) 24{ 25 SRes res; 26 int useFilter; 27 SizeT inSizePure; 28 ELzmaStatus status; 29 30 if (*srcLen < LZMA86_HEADER_SIZE) 31 return SZ_ERROR_INPUT_EOF; 32 33 useFilter = src[0]; 34 35 if (useFilter > 1) 36 { 37 *destLen = 0; 38 return SZ_ERROR_UNSUPPORTED; 39 } 40 41 inSizePure = *srcLen - LZMA86_HEADER_SIZE; 42 res = LzmaDecode(dest, destLen, src + LZMA86_HEADER_SIZE, &inSizePure, 43 src + 1, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &g_Alloc); 44 *srcLen = inSizePure + LZMA86_HEADER_SIZE; 45 if (res != SZ_OK) 46 return res; 47 if (useFilter == 1) 48 { 49 UInt32 x86State; 50 x86_Convert_Init(x86State); 51 x86_Convert(dest, *destLen, 0, &x86State, 0); 52 } 53 return SZ_OK; 54} 55