Lzma2Dec.c 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. /* Lzma2Dec.c -- LZMA2 Decoder
  2. 2015-11-09 : Igor Pavlov : Public domain */
  3. /* #define SHOW_DEBUG_INFO */
  4. #include "Precomp.h"
  5. #ifdef SHOW_DEBUG_INFO
  6. #include <stdio.h>
  7. #endif
  8. #include <string.h>
  9. #include "Lzma2Dec.h"
  10. /*
  11. 00000000 - EOS
  12. 00000001 U U - Uncompressed Reset Dic
  13. 00000010 U U - Uncompressed No Reset
  14. 100uuuuu U U P P - LZMA no reset
  15. 101uuuuu U U P P - LZMA reset state
  16. 110uuuuu U U P P S - LZMA reset state + new prop
  17. 111uuuuu U U P P S - LZMA reset state + new prop + reset dic
  18. u, U - Unpack Size
  19. P - Pack Size
  20. S - Props
  21. */
  22. #define LZMA2_CONTROL_LZMA (1 << 7)
  23. #define LZMA2_CONTROL_COPY_NO_RESET 2
  24. #define LZMA2_CONTROL_COPY_RESET_DIC 1
  25. #define LZMA2_CONTROL_EOF 0
  26. #define LZMA2_IS_UNCOMPRESSED_STATE(p) (((p)->control & LZMA2_CONTROL_LZMA) == 0)
  27. #define LZMA2_GET_LZMA_MODE(p) (((p)->control >> 5) & 3)
  28. #define LZMA2_IS_THERE_PROP(mode) ((mode) >= 2)
  29. #define LZMA2_LCLP_MAX 4
  30. #define LZMA2_DIC_SIZE_FROM_PROP(p) (((UInt32)2 | ((p) & 1)) << ((p) / 2 + 11))
  31. #ifdef SHOW_DEBUG_INFO
  32. #define PRF(x) x
  33. #else
  34. #define PRF(x)
  35. #endif
  36. typedef enum
  37. {
  38. LZMA2_STATE_CONTROL,
  39. LZMA2_STATE_UNPACK0,
  40. LZMA2_STATE_UNPACK1,
  41. LZMA2_STATE_PACK0,
  42. LZMA2_STATE_PACK1,
  43. LZMA2_STATE_PROP,
  44. LZMA2_STATE_DATA,
  45. LZMA2_STATE_DATA_CONT,
  46. LZMA2_STATE_FINISHED,
  47. LZMA2_STATE_ERROR
  48. } ELzma2State;
  49. static SRes Lzma2Dec_GetOldProps(Byte prop, Byte *props)
  50. {
  51. UInt32 dicSize;
  52. if (prop > 40)
  53. return SZ_ERROR_UNSUPPORTED;
  54. dicSize = (prop == 40) ? 0xFFFFFFFF : LZMA2_DIC_SIZE_FROM_PROP(prop);
  55. props[0] = (Byte)LZMA2_LCLP_MAX;
  56. props[1] = (Byte)(dicSize);
  57. props[2] = (Byte)(dicSize >> 8);
  58. props[3] = (Byte)(dicSize >> 16);
  59. props[4] = (Byte)(dicSize >> 24);
  60. return SZ_OK;
  61. }
  62. SRes Lzma2Dec_AllocateProbs(CLzma2Dec *p, Byte prop, ISzAlloc *alloc)
  63. {
  64. Byte props[LZMA_PROPS_SIZE];
  65. RINOK(Lzma2Dec_GetOldProps(prop, props));
  66. return LzmaDec_AllocateProbs(&p->decoder, props, LZMA_PROPS_SIZE, alloc);
  67. }
  68. SRes Lzma2Dec_Allocate(CLzma2Dec *p, Byte prop, ISzAlloc *alloc)
  69. {
  70. Byte props[LZMA_PROPS_SIZE];
  71. RINOK(Lzma2Dec_GetOldProps(prop, props));
  72. return LzmaDec_Allocate(&p->decoder, props, LZMA_PROPS_SIZE, alloc);
  73. }
  74. void Lzma2Dec_Init(CLzma2Dec *p)
  75. {
  76. p->state = LZMA2_STATE_CONTROL;
  77. p->needInitDic = True;
  78. p->needInitState = True;
  79. p->needInitProp = True;
  80. LzmaDec_Init(&p->decoder);
  81. }
  82. static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b)
  83. {
  84. switch (p->state)
  85. {
  86. case LZMA2_STATE_CONTROL:
  87. p->control = b;
  88. PRF(printf("\n %4X ", (unsigned)p->decoder.dicPos));
  89. PRF(printf(" %2X", (unsigned)b));
  90. if (p->control == 0)
  91. return LZMA2_STATE_FINISHED;
  92. if (LZMA2_IS_UNCOMPRESSED_STATE(p))
  93. {
  94. if ((p->control & 0x7F) > 2)
  95. return LZMA2_STATE_ERROR;
  96. p->unpackSize = 0;
  97. }
  98. else
  99. p->unpackSize = (UInt32)(p->control & 0x1F) << 16;
  100. return LZMA2_STATE_UNPACK0;
  101. case LZMA2_STATE_UNPACK0:
  102. p->unpackSize |= (UInt32)b << 8;
  103. return LZMA2_STATE_UNPACK1;
  104. case LZMA2_STATE_UNPACK1:
  105. p->unpackSize |= (UInt32)b;
  106. p->unpackSize++;
  107. PRF(printf(" %8u", (unsigned)p->unpackSize));
  108. return (LZMA2_IS_UNCOMPRESSED_STATE(p)) ? LZMA2_STATE_DATA : LZMA2_STATE_PACK0;
  109. case LZMA2_STATE_PACK0:
  110. p->packSize = (UInt32)b << 8;
  111. return LZMA2_STATE_PACK1;
  112. case LZMA2_STATE_PACK1:
  113. p->packSize |= (UInt32)b;
  114. p->packSize++;
  115. PRF(printf(" %8u", (unsigned)p->packSize));
  116. return LZMA2_IS_THERE_PROP(LZMA2_GET_LZMA_MODE(p)) ? LZMA2_STATE_PROP:
  117. (p->needInitProp ? LZMA2_STATE_ERROR : LZMA2_STATE_DATA);
  118. case LZMA2_STATE_PROP:
  119. {
  120. unsigned lc, lp;
  121. if (b >= (9 * 5 * 5))
  122. return LZMA2_STATE_ERROR;
  123. lc = b % 9;
  124. b /= 9;
  125. p->decoder.prop.pb = b / 5;
  126. lp = b % 5;
  127. if (lc + lp > LZMA2_LCLP_MAX)
  128. return LZMA2_STATE_ERROR;
  129. p->decoder.prop.lc = lc;
  130. p->decoder.prop.lp = lp;
  131. p->needInitProp = False;
  132. return LZMA2_STATE_DATA;
  133. }
  134. }
  135. return LZMA2_STATE_ERROR;
  136. }
  137. static void LzmaDec_UpdateWithUncompressed(CLzmaDec *p, const Byte *src, SizeT size)
  138. {
  139. memcpy(p->dic + p->dicPos, src, size);
  140. p->dicPos += size;
  141. if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= size)
  142. p->checkDicSize = p->prop.dicSize;
  143. p->processedPos += (UInt32)size;
  144. }
  145. void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState);
  146. SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit,
  147. const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
  148. {
  149. SizeT inSize = *srcLen;
  150. *srcLen = 0;
  151. *status = LZMA_STATUS_NOT_SPECIFIED;
  152. while (p->state != LZMA2_STATE_FINISHED)
  153. {
  154. SizeT dicPos = p->decoder.dicPos;
  155. if (p->state == LZMA2_STATE_ERROR)
  156. return SZ_ERROR_DATA;
  157. if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY)
  158. {
  159. *status = LZMA_STATUS_NOT_FINISHED;
  160. return SZ_OK;
  161. }
  162. if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT)
  163. {
  164. if (*srcLen == inSize)
  165. {
  166. *status = LZMA_STATUS_NEEDS_MORE_INPUT;
  167. return SZ_OK;
  168. }
  169. (*srcLen)++;
  170. p->state = Lzma2Dec_UpdateState(p, *src++);
  171. if (dicPos == dicLimit && p->state != LZMA2_STATE_FINISHED)
  172. {
  173. p->state = LZMA2_STATE_ERROR;
  174. return SZ_ERROR_DATA;
  175. }
  176. continue;
  177. }
  178. {
  179. SizeT destSizeCur = dicLimit - dicPos;
  180. SizeT srcSizeCur = inSize - *srcLen;
  181. ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY;
  182. if (p->unpackSize <= destSizeCur)
  183. {
  184. destSizeCur = (SizeT)p->unpackSize;
  185. curFinishMode = LZMA_FINISH_END;
  186. }
  187. if (LZMA2_IS_UNCOMPRESSED_STATE(p))
  188. {
  189. if (*srcLen == inSize)
  190. {
  191. *status = LZMA_STATUS_NEEDS_MORE_INPUT;
  192. return SZ_OK;
  193. }
  194. if (p->state == LZMA2_STATE_DATA)
  195. {
  196. Bool initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC);
  197. if (initDic)
  198. p->needInitProp = p->needInitState = True;
  199. else if (p->needInitDic)
  200. {
  201. p->state = LZMA2_STATE_ERROR;
  202. return SZ_ERROR_DATA;
  203. }
  204. p->needInitDic = False;
  205. LzmaDec_InitDicAndState(&p->decoder, initDic, False);
  206. }
  207. if (srcSizeCur > destSizeCur)
  208. srcSizeCur = destSizeCur;
  209. if (srcSizeCur == 0)
  210. {
  211. p->state = LZMA2_STATE_ERROR;
  212. return SZ_ERROR_DATA;
  213. }
  214. LzmaDec_UpdateWithUncompressed(&p->decoder, src, srcSizeCur);
  215. src += srcSizeCur;
  216. *srcLen += srcSizeCur;
  217. p->unpackSize -= (UInt32)srcSizeCur;
  218. p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA_CONT;
  219. }
  220. else
  221. {
  222. SizeT outSizeProcessed;
  223. SRes res;
  224. if (p->state == LZMA2_STATE_DATA)
  225. {
  226. unsigned mode = LZMA2_GET_LZMA_MODE(p);
  227. Bool initDic = (mode == 3);
  228. Bool initState = (mode != 0);
  229. if ((!initDic && p->needInitDic) || (!initState && p->needInitState))
  230. {
  231. p->state = LZMA2_STATE_ERROR;
  232. return SZ_ERROR_DATA;
  233. }
  234. LzmaDec_InitDicAndState(&p->decoder, initDic, initState);
  235. p->needInitDic = False;
  236. p->needInitState = False;
  237. p->state = LZMA2_STATE_DATA_CONT;
  238. }
  239. if (srcSizeCur > p->packSize)
  240. srcSizeCur = (SizeT)p->packSize;
  241. res = LzmaDec_DecodeToDic(&p->decoder, dicPos + destSizeCur, src, &srcSizeCur, curFinishMode, status);
  242. src += srcSizeCur;
  243. *srcLen += srcSizeCur;
  244. p->packSize -= (UInt32)srcSizeCur;
  245. outSizeProcessed = p->decoder.dicPos - dicPos;
  246. p->unpackSize -= (UInt32)outSizeProcessed;
  247. RINOK(res);
  248. if (*status == LZMA_STATUS_NEEDS_MORE_INPUT)
  249. return res;
  250. if (srcSizeCur == 0 && outSizeProcessed == 0)
  251. {
  252. if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
  253. || p->unpackSize != 0
  254. || p->packSize != 0)
  255. {
  256. p->state = LZMA2_STATE_ERROR;
  257. return SZ_ERROR_DATA;
  258. }
  259. p->state = LZMA2_STATE_CONTROL;
  260. }
  261. if (*status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK)
  262. *status = LZMA_STATUS_NOT_FINISHED;
  263. }
  264. }
  265. }
  266. *status = LZMA_STATUS_FINISHED_WITH_MARK;
  267. return SZ_OK;
  268. }
  269. SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
  270. {
  271. SizeT outSize = *destLen, inSize = *srcLen;
  272. *srcLen = *destLen = 0;
  273. for (;;)
  274. {
  275. SizeT srcSizeCur = inSize, outSizeCur, dicPos;
  276. ELzmaFinishMode curFinishMode;
  277. SRes res;
  278. if (p->decoder.dicPos == p->decoder.dicBufSize)
  279. p->decoder.dicPos = 0;
  280. dicPos = p->decoder.dicPos;
  281. if (outSize > p->decoder.dicBufSize - dicPos)
  282. {
  283. outSizeCur = p->decoder.dicBufSize;
  284. curFinishMode = LZMA_FINISH_ANY;
  285. }
  286. else
  287. {
  288. outSizeCur = dicPos + outSize;
  289. curFinishMode = finishMode;
  290. }
  291. res = Lzma2Dec_DecodeToDic(p, outSizeCur, src, &srcSizeCur, curFinishMode, status);
  292. src += srcSizeCur;
  293. inSize -= srcSizeCur;
  294. *srcLen += srcSizeCur;
  295. outSizeCur = p->decoder.dicPos - dicPos;
  296. memcpy(dest, p->decoder.dic + dicPos, outSizeCur);
  297. dest += outSizeCur;
  298. outSize -= outSizeCur;
  299. *destLen += outSizeCur;
  300. if (res != 0)
  301. return res;
  302. if (outSizeCur == 0 || outSize == 0)
  303. return SZ_OK;
  304. }
  305. }
  306. SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
  307. Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc)
  308. {
  309. CLzma2Dec p;
  310. SRes res;
  311. SizeT outSize = *destLen, inSize = *srcLen;
  312. *destLen = *srcLen = 0;
  313. *status = LZMA_STATUS_NOT_SPECIFIED;
  314. Lzma2Dec_Construct(&p);
  315. RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc));
  316. p.decoder.dic = dest;
  317. p.decoder.dicBufSize = outSize;
  318. Lzma2Dec_Init(&p);
  319. *srcLen = inSize;
  320. res = Lzma2Dec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);
  321. *destLen = p.decoder.dicPos;
  322. if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
  323. res = SZ_ERROR_INPUT_EOF;
  324. Lzma2Dec_FreeProbs(&p, alloc);
  325. return res;
  326. }