diff options
Diffstat (limited to '3rdparty/lzma/C/XzDec.c')
-rw-r--r-- | 3rdparty/lzma/C/XzDec.c | 102 |
1 files changed, 63 insertions, 39 deletions
diff --git a/3rdparty/lzma/C/XzDec.c b/3rdparty/lzma/C/XzDec.c index 113e2cdf0f0..1edc0245637 100644 --- a/3rdparty/lzma/C/XzDec.c +++ b/3rdparty/lzma/C/XzDec.c @@ -1,5 +1,7 @@ /* XzDec.c -- Xz Decode -2011-02-07 : Igor Pavlov : Public domain */ +2015-11-09 : Igor Pavlov : Public domain */ + +#include "Precomp.h" /* #define XZ_DUMP */ @@ -30,9 +32,9 @@ unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value) { - int i, limit; + unsigned i, limit; *value = 0; - limit = (maxSize > 9) ? 9 : (int)maxSize; + limit = (maxSize > 9) ? 9 : (unsigned)maxSize; for (i = 0; i < limit;) { @@ -64,15 +66,15 @@ typedef struct Byte buf[BRA_BUF_SIZE]; } CBraState; -void BraState_Free(void *pp, ISzAlloc *alloc) +static void BraState_Free(void *pp, ISzAlloc *alloc) { alloc->Free(alloc, pp); } -SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc) +static SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc) { CBraState *p = ((CBraState *)pp); - alloc = alloc; + UNUSED_VAR(alloc); p->ip = 0; if (p->methodId == XZ_ID_Delta) { @@ -85,7 +87,7 @@ SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *a if (propSize == 4) { UInt32 v = GetUi32(props); - switch(p->methodId) + switch (p->methodId) { case XZ_ID_PPC: case XZ_ID_ARM: @@ -110,7 +112,7 @@ SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *a return SZ_OK; } -void BraState_Init(void *pp) +static void BraState_Init(void *pp) { CBraState *p = ((CBraState *)pp); p->bufPos = p->bufConv = p->bufTotal = 0; @@ -127,9 +129,9 @@ static SRes BraState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, CBraState *p = ((CBraState *)pp); SizeT destLenOrig = *destLen; SizeT srcLenOrig = *srcLen; + UNUSED_VAR(finishMode); *destLen = 0; *srcLen = 0; - finishMode = finishMode; *wasFinished = 0; while (destLenOrig > 0) { @@ -161,7 +163,7 @@ static SRes BraState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, } if (p->bufTotal == 0) break; - switch(p->methodId) + switch (p->methodId) { case XZ_ID_Delta: if (p->encodeMode) @@ -207,7 +209,7 @@ SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAlloc id != XZ_ID_SPARC) return SZ_ERROR_UNSUPPORTED; p->p = 0; - decoder = alloc->Alloc(alloc, sizeof(CBraState)); + decoder = (CBraState *)alloc->Alloc(alloc, sizeof(CBraState)); if (decoder == 0) return SZ_ERROR_MEM; decoder->methodId = (UInt32)id; @@ -233,9 +235,9 @@ static void SbState_Free(void *pp, ISzAlloc *alloc) static SRes SbState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAlloc *alloc) { - pp = pp; - props = props; - alloc = alloc; + UNUSED_VAR(pp); + UNUSED_VAR(props); + UNUSED_VAR(alloc); return (propSize == 0) ? SZ_OK : SZ_ERROR_UNSUPPORTED; } @@ -249,7 +251,7 @@ static SRes SbState_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *src, { CSbDec *p = (CSbDec *)pp; SRes res; - srcWasFinished = srcWasFinished; + UNUSED_VAR(srcWasFinished); p->dest = dest; p->destLen = *destLen; p->src = src; @@ -305,15 +307,15 @@ static SRes Lzma2State_Code(void *pp, Byte *dest, SizeT *destLen, const Byte *sr { ELzmaStatus status; /* ELzmaFinishMode fm = (finishMode == LZMA_FINISH_ANY) ? LZMA_FINISH_ANY : LZMA_FINISH_END; */ - SRes res = Lzma2Dec_DecodeToBuf((CLzma2Dec *)pp, dest, destLen, src, srcLen, finishMode, &status); - srcWasFinished = srcWasFinished; + SRes res = Lzma2Dec_DecodeToBuf((CLzma2Dec *)pp, dest, destLen, src, srcLen, (ELzmaFinishMode)finishMode, &status); + UNUSED_VAR(srcWasFinished); *wasFinished = (status == LZMA_STATUS_FINISHED_WITH_MARK); return res; } static SRes Lzma2State_SetFromMethod(IStateCoder *p, ISzAlloc *alloc) { - CLzma2Dec *decoder = alloc->Alloc(alloc, sizeof(CLzma2Dec)); + CLzma2Dec *decoder = (CLzma2Dec *)alloc->Alloc(alloc, sizeof(CLzma2Dec)); p->p = decoder; if (decoder == 0) return SZ_ERROR_MEM; @@ -328,9 +330,9 @@ static SRes Lzma2State_SetFromMethod(IStateCoder *p, ISzAlloc *alloc) void MixCoder_Construct(CMixCoder *p, ISzAlloc *alloc) { - int i; + unsigned i; p->alloc = alloc; - p->buf = 0; + p->buf = NULL; p->numCoders = 0; for (i = 0; i < MIXCODER_NUM_FILTERS_MAX; i++) p->coders[i].p = NULL; @@ -338,7 +340,7 @@ void MixCoder_Construct(CMixCoder *p, ISzAlloc *alloc) void MixCoder_Free(CMixCoder *p) { - int i; + unsigned i; for (i = 0; i < p->numCoders; i++) { IStateCoder *sc = &p->coders[i]; @@ -347,13 +349,16 @@ void MixCoder_Free(CMixCoder *p) } p->numCoders = 0; if (p->buf) + { p->alloc->Free(p->alloc, p->buf); + p->buf = NULL; /* 9.31: the BUG was fixed */ + } } void MixCoder_Init(CMixCoder *p) { - int i; - for (i = 0; i < p->numCoders - 1; i++) + unsigned i; + for (i = 0; i < MIXCODER_NUM_FILTERS_MAX - 1; i++) { p->size[i] = 0; p->pos[i] = 0; @@ -366,11 +371,11 @@ void MixCoder_Init(CMixCoder *p) } } -SRes MixCoder_SetFromMethod(CMixCoder *p, int coderIndex, UInt64 methodId) +SRes MixCoder_SetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 methodId) { IStateCoder *sc = &p->coders[coderIndex]; p->ids[coderIndex] = methodId; - switch(methodId) + switch (methodId) { case XZ_ID_LZMA2: return Lzma2State_SetFromMethod(sc, p->alloc); #ifdef USE_SUBBLOCK @@ -393,10 +398,10 @@ SRes MixCoder_Code(CMixCoder *p, Byte *dest, SizeT *destLen, *srcLen = 0; *status = CODER_STATUS_NOT_FINISHED; - if (p->buf == 0) + if (!p->buf) { - p->buf = p->alloc->Alloc(p->alloc, CODER_BUF_SIZE * (MIXCODER_NUM_FILTERS_MAX - 1)); - if (p->buf == 0) + p->buf = (Byte *)p->alloc->Alloc(p->alloc, CODER_BUF_SIZE * (MIXCODER_NUM_FILTERS_MAX - 1)); + if (!p->buf) return SZ_ERROR_MEM; } @@ -406,7 +411,7 @@ SRes MixCoder_Code(CMixCoder *p, Byte *dest, SizeT *destLen, for (;;) { Bool processed = False; - int i; + unsigned i; /* if (p->numCoders == 1 && *destLen == destLenOrig && finishMode == LZMA_FINISH_ANY) break; @@ -515,8 +520,8 @@ static Bool Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte *b SRes XzBlock_Parse(CXzBlock *p, const Byte *header) { unsigned pos; - int numFilters, i; - UInt32 headerSize = (UInt32)header[0] << 2; + unsigned numFilters, i; + unsigned headerSize = (unsigned)header[0] << 2; if (CrcCalc(header, headerSize) != GetUi32(header + headerSize)) return SZ_ERROR_ARCHIVE; @@ -550,9 +555,9 @@ SRes XzBlock_Parse(CXzBlock *p, const Byte *header) pos += (unsigned)size; #ifdef XZ_DUMP - printf("\nf[%d] = %2X: ", i, filter->id); + printf("\nf[%u] = %2X: ", i, (unsigned)filter->id); { - int i; + unsigned i; for (i = 0; i < size; i++) printf(" %2X", filter->props[i]); } @@ -567,9 +572,10 @@ SRes XzBlock_Parse(CXzBlock *p, const Byte *header) SRes XzDec_Init(CMixCoder *p, const CXzBlock *block) { - int i; + unsigned i; Bool needReInit = True; - int numFilters = XzBlock_GetNumFilters(block); + unsigned numFilters = XzBlock_GetNumFilters(block); + if (numFilters == p->numCoders) { for (i = 0; i < numFilters; i++) @@ -577,6 +583,7 @@ SRes XzDec_Init(CMixCoder *p, const CXzBlock *block) break; needReInit = (i != numFilters); } + if (needReInit) { MixCoder_Free(p); @@ -587,12 +594,14 @@ SRes XzDec_Init(CMixCoder *p, const CXzBlock *block) RINOK(MixCoder_SetFromMethod(p, i, f->id)); } } + for (i = 0; i < numFilters; i++) { const CXzFilter *f = &block->filters[numFilters - 1 - i]; IStateCoder *sc = &p->coders[i]; RINOK(sc->SetProps(sc->p, f->props, f->propsSize, p->alloc)); } + MixCoder_Init(p); return SZ_OK; } @@ -601,7 +610,10 @@ void XzUnpacker_Init(CXzUnpacker *p) { p->state = XZ_STATE_STREAM_HEADER; p->pos = 0; - p->numStreams = 0; + p->numStartedStreams = 0; + p->numFinishedStreams = 0; + p->numTotalBlocks = 0; + p->padSize = 0; } void XzUnpacker_Construct(CXzUnpacker *p, ISzAlloc *alloc) @@ -616,7 +628,7 @@ void XzUnpacker_Free(CXzUnpacker *p) } SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, - const Byte *src, SizeT *srcLen, int finishMode, ECoderStatus *status) + const Byte *src, SizeT *srcLen, ECoderFinishMode finishMode, ECoderStatus *status) { SizeT destLenOrig = *destLen; SizeT srcLenOrig = *srcLen; @@ -676,7 +688,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, return SZ_OK; } - switch(p->state) + switch (p->state) { case XZ_STATE_STREAM_HEADER: { @@ -690,6 +702,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, else { RINOK(Xz_ParseHeader(&p->streamFlags, p->buf)); + p->numStartedStreams++; p->state = XZ_STATE_BLOCK_HEADER; Sha256_Init(&p->sha); p->indexSize = 0; @@ -730,6 +743,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, else { RINOK(XzBlock_Parse(&p->block, p->buf)); + p->numTotalBlocks++; p->state = XZ_STATE_BLOCK; p->packSize = 0; p->unpackSize = 0; @@ -847,7 +861,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen, if (p->pos == XZ_STREAM_FOOTER_SIZE) { p->state = XZ_STATE_STREAM_PADDING; - p->numStreams++; + p->numFinishedStreams++; p->padSize = 0; if (!Xz_CheckFooter(p->streamFlags, p->indexSize, p->buf)) return SZ_ERROR_CRC; @@ -887,3 +901,13 @@ Bool XzUnpacker_IsStreamWasFinished(CXzUnpacker *p) { return (p->state == XZ_STATE_STREAM_PADDING) && (((UInt32)p->padSize & 3) == 0); } + +UInt64 XzUnpacker_GetExtraSize(CXzUnpacker *p) +{ + UInt64 num = 0; + if (p->state == XZ_STATE_STREAM_PADDING) + num += p->padSize; + else if (p->state == XZ_STATE_STREAM_HEADER) + num += p->padSize + p->pos; + return num; +} |