Annotation of elwix/tools/oldlzma/SRC/7zip/Archive/7z_C/7zDecode.c, revision 1.1.1.1
1.1 misho 1: /* 7zDecode.c */
2:
3: #include "7zDecode.h"
4: #ifdef _SZ_ONE_DIRECTORY
5: #include "LzmaDecode.h"
6: #else
7: #include "../../Compress/LZMA_C/LzmaDecode.h"
8: #endif
9:
10: CMethodID k_Copy = { { 0x0 }, 1 };
11: CMethodID k_LZMA = { { 0x3, 0x1, 0x1 }, 3 };
12:
13: #ifdef _LZMA_IN_CB
14:
15: typedef struct _CLzmaInCallbackImp
16: {
17: ILzmaInCallback InCallback;
18: ISzInStream *InStream;
19: size_t Size;
20: } CLzmaInCallbackImp;
21:
22: int LzmaReadImp(void *object, unsigned char **buffer, UInt32 *size)
23: {
24: CLzmaInCallbackImp *cb = (CLzmaInCallbackImp *)object;
25: size_t processedSize;
26: SZ_RESULT res;
27: *size = 0;
28: res = cb->InStream->Read((void *)cb->InStream, (void **)buffer, cb->Size, &processedSize);
29: *size = (UInt32)processedSize;
30: if (processedSize > cb->Size)
31: return (int)SZE_FAIL;
32: cb->Size -= processedSize;
33: if (res == SZ_OK)
34: return 0;
35: return (int)res;
36: }
37:
38: #endif
39:
40: SZ_RESULT SzDecode(CFileSize *packSizes, CFolder *folder,
41: #ifdef _LZMA_IN_CB
42: ISzInStream *inStream,
43: #else
44: Byte *inBuffer,
45: #endif
46: Byte *outBuffer, size_t outSize,
47: size_t *outSizeProcessed, ISzAlloc *allocMain)
48: {
49: UInt32 si;
50: size_t inSize = 0;
51: CCoderInfo *coder;
52: if (folder->NumPackStreams != 1)
53: return SZE_NOTIMPL;
54: if (folder->NumCoders != 1)
55: return SZE_NOTIMPL;
56: coder = folder->Coders;
57: *outSizeProcessed = 0;
58:
59: for (si = 0; si < folder->NumPackStreams; si++)
60: inSize += (size_t)packSizes[si];
61:
62: if (AreMethodsEqual(&coder->MethodID, &k_Copy))
63: {
64: size_t i;
65: if (inSize != outSize)
66: return SZE_DATA_ERROR;
67: #ifdef _LZMA_IN_CB
68: for (i = 0; i < inSize;)
69: {
70: size_t j;
71: Byte *inBuffer;
72: size_t bufferSize;
73: RINOK(inStream->Read((void *)inStream, (void **)&inBuffer, inSize - i, &bufferSize));
74: if (bufferSize == 0)
75: return SZE_DATA_ERROR;
76: if (bufferSize > inSize - i)
77: return SZE_FAIL;
78: *outSizeProcessed += bufferSize;
79: for (j = 0; j < bufferSize && i < inSize; j++, i++)
80: outBuffer[i] = inBuffer[j];
81: }
82: #else
83: for (i = 0; i < inSize; i++)
84: outBuffer[i] = inBuffer[i];
85: *outSizeProcessed = inSize;
86: #endif
87: return SZ_OK;
88: }
89:
90: if (AreMethodsEqual(&coder->MethodID, &k_LZMA))
91: {
92: #ifdef _LZMA_IN_CB
93: CLzmaInCallbackImp lzmaCallback;
94: #endif
95:
96: int lc, lp, pb;
97: size_t lzmaInternalSize;
98: void *lzmaInternalData;
99: int result;
100: UInt32 outSizeProcessedLoc;
101:
102: #ifdef _LZMA_IN_CB
103: lzmaCallback.Size = inSize;
104: lzmaCallback.InStream = inStream;
105: lzmaCallback.InCallback.Read = LzmaReadImp;
106: #endif
107:
108: if (coder->Properties.Capacity < 5)
109: return SZE_FAIL;
110: lc = (unsigned char)coder->Properties.Items[0];
111: if (lc >= (9 * 5 * 5))
112: return SZE_FAIL;
113: for (pb = 0; lc >= (9 * 5); pb++, lc -= (9 * 5));
114: for (lp = 0; lc >= 9; lp++, lc -= 9);
115:
116: lzmaInternalSize = (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << (lc + lp))) * sizeof(CProb);
117: lzmaInternalData = allocMain->Alloc(lzmaInternalSize);
118: if (lzmaInternalData == 0)
119: return SZE_OUTOFMEMORY;
120:
121: result = LzmaDecode((Byte *)lzmaInternalData, (UInt32)lzmaInternalSize,
122: lc, lp, pb,
123: #ifdef _LZMA_IN_CB
124: &lzmaCallback.InCallback,
125: #else
126: inBuffer, (UInt32)inSize,
127: #endif
128: outBuffer, (UInt32)outSize,
129: &outSizeProcessedLoc);
130: *outSizeProcessed = (size_t)outSizeProcessedLoc;
131: allocMain->Free(lzmaInternalData);
132: /*
133: NOT_ENOUGH_MEM error is impossible for this code
134: if (result = LZMA_RESULT_NOT_ENOUGH_MEM)
135: return SZE_OUTOFMEMORY;
136: */
137: if (result == LZMA_RESULT_DATA_ERROR)
138: return SZE_DATA_ERROR;
139: if (result != LZMA_RESULT_OK)
140: return SZE_FAIL;
141: return SZ_OK;
142: }
143: return SZE_NOTIMPL;
144: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>