xref: /aosp_15_r20/external/lzma/C/Lzma86Dec.c (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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