summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/lib7z/Lzma86Dec.c
blob: 1b54072085ebd21231475a53d0dfaa3abe12786e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/* Lzma86Dec.c -- LZMA + x86 (BCJ) Filter Decoder
2009-08-14 : Igor Pavlov : Public domain */

#include "Lzma86.h"

#include "Alloc.h"
#include "Bra.h"
#include "LzmaDec.h"

static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
static void SzFree(void *p, void *address) { p = p; MyFree(address); }

SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize)
{
	unsigned i;
	if (srcLen < LZMA86_HEADER_SIZE)
	return SZ_ERROR_INPUT_EOF;
	*unpackSize = 0;
	for (i = 0; i < sizeof(UInt64); i++)
	*unpackSize += ((UInt64)src[LZMA86_SIZE_OFFSET + i]) << (8 * i);
	return SZ_OK;
}

SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen)
{
	ISzAlloc g_Alloc = { SzAlloc, SzFree };
	SRes res;
	int useFilter;
	SizeT inSizePure;
	ELzmaStatus status;

	if (*srcLen < LZMA86_HEADER_SIZE)
	return SZ_ERROR_INPUT_EOF;

	useFilter = src[0];

	if (useFilter > 1)
	{
	*destLen = 0;
	return SZ_ERROR_UNSUPPORTED;
	}

	inSizePure = *srcLen - LZMA86_HEADER_SIZE;
	res = LzmaDecode(dest, destLen, src + LZMA86_HEADER_SIZE, &inSizePure,
		src + 1, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &g_Alloc);
	*srcLen = inSizePure + LZMA86_HEADER_SIZE;
	if (res != SZ_OK)
	return res;
	if (useFilter == 1)
	{
	UInt32 x86State;
	x86_Convert_Init(x86State);
	x86_Convert(dest, *destLen, 0, &x86State, 0);
	}
	return SZ_OK;
}