Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZMA_Alone/LzmaRamDecode.c, revision 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>