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