tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

Lzma86Dec.c (1299B)


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