improve ZSTD_getFrameHeader on skippable frames
now reports: - the header size - the magic variant (within @dictID field)
This commit is contained in:
@@ -74,7 +74,7 @@ typedef struct {
|
|||||||
* Is the dictionary cold?
|
* Is the dictionary cold?
|
||||||
* Only set on decompression.
|
* Only set on decompression.
|
||||||
*/
|
*/
|
||||||
unsigned dictionaryIsCold;
|
int dictionaryIsCold;
|
||||||
/**
|
/**
|
||||||
* The dictionary size or zero if no dictionary.
|
* The dictionary size or zero if no dictionary.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -484,8 +484,10 @@ size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, s
|
|||||||
if (srcSize < ZSTD_SKIPPABLEHEADERSIZE)
|
if (srcSize < ZSTD_SKIPPABLEHEADERSIZE)
|
||||||
return ZSTD_SKIPPABLEHEADERSIZE; /* magic number + frame length */
|
return ZSTD_SKIPPABLEHEADERSIZE; /* magic number + frame length */
|
||||||
ZSTD_memset(zfhPtr, 0, sizeof(*zfhPtr));
|
ZSTD_memset(zfhPtr, 0, sizeof(*zfhPtr));
|
||||||
zfhPtr->frameContentSize = MEM_readLE32((const char *)src + ZSTD_FRAMEIDSIZE);
|
|
||||||
zfhPtr->frameType = ZSTD_skippableFrame;
|
zfhPtr->frameType = ZSTD_skippableFrame;
|
||||||
|
zfhPtr->dictID = MEM_readLE32(src) - ZSTD_MAGIC_SKIPPABLE_START;
|
||||||
|
zfhPtr->headerSize = ZSTD_SKIPPABLEHEADERSIZE;
|
||||||
|
zfhPtr->frameContentSize = MEM_readLE32((const char *)src + ZSTD_FRAMEIDSIZE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
RETURN_ERROR(prefix_unknown, "");
|
RETURN_ERROR(prefix_unknown, "");
|
||||||
@@ -917,7 +919,7 @@ static size_t ZSTD_setRleBlock(void* dst, size_t dstCapacity,
|
|||||||
return regenSize;
|
return regenSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ZSTD_DCtx_trace_end(ZSTD_DCtx const* dctx, U64 uncompressedSize, U64 compressedSize, unsigned streaming)
|
static void ZSTD_DCtx_trace_end(ZSTD_DCtx const* dctx, U64 uncompressedSize, U64 compressedSize, int streaming)
|
||||||
{
|
{
|
||||||
#if ZSTD_TRACE
|
#if ZSTD_TRACE
|
||||||
if (dctx->traceCtx && ZSTD_trace_decompress_end != NULL) {
|
if (dctx->traceCtx && ZSTD_trace_decompress_end != NULL) {
|
||||||
|
|||||||
+6
-6
@@ -1491,7 +1491,7 @@ ZSTDLIB_STATIC_API unsigned long long ZSTD_findDecompressedSize(const void* src,
|
|||||||
ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize);
|
ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize);
|
||||||
|
|
||||||
/*! ZSTD_frameHeaderSize() :
|
/*! ZSTD_frameHeaderSize() :
|
||||||
* srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX.
|
* srcSize must be large enough, aka >= ZSTD_FRAMEHEADERSIZE_PREFIX.
|
||||||
* @return : size of the Frame Header,
|
* @return : size of the Frame Header,
|
||||||
* or an error code (if srcSize is too small) */
|
* or an error code (if srcSize is too small) */
|
||||||
ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
|
ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
|
||||||
@@ -1503,18 +1503,18 @@ typedef struct {
|
|||||||
unsigned blockSizeMax;
|
unsigned blockSizeMax;
|
||||||
ZSTD_frameType_e frameType; /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */
|
ZSTD_frameType_e frameType; /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */
|
||||||
unsigned headerSize;
|
unsigned headerSize;
|
||||||
unsigned dictID;
|
unsigned dictID; /* for ZSTD_skippableFrame, contains the skippable magic variant [0-15] */
|
||||||
unsigned checksumFlag;
|
unsigned checksumFlag;
|
||||||
unsigned _reserved1;
|
unsigned _reserved1;
|
||||||
unsigned _reserved2;
|
unsigned _reserved2;
|
||||||
} ZSTD_frameHeader;
|
} ZSTD_frameHeader;
|
||||||
|
|
||||||
/*! ZSTD_getFrameHeader() :
|
/*! ZSTD_getFrameHeader() :
|
||||||
* decode Frame Header, or requires larger `srcSize`.
|
* decode Frame Header into `zfhPtr`, or requires larger `srcSize`.
|
||||||
* @return : 0, `zfhPtr` is correctly filled,
|
* @return : 0 => header is complete, `zfhPtr` is correctly filled,
|
||||||
* >0, `srcSize` is too small, @return value is the wanted `srcSize` amount,
|
* >0 => `srcSize` is too small, @return value is the wanted `srcSize` amount, `zfhPtr` is not filled,
|
||||||
* or an error code, which can be tested using ZSTD_isError() */
|
* or an error code, which can be tested using ZSTD_isError() */
|
||||||
ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize); /**< doesn't consume input */
|
ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize);
|
||||||
/*! ZSTD_getFrameHeader_advanced() :
|
/*! ZSTD_getFrameHeader_advanced() :
|
||||||
* same as ZSTD_getFrameHeader(),
|
* same as ZSTD_getFrameHeader(),
|
||||||
* with added capability to select a format (like ZSTD_f_zstd1_magicless) */
|
* with added capability to select a format (like ZSTD_f_zstd1_magicless) */
|
||||||
|
|||||||
+17
-4
@@ -4111,15 +4111,28 @@ static int basicUnitTests(U32 const seed, double compressibility)
|
|||||||
|
|
||||||
|
|
||||||
/* frame operations on skippable frames */
|
/* frame operations on skippable frames */
|
||||||
{ const char skippableFrame[] = "\x50\x2a\x4d\x18\x05\x0\x0\0abcde";
|
{ const char skippableFrame[] = "\x52\x2a\x4d\x18\x05\x0\x0\0abcde";
|
||||||
size_t const skippableFrameSize = sizeof(skippableFrame) - 1 /* remove final /0 */;
|
size_t const skippableFrameSize = sizeof(skippableFrame) - 1 /* remove the terminating /0 */;
|
||||||
|
|
||||||
DISPLAYLEVEL(3, "test%3i : ZSTD_findFrameCompressedSize on skippable frame : ", testNb++);
|
DISPLAYLEVEL(3, "test%3i : ZSTD_findFrameCompressedSize on skippable frame : ", testNb++);
|
||||||
if (ZSTD_findFrameCompressedSize(skippableFrame, skippableFrameSize) != skippableFrameSize) goto _output_error;
|
CHECK(ZSTD_findFrameCompressedSize(skippableFrame, skippableFrameSize) == skippableFrameSize);
|
||||||
DISPLAYLEVEL(3, "OK \n");
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
DISPLAYLEVEL(3, "test%3i : ZSTD_getFrameContentSize on skippable frame : ", testNb++);
|
DISPLAYLEVEL(3, "test%3i : ZSTD_getFrameContentSize on skippable frame : ", testNb++);
|
||||||
if (ZSTD_getFrameContentSize(skippableFrame, skippableFrameSize) != 0) goto _output_error;
|
CHECK(ZSTD_getFrameContentSize(skippableFrame, skippableFrameSize) == 0);
|
||||||
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
|
|
||||||
|
DISPLAYLEVEL(3, "test%3i : ZSTD_getFrameHeader on skippable frame : ", testNb++);
|
||||||
|
{ ZSTD_frameHeader zfh;
|
||||||
|
size_t const s = ZSTD_getFrameHeader(&zfh, skippableFrame, skippableFrameSize);
|
||||||
|
CHECK_Z(s);
|
||||||
|
CHECK(s == 0); /* success */
|
||||||
|
CHECK(zfh.frameType == ZSTD_skippableFrame);
|
||||||
|
CHECK(zfh.headerSize == ZSTD_SKIPPABLEHEADERSIZE);
|
||||||
|
CHECK(zfh.dictID == 2); /* magic variant */
|
||||||
|
assert(skippableFrameSize >= ZSTD_SKIPPABLEHEADERSIZE);
|
||||||
|
CHECK(zfh.frameContentSize == skippableFrameSize - ZSTD_SKIPPABLEHEADERSIZE);
|
||||||
|
}
|
||||||
DISPLAYLEVEL(3, "OK \n");
|
DISPLAYLEVEL(3, "OK \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user