1*01826a49SYabin Cui /*
2*01826a49SYabin Cui * Copyright (c) Meta Platforms, Inc. and affiliates.
3*01826a49SYabin Cui * All rights reserved.
4*01826a49SYabin Cui *
5*01826a49SYabin Cui * This source code is licensed under both the BSD-style license (found in the
6*01826a49SYabin Cui * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*01826a49SYabin Cui * in the COPYING file in the root directory of this source tree).
8*01826a49SYabin Cui * You may select, at your option, one of the above-listed licenses.
9*01826a49SYabin Cui */
10*01826a49SYabin Cui
11*01826a49SYabin Cui #include "config.h"
12*01826a49SYabin Cui
13*01826a49SYabin Cui /* Define a config for each fast level we want to test with. */
14*01826a49SYabin Cui #define FAST_LEVEL(x) \
15*01826a49SYabin Cui param_value_t const level_fast##x##_param_values[] = { \
16*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = -x}, \
17*01826a49SYabin Cui }; \
18*01826a49SYabin Cui config_t const level_fast##x = { \
19*01826a49SYabin Cui .name = "level -" #x, \
20*01826a49SYabin Cui .cli_args = "--fast=" #x, \
21*01826a49SYabin Cui .param_values = PARAM_VALUES(level_fast##x##_param_values), \
22*01826a49SYabin Cui }; \
23*01826a49SYabin Cui config_t const level_fast##x##_dict = { \
24*01826a49SYabin Cui .name = "level -" #x " with dict", \
25*01826a49SYabin Cui .cli_args = "--fast=" #x, \
26*01826a49SYabin Cui .param_values = PARAM_VALUES(level_fast##x##_param_values), \
27*01826a49SYabin Cui .use_dictionary = 1, \
28*01826a49SYabin Cui };
29*01826a49SYabin Cui
30*01826a49SYabin Cui /* Define a config for each level we want to test with. */
31*01826a49SYabin Cui #define LEVEL(x) \
32*01826a49SYabin Cui param_value_t const level_##x##_param_values[] = { \
33*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = x}, \
34*01826a49SYabin Cui }; \
35*01826a49SYabin Cui param_value_t const level_##x##_param_values_dms[] = { \
36*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = x}, \
37*01826a49SYabin Cui {.param = ZSTD_c_enableDedicatedDictSearch, .value = 0}, \
38*01826a49SYabin Cui {.param = ZSTD_c_forceAttachDict, .value = ZSTD_dictForceAttach}, \
39*01826a49SYabin Cui }; \
40*01826a49SYabin Cui param_value_t const level_##x##_param_values_dds[] = { \
41*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = x}, \
42*01826a49SYabin Cui {.param = ZSTD_c_enableDedicatedDictSearch, .value = 1}, \
43*01826a49SYabin Cui {.param = ZSTD_c_forceAttachDict, .value = ZSTD_dictForceAttach}, \
44*01826a49SYabin Cui }; \
45*01826a49SYabin Cui param_value_t const level_##x##_param_values_dictcopy[] = { \
46*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = x}, \
47*01826a49SYabin Cui {.param = ZSTD_c_enableDedicatedDictSearch, .value = 0}, \
48*01826a49SYabin Cui {.param = ZSTD_c_forceAttachDict, .value = ZSTD_dictForceCopy}, \
49*01826a49SYabin Cui }; \
50*01826a49SYabin Cui param_value_t const level_##x##_param_values_dictload[] = { \
51*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = x}, \
52*01826a49SYabin Cui {.param = ZSTD_c_enableDedicatedDictSearch, .value = 0}, \
53*01826a49SYabin Cui {.param = ZSTD_c_forceAttachDict, .value = ZSTD_dictForceLoad}, \
54*01826a49SYabin Cui }; \
55*01826a49SYabin Cui config_t const level_##x = { \
56*01826a49SYabin Cui .name = "level " #x, \
57*01826a49SYabin Cui .cli_args = "-" #x, \
58*01826a49SYabin Cui .param_values = PARAM_VALUES(level_##x##_param_values), \
59*01826a49SYabin Cui }; \
60*01826a49SYabin Cui config_t const level_##x##_dict = { \
61*01826a49SYabin Cui .name = "level " #x " with dict", \
62*01826a49SYabin Cui .cli_args = "-" #x, \
63*01826a49SYabin Cui .param_values = PARAM_VALUES(level_##x##_param_values), \
64*01826a49SYabin Cui .use_dictionary = 1, \
65*01826a49SYabin Cui }; \
66*01826a49SYabin Cui config_t const level_##x##_dict_dms = { \
67*01826a49SYabin Cui .name = "level " #x " with dict dms", \
68*01826a49SYabin Cui .cli_args = "-" #x, \
69*01826a49SYabin Cui .param_values = PARAM_VALUES(level_##x##_param_values_dms), \
70*01826a49SYabin Cui .use_dictionary = 1, \
71*01826a49SYabin Cui .advanced_api_only = 1, \
72*01826a49SYabin Cui }; \
73*01826a49SYabin Cui config_t const level_##x##_dict_dds = { \
74*01826a49SYabin Cui .name = "level " #x " with dict dds", \
75*01826a49SYabin Cui .cli_args = "-" #x, \
76*01826a49SYabin Cui .param_values = PARAM_VALUES(level_##x##_param_values_dds), \
77*01826a49SYabin Cui .use_dictionary = 1, \
78*01826a49SYabin Cui .advanced_api_only = 1, \
79*01826a49SYabin Cui }; \
80*01826a49SYabin Cui config_t const level_##x##_dict_copy = { \
81*01826a49SYabin Cui .name = "level " #x " with dict copy", \
82*01826a49SYabin Cui .cli_args = "-" #x, \
83*01826a49SYabin Cui .param_values = PARAM_VALUES(level_##x##_param_values_dictcopy), \
84*01826a49SYabin Cui .use_dictionary = 1, \
85*01826a49SYabin Cui .advanced_api_only = 1, \
86*01826a49SYabin Cui }; \
87*01826a49SYabin Cui config_t const level_##x##_dict_load = { \
88*01826a49SYabin Cui .name = "level " #x " with dict load", \
89*01826a49SYabin Cui .cli_args = "-" #x, \
90*01826a49SYabin Cui .param_values = PARAM_VALUES(level_##x##_param_values_dictload), \
91*01826a49SYabin Cui .use_dictionary = 1, \
92*01826a49SYabin Cui .advanced_api_only = 1, \
93*01826a49SYabin Cui };
94*01826a49SYabin Cui
95*01826a49SYabin Cui /* Define a config specifically to test row hash based levels and settings.
96*01826a49SYabin Cui */
97*01826a49SYabin Cui #define ROW_LEVEL(x, y) \
98*01826a49SYabin Cui param_value_t const row_##y##_level_##x##_param_values[] = { \
99*01826a49SYabin Cui {.param = ZSTD_c_useRowMatchFinder, .value = y}, \
100*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = x}, \
101*01826a49SYabin Cui }; \
102*01826a49SYabin Cui param_value_t const row_##y##_level_##x##_param_values_dms[] = { \
103*01826a49SYabin Cui {.param = ZSTD_c_useRowMatchFinder, .value = y}, \
104*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = x}, \
105*01826a49SYabin Cui {.param = ZSTD_c_enableDedicatedDictSearch, .value = 0}, \
106*01826a49SYabin Cui {.param = ZSTD_c_forceAttachDict, .value = ZSTD_dictForceAttach}, \
107*01826a49SYabin Cui }; \
108*01826a49SYabin Cui param_value_t const row_##y##_level_##x##_param_values_dds[] = { \
109*01826a49SYabin Cui {.param = ZSTD_c_useRowMatchFinder, .value = y}, \
110*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = x}, \
111*01826a49SYabin Cui {.param = ZSTD_c_enableDedicatedDictSearch, .value = 1}, \
112*01826a49SYabin Cui {.param = ZSTD_c_forceAttachDict, .value = ZSTD_dictForceAttach}, \
113*01826a49SYabin Cui }; \
114*01826a49SYabin Cui param_value_t const row_##y##_level_##x##_param_values_dictcopy[] = { \
115*01826a49SYabin Cui {.param = ZSTD_c_useRowMatchFinder, .value = y}, \
116*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = x}, \
117*01826a49SYabin Cui {.param = ZSTD_c_enableDedicatedDictSearch, .value = 0}, \
118*01826a49SYabin Cui {.param = ZSTD_c_forceAttachDict, .value = ZSTD_dictForceCopy}, \
119*01826a49SYabin Cui }; \
120*01826a49SYabin Cui param_value_t const row_##y##_level_##x##_param_values_dictload[] = { \
121*01826a49SYabin Cui {.param = ZSTD_c_useRowMatchFinder, .value = y}, \
122*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = x}, \
123*01826a49SYabin Cui {.param = ZSTD_c_enableDedicatedDictSearch, .value = 0}, \
124*01826a49SYabin Cui {.param = ZSTD_c_forceAttachDict, .value = ZSTD_dictForceLoad}, \
125*01826a49SYabin Cui }; \
126*01826a49SYabin Cui config_t const row_##y##_level_##x = { \
127*01826a49SYabin Cui .name = "level " #x " row " #y, \
128*01826a49SYabin Cui .cli_args = "-" #x, \
129*01826a49SYabin Cui .param_values = PARAM_VALUES(row_##y##_level_##x##_param_values), \
130*01826a49SYabin Cui .advanced_api_only = 1, \
131*01826a49SYabin Cui }; \
132*01826a49SYabin Cui config_t const row_##y##_level_##x##_dict_dms = { \
133*01826a49SYabin Cui .name = "level " #x " row " #y " with dict dms", \
134*01826a49SYabin Cui .cli_args = "-" #x, \
135*01826a49SYabin Cui .param_values = PARAM_VALUES(row_##y##_level_##x##_param_values_dms), \
136*01826a49SYabin Cui .use_dictionary = 1, \
137*01826a49SYabin Cui .advanced_api_only = 1, \
138*01826a49SYabin Cui }; \
139*01826a49SYabin Cui config_t const row_##y##_level_##x##_dict_dds = { \
140*01826a49SYabin Cui .name = "level " #x " row " #y " with dict dds", \
141*01826a49SYabin Cui .cli_args = "-" #x, \
142*01826a49SYabin Cui .param_values = PARAM_VALUES(row_##y##_level_##x##_param_values_dds), \
143*01826a49SYabin Cui .use_dictionary = 1, \
144*01826a49SYabin Cui .advanced_api_only = 1, \
145*01826a49SYabin Cui }; \
146*01826a49SYabin Cui config_t const row_##y##_level_##x##_dict_copy = { \
147*01826a49SYabin Cui .name = "level " #x " row " #y" with dict copy", \
148*01826a49SYabin Cui .cli_args = "-" #x, \
149*01826a49SYabin Cui .param_values = PARAM_VALUES(row_##y##_level_##x##_param_values_dictcopy), \
150*01826a49SYabin Cui .use_dictionary = 1, \
151*01826a49SYabin Cui .advanced_api_only = 1, \
152*01826a49SYabin Cui }; \
153*01826a49SYabin Cui config_t const row_##y##_level_##x##_dict_load = { \
154*01826a49SYabin Cui .name = "level " #x " row " #y " with dict load", \
155*01826a49SYabin Cui .cli_args = "-" #x, \
156*01826a49SYabin Cui .param_values = PARAM_VALUES(row_##y##_level_##x##_param_values_dictload), \
157*01826a49SYabin Cui .use_dictionary = 1, \
158*01826a49SYabin Cui .advanced_api_only = 1, \
159*01826a49SYabin Cui };
160*01826a49SYabin Cui
161*01826a49SYabin Cui #define PARAM_VALUES(pv) \
162*01826a49SYabin Cui { .data = pv, .size = sizeof(pv) / sizeof((pv)[0]) }
163*01826a49SYabin Cui
164*01826a49SYabin Cui #include "levels.h"
165*01826a49SYabin Cui
166*01826a49SYabin Cui #undef LEVEL
167*01826a49SYabin Cui #undef FAST_LEVEL
168*01826a49SYabin Cui #undef ROW_LEVEL
169*01826a49SYabin Cui
170*01826a49SYabin Cui static config_t no_pledged_src_size = {
171*01826a49SYabin Cui .name = "no source size",
172*01826a49SYabin Cui .cli_args = "",
173*01826a49SYabin Cui .param_values = PARAM_VALUES(level_0_param_values),
174*01826a49SYabin Cui .no_pledged_src_size = 1,
175*01826a49SYabin Cui };
176*01826a49SYabin Cui
177*01826a49SYabin Cui static config_t no_pledged_src_size_with_dict = {
178*01826a49SYabin Cui .name = "no source size with dict",
179*01826a49SYabin Cui .cli_args = "",
180*01826a49SYabin Cui .param_values = PARAM_VALUES(level_0_param_values),
181*01826a49SYabin Cui .no_pledged_src_size = 1,
182*01826a49SYabin Cui .use_dictionary = 1,
183*01826a49SYabin Cui };
184*01826a49SYabin Cui
185*01826a49SYabin Cui static param_value_t const ldm_param_values[] = {
186*01826a49SYabin Cui {.param = ZSTD_c_enableLongDistanceMatching, .value = ZSTD_ps_enable},
187*01826a49SYabin Cui };
188*01826a49SYabin Cui
189*01826a49SYabin Cui static config_t ldm = {
190*01826a49SYabin Cui .name = "long distance mode",
191*01826a49SYabin Cui .cli_args = "--long",
192*01826a49SYabin Cui .param_values = PARAM_VALUES(ldm_param_values),
193*01826a49SYabin Cui };
194*01826a49SYabin Cui
195*01826a49SYabin Cui static param_value_t const mt_param_values[] = {
196*01826a49SYabin Cui {.param = ZSTD_c_nbWorkers, .value = 2},
197*01826a49SYabin Cui };
198*01826a49SYabin Cui
199*01826a49SYabin Cui static config_t mt = {
200*01826a49SYabin Cui .name = "multithreaded",
201*01826a49SYabin Cui .cli_args = "-T2",
202*01826a49SYabin Cui .param_values = PARAM_VALUES(mt_param_values),
203*01826a49SYabin Cui };
204*01826a49SYabin Cui
205*01826a49SYabin Cui static param_value_t const mt_ldm_param_values[] = {
206*01826a49SYabin Cui {.param = ZSTD_c_nbWorkers, .value = 2},
207*01826a49SYabin Cui {.param = ZSTD_c_enableLongDistanceMatching, .value = ZSTD_ps_enable},
208*01826a49SYabin Cui };
209*01826a49SYabin Cui
210*01826a49SYabin Cui static config_t mt_ldm = {
211*01826a49SYabin Cui .name = "multithreaded long distance mode",
212*01826a49SYabin Cui .cli_args = "-T2 --long",
213*01826a49SYabin Cui .param_values = PARAM_VALUES(mt_ldm_param_values),
214*01826a49SYabin Cui };
215*01826a49SYabin Cui
216*01826a49SYabin Cui static param_value_t mt_advanced_param_values[] = {
217*01826a49SYabin Cui {.param = ZSTD_c_nbWorkers, .value = 2},
218*01826a49SYabin Cui {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_ps_disable},
219*01826a49SYabin Cui };
220*01826a49SYabin Cui
221*01826a49SYabin Cui static config_t mt_advanced = {
222*01826a49SYabin Cui .name = "multithreaded with advanced params",
223*01826a49SYabin Cui .cli_args = "-T2 --no-compress-literals",
224*01826a49SYabin Cui .param_values = PARAM_VALUES(mt_advanced_param_values),
225*01826a49SYabin Cui };
226*01826a49SYabin Cui
227*01826a49SYabin Cui static param_value_t const small_wlog_param_values[] = {
228*01826a49SYabin Cui {.param = ZSTD_c_windowLog, .value = 10},
229*01826a49SYabin Cui };
230*01826a49SYabin Cui
231*01826a49SYabin Cui static config_t small_wlog = {
232*01826a49SYabin Cui .name = "small window log",
233*01826a49SYabin Cui .cli_args = "--zstd=wlog=10",
234*01826a49SYabin Cui .param_values = PARAM_VALUES(small_wlog_param_values),
235*01826a49SYabin Cui };
236*01826a49SYabin Cui
237*01826a49SYabin Cui static param_value_t const small_hlog_param_values[] = {
238*01826a49SYabin Cui {.param = ZSTD_c_hashLog, .value = 6},
239*01826a49SYabin Cui {.param = ZSTD_c_strategy, .value = (int)ZSTD_btopt},
240*01826a49SYabin Cui };
241*01826a49SYabin Cui
242*01826a49SYabin Cui static config_t small_hlog = {
243*01826a49SYabin Cui .name = "small hash log",
244*01826a49SYabin Cui .cli_args = "--zstd=hlog=6,strat=7",
245*01826a49SYabin Cui .param_values = PARAM_VALUES(small_hlog_param_values),
246*01826a49SYabin Cui };
247*01826a49SYabin Cui
248*01826a49SYabin Cui static param_value_t const small_clog_param_values[] = {
249*01826a49SYabin Cui {.param = ZSTD_c_chainLog, .value = 6},
250*01826a49SYabin Cui {.param = ZSTD_c_strategy, .value = (int)ZSTD_btopt},
251*01826a49SYabin Cui };
252*01826a49SYabin Cui
253*01826a49SYabin Cui static config_t small_clog = {
254*01826a49SYabin Cui .name = "small chain log",
255*01826a49SYabin Cui .cli_args = "--zstd=clog=6,strat=7",
256*01826a49SYabin Cui .param_values = PARAM_VALUES(small_clog_param_values),
257*01826a49SYabin Cui };
258*01826a49SYabin Cui
259*01826a49SYabin Cui static param_value_t const uncompressed_literals_param_values[] = {
260*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = 3},
261*01826a49SYabin Cui {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_ps_disable},
262*01826a49SYabin Cui };
263*01826a49SYabin Cui
264*01826a49SYabin Cui static config_t uncompressed_literals = {
265*01826a49SYabin Cui .name = "uncompressed literals",
266*01826a49SYabin Cui .cli_args = "-3 --no-compress-literals",
267*01826a49SYabin Cui .param_values = PARAM_VALUES(uncompressed_literals_param_values),
268*01826a49SYabin Cui };
269*01826a49SYabin Cui
270*01826a49SYabin Cui static param_value_t const uncompressed_literals_opt_param_values[] = {
271*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = 19},
272*01826a49SYabin Cui {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_ps_disable},
273*01826a49SYabin Cui };
274*01826a49SYabin Cui
275*01826a49SYabin Cui static config_t uncompressed_literals_opt = {
276*01826a49SYabin Cui .name = "uncompressed literals optimal",
277*01826a49SYabin Cui .cli_args = "-19 --no-compress-literals",
278*01826a49SYabin Cui .param_values = PARAM_VALUES(uncompressed_literals_opt_param_values),
279*01826a49SYabin Cui };
280*01826a49SYabin Cui
281*01826a49SYabin Cui static param_value_t const huffman_literals_param_values[] = {
282*01826a49SYabin Cui {.param = ZSTD_c_compressionLevel, .value = -1},
283*01826a49SYabin Cui {.param = ZSTD_c_literalCompressionMode, .value = ZSTD_ps_enable},
284*01826a49SYabin Cui };
285*01826a49SYabin Cui
286*01826a49SYabin Cui static config_t huffman_literals = {
287*01826a49SYabin Cui .name = "huffman literals",
288*01826a49SYabin Cui .cli_args = "--fast=1 --compress-literals",
289*01826a49SYabin Cui .param_values = PARAM_VALUES(huffman_literals_param_values),
290*01826a49SYabin Cui };
291*01826a49SYabin Cui
292*01826a49SYabin Cui static param_value_t const explicit_params_param_values[] = {
293*01826a49SYabin Cui {.param = ZSTD_c_checksumFlag, .value = 1},
294*01826a49SYabin Cui {.param = ZSTD_c_contentSizeFlag, .value = 0},
295*01826a49SYabin Cui {.param = ZSTD_c_dictIDFlag, .value = 0},
296*01826a49SYabin Cui {.param = ZSTD_c_strategy, .value = (int)ZSTD_greedy},
297*01826a49SYabin Cui {.param = ZSTD_c_windowLog, .value = 18},
298*01826a49SYabin Cui {.param = ZSTD_c_hashLog, .value = 21},
299*01826a49SYabin Cui {.param = ZSTD_c_chainLog, .value = 21},
300*01826a49SYabin Cui {.param = ZSTD_c_targetLength, .value = 100},
301*01826a49SYabin Cui };
302*01826a49SYabin Cui
303*01826a49SYabin Cui static config_t explicit_params = {
304*01826a49SYabin Cui .name = "explicit params",
305*01826a49SYabin Cui .cli_args = "--no-check --no-dictID --zstd=strategy=3,wlog=18,hlog=21,clog=21,tlen=100",
306*01826a49SYabin Cui .param_values = PARAM_VALUES(explicit_params_param_values),
307*01826a49SYabin Cui };
308*01826a49SYabin Cui
309*01826a49SYabin Cui static config_t const* g_configs[] = {
310*01826a49SYabin Cui
311*01826a49SYabin Cui #define FAST_LEVEL(x) &level_fast##x, &level_fast##x##_dict,
312*01826a49SYabin Cui #define LEVEL(x) &level_##x, &level_##x##_dict, &level_##x##_dict_dms, &level_##x##_dict_dds, &level_##x##_dict_copy, &level_##x##_dict_load,
313*01826a49SYabin Cui #define ROW_LEVEL(x, y) &row_##y##_level_##x, &row_##y##_level_##x##_dict_dms, &row_##y##_level_##x##_dict_dds, &row_##y##_level_##x##_dict_copy, &row_##y##_level_##x##_dict_load,
314*01826a49SYabin Cui #include "levels.h"
315*01826a49SYabin Cui #undef ROW_LEVEL
316*01826a49SYabin Cui #undef LEVEL
317*01826a49SYabin Cui #undef FAST_LEVEL
318*01826a49SYabin Cui
319*01826a49SYabin Cui &no_pledged_src_size,
320*01826a49SYabin Cui &no_pledged_src_size_with_dict,
321*01826a49SYabin Cui &ldm,
322*01826a49SYabin Cui &mt,
323*01826a49SYabin Cui &mt_ldm,
324*01826a49SYabin Cui &small_wlog,
325*01826a49SYabin Cui &small_hlog,
326*01826a49SYabin Cui &small_clog,
327*01826a49SYabin Cui &explicit_params,
328*01826a49SYabin Cui &uncompressed_literals,
329*01826a49SYabin Cui &uncompressed_literals_opt,
330*01826a49SYabin Cui &huffman_literals,
331*01826a49SYabin Cui &mt_advanced,
332*01826a49SYabin Cui NULL,
333*01826a49SYabin Cui };
334*01826a49SYabin Cui
335*01826a49SYabin Cui config_t const* const* configs = g_configs;
336*01826a49SYabin Cui
config_skip_data(config_t const * config,data_t const * data)337*01826a49SYabin Cui int config_skip_data(config_t const* config, data_t const* data) {
338*01826a49SYabin Cui return config->use_dictionary && !data_has_dict(data);
339*01826a49SYabin Cui }
340*01826a49SYabin Cui
config_get_level(config_t const * config)341*01826a49SYabin Cui int config_get_level(config_t const* config)
342*01826a49SYabin Cui {
343*01826a49SYabin Cui param_values_t const params = config->param_values;
344*01826a49SYabin Cui size_t i;
345*01826a49SYabin Cui for (i = 0; i < params.size; ++i) {
346*01826a49SYabin Cui if (params.data[i].param == ZSTD_c_compressionLevel)
347*01826a49SYabin Cui return (int)params.data[i].value;
348*01826a49SYabin Cui }
349*01826a49SYabin Cui return CONFIG_NO_LEVEL;
350*01826a49SYabin Cui }
351*01826a49SYabin Cui
config_get_zstd_params(config_t const * config,uint64_t srcSize,size_t dictSize)352*01826a49SYabin Cui ZSTD_parameters config_get_zstd_params(
353*01826a49SYabin Cui config_t const* config,
354*01826a49SYabin Cui uint64_t srcSize,
355*01826a49SYabin Cui size_t dictSize)
356*01826a49SYabin Cui {
357*01826a49SYabin Cui ZSTD_parameters zparams = {};
358*01826a49SYabin Cui param_values_t const params = config->param_values;
359*01826a49SYabin Cui int level = config_get_level(config);
360*01826a49SYabin Cui if (level == CONFIG_NO_LEVEL)
361*01826a49SYabin Cui level = 3;
362*01826a49SYabin Cui zparams = ZSTD_getParams(
363*01826a49SYabin Cui level,
364*01826a49SYabin Cui config->no_pledged_src_size ? ZSTD_CONTENTSIZE_UNKNOWN : srcSize,
365*01826a49SYabin Cui dictSize);
366*01826a49SYabin Cui for (size_t i = 0; i < params.size; ++i) {
367*01826a49SYabin Cui unsigned const value = params.data[i].value;
368*01826a49SYabin Cui switch (params.data[i].param) {
369*01826a49SYabin Cui case ZSTD_c_contentSizeFlag:
370*01826a49SYabin Cui zparams.fParams.contentSizeFlag = value;
371*01826a49SYabin Cui break;
372*01826a49SYabin Cui case ZSTD_c_checksumFlag:
373*01826a49SYabin Cui zparams.fParams.checksumFlag = value;
374*01826a49SYabin Cui break;
375*01826a49SYabin Cui case ZSTD_c_dictIDFlag:
376*01826a49SYabin Cui zparams.fParams.noDictIDFlag = !value;
377*01826a49SYabin Cui break;
378*01826a49SYabin Cui case ZSTD_c_windowLog:
379*01826a49SYabin Cui zparams.cParams.windowLog = value;
380*01826a49SYabin Cui break;
381*01826a49SYabin Cui case ZSTD_c_chainLog:
382*01826a49SYabin Cui zparams.cParams.chainLog = value;
383*01826a49SYabin Cui break;
384*01826a49SYabin Cui case ZSTD_c_hashLog:
385*01826a49SYabin Cui zparams.cParams.hashLog = value;
386*01826a49SYabin Cui break;
387*01826a49SYabin Cui case ZSTD_c_searchLog:
388*01826a49SYabin Cui zparams.cParams.searchLog = value;
389*01826a49SYabin Cui break;
390*01826a49SYabin Cui case ZSTD_c_minMatch:
391*01826a49SYabin Cui zparams.cParams.minMatch = value;
392*01826a49SYabin Cui break;
393*01826a49SYabin Cui case ZSTD_c_targetLength:
394*01826a49SYabin Cui zparams.cParams.targetLength = value;
395*01826a49SYabin Cui break;
396*01826a49SYabin Cui case ZSTD_c_strategy:
397*01826a49SYabin Cui zparams.cParams.strategy = (ZSTD_strategy)value;
398*01826a49SYabin Cui break;
399*01826a49SYabin Cui default:
400*01826a49SYabin Cui break;
401*01826a49SYabin Cui }
402*01826a49SYabin Cui }
403*01826a49SYabin Cui return zparams;
404*01826a49SYabin Cui }
405