code refactor
This commit is contained in:
parent
0d9ce04cd5
commit
01e5b95199
@ -41,7 +41,7 @@ extern "C" {
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This API consists of small unitary functions, which highly benefit from being inlined.
|
* This API consists of small unitary functions, which must be inlined for best performance.
|
||||||
* Since link-time-optimization is not available for all compilers,
|
* Since link-time-optimization is not available for all compilers,
|
||||||
* these functions are defined into a .h to be included.
|
* these functions are defined into a .h to be included.
|
||||||
*/
|
*/
|
||||||
@ -74,7 +74,7 @@ MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, size_t value, unsigned nbBits
|
|||||||
MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC);
|
MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC);
|
||||||
MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC);
|
MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC);
|
||||||
|
|
||||||
/*Start by initCStream, providing the size of buffer to write into.
|
/* Start with initCStream, providing the size of buffer to write into.
|
||||||
* bitStream will never write outside of this buffer.
|
* bitStream will never write outside of this buffer.
|
||||||
* `dstCapacity` must be >= sizeof(size_t), otherwise @return will be an error code.
|
* `dstCapacity` must be >= sizeof(size_t), otherwise @return will be an error code.
|
||||||
*
|
*
|
||||||
@ -169,17 +169,24 @@ MEM_STATIC unsigned BIT_highbit32 (register U32 val)
|
|||||||
/*-**************************************************************
|
/*-**************************************************************
|
||||||
* bitStream encoding
|
* bitStream encoding
|
||||||
****************************************************************/
|
****************************************************************/
|
||||||
MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, void* startPtr, size_t maxSize)
|
/*! BIT_initCStream() :
|
||||||
|
* `dstCapacity` must be > sizeof(void*)
|
||||||
|
* @return : 0 if success,
|
||||||
|
otherwise an error code (can be tested using ERR_isError() ) */
|
||||||
|
MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, void* startPtr, size_t dstCapacity)
|
||||||
{
|
{
|
||||||
bitC->bitContainer = 0;
|
bitC->bitContainer = 0;
|
||||||
bitC->bitPos = 0;
|
bitC->bitPos = 0;
|
||||||
bitC->startPtr = (char*)startPtr;
|
bitC->startPtr = (char*)startPtr;
|
||||||
bitC->ptr = bitC->startPtr;
|
bitC->ptr = bitC->startPtr;
|
||||||
bitC->endPtr = bitC->startPtr + maxSize - sizeof(bitC->ptr);
|
bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->ptr);
|
||||||
if (maxSize < sizeof(bitC->ptr)) return ERROR(dstSize_tooSmall);
|
if (dstCapacity <= sizeof(bitC->ptr)) return ERROR(dstSize_tooSmall);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! BIT_addBits() :
|
||||||
|
can add up to 26 bits into `bitC`.
|
||||||
|
Does not check for register overflow ! */
|
||||||
MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, size_t value, unsigned nbBits)
|
MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, size_t value, unsigned nbBits)
|
||||||
{
|
{
|
||||||
static const unsigned mask[] = { 0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF }; /* up to 26 bits */
|
static const unsigned mask[] = { 0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF }; /* up to 26 bits */
|
||||||
@ -206,6 +213,9 @@ MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t* bitC)
|
|||||||
bitC->bitContainer >>= nbBytes*8; /* if bitPos >= sizeof(bitContainer)*8 --> undefined behavior */
|
bitC->bitContainer >>= nbBytes*8; /* if bitPos >= sizeof(bitContainer)*8 --> undefined behavior */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! BIT_flushBits() :
|
||||||
|
* safe version; check for buffer overflow, and prevents it.
|
||||||
|
* note : does not signal buffer overflow. This will be revealed later on using BIT_closeCStream() */
|
||||||
MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC)
|
MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC)
|
||||||
{
|
{
|
||||||
size_t nbBytes = bitC->bitPos >> 3;
|
size_t nbBytes = bitC->bitPos >> 3;
|
||||||
@ -217,21 +227,16 @@ MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*! BIT_closeCStream() :
|
/*! BIT_closeCStream() :
|
||||||
* @return : size of CStream, in bytes, or 0 if it cannot fit into dstBuffer */
|
* @return : size of CStream, in bytes,
|
||||||
|
or 0 if it could not fit into dstBuffer */
|
||||||
MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC)
|
MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC)
|
||||||
{
|
{
|
||||||
char* endPtr;
|
|
||||||
|
|
||||||
BIT_addBitsFast(bitC, 1, 1); /* endMark */
|
BIT_addBitsFast(bitC, 1, 1); /* endMark */
|
||||||
BIT_flushBits(bitC);
|
BIT_flushBits(bitC);
|
||||||
|
|
||||||
if (bitC->ptr >= bitC->endPtr) /* too close to buffer's end */
|
if (bitC->ptr >= bitC->endPtr) return 0; /* doesn't fit within authorized budget : cancel */
|
||||||
return 0; /* not storable */
|
|
||||||
|
|
||||||
endPtr = bitC->ptr;
|
return (bitC->ptr - bitC->startPtr) + (bitC->bitPos > 0);
|
||||||
endPtr += bitC->bitPos > 0; /* remaining bits (incomplete byte) */
|
|
||||||
|
|
||||||
return (endPtr - bitC->startPtr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -242,7 +247,7 @@ MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC)
|
|||||||
* Initialize a BIT_DStream_t.
|
* Initialize a BIT_DStream_t.
|
||||||
* `bitD` : a pointer to an already allocated BIT_DStream_t structure.
|
* `bitD` : a pointer to an already allocated BIT_DStream_t structure.
|
||||||
* `srcBuffer` must point at the beginning of a bitStream.
|
* `srcBuffer` must point at the beginning of a bitStream.
|
||||||
* `srcSize` must be the exact size of the bitStream.
|
* `srcSize` must be the exact size of the bitStream, in bytes.
|
||||||
* @return : size of stream (== srcSize) or an errorCode if a problem is detected
|
* @return : size of stream (== srcSize) or an errorCode if a problem is detected
|
||||||
*/
|
*/
|
||||||
MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize)
|
MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, size_t srcSize)
|
||||||
@ -294,7 +299,7 @@ MEM_STATIC size_t BIT_lookBits(BIT_DStream_t* bitD, U32 nbBits)
|
|||||||
return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
|
return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! BIT_lookBitsFast*() :
|
/*! BIT_lookBitsFast() :
|
||||||
* unsafe version; only works only if nbBits >= 1 */
|
* unsafe version; only works only if nbBits >= 1 */
|
||||||
MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
MEM_STATIC size_t BIT_lookBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
||||||
{
|
{
|
||||||
@ -328,6 +333,11 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! BIT_reloadDStream() :
|
||||||
|
* Refill `BIT_DStream_t` from src buffer previously defined (see BIT_initDStream() ).
|
||||||
|
* This function is safe, it guarantees it will not read beyond src buffer.
|
||||||
|
* @return : status of `BIT_DStream_t` internal register.
|
||||||
|
if status == unfinished, internal register is filled with >= (sizeof(size_t)*8 - 7) bits */
|
||||||
MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
|
MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
|
||||||
{
|
{
|
||||||
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
|
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
|
||||||
@ -343,8 +353,7 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
|
|||||||
if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer;
|
if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer;
|
||||||
return BIT_DStream_completed;
|
return BIT_DStream_completed;
|
||||||
}
|
}
|
||||||
{
|
{ U32 nbBytes = bitD->bitsConsumed >> 3;
|
||||||
U32 nbBytes = bitD->bitsConsumed >> 3;
|
|
||||||
BIT_DStream_status result = BIT_DStream_unfinished;
|
BIT_DStream_status result = BIT_DStream_unfinished;
|
||||||
if (bitD->ptr - nbBytes < bitD->start) {
|
if (bitD->ptr - nbBytes < bitD->start) {
|
||||||
nbBytes = (U32)(bitD->ptr - bitD->start); /* ptr > start */
|
nbBytes = (U32)(bitD->ptr - bitD->start); /* ptr > start */
|
||||||
@ -358,7 +367,7 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*! BIT_endOfDStream() :
|
/*! BIT_endOfDStream() :
|
||||||
* @return Tells if DStream has reached its exact end
|
* @return Tells if DStream has exactly reached its end (all bits consumed).
|
||||||
*/
|
*/
|
||||||
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream)
|
MEM_STATIC unsigned BIT_endOfDStream(const BIT_DStream_t* DStream)
|
||||||
{
|
{
|
||||||
|
@ -26,7 +26,7 @@
|
|||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
You can contact the author at :
|
You can contact the author at :
|
||||||
- zstd source repository : https://github.com/Cyan4973/zstd
|
- zstd homepage : http://www.zstd.net
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* ***************************************************************
|
/* ***************************************************************
|
||||||
@ -84,16 +84,6 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*-*************************************
|
|
||||||
* Local types
|
|
||||||
***************************************/
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
blockType_t blockType;
|
|
||||||
U32 origSize;
|
|
||||||
} blockProperties_t;
|
|
||||||
|
|
||||||
|
|
||||||
/*_*******************************************************
|
/*_*******************************************************
|
||||||
* Memory operations
|
* Memory operations
|
||||||
**********************************************************/
|
**********************************************************/
|
||||||
@ -335,7 +325,7 @@ size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t
|
|||||||
|
|
||||||
/** ZSTD_decodeFrameHeader() :
|
/** ZSTD_decodeFrameHeader() :
|
||||||
* `srcSize` must be the size provided by ZSTD_frameHeaderSize().
|
* `srcSize` must be the size provided by ZSTD_frameHeaderSize().
|
||||||
* @return : 0, or an error code, which can be tested using ZSTD_isError() */
|
* @return : 0 if success, or an error code, which can be tested using ZSTD_isError() */
|
||||||
static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* zc, const void* src, size_t srcSize)
|
static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* zc, const void* src, size_t srcSize)
|
||||||
{
|
{
|
||||||
size_t result = ZSTD_getFrameParams(&(zc->fParams), src, srcSize);
|
size_t result = ZSTD_getFrameParams(&(zc->fParams), src, srcSize);
|
||||||
@ -344,19 +334,23 @@ static size_t ZSTD_decodeFrameHeader(ZSTD_DCtx* zc, const void* src, size_t srcS
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
blockType_t blockType;
|
||||||
|
U32 origSize;
|
||||||
|
} blockProperties_t;
|
||||||
|
|
||||||
|
/*! ZSTD_getcBlockSize() :
|
||||||
|
* Provides the size of compressed block from block header `src` */
|
||||||
size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
|
size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
|
||||||
{
|
{
|
||||||
const BYTE* const in = (const BYTE* const)src;
|
const BYTE* const in = (const BYTE* const)src;
|
||||||
BYTE headerFlags;
|
size_t cSize;
|
||||||
U32 cSize;
|
|
||||||
|
|
||||||
if (srcSize < 3)
|
if (srcSize < ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
|
||||||
return ERROR(srcSize_wrong);
|
|
||||||
|
|
||||||
headerFlags = *in;
|
bpPtr->blockType = (blockType_t)((*in) >> 6);
|
||||||
cSize = in[2] + (in[1]<<8) + ((in[0] & 7)<<16);
|
cSize = in[2] + (in[1]<<8) + ((in[0] & 7)<<16);
|
||||||
|
|
||||||
bpPtr->blockType = (blockType_t)(headerFlags >> 6);
|
|
||||||
bpPtr->origSize = (bpPtr->blockType == bt_rle) ? cSize : 0;
|
bpPtr->origSize = (bpPtr->blockType == bt_rle) ? cSize : 0;
|
||||||
|
|
||||||
if (bpPtr->blockType == bt_end) return 0;
|
if (bpPtr->blockType == bt_end) return 0;
|
||||||
@ -365,9 +359,9 @@ size_t ZSTD_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bp
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static size_t ZSTD_copyRawBlock(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
static size_t ZSTD_copyRawBlock(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
||||||
{
|
{
|
||||||
if (srcSize > maxDstSize) return ERROR(dstSize_tooSmall);
|
if (srcSize > dstCapacity) return ERROR(dstSize_tooSmall);
|
||||||
memcpy(dst, src, srcSize);
|
memcpy(dst, src, srcSize);
|
||||||
return srcSize;
|
return srcSize;
|
||||||
}
|
}
|
||||||
@ -619,7 +613,6 @@ typedef struct {
|
|||||||
} seqState_t;
|
} seqState_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
||||||
{
|
{
|
||||||
const BYTE* dumps = seqState->dumps;
|
const BYTE* dumps = seqState->dumps;
|
||||||
@ -659,8 +652,7 @@ static void ZSTD_decodeSequence(seq_t* seq, seqState_t* seqState, const U32 mls)
|
|||||||
if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
|
if (MEM_32bits()) BIT_reloadDStream(&(seqState->DStream));
|
||||||
|
|
||||||
/* MatchLength */
|
/* MatchLength */
|
||||||
{
|
{ size_t matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
||||||
size_t matchLength = FSE_decodeSymbol(&(seqState->stateML), &(seqState->DStream));
|
|
||||||
if (matchLength == MaxML) {
|
if (matchLength == MaxML) {
|
||||||
const U32 add = *dumps++;
|
const U32 add = *dumps++;
|
||||||
if (add < 255) matchLength += add;
|
if (add < 255) matchLength += add;
|
||||||
@ -755,8 +747,7 @@ FORCE_INLINE size_t ZSTD_execSequence(BYTE* op,
|
|||||||
match += oend_8 - op;
|
match += oend_8 - op;
|
||||||
op = oend_8;
|
op = oend_8;
|
||||||
}
|
}
|
||||||
while (op < oMatchEnd)
|
while (op < oMatchEnd) *op++ = *match++;
|
||||||
*op++ = *match++;
|
|
||||||
} else {
|
} else {
|
||||||
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
||||||
}
|
}
|
||||||
@ -826,8 +817,7 @@ static size_t ZSTD_decompressSequences(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* last literal segment */
|
/* last literal segment */
|
||||||
{
|
{ size_t const lastLLSize = litEnd - litPtr;
|
||||||
size_t lastLLSize = litEnd - litPtr;
|
|
||||||
if (litPtr > litEnd) return ERROR(corruption_detected); /* too many literals already used */
|
if (litPtr > litEnd) return ERROR(corruption_detected); /* too many literals already used */
|
||||||
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
||||||
memcpy(op, litPtr, lastLLSize);
|
memcpy(op, litPtr, lastLLSize);
|
||||||
@ -882,39 +872,36 @@ size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx,
|
|||||||
/*! ZSTD_decompress_continueDCtx() :
|
/*! ZSTD_decompress_continueDCtx() :
|
||||||
* `dctx` must have been properly initialized */
|
* `dctx` must have been properly initialized */
|
||||||
static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
|
static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
|
||||||
void* dst, size_t maxDstSize,
|
void* dst, size_t dstCapacity,
|
||||||
const void* src, size_t srcSize)
|
const void* src, size_t srcSize)
|
||||||
{
|
{
|
||||||
const BYTE* ip = (const BYTE*)src;
|
const BYTE* ip = (const BYTE*)src;
|
||||||
const BYTE* iend = ip + srcSize;
|
const BYTE* iend = ip + srcSize;
|
||||||
BYTE* const ostart = (BYTE* const)dst;
|
BYTE* const ostart = (BYTE* const)dst;
|
||||||
BYTE* op = ostart;
|
BYTE* op = ostart;
|
||||||
BYTE* const oend = ostart + maxDstSize;
|
BYTE* const oend = ostart + dstCapacity;
|
||||||
size_t remainingSize = srcSize;
|
size_t remainingSize = srcSize;
|
||||||
blockProperties_t blockProperties;
|
blockProperties_t blockProperties;
|
||||||
|
|
||||||
/* Frame Header */
|
/* check */
|
||||||
{
|
|
||||||
size_t frameHeaderSize, errorCode;
|
|
||||||
if (srcSize < ZSTD_frameHeaderSize_min+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
|
if (srcSize < ZSTD_frameHeaderSize_min+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
|
||||||
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT==1)
|
#if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT==1)
|
||||||
{
|
{ const U32 magicNumber = MEM_readLE32(src);
|
||||||
const U32 magicNumber = MEM_readLE32(src);
|
|
||||||
if (ZSTD_isLegacy(magicNumber))
|
if (ZSTD_isLegacy(magicNumber))
|
||||||
return ZSTD_decompressLegacy(dst, maxDstSize, src, srcSize, magicNumber);
|
return ZSTD_decompressLegacy(dst, dstCapacity, src, srcSize, magicNumber);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
frameHeaderSize = ZSTD_frameHeaderSize(src, ZSTD_frameHeaderSize_min);
|
|
||||||
|
/* Frame Header */
|
||||||
|
{ size_t const frameHeaderSize = ZSTD_frameHeaderSize(src, ZSTD_frameHeaderSize_min);
|
||||||
if (ZSTD_isError(frameHeaderSize)) return frameHeaderSize;
|
if (ZSTD_isError(frameHeaderSize)) return frameHeaderSize;
|
||||||
if (srcSize < frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
|
if (srcSize < frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
|
||||||
errorCode = ZSTD_decodeFrameHeader(dctx, src, frameHeaderSize);
|
if (ZSTD_decodeFrameHeader(dctx, src, frameHeaderSize)) return ERROR(corruption_detected);
|
||||||
if (ZSTD_isError(errorCode)) return errorCode;
|
|
||||||
ip += frameHeaderSize; remainingSize -= frameHeaderSize;
|
ip += frameHeaderSize; remainingSize -= frameHeaderSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Loop on each block */
|
/* Loop on each block */
|
||||||
while (1)
|
while (1) {
|
||||||
{
|
|
||||||
size_t decodedSize=0;
|
size_t decodedSize=0;
|
||||||
size_t cBlockSize = ZSTD_getcBlockSize(ip, iend-ip, &blockProperties);
|
size_t cBlockSize = ZSTD_getcBlockSize(ip, iend-ip, &blockProperties);
|
||||||
if (ZSTD_isError(cBlockSize)) return cBlockSize;
|
if (ZSTD_isError(cBlockSize)) return cBlockSize;
|
||||||
@ -954,45 +941,45 @@ static size_t ZSTD_decompressFrame(ZSTD_DCtx* dctx,
|
|||||||
|
|
||||||
|
|
||||||
size_t ZSTD_decompress_usingPreparedDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* refDCtx,
|
size_t ZSTD_decompress_usingPreparedDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* refDCtx,
|
||||||
void* dst, size_t maxDstSize,
|
void* dst, size_t dstCapacity,
|
||||||
const void* src, size_t srcSize)
|
const void* src, size_t srcSize)
|
||||||
{
|
{
|
||||||
ZSTD_copyDCtx(dctx, refDCtx);
|
ZSTD_copyDCtx(dctx, refDCtx);
|
||||||
ZSTD_checkContinuity(dctx, dst);
|
ZSTD_checkContinuity(dctx, dst);
|
||||||
return ZSTD_decompressFrame(dctx, dst, maxDstSize, src, srcSize);
|
return ZSTD_decompressFrame(dctx, dst, dstCapacity, src, srcSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
|
size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
|
||||||
void* dst, size_t maxDstSize,
|
void* dst, size_t dstCapacity,
|
||||||
const void* src, size_t srcSize,
|
const void* src, size_t srcSize,
|
||||||
const void* dict, size_t dictSize)
|
const void* dict, size_t dictSize)
|
||||||
{
|
{
|
||||||
ZSTD_decompressBegin_usingDict(dctx, dict, dictSize);
|
ZSTD_decompressBegin_usingDict(dctx, dict, dictSize);
|
||||||
ZSTD_LOG_BLOCK("%p: ZSTD_decompressBegin_usingDict searchLength=%d\n", dctx->base, dctx->params.searchLength);
|
ZSTD_LOG_BLOCK("%p: ZSTD_decompressBegin_usingDict searchLength=%d\n", dctx->base, dctx->params.searchLength);
|
||||||
ZSTD_checkContinuity(dctx, dst);
|
ZSTD_checkContinuity(dctx, dst);
|
||||||
return ZSTD_decompressFrame(dctx, dst, maxDstSize, src, srcSize);
|
return ZSTD_decompressFrame(dctx, dst, dstCapacity, src, srcSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
||||||
{
|
{
|
||||||
return ZSTD_decompress_usingDict(dctx, dst, maxDstSize, src, srcSize, NULL, 0);
|
return ZSTD_decompress_usingDict(dctx, dst, dstCapacity, src, srcSize, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, size_t srcSize)
|
size_t ZSTD_decompress(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
||||||
{
|
{
|
||||||
#if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE==1)
|
#if defined(ZSTD_HEAPMODE) && (ZSTD_HEAPMODE==1)
|
||||||
size_t regenSize;
|
size_t regenSize;
|
||||||
ZSTD_DCtx* dctx = ZSTD_createDCtx();
|
ZSTD_DCtx* dctx = ZSTD_createDCtx();
|
||||||
if (dctx==NULL) return ERROR(memory_allocation);
|
if (dctx==NULL) return ERROR(memory_allocation);
|
||||||
regenSize = ZSTD_decompressDCtx(dctx, dst, maxDstSize, src, srcSize);
|
regenSize = ZSTD_decompressDCtx(dctx, dst, dstCapacity, src, srcSize);
|
||||||
ZSTD_freeDCtx(dctx);
|
ZSTD_freeDCtx(dctx);
|
||||||
return regenSize;
|
return regenSize;
|
||||||
#else
|
#else
|
||||||
ZSTD_DCtx dctx;
|
ZSTD_DCtx dctx;
|
||||||
return ZSTD_decompressDCtx(&dctx, dst, maxDstSize, src, srcSize);
|
return ZSTD_decompressDCtx(&dctx, dst, dstCapacity, src, srcSize);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user