added : dictID retrieval functions.
added : unit tests for dictID retrieval functions
This commit is contained in:
@@ -7,6 +7,8 @@ cli : fixed : status displays total amount decoded, even for file consisting of
|
|||||||
cli : fixed : zstdcat
|
cli : fixed : zstdcat
|
||||||
API : changed : zbuff prototypes now generate deprecation warnings
|
API : changed : zbuff prototypes now generate deprecation warnings
|
||||||
API : changed : streaming decompression implicit reset on starting new frame
|
API : changed : streaming decompression implicit reset on starting new frame
|
||||||
|
API : added experimental : dictID retrieval functions
|
||||||
|
zlib_wrapper : added support for gz* functions, by Przemyslaw Skibinski
|
||||||
Changed : reduced stack memory use
|
Changed : reduced stack memory use
|
||||||
|
|
||||||
v1.1.1
|
v1.1.1
|
||||||
|
|||||||
@@ -1778,6 +1778,45 @@ size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict)
|
|||||||
return sizeof(*ddict) + sizeof(ddict->refContext) + ddict->dictSize;
|
return sizeof(*ddict) + sizeof(ddict->refContext) + ddict->dictSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*! ZSTD_getDictID_fromDict() :
|
||||||
|
* Provides the dictID stored within dictionary.
|
||||||
|
* if @return == 0, the dictionary is not conformant with Zstandard specification.
|
||||||
|
* It can still be loaded, but as a content-only dictionary. */
|
||||||
|
unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize)
|
||||||
|
{
|
||||||
|
if (dictSize < 8) return 0;
|
||||||
|
if (MEM_readLE32(dict) != ZSTD_DICT_MAGIC) return 0;
|
||||||
|
return MEM_readLE32((const char*)dict + 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! ZSTD_getDictID_fromDDict() :
|
||||||
|
* Provides the dictID of the dictionary loaded into `ddict`.
|
||||||
|
* If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
|
||||||
|
* Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
|
||||||
|
unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict)
|
||||||
|
{
|
||||||
|
if (ddict==NULL) return 0;
|
||||||
|
return ZSTD_getDictID_fromDict(ddict->dict, ddict->dictSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*! ZSTD_getDictID_fromFrame() :
|
||||||
|
* Provides the dictID required to decompressed the frame stored within `src`.
|
||||||
|
* If @return == 0, the dictID could not be decoded.
|
||||||
|
* This could for one of the following reasons :
|
||||||
|
* - The frame does not require a dictionary to be decoded (most common case).
|
||||||
|
* - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information.
|
||||||
|
* Note : this use case also happens when using a non-conformant dictionary.
|
||||||
|
* - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).
|
||||||
|
* - This is not a Zstandard frame.
|
||||||
|
* When identifying the exact failure cause, it's possible to used ZSTD_getFrameParams(), which will provide a more precise error code. */
|
||||||
|
unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize)
|
||||||
|
{
|
||||||
|
ZSTD_frameParams zfp;
|
||||||
|
size_t const hError = ZSTD_getFrameParams(&zfp, src, srcSize);
|
||||||
|
if (ZSTD_isError(hError)) return 0;
|
||||||
|
return zfp.dictID;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*! ZSTD_decompress_usingDDict() :
|
/*! ZSTD_decompress_usingDDict() :
|
||||||
* Decompression using a pre-digested Dictionary
|
* Decompression using a pre-digested Dictionary
|
||||||
|
|||||||
+24
@@ -462,6 +462,30 @@ ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx);
|
|||||||
* Gives the amount of memory used by a given ZSTD_DDict */
|
* Gives the amount of memory used by a given ZSTD_DDict */
|
||||||
ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
|
ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
|
||||||
|
|
||||||
|
/*! ZSTD_getDictID_fromDict() :
|
||||||
|
* Provides the dictID stored within dictionary.
|
||||||
|
* if @return == 0, the dictionary is not conformant with Zstandard specification.
|
||||||
|
* It can still be loaded, but as a content-only dictionary. */
|
||||||
|
unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize);
|
||||||
|
|
||||||
|
/*! ZSTD_getDictID_fromDDict() :
|
||||||
|
* Provides the dictID of the dictionary loaded into `ddict`.
|
||||||
|
* If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
|
||||||
|
* Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
|
||||||
|
unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict);
|
||||||
|
|
||||||
|
/*! ZSTD_getDictID_fromFrame() :
|
||||||
|
* Provides the dictID required to decompressed the frame stored within `src`.
|
||||||
|
* If @return == 0, the dictID could not be decoded.
|
||||||
|
* This could for one of the following reasons :
|
||||||
|
* - The frame does not require a dictionary to be decoded (most common case).
|
||||||
|
* - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information.
|
||||||
|
* Note : this use case also happens when using a non-conformant dictionary.
|
||||||
|
* - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).
|
||||||
|
* - This is not a Zstandard frame.
|
||||||
|
* When identifying the exact failure cause, it's possible to used ZSTD_getFrameParams(), which will provide a more precise error code. */
|
||||||
|
unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
|
||||||
|
|
||||||
|
|
||||||
/********************************************************************
|
/********************************************************************
|
||||||
* Advanced streaming functions
|
* Advanced streaming functions
|
||||||
|
|||||||
+13
-1
@@ -27,7 +27,7 @@
|
|||||||
#include <time.h> /* clock_t */
|
#include <time.h> /* clock_t */
|
||||||
#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressContinue, ZSTD_compressBlock */
|
#define ZSTD_STATIC_LINKING_ONLY /* ZSTD_compressContinue, ZSTD_compressBlock */
|
||||||
#include "zstd.h" /* ZSTD_VERSION_STRING */
|
#include "zstd.h" /* ZSTD_VERSION_STRING */
|
||||||
#include "zstd_errors.h" /* ZSTD_getErrorCode */
|
#include "zstd_errors.h" /* ZSTD_getErrorCode */
|
||||||
#include "zdict.h" /* ZDICT_trainFromBuffer */
|
#include "zdict.h" /* ZDICT_trainFromBuffer */
|
||||||
#include "datagen.h" /* RDG_genBuffer */
|
#include "datagen.h" /* RDG_genBuffer */
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
@@ -273,6 +273,18 @@ static int basicUnitTests(U32 seed, double compressibility)
|
|||||||
if (ZSTD_isError(cSize)) goto _output_error;
|
if (ZSTD_isError(cSize)) goto _output_error;
|
||||||
DISPLAYLEVEL(4, "OK (%u bytes : %.2f%%)\n", (U32)cSize, (double)cSize/CNBuffSize*100);
|
DISPLAYLEVEL(4, "OK (%u bytes : %.2f%%)\n", (U32)cSize, (double)cSize/CNBuffSize*100);
|
||||||
|
|
||||||
|
DISPLAYLEVEL(4, "test%3i : retrieve dictID from dictionary : ", testNb++);
|
||||||
|
{ U32 const dictID = ZSTD_getDictID_fromDict(dictBuffer, dictSize);
|
||||||
|
if (dictID != 0) goto _output_error; /* non-conformant (content-only) dictionary */
|
||||||
|
}
|
||||||
|
DISPLAYLEVEL(4, "OK \n");
|
||||||
|
|
||||||
|
DISPLAYLEVEL(4, "test%3i : retrieve dictID from frame : ", testNb++);
|
||||||
|
{ U32 const dictID = ZSTD_getDictID_fromFrame(compressedBuffer, cSize);
|
||||||
|
if (dictID != 0) goto _output_error; /* non-conformant (content-only) dictionary */
|
||||||
|
}
|
||||||
|
DISPLAYLEVEL(4, "OK \n");
|
||||||
|
|
||||||
DISPLAYLEVEL(4, "test%3i : frame built with dictionary should be decompressible : ", testNb++);
|
DISPLAYLEVEL(4, "test%3i : frame built with dictionary should be decompressible : ", testNb++);
|
||||||
CHECKPLUS(r, ZSTD_decompress_usingDict(dctx,
|
CHECKPLUS(r, ZSTD_decompress_usingDict(dctx,
|
||||||
decodedBuffer, CNBuffSize,
|
decodedBuffer, CNBuffSize,
|
||||||
|
|||||||
Reference in New Issue
Block a user