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