Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZMA_Alone/LzmaRamDecode.c, revision 1.1.1.1
1.1 misho 1: /* LzmaRamDecode.c */
2:
3: #include "LzmaRamDecode.h"
4: #ifdef _SZ_ONE_DIRECTORY
5: #include "LzmaDecode.h"
6: #include "BranchX86.h"
7: #else
8: #include "../LZMA_C/LzmaDecode.h"
9: #include "../Branch/BranchX86.h"
10: #endif
11:
12: #define LZMA_PROPS_SIZE 14
13: #define LZMA_SIZE_OFFSET 6
14:
15: int LzmaRamGetUncompressedSize(
16: unsigned char *inBuffer,
17: size_t inSize,
18: size_t *outSize)
19: {
20: unsigned int i;
21: if (inSize < LZMA_PROPS_SIZE)
22: return 1;
23: *outSize = 0;
24: for(i = 0; i < sizeof(size_t); i++)
25: *outSize += ((size_t)inBuffer[LZMA_SIZE_OFFSET + i]) << (8 * i);
26: for(; i < 8; i++)
27: if (inBuffer[LZMA_SIZE_OFFSET + i] != 0)
28: return 1;
29: return 0;
30: }
31:
32: #define SZE_DATA_ERROR (1)
33: #define SZE_OUTOFMEMORY (2)
34:
35: int LzmaRamDecompress(
36: unsigned char *inBuffer,
37: size_t inSize,
38: unsigned char *outBuffer,
39: size_t outSize,
40: size_t *outSizeProcessed,
41: void * (*allocFunc)(size_t size),
42: void (*freeFunc)(void *))
43: {
44: int lc, lp, pb;
45: size_t lzmaInternalSize;
46: void *lzmaInternalData;
47: int result;
48: UInt32 outSizeProcessedLoc;
49:
50: int useFilter = inBuffer[0];
51:
52: *outSizeProcessed = 0;
53: if (useFilter > 1)
54: return 1;
55:
56: if (inSize < LZMA_PROPS_SIZE)
57: return 1;
58: lc = inBuffer[1];
59: if (lc >= (9 * 5 * 5))
60: return 1;
61: for (pb = 0; lc >= (9 * 5); pb++, lc -= (9 * 5));
62: for (lp = 0; lc >= 9; lp++, lc -= 9);
63:
64: lzmaInternalSize = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp))) * sizeof(CProb);
65: lzmaInternalData = allocFunc(lzmaInternalSize);
66: if (lzmaInternalData == 0)
67: return SZE_OUTOFMEMORY;
68:
69: result = LzmaDecode((unsigned char *)lzmaInternalData, (UInt32)lzmaInternalSize,
70: lc, lp, pb,
71: inBuffer + LZMA_PROPS_SIZE, (UInt32)inSize - LZMA_PROPS_SIZE,
72: outBuffer, (UInt32)outSize,
73: &outSizeProcessedLoc);
74: freeFunc(lzmaInternalData);
75: if (result != LZMA_RESULT_OK)
76: return 1;
77: *outSizeProcessed = (size_t)outSizeProcessedLoc;
78: if (useFilter == 1)
79: {
80: UInt32 _prevMask;
81: UInt32 _prevPos;
82: x86_Convert_Init(_prevMask, _prevPos);
83: x86_Convert(outBuffer, (UInt32)outSizeProcessedLoc, 0, &_prevMask, &_prevPos, 0);
84: }
85: return 0;
86: }
87:
88:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>