Home | History | Annotate | Download | only in C
      1 /* Lzma86Dec.c -- LZMA + x86 (BCJ) Filter Decoder
      2 2009-08-14 : Igor Pavlov : Public domain */
      3 
      4 #include "Lzma86.h"
      5 
      6 #include "Alloc.h"
      7 #include "Bra.h"
      8 #include "LzmaDec.h"
      9 
     10 static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
     11 static void SzFree(void *p, void *address) { p = p; MyFree(address); }
     12 
     13 SRes Lzma86_GetUnpackSize(const Byte *src, SizeT srcLen, UInt64 *unpackSize)
     14 {
     15   unsigned i;
     16   if (srcLen < LZMA86_HEADER_SIZE)
     17     return SZ_ERROR_INPUT_EOF;
     18   *unpackSize = 0;
     19   for (i = 0; i < sizeof(UInt64); i++)
     20     *unpackSize += ((UInt64)src[LZMA86_SIZE_OFFSET + i]) << (8 * i);
     21   return SZ_OK;
     22 }
     23 
     24 SRes Lzma86_Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen)
     25 {
     26   ISzAlloc g_Alloc = { SzAlloc, SzFree };
     27   SRes res;
     28   int useFilter;
     29   SizeT inSizePure;
     30   ELzmaStatus status;
     31 
     32   if (*srcLen < LZMA86_HEADER_SIZE)
     33     return SZ_ERROR_INPUT_EOF;
     34 
     35   useFilter = src[0];
     36 
     37   if (useFilter > 1)
     38   {
     39     *destLen = 0;
     40     return SZ_ERROR_UNSUPPORTED;
     41   }
     42 
     43   inSizePure = *srcLen - LZMA86_HEADER_SIZE;
     44   res = LzmaDecode(dest, destLen, src + LZMA86_HEADER_SIZE, &inSizePure,
     45       src + 1, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &status, &g_Alloc);
     46   *srcLen = inSizePure + LZMA86_HEADER_SIZE;
     47   if (res != SZ_OK)
     48     return res;
     49   if (useFilter == 1)
     50   {
     51     UInt32 x86State;
     52     x86_Convert_Init(x86State);
     53     x86_Convert(dest, *destLen, 0, &x86State, 0);
     54   }
     55   return SZ_OK;
     56 }
     57