Skip to content

Commit

Permalink
New xp library symbol : ZSTD_CCtx_setCParams()
Browse files Browse the repository at this point in the history
Inspired by #3395,
offer a new capability to set all parameters defined in a ZSTD_compressionParameters structure
with a single symbol invocation
to improve user code brevity.
  • Loading branch information
Cyan4973 committed Dec 28, 2022
1 parent 90597d7 commit 89342d1
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 12 deletions.
19 changes: 15 additions & 4 deletions lib/compress/zstd_compress.c
Original file line number Diff line number Diff line change
Expand Up @@ -346,10 +346,13 @@ size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel)
#define ZSTD_NO_CLEVEL 0

/**
* Initializes the cctxParams from params and compressionLevel.
* Initializes `cctxParams` from `params` and `compressionLevel`.
* @param compressionLevel If params are derived from a compression level then that compression level, otherwise ZSTD_NO_CLEVEL.
*/
static void ZSTD_CCtxParams_init_internal(ZSTD_CCtx_params* cctxParams, ZSTD_parameters const* params, int compressionLevel)
static void
ZSTD_CCtxParams_init_internal(ZSTD_CCtx_params* cctxParams,
const ZSTD_parameters* params,
int compressionLevel)
{
assert(!ZSTD_checkCParams(params->cParams));
ZSTD_memset(cctxParams, 0, sizeof(*cctxParams));
Expand Down Expand Up @@ -796,14 +799,14 @@ size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* CCtxParams,

case ZSTD_c_forceAttachDict : {
const ZSTD_dictAttachPref_e pref = (ZSTD_dictAttachPref_e)value;
BOUNDCHECK(ZSTD_c_forceAttachDict, pref);
BOUNDCHECK(ZSTD_c_forceAttachDict, (int)pref);
CCtxParams->attachDictPref = pref;
return CCtxParams->attachDictPref;
}

case ZSTD_c_literalCompressionMode : {
const ZSTD_paramSwitch_e lcm = (ZSTD_paramSwitch_e)value;
BOUNDCHECK(ZSTD_c_literalCompressionMode, lcm);
BOUNDCHECK(ZSTD_c_literalCompressionMode, (int)lcm);
CCtxParams->literalCompressionMode = lcm;
return CCtxParams->literalCompressionMode;
}
Expand Down Expand Up @@ -1098,6 +1101,14 @@ size_t ZSTD_CCtx_setParametersUsingCCtxParams(
return 0;
}

size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams)
{
FORWARD_IF_ERROR(ZSTD_checkCParams(cparams), "");
assert(cctx != NULL);
cctx->requestedParams.cParams = cparams;
return 0;
}

size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize)
{
DEBUGLOG(4, "ZSTD_CCtx_setPledgedSrcSize to %llu bytes", pledgedSrcSize);
Expand Down
13 changes: 9 additions & 4 deletions lib/zstd.h
Original file line number Diff line number Diff line change
Expand Up @@ -1740,17 +1740,22 @@ ZSTDLIB_STATIC_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params);
* This function never fails (wide contract) */
ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize);

/*! ZSTD_CCtx_setCParams() :
* Set all parameters provided within @cparams into the working @cctx
* @return 0 on success, or an error code (can be checked with ZSTD_isError()) */
ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams);

/*! ZSTD_compress_advanced() :
* Note : this function is now DEPRECATED.
* It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters.
* This prototype will generate compilation warnings. */
ZSTD_DEPRECATED("use ZSTD_compress2")
ZSTDLIB_STATIC_API
size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
const void* dict,size_t dictSize,
ZSTD_parameters params);
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
const void* dict,size_t dictSize,
ZSTD_parameters params);

/*! ZSTD_compress_usingCDict_advanced() :
* Note : this function is now DEPRECATED.
Expand Down
30 changes: 26 additions & 4 deletions tests/fuzzer.c
Original file line number Diff line number Diff line change
Expand Up @@ -463,9 +463,9 @@ static int threadPoolTests(void) {
* Unit tests
=============================================*/

static void test_compressBound(int tnb)
static void test_compressBound(unsigned tnb)
{
DISPLAYLEVEL(3, "test%3i : compressBound : ", tnb);
DISPLAYLEVEL(3, "test%3u : compressBound : ", tnb);

/* check ZSTD_compressBound == ZSTD_COMPRESSBOUND
* for a large range of known valid values */
Expand All @@ -485,9 +485,9 @@ static void test_compressBound(int tnb)
DISPLAYLEVEL(3, "OK \n");
}

static void test_decompressBound(int tnb)
static void test_decompressBound(unsigned tnb)
{
DISPLAYLEVEL(3, "test%3i : decompressBound : ", tnb);
DISPLAYLEVEL(3, "test%3u : decompressBound : ", tnb);

// Simple compression, with size : should provide size;
{ const char example[] = "abcd";
Expand Down Expand Up @@ -538,6 +538,26 @@ static void test_decompressBound(int tnb)
DISPLAYLEVEL(3, "OK \n");
}

static void test_setCParams(unsigned tnb)
{
ZSTD_CCtx* const cctx = ZSTD_createCCtx();
ZSTD_compressionParameters cparams;
assert(cctx);

DISPLAYLEVEL(3, "test%3u : ZSTD_CCtx_setCParams : ", tnb);

/* valid cparams */
cparams = ZSTD_getCParams(1, 0, 0);
CHECK_Z(ZSTD_CCtx_setCParams(cctx, cparams));

/* invalid cparams (must fail) */
cparams.windowLog = 99;
CHECK(ZSTD_isError(ZSTD_CCtx_setCParams(cctx, cparams)));

free(cctx);
DISPLAYLEVEL(3, "OK \n");
}

static int basicUnitTests(U32 const seed, double compressibility)
{
size_t const CNBuffSize = 5 MB;
Expand Down Expand Up @@ -588,6 +608,8 @@ static int basicUnitTests(U32 const seed, double compressibility)

test_decompressBound(testNb++);

test_setCParams(testNb++);

DISPLAYLEVEL(3, "test%3u : ZSTD_adjustCParams : ", testNb++);
{
ZSTD_compressionParameters params;
Expand Down

0 comments on commit 89342d1

Please sign in to comment.