Annotation of elwix/tools/oldlzma/SRC/7zip/Archive/7z_C/7zDecode.c, revision 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>