mirror of
https://github.com/Xevion/easy7zip.git
synced 2025-12-10 16:07:09 -06:00
23.01
This commit is contained in:
300
C/XzDec.c
300
C/XzDec.c
@@ -1,5 +1,5 @@
|
||||
/* XzDec.c -- Xz Decode
|
||||
2021-09-04 : Igor Pavlov : Public domain */
|
||||
2023-04-13 : Igor Pavlov : Public domain */
|
||||
|
||||
#include "Precomp.h"
|
||||
|
||||
@@ -67,7 +67,8 @@ unsigned Xz_ReadVarInt(const Byte *p, size_t maxSize, UInt64 *value)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ---------- BraState ---------- */
|
||||
|
||||
/* ---------- XzBcFilterState ---------- */
|
||||
|
||||
#define BRA_BUF_SIZE (1 << 14)
|
||||
|
||||
@@ -76,27 +77,29 @@ typedef struct
|
||||
size_t bufPos;
|
||||
size_t bufConv;
|
||||
size_t bufTotal;
|
||||
Byte *buf; // must be aligned for 4 bytes
|
||||
Xz_Func_BcFilterStateBase_Filter filter_func;
|
||||
// int encodeMode;
|
||||
CXzBcFilterStateBase base;
|
||||
// Byte buf[BRA_BUF_SIZE];
|
||||
} CXzBcFilterState;
|
||||
|
||||
int encodeMode;
|
||||
|
||||
UInt32 methodId;
|
||||
UInt32 delta;
|
||||
UInt32 ip;
|
||||
UInt32 x86State;
|
||||
Byte deltaState[DELTA_STATE_SIZE];
|
||||
|
||||
Byte buf[BRA_BUF_SIZE];
|
||||
} CBraState;
|
||||
|
||||
static void BraState_Free(void *pp, ISzAllocPtr alloc)
|
||||
static void XzBcFilterState_Free(void *pp, ISzAllocPtr alloc)
|
||||
{
|
||||
ISzAlloc_Free(alloc, pp);
|
||||
if (pp)
|
||||
{
|
||||
CXzBcFilterState *p = ((CXzBcFilterState *)pp);
|
||||
ISzAlloc_Free(alloc, p->buf);
|
||||
ISzAlloc_Free(alloc, pp);
|
||||
}
|
||||
}
|
||||
|
||||
static SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc)
|
||||
|
||||
static SRes XzBcFilterState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc)
|
||||
{
|
||||
CBraState *p = ((CBraState *)pp);
|
||||
UNUSED_VAR(alloc);
|
||||
CXzBcFilterStateBase *p = &((CXzBcFilterState *)pp)->base;
|
||||
UNUSED_VAR(alloc)
|
||||
p->ip = 0;
|
||||
if (p->methodId == XZ_ID_Delta)
|
||||
{
|
||||
@@ -114,6 +117,7 @@ static SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzA
|
||||
case XZ_ID_PPC:
|
||||
case XZ_ID_ARM:
|
||||
case XZ_ID_SPARC:
|
||||
case XZ_ID_ARM64:
|
||||
if ((v & 3) != 0)
|
||||
return SZ_ERROR_UNSUPPORTED;
|
||||
break;
|
||||
@@ -134,73 +138,90 @@ static SRes BraState_SetProps(void *pp, const Byte *props, size_t propSize, ISzA
|
||||
return SZ_OK;
|
||||
}
|
||||
|
||||
static void BraState_Init(void *pp)
|
||||
|
||||
static void XzBcFilterState_Init(void *pp)
|
||||
{
|
||||
CBraState *p = ((CBraState *)pp);
|
||||
CXzBcFilterState *p = ((CXzBcFilterState *)pp);
|
||||
p->bufPos = p->bufConv = p->bufTotal = 0;
|
||||
x86_Convert_Init(p->x86State);
|
||||
if (p->methodId == XZ_ID_Delta)
|
||||
Delta_Init(p->deltaState);
|
||||
p->base.X86_State = Z7_BRANCH_CONV_ST_X86_STATE_INIT_VAL;
|
||||
if (p->base.methodId == XZ_ID_Delta)
|
||||
Delta_Init(p->base.delta_State);
|
||||
}
|
||||
|
||||
|
||||
#define CASE_BRA_CONV(isa) case XZ_ID_ ## isa: size = isa ## _Convert(data, size, p->ip, p->encodeMode); break;
|
||||
|
||||
static SizeT BraState_Filter(void *pp, Byte *data, SizeT size)
|
||||
static const z7_Func_BranchConv g_Funcs_BranchConv_RISC_Dec[] =
|
||||
{
|
||||
Z7_BRANCH_CONV_DEC(PPC),
|
||||
Z7_BRANCH_CONV_DEC(IA64),
|
||||
Z7_BRANCH_CONV_DEC(ARM),
|
||||
Z7_BRANCH_CONV_DEC(ARMT),
|
||||
Z7_BRANCH_CONV_DEC(SPARC),
|
||||
Z7_BRANCH_CONV_DEC(ARM64)
|
||||
};
|
||||
|
||||
static SizeT XzBcFilterStateBase_Filter_Dec(CXzBcFilterStateBase *p, Byte *data, SizeT size)
|
||||
{
|
||||
CBraState *p = ((CBraState *)pp);
|
||||
switch (p->methodId)
|
||||
{
|
||||
case XZ_ID_Delta:
|
||||
if (p->encodeMode)
|
||||
Delta_Encode(p->deltaState, p->delta, data, size);
|
||||
else
|
||||
Delta_Decode(p->deltaState, p->delta, data, size);
|
||||
Delta_Decode(p->delta_State, p->delta, data, size);
|
||||
break;
|
||||
case XZ_ID_X86:
|
||||
size = x86_Convert(data, size, p->ip, &p->x86State, p->encodeMode);
|
||||
size = (SizeT)(z7_BranchConvSt_X86_Dec(data, size, p->ip, &p->X86_State) - data);
|
||||
break;
|
||||
default:
|
||||
if (p->methodId >= XZ_ID_PPC)
|
||||
{
|
||||
const UInt32 i = p->methodId - XZ_ID_PPC;
|
||||
if (i < Z7_ARRAY_SIZE(g_Funcs_BranchConv_RISC_Dec))
|
||||
size = (SizeT)(g_Funcs_BranchConv_RISC_Dec[i](data, size, p->ip) - data);
|
||||
}
|
||||
break;
|
||||
CASE_BRA_CONV(PPC)
|
||||
CASE_BRA_CONV(IA64)
|
||||
CASE_BRA_CONV(ARM)
|
||||
CASE_BRA_CONV(ARMT)
|
||||
CASE_BRA_CONV(SPARC)
|
||||
}
|
||||
p->ip += (UInt32)size;
|
||||
return size;
|
||||
}
|
||||
|
||||
|
||||
static SRes BraState_Code2(void *pp,
|
||||
static SizeT XzBcFilterState_Filter(void *pp, Byte *data, SizeT size)
|
||||
{
|
||||
CXzBcFilterState *p = ((CXzBcFilterState *)pp);
|
||||
return p->filter_func(&p->base, data, size);
|
||||
}
|
||||
|
||||
|
||||
static SRes XzBcFilterState_Code2(void *pp,
|
||||
Byte *dest, SizeT *destLen,
|
||||
const Byte *src, SizeT *srcLen, int srcWasFinished,
|
||||
ECoderFinishMode finishMode,
|
||||
// int *wasFinished
|
||||
ECoderStatus *status)
|
||||
{
|
||||
CBraState *p = ((CBraState *)pp);
|
||||
CXzBcFilterState *p = ((CXzBcFilterState *)pp);
|
||||
SizeT destRem = *destLen;
|
||||
SizeT srcRem = *srcLen;
|
||||
UNUSED_VAR(finishMode);
|
||||
UNUSED_VAR(finishMode)
|
||||
|
||||
*destLen = 0;
|
||||
*srcLen = 0;
|
||||
// *wasFinished = False;
|
||||
*status = CODER_STATUS_NOT_FINISHED;
|
||||
|
||||
while (destRem > 0)
|
||||
while (destRem != 0)
|
||||
{
|
||||
if (p->bufPos != p->bufConv)
|
||||
{
|
||||
size_t size = p->bufConv - p->bufPos;
|
||||
if (size > destRem)
|
||||
size = destRem;
|
||||
memcpy(dest, p->buf + p->bufPos, size);
|
||||
p->bufPos += size;
|
||||
*destLen += size;
|
||||
dest += size;
|
||||
destRem -= size;
|
||||
continue;
|
||||
if (size)
|
||||
{
|
||||
if (size > destRem)
|
||||
size = destRem;
|
||||
memcpy(dest, p->buf + p->bufPos, size);
|
||||
p->bufPos += size;
|
||||
*destLen += size;
|
||||
dest += size;
|
||||
destRem -= size;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
p->bufTotal -= p->bufPos;
|
||||
@@ -220,7 +241,7 @@ static SRes BraState_Code2(void *pp,
|
||||
if (p->bufTotal == 0)
|
||||
break;
|
||||
|
||||
p->bufConv = BraState_Filter(pp, p->buf, p->bufTotal);
|
||||
p->bufConv = p->filter_func(&p->base, p->buf, p->bufTotal);
|
||||
|
||||
if (p->bufConv == 0)
|
||||
{
|
||||
@@ -240,27 +261,37 @@ static SRes BraState_Code2(void *pp,
|
||||
}
|
||||
|
||||
|
||||
SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc);
|
||||
SRes BraState_SetFromMethod(IStateCoder *p, UInt64 id, int encodeMode, ISzAllocPtr alloc)
|
||||
#define XZ_IS_SUPPORTED_FILTER_ID(id) \
|
||||
((id) >= XZ_ID_Delta && (id) <= XZ_ID_ARM64)
|
||||
|
||||
SRes Xz_StateCoder_Bc_SetFromMethod_Func(IStateCoder *p, UInt64 id,
|
||||
Xz_Func_BcFilterStateBase_Filter func, ISzAllocPtr alloc)
|
||||
{
|
||||
CBraState *decoder;
|
||||
if (id < XZ_ID_Delta || id > XZ_ID_SPARC)
|
||||
CXzBcFilterState *decoder;
|
||||
if (!XZ_IS_SUPPORTED_FILTER_ID(id))
|
||||
return SZ_ERROR_UNSUPPORTED;
|
||||
decoder = (CBraState *)p->p;
|
||||
decoder = (CXzBcFilterState *)p->p;
|
||||
if (!decoder)
|
||||
{
|
||||
decoder = (CBraState *)ISzAlloc_Alloc(alloc, sizeof(CBraState));
|
||||
decoder = (CXzBcFilterState *)ISzAlloc_Alloc(alloc, sizeof(CXzBcFilterState));
|
||||
if (!decoder)
|
||||
return SZ_ERROR_MEM;
|
||||
decoder->buf = ISzAlloc_Alloc(alloc, BRA_BUF_SIZE);
|
||||
if (!decoder->buf)
|
||||
{
|
||||
ISzAlloc_Free(alloc, decoder);
|
||||
return SZ_ERROR_MEM;
|
||||
}
|
||||
p->p = decoder;
|
||||
p->Free = BraState_Free;
|
||||
p->SetProps = BraState_SetProps;
|
||||
p->Init = BraState_Init;
|
||||
p->Code2 = BraState_Code2;
|
||||
p->Filter = BraState_Filter;
|
||||
p->Free = XzBcFilterState_Free;
|
||||
p->SetProps = XzBcFilterState_SetProps;
|
||||
p->Init = XzBcFilterState_Init;
|
||||
p->Code2 = XzBcFilterState_Code2;
|
||||
p->Filter = XzBcFilterState_Filter;
|
||||
decoder->filter_func = func;
|
||||
}
|
||||
decoder->methodId = (UInt32)id;
|
||||
decoder->encodeMode = encodeMode;
|
||||
decoder->base.methodId = (UInt32)id;
|
||||
// decoder->encodeMode = encodeMode;
|
||||
return SZ_OK;
|
||||
}
|
||||
|
||||
@@ -279,9 +310,9 @@ static void SbState_Free(void *pp, ISzAllocPtr alloc)
|
||||
|
||||
static SRes SbState_SetProps(void *pp, const Byte *props, size_t propSize, ISzAllocPtr alloc)
|
||||
{
|
||||
UNUSED_VAR(pp);
|
||||
UNUSED_VAR(props);
|
||||
UNUSED_VAR(alloc);
|
||||
UNUSED_VAR(pp)
|
||||
UNUSED_VAR(props)
|
||||
UNUSED_VAR(alloc)
|
||||
return (propSize == 0) ? SZ_OK : SZ_ERROR_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@@ -297,7 +328,7 @@ static SRes SbState_Code2(void *pp, Byte *dest, SizeT *destLen, const Byte *src,
|
||||
{
|
||||
CSbDec *p = (CSbDec *)pp;
|
||||
SRes res;
|
||||
UNUSED_VAR(srcWasFinished);
|
||||
UNUSED_VAR(srcWasFinished)
|
||||
p->dest = dest;
|
||||
p->destLen = *destLen;
|
||||
p->src = src;
|
||||
@@ -389,7 +420,7 @@ static SRes Lzma2State_Code2(void *pp, Byte *dest, SizeT *destLen, const Byte *s
|
||||
ELzmaStatus status2;
|
||||
/* ELzmaFinishMode fm = (finishMode == LZMA_FINISH_ANY) ? LZMA_FINISH_ANY : LZMA_FINISH_END; */
|
||||
SRes res;
|
||||
UNUSED_VAR(srcWasFinished);
|
||||
UNUSED_VAR(srcWasFinished)
|
||||
if (spec->outBufMode)
|
||||
{
|
||||
SizeT dicPos = spec->decoder.decoder.dicPos;
|
||||
@@ -420,7 +451,7 @@ static SRes Lzma2State_SetFromMethod(IStateCoder *p, Byte *outBuf, size_t outBuf
|
||||
p->Init = Lzma2State_Init;
|
||||
p->Code2 = Lzma2State_Code2;
|
||||
p->Filter = NULL;
|
||||
Lzma2Dec_Construct(&spec->decoder);
|
||||
Lzma2Dec_CONSTRUCT(&spec->decoder)
|
||||
}
|
||||
spec->outBufMode = False;
|
||||
if (outBuf)
|
||||
@@ -519,7 +550,8 @@ static SRes MixCoder_SetFromMethod(CMixCoder *p, unsigned coderIndex, UInt64 met
|
||||
}
|
||||
if (coderIndex == 0)
|
||||
return SZ_ERROR_UNSUPPORTED;
|
||||
return BraState_SetFromMethod(sc, methodId, 0, p->alloc);
|
||||
return Xz_StateCoder_Bc_SetFromMethod_Func(sc, methodId,
|
||||
XzBcFilterStateBase_Filter_Dec, p->alloc);
|
||||
}
|
||||
|
||||
|
||||
@@ -568,7 +600,7 @@ static SRes MixCoder_Code(CMixCoder *p,
|
||||
SizeT destLen2, srcLen2;
|
||||
int wasFinished;
|
||||
|
||||
PRF_STR("------- MixCoder Single ----------");
|
||||
PRF_STR("------- MixCoder Single ----------")
|
||||
|
||||
srcLen2 = srcLenOrig;
|
||||
destLen2 = destLenOrig;
|
||||
@@ -615,14 +647,14 @@ static SRes MixCoder_Code(CMixCoder *p,
|
||||
processed = coder->Filter(coder->p, p->outBuf, processed);
|
||||
if (wasFinished || (destFinish && p->outWritten == destLenOrig))
|
||||
processed = p->outWritten;
|
||||
PRF_STR_INT("filter", i);
|
||||
PRF_STR_INT("filter", i)
|
||||
}
|
||||
*destLen = processed;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
PRF_STR("standard mix");
|
||||
PRF_STR("standard mix")
|
||||
|
||||
if (p->numCoders != 1)
|
||||
{
|
||||
@@ -779,7 +811,7 @@ static BoolInt Xz_CheckFooter(CXzStreamFlags flags, UInt64 indexSize, const Byte
|
||||
|
||||
static BoolInt XzBlock_AreSupportedFilters(const CXzBlock *p)
|
||||
{
|
||||
unsigned numFilters = XzBlock_GetNumFilters(p) - 1;
|
||||
const unsigned numFilters = XzBlock_GetNumFilters(p) - 1;
|
||||
unsigned i;
|
||||
{
|
||||
const CXzFilter *f = &p->filters[numFilters];
|
||||
@@ -795,8 +827,7 @@ static BoolInt XzBlock_AreSupportedFilters(const CXzBlock *p)
|
||||
if (f->propsSize != 1)
|
||||
return False;
|
||||
}
|
||||
else if (f->id < XZ_ID_Delta
|
||||
|| f->id > XZ_ID_SPARC
|
||||
else if (!XZ_IS_SUPPORTED_FILTER_ID(f->id)
|
||||
|| (f->propsSize != 0 && f->propsSize != 4))
|
||||
return False;
|
||||
}
|
||||
@@ -821,22 +852,24 @@ SRes XzBlock_Parse(CXzBlock *p, const Byte *header)
|
||||
p->packSize = (UInt64)(Int64)-1;
|
||||
if (XzBlock_HasPackSize(p))
|
||||
{
|
||||
READ_VARINT_AND_CHECK(header, pos, headerSize, &p->packSize);
|
||||
READ_VARINT_AND_CHECK(header, pos, headerSize, &p->packSize)
|
||||
if (p->packSize == 0 || p->packSize + headerSize >= (UInt64)1 << 63)
|
||||
return SZ_ERROR_ARCHIVE;
|
||||
}
|
||||
|
||||
p->unpackSize = (UInt64)(Int64)-1;
|
||||
if (XzBlock_HasUnpackSize(p))
|
||||
READ_VARINT_AND_CHECK(header, pos, headerSize, &p->unpackSize);
|
||||
{
|
||||
READ_VARINT_AND_CHECK(header, pos, headerSize, &p->unpackSize)
|
||||
}
|
||||
|
||||
numFilters = XzBlock_GetNumFilters(p);
|
||||
for (i = 0; i < numFilters; i++)
|
||||
{
|
||||
CXzFilter *filter = p->filters + i;
|
||||
UInt64 size;
|
||||
READ_VARINT_AND_CHECK(header, pos, headerSize, &filter->id);
|
||||
READ_VARINT_AND_CHECK(header, pos, headerSize, &size);
|
||||
READ_VARINT_AND_CHECK(header, pos, headerSize, &filter->id)
|
||||
READ_VARINT_AND_CHECK(header, pos, headerSize, &size)
|
||||
if (size > headerSize - pos || size > XZ_FILTER_PROPS_SIZE_MAX)
|
||||
return SZ_ERROR_ARCHIVE;
|
||||
filter->propsSize = (UInt32)size;
|
||||
@@ -894,20 +927,20 @@ static SRes XzDecMix_Init(CMixCoder *p, const CXzBlock *block, Byte *outBuf, siz
|
||||
MixCoder_Free(p);
|
||||
for (i = 0; i < numFilters; i++)
|
||||
{
|
||||
RINOK(MixCoder_SetFromMethod(p, i, block->filters[numFilters - 1 - i].id, outBuf, outBufSize));
|
||||
RINOK(MixCoder_SetFromMethod(p, i, block->filters[numFilters - 1 - i].id, outBuf, outBufSize))
|
||||
}
|
||||
p->numCoders = numFilters;
|
||||
}
|
||||
else
|
||||
{
|
||||
RINOK(MixCoder_ResetFromMethod(p, 0, block->filters[numFilters - 1].id, outBuf, outBufSize));
|
||||
RINOK(MixCoder_ResetFromMethod(p, 0, block->filters[numFilters - 1].id, outBuf, outBufSize))
|
||||
}
|
||||
|
||||
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));
|
||||
RINOK(sc->SetProps(sc->p, f->props, f->propsSize, p->alloc))
|
||||
}
|
||||
|
||||
MixCoder_Init(p);
|
||||
@@ -1054,14 +1087,14 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
|
||||
(*destLen) += destLen2;
|
||||
p->unpackSize += destLen2;
|
||||
|
||||
RINOK(res);
|
||||
RINOK(res)
|
||||
|
||||
if (*status != CODER_STATUS_FINISHED_WITH_MARK)
|
||||
{
|
||||
if (p->block.packSize == p->packSize
|
||||
&& *status == CODER_STATUS_NEEDS_MORE_INPUT)
|
||||
{
|
||||
PRF_STR("CODER_STATUS_NEEDS_MORE_INPUT");
|
||||
PRF_STR("CODER_STATUS_NEEDS_MORE_INPUT")
|
||||
*status = CODER_STATUS_NOT_SPECIFIED;
|
||||
return SZ_ERROR_DATA;
|
||||
}
|
||||
@@ -1078,7 +1111,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
|
||||
if ((p->block.packSize != (UInt64)(Int64)-1 && p->block.packSize != p->packSize)
|
||||
|| (p->block.unpackSize != (UInt64)(Int64)-1 && p->block.unpackSize != p->unpackSize))
|
||||
{
|
||||
PRF_STR("ERROR: block.size mismatch");
|
||||
PRF_STR("ERROR: block.size mismatch")
|
||||
return SZ_ERROR_DATA;
|
||||
}
|
||||
}
|
||||
@@ -1109,7 +1142,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
|
||||
}
|
||||
else
|
||||
{
|
||||
RINOK(Xz_ParseHeader(&p->streamFlags, p->buf));
|
||||
RINOK(Xz_ParseHeader(&p->streamFlags, p->buf))
|
||||
p->numStartedStreams++;
|
||||
p->indexSize = 0;
|
||||
p->numBlocks = 0;
|
||||
@@ -1155,7 +1188,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
|
||||
}
|
||||
else
|
||||
{
|
||||
RINOK(XzBlock_Parse(&p->block, p->buf));
|
||||
RINOK(XzBlock_Parse(&p->block, p->buf))
|
||||
if (!XzBlock_AreSupportedFilters(&p->block))
|
||||
return SZ_ERROR_UNSUPPORTED;
|
||||
p->numTotalBlocks++;
|
||||
@@ -1168,7 +1201,7 @@ SRes XzUnpacker_Code(CXzUnpacker *p, Byte *dest, SizeT *destLen,
|
||||
p->headerParsedOk = True;
|
||||
return SZ_OK;
|
||||
}
|
||||
RINOK(XzDecMix_Init(&p->decoder, &p->block, p->outBuf, p->outBufSize));
|
||||
RINOK(XzDecMix_Init(&p->decoder, &p->block, p->outBuf, p->outBufSize))
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1389,7 +1422,7 @@ UInt64 XzUnpacker_GetExtraSize(const CXzUnpacker *p)
|
||||
|
||||
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
#include "MtDec.h"
|
||||
#endif
|
||||
|
||||
@@ -1400,7 +1433,7 @@ void XzDecMtProps_Init(CXzDecMtProps *p)
|
||||
p->outStep_ST = 1 << 20;
|
||||
p->ignoreErrors = False;
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
p->numThreads = 1;
|
||||
p->inBufSize_MT = 1 << 18;
|
||||
p->memUseMax = sizeof(size_t) << 28;
|
||||
@@ -1409,7 +1442,7 @@ void XzDecMtProps_Init(CXzDecMtProps *p)
|
||||
|
||||
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
|
||||
/* ---------- CXzDecMtThread ---------- */
|
||||
|
||||
@@ -1448,7 +1481,7 @@ typedef struct
|
||||
|
||||
/* ---------- CXzDecMt ---------- */
|
||||
|
||||
typedef struct
|
||||
struct CXzDecMt
|
||||
{
|
||||
CAlignOffsetAlloc alignOffsetAlloc;
|
||||
ISzAllocPtr allocMid;
|
||||
@@ -1456,9 +1489,9 @@ typedef struct
|
||||
CXzDecMtProps props;
|
||||
size_t unpackBlockMaxSize;
|
||||
|
||||
ISeqInStream *inStream;
|
||||
ISeqOutStream *outStream;
|
||||
ICompressProgress *progress;
|
||||
ISeqInStreamPtr inStream;
|
||||
ISeqOutStreamPtr outStream;
|
||||
ICompressProgressPtr progress;
|
||||
|
||||
BoolInt finishMode;
|
||||
BoolInt outSize_Defined;
|
||||
@@ -1481,7 +1514,7 @@ typedef struct
|
||||
ECoderStatus status;
|
||||
SRes codeRes;
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
BoolInt mainDecoderWasCalled;
|
||||
// int statErrorDefined;
|
||||
int finishedDecoderIndex;
|
||||
@@ -1504,10 +1537,9 @@ typedef struct
|
||||
|
||||
BoolInt mtc_WasConstructed;
|
||||
CMtDec mtc;
|
||||
CXzDecMtThread coders[MTDEC__THREADS_MAX];
|
||||
CXzDecMtThread coders[MTDEC_THREADS_MAX];
|
||||
#endif
|
||||
|
||||
} CXzDecMt;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -1535,11 +1567,11 @@ CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid)
|
||||
|
||||
XzDecMtProps_Init(&p->props);
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
p->mtc_WasConstructed = False;
|
||||
{
|
||||
unsigned i;
|
||||
for (i = 0; i < MTDEC__THREADS_MAX; i++)
|
||||
for (i = 0; i < MTDEC_THREADS_MAX; i++)
|
||||
{
|
||||
CXzDecMtThread *coder = &p->coders[i];
|
||||
coder->dec_created = False;
|
||||
@@ -1549,16 +1581,16 @@ CXzDecMtHandle XzDecMt_Create(ISzAllocPtr alloc, ISzAllocPtr allocMid)
|
||||
}
|
||||
#endif
|
||||
|
||||
return p;
|
||||
return (CXzDecMtHandle)p;
|
||||
}
|
||||
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
|
||||
static void XzDecMt_FreeOutBufs(CXzDecMt *p)
|
||||
{
|
||||
unsigned i;
|
||||
for (i = 0; i < MTDEC__THREADS_MAX; i++)
|
||||
for (i = 0; i < MTDEC_THREADS_MAX; i++)
|
||||
{
|
||||
CXzDecMtThread *coder = &p->coders[i];
|
||||
if (coder->outBuf)
|
||||
@@ -1595,13 +1627,15 @@ static void XzDecMt_FreeSt(CXzDecMt *p)
|
||||
}
|
||||
|
||||
|
||||
void XzDecMt_Destroy(CXzDecMtHandle pp)
|
||||
// #define GET_CXzDecMt_p CXzDecMt *p = pp;
|
||||
|
||||
void XzDecMt_Destroy(CXzDecMtHandle p)
|
||||
{
|
||||
CXzDecMt *p = (CXzDecMt *)pp;
|
||||
// GET_CXzDecMt_p
|
||||
|
||||
XzDecMt_FreeSt(p);
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
|
||||
if (p->mtc_WasConstructed)
|
||||
{
|
||||
@@ -1610,7 +1644,7 @@ void XzDecMt_Destroy(CXzDecMtHandle pp)
|
||||
}
|
||||
{
|
||||
unsigned i;
|
||||
for (i = 0; i < MTDEC__THREADS_MAX; i++)
|
||||
for (i = 0; i < MTDEC_THREADS_MAX; i++)
|
||||
{
|
||||
CXzDecMtThread *t = &p->coders[i];
|
||||
if (t->dec_created)
|
||||
@@ -1625,12 +1659,12 @@ void XzDecMt_Destroy(CXzDecMtHandle pp)
|
||||
|
||||
#endif
|
||||
|
||||
ISzAlloc_Free(p->alignOffsetAlloc.baseAlloc, pp);
|
||||
ISzAlloc_Free(p->alignOffsetAlloc.baseAlloc, p);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
|
||||
static void XzDecMt_Callback_Parse(void *obj, unsigned coderIndex, CMtDecCallbackInfo *cc)
|
||||
{
|
||||
@@ -1696,7 +1730,7 @@ static void XzDecMt_Callback_Parse(void *obj, unsigned coderIndex, CMtDecCallbac
|
||||
coder->dec.parseMode = True;
|
||||
coder->dec.headerParsedOk = False;
|
||||
|
||||
PRF_STR_INT("Parse", srcSize2);
|
||||
PRF_STR_INT("Parse", srcSize2)
|
||||
|
||||
res = XzUnpacker_Code(&coder->dec,
|
||||
NULL, &destSize,
|
||||
@@ -2071,7 +2105,7 @@ static SRes XzDecMt_Callback_Write(void *pp, unsigned coderIndex,
|
||||
}
|
||||
data += cur;
|
||||
size -= cur;
|
||||
// PRF_STR_INT("Written size =", size);
|
||||
// PRF_STR_INT("Written size =", size)
|
||||
if (size == 0)
|
||||
break;
|
||||
res = MtProgress_ProgressAdd(&me->mtc.mtProgress, 0, 0);
|
||||
@@ -2087,7 +2121,7 @@ static SRes XzDecMt_Callback_Write(void *pp, unsigned coderIndex,
|
||||
return res;
|
||||
}
|
||||
|
||||
RINOK(res);
|
||||
RINOK(res)
|
||||
|
||||
if (coder->inPreSize != coder->inCodeSize
|
||||
|| coder->blockPackTotal != coder->inCodeSize)
|
||||
@@ -2106,13 +2140,13 @@ static SRes XzDecMt_Callback_Write(void *pp, unsigned coderIndex,
|
||||
// (coder->state == MTDEC_PARSE_END) means that there are no other working threads
|
||||
// so we can use mtc variables without lock
|
||||
|
||||
PRF_STR_INT("Write MTDEC_PARSE_END", me->mtc.inProcessed);
|
||||
PRF_STR_INT("Write MTDEC_PARSE_END", me->mtc.inProcessed)
|
||||
|
||||
me->mtc.mtProgress.totalInSize = me->mtc.inProcessed;
|
||||
{
|
||||
CXzUnpacker *dec = &me->dec;
|
||||
|
||||
PRF_STR_INT("PostSingle", srcSize);
|
||||
PRF_STR_INT("PostSingle", srcSize)
|
||||
|
||||
{
|
||||
size_t srcProcessed = srcSize;
|
||||
@@ -2186,7 +2220,7 @@ static SRes XzDecMt_Callback_Write(void *pp, unsigned coderIndex,
|
||||
me->mtc.crossEnd = srcSize;
|
||||
}
|
||||
|
||||
PRF_STR_INT("XZ_STATE_STREAM_HEADER crossEnd = ", (unsigned)me->mtc.crossEnd);
|
||||
PRF_STR_INT("XZ_STATE_STREAM_HEADER crossEnd = ", (unsigned)me->mtc.crossEnd)
|
||||
|
||||
return SZ_OK;
|
||||
}
|
||||
@@ -2277,7 +2311,7 @@ static SRes XzDecMt_Callback_Write(void *pp, unsigned coderIndex,
|
||||
UInt64 inDelta = me->mtc.inProcessed - inProgressPrev;
|
||||
if (inDelta >= (1 << 22))
|
||||
{
|
||||
RINOK(MtProgress_Progress_ST(&me->mtc.mtProgress));
|
||||
RINOK(MtProgress_Progress_ST(&me->mtc.mtProgress))
|
||||
inProgressPrev = me->mtc.inProcessed;
|
||||
}
|
||||
}
|
||||
@@ -2331,7 +2365,7 @@ void XzStatInfo_Clear(CXzStatInfo *p)
|
||||
*/
|
||||
|
||||
static SRes XzDecMt_Decode_ST(CXzDecMt *p
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
, BoolInt tMode
|
||||
#endif
|
||||
, CXzStatInfo *stat)
|
||||
@@ -2343,7 +2377,7 @@ static SRes XzDecMt_Decode_ST(CXzDecMt *p
|
||||
|
||||
CXzUnpacker *dec;
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
if (tMode)
|
||||
{
|
||||
XzDecMt_FreeOutBufs(p);
|
||||
@@ -2400,7 +2434,7 @@ static SRes XzDecMt_Decode_ST(CXzDecMt *p
|
||||
|
||||
if (inPos == inLim)
|
||||
{
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
if (tMode)
|
||||
{
|
||||
inData = MtDec_Read(&p->mtc, &inLim);
|
||||
@@ -2577,19 +2611,19 @@ static void XzStatInfo_SetStat(const CXzUnpacker *dec,
|
||||
|
||||
|
||||
|
||||
SRes XzDecMt_Decode(CXzDecMtHandle pp,
|
||||
SRes XzDecMt_Decode(CXzDecMtHandle p,
|
||||
const CXzDecMtProps *props,
|
||||
const UInt64 *outDataSize, int finishMode,
|
||||
ISeqOutStream *outStream,
|
||||
ISeqOutStreamPtr outStream,
|
||||
// Byte *outBuf, size_t *outBufSize,
|
||||
ISeqInStream *inStream,
|
||||
ISeqInStreamPtr inStream,
|
||||
// const Byte *inData, size_t inDataSize,
|
||||
CXzStatInfo *stat,
|
||||
int *isMT,
|
||||
ICompressProgress *progress)
|
||||
ICompressProgressPtr progress)
|
||||
{
|
||||
CXzDecMt *p = (CXzDecMt *)pp;
|
||||
#ifndef _7ZIP_ST
|
||||
// GET_CXzDecMt_p
|
||||
#ifndef Z7_ST
|
||||
BoolInt tMode;
|
||||
#endif
|
||||
|
||||
@@ -2640,7 +2674,7 @@ SRes XzDecMt_Decode(CXzDecMtHandle pp,
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
|
||||
p->isBlockHeaderState_Parse = False;
|
||||
p->isBlockHeaderState_Write = False;
|
||||
@@ -2782,7 +2816,7 @@ SRes XzDecMt_Decode(CXzDecMtHandle pp,
|
||||
return res;
|
||||
}
|
||||
|
||||
PRF_STR("----- decoding ST -----");
|
||||
PRF_STR("----- decoding ST -----")
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -2792,13 +2826,13 @@ SRes XzDecMt_Decode(CXzDecMtHandle pp,
|
||||
|
||||
{
|
||||
SRes res = XzDecMt_Decode_ST(p
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
, tMode
|
||||
#endif
|
||||
, stat
|
||||
);
|
||||
|
||||
#ifndef _7ZIP_ST
|
||||
#ifndef Z7_ST
|
||||
// we must set error code from MT decoding at first
|
||||
if (p->mainErrorCode != SZ_OK)
|
||||
stat->DecodeRes = p->mainErrorCode;
|
||||
@@ -2835,3 +2869,7 @@ SRes XzDecMt_Decode(CXzDecMtHandle pp,
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
#undef PRF
|
||||
#undef PRF_STR
|
||||
#undef PRF_STR_INT_2
|
||||
|
||||
Reference in New Issue
Block a user