1 /* Lzma86Dec.c -- LZMA + x86 (BCJ) Filter Decoder
2 2016-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 
Lzma86_GetUnpackSize(const Byte * src,SizeT srcLen,UInt64 * unpackSize)12 SRes 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 
Lzma86_Decode(Byte * dest,SizeT * destLen,const Byte * src,SizeT * srcLen)23 SRes 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