misc/libphysfs/lzma/CPP/7zip/Compress/LZMA_Alone/LzmaRamDecode.c
changeset 13904 99b265e0d1d0
parent 13903 5f819b90d479
child 13905 b172a5d40eee
equal deleted inserted replaced
13903:5f819b90d479 13904:99b265e0d1d0
     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 "../../../../C/Compress/Lzma/LzmaDecode.h"
       
     9 #include "../../../../C/Compress/Branch/BranchX86.h"
       
    10 #endif
       
    11 
       
    12 #define LZMA_PROPS_SIZE 14
       
    13 #define LZMA_SIZE_OFFSET 6
       
    14 
       
    15 int LzmaRamGetUncompressedSize(
       
    16     const 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     const 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   CLzmaDecoderState state;  /* it's about 24 bytes structure, if int is 32-bit */
       
    45   int result;
       
    46   SizeT outSizeProcessedLoc;
       
    47   SizeT inProcessed;
       
    48   int useFilter;
       
    49   
       
    50   if (inSize < LZMA_PROPS_SIZE)
       
    51     return 1;
       
    52   useFilter = inBuffer[0];
       
    53 
       
    54   *outSizeProcessed = 0;
       
    55   if (useFilter > 1)
       
    56     return 1;
       
    57 
       
    58   if (LzmaDecodeProperties(&state.Properties, inBuffer + 1, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK)
       
    59     return 1;
       
    60   state.Probs = (CProb *)allocFunc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
       
    61   if (state.Probs == 0)
       
    62     return SZE_OUTOFMEMORY;
       
    63   
       
    64   result = LzmaDecode(&state,
       
    65     inBuffer + LZMA_PROPS_SIZE, (SizeT)inSize - LZMA_PROPS_SIZE, &inProcessed,
       
    66     outBuffer, (SizeT)outSize, &outSizeProcessedLoc);
       
    67   freeFunc(state.Probs);
       
    68   if (result != LZMA_RESULT_OK)
       
    69     return 1;
       
    70   *outSizeProcessed = (size_t)outSizeProcessedLoc;
       
    71   if (useFilter == 1)
       
    72   {
       
    73     UInt32 x86State;
       
    74     x86_Convert_Init(x86State);
       
    75     x86_Convert(outBuffer, (SizeT)outSizeProcessedLoc, 0, &x86State, 0);
       
    76   }
       
    77   return 0;
       
    78 }