feat(compress): move advanced API policy into Rust

Move ZSTD_compress_advanced parameter validation and init-before-compress
orchestration into Rust. Keep simpleApiParams initialization and the private
advanced compression operation behind C callbacks.

Test Plan:
- cargo test --manifest-path rust/Cargo.toml --lib
- cargo clippy --manifest-path rust/Cargo.toml --all-targets -- -D warnings
- make -B -C programs -j1 zstd
- make -C tests -j1 test-zstream ZSTREAM_TESTTIME=-T1s
- focused compress_advanced unit tests
This commit is contained in:
2026-07-19 15:35:14 +02:00
parent 4f6a3a5749
commit 50e7addbc6
2 changed files with 269 additions and 10 deletions
+57 -8
View File
@@ -374,6 +374,31 @@ typedef char ZSTD_rust_copy_cctx_state_layout[
== 5 * sizeof(void*)
&& sizeof(ZSTD_rust_copyCCtxState) == 6 * sizeof(void*))
? 1 : -1];
typedef void (*ZSTD_rust_compressAdvancedInitParams_f)(
void* context, const ZSTD_parameters* params);
typedef size_t (*ZSTD_rust_compressAdvancedInternal_f)(
void* context, void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
const void* dict, size_t dictSize);
typedef struct {
void* callbackContext;
ZSTD_rust_compressAdvancedInitParams_f initParams;
ZSTD_rust_compressAdvancedInternal_f compressInternal;
} ZSTD_rust_compressAdvancedState;
size_t ZSTD_rust_compressAdvanced(
const ZSTD_rust_compressAdvancedState* state,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
const void* dict, size_t dictSize,
const ZSTD_parameters* params);
typedef char ZSTD_rust_compress_advanced_state_layout[
(offsetof(ZSTD_rust_compressAdvancedState, callbackContext) == 0
&& offsetof(ZSTD_rust_compressAdvancedState, initParams)
== sizeof(void*)
&& offsetof(ZSTD_rust_compressAdvancedState, compressInternal)
== 2 * sizeof(void*)
&& sizeof(ZSTD_rust_compressAdvancedState) == 3 * sizeof(void*))
? 1 : -1];
ZSTD_frameProgression ZSTD_rust_frameProgression(U64 consumedSrcSize,
size_t buffered,
U64 producedCSize);
@@ -4869,20 +4894,26 @@ size_t ZSTD_compressEnd(ZSTD_CCtx* cctx,
return ZSTD_compressEnd_public(cctx, dst, dstCapacity, src, srcSize);
}
static void ZSTD_rust_compressAdvanced_initParams(
void* context, const ZSTD_parameters* params);
static size_t ZSTD_rust_compressAdvanced_compressInternal(
void* context, void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
const void* dict, size_t dictSize);
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,
const void* dict,size_t dictSize,
ZSTD_parameters params)
{
ZSTD_rust_compressAdvancedState state;
DEBUGLOG(4, "ZSTD_compress_advanced");
FORWARD_IF_ERROR(ZSTD_checkCParams(params.cParams), "");
ZSTD_CCtxParams_init_internal(&cctx->simpleApiParams, &params, ZSTD_NO_CLEVEL);
return ZSTD_compress_advanced_internal(cctx,
dst, dstCapacity,
src, srcSize,
dict, dictSize,
&cctx->simpleApiParams);
state.callbackContext = cctx;
state.initParams = ZSTD_rust_compressAdvanced_initParams;
state.compressInternal = ZSTD_rust_compressAdvanced_compressInternal;
return ZSTD_rust_compressAdvanced(
&state, dst, dstCapacity, src, srcSize, dict, dictSize, &params);
}
/* Internal */
@@ -4900,6 +4931,24 @@ size_t ZSTD_compress_advanced_internal(
return ZSTD_compressEnd_public(cctx, dst, dstCapacity, src, srcSize);
}
static void ZSTD_rust_compressAdvanced_initParams(
void* context, const ZSTD_parameters* params)
{
ZSTD_CCtxParams_init_internal(
&((ZSTD_CCtx*)context)->simpleApiParams, params, ZSTD_NO_CLEVEL);
}
static size_t ZSTD_rust_compressAdvanced_compressInternal(
void* context, void* dst, size_t dstCapacity,
const void* src, size_t srcSize,
const void* dict, size_t dictSize)
{
ZSTD_CCtx* const cctx = (ZSTD_CCtx*)context;
return ZSTD_compress_advanced_internal(
cctx, dst, dstCapacity, src, srcSize, dict, dictSize,
&cctx->simpleApiParams);
}
size_t ZSTD_compress_usingDict(ZSTD_CCtx* cctx,
void* dst, size_t dstCapacity,
const void* src, size_t srcSize,