| OLD | NEW |
| 1 /* Lzma2Dec.c -- LZMA2 Decoder | 1 /* Lzma2Dec.c -- LZMA2 Decoder |
| 2 2009-05-03 : Igor Pavlov : Public domain */ | 2 2015-11-09 : Igor Pavlov : Public domain */ |
| 3 | 3 |
| 4 /* #define SHOW_DEBUG_INFO */ | 4 /* #define SHOW_DEBUG_INFO */ |
| 5 | 5 |
| 6 #include "Precomp.h" |
| 7 |
| 6 #ifdef SHOW_DEBUG_INFO | 8 #ifdef SHOW_DEBUG_INFO |
| 7 #include <stdio.h> | 9 #include <stdio.h> |
| 8 #endif | 10 #endif |
| 9 | 11 |
| 10 #include <string.h> | 12 #include <string.h> |
| 11 | 13 |
| 12 #include "Lzma2Dec.h" | 14 #include "Lzma2Dec.h" |
| 13 | 15 |
| 14 /* | 16 /* |
| 15 00000000 - EOS | 17 00000000 - EOS |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 { | 92 { |
| 91 p->state = LZMA2_STATE_CONTROL; | 93 p->state = LZMA2_STATE_CONTROL; |
| 92 p->needInitDic = True; | 94 p->needInitDic = True; |
| 93 p->needInitState = True; | 95 p->needInitState = True; |
| 94 p->needInitProp = True; | 96 p->needInitProp = True; |
| 95 LzmaDec_Init(&p->decoder); | 97 LzmaDec_Init(&p->decoder); |
| 96 } | 98 } |
| 97 | 99 |
| 98 static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) | 100 static ELzma2State Lzma2Dec_UpdateState(CLzma2Dec *p, Byte b) |
| 99 { | 101 { |
| 100 switch(p->state) | 102 switch (p->state) |
| 101 { | 103 { |
| 102 case LZMA2_STATE_CONTROL: | 104 case LZMA2_STATE_CONTROL: |
| 103 p->control = b; | 105 p->control = b; |
| 104 PRF(printf("\n %4X ", p->decoder.dicPos)); | 106 PRF(printf("\n %4X ", (unsigned)p->decoder.dicPos)); |
| 105 PRF(printf(" %2X", b)); | 107 PRF(printf(" %2X", (unsigned)b)); |
| 106 if (p->control == 0) | 108 if (p->control == 0) |
| 107 return LZMA2_STATE_FINISHED; | 109 return LZMA2_STATE_FINISHED; |
| 108 if (LZMA2_IS_UNCOMPRESSED_STATE(p)) | 110 if (LZMA2_IS_UNCOMPRESSED_STATE(p)) |
| 109 { | 111 { |
| 110 if ((p->control & 0x7F) > 2) | 112 if ((p->control & 0x7F) > 2) |
| 111 return LZMA2_STATE_ERROR; | 113 return LZMA2_STATE_ERROR; |
| 112 p->unpackSize = 0; | 114 p->unpackSize = 0; |
| 113 } | 115 } |
| 114 else | 116 else |
| 115 p->unpackSize = (UInt32)(p->control & 0x1F) << 16; | 117 p->unpackSize = (UInt32)(p->control & 0x1F) << 16; |
| 116 return LZMA2_STATE_UNPACK0; | 118 return LZMA2_STATE_UNPACK0; |
| 117 | 119 |
| 118 case LZMA2_STATE_UNPACK0: | 120 case LZMA2_STATE_UNPACK0: |
| 119 p->unpackSize |= (UInt32)b << 8; | 121 p->unpackSize |= (UInt32)b << 8; |
| 120 return LZMA2_STATE_UNPACK1; | 122 return LZMA2_STATE_UNPACK1; |
| 121 | 123 |
| 122 case LZMA2_STATE_UNPACK1: | 124 case LZMA2_STATE_UNPACK1: |
| 123 p->unpackSize |= (UInt32)b; | 125 p->unpackSize |= (UInt32)b; |
| 124 p->unpackSize++; | 126 p->unpackSize++; |
| 125 PRF(printf(" %8d", p->unpackSize)); | 127 PRF(printf(" %8u", (unsigned)p->unpackSize)); |
| 126 return (LZMA2_IS_UNCOMPRESSED_STATE(p)) ? LZMA2_STATE_DATA : LZMA2_STATE_P
ACK0; | 128 return (LZMA2_IS_UNCOMPRESSED_STATE(p)) ? LZMA2_STATE_DATA : LZMA2_STATE_P
ACK0; |
| 127 | 129 |
| 128 case LZMA2_STATE_PACK0: | 130 case LZMA2_STATE_PACK0: |
| 129 p->packSize = (UInt32)b << 8; | 131 p->packSize = (UInt32)b << 8; |
| 130 return LZMA2_STATE_PACK1; | 132 return LZMA2_STATE_PACK1; |
| 131 | 133 |
| 132 case LZMA2_STATE_PACK1: | 134 case LZMA2_STATE_PACK1: |
| 133 p->packSize |= (UInt32)b; | 135 p->packSize |= (UInt32)b; |
| 134 p->packSize++; | 136 p->packSize++; |
| 135 PRF(printf(" %8d", p->packSize)); | 137 PRF(printf(" %8u", (unsigned)p->packSize)); |
| 136 return LZMA2_IS_THERE_PROP(LZMA2_GET_LZMA_MODE(p)) ? LZMA2_STATE_PROP: | 138 return LZMA2_IS_THERE_PROP(LZMA2_GET_LZMA_MODE(p)) ? LZMA2_STATE_PROP: |
| 137 (p->needInitProp ? LZMA2_STATE_ERROR : LZMA2_STATE_DATA); | 139 (p->needInitProp ? LZMA2_STATE_ERROR : LZMA2_STATE_DATA); |
| 138 | 140 |
| 139 case LZMA2_STATE_PROP: | 141 case LZMA2_STATE_PROP: |
| 140 { | 142 { |
| 141 int lc, lp; | 143 unsigned lc, lp; |
| 142 if (b >= (9 * 5 * 5)) | 144 if (b >= (9 * 5 * 5)) |
| 143 return LZMA2_STATE_ERROR; | 145 return LZMA2_STATE_ERROR; |
| 144 lc = b % 9; | 146 lc = b % 9; |
| 145 b /= 9; | 147 b /= 9; |
| 146 p->decoder.prop.pb = b / 5; | 148 p->decoder.prop.pb = b / 5; |
| 147 lp = b % 5; | 149 lp = b % 5; |
| 148 if (lc + lp > LZMA2_LCLP_MAX) | 150 if (lc + lp > LZMA2_LCLP_MAX) |
| 149 return LZMA2_STATE_ERROR; | 151 return LZMA2_STATE_ERROR; |
| 150 p->decoder.prop.lc = lc; | 152 p->decoder.prop.lc = lc; |
| 151 p->decoder.prop.lp = lp; | 153 p->decoder.prop.lp = lp; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 170 SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, | 172 SRes Lzma2Dec_DecodeToDic(CLzma2Dec *p, SizeT dicLimit, |
| 171 const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *sta
tus) | 173 const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *sta
tus) |
| 172 { | 174 { |
| 173 SizeT inSize = *srcLen; | 175 SizeT inSize = *srcLen; |
| 174 *srcLen = 0; | 176 *srcLen = 0; |
| 175 *status = LZMA_STATUS_NOT_SPECIFIED; | 177 *status = LZMA_STATUS_NOT_SPECIFIED; |
| 176 | 178 |
| 177 while (p->state != LZMA2_STATE_FINISHED) | 179 while (p->state != LZMA2_STATE_FINISHED) |
| 178 { | 180 { |
| 179 SizeT dicPos = p->decoder.dicPos; | 181 SizeT dicPos = p->decoder.dicPos; |
| 182 |
| 180 if (p->state == LZMA2_STATE_ERROR) | 183 if (p->state == LZMA2_STATE_ERROR) |
| 181 return SZ_ERROR_DATA; | 184 return SZ_ERROR_DATA; |
| 185 |
| 182 if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY) | 186 if (dicPos == dicLimit && finishMode == LZMA_FINISH_ANY) |
| 183 { | 187 { |
| 184 *status = LZMA_STATUS_NOT_FINISHED; | 188 *status = LZMA_STATUS_NOT_FINISHED; |
| 185 return SZ_OK; | 189 return SZ_OK; |
| 186 } | 190 } |
| 191 |
| 187 if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) | 192 if (p->state != LZMA2_STATE_DATA && p->state != LZMA2_STATE_DATA_CONT) |
| 188 { | 193 { |
| 189 if (*srcLen == inSize) | 194 if (*srcLen == inSize) |
| 190 { | 195 { |
| 191 *status = LZMA_STATUS_NEEDS_MORE_INPUT; | 196 *status = LZMA_STATUS_NEEDS_MORE_INPUT; |
| 192 return SZ_OK; | 197 return SZ_OK; |
| 193 } | 198 } |
| 194 (*srcLen)++; | 199 (*srcLen)++; |
| 195 p->state = Lzma2Dec_UpdateState(p, *src++); | 200 p->state = Lzma2Dec_UpdateState(p, *src++); |
| 201 |
| 202 if (dicPos == dicLimit && p->state != LZMA2_STATE_FINISHED) |
| 203 { |
| 204 p->state = LZMA2_STATE_ERROR; |
| 205 return SZ_ERROR_DATA; |
| 206 } |
| 196 continue; | 207 continue; |
| 197 } | 208 } |
| 209 |
| 198 { | 210 { |
| 199 SizeT destSizeCur = dicLimit - dicPos; | 211 SizeT destSizeCur = dicLimit - dicPos; |
| 200 SizeT srcSizeCur = inSize - *srcLen; | 212 SizeT srcSizeCur = inSize - *srcLen; |
| 201 ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY; | 213 ELzmaFinishMode curFinishMode = LZMA_FINISH_ANY; |
| 202 | 214 |
| 203 if (p->unpackSize <= destSizeCur) | 215 if (p->unpackSize <= destSizeCur) |
| 204 { | 216 { |
| 205 destSizeCur = (SizeT)p->unpackSize; | 217 destSizeCur = (SizeT)p->unpackSize; |
| 206 curFinishMode = LZMA_FINISH_END; | 218 curFinishMode = LZMA_FINISH_END; |
| 207 } | 219 } |
| 208 | 220 |
| 209 if (LZMA2_IS_UNCOMPRESSED_STATE(p)) | 221 if (LZMA2_IS_UNCOMPRESSED_STATE(p)) |
| 210 { | 222 { |
| 211 if (*srcLen == inSize) | 223 if (*srcLen == inSize) |
| 212 { | 224 { |
| 213 *status = LZMA_STATUS_NEEDS_MORE_INPUT; | 225 *status = LZMA_STATUS_NEEDS_MORE_INPUT; |
| 214 return SZ_OK; | 226 return SZ_OK; |
| 215 } | 227 } |
| 216 | 228 |
| 217 if (p->state == LZMA2_STATE_DATA) | 229 if (p->state == LZMA2_STATE_DATA) |
| 218 { | 230 { |
| 219 Bool initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); | 231 Bool initDic = (p->control == LZMA2_CONTROL_COPY_RESET_DIC); |
| 220 if (initDic) | 232 if (initDic) |
| 221 p->needInitProp = p->needInitState = True; | 233 p->needInitProp = p->needInitState = True; |
| 222 else if (p->needInitDic) | 234 else if (p->needInitDic) |
| 235 { |
| 236 p->state = LZMA2_STATE_ERROR; |
| 223 return SZ_ERROR_DATA; | 237 return SZ_ERROR_DATA; |
| 238 } |
| 224 p->needInitDic = False; | 239 p->needInitDic = False; |
| 225 LzmaDec_InitDicAndState(&p->decoder, initDic, False); | 240 LzmaDec_InitDicAndState(&p->decoder, initDic, False); |
| 226 } | 241 } |
| 227 | 242 |
| 228 if (srcSizeCur > destSizeCur) | 243 if (srcSizeCur > destSizeCur) |
| 229 srcSizeCur = destSizeCur; | 244 srcSizeCur = destSizeCur; |
| 230 | 245 |
| 231 if (srcSizeCur == 0) | 246 if (srcSizeCur == 0) |
| 247 { |
| 248 p->state = LZMA2_STATE_ERROR; |
| 232 return SZ_ERROR_DATA; | 249 return SZ_ERROR_DATA; |
| 250 } |
| 233 | 251 |
| 234 LzmaDec_UpdateWithUncompressed(&p->decoder, src, srcSizeCur); | 252 LzmaDec_UpdateWithUncompressed(&p->decoder, src, srcSizeCur); |
| 235 | 253 |
| 236 src += srcSizeCur; | 254 src += srcSizeCur; |
| 237 *srcLen += srcSizeCur; | 255 *srcLen += srcSizeCur; |
| 238 p->unpackSize -= (UInt32)srcSizeCur; | 256 p->unpackSize -= (UInt32)srcSizeCur; |
| 239 p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA
_CONT; | 257 p->state = (p->unpackSize == 0) ? LZMA2_STATE_CONTROL : LZMA2_STATE_DATA
_CONT; |
| 240 } | 258 } |
| 241 else | 259 else |
| 242 { | 260 { |
| 243 SizeT outSizeProcessed; | 261 SizeT outSizeProcessed; |
| 244 SRes res; | 262 SRes res; |
| 245 | 263 |
| 246 if (p->state == LZMA2_STATE_DATA) | 264 if (p->state == LZMA2_STATE_DATA) |
| 247 { | 265 { |
| 248 int mode = LZMA2_GET_LZMA_MODE(p); | 266 unsigned mode = LZMA2_GET_LZMA_MODE(p); |
| 249 Bool initDic = (mode == 3); | 267 Bool initDic = (mode == 3); |
| 250 Bool initState = (mode > 0); | 268 Bool initState = (mode != 0); |
| 251 if ((!initDic && p->needInitDic) || (!initState && p->needInitState)) | 269 if ((!initDic && p->needInitDic) || (!initState && p->needInitState)) |
| 270 { |
| 271 p->state = LZMA2_STATE_ERROR; |
| 252 return SZ_ERROR_DATA; | 272 return SZ_ERROR_DATA; |
| 273 } |
| 253 | 274 |
| 254 LzmaDec_InitDicAndState(&p->decoder, initDic, initState); | 275 LzmaDec_InitDicAndState(&p->decoder, initDic, initState); |
| 255 p->needInitDic = False; | 276 p->needInitDic = False; |
| 256 p->needInitState = False; | 277 p->needInitState = False; |
| 257 p->state = LZMA2_STATE_DATA_CONT; | 278 p->state = LZMA2_STATE_DATA_CONT; |
| 258 } | 279 } |
| 280 |
| 259 if (srcSizeCur > p->packSize) | 281 if (srcSizeCur > p->packSize) |
| 260 srcSizeCur = (SizeT)p->packSize; | 282 srcSizeCur = (SizeT)p->packSize; |
| 261 | 283 |
| 262 res = LzmaDec_DecodeToDic(&p->decoder, dicPos + destSizeCur, src, &srcSi
zeCur, curFinishMode, status); | 284 res = LzmaDec_DecodeToDic(&p->decoder, dicPos + destSizeCur, src, &srcSi
zeCur, curFinishMode, status); |
| 263 | 285 |
| 264 src += srcSizeCur; | 286 src += srcSizeCur; |
| 265 *srcLen += srcSizeCur; | 287 *srcLen += srcSizeCur; |
| 266 p->packSize -= (UInt32)srcSizeCur; | 288 p->packSize -= (UInt32)srcSizeCur; |
| 267 | 289 |
| 268 outSizeProcessed = p->decoder.dicPos - dicPos; | 290 outSizeProcessed = p->decoder.dicPos - dicPos; |
| 269 p->unpackSize -= (UInt32)outSizeProcessed; | 291 p->unpackSize -= (UInt32)outSizeProcessed; |
| 270 | 292 |
| 271 RINOK(res); | 293 RINOK(res); |
| 272 if (*status == LZMA_STATUS_NEEDS_MORE_INPUT) | 294 if (*status == LZMA_STATUS_NEEDS_MORE_INPUT) |
| 273 return res; | 295 return res; |
| 274 | 296 |
| 275 if (srcSizeCur == 0 && outSizeProcessed == 0) | 297 if (srcSizeCur == 0 && outSizeProcessed == 0) |
| 276 { | 298 { |
| 277 if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK || | 299 if (*status != LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK |
| 278 p->unpackSize != 0 || p->packSize != 0) | 300 || p->unpackSize != 0 |
| 301 || p->packSize != 0) |
| 302 { |
| 303 p->state = LZMA2_STATE_ERROR; |
| 279 return SZ_ERROR_DATA; | 304 return SZ_ERROR_DATA; |
| 305 } |
| 280 p->state = LZMA2_STATE_CONTROL; | 306 p->state = LZMA2_STATE_CONTROL; |
| 281 } | 307 } |
| 308 |
| 282 if (*status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) | 309 if (*status == LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK) |
| 283 *status = LZMA_STATUS_NOT_FINISHED; | 310 *status = LZMA_STATUS_NOT_FINISHED; |
| 284 } | 311 } |
| 285 } | 312 } |
| 286 } | 313 } |
| 314 |
| 287 *status = LZMA_STATUS_FINISHED_WITH_MARK; | 315 *status = LZMA_STATUS_FINISHED_WITH_MARK; |
| 288 return SZ_OK; | 316 return SZ_OK; |
| 289 } | 317 } |
| 290 | 318 |
| 291 SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *
src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) | 319 SRes Lzma2Dec_DecodeToBuf(CLzma2Dec *p, Byte *dest, SizeT *destLen, const Byte *
src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status) |
| 292 { | 320 { |
| 293 SizeT outSize = *destLen, inSize = *srcLen; | 321 SizeT outSize = *destLen, inSize = *srcLen; |
| 294 *srcLen = *destLen = 0; | 322 *srcLen = *destLen = 0; |
| 295 for (;;) | 323 for (;;) |
| 296 { | 324 { |
| (...skipping 26 matching lines...) Expand all Loading... |
| 323 if (res != 0) | 351 if (res != 0) |
| 324 return res; | 352 return res; |
| 325 if (outSizeCur == 0 || outSize == 0) | 353 if (outSizeCur == 0 || outSize == 0) |
| 326 return SZ_OK; | 354 return SZ_OK; |
| 327 } | 355 } |
| 328 } | 356 } |
| 329 | 357 |
| 330 SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, | 358 SRes Lzma2Decode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, |
| 331 Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc) | 359 Byte prop, ELzmaFinishMode finishMode, ELzmaStatus *status, ISzAlloc *alloc) |
| 332 { | 360 { |
| 333 CLzma2Dec decoder; | 361 CLzma2Dec p; |
| 334 SRes res; | 362 SRes res; |
| 335 SizeT outSize = *destLen, inSize = *srcLen; | 363 SizeT outSize = *destLen, inSize = *srcLen; |
| 336 Byte props[LZMA_PROPS_SIZE]; | |
| 337 | |
| 338 Lzma2Dec_Construct(&decoder); | |
| 339 | |
| 340 *destLen = *srcLen = 0; | 364 *destLen = *srcLen = 0; |
| 341 *status = LZMA_STATUS_NOT_SPECIFIED; | 365 *status = LZMA_STATUS_NOT_SPECIFIED; |
| 342 decoder.decoder.dic = dest; | 366 Lzma2Dec_Construct(&p); |
| 343 decoder.decoder.dicBufSize = outSize; | 367 RINOK(Lzma2Dec_AllocateProbs(&p, prop, alloc)); |
| 344 | 368 p.decoder.dic = dest; |
| 345 RINOK(Lzma2Dec_GetOldProps(prop, props)); | 369 p.decoder.dicBufSize = outSize; |
| 346 RINOK(LzmaDec_AllocateProbs(&decoder.decoder, props, LZMA_PROPS_SIZE, alloc)); | 370 Lzma2Dec_Init(&p); |
| 347 | |
| 348 *srcLen = inSize; | 371 *srcLen = inSize; |
| 349 res = Lzma2Dec_DecodeToDic(&decoder, outSize, src, srcLen, finishMode, status)
; | 372 res = Lzma2Dec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status); |
| 350 *destLen = decoder.decoder.dicPos; | 373 *destLen = p.decoder.dicPos; |
| 351 if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) | 374 if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT) |
| 352 res = SZ_ERROR_INPUT_EOF; | 375 res = SZ_ERROR_INPUT_EOF; |
| 353 | 376 Lzma2Dec_FreeProbs(&p, alloc); |
| 354 LzmaDec_FreeProbs(&decoder.decoder, alloc); | |
| 355 return res; | 377 return res; |
| 356 } | 378 } |
| OLD | NEW |