Lzma86Dec.c 1.2 KB

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