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