xref: /dflybsd-src/contrib/zstd/lib/zstd.h (revision a28cd43d19e8b720a6c852a4bbc5ae147a26165a)
1*a28cd43dSSascha Wildner /*
2*a28cd43dSSascha Wildner  * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
3*a28cd43dSSascha Wildner  * All rights reserved.
4*a28cd43dSSascha Wildner  *
5*a28cd43dSSascha Wildner  * This source code is licensed under both the BSD-style license (found in the
6*a28cd43dSSascha Wildner  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7*a28cd43dSSascha Wildner  * in the COPYING file in the root directory of this source tree).
8*a28cd43dSSascha Wildner  * You may select, at your option, one of the above-listed licenses.
9*a28cd43dSSascha Wildner  */
10*a28cd43dSSascha Wildner #if defined (__cplusplus)
11*a28cd43dSSascha Wildner extern "C" {
12*a28cd43dSSascha Wildner #endif
13*a28cd43dSSascha Wildner 
14*a28cd43dSSascha Wildner #ifndef ZSTD_H_235446
15*a28cd43dSSascha Wildner #define ZSTD_H_235446
16*a28cd43dSSascha Wildner 
17*a28cd43dSSascha Wildner /* ======   Dependency   ======*/
18*a28cd43dSSascha Wildner #include <limits.h>   /* INT_MAX */
19*a28cd43dSSascha Wildner #include <stddef.h>   /* size_t */
20*a28cd43dSSascha Wildner 
21*a28cd43dSSascha Wildner 
22*a28cd43dSSascha Wildner /* =====   ZSTDLIB_API : control library symbols visibility   ===== */
23*a28cd43dSSascha Wildner #ifndef ZSTDLIB_VISIBILITY
24*a28cd43dSSascha Wildner #  if defined(__GNUC__) && (__GNUC__ >= 4)
25*a28cd43dSSascha Wildner #    define ZSTDLIB_VISIBILITY __attribute__ ((visibility ("default")))
26*a28cd43dSSascha Wildner #  else
27*a28cd43dSSascha Wildner #    define ZSTDLIB_VISIBILITY
28*a28cd43dSSascha Wildner #  endif
29*a28cd43dSSascha Wildner #endif
30*a28cd43dSSascha Wildner #if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1)
31*a28cd43dSSascha Wildner #  define ZSTDLIB_API __declspec(dllexport) ZSTDLIB_VISIBILITY
32*a28cd43dSSascha Wildner #elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1)
33*a28cd43dSSascha Wildner #  define ZSTDLIB_API __declspec(dllimport) ZSTDLIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/
34*a28cd43dSSascha Wildner #else
35*a28cd43dSSascha Wildner #  define ZSTDLIB_API ZSTDLIB_VISIBILITY
36*a28cd43dSSascha Wildner #endif
37*a28cd43dSSascha Wildner 
38*a28cd43dSSascha Wildner 
39*a28cd43dSSascha Wildner /*******************************************************************************
40*a28cd43dSSascha Wildner   Introduction
41*a28cd43dSSascha Wildner 
42*a28cd43dSSascha Wildner   zstd, short for Zstandard, is a fast lossless compression algorithm, targeting
43*a28cd43dSSascha Wildner   real-time compression scenarios at zlib-level and better compression ratios.
44*a28cd43dSSascha Wildner   The zstd compression library provides in-memory compression and decompression
45*a28cd43dSSascha Wildner   functions.
46*a28cd43dSSascha Wildner 
47*a28cd43dSSascha Wildner   The library supports regular compression levels from 1 up to ZSTD_maxCLevel(),
48*a28cd43dSSascha Wildner   which is currently 22. Levels >= 20, labeled `--ultra`, should be used with
49*a28cd43dSSascha Wildner   caution, as they require more memory. The library also offers negative
50*a28cd43dSSascha Wildner   compression levels, which extend the range of speed vs. ratio preferences.
51*a28cd43dSSascha Wildner   The lower the level, the faster the speed (at the cost of compression).
52*a28cd43dSSascha Wildner 
53*a28cd43dSSascha Wildner   Compression can be done in:
54*a28cd43dSSascha Wildner     - a single step (described as Simple API)
55*a28cd43dSSascha Wildner     - a single step, reusing a context (described as Explicit context)
56*a28cd43dSSascha Wildner     - unbounded multiple steps (described as Streaming compression)
57*a28cd43dSSascha Wildner 
58*a28cd43dSSascha Wildner   The compression ratio achievable on small data can be highly improved using
59*a28cd43dSSascha Wildner   a dictionary. Dictionary compression can be performed in:
60*a28cd43dSSascha Wildner     - a single step (described as Simple dictionary API)
61*a28cd43dSSascha Wildner     - a single step, reusing a dictionary (described as Bulk-processing
62*a28cd43dSSascha Wildner       dictionary API)
63*a28cd43dSSascha Wildner 
64*a28cd43dSSascha Wildner   Advanced experimental functions can be accessed using
65*a28cd43dSSascha Wildner   `#define ZSTD_STATIC_LINKING_ONLY` before including zstd.h.
66*a28cd43dSSascha Wildner 
67*a28cd43dSSascha Wildner   Advanced experimental APIs should never be used with a dynamically-linked
68*a28cd43dSSascha Wildner   library. They are not "stable"; their definitions or signatures may change in
69*a28cd43dSSascha Wildner   the future. Only static linking is allowed.
70*a28cd43dSSascha Wildner *******************************************************************************/
71*a28cd43dSSascha Wildner 
72*a28cd43dSSascha Wildner /*------   Version   ------*/
73*a28cd43dSSascha Wildner #define ZSTD_VERSION_MAJOR    1
74*a28cd43dSSascha Wildner #define ZSTD_VERSION_MINOR    4
75*a28cd43dSSascha Wildner #define ZSTD_VERSION_RELEASE  8
76*a28cd43dSSascha Wildner #define ZSTD_VERSION_NUMBER  (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
77*a28cd43dSSascha Wildner 
78*a28cd43dSSascha Wildner /*! ZSTD_versionNumber() :
79*a28cd43dSSascha Wildner  *  Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE). */
80*a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_versionNumber(void);
81*a28cd43dSSascha Wildner 
82*a28cd43dSSascha Wildner #define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE
83*a28cd43dSSascha Wildner #define ZSTD_QUOTE(str) #str
84*a28cd43dSSascha Wildner #define ZSTD_EXPAND_AND_QUOTE(str) ZSTD_QUOTE(str)
85*a28cd43dSSascha Wildner #define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION)
86*a28cd43dSSascha Wildner 
87*a28cd43dSSascha Wildner /*! ZSTD_versionString() :
88*a28cd43dSSascha Wildner  *  Return runtime library version, like "1.4.5". Requires v1.3.0+. */
89*a28cd43dSSascha Wildner ZSTDLIB_API const char* ZSTD_versionString(void);
90*a28cd43dSSascha Wildner 
91*a28cd43dSSascha Wildner /* *************************************
92*a28cd43dSSascha Wildner  *  Default constant
93*a28cd43dSSascha Wildner  ***************************************/
94*a28cd43dSSascha Wildner #ifndef ZSTD_CLEVEL_DEFAULT
95*a28cd43dSSascha Wildner #  define ZSTD_CLEVEL_DEFAULT 3
96*a28cd43dSSascha Wildner #endif
97*a28cd43dSSascha Wildner 
98*a28cd43dSSascha Wildner /* *************************************
99*a28cd43dSSascha Wildner  *  Constants
100*a28cd43dSSascha Wildner  ***************************************/
101*a28cd43dSSascha Wildner 
102*a28cd43dSSascha Wildner /* All magic numbers are supposed read/written to/from files/memory using little-endian convention */
103*a28cd43dSSascha Wildner #define ZSTD_MAGICNUMBER            0xFD2FB528    /* valid since v0.8.0 */
104*a28cd43dSSascha Wildner #define ZSTD_MAGIC_DICTIONARY       0xEC30A437    /* valid since v0.7.0 */
105*a28cd43dSSascha Wildner #define ZSTD_MAGIC_SKIPPABLE_START  0x184D2A50    /* all 16 values, from 0x184D2A50 to 0x184D2A5F, signal the beginning of a skippable frame */
106*a28cd43dSSascha Wildner #define ZSTD_MAGIC_SKIPPABLE_MASK   0xFFFFFFF0
107*a28cd43dSSascha Wildner 
108*a28cd43dSSascha Wildner #define ZSTD_BLOCKSIZELOG_MAX  17
109*a28cd43dSSascha Wildner #define ZSTD_BLOCKSIZE_MAX     (1<<ZSTD_BLOCKSIZELOG_MAX)
110*a28cd43dSSascha Wildner 
111*a28cd43dSSascha Wildner 
112*a28cd43dSSascha Wildner 
113*a28cd43dSSascha Wildner /***************************************
114*a28cd43dSSascha Wildner *  Simple API
115*a28cd43dSSascha Wildner ***************************************/
116*a28cd43dSSascha Wildner /*! ZSTD_compress() :
117*a28cd43dSSascha Wildner  *  Compresses `src` content as a single zstd compressed frame into already allocated `dst`.
118*a28cd43dSSascha Wildner  *  Hint : compression runs faster if `dstCapacity` >=  `ZSTD_compressBound(srcSize)`.
119*a28cd43dSSascha Wildner  *  @return : compressed size written into `dst` (<= `dstCapacity),
120*a28cd43dSSascha Wildner  *            or an error code if it fails (which can be tested using ZSTD_isError()). */
121*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity,
122*a28cd43dSSascha Wildner                             const void* src, size_t srcSize,
123*a28cd43dSSascha Wildner                                   int compressionLevel);
124*a28cd43dSSascha Wildner 
125*a28cd43dSSascha Wildner /*! ZSTD_decompress() :
126*a28cd43dSSascha Wildner  *  `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames.
127*a28cd43dSSascha Wildner  *  `dstCapacity` is an upper bound of originalSize to regenerate.
128*a28cd43dSSascha Wildner  *  If user cannot imply a maximum upper bound, it's better to use streaming mode to decompress data.
129*a28cd43dSSascha Wildner  *  @return : the number of bytes decompressed into `dst` (<= `dstCapacity`),
130*a28cd43dSSascha Wildner  *            or an errorCode if it fails (which can be tested using ZSTD_isError()). */
131*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity,
132*a28cd43dSSascha Wildner                               const void* src, size_t compressedSize);
133*a28cd43dSSascha Wildner 
134*a28cd43dSSascha Wildner /*! ZSTD_getFrameContentSize() : requires v1.3.0+
135*a28cd43dSSascha Wildner  *  `src` should point to the start of a ZSTD encoded frame.
136*a28cd43dSSascha Wildner  *  `srcSize` must be at least as large as the frame header.
137*a28cd43dSSascha Wildner  *            hint : any size >= `ZSTD_frameHeaderSize_max` is large enough.
138*a28cd43dSSascha Wildner  *  @return : - decompressed size of `src` frame content, if known
139*a28cd43dSSascha Wildner  *            - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined
140*a28cd43dSSascha Wildner  *            - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small)
141*a28cd43dSSascha Wildner  *   note 1 : a 0 return value means the frame is valid but "empty".
142*a28cd43dSSascha Wildner  *   note 2 : decompressed size is an optional field, it may not be present, typically in streaming mode.
143*a28cd43dSSascha Wildner  *            When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size.
144*a28cd43dSSascha Wildner  *            In which case, it's necessary to use streaming mode to decompress data.
145*a28cd43dSSascha Wildner  *            Optionally, application can rely on some implicit limit,
146*a28cd43dSSascha Wildner  *            as ZSTD_decompress() only needs an upper bound of decompressed size.
147*a28cd43dSSascha Wildner  *            (For example, data could be necessarily cut into blocks <= 16 KB).
148*a28cd43dSSascha Wildner  *   note 3 : decompressed size is always present when compression is completed using single-pass functions,
149*a28cd43dSSascha Wildner  *            such as ZSTD_compress(), ZSTD_compressCCtx() ZSTD_compress_usingDict() or ZSTD_compress_usingCDict().
150*a28cd43dSSascha Wildner  *   note 4 : decompressed size can be very large (64-bits value),
151*a28cd43dSSascha Wildner  *            potentially larger than what local system can handle as a single memory segment.
152*a28cd43dSSascha Wildner  *            In which case, it's necessary to use streaming mode to decompress data.
153*a28cd43dSSascha Wildner  *   note 5 : If source is untrusted, decompressed size could be wrong or intentionally modified.
154*a28cd43dSSascha Wildner  *            Always ensure return value fits within application's authorized limits.
155*a28cd43dSSascha Wildner  *            Each application can set its own limits.
156*a28cd43dSSascha Wildner  *   note 6 : This function replaces ZSTD_getDecompressedSize() */
157*a28cd43dSSascha Wildner #define ZSTD_CONTENTSIZE_UNKNOWN (0ULL - 1)
158*a28cd43dSSascha Wildner #define ZSTD_CONTENTSIZE_ERROR   (0ULL - 2)
159*a28cd43dSSascha Wildner ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize);
160*a28cd43dSSascha Wildner 
161*a28cd43dSSascha Wildner /*! ZSTD_getDecompressedSize() :
162*a28cd43dSSascha Wildner  *  NOTE: This function is now obsolete, in favor of ZSTD_getFrameContentSize().
163*a28cd43dSSascha Wildner  *  Both functions work the same way, but ZSTD_getDecompressedSize() blends
164*a28cd43dSSascha Wildner  *  "empty", "unknown" and "error" results to the same return value (0),
165*a28cd43dSSascha Wildner  *  while ZSTD_getFrameContentSize() gives them separate return values.
166*a28cd43dSSascha Wildner  * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */
167*a28cd43dSSascha Wildner ZSTDLIB_API unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
168*a28cd43dSSascha Wildner 
169*a28cd43dSSascha Wildner /*! ZSTD_findFrameCompressedSize() :
170*a28cd43dSSascha Wildner  * `src` should point to the start of a ZSTD frame or skippable frame.
171*a28cd43dSSascha Wildner  * `srcSize` must be >= first frame size
172*a28cd43dSSascha Wildner  * @return : the compressed size of the first frame starting at `src`,
173*a28cd43dSSascha Wildner  *           suitable to pass as `srcSize` to `ZSTD_decompress` or similar,
174*a28cd43dSSascha Wildner  *        or an error code if input is invalid */
175*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize);
176*a28cd43dSSascha Wildner 
177*a28cd43dSSascha Wildner 
178*a28cd43dSSascha Wildner /*======  Helper functions  ======*/
179*a28cd43dSSascha Wildner #define ZSTD_COMPRESSBOUND(srcSize)   ((srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0))  /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */
180*a28cd43dSSascha Wildner ZSTDLIB_API size_t      ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
181*a28cd43dSSascha Wildner ZSTDLIB_API unsigned    ZSTD_isError(size_t code);          /*!< tells if a `size_t` function result is an error code */
182*a28cd43dSSascha Wildner ZSTDLIB_API const char* ZSTD_getErrorName(size_t code);     /*!< provides readable string from an error code */
183*a28cd43dSSascha Wildner ZSTDLIB_API int         ZSTD_minCLevel(void);               /*!< minimum negative compression level allowed */
184*a28cd43dSSascha Wildner ZSTDLIB_API int         ZSTD_maxCLevel(void);               /*!< maximum compression level available */
185*a28cd43dSSascha Wildner 
186*a28cd43dSSascha Wildner 
187*a28cd43dSSascha Wildner /***************************************
188*a28cd43dSSascha Wildner *  Explicit context
189*a28cd43dSSascha Wildner ***************************************/
190*a28cd43dSSascha Wildner /*= Compression context
191*a28cd43dSSascha Wildner  *  When compressing many times,
192*a28cd43dSSascha Wildner  *  it is recommended to allocate a context just once,
193*a28cd43dSSascha Wildner  *  and re-use it for each successive compression operation.
194*a28cd43dSSascha Wildner  *  This will make workload friendlier for system's memory.
195*a28cd43dSSascha Wildner  *  Note : re-using context is just a speed / resource optimization.
196*a28cd43dSSascha Wildner  *         It doesn't change the compression ratio, which remains identical.
197*a28cd43dSSascha Wildner  *  Note 2 : In multi-threaded environments,
198*a28cd43dSSascha Wildner  *         use one different context per thread for parallel execution.
199*a28cd43dSSascha Wildner  */
200*a28cd43dSSascha Wildner typedef struct ZSTD_CCtx_s ZSTD_CCtx;
201*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void);
202*a28cd43dSSascha Wildner ZSTDLIB_API size_t     ZSTD_freeCCtx(ZSTD_CCtx* cctx);
203*a28cd43dSSascha Wildner 
204*a28cd43dSSascha Wildner /*! ZSTD_compressCCtx() :
205*a28cd43dSSascha Wildner  *  Same as ZSTD_compress(), using an explicit ZSTD_CCtx.
206*a28cd43dSSascha Wildner  *  Important : in order to behave similarly to `ZSTD_compress()`,
207*a28cd43dSSascha Wildner  *  this function compresses at requested compression level,
208*a28cd43dSSascha Wildner  *  __ignoring any other parameter__ .
209*a28cd43dSSascha Wildner  *  If any advanced parameter was set using the advanced API,
210*a28cd43dSSascha Wildner  *  they will all be reset. Only `compressionLevel` remains.
211*a28cd43dSSascha Wildner  */
212*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx,
213*a28cd43dSSascha Wildner                                      void* dst, size_t dstCapacity,
214*a28cd43dSSascha Wildner                                const void* src, size_t srcSize,
215*a28cd43dSSascha Wildner                                      int compressionLevel);
216*a28cd43dSSascha Wildner 
217*a28cd43dSSascha Wildner /*= Decompression context
218*a28cd43dSSascha Wildner  *  When decompressing many times,
219*a28cd43dSSascha Wildner  *  it is recommended to allocate a context only once,
220*a28cd43dSSascha Wildner  *  and re-use it for each successive compression operation.
221*a28cd43dSSascha Wildner  *  This will make workload friendlier for system's memory.
222*a28cd43dSSascha Wildner  *  Use one context per thread for parallel execution. */
223*a28cd43dSSascha Wildner typedef struct ZSTD_DCtx_s ZSTD_DCtx;
224*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void);
225*a28cd43dSSascha Wildner ZSTDLIB_API size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);
226*a28cd43dSSascha Wildner 
227*a28cd43dSSascha Wildner /*! ZSTD_decompressDCtx() :
228*a28cd43dSSascha Wildner  *  Same as ZSTD_decompress(),
229*a28cd43dSSascha Wildner  *  requires an allocated ZSTD_DCtx.
230*a28cd43dSSascha Wildner  *  Compatible with sticky parameters.
231*a28cd43dSSascha Wildner  */
232*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx,
233*a28cd43dSSascha Wildner                                        void* dst, size_t dstCapacity,
234*a28cd43dSSascha Wildner                                  const void* src, size_t srcSize);
235*a28cd43dSSascha Wildner 
236*a28cd43dSSascha Wildner 
237*a28cd43dSSascha Wildner /***************************************
238*a28cd43dSSascha Wildner *  Advanced compression API
239*a28cd43dSSascha Wildner ***************************************/
240*a28cd43dSSascha Wildner 
241*a28cd43dSSascha Wildner /* API design :
242*a28cd43dSSascha Wildner  *   Parameters are pushed one by one into an existing context,
243*a28cd43dSSascha Wildner  *   using ZSTD_CCtx_set*() functions.
244*a28cd43dSSascha Wildner  *   Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame.
245*a28cd43dSSascha Wildner  *   "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` !
246*a28cd43dSSascha Wildner  *   __They do not apply to "simple" one-shot variants such as ZSTD_compressCCtx()__ .
247*a28cd43dSSascha Wildner  *
248*a28cd43dSSascha Wildner  *   It's possible to reset all parameters to "default" using ZSTD_CCtx_reset().
249*a28cd43dSSascha Wildner  *
250*a28cd43dSSascha Wildner  *   This API supercedes all other "advanced" API entry points in the experimental section.
251*a28cd43dSSascha Wildner  *   In the future, we expect to remove from experimental API entry points which are redundant with this API.
252*a28cd43dSSascha Wildner  */
253*a28cd43dSSascha Wildner 
254*a28cd43dSSascha Wildner 
255*a28cd43dSSascha Wildner /* Compression strategies, listed from fastest to strongest */
256*a28cd43dSSascha Wildner typedef enum { ZSTD_fast=1,
257*a28cd43dSSascha Wildner                ZSTD_dfast=2,
258*a28cd43dSSascha Wildner                ZSTD_greedy=3,
259*a28cd43dSSascha Wildner                ZSTD_lazy=4,
260*a28cd43dSSascha Wildner                ZSTD_lazy2=5,
261*a28cd43dSSascha Wildner                ZSTD_btlazy2=6,
262*a28cd43dSSascha Wildner                ZSTD_btopt=7,
263*a28cd43dSSascha Wildner                ZSTD_btultra=8,
264*a28cd43dSSascha Wildner                ZSTD_btultra2=9
265*a28cd43dSSascha Wildner                /* note : new strategies _might_ be added in the future.
266*a28cd43dSSascha Wildner                          Only the order (from fast to strong) is guaranteed */
267*a28cd43dSSascha Wildner } ZSTD_strategy;
268*a28cd43dSSascha Wildner 
269*a28cd43dSSascha Wildner 
270*a28cd43dSSascha Wildner typedef enum {
271*a28cd43dSSascha Wildner 
272*a28cd43dSSascha Wildner     /* compression parameters
273*a28cd43dSSascha Wildner      * Note: When compressing with a ZSTD_CDict these parameters are superseded
274*a28cd43dSSascha Wildner      * by the parameters used to construct the ZSTD_CDict.
275*a28cd43dSSascha Wildner      * See ZSTD_CCtx_refCDict() for more info (superseded-by-cdict). */
276*a28cd43dSSascha Wildner     ZSTD_c_compressionLevel=100, /* Set compression parameters according to pre-defined cLevel table.
277*a28cd43dSSascha Wildner                               * Note that exact compression parameters are dynamically determined,
278*a28cd43dSSascha Wildner                               * depending on both compression level and srcSize (when known).
279*a28cd43dSSascha Wildner                               * Default level is ZSTD_CLEVEL_DEFAULT==3.
280*a28cd43dSSascha Wildner                               * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT.
281*a28cd43dSSascha Wildner                               * Note 1 : it's possible to pass a negative compression level.
282*a28cd43dSSascha Wildner                               * Note 2 : setting a level does not automatically set all other compression parameters
283*a28cd43dSSascha Wildner                               *   to default. Setting this will however eventually dynamically impact the compression
284*a28cd43dSSascha Wildner                               *   parameters which have not been manually set. The manually set
285*a28cd43dSSascha Wildner                               *   ones will 'stick'. */
286*a28cd43dSSascha Wildner     /* Advanced compression parameters :
287*a28cd43dSSascha Wildner      * It's possible to pin down compression parameters to some specific values.
288*a28cd43dSSascha Wildner      * In which case, these values are no longer dynamically selected by the compressor */
289*a28cd43dSSascha Wildner     ZSTD_c_windowLog=101,    /* Maximum allowed back-reference distance, expressed as power of 2.
290*a28cd43dSSascha Wildner                               * This will set a memory budget for streaming decompression,
291*a28cd43dSSascha Wildner                               * with larger values requiring more memory
292*a28cd43dSSascha Wildner                               * and typically compressing more.
293*a28cd43dSSascha Wildner                               * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX.
294*a28cd43dSSascha Wildner                               * Special: value 0 means "use default windowLog".
295*a28cd43dSSascha Wildner                               * Note: Using a windowLog greater than ZSTD_WINDOWLOG_LIMIT_DEFAULT
296*a28cd43dSSascha Wildner                               *       requires explicitly allowing such size at streaming decompression stage. */
297*a28cd43dSSascha Wildner     ZSTD_c_hashLog=102,      /* Size of the initial probe table, as a power of 2.
298*a28cd43dSSascha Wildner                               * Resulting memory usage is (1 << (hashLog+2)).
299*a28cd43dSSascha Wildner                               * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX.
300*a28cd43dSSascha Wildner                               * Larger tables improve compression ratio of strategies <= dFast,
301*a28cd43dSSascha Wildner                               * and improve speed of strategies > dFast.
302*a28cd43dSSascha Wildner                               * Special: value 0 means "use default hashLog". */
303*a28cd43dSSascha Wildner     ZSTD_c_chainLog=103,     /* Size of the multi-probe search table, as a power of 2.
304*a28cd43dSSascha Wildner                               * Resulting memory usage is (1 << (chainLog+2)).
305*a28cd43dSSascha Wildner                               * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX.
306*a28cd43dSSascha Wildner                               * Larger tables result in better and slower compression.
307*a28cd43dSSascha Wildner                               * This parameter is useless for "fast" strategy.
308*a28cd43dSSascha Wildner                               * It's still useful when using "dfast" strategy,
309*a28cd43dSSascha Wildner                               * in which case it defines a secondary probe table.
310*a28cd43dSSascha Wildner                               * Special: value 0 means "use default chainLog". */
311*a28cd43dSSascha Wildner     ZSTD_c_searchLog=104,    /* Number of search attempts, as a power of 2.
312*a28cd43dSSascha Wildner                               * More attempts result in better and slower compression.
313*a28cd43dSSascha Wildner                               * This parameter is useless for "fast" and "dFast" strategies.
314*a28cd43dSSascha Wildner                               * Special: value 0 means "use default searchLog". */
315*a28cd43dSSascha Wildner     ZSTD_c_minMatch=105,     /* Minimum size of searched matches.
316*a28cd43dSSascha Wildner                               * Note that Zstandard can still find matches of smaller size,
317*a28cd43dSSascha Wildner                               * it just tweaks its search algorithm to look for this size and larger.
318*a28cd43dSSascha Wildner                               * Larger values increase compression and decompression speed, but decrease ratio.
319*a28cd43dSSascha Wildner                               * Must be clamped between ZSTD_MINMATCH_MIN and ZSTD_MINMATCH_MAX.
320*a28cd43dSSascha Wildner                               * Note that currently, for all strategies < btopt, effective minimum is 4.
321*a28cd43dSSascha Wildner                               *                    , for all strategies > fast, effective maximum is 6.
322*a28cd43dSSascha Wildner                               * Special: value 0 means "use default minMatchLength". */
323*a28cd43dSSascha Wildner     ZSTD_c_targetLength=106, /* Impact of this field depends on strategy.
324*a28cd43dSSascha Wildner                               * For strategies btopt, btultra & btultra2:
325*a28cd43dSSascha Wildner                               *     Length of Match considered "good enough" to stop search.
326*a28cd43dSSascha Wildner                               *     Larger values make compression stronger, and slower.
327*a28cd43dSSascha Wildner                               * For strategy fast:
328*a28cd43dSSascha Wildner                               *     Distance between match sampling.
329*a28cd43dSSascha Wildner                               *     Larger values make compression faster, and weaker.
330*a28cd43dSSascha Wildner                               * Special: value 0 means "use default targetLength". */
331*a28cd43dSSascha Wildner     ZSTD_c_strategy=107,     /* See ZSTD_strategy enum definition.
332*a28cd43dSSascha Wildner                               * The higher the value of selected strategy, the more complex it is,
333*a28cd43dSSascha Wildner                               * resulting in stronger and slower compression.
334*a28cd43dSSascha Wildner                               * Special: value 0 means "use default strategy". */
335*a28cd43dSSascha Wildner 
336*a28cd43dSSascha Wildner     /* LDM mode parameters */
337*a28cd43dSSascha Wildner     ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching.
338*a28cd43dSSascha Wildner                                      * This parameter is designed to improve compression ratio
339*a28cd43dSSascha Wildner                                      * for large inputs, by finding large matches at long distance.
340*a28cd43dSSascha Wildner                                      * It increases memory usage and window size.
341*a28cd43dSSascha Wildner                                      * Note: enabling this parameter increases default ZSTD_c_windowLog to 128 MB
342*a28cd43dSSascha Wildner                                      * except when expressly set to a different value.
343*a28cd43dSSascha Wildner                                      * Note: will be enabled by default if ZSTD_c_windowLog >= 128 MB and
344*a28cd43dSSascha Wildner                                      * compression strategy >= ZSTD_btopt (== compression level 16+) */
345*a28cd43dSSascha Wildner     ZSTD_c_ldmHashLog=161,   /* Size of the table for long distance matching, as a power of 2.
346*a28cd43dSSascha Wildner                               * Larger values increase memory usage and compression ratio,
347*a28cd43dSSascha Wildner                               * but decrease compression speed.
348*a28cd43dSSascha Wildner                               * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX
349*a28cd43dSSascha Wildner                               * default: windowlog - 7.
350*a28cd43dSSascha Wildner                               * Special: value 0 means "automatically determine hashlog". */
351*a28cd43dSSascha Wildner     ZSTD_c_ldmMinMatch=162,  /* Minimum match size for long distance matcher.
352*a28cd43dSSascha Wildner                               * Larger/too small values usually decrease compression ratio.
353*a28cd43dSSascha Wildner                               * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX.
354*a28cd43dSSascha Wildner                               * Special: value 0 means "use default value" (default: 64). */
355*a28cd43dSSascha Wildner     ZSTD_c_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution.
356*a28cd43dSSascha Wildner                               * Larger values improve collision resolution but decrease compression speed.
357*a28cd43dSSascha Wildner                               * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX.
358*a28cd43dSSascha Wildner                               * Special: value 0 means "use default value" (default: 3). */
359*a28cd43dSSascha Wildner     ZSTD_c_ldmHashRateLog=164, /* Frequency of inserting/looking up entries into the LDM hash table.
360*a28cd43dSSascha Wildner                               * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN).
361*a28cd43dSSascha Wildner                               * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage.
362*a28cd43dSSascha Wildner                               * Larger values improve compression speed.
363*a28cd43dSSascha Wildner                               * Deviating far from default value will likely result in a compression ratio decrease.
364*a28cd43dSSascha Wildner                               * Special: value 0 means "automatically determine hashRateLog". */
365*a28cd43dSSascha Wildner 
366*a28cd43dSSascha Wildner     /* frame parameters */
367*a28cd43dSSascha Wildner     ZSTD_c_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1)
368*a28cd43dSSascha Wildner                               * Content size must be known at the beginning of compression.
369*a28cd43dSSascha Wildner                               * This is automatically the case when using ZSTD_compress2(),
370*a28cd43dSSascha Wildner                               * For streaming scenarios, content size must be provided with ZSTD_CCtx_setPledgedSrcSize() */
371*a28cd43dSSascha Wildner     ZSTD_c_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */
372*a28cd43dSSascha Wildner     ZSTD_c_dictIDFlag=202,   /* When applicable, dictionary's ID is written into frame header (default:1) */
373*a28cd43dSSascha Wildner 
374*a28cd43dSSascha Wildner     /* multi-threading parameters */
375*a28cd43dSSascha Wildner     /* These parameters are only active if multi-threading is enabled (compiled with build macro ZSTD_MULTITHREAD).
376*a28cd43dSSascha Wildner      * Otherwise, trying to set any other value than default (0) will be a no-op and return an error.
377*a28cd43dSSascha Wildner      * In a situation where it's unknown if the linked library supports multi-threading or not,
378*a28cd43dSSascha Wildner      * setting ZSTD_c_nbWorkers to any value >= 1 and consulting the return value provides a quick way to check this property.
379*a28cd43dSSascha Wildner      */
380*a28cd43dSSascha Wildner     ZSTD_c_nbWorkers=400,    /* Select how many threads will be spawned to compress in parallel.
381*a28cd43dSSascha Wildner                               * When nbWorkers >= 1, triggers asynchronous mode when invoking ZSTD_compressStream*() :
382*a28cd43dSSascha Wildner                               * ZSTD_compressStream*() consumes input and flush output if possible, but immediately gives back control to caller,
383*a28cd43dSSascha Wildner                               * while compression is performed in parallel, within worker thread(s).
384*a28cd43dSSascha Wildner                               * (note : a strong exception to this rule is when first invocation of ZSTD_compressStream2() sets ZSTD_e_end :
385*a28cd43dSSascha Wildner                               *  in which case, ZSTD_compressStream2() delegates to ZSTD_compress2(), which is always a blocking call).
386*a28cd43dSSascha Wildner                               * More workers improve speed, but also increase memory usage.
387*a28cd43dSSascha Wildner                               * Default value is `0`, aka "single-threaded mode" : no worker is spawned,
388*a28cd43dSSascha Wildner                               * compression is performed inside Caller's thread, and all invocations are blocking */
389*a28cd43dSSascha Wildner     ZSTD_c_jobSize=401,      /* Size of a compression job. This value is enforced only when nbWorkers >= 1.
390*a28cd43dSSascha Wildner                               * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads.
391*a28cd43dSSascha Wildner                               * 0 means default, which is dynamically determined based on compression parameters.
392*a28cd43dSSascha Wildner                               * Job size must be a minimum of overlap size, or 1 MB, whichever is largest.
393*a28cd43dSSascha Wildner                               * The minimum size is automatically and transparently enforced. */
394*a28cd43dSSascha Wildner     ZSTD_c_overlapLog=402,   /* Control the overlap size, as a fraction of window size.
395*a28cd43dSSascha Wildner                               * The overlap size is an amount of data reloaded from previous job at the beginning of a new job.
396*a28cd43dSSascha Wildner                               * It helps preserve compression ratio, while each job is compressed in parallel.
397*a28cd43dSSascha Wildner                               * This value is enforced only when nbWorkers >= 1.
398*a28cd43dSSascha Wildner                               * Larger values increase compression ratio, but decrease speed.
399*a28cd43dSSascha Wildner                               * Possible values range from 0 to 9 :
400*a28cd43dSSascha Wildner                               * - 0 means "default" : value will be determined by the library, depending on strategy
401*a28cd43dSSascha Wildner                               * - 1 means "no overlap"
402*a28cd43dSSascha Wildner                               * - 9 means "full overlap", using a full window size.
403*a28cd43dSSascha Wildner                               * Each intermediate rank increases/decreases load size by a factor 2 :
404*a28cd43dSSascha Wildner                               * 9: full window;  8: w/2;  7: w/4;  6: w/8;  5:w/16;  4: w/32;  3:w/64;  2:w/128;  1:no overlap;  0:default
405*a28cd43dSSascha Wildner                               * default value varies between 6 and 9, depending on strategy */
406*a28cd43dSSascha Wildner 
407*a28cd43dSSascha Wildner     /* note : additional experimental parameters are also available
408*a28cd43dSSascha Wildner      * within the experimental section of the API.
409*a28cd43dSSascha Wildner      * At the time of this writing, they include :
410*a28cd43dSSascha Wildner      * ZSTD_c_rsyncable
411*a28cd43dSSascha Wildner      * ZSTD_c_format
412*a28cd43dSSascha Wildner      * ZSTD_c_forceMaxWindow
413*a28cd43dSSascha Wildner      * ZSTD_c_forceAttachDict
414*a28cd43dSSascha Wildner      * ZSTD_c_literalCompressionMode
415*a28cd43dSSascha Wildner      * ZSTD_c_targetCBlockSize
416*a28cd43dSSascha Wildner      * ZSTD_c_srcSizeHint
417*a28cd43dSSascha Wildner      * ZSTD_c_enableDedicatedDictSearch
418*a28cd43dSSascha Wildner      * ZSTD_c_stableInBuffer
419*a28cd43dSSascha Wildner      * ZSTD_c_stableOutBuffer
420*a28cd43dSSascha Wildner      * ZSTD_c_blockDelimiters
421*a28cd43dSSascha Wildner      * ZSTD_c_validateSequences
422*a28cd43dSSascha Wildner      * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
423*a28cd43dSSascha Wildner      * note : never ever use experimentalParam? names directly;
424*a28cd43dSSascha Wildner      *        also, the enums values themselves are unstable and can still change.
425*a28cd43dSSascha Wildner      */
426*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam1=500,
427*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam2=10,
428*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam3=1000,
429*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam4=1001,
430*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam5=1002,
431*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam6=1003,
432*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam7=1004,
433*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam8=1005,
434*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam9=1006,
435*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam10=1007,
436*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam11=1008,
437*a28cd43dSSascha Wildner      ZSTD_c_experimentalParam12=1009
438*a28cd43dSSascha Wildner } ZSTD_cParameter;
439*a28cd43dSSascha Wildner 
440*a28cd43dSSascha Wildner typedef struct {
441*a28cd43dSSascha Wildner     size_t error;
442*a28cd43dSSascha Wildner     int lowerBound;
443*a28cd43dSSascha Wildner     int upperBound;
444*a28cd43dSSascha Wildner } ZSTD_bounds;
445*a28cd43dSSascha Wildner 
446*a28cd43dSSascha Wildner /*! ZSTD_cParam_getBounds() :
447*a28cd43dSSascha Wildner  *  All parameters must belong to an interval with lower and upper bounds,
448*a28cd43dSSascha Wildner  *  otherwise they will either trigger an error or be automatically clamped.
449*a28cd43dSSascha Wildner  * @return : a structure, ZSTD_bounds, which contains
450*a28cd43dSSascha Wildner  *         - an error status field, which must be tested using ZSTD_isError()
451*a28cd43dSSascha Wildner  *         - lower and upper bounds, both inclusive
452*a28cd43dSSascha Wildner  */
453*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter cParam);
454*a28cd43dSSascha Wildner 
455*a28cd43dSSascha Wildner /*! ZSTD_CCtx_setParameter() :
456*a28cd43dSSascha Wildner  *  Set one compression parameter, selected by enum ZSTD_cParameter.
457*a28cd43dSSascha Wildner  *  All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds().
458*a28cd43dSSascha Wildner  *  Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter).
459*a28cd43dSSascha Wildner  *  Setting a parameter is generally only possible during frame initialization (before starting compression).
460*a28cd43dSSascha Wildner  *  Exception : when using multi-threading mode (nbWorkers >= 1),
461*a28cd43dSSascha Wildner  *              the following parameters can be updated _during_ compression (within same frame):
462*a28cd43dSSascha Wildner  *              => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy.
463*a28cd43dSSascha Wildner  *              new parameters will be active for next job only (after a flush()).
464*a28cd43dSSascha Wildner  * @return : an error code (which can be tested using ZSTD_isError()).
465*a28cd43dSSascha Wildner  */
466*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value);
467*a28cd43dSSascha Wildner 
468*a28cd43dSSascha Wildner /*! ZSTD_CCtx_setPledgedSrcSize() :
469*a28cd43dSSascha Wildner  *  Total input data size to be compressed as a single frame.
470*a28cd43dSSascha Wildner  *  Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag.
471*a28cd43dSSascha Wildner  *  This value will also be controlled at end of frame, and trigger an error if not respected.
472*a28cd43dSSascha Wildner  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
473*a28cd43dSSascha Wildner  *  Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame.
474*a28cd43dSSascha Wildner  *           In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN.
475*a28cd43dSSascha Wildner  *           ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame.
476*a28cd43dSSascha Wildner  *  Note 2 : pledgedSrcSize is only valid once, for the next frame.
477*a28cd43dSSascha Wildner  *           It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN.
478*a28cd43dSSascha Wildner  *  Note 3 : Whenever all input data is provided and consumed in a single round,
479*a28cd43dSSascha Wildner  *           for example with ZSTD_compress2(),
480*a28cd43dSSascha Wildner  *           or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end),
481*a28cd43dSSascha Wildner  *           this value is automatically overridden by srcSize instead.
482*a28cd43dSSascha Wildner  */
483*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize);
484*a28cd43dSSascha Wildner 
485*a28cd43dSSascha Wildner typedef enum {
486*a28cd43dSSascha Wildner     ZSTD_reset_session_only = 1,
487*a28cd43dSSascha Wildner     ZSTD_reset_parameters = 2,
488*a28cd43dSSascha Wildner     ZSTD_reset_session_and_parameters = 3
489*a28cd43dSSascha Wildner } ZSTD_ResetDirective;
490*a28cd43dSSascha Wildner 
491*a28cd43dSSascha Wildner /*! ZSTD_CCtx_reset() :
492*a28cd43dSSascha Wildner  *  There are 2 different things that can be reset, independently or jointly :
493*a28cd43dSSascha Wildner  *  - The session : will stop compressing current frame, and make CCtx ready to start a new one.
494*a28cd43dSSascha Wildner  *                  Useful after an error, or to interrupt any ongoing compression.
495*a28cd43dSSascha Wildner  *                  Any internal data not yet flushed is cancelled.
496*a28cd43dSSascha Wildner  *                  Compression parameters and dictionary remain unchanged.
497*a28cd43dSSascha Wildner  *                  They will be used to compress next frame.
498*a28cd43dSSascha Wildner  *                  Resetting session never fails.
499*a28cd43dSSascha Wildner  *  - The parameters : changes all parameters back to "default".
500*a28cd43dSSascha Wildner  *                  This removes any reference to any dictionary too.
501*a28cd43dSSascha Wildner  *                  Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing)
502*a28cd43dSSascha Wildner  *                  otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError())
503*a28cd43dSSascha Wildner  *  - Both : similar to resetting the session, followed by resetting parameters.
504*a28cd43dSSascha Wildner  */
505*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset);
506*a28cd43dSSascha Wildner 
507*a28cd43dSSascha Wildner /*! ZSTD_compress2() :
508*a28cd43dSSascha Wildner  *  Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API.
509*a28cd43dSSascha Wildner  *  ZSTD_compress2() always starts a new frame.
510*a28cd43dSSascha Wildner  *  Should cctx hold data from a previously unfinished frame, everything about it is forgotten.
511*a28cd43dSSascha Wildner  *  - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()
512*a28cd43dSSascha Wildner  *  - The function is always blocking, returns when compression is completed.
513*a28cd43dSSascha Wildner  *  Hint : compression runs faster if `dstCapacity` >=  `ZSTD_compressBound(srcSize)`.
514*a28cd43dSSascha Wildner  * @return : compressed size written into `dst` (<= `dstCapacity),
515*a28cd43dSSascha Wildner  *           or an error code if it fails (which can be tested using ZSTD_isError()).
516*a28cd43dSSascha Wildner  */
517*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx,
518*a28cd43dSSascha Wildner                                    void* dst, size_t dstCapacity,
519*a28cd43dSSascha Wildner                              const void* src, size_t srcSize);
520*a28cd43dSSascha Wildner 
521*a28cd43dSSascha Wildner 
522*a28cd43dSSascha Wildner /***************************************
523*a28cd43dSSascha Wildner *  Advanced decompression API
524*a28cd43dSSascha Wildner ***************************************/
525*a28cd43dSSascha Wildner 
526*a28cd43dSSascha Wildner /* The advanced API pushes parameters one by one into an existing DCtx context.
527*a28cd43dSSascha Wildner  * Parameters are sticky, and remain valid for all following frames
528*a28cd43dSSascha Wildner  * using the same DCtx context.
529*a28cd43dSSascha Wildner  * It's possible to reset parameters to default values using ZSTD_DCtx_reset().
530*a28cd43dSSascha Wildner  * Note : This API is compatible with existing ZSTD_decompressDCtx() and ZSTD_decompressStream().
531*a28cd43dSSascha Wildner  *        Therefore, no new decompression function is necessary.
532*a28cd43dSSascha Wildner  */
533*a28cd43dSSascha Wildner 
534*a28cd43dSSascha Wildner typedef enum {
535*a28cd43dSSascha Wildner 
536*a28cd43dSSascha Wildner     ZSTD_d_windowLogMax=100, /* Select a size limit (in power of 2) beyond which
537*a28cd43dSSascha Wildner                               * the streaming API will refuse to allocate memory buffer
538*a28cd43dSSascha Wildner                               * in order to protect the host from unreasonable memory requirements.
539*a28cd43dSSascha Wildner                               * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode.
540*a28cd43dSSascha Wildner                               * By default, a decompression context accepts window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT).
541*a28cd43dSSascha Wildner                               * Special: value 0 means "use default maximum windowLog". */
542*a28cd43dSSascha Wildner 
543*a28cd43dSSascha Wildner     /* note : additional experimental parameters are also available
544*a28cd43dSSascha Wildner      * within the experimental section of the API.
545*a28cd43dSSascha Wildner      * At the time of this writing, they include :
546*a28cd43dSSascha Wildner      * ZSTD_d_format
547*a28cd43dSSascha Wildner      * ZSTD_d_stableOutBuffer
548*a28cd43dSSascha Wildner      * ZSTD_d_forceIgnoreChecksum
549*a28cd43dSSascha Wildner      * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
550*a28cd43dSSascha Wildner      * note : never ever use experimentalParam? names directly
551*a28cd43dSSascha Wildner      */
552*a28cd43dSSascha Wildner      ZSTD_d_experimentalParam1=1000,
553*a28cd43dSSascha Wildner      ZSTD_d_experimentalParam2=1001,
554*a28cd43dSSascha Wildner      ZSTD_d_experimentalParam3=1002
555*a28cd43dSSascha Wildner 
556*a28cd43dSSascha Wildner } ZSTD_dParameter;
557*a28cd43dSSascha Wildner 
558*a28cd43dSSascha Wildner /*! ZSTD_dParam_getBounds() :
559*a28cd43dSSascha Wildner  *  All parameters must belong to an interval with lower and upper bounds,
560*a28cd43dSSascha Wildner  *  otherwise they will either trigger an error or be automatically clamped.
561*a28cd43dSSascha Wildner  * @return : a structure, ZSTD_bounds, which contains
562*a28cd43dSSascha Wildner  *         - an error status field, which must be tested using ZSTD_isError()
563*a28cd43dSSascha Wildner  *         - both lower and upper bounds, inclusive
564*a28cd43dSSascha Wildner  */
565*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam);
566*a28cd43dSSascha Wildner 
567*a28cd43dSSascha Wildner /*! ZSTD_DCtx_setParameter() :
568*a28cd43dSSascha Wildner  *  Set one compression parameter, selected by enum ZSTD_dParameter.
569*a28cd43dSSascha Wildner  *  All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds().
570*a28cd43dSSascha Wildner  *  Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter).
571*a28cd43dSSascha Wildner  *  Setting a parameter is only possible during frame initialization (before starting decompression).
572*a28cd43dSSascha Wildner  * @return : 0, or an error code (which can be tested using ZSTD_isError()).
573*a28cd43dSSascha Wildner  */
574*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int value);
575*a28cd43dSSascha Wildner 
576*a28cd43dSSascha Wildner /*! ZSTD_DCtx_reset() :
577*a28cd43dSSascha Wildner  *  Return a DCtx to clean state.
578*a28cd43dSSascha Wildner  *  Session and parameters can be reset jointly or separately.
579*a28cd43dSSascha Wildner  *  Parameters can only be reset when no active frame is being decompressed.
580*a28cd43dSSascha Wildner  * @return : 0, or an error code, which can be tested with ZSTD_isError()
581*a28cd43dSSascha Wildner  */
582*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset);
583*a28cd43dSSascha Wildner 
584*a28cd43dSSascha Wildner 
585*a28cd43dSSascha Wildner /****************************
586*a28cd43dSSascha Wildner *  Streaming
587*a28cd43dSSascha Wildner ****************************/
588*a28cd43dSSascha Wildner 
589*a28cd43dSSascha Wildner typedef struct ZSTD_inBuffer_s {
590*a28cd43dSSascha Wildner   const void* src;    /**< start of input buffer */
591*a28cd43dSSascha Wildner   size_t size;        /**< size of input buffer */
592*a28cd43dSSascha Wildner   size_t pos;         /**< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size */
593*a28cd43dSSascha Wildner } ZSTD_inBuffer;
594*a28cd43dSSascha Wildner 
595*a28cd43dSSascha Wildner typedef struct ZSTD_outBuffer_s {
596*a28cd43dSSascha Wildner   void*  dst;         /**< start of output buffer */
597*a28cd43dSSascha Wildner   size_t size;        /**< size of output buffer */
598*a28cd43dSSascha Wildner   size_t pos;         /**< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size */
599*a28cd43dSSascha Wildner } ZSTD_outBuffer;
600*a28cd43dSSascha Wildner 
601*a28cd43dSSascha Wildner 
602*a28cd43dSSascha Wildner 
603*a28cd43dSSascha Wildner /*-***********************************************************************
604*a28cd43dSSascha Wildner *  Streaming compression - HowTo
605*a28cd43dSSascha Wildner *
606*a28cd43dSSascha Wildner *  A ZSTD_CStream object is required to track streaming operation.
607*a28cd43dSSascha Wildner *  Use ZSTD_createCStream() and ZSTD_freeCStream() to create/release resources.
608*a28cd43dSSascha Wildner *  ZSTD_CStream objects can be reused multiple times on consecutive compression operations.
609*a28cd43dSSascha Wildner *  It is recommended to re-use ZSTD_CStream since it will play nicer with system's memory, by re-using already allocated memory.
610*a28cd43dSSascha Wildner *
611*a28cd43dSSascha Wildner *  For parallel execution, use one separate ZSTD_CStream per thread.
612*a28cd43dSSascha Wildner *
613*a28cd43dSSascha Wildner *  note : since v1.3.0, ZSTD_CStream and ZSTD_CCtx are the same thing.
614*a28cd43dSSascha Wildner *
615*a28cd43dSSascha Wildner *  Parameters are sticky : when starting a new compression on the same context,
616*a28cd43dSSascha Wildner *  it will re-use the same sticky parameters as previous compression session.
617*a28cd43dSSascha Wildner *  When in doubt, it's recommended to fully initialize the context before usage.
618*a28cd43dSSascha Wildner *  Use ZSTD_CCtx_reset() to reset the context and ZSTD_CCtx_setParameter(),
619*a28cd43dSSascha Wildner *  ZSTD_CCtx_setPledgedSrcSize(), or ZSTD_CCtx_loadDictionary() and friends to
620*a28cd43dSSascha Wildner *  set more specific parameters, the pledged source size, or load a dictionary.
621*a28cd43dSSascha Wildner *
622*a28cd43dSSascha Wildner *  Use ZSTD_compressStream2() with ZSTD_e_continue as many times as necessary to
623*a28cd43dSSascha Wildner *  consume input stream. The function will automatically update both `pos`
624*a28cd43dSSascha Wildner *  fields within `input` and `output`.
625*a28cd43dSSascha Wildner *  Note that the function may not consume the entire input, for example, because
626*a28cd43dSSascha Wildner *  the output buffer is already full, in which case `input.pos < input.size`.
627*a28cd43dSSascha Wildner *  The caller must check if input has been entirely consumed.
628*a28cd43dSSascha Wildner *  If not, the caller must make some room to receive more compressed data,
629*a28cd43dSSascha Wildner *  and then present again remaining input data.
630*a28cd43dSSascha Wildner *  note: ZSTD_e_continue is guaranteed to make some forward progress when called,
631*a28cd43dSSascha Wildner *        but doesn't guarantee maximal forward progress. This is especially relevant
632*a28cd43dSSascha Wildner *        when compressing with multiple threads. The call won't block if it can
633*a28cd43dSSascha Wildner *        consume some input, but if it can't it will wait for some, but not all,
634*a28cd43dSSascha Wildner *        output to be flushed.
635*a28cd43dSSascha Wildner * @return : provides a minimum amount of data remaining to be flushed from internal buffers
636*a28cd43dSSascha Wildner *           or an error code, which can be tested using ZSTD_isError().
637*a28cd43dSSascha Wildner *
638*a28cd43dSSascha Wildner *  At any moment, it's possible to flush whatever data might remain stuck within internal buffer,
639*a28cd43dSSascha Wildner *  using ZSTD_compressStream2() with ZSTD_e_flush. `output->pos` will be updated.
640*a28cd43dSSascha Wildner *  Note that, if `output->size` is too small, a single invocation with ZSTD_e_flush might not be enough (return code > 0).
641*a28cd43dSSascha Wildner *  In which case, make some room to receive more compressed data, and call again ZSTD_compressStream2() with ZSTD_e_flush.
642*a28cd43dSSascha Wildner *  You must continue calling ZSTD_compressStream2() with ZSTD_e_flush until it returns 0, at which point you can change the
643*a28cd43dSSascha Wildner *  operation.
644*a28cd43dSSascha Wildner *  note: ZSTD_e_flush will flush as much output as possible, meaning when compressing with multiple threads, it will
645*a28cd43dSSascha Wildner *        block until the flush is complete or the output buffer is full.
646*a28cd43dSSascha Wildner *  @return : 0 if internal buffers are entirely flushed,
647*a28cd43dSSascha Wildner *            >0 if some data still present within internal buffer (the value is minimal estimation of remaining size),
648*a28cd43dSSascha Wildner *            or an error code, which can be tested using ZSTD_isError().
649*a28cd43dSSascha Wildner *
650*a28cd43dSSascha Wildner *  Calling ZSTD_compressStream2() with ZSTD_e_end instructs to finish a frame.
651*a28cd43dSSascha Wildner *  It will perform a flush and write frame epilogue.
652*a28cd43dSSascha Wildner *  The epilogue is required for decoders to consider a frame completed.
653*a28cd43dSSascha Wildner *  flush operation is the same, and follows same rules as calling ZSTD_compressStream2() with ZSTD_e_flush.
654*a28cd43dSSascha Wildner *  You must continue calling ZSTD_compressStream2() with ZSTD_e_end until it returns 0, at which point you are free to
655*a28cd43dSSascha Wildner *  start a new frame.
656*a28cd43dSSascha Wildner *  note: ZSTD_e_end will flush as much output as possible, meaning when compressing with multiple threads, it will
657*a28cd43dSSascha Wildner *        block until the flush is complete or the output buffer is full.
658*a28cd43dSSascha Wildner *  @return : 0 if frame fully completed and fully flushed,
659*a28cd43dSSascha Wildner *            >0 if some data still present within internal buffer (the value is minimal estimation of remaining size),
660*a28cd43dSSascha Wildner *            or an error code, which can be tested using ZSTD_isError().
661*a28cd43dSSascha Wildner *
662*a28cd43dSSascha Wildner * *******************************************************************/
663*a28cd43dSSascha Wildner 
664*a28cd43dSSascha Wildner typedef ZSTD_CCtx ZSTD_CStream;  /**< CCtx and CStream are now effectively same object (>= v1.3.0) */
665*a28cd43dSSascha Wildner                                  /* Continue to distinguish them for compatibility with older versions <= v1.2.0 */
666*a28cd43dSSascha Wildner /*===== ZSTD_CStream management functions =====*/
667*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(void);
668*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs);
669*a28cd43dSSascha Wildner 
670*a28cd43dSSascha Wildner /*===== Streaming compression functions =====*/
671*a28cd43dSSascha Wildner typedef enum {
672*a28cd43dSSascha Wildner     ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */
673*a28cd43dSSascha Wildner     ZSTD_e_flush=1,    /* flush any data provided so far,
674*a28cd43dSSascha Wildner                         * it creates (at least) one new block, that can be decoded immediately on reception;
675*a28cd43dSSascha Wildner                         * frame will continue: any future data can still reference previously compressed data, improving compression.
676*a28cd43dSSascha Wildner                         * note : multithreaded compression will block to flush as much output as possible. */
677*a28cd43dSSascha Wildner     ZSTD_e_end=2       /* flush any remaining data _and_ close current frame.
678*a28cd43dSSascha Wildner                         * note that frame is only closed after compressed data is fully flushed (return value == 0).
679*a28cd43dSSascha Wildner                         * After that point, any additional data starts a new frame.
680*a28cd43dSSascha Wildner                         * note : each frame is independent (does not reference any content from previous frame).
681*a28cd43dSSascha Wildner                         : note : multithreaded compression will block to flush as much output as possible. */
682*a28cd43dSSascha Wildner } ZSTD_EndDirective;
683*a28cd43dSSascha Wildner 
684*a28cd43dSSascha Wildner /*! ZSTD_compressStream2() :
685*a28cd43dSSascha Wildner  *  Behaves about the same as ZSTD_compressStream, with additional control on end directive.
686*a28cd43dSSascha Wildner  *  - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()
687*a28cd43dSSascha Wildner  *  - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode)
688*a28cd43dSSascha Wildner  *  - output->pos must be <= dstCapacity, input->pos must be <= srcSize
689*a28cd43dSSascha Wildner  *  - output->pos and input->pos will be updated. They are guaranteed to remain below their respective limit.
690*a28cd43dSSascha Wildner  *  - endOp must be a valid directive
691*a28cd43dSSascha Wildner  *  - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller.
692*a28cd43dSSascha Wildner  *  - When nbWorkers>=1, function is non-blocking : it copies a portion of input, distributes jobs to internal worker threads, flush to output whatever is available,
693*a28cd43dSSascha Wildner  *                                                  and then immediately returns, just indicating that there is some data remaining to be flushed.
694*a28cd43dSSascha Wildner  *                                                  The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte.
695*a28cd43dSSascha Wildner  *  - Exception : if the first call requests a ZSTD_e_end directive and provides enough dstCapacity, the function delegates to ZSTD_compress2() which is always blocking.
696*a28cd43dSSascha Wildner  *  - @return provides a minimum amount of data remaining to be flushed from internal buffers
697*a28cd43dSSascha Wildner  *            or an error code, which can be tested using ZSTD_isError().
698*a28cd43dSSascha Wildner  *            if @return != 0, flush is not fully completed, there is still some data left within internal buffers.
699*a28cd43dSSascha Wildner  *            This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers.
700*a28cd43dSSascha Wildner  *            For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed.
701*a28cd43dSSascha Wildner  *  - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0),
702*a28cd43dSSascha Wildner  *            only ZSTD_e_end or ZSTD_e_flush operations are allowed.
703*a28cd43dSSascha Wildner  *            Before starting a new compression job, or changing compression parameters,
704*a28cd43dSSascha Wildner  *            it is required to fully flush internal buffers.
705*a28cd43dSSascha Wildner  */
706*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
707*a28cd43dSSascha Wildner                                          ZSTD_outBuffer* output,
708*a28cd43dSSascha Wildner                                          ZSTD_inBuffer* input,
709*a28cd43dSSascha Wildner                                          ZSTD_EndDirective endOp);
710*a28cd43dSSascha Wildner 
711*a28cd43dSSascha Wildner 
712*a28cd43dSSascha Wildner /* These buffer sizes are softly recommended.
713*a28cd43dSSascha Wildner  * They are not required : ZSTD_compressStream*() happily accepts any buffer size, for both input and output.
714*a28cd43dSSascha Wildner  * Respecting the recommended size just makes it a bit easier for ZSTD_compressStream*(),
715*a28cd43dSSascha Wildner  * reducing the amount of memory shuffling and buffering, resulting in minor performance savings.
716*a28cd43dSSascha Wildner  *
717*a28cd43dSSascha Wildner  * However, note that these recommendations are from the perspective of a C caller program.
718*a28cd43dSSascha Wildner  * If the streaming interface is invoked from some other language,
719*a28cd43dSSascha Wildner  * especially managed ones such as Java or Go, through a foreign function interface such as jni or cgo,
720*a28cd43dSSascha Wildner  * a major performance rule is to reduce crossing such interface to an absolute minimum.
721*a28cd43dSSascha Wildner  * It's not rare that performance ends being spent more into the interface, rather than compression itself.
722*a28cd43dSSascha Wildner  * In which cases, prefer using large buffers, as large as practical,
723*a28cd43dSSascha Wildner  * for both input and output, to reduce the nb of roundtrips.
724*a28cd43dSSascha Wildner  */
725*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CStreamInSize(void);    /**< recommended size for input buffer */
726*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CStreamOutSize(void);   /**< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block. */
727*a28cd43dSSascha Wildner 
728*a28cd43dSSascha Wildner 
729*a28cd43dSSascha Wildner /* *****************************************************************************
730*a28cd43dSSascha Wildner  * This following is a legacy streaming API.
731*a28cd43dSSascha Wildner  * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2().
732*a28cd43dSSascha Wildner  * It is redundant, but remains fully supported.
733*a28cd43dSSascha Wildner  * Advanced parameters and dictionary compression can only be used through the
734*a28cd43dSSascha Wildner  * new API.
735*a28cd43dSSascha Wildner  ******************************************************************************/
736*a28cd43dSSascha Wildner 
737*a28cd43dSSascha Wildner /*!
738*a28cd43dSSascha Wildner  * Equivalent to:
739*a28cd43dSSascha Wildner  *
740*a28cd43dSSascha Wildner  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
741*a28cd43dSSascha Wildner  *     ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)
742*a28cd43dSSascha Wildner  *     ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);
743*a28cd43dSSascha Wildner  */
744*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel);
745*a28cd43dSSascha Wildner /*!
746*a28cd43dSSascha Wildner  * Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue).
747*a28cd43dSSascha Wildner  * NOTE: The return value is different. ZSTD_compressStream() returns a hint for
748*a28cd43dSSascha Wildner  * the next read size (if non-zero and not an error). ZSTD_compressStream2()
749*a28cd43dSSascha Wildner  * returns the minimum nb of bytes left to flush (if non-zero and not an error).
750*a28cd43dSSascha Wildner  */
751*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input);
752*a28cd43dSSascha Wildner /*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */
753*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output);
754*a28cd43dSSascha Wildner /*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */
755*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output);
756*a28cd43dSSascha Wildner 
757*a28cd43dSSascha Wildner 
758*a28cd43dSSascha Wildner /*-***************************************************************************
759*a28cd43dSSascha Wildner *  Streaming decompression - HowTo
760*a28cd43dSSascha Wildner *
761*a28cd43dSSascha Wildner *  A ZSTD_DStream object is required to track streaming operations.
762*a28cd43dSSascha Wildner *  Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources.
763*a28cd43dSSascha Wildner *  ZSTD_DStream objects can be re-used multiple times.
764*a28cd43dSSascha Wildner *
765*a28cd43dSSascha Wildner *  Use ZSTD_initDStream() to start a new decompression operation.
766*a28cd43dSSascha Wildner * @return : recommended first input size
767*a28cd43dSSascha Wildner *  Alternatively, use advanced API to set specific properties.
768*a28cd43dSSascha Wildner *
769*a28cd43dSSascha Wildner *  Use ZSTD_decompressStream() repetitively to consume your input.
770*a28cd43dSSascha Wildner *  The function will update both `pos` fields.
771*a28cd43dSSascha Wildner *  If `input.pos < input.size`, some input has not been consumed.
772*a28cd43dSSascha Wildner *  It's up to the caller to present again remaining data.
773*a28cd43dSSascha Wildner *  The function tries to flush all data decoded immediately, respecting output buffer size.
774*a28cd43dSSascha Wildner *  If `output.pos < output.size`, decoder has flushed everything it could.
775*a28cd43dSSascha Wildner *  But if `output.pos == output.size`, there might be some data left within internal buffers.,
776*a28cd43dSSascha Wildner *  In which case, call ZSTD_decompressStream() again to flush whatever remains in the buffer.
777*a28cd43dSSascha Wildner *  Note : with no additional input provided, amount of data flushed is necessarily <= ZSTD_BLOCKSIZE_MAX.
778*a28cd43dSSascha Wildner * @return : 0 when a frame is completely decoded and fully flushed,
779*a28cd43dSSascha Wildner *        or an error code, which can be tested using ZSTD_isError(),
780*a28cd43dSSascha Wildner *        or any other value > 0, which means there is still some decoding or flushing to do to complete current frame :
781*a28cd43dSSascha Wildner *                                the return value is a suggested next input size (just a hint for better latency)
782*a28cd43dSSascha Wildner *                                that will never request more than the remaining frame size.
783*a28cd43dSSascha Wildner * *******************************************************************************/
784*a28cd43dSSascha Wildner 
785*a28cd43dSSascha Wildner typedef ZSTD_DCtx ZSTD_DStream;  /**< DCtx and DStream are now effectively same object (>= v1.3.0) */
786*a28cd43dSSascha Wildner                                  /* For compatibility with versions <= v1.2.0, prefer differentiating them. */
787*a28cd43dSSascha Wildner /*===== ZSTD_DStream management functions =====*/
788*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream(void);
789*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds);
790*a28cd43dSSascha Wildner 
791*a28cd43dSSascha Wildner /*===== Streaming decompression functions =====*/
792*a28cd43dSSascha Wildner 
793*a28cd43dSSascha Wildner /* This function is redundant with the advanced API and equivalent to:
794*a28cd43dSSascha Wildner  *
795*a28cd43dSSascha Wildner  *     ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);
796*a28cd43dSSascha Wildner  *     ZSTD_DCtx_refDDict(zds, NULL);
797*a28cd43dSSascha Wildner  */
798*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds);
799*a28cd43dSSascha Wildner 
800*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input);
801*a28cd43dSSascha Wildner 
802*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DStreamInSize(void);    /*!< recommended size for input buffer */
803*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DStreamOutSize(void);   /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */
804*a28cd43dSSascha Wildner 
805*a28cd43dSSascha Wildner 
806*a28cd43dSSascha Wildner /**************************
807*a28cd43dSSascha Wildner *  Simple dictionary API
808*a28cd43dSSascha Wildner ***************************/
809*a28cd43dSSascha Wildner /*! ZSTD_compress_usingDict() :
810*a28cd43dSSascha Wildner  *  Compression at an explicit compression level using a Dictionary.
811*a28cd43dSSascha Wildner  *  A dictionary can be any arbitrary data segment (also called a prefix),
812*a28cd43dSSascha Wildner  *  or a buffer with specified information (see dictBuilder/zdict.h).
813*a28cd43dSSascha Wildner  *  Note : This function loads the dictionary, resulting in significant startup delay.
814*a28cd43dSSascha Wildner  *         It's intended for a dictionary used only once.
815*a28cd43dSSascha Wildner  *  Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */
816*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx,
817*a28cd43dSSascha Wildner                                            void* dst, size_t dstCapacity,
818*a28cd43dSSascha Wildner                                      const void* src, size_t srcSize,
819*a28cd43dSSascha Wildner                                      const void* dict,size_t dictSize,
820*a28cd43dSSascha Wildner                                            int compressionLevel);
821*a28cd43dSSascha Wildner 
822*a28cd43dSSascha Wildner /*! ZSTD_decompress_usingDict() :
823*a28cd43dSSascha Wildner  *  Decompression using a known Dictionary.
824*a28cd43dSSascha Wildner  *  Dictionary must be identical to the one used during compression.
825*a28cd43dSSascha Wildner  *  Note : This function loads the dictionary, resulting in significant startup delay.
826*a28cd43dSSascha Wildner  *         It's intended for a dictionary used only once.
827*a28cd43dSSascha Wildner  *  Note : When `dict == NULL || dictSize < 8` no dictionary is used. */
828*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
829*a28cd43dSSascha Wildner                                              void* dst, size_t dstCapacity,
830*a28cd43dSSascha Wildner                                        const void* src, size_t srcSize,
831*a28cd43dSSascha Wildner                                        const void* dict,size_t dictSize);
832*a28cd43dSSascha Wildner 
833*a28cd43dSSascha Wildner 
834*a28cd43dSSascha Wildner /***********************************
835*a28cd43dSSascha Wildner  *  Bulk processing dictionary API
836*a28cd43dSSascha Wildner  **********************************/
837*a28cd43dSSascha Wildner typedef struct ZSTD_CDict_s ZSTD_CDict;
838*a28cd43dSSascha Wildner 
839*a28cd43dSSascha Wildner /*! ZSTD_createCDict() :
840*a28cd43dSSascha Wildner  *  When compressing multiple messages or blocks using the same dictionary,
841*a28cd43dSSascha Wildner  *  it's recommended to digest the dictionary only once, since it's a costly operation.
842*a28cd43dSSascha Wildner  *  ZSTD_createCDict() will create a state from digesting a dictionary.
843*a28cd43dSSascha Wildner  *  The resulting state can be used for future compression operations with very limited startup cost.
844*a28cd43dSSascha Wildner  *  ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only.
845*a28cd43dSSascha Wildner  * @dictBuffer can be released after ZSTD_CDict creation, because its content is copied within CDict.
846*a28cd43dSSascha Wildner  *  Note 1 : Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate @dictBuffer content.
847*a28cd43dSSascha Wildner  *  Note 2 : A ZSTD_CDict can be created from an empty @dictBuffer,
848*a28cd43dSSascha Wildner  *      in which case the only thing that it transports is the @compressionLevel.
849*a28cd43dSSascha Wildner  *      This can be useful in a pipeline featuring ZSTD_compress_usingCDict() exclusively,
850*a28cd43dSSascha Wildner  *      expecting a ZSTD_CDict parameter with any data, including those without a known dictionary. */
851*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize,
852*a28cd43dSSascha Wildner                                          int compressionLevel);
853*a28cd43dSSascha Wildner 
854*a28cd43dSSascha Wildner /*! ZSTD_freeCDict() :
855*a28cd43dSSascha Wildner  *  Function frees memory allocated by ZSTD_createCDict(). */
856*a28cd43dSSascha Wildner ZSTDLIB_API size_t      ZSTD_freeCDict(ZSTD_CDict* CDict);
857*a28cd43dSSascha Wildner 
858*a28cd43dSSascha Wildner /*! ZSTD_compress_usingCDict() :
859*a28cd43dSSascha Wildner  *  Compression using a digested Dictionary.
860*a28cd43dSSascha Wildner  *  Recommended when same dictionary is used multiple times.
861*a28cd43dSSascha Wildner  *  Note : compression level is _decided at dictionary creation time_,
862*a28cd43dSSascha Wildner  *     and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */
863*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx,
864*a28cd43dSSascha Wildner                                             void* dst, size_t dstCapacity,
865*a28cd43dSSascha Wildner                                       const void* src, size_t srcSize,
866*a28cd43dSSascha Wildner                                       const ZSTD_CDict* cdict);
867*a28cd43dSSascha Wildner 
868*a28cd43dSSascha Wildner 
869*a28cd43dSSascha Wildner typedef struct ZSTD_DDict_s ZSTD_DDict;
870*a28cd43dSSascha Wildner 
871*a28cd43dSSascha Wildner /*! ZSTD_createDDict() :
872*a28cd43dSSascha Wildner  *  Create a digested dictionary, ready to start decompression operation without startup delay.
873*a28cd43dSSascha Wildner  *  dictBuffer can be released after DDict creation, as its content is copied inside DDict. */
874*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize);
875*a28cd43dSSascha Wildner 
876*a28cd43dSSascha Wildner /*! ZSTD_freeDDict() :
877*a28cd43dSSascha Wildner  *  Function frees memory allocated with ZSTD_createDDict() */
878*a28cd43dSSascha Wildner ZSTDLIB_API size_t      ZSTD_freeDDict(ZSTD_DDict* ddict);
879*a28cd43dSSascha Wildner 
880*a28cd43dSSascha Wildner /*! ZSTD_decompress_usingDDict() :
881*a28cd43dSSascha Wildner  *  Decompression using a digested Dictionary.
882*a28cd43dSSascha Wildner  *  Recommended when same dictionary is used multiple times. */
883*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
884*a28cd43dSSascha Wildner                                               void* dst, size_t dstCapacity,
885*a28cd43dSSascha Wildner                                         const void* src, size_t srcSize,
886*a28cd43dSSascha Wildner                                         const ZSTD_DDict* ddict);
887*a28cd43dSSascha Wildner 
888*a28cd43dSSascha Wildner 
889*a28cd43dSSascha Wildner /********************************
890*a28cd43dSSascha Wildner  *  Dictionary helper functions
891*a28cd43dSSascha Wildner  *******************************/
892*a28cd43dSSascha Wildner 
893*a28cd43dSSascha Wildner /*! ZSTD_getDictID_fromDict() :
894*a28cd43dSSascha Wildner  *  Provides the dictID stored within dictionary.
895*a28cd43dSSascha Wildner  *  if @return == 0, the dictionary is not conformant with Zstandard specification.
896*a28cd43dSSascha Wildner  *  It can still be loaded, but as a content-only dictionary. */
897*a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize);
898*a28cd43dSSascha Wildner 
899*a28cd43dSSascha Wildner /*! ZSTD_getDictID_fromDDict() :
900*a28cd43dSSascha Wildner  *  Provides the dictID of the dictionary loaded into `ddict`.
901*a28cd43dSSascha Wildner  *  If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
902*a28cd43dSSascha Wildner  *  Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
903*a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict);
904*a28cd43dSSascha Wildner 
905*a28cd43dSSascha Wildner /*! ZSTD_getDictID_fromFrame() :
906*a28cd43dSSascha Wildner  *  Provides the dictID required to decompressed the frame stored within `src`.
907*a28cd43dSSascha Wildner  *  If @return == 0, the dictID could not be decoded.
908*a28cd43dSSascha Wildner  *  This could for one of the following reasons :
909*a28cd43dSSascha Wildner  *  - The frame does not require a dictionary to be decoded (most common case).
910*a28cd43dSSascha Wildner  *  - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden information.
911*a28cd43dSSascha Wildner  *    Note : this use case also happens when using a non-conformant dictionary.
912*a28cd43dSSascha Wildner  *  - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).
913*a28cd43dSSascha Wildner  *  - This is not a Zstandard frame.
914*a28cd43dSSascha Wildner  *  When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. */
915*a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
916*a28cd43dSSascha Wildner 
917*a28cd43dSSascha Wildner 
918*a28cd43dSSascha Wildner /*******************************************************************************
919*a28cd43dSSascha Wildner  * Advanced dictionary and prefix API
920*a28cd43dSSascha Wildner  *
921*a28cd43dSSascha Wildner  * This API allows dictionaries to be used with ZSTD_compress2(),
922*a28cd43dSSascha Wildner  * ZSTD_compressStream2(), and ZSTD_decompress(). Dictionaries are sticky, and
923*a28cd43dSSascha Wildner  * only reset with the context is reset with ZSTD_reset_parameters or
924*a28cd43dSSascha Wildner  * ZSTD_reset_session_and_parameters. Prefixes are single-use.
925*a28cd43dSSascha Wildner  ******************************************************************************/
926*a28cd43dSSascha Wildner 
927*a28cd43dSSascha Wildner 
928*a28cd43dSSascha Wildner /*! ZSTD_CCtx_loadDictionary() :
929*a28cd43dSSascha Wildner  *  Create an internal CDict from `dict` buffer.
930*a28cd43dSSascha Wildner  *  Decompression will have to use same dictionary.
931*a28cd43dSSascha Wildner  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
932*a28cd43dSSascha Wildner  *  Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary,
933*a28cd43dSSascha Wildner  *           meaning "return to no-dictionary mode".
934*a28cd43dSSascha Wildner  *  Note 1 : Dictionary is sticky, it will be used for all future compressed frames.
935*a28cd43dSSascha Wildner  *           To return to "no-dictionary" situation, load a NULL dictionary (or reset parameters).
936*a28cd43dSSascha Wildner  *  Note 2 : Loading a dictionary involves building tables.
937*a28cd43dSSascha Wildner  *           It's also a CPU consuming operation, with non-negligible impact on latency.
938*a28cd43dSSascha Wildner  *           Tables are dependent on compression parameters, and for this reason,
939*a28cd43dSSascha Wildner  *           compression parameters can no longer be changed after loading a dictionary.
940*a28cd43dSSascha Wildner  *  Note 3 :`dict` content will be copied internally.
941*a28cd43dSSascha Wildner  *           Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead.
942*a28cd43dSSascha Wildner  *           In such a case, dictionary buffer must outlive its users.
943*a28cd43dSSascha Wildner  *  Note 4 : Use ZSTD_CCtx_loadDictionary_advanced()
944*a28cd43dSSascha Wildner  *           to precisely select how dictionary content must be interpreted. */
945*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
946*a28cd43dSSascha Wildner 
947*a28cd43dSSascha Wildner /*! ZSTD_CCtx_refCDict() :
948*a28cd43dSSascha Wildner  *  Reference a prepared dictionary, to be used for all next compressed frames.
949*a28cd43dSSascha Wildner  *  Note that compression parameters are enforced from within CDict,
950*a28cd43dSSascha Wildner  *  and supersede any compression parameter previously set within CCtx.
951*a28cd43dSSascha Wildner  *  The parameters ignored are labled as "superseded-by-cdict" in the ZSTD_cParameter enum docs.
952*a28cd43dSSascha Wildner  *  The ignored parameters will be used again if the CCtx is returned to no-dictionary mode.
953*a28cd43dSSascha Wildner  *  The dictionary will remain valid for future compressed frames using same CCtx.
954*a28cd43dSSascha Wildner  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
955*a28cd43dSSascha Wildner  *  Special : Referencing a NULL CDict means "return to no-dictionary mode".
956*a28cd43dSSascha Wildner  *  Note 1 : Currently, only one dictionary can be managed.
957*a28cd43dSSascha Wildner  *           Referencing a new dictionary effectively "discards" any previous one.
958*a28cd43dSSascha Wildner  *  Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx. */
959*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
960*a28cd43dSSascha Wildner 
961*a28cd43dSSascha Wildner /*! ZSTD_CCtx_refPrefix() :
962*a28cd43dSSascha Wildner  *  Reference a prefix (single-usage dictionary) for next compressed frame.
963*a28cd43dSSascha Wildner  *  A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end).
964*a28cd43dSSascha Wildner  *  Decompression will need same prefix to properly regenerate data.
965*a28cd43dSSascha Wildner  *  Compressing with a prefix is similar in outcome as performing a diff and compressing it,
966*a28cd43dSSascha Wildner  *  but performs much faster, especially during decompression (compression speed is tunable with compression level).
967*a28cd43dSSascha Wildner  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
968*a28cd43dSSascha Wildner  *  Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary
969*a28cd43dSSascha Wildner  *  Note 1 : Prefix buffer is referenced. It **must** outlive compression.
970*a28cd43dSSascha Wildner  *           Its content must remain unmodified during compression.
971*a28cd43dSSascha Wildner  *  Note 2 : If the intention is to diff some large src data blob with some prior version of itself,
972*a28cd43dSSascha Wildner  *           ensure that the window size is large enough to contain the entire source.
973*a28cd43dSSascha Wildner  *           See ZSTD_c_windowLog.
974*a28cd43dSSascha Wildner  *  Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters.
975*a28cd43dSSascha Wildner  *           It's a CPU consuming operation, with non-negligible impact on latency.
976*a28cd43dSSascha Wildner  *           If there is a need to use the same prefix multiple times, consider loadDictionary instead.
977*a28cd43dSSascha Wildner  *  Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dct_rawContent).
978*a28cd43dSSascha Wildner  *           Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation. */
979*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx,
980*a28cd43dSSascha Wildner                                  const void* prefix, size_t prefixSize);
981*a28cd43dSSascha Wildner 
982*a28cd43dSSascha Wildner /*! ZSTD_DCtx_loadDictionary() :
983*a28cd43dSSascha Wildner  *  Create an internal DDict from dict buffer,
984*a28cd43dSSascha Wildner  *  to be used to decompress next frames.
985*a28cd43dSSascha Wildner  *  The dictionary remains valid for all future frames, until explicitly invalidated.
986*a28cd43dSSascha Wildner  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
987*a28cd43dSSascha Wildner  *  Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary,
988*a28cd43dSSascha Wildner  *            meaning "return to no-dictionary mode".
989*a28cd43dSSascha Wildner  *  Note 1 : Loading a dictionary involves building tables,
990*a28cd43dSSascha Wildner  *           which has a non-negligible impact on CPU usage and latency.
991*a28cd43dSSascha Wildner  *           It's recommended to "load once, use many times", to amortize the cost
992*a28cd43dSSascha Wildner  *  Note 2 :`dict` content will be copied internally, so `dict` can be released after loading.
993*a28cd43dSSascha Wildner  *           Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead.
994*a28cd43dSSascha Wildner  *  Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of
995*a28cd43dSSascha Wildner  *           how dictionary content is loaded and interpreted.
996*a28cd43dSSascha Wildner  */
997*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
998*a28cd43dSSascha Wildner 
999*a28cd43dSSascha Wildner /*! ZSTD_DCtx_refDDict() :
1000*a28cd43dSSascha Wildner  *  Reference a prepared dictionary, to be used to decompress next frames.
1001*a28cd43dSSascha Wildner  *  The dictionary remains active for decompression of future frames using same DCtx.
1002*a28cd43dSSascha Wildner  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
1003*a28cd43dSSascha Wildner  *  Note 1 : Currently, only one dictionary can be managed.
1004*a28cd43dSSascha Wildner  *           Referencing a new dictionary effectively "discards" any previous one.
1005*a28cd43dSSascha Wildner  *  Special: referencing a NULL DDict means "return to no-dictionary mode".
1006*a28cd43dSSascha Wildner  *  Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx.
1007*a28cd43dSSascha Wildner  */
1008*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict);
1009*a28cd43dSSascha Wildner 
1010*a28cd43dSSascha Wildner /*! ZSTD_DCtx_refPrefix() :
1011*a28cd43dSSascha Wildner  *  Reference a prefix (single-usage dictionary) to decompress next frame.
1012*a28cd43dSSascha Wildner  *  This is the reverse operation of ZSTD_CCtx_refPrefix(),
1013*a28cd43dSSascha Wildner  *  and must use the same prefix as the one used during compression.
1014*a28cd43dSSascha Wildner  *  Prefix is **only used once**. Reference is discarded at end of frame.
1015*a28cd43dSSascha Wildner  *  End of frame is reached when ZSTD_decompressStream() returns 0.
1016*a28cd43dSSascha Wildner  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
1017*a28cd43dSSascha Wildner  *  Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary
1018*a28cd43dSSascha Wildner  *  Note 2 : Prefix buffer is referenced. It **must** outlive decompression.
1019*a28cd43dSSascha Wildner  *           Prefix buffer must remain unmodified up to the end of frame,
1020*a28cd43dSSascha Wildner  *           reached when ZSTD_decompressStream() returns 0.
1021*a28cd43dSSascha Wildner  *  Note 3 : By default, the prefix is treated as raw content (ZSTD_dct_rawContent).
1022*a28cd43dSSascha Wildner  *           Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section)
1023*a28cd43dSSascha Wildner  *  Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost.
1024*a28cd43dSSascha Wildner  *           A full dictionary is more costly, as it requires building tables.
1025*a28cd43dSSascha Wildner  */
1026*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx,
1027*a28cd43dSSascha Wildner                                  const void* prefix, size_t prefixSize);
1028*a28cd43dSSascha Wildner 
1029*a28cd43dSSascha Wildner /* ===   Memory management   === */
1030*a28cd43dSSascha Wildner 
1031*a28cd43dSSascha Wildner /*! ZSTD_sizeof_*() :
1032*a28cd43dSSascha Wildner  *  These functions give the _current_ memory usage of selected object.
1033*a28cd43dSSascha Wildner  *  Note that object memory usage can evolve (increase or decrease) over time. */
1034*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx);
1035*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx);
1036*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs);
1037*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds);
1038*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict);
1039*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
1040*a28cd43dSSascha Wildner 
1041*a28cd43dSSascha Wildner #endif  /* ZSTD_H_235446 */
1042*a28cd43dSSascha Wildner 
1043*a28cd43dSSascha Wildner 
1044*a28cd43dSSascha Wildner /* **************************************************************************************
1045*a28cd43dSSascha Wildner  *   ADVANCED AND EXPERIMENTAL FUNCTIONS
1046*a28cd43dSSascha Wildner  ****************************************************************************************
1047*a28cd43dSSascha Wildner  * The definitions in the following section are considered experimental.
1048*a28cd43dSSascha Wildner  * They are provided for advanced scenarios.
1049*a28cd43dSSascha Wildner  * They should never be used with a dynamic library, as prototypes may change in the future.
1050*a28cd43dSSascha Wildner  * Use them only in association with static linking.
1051*a28cd43dSSascha Wildner  * ***************************************************************************************/
1052*a28cd43dSSascha Wildner 
1053*a28cd43dSSascha Wildner #if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY)
1054*a28cd43dSSascha Wildner #define ZSTD_H_ZSTD_STATIC_LINKING_ONLY
1055*a28cd43dSSascha Wildner 
1056*a28cd43dSSascha Wildner /****************************************************************************************
1057*a28cd43dSSascha Wildner  *   experimental API (static linking only)
1058*a28cd43dSSascha Wildner  ****************************************************************************************
1059*a28cd43dSSascha Wildner  * The following symbols and constants
1060*a28cd43dSSascha Wildner  * are not planned to join "stable API" status in the near future.
1061*a28cd43dSSascha Wildner  * They can still change in future versions.
1062*a28cd43dSSascha Wildner  * Some of them are planned to remain in the static_only section indefinitely.
1063*a28cd43dSSascha Wildner  * Some of them might be removed in the future (especially when redundant with existing stable functions)
1064*a28cd43dSSascha Wildner  * ***************************************************************************************/
1065*a28cd43dSSascha Wildner 
1066*a28cd43dSSascha Wildner #define ZSTD_FRAMEHEADERSIZE_PREFIX(format) ((format) == ZSTD_f_zstd1 ? 5 : 1)   /* minimum input size required to query frame header size */
1067*a28cd43dSSascha Wildner #define ZSTD_FRAMEHEADERSIZE_MIN(format)    ((format) == ZSTD_f_zstd1 ? 6 : 2)
1068*a28cd43dSSascha Wildner #define ZSTD_FRAMEHEADERSIZE_MAX   18   /* can be useful for static allocation */
1069*a28cd43dSSascha Wildner #define ZSTD_SKIPPABLEHEADERSIZE    8
1070*a28cd43dSSascha Wildner 
1071*a28cd43dSSascha Wildner /* compression parameter bounds */
1072*a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_MAX_32    30
1073*a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_MAX_64    31
1074*a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_MAX     ((int)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64))
1075*a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_MIN       10
1076*a28cd43dSSascha Wildner #define ZSTD_HASHLOG_MAX       ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30)
1077*a28cd43dSSascha Wildner #define ZSTD_HASHLOG_MIN          6
1078*a28cd43dSSascha Wildner #define ZSTD_CHAINLOG_MAX_32     29
1079*a28cd43dSSascha Wildner #define ZSTD_CHAINLOG_MAX_64     30
1080*a28cd43dSSascha Wildner #define ZSTD_CHAINLOG_MAX      ((int)(sizeof(size_t) == 4 ? ZSTD_CHAINLOG_MAX_32 : ZSTD_CHAINLOG_MAX_64))
1081*a28cd43dSSascha Wildner #define ZSTD_CHAINLOG_MIN        ZSTD_HASHLOG_MIN
1082*a28cd43dSSascha Wildner #define ZSTD_SEARCHLOG_MAX      (ZSTD_WINDOWLOG_MAX-1)
1083*a28cd43dSSascha Wildner #define ZSTD_SEARCHLOG_MIN        1
1084*a28cd43dSSascha Wildner #define ZSTD_MINMATCH_MAX         7   /* only for ZSTD_fast, other strategies are limited to 6 */
1085*a28cd43dSSascha Wildner #define ZSTD_MINMATCH_MIN         3   /* only for ZSTD_btopt+, faster strategies are limited to 4 */
1086*a28cd43dSSascha Wildner #define ZSTD_TARGETLENGTH_MAX    ZSTD_BLOCKSIZE_MAX
1087*a28cd43dSSascha Wildner #define ZSTD_TARGETLENGTH_MIN     0   /* note : comparing this constant to an unsigned results in a tautological test */
1088*a28cd43dSSascha Wildner #define ZSTD_STRATEGY_MIN        ZSTD_fast
1089*a28cd43dSSascha Wildner #define ZSTD_STRATEGY_MAX        ZSTD_btultra2
1090*a28cd43dSSascha Wildner 
1091*a28cd43dSSascha Wildner 
1092*a28cd43dSSascha Wildner #define ZSTD_OVERLAPLOG_MIN       0
1093*a28cd43dSSascha Wildner #define ZSTD_OVERLAPLOG_MAX       9
1094*a28cd43dSSascha Wildner 
1095*a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_LIMIT_DEFAULT 27   /* by default, the streaming decoder will refuse any frame
1096*a28cd43dSSascha Wildner                                            * requiring larger than (1<<ZSTD_WINDOWLOG_LIMIT_DEFAULT) window size,
1097*a28cd43dSSascha Wildner                                            * to preserve host's memory from unreasonable requirements.
1098*a28cd43dSSascha Wildner                                            * This limit can be overridden using ZSTD_DCtx_setParameter(,ZSTD_d_windowLogMax,).
1099*a28cd43dSSascha Wildner                                            * The limit does not apply for one-pass decoders (such as ZSTD_decompress()), since no additional memory is allocated */
1100*a28cd43dSSascha Wildner 
1101*a28cd43dSSascha Wildner 
1102*a28cd43dSSascha Wildner /* LDM parameter bounds */
1103*a28cd43dSSascha Wildner #define ZSTD_LDM_HASHLOG_MIN      ZSTD_HASHLOG_MIN
1104*a28cd43dSSascha Wildner #define ZSTD_LDM_HASHLOG_MAX      ZSTD_HASHLOG_MAX
1105*a28cd43dSSascha Wildner #define ZSTD_LDM_MINMATCH_MIN        4
1106*a28cd43dSSascha Wildner #define ZSTD_LDM_MINMATCH_MAX     4096
1107*a28cd43dSSascha Wildner #define ZSTD_LDM_BUCKETSIZELOG_MIN   1
1108*a28cd43dSSascha Wildner #define ZSTD_LDM_BUCKETSIZELOG_MAX   8
1109*a28cd43dSSascha Wildner #define ZSTD_LDM_HASHRATELOG_MIN     0
1110*a28cd43dSSascha Wildner #define ZSTD_LDM_HASHRATELOG_MAX (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN)
1111*a28cd43dSSascha Wildner 
1112*a28cd43dSSascha Wildner /* Advanced parameter bounds */
1113*a28cd43dSSascha Wildner #define ZSTD_TARGETCBLOCKSIZE_MIN   64
1114*a28cd43dSSascha Wildner #define ZSTD_TARGETCBLOCKSIZE_MAX   ZSTD_BLOCKSIZE_MAX
1115*a28cd43dSSascha Wildner #define ZSTD_SRCSIZEHINT_MIN        0
1116*a28cd43dSSascha Wildner #define ZSTD_SRCSIZEHINT_MAX        INT_MAX
1117*a28cd43dSSascha Wildner 
1118*a28cd43dSSascha Wildner /* internal */
1119*a28cd43dSSascha Wildner #define ZSTD_HASHLOG3_MAX           17
1120*a28cd43dSSascha Wildner 
1121*a28cd43dSSascha Wildner 
1122*a28cd43dSSascha Wildner /* ---  Advanced types  --- */
1123*a28cd43dSSascha Wildner 
1124*a28cd43dSSascha Wildner typedef struct ZSTD_CCtx_params_s ZSTD_CCtx_params;
1125*a28cd43dSSascha Wildner 
1126*a28cd43dSSascha Wildner typedef struct {
1127*a28cd43dSSascha Wildner     unsigned int offset;      /* The offset of the match. (NOT the same as the offset code)
1128*a28cd43dSSascha Wildner                                * If offset == 0 and matchLength == 0, this sequence represents the last
1129*a28cd43dSSascha Wildner                                * literals in the block of litLength size.
1130*a28cd43dSSascha Wildner                                */
1131*a28cd43dSSascha Wildner 
1132*a28cd43dSSascha Wildner     unsigned int litLength;   /* Literal length of the sequence. */
1133*a28cd43dSSascha Wildner     unsigned int matchLength; /* Match length of the sequence. */
1134*a28cd43dSSascha Wildner 
1135*a28cd43dSSascha Wildner                               /* Note: Users of this API may provide a sequence with matchLength == litLength == offset == 0.
1136*a28cd43dSSascha Wildner                                * In this case, we will treat the sequence as a marker for a block boundary.
1137*a28cd43dSSascha Wildner                                */
1138*a28cd43dSSascha Wildner 
1139*a28cd43dSSascha Wildner     unsigned int rep;         /* Represents which repeat offset is represented by the field 'offset'.
1140*a28cd43dSSascha Wildner                                * Ranges from [0, 3].
1141*a28cd43dSSascha Wildner                                *
1142*a28cd43dSSascha Wildner                                * Repeat offsets are essentially previous offsets from previous sequences sorted in
1143*a28cd43dSSascha Wildner                                * recency order. For more detail, see doc/zstd_compression_format.md
1144*a28cd43dSSascha Wildner                                *
1145*a28cd43dSSascha Wildner                                * If rep == 0, then 'offset' does not contain a repeat offset.
1146*a28cd43dSSascha Wildner                                * If rep > 0:
1147*a28cd43dSSascha Wildner                                *  If litLength != 0:
1148*a28cd43dSSascha Wildner                                *      rep == 1 --> offset == repeat_offset_1
1149*a28cd43dSSascha Wildner                                *      rep == 2 --> offset == repeat_offset_2
1150*a28cd43dSSascha Wildner                                *      rep == 3 --> offset == repeat_offset_3
1151*a28cd43dSSascha Wildner                                *  If litLength == 0:
1152*a28cd43dSSascha Wildner                                *      rep == 1 --> offset == repeat_offset_2
1153*a28cd43dSSascha Wildner                                *      rep == 2 --> offset == repeat_offset_3
1154*a28cd43dSSascha Wildner                                *      rep == 3 --> offset == repeat_offset_1 - 1
1155*a28cd43dSSascha Wildner                                *
1156*a28cd43dSSascha Wildner                                * Note: This field is optional. ZSTD_generateSequences() will calculate the value of
1157*a28cd43dSSascha Wildner                                * 'rep', but repeat offsets do not necessarily need to be calculated from an external
1158*a28cd43dSSascha Wildner                                * sequence provider's perspective. For example, ZSTD_compressSequences() does not
1159*a28cd43dSSascha Wildner                                * use this 'rep' field at all (as of now).
1160*a28cd43dSSascha Wildner                                */
1161*a28cd43dSSascha Wildner } ZSTD_Sequence;
1162*a28cd43dSSascha Wildner 
1163*a28cd43dSSascha Wildner typedef struct {
1164*a28cd43dSSascha Wildner     unsigned windowLog;       /**< largest match distance : larger == more compression, more memory needed during decompression */
1165*a28cd43dSSascha Wildner     unsigned chainLog;        /**< fully searched segment : larger == more compression, slower, more memory (useless for fast) */
1166*a28cd43dSSascha Wildner     unsigned hashLog;         /**< dispatch table : larger == faster, more memory */
1167*a28cd43dSSascha Wildner     unsigned searchLog;       /**< nb of searches : larger == more compression, slower */
1168*a28cd43dSSascha Wildner     unsigned minMatch;        /**< match length searched : larger == faster decompression, sometimes less compression */
1169*a28cd43dSSascha Wildner     unsigned targetLength;    /**< acceptable match size for optimal parser (only) : larger == more compression, slower */
1170*a28cd43dSSascha Wildner     ZSTD_strategy strategy;   /**< see ZSTD_strategy definition above */
1171*a28cd43dSSascha Wildner } ZSTD_compressionParameters;
1172*a28cd43dSSascha Wildner 
1173*a28cd43dSSascha Wildner typedef struct {
1174*a28cd43dSSascha Wildner     int contentSizeFlag; /**< 1: content size will be in frame header (when known) */
1175*a28cd43dSSascha Wildner     int checksumFlag;    /**< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection */
1176*a28cd43dSSascha Wildner     int noDictIDFlag;    /**< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression) */
1177*a28cd43dSSascha Wildner } ZSTD_frameParameters;
1178*a28cd43dSSascha Wildner 
1179*a28cd43dSSascha Wildner typedef struct {
1180*a28cd43dSSascha Wildner     ZSTD_compressionParameters cParams;
1181*a28cd43dSSascha Wildner     ZSTD_frameParameters fParams;
1182*a28cd43dSSascha Wildner } ZSTD_parameters;
1183*a28cd43dSSascha Wildner 
1184*a28cd43dSSascha Wildner typedef enum {
1185*a28cd43dSSascha Wildner     ZSTD_dct_auto = 0,       /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */
1186*a28cd43dSSascha Wildner     ZSTD_dct_rawContent = 1, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */
1187*a28cd43dSSascha Wildner     ZSTD_dct_fullDict = 2    /* refuses to load a dictionary if it does not respect Zstandard's specification, starting with ZSTD_MAGIC_DICTIONARY */
1188*a28cd43dSSascha Wildner } ZSTD_dictContentType_e;
1189*a28cd43dSSascha Wildner 
1190*a28cd43dSSascha Wildner typedef enum {
1191*a28cd43dSSascha Wildner     ZSTD_dlm_byCopy = 0,  /**< Copy dictionary content internally */
1192*a28cd43dSSascha Wildner     ZSTD_dlm_byRef = 1    /**< Reference dictionary content -- the dictionary buffer must outlive its users. */
1193*a28cd43dSSascha Wildner } ZSTD_dictLoadMethod_e;
1194*a28cd43dSSascha Wildner 
1195*a28cd43dSSascha Wildner typedef enum {
1196*a28cd43dSSascha Wildner     ZSTD_f_zstd1 = 0,           /* zstd frame format, specified in zstd_compression_format.md (default) */
1197*a28cd43dSSascha Wildner     ZSTD_f_zstd1_magicless = 1  /* Variant of zstd frame format, without initial 4-bytes magic number.
1198*a28cd43dSSascha Wildner                                  * Useful to save 4 bytes per generated frame.
1199*a28cd43dSSascha Wildner                                  * Decoder cannot recognise automatically this format, requiring this instruction. */
1200*a28cd43dSSascha Wildner } ZSTD_format_e;
1201*a28cd43dSSascha Wildner 
1202*a28cd43dSSascha Wildner typedef enum {
1203*a28cd43dSSascha Wildner     /* Note: this enum controls ZSTD_d_forceIgnoreChecksum */
1204*a28cd43dSSascha Wildner     ZSTD_d_validateChecksum = 0,
1205*a28cd43dSSascha Wildner     ZSTD_d_ignoreChecksum = 1
1206*a28cd43dSSascha Wildner } ZSTD_forceIgnoreChecksum_e;
1207*a28cd43dSSascha Wildner 
1208*a28cd43dSSascha Wildner typedef enum {
1209*a28cd43dSSascha Wildner     /* Note: this enum and the behavior it controls are effectively internal
1210*a28cd43dSSascha Wildner      * implementation details of the compressor. They are expected to continue
1211*a28cd43dSSascha Wildner      * to evolve and should be considered only in the context of extremely
1212*a28cd43dSSascha Wildner      * advanced performance tuning.
1213*a28cd43dSSascha Wildner      *
1214*a28cd43dSSascha Wildner      * Zstd currently supports the use of a CDict in three ways:
1215*a28cd43dSSascha Wildner      *
1216*a28cd43dSSascha Wildner      * - The contents of the CDict can be copied into the working context. This
1217*a28cd43dSSascha Wildner      *   means that the compression can search both the dictionary and input
1218*a28cd43dSSascha Wildner      *   while operating on a single set of internal tables. This makes
1219*a28cd43dSSascha Wildner      *   the compression faster per-byte of input. However, the initial copy of
1220*a28cd43dSSascha Wildner      *   the CDict's tables incurs a fixed cost at the beginning of the
1221*a28cd43dSSascha Wildner      *   compression. For small compressions (< 8 KB), that copy can dominate
1222*a28cd43dSSascha Wildner      *   the cost of the compression.
1223*a28cd43dSSascha Wildner      *
1224*a28cd43dSSascha Wildner      * - The CDict's tables can be used in-place. In this model, compression is
1225*a28cd43dSSascha Wildner      *   slower per input byte, because the compressor has to search two sets of
1226*a28cd43dSSascha Wildner      *   tables. However, this model incurs no start-up cost (as long as the
1227*a28cd43dSSascha Wildner      *   working context's tables can be reused). For small inputs, this can be
1228*a28cd43dSSascha Wildner      *   faster than copying the CDict's tables.
1229*a28cd43dSSascha Wildner      *
1230*a28cd43dSSascha Wildner      * - The CDict's tables are not used at all, and instead we use the working
1231*a28cd43dSSascha Wildner      *   context alone to reload the dictionary and use params based on the source
1232*a28cd43dSSascha Wildner      *   size. See ZSTD_compress_insertDictionary() and ZSTD_compress_usingDict().
1233*a28cd43dSSascha Wildner      *   This method is effective when the dictionary sizes are very small relative
1234*a28cd43dSSascha Wildner      *   to the input size, and the input size is fairly large to begin with.
1235*a28cd43dSSascha Wildner      *
1236*a28cd43dSSascha Wildner      * Zstd has a simple internal heuristic that selects which strategy to use
1237*a28cd43dSSascha Wildner      * at the beginning of a compression. However, if experimentation shows that
1238*a28cd43dSSascha Wildner      * Zstd is making poor choices, it is possible to override that choice with
1239*a28cd43dSSascha Wildner      * this enum.
1240*a28cd43dSSascha Wildner      */
1241*a28cd43dSSascha Wildner     ZSTD_dictDefaultAttach = 0, /* Use the default heuristic. */
1242*a28cd43dSSascha Wildner     ZSTD_dictForceAttach   = 1, /* Never copy the dictionary. */
1243*a28cd43dSSascha Wildner     ZSTD_dictForceCopy     = 2, /* Always copy the dictionary. */
1244*a28cd43dSSascha Wildner     ZSTD_dictForceLoad     = 3  /* Always reload the dictionary */
1245*a28cd43dSSascha Wildner } ZSTD_dictAttachPref_e;
1246*a28cd43dSSascha Wildner 
1247*a28cd43dSSascha Wildner typedef enum {
1248*a28cd43dSSascha Wildner   ZSTD_lcm_auto = 0,          /**< Automatically determine the compression mode based on the compression level.
1249*a28cd43dSSascha Wildner                                *   Negative compression levels will be uncompressed, and positive compression
1250*a28cd43dSSascha Wildner                                *   levels will be compressed. */
1251*a28cd43dSSascha Wildner   ZSTD_lcm_huffman = 1,       /**< Always attempt Huffman compression. Uncompressed literals will still be
1252*a28cd43dSSascha Wildner                                *   emitted if Huffman compression is not profitable. */
1253*a28cd43dSSascha Wildner   ZSTD_lcm_uncompressed = 2   /**< Always emit uncompressed literals. */
1254*a28cd43dSSascha Wildner } ZSTD_literalCompressionMode_e;
1255*a28cd43dSSascha Wildner 
1256*a28cd43dSSascha Wildner 
1257*a28cd43dSSascha Wildner /***************************************
1258*a28cd43dSSascha Wildner *  Frame size functions
1259*a28cd43dSSascha Wildner ***************************************/
1260*a28cd43dSSascha Wildner 
1261*a28cd43dSSascha Wildner /*! ZSTD_findDecompressedSize() :
1262*a28cd43dSSascha Wildner  *  `src` should point to the start of a series of ZSTD encoded and/or skippable frames
1263*a28cd43dSSascha Wildner  *  `srcSize` must be the _exact_ size of this series
1264*a28cd43dSSascha Wildner  *       (i.e. there should be a frame boundary at `src + srcSize`)
1265*a28cd43dSSascha Wildner  *  @return : - decompressed size of all data in all successive frames
1266*a28cd43dSSascha Wildner  *            - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN
1267*a28cd43dSSascha Wildner  *            - if an error occurred: ZSTD_CONTENTSIZE_ERROR
1268*a28cd43dSSascha Wildner  *
1269*a28cd43dSSascha Wildner  *   note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode.
1270*a28cd43dSSascha Wildner  *            When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size.
1271*a28cd43dSSascha Wildner  *            In which case, it's necessary to use streaming mode to decompress data.
1272*a28cd43dSSascha Wildner  *   note 2 : decompressed size is always present when compression is done with ZSTD_compress()
1273*a28cd43dSSascha Wildner  *   note 3 : decompressed size can be very large (64-bits value),
1274*a28cd43dSSascha Wildner  *            potentially larger than what local system can handle as a single memory segment.
1275*a28cd43dSSascha Wildner  *            In which case, it's necessary to use streaming mode to decompress data.
1276*a28cd43dSSascha Wildner  *   note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified.
1277*a28cd43dSSascha Wildner  *            Always ensure result fits within application's authorized limits.
1278*a28cd43dSSascha Wildner  *            Each application can set its own limits.
1279*a28cd43dSSascha Wildner  *   note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to
1280*a28cd43dSSascha Wildner  *            read each contained frame header.  This is fast as most of the data is skipped,
1281*a28cd43dSSascha Wildner  *            however it does mean that all frame data must be present and valid. */
1282*a28cd43dSSascha Wildner ZSTDLIB_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize);
1283*a28cd43dSSascha Wildner 
1284*a28cd43dSSascha Wildner /*! ZSTD_decompressBound() :
1285*a28cd43dSSascha Wildner  *  `src` should point to the start of a series of ZSTD encoded and/or skippable frames
1286*a28cd43dSSascha Wildner  *  `srcSize` must be the _exact_ size of this series
1287*a28cd43dSSascha Wildner  *       (i.e. there should be a frame boundary at `src + srcSize`)
1288*a28cd43dSSascha Wildner  *  @return : - upper-bound for the decompressed size of all data in all successive frames
1289*a28cd43dSSascha Wildner  *            - if an error occured: ZSTD_CONTENTSIZE_ERROR
1290*a28cd43dSSascha Wildner  *
1291*a28cd43dSSascha Wildner  *  note 1  : an error can occur if `src` contains an invalid or incorrectly formatted frame.
1292*a28cd43dSSascha Wildner  *  note 2  : the upper-bound is exact when the decompressed size field is available in every ZSTD encoded frame of `src`.
1293*a28cd43dSSascha Wildner  *            in this case, `ZSTD_findDecompressedSize` and `ZSTD_decompressBound` return the same value.
1294*a28cd43dSSascha Wildner  *  note 3  : when the decompressed size field isn't available, the upper-bound for that frame is calculated by:
1295*a28cd43dSSascha Wildner  *              upper-bound = # blocks * min(128 KB, Window_Size)
1296*a28cd43dSSascha Wildner  */
1297*a28cd43dSSascha Wildner ZSTDLIB_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize);
1298*a28cd43dSSascha Wildner 
1299*a28cd43dSSascha Wildner /*! ZSTD_frameHeaderSize() :
1300*a28cd43dSSascha Wildner  *  srcSize must be >= ZSTD_FRAMEHEADERSIZE_PREFIX.
1301*a28cd43dSSascha Wildner  * @return : size of the Frame Header,
1302*a28cd43dSSascha Wildner  *           or an error code (if srcSize is too small) */
1303*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
1304*a28cd43dSSascha Wildner 
1305*a28cd43dSSascha Wildner typedef enum {
1306*a28cd43dSSascha Wildner   ZSTD_sf_noBlockDelimiters = 0,         /* Representation of ZSTD_Sequence has no block delimiters, sequences only */
1307*a28cd43dSSascha Wildner   ZSTD_sf_explicitBlockDelimiters = 1    /* Representation of ZSTD_Sequence contains explicit block delimiters */
1308*a28cd43dSSascha Wildner } ZSTD_sequenceFormat_e;
1309*a28cd43dSSascha Wildner 
1310*a28cd43dSSascha Wildner /*! ZSTD_generateSequences() :
1311*a28cd43dSSascha Wildner  * Generate sequences using ZSTD_compress2, given a source buffer.
1312*a28cd43dSSascha Wildner  *
1313*a28cd43dSSascha Wildner  * Each block will end with a dummy sequence
1314*a28cd43dSSascha Wildner  * with offset == 0, matchLength == 0, and litLength == length of last literals.
1315*a28cd43dSSascha Wildner  * litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0)
1316*a28cd43dSSascha Wildner  * simply acts as a block delimiter.
1317*a28cd43dSSascha Wildner  *
1318*a28cd43dSSascha Wildner  * zc can be used to insert custom compression params.
1319*a28cd43dSSascha Wildner  * This function invokes ZSTD_compress2
1320*a28cd43dSSascha Wildner  *
1321*a28cd43dSSascha Wildner  * The output of this function can be fed into ZSTD_compressSequences() with CCtx
1322*a28cd43dSSascha Wildner  * setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters
1323*a28cd43dSSascha Wildner  * @return : number of sequences generated
1324*a28cd43dSSascha Wildner  */
1325*a28cd43dSSascha Wildner 
1326*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_generateSequences(ZSTD_CCtx* zc, ZSTD_Sequence* outSeqs,
1327*a28cd43dSSascha Wildner                                           size_t outSeqsSize, const void* src, size_t srcSize);
1328*a28cd43dSSascha Wildner 
1329*a28cd43dSSascha Wildner /*! ZSTD_mergeBlockDelimiters() :
1330*a28cd43dSSascha Wildner  * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals
1331*a28cd43dSSascha Wildner  * by merging them into into the literals of the next sequence.
1332*a28cd43dSSascha Wildner  *
1333*a28cd43dSSascha Wildner  * As such, the final generated result has no explicit representation of block boundaries,
1334*a28cd43dSSascha Wildner  * and the final last literals segment is not represented in the sequences.
1335*a28cd43dSSascha Wildner  *
1336*a28cd43dSSascha Wildner  * The output of this function can be fed into ZSTD_compressSequences() with CCtx
1337*a28cd43dSSascha Wildner  * setting of ZSTD_c_blockDelimiters as ZSTD_sf_noBlockDelimiters
1338*a28cd43dSSascha Wildner  * @return : number of sequences left after merging
1339*a28cd43dSSascha Wildner  */
1340*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize);
1341*a28cd43dSSascha Wildner 
1342*a28cd43dSSascha Wildner /*! ZSTD_compressSequences() :
1343*a28cd43dSSascha Wildner  * Compress an array of ZSTD_Sequence, generated from the original source buffer, into dst.
1344*a28cd43dSSascha Wildner  * If a dictionary is included, then the cctx should reference the dict. (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.)
1345*a28cd43dSSascha Wildner  * The entire source is compressed into a single frame.
1346*a28cd43dSSascha Wildner  *
1347*a28cd43dSSascha Wildner  * The compression behavior changes based on cctx params. In particular:
1348*a28cd43dSSascha Wildner  *    If ZSTD_c_blockDelimiters == ZSTD_sf_noBlockDelimiters, the array of ZSTD_Sequence is expected to contain
1349*a28cd43dSSascha Wildner  *    no block delimiters (defined in ZSTD_Sequence). Block boundaries are roughly determined based on
1350*a28cd43dSSascha Wildner  *    the block size derived from the cctx, and sequences may be split. This is the default setting.
1351*a28cd43dSSascha Wildner  *
1352*a28cd43dSSascha Wildner  *    If ZSTD_c_blockDelimiters == ZSTD_sf_explicitBlockDelimiters, the array of ZSTD_Sequence is expected to contain
1353*a28cd43dSSascha Wildner  *    block delimiters (defined in ZSTD_Sequence). Behavior is undefined if no block delimiters are provided.
1354*a28cd43dSSascha Wildner  *
1355*a28cd43dSSascha Wildner  *    If ZSTD_c_validateSequences == 0, this function will blindly accept the sequences provided. Invalid sequences cause undefined
1356*a28cd43dSSascha Wildner  *    behavior. If ZSTD_c_validateSequences == 1, then if sequence is invalid (see doc/zstd_compression_format.md for
1357*a28cd43dSSascha Wildner  *    specifics regarding offset/matchlength requirements) then the function will bail out and return an error.
1358*a28cd43dSSascha Wildner  *
1359*a28cd43dSSascha Wildner  *    In addition to the two adjustable experimental params, there are other important cctx params.
1360*a28cd43dSSascha Wildner  *    - ZSTD_c_minMatch MUST be set as less than or equal to the smallest match generated by the match finder. It has a minimum value of ZSTD_MINMATCH_MIN.
1361*a28cd43dSSascha Wildner  *    - ZSTD_c_compressionLevel accordingly adjusts the strength of the entropy coder, as it would in typical compression.
1362*a28cd43dSSascha Wildner  *    - ZSTD_c_windowLog affects offset validation: this function will return an error at higher debug levels if a provided offset
1363*a28cd43dSSascha Wildner  *      is larger than what the spec allows for a given window log and dictionary (if present). See: doc/zstd_compression_format.md
1364*a28cd43dSSascha Wildner  *
1365*a28cd43dSSascha Wildner  * Note: Repcodes are, as of now, always re-calculated within this function, so ZSTD_Sequence::rep is unused.
1366*a28cd43dSSascha Wildner  * Note 2: Once we integrate ability to ingest repcodes, the explicit block delims mode must respect those repcodes exactly,
1367*a28cd43dSSascha Wildner  *         and cannot emit an RLE block that disagrees with the repcode history
1368*a28cd43dSSascha Wildner  * @return : final compressed size or a ZSTD error.
1369*a28cd43dSSascha Wildner  */
1370*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressSequences(ZSTD_CCtx* const cctx, void* dst, size_t dstSize,
1371*a28cd43dSSascha Wildner                                   const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
1372*a28cd43dSSascha Wildner                                   const void* src, size_t srcSize);
1373*a28cd43dSSascha Wildner 
1374*a28cd43dSSascha Wildner 
1375*a28cd43dSSascha Wildner /***************************************
1376*a28cd43dSSascha Wildner *  Memory management
1377*a28cd43dSSascha Wildner ***************************************/
1378*a28cd43dSSascha Wildner 
1379*a28cd43dSSascha Wildner /*! ZSTD_estimate*() :
1380*a28cd43dSSascha Wildner  *  These functions make it possible to estimate memory usage
1381*a28cd43dSSascha Wildner  *  of a future {D,C}Ctx, before its creation.
1382*a28cd43dSSascha Wildner  *
1383*a28cd43dSSascha Wildner  *  ZSTD_estimateCCtxSize() will provide a memory budget large enough
1384*a28cd43dSSascha Wildner  *  for any compression level up to selected one.
1385*a28cd43dSSascha Wildner  *  Note : Unlike ZSTD_estimateCStreamSize*(), this estimate
1386*a28cd43dSSascha Wildner  *         does not include space for a window buffer.
1387*a28cd43dSSascha Wildner  *         Therefore, the estimation is only guaranteed for single-shot compressions, not streaming.
1388*a28cd43dSSascha Wildner  *  The estimate will assume the input may be arbitrarily large,
1389*a28cd43dSSascha Wildner  *  which is the worst case.
1390*a28cd43dSSascha Wildner  *
1391*a28cd43dSSascha Wildner  *  When srcSize can be bound by a known and rather "small" value,
1392*a28cd43dSSascha Wildner  *  this fact can be used to provide a tighter estimation
1393*a28cd43dSSascha Wildner  *  because the CCtx compression context will need less memory.
1394*a28cd43dSSascha Wildner  *  This tighter estimation can be provided by more advanced functions
1395*a28cd43dSSascha Wildner  *  ZSTD_estimateCCtxSize_usingCParams(), which can be used in tandem with ZSTD_getCParams(),
1396*a28cd43dSSascha Wildner  *  and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter().
1397*a28cd43dSSascha Wildner  *  Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits.
1398*a28cd43dSSascha Wildner  *
1399*a28cd43dSSascha Wildner  *  Note 2 : only single-threaded compression is supported.
1400*a28cd43dSSascha Wildner  *  ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.
1401*a28cd43dSSascha Wildner  */
1402*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCCtxSize(int compressionLevel);
1403*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams);
1404*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params);
1405*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void);
1406*a28cd43dSSascha Wildner 
1407*a28cd43dSSascha Wildner /*! ZSTD_estimateCStreamSize() :
1408*a28cd43dSSascha Wildner  *  ZSTD_estimateCStreamSize() will provide a budget large enough for any compression level up to selected one.
1409*a28cd43dSSascha Wildner  *  It will also consider src size to be arbitrarily "large", which is worst case.
1410*a28cd43dSSascha Wildner  *  If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation.
1411*a28cd43dSSascha Wildner  *  ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel.
1412*a28cd43dSSascha Wildner  *  ZSTD_estimateCStreamSize_usingCCtxParams() can be used in tandem with ZSTD_CCtxParams_setParameter(). Only single-threaded compression is supported. This function will return an error code if ZSTD_c_nbWorkers is >= 1.
1413*a28cd43dSSascha Wildner  *  Note : CStream size estimation is only correct for single-threaded compression.
1414*a28cd43dSSascha Wildner  *  ZSTD_DStream memory budget depends on window Size.
1415*a28cd43dSSascha Wildner  *  This information can be passed manually, using ZSTD_estimateDStreamSize,
1416*a28cd43dSSascha Wildner  *  or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame();
1417*a28cd43dSSascha Wildner  *  Note : if streaming is init with function ZSTD_init?Stream_usingDict(),
1418*a28cd43dSSascha Wildner  *         an internal ?Dict will be created, which additional size is not estimated here.
1419*a28cd43dSSascha Wildner  *         In this case, get total size by adding ZSTD_estimate?DictSize */
1420*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCStreamSize(int compressionLevel);
1421*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams);
1422*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params);
1423*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateDStreamSize(size_t windowSize);
1424*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize);
1425*a28cd43dSSascha Wildner 
1426*a28cd43dSSascha Wildner /*! ZSTD_estimate?DictSize() :
1427*a28cd43dSSascha Wildner  *  ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict().
1428*a28cd43dSSascha Wildner  *  ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced().
1429*a28cd43dSSascha Wildner  *  Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller.
1430*a28cd43dSSascha Wildner  */
1431*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel);
1432*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod);
1433*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod);
1434*a28cd43dSSascha Wildner 
1435*a28cd43dSSascha Wildner /*! ZSTD_initStatic*() :
1436*a28cd43dSSascha Wildner  *  Initialize an object using a pre-allocated fixed-size buffer.
1437*a28cd43dSSascha Wildner  *  workspace: The memory area to emplace the object into.
1438*a28cd43dSSascha Wildner  *             Provided pointer *must be 8-bytes aligned*.
1439*a28cd43dSSascha Wildner  *             Buffer must outlive object.
1440*a28cd43dSSascha Wildner  *  workspaceSize: Use ZSTD_estimate*Size() to determine
1441*a28cd43dSSascha Wildner  *                 how large workspace must be to support target scenario.
1442*a28cd43dSSascha Wildner  * @return : pointer to object (same address as workspace, just different type),
1443*a28cd43dSSascha Wildner  *           or NULL if error (size too small, incorrect alignment, etc.)
1444*a28cd43dSSascha Wildner  *  Note : zstd will never resize nor malloc() when using a static buffer.
1445*a28cd43dSSascha Wildner  *         If the object requires more memory than available,
1446*a28cd43dSSascha Wildner  *         zstd will just error out (typically ZSTD_error_memory_allocation).
1447*a28cd43dSSascha Wildner  *  Note 2 : there is no corresponding "free" function.
1448*a28cd43dSSascha Wildner  *           Since workspace is allocated externally, it must be freed externally too.
1449*a28cd43dSSascha Wildner  *  Note 3 : cParams : use ZSTD_getCParams() to convert a compression level
1450*a28cd43dSSascha Wildner  *           into its associated cParams.
1451*a28cd43dSSascha Wildner  *  Limitation 1 : currently not compatible with internal dictionary creation, triggered by
1452*a28cd43dSSascha Wildner  *                 ZSTD_CCtx_loadDictionary(), ZSTD_initCStream_usingDict() or ZSTD_initDStream_usingDict().
1453*a28cd43dSSascha Wildner  *  Limitation 2 : static cctx currently not compatible with multi-threading.
1454*a28cd43dSSascha Wildner  *  Limitation 3 : static dctx is incompatible with legacy support.
1455*a28cd43dSSascha Wildner  */
1456*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CCtx*    ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize);
1457*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize);    /**< same as ZSTD_initStaticCCtx() */
1458*a28cd43dSSascha Wildner 
1459*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DCtx*    ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize);
1460*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize);    /**< same as ZSTD_initStaticDCtx() */
1461*a28cd43dSSascha Wildner 
1462*a28cd43dSSascha Wildner ZSTDLIB_API const ZSTD_CDict* ZSTD_initStaticCDict(
1463*a28cd43dSSascha Wildner                                         void* workspace, size_t workspaceSize,
1464*a28cd43dSSascha Wildner                                         const void* dict, size_t dictSize,
1465*a28cd43dSSascha Wildner                                         ZSTD_dictLoadMethod_e dictLoadMethod,
1466*a28cd43dSSascha Wildner                                         ZSTD_dictContentType_e dictContentType,
1467*a28cd43dSSascha Wildner                                         ZSTD_compressionParameters cParams);
1468*a28cd43dSSascha Wildner 
1469*a28cd43dSSascha Wildner ZSTDLIB_API const ZSTD_DDict* ZSTD_initStaticDDict(
1470*a28cd43dSSascha Wildner                                         void* workspace, size_t workspaceSize,
1471*a28cd43dSSascha Wildner                                         const void* dict, size_t dictSize,
1472*a28cd43dSSascha Wildner                                         ZSTD_dictLoadMethod_e dictLoadMethod,
1473*a28cd43dSSascha Wildner                                         ZSTD_dictContentType_e dictContentType);
1474*a28cd43dSSascha Wildner 
1475*a28cd43dSSascha Wildner 
1476*a28cd43dSSascha Wildner /*! Custom memory allocation :
1477*a28cd43dSSascha Wildner  *  These prototypes make it possible to pass your own allocation/free functions.
1478*a28cd43dSSascha Wildner  *  ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below.
1479*a28cd43dSSascha Wildner  *  All allocation/free operations will be completed using these custom variants instead of regular <stdlib.h> ones.
1480*a28cd43dSSascha Wildner  */
1481*a28cd43dSSascha Wildner typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size);
1482*a28cd43dSSascha Wildner typedef void  (*ZSTD_freeFunction) (void* opaque, void* address);
1483*a28cd43dSSascha Wildner typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem;
1484*a28cd43dSSascha Wildner static
1485*a28cd43dSSascha Wildner #ifdef __GNUC__
1486*a28cd43dSSascha Wildner __attribute__((__unused__))
1487*a28cd43dSSascha Wildner #endif
1488*a28cd43dSSascha Wildner ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL };  /**< this constant defers to stdlib's functions */
1489*a28cd43dSSascha Wildner 
1490*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CCtx*    ZSTD_createCCtx_advanced(ZSTD_customMem customMem);
1491*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem);
1492*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DCtx*    ZSTD_createDCtx_advanced(ZSTD_customMem customMem);
1493*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem);
1494*a28cd43dSSascha Wildner 
1495*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize,
1496*a28cd43dSSascha Wildner                                                   ZSTD_dictLoadMethod_e dictLoadMethod,
1497*a28cd43dSSascha Wildner                                                   ZSTD_dictContentType_e dictContentType,
1498*a28cd43dSSascha Wildner                                                   ZSTD_compressionParameters cParams,
1499*a28cd43dSSascha Wildner                                                   ZSTD_customMem customMem);
1500*a28cd43dSSascha Wildner 
1501*a28cd43dSSascha Wildner /* ! Thread pool :
1502*a28cd43dSSascha Wildner  * These prototypes make it possible to share a thread pool among multiple compression contexts.
1503*a28cd43dSSascha Wildner  * This can limit resources for applications with multiple threads where each one uses
1504*a28cd43dSSascha Wildner  * a threaded compression mode (via ZSTD_c_nbWorkers parameter).
1505*a28cd43dSSascha Wildner  * ZSTD_createThreadPool creates a new thread pool with a given number of threads.
1506*a28cd43dSSascha Wildner  * Note that the lifetime of such pool must exist while being used.
1507*a28cd43dSSascha Wildner  * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value
1508*a28cd43dSSascha Wildner  * to use an internal thread pool).
1509*a28cd43dSSascha Wildner  * ZSTD_freeThreadPool frees a thread pool.
1510*a28cd43dSSascha Wildner  */
1511*a28cd43dSSascha Wildner typedef struct POOL_ctx_s ZSTD_threadPool;
1512*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads);
1513*a28cd43dSSascha Wildner ZSTDLIB_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool);
1514*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool);
1515*a28cd43dSSascha Wildner 
1516*a28cd43dSSascha Wildner /*
1517*a28cd43dSSascha Wildner  * This API is temporary and is expected to change or disappear in the future!
1518*a28cd43dSSascha Wildner  */
1519*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced2(
1520*a28cd43dSSascha Wildner     const void* dict, size_t dictSize,
1521*a28cd43dSSascha Wildner     ZSTD_dictLoadMethod_e dictLoadMethod,
1522*a28cd43dSSascha Wildner     ZSTD_dictContentType_e dictContentType,
1523*a28cd43dSSascha Wildner     const ZSTD_CCtx_params* cctxParams,
1524*a28cd43dSSascha Wildner     ZSTD_customMem customMem);
1525*a28cd43dSSascha Wildner 
1526*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced(const void* dict, size_t dictSize,
1527*a28cd43dSSascha Wildner                                                   ZSTD_dictLoadMethod_e dictLoadMethod,
1528*a28cd43dSSascha Wildner                                                   ZSTD_dictContentType_e dictContentType,
1529*a28cd43dSSascha Wildner                                                   ZSTD_customMem customMem);
1530*a28cd43dSSascha Wildner 
1531*a28cd43dSSascha Wildner /***************************************
1532*a28cd43dSSascha Wildner *  Advanced compression functions
1533*a28cd43dSSascha Wildner ***************************************/
1534*a28cd43dSSascha Wildner 
1535*a28cd43dSSascha Wildner /*! ZSTD_createCDict_byReference() :
1536*a28cd43dSSascha Wildner  *  Create a digested dictionary for compression
1537*a28cd43dSSascha Wildner  *  Dictionary content is just referenced, not duplicated.
1538*a28cd43dSSascha Wildner  *  As a consequence, `dictBuffer` **must** outlive CDict,
1539*a28cd43dSSascha Wildner  *  and its content must remain unmodified throughout the lifetime of CDict.
1540*a28cd43dSSascha Wildner  *  note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef */
1541*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel);
1542*a28cd43dSSascha Wildner 
1543*a28cd43dSSascha Wildner /*! ZSTD_getDictID_fromCDict() :
1544*a28cd43dSSascha Wildner  *  Provides the dictID of the dictionary loaded into `cdict`.
1545*a28cd43dSSascha Wildner  *  If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
1546*a28cd43dSSascha Wildner  *  Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
1547*a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict);
1548*a28cd43dSSascha Wildner 
1549*a28cd43dSSascha Wildner /*! ZSTD_getCParams() :
1550*a28cd43dSSascha Wildner  * @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize.
1551*a28cd43dSSascha Wildner  * `estimatedSrcSize` value is optional, select 0 if not known */
1552*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
1553*a28cd43dSSascha Wildner 
1554*a28cd43dSSascha Wildner /*! ZSTD_getParams() :
1555*a28cd43dSSascha Wildner  *  same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`.
1556*a28cd43dSSascha Wildner  *  All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 */
1557*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
1558*a28cd43dSSascha Wildner 
1559*a28cd43dSSascha Wildner /*! ZSTD_checkCParams() :
1560*a28cd43dSSascha Wildner  *  Ensure param values remain within authorized range.
1561*a28cd43dSSascha Wildner  * @return 0 on success, or an error code (can be checked with ZSTD_isError()) */
1562*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params);
1563*a28cd43dSSascha Wildner 
1564*a28cd43dSSascha Wildner /*! ZSTD_adjustCParams() :
1565*a28cd43dSSascha Wildner  *  optimize params for a given `srcSize` and `dictSize`.
1566*a28cd43dSSascha Wildner  * `srcSize` can be unknown, in which case use ZSTD_CONTENTSIZE_UNKNOWN.
1567*a28cd43dSSascha Wildner  * `dictSize` must be `0` when there is no dictionary.
1568*a28cd43dSSascha Wildner  *  cPar can be invalid : all parameters will be clamped within valid range in the @return struct.
1569*a28cd43dSSascha Wildner  *  This function never fails (wide contract) */
1570*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize);
1571*a28cd43dSSascha Wildner 
1572*a28cd43dSSascha Wildner /*! ZSTD_compress_advanced() :
1573*a28cd43dSSascha Wildner  *  Note : this function is now DEPRECATED.
1574*a28cd43dSSascha Wildner  *         It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters.
1575*a28cd43dSSascha Wildner  *  This prototype will be marked as deprecated and generate compilation warning on reaching v1.5.x */
1576*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx,
1577*a28cd43dSSascha Wildner                                           void* dst, size_t dstCapacity,
1578*a28cd43dSSascha Wildner                                     const void* src, size_t srcSize,
1579*a28cd43dSSascha Wildner                                     const void* dict,size_t dictSize,
1580*a28cd43dSSascha Wildner                                           ZSTD_parameters params);
1581*a28cd43dSSascha Wildner 
1582*a28cd43dSSascha Wildner /*! ZSTD_compress_usingCDict_advanced() :
1583*a28cd43dSSascha Wildner  *  Note : this function is now REDUNDANT.
1584*a28cd43dSSascha Wildner  *         It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters.
1585*a28cd43dSSascha Wildner  *  This prototype will be marked as deprecated and generate compilation warning in some future version */
1586*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
1587*a28cd43dSSascha Wildner                                               void* dst, size_t dstCapacity,
1588*a28cd43dSSascha Wildner                                         const void* src, size_t srcSize,
1589*a28cd43dSSascha Wildner                                         const ZSTD_CDict* cdict,
1590*a28cd43dSSascha Wildner                                               ZSTD_frameParameters fParams);
1591*a28cd43dSSascha Wildner 
1592*a28cd43dSSascha Wildner 
1593*a28cd43dSSascha Wildner /*! ZSTD_CCtx_loadDictionary_byReference() :
1594*a28cd43dSSascha Wildner  *  Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx.
1595*a28cd43dSSascha Wildner  *  It saves some memory, but also requires that `dict` outlives its usage within `cctx` */
1596*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
1597*a28cd43dSSascha Wildner 
1598*a28cd43dSSascha Wildner /*! ZSTD_CCtx_loadDictionary_advanced() :
1599*a28cd43dSSascha Wildner  *  Same as ZSTD_CCtx_loadDictionary(), but gives finer control over
1600*a28cd43dSSascha Wildner  *  how to load the dictionary (by copy ? by reference ?)
1601*a28cd43dSSascha Wildner  *  and how to interpret it (automatic ? force raw mode ? full mode only ?) */
1602*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
1603*a28cd43dSSascha Wildner 
1604*a28cd43dSSascha Wildner /*! ZSTD_CCtx_refPrefix_advanced() :
1605*a28cd43dSSascha Wildner  *  Same as ZSTD_CCtx_refPrefix(), but gives finer control over
1606*a28cd43dSSascha Wildner  *  how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */
1607*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
1608*a28cd43dSSascha Wildner 
1609*a28cd43dSSascha Wildner /* ===   experimental parameters   === */
1610*a28cd43dSSascha Wildner /* these parameters can be used with ZSTD_setParameter()
1611*a28cd43dSSascha Wildner  * they are not guaranteed to remain supported in the future */
1612*a28cd43dSSascha Wildner 
1613*a28cd43dSSascha Wildner  /* Enables rsyncable mode,
1614*a28cd43dSSascha Wildner   * which makes compressed files more rsync friendly
1615*a28cd43dSSascha Wildner   * by adding periodic synchronization points to the compressed data.
1616*a28cd43dSSascha Wildner   * The target average block size is ZSTD_c_jobSize / 2.
1617*a28cd43dSSascha Wildner   * It's possible to modify the job size to increase or decrease
1618*a28cd43dSSascha Wildner   * the granularity of the synchronization point.
1619*a28cd43dSSascha Wildner   * Once the jobSize is smaller than the window size,
1620*a28cd43dSSascha Wildner   * it will result in compression ratio degradation.
1621*a28cd43dSSascha Wildner   * NOTE 1: rsyncable mode only works when multithreading is enabled.
1622*a28cd43dSSascha Wildner   * NOTE 2: rsyncable performs poorly in combination with long range mode,
1623*a28cd43dSSascha Wildner   * since it will decrease the effectiveness of synchronization points,
1624*a28cd43dSSascha Wildner   * though mileage may vary.
1625*a28cd43dSSascha Wildner   * NOTE 3: Rsyncable mode limits maximum compression speed to ~400 MB/s.
1626*a28cd43dSSascha Wildner   * If the selected compression level is already running significantly slower,
1627*a28cd43dSSascha Wildner   * the overall speed won't be significantly impacted.
1628*a28cd43dSSascha Wildner   */
1629*a28cd43dSSascha Wildner  #define ZSTD_c_rsyncable ZSTD_c_experimentalParam1
1630*a28cd43dSSascha Wildner 
1631*a28cd43dSSascha Wildner /* Select a compression format.
1632*a28cd43dSSascha Wildner  * The value must be of type ZSTD_format_e.
1633*a28cd43dSSascha Wildner  * See ZSTD_format_e enum definition for details */
1634*a28cd43dSSascha Wildner #define ZSTD_c_format ZSTD_c_experimentalParam2
1635*a28cd43dSSascha Wildner 
1636*a28cd43dSSascha Wildner /* Force back-reference distances to remain < windowSize,
1637*a28cd43dSSascha Wildner  * even when referencing into Dictionary content (default:0) */
1638*a28cd43dSSascha Wildner #define ZSTD_c_forceMaxWindow ZSTD_c_experimentalParam3
1639*a28cd43dSSascha Wildner 
1640*a28cd43dSSascha Wildner /* Controls whether the contents of a CDict
1641*a28cd43dSSascha Wildner  * are used in place, or copied into the working context.
1642*a28cd43dSSascha Wildner  * Accepts values from the ZSTD_dictAttachPref_e enum.
1643*a28cd43dSSascha Wildner  * See the comments on that enum for an explanation of the feature. */
1644*a28cd43dSSascha Wildner #define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4
1645*a28cd43dSSascha Wildner 
1646*a28cd43dSSascha Wildner /* Controls how the literals are compressed (default is auto).
1647*a28cd43dSSascha Wildner  * The value must be of type ZSTD_literalCompressionMode_e.
1648*a28cd43dSSascha Wildner  * See ZSTD_literalCompressionMode_t enum definition for details.
1649*a28cd43dSSascha Wildner  */
1650*a28cd43dSSascha Wildner #define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5
1651*a28cd43dSSascha Wildner 
1652*a28cd43dSSascha Wildner /* Tries to fit compressed block size to be around targetCBlockSize.
1653*a28cd43dSSascha Wildner  * No target when targetCBlockSize == 0.
1654*a28cd43dSSascha Wildner  * There is no guarantee on compressed block size (default:0) */
1655*a28cd43dSSascha Wildner #define ZSTD_c_targetCBlockSize ZSTD_c_experimentalParam6
1656*a28cd43dSSascha Wildner 
1657*a28cd43dSSascha Wildner /* User's best guess of source size.
1658*a28cd43dSSascha Wildner  * Hint is not valid when srcSizeHint == 0.
1659*a28cd43dSSascha Wildner  * There is no guarantee that hint is close to actual source size,
1660*a28cd43dSSascha Wildner  * but compression ratio may regress significantly if guess considerably underestimates */
1661*a28cd43dSSascha Wildner #define ZSTD_c_srcSizeHint ZSTD_c_experimentalParam7
1662*a28cd43dSSascha Wildner 
1663*a28cd43dSSascha Wildner /* Controls whether the new and experimental "dedicated dictionary search
1664*a28cd43dSSascha Wildner  * structure" can be used. This feature is still rough around the edges, be
1665*a28cd43dSSascha Wildner  * prepared for surprising behavior!
1666*a28cd43dSSascha Wildner  *
1667*a28cd43dSSascha Wildner  * How to use it:
1668*a28cd43dSSascha Wildner  *
1669*a28cd43dSSascha Wildner  * When using a CDict, whether to use this feature or not is controlled at
1670*a28cd43dSSascha Wildner  * CDict creation, and it must be set in a CCtxParams set passed into that
1671*a28cd43dSSascha Wildner  * construction (via ZSTD_createCDict_advanced2()). A compression will then
1672*a28cd43dSSascha Wildner  * use the feature or not based on how the CDict was constructed; the value of
1673*a28cd43dSSascha Wildner  * this param, set in the CCtx, will have no effect.
1674*a28cd43dSSascha Wildner  *
1675*a28cd43dSSascha Wildner  * However, when a dictionary buffer is passed into a CCtx, such as via
1676*a28cd43dSSascha Wildner  * ZSTD_CCtx_loadDictionary(), this param can be set on the CCtx to control
1677*a28cd43dSSascha Wildner  * whether the CDict that is created internally can use the feature or not.
1678*a28cd43dSSascha Wildner  *
1679*a28cd43dSSascha Wildner  * What it does:
1680*a28cd43dSSascha Wildner  *
1681*a28cd43dSSascha Wildner  * Normally, the internal data structures of the CDict are analogous to what
1682*a28cd43dSSascha Wildner  * would be stored in a CCtx after compressing the contents of a dictionary.
1683*a28cd43dSSascha Wildner  * To an approximation, a compression using a dictionary can then use those
1684*a28cd43dSSascha Wildner  * data structures to simply continue what is effectively a streaming
1685*a28cd43dSSascha Wildner  * compression where the simulated compression of the dictionary left off.
1686*a28cd43dSSascha Wildner  * Which is to say, the search structures in the CDict are normally the same
1687*a28cd43dSSascha Wildner  * format as in the CCtx.
1688*a28cd43dSSascha Wildner  *
1689*a28cd43dSSascha Wildner  * It is possible to do better, since the CDict is not like a CCtx: the search
1690*a28cd43dSSascha Wildner  * structures are written once during CDict creation, and then are only read
1691*a28cd43dSSascha Wildner  * after that, while the search structures in the CCtx are both read and
1692*a28cd43dSSascha Wildner  * written as the compression goes along. This means we can choose a search
1693*a28cd43dSSascha Wildner  * structure for the dictionary that is read-optimized.
1694*a28cd43dSSascha Wildner  *
1695*a28cd43dSSascha Wildner  * This feature enables the use of that different structure.
1696*a28cd43dSSascha Wildner  *
1697*a28cd43dSSascha Wildner  * Note that some of the members of the ZSTD_compressionParameters struct have
1698*a28cd43dSSascha Wildner  * different semantics and constraints in the dedicated search structure. It is
1699*a28cd43dSSascha Wildner  * highly recommended that you simply set a compression level in the CCtxParams
1700*a28cd43dSSascha Wildner  * you pass into the CDict creation call, and avoid messing with the cParams
1701*a28cd43dSSascha Wildner  * directly.
1702*a28cd43dSSascha Wildner  *
1703*a28cd43dSSascha Wildner  * Effects:
1704*a28cd43dSSascha Wildner  *
1705*a28cd43dSSascha Wildner  * This will only have any effect when the selected ZSTD_strategy
1706*a28cd43dSSascha Wildner  * implementation supports this feature. Currently, that's limited to
1707*a28cd43dSSascha Wildner  * ZSTD_greedy, ZSTD_lazy, and ZSTD_lazy2.
1708*a28cd43dSSascha Wildner  *
1709*a28cd43dSSascha Wildner  * Note that this means that the CDict tables can no longer be copied into the
1710*a28cd43dSSascha Wildner  * CCtx, so the dict attachment mode ZSTD_dictForceCopy will no longer be
1711*a28cd43dSSascha Wildner  * useable. The dictionary can only be attached or reloaded.
1712*a28cd43dSSascha Wildner  *
1713*a28cd43dSSascha Wildner  * In general, you should expect compression to be faster--sometimes very much
1714*a28cd43dSSascha Wildner  * so--and CDict creation to be slightly slower. Eventually, we will probably
1715*a28cd43dSSascha Wildner  * make this mode the default.
1716*a28cd43dSSascha Wildner  */
1717*a28cd43dSSascha Wildner #define ZSTD_c_enableDedicatedDictSearch ZSTD_c_experimentalParam8
1718*a28cd43dSSascha Wildner 
1719*a28cd43dSSascha Wildner /* ZSTD_c_stableInBuffer
1720*a28cd43dSSascha Wildner  * Experimental parameter.
1721*a28cd43dSSascha Wildner  * Default is 0 == disabled. Set to 1 to enable.
1722*a28cd43dSSascha Wildner  *
1723*a28cd43dSSascha Wildner  * Tells the compressor that the ZSTD_inBuffer will ALWAYS be the same
1724*a28cd43dSSascha Wildner  * between calls, except for the modifications that zstd makes to pos (the
1725*a28cd43dSSascha Wildner  * caller must not modify pos). This is checked by the compressor, and
1726*a28cd43dSSascha Wildner  * compression will fail if it ever changes. This means the only flush
1727*a28cd43dSSascha Wildner  * mode that makes sense is ZSTD_e_end, so zstd will error if ZSTD_e_end
1728*a28cd43dSSascha Wildner  * is not used. The data in the ZSTD_inBuffer in the range [src, src + pos)
1729*a28cd43dSSascha Wildner  * MUST not be modified during compression or you will get data corruption.
1730*a28cd43dSSascha Wildner  *
1731*a28cd43dSSascha Wildner  * When this flag is enabled zstd won't allocate an input window buffer,
1732*a28cd43dSSascha Wildner  * because the user guarantees it can reference the ZSTD_inBuffer until
1733*a28cd43dSSascha Wildner  * the frame is complete. But, it will still allocate an output buffer
1734*a28cd43dSSascha Wildner  * large enough to fit a block (see ZSTD_c_stableOutBuffer). This will also
1735*a28cd43dSSascha Wildner  * avoid the memcpy() from the input buffer to the input window buffer.
1736*a28cd43dSSascha Wildner  *
1737*a28cd43dSSascha Wildner  * NOTE: ZSTD_compressStream2() will error if ZSTD_e_end is not used.
1738*a28cd43dSSascha Wildner  * That means this flag cannot be used with ZSTD_compressStream().
1739*a28cd43dSSascha Wildner  *
1740*a28cd43dSSascha Wildner  * NOTE: So long as the ZSTD_inBuffer always points to valid memory, using
1741*a28cd43dSSascha Wildner  * this flag is ALWAYS memory safe, and will never access out-of-bounds
1742*a28cd43dSSascha Wildner  * memory. However, compression WILL fail if you violate the preconditions.
1743*a28cd43dSSascha Wildner  *
1744*a28cd43dSSascha Wildner  * WARNING: The data in the ZSTD_inBuffer in the range [dst, dst + pos) MUST
1745*a28cd43dSSascha Wildner  * not be modified during compression or you will get data corruption. This
1746*a28cd43dSSascha Wildner  * is because zstd needs to reference data in the ZSTD_inBuffer to find
1747*a28cd43dSSascha Wildner  * matches. Normally zstd maintains its own window buffer for this purpose,
1748*a28cd43dSSascha Wildner  * but passing this flag tells zstd to use the user provided buffer.
1749*a28cd43dSSascha Wildner  */
1750*a28cd43dSSascha Wildner #define ZSTD_c_stableInBuffer ZSTD_c_experimentalParam9
1751*a28cd43dSSascha Wildner 
1752*a28cd43dSSascha Wildner /* ZSTD_c_stableOutBuffer
1753*a28cd43dSSascha Wildner  * Experimental parameter.
1754*a28cd43dSSascha Wildner  * Default is 0 == disabled. Set to 1 to enable.
1755*a28cd43dSSascha Wildner  *
1756*a28cd43dSSascha Wildner  * Tells he compressor that the ZSTD_outBuffer will not be resized between
1757*a28cd43dSSascha Wildner  * calls. Specifically: (out.size - out.pos) will never grow. This gives the
1758*a28cd43dSSascha Wildner  * compressor the freedom to say: If the compressed data doesn't fit in the
1759*a28cd43dSSascha Wildner  * output buffer then return ZSTD_error_dstSizeTooSmall. This allows us to
1760*a28cd43dSSascha Wildner  * always decompress directly into the output buffer, instead of decompressing
1761*a28cd43dSSascha Wildner  * into an internal buffer and copying to the output buffer.
1762*a28cd43dSSascha Wildner  *
1763*a28cd43dSSascha Wildner  * When this flag is enabled zstd won't allocate an output buffer, because
1764*a28cd43dSSascha Wildner  * it can write directly to the ZSTD_outBuffer. It will still allocate the
1765*a28cd43dSSascha Wildner  * input window buffer (see ZSTD_c_stableInBuffer).
1766*a28cd43dSSascha Wildner  *
1767*a28cd43dSSascha Wildner  * Zstd will check that (out.size - out.pos) never grows and return an error
1768*a28cd43dSSascha Wildner  * if it does. While not strictly necessary, this should prevent surprises.
1769*a28cd43dSSascha Wildner  */
1770*a28cd43dSSascha Wildner #define ZSTD_c_stableOutBuffer ZSTD_c_experimentalParam10
1771*a28cd43dSSascha Wildner 
1772*a28cd43dSSascha Wildner /* ZSTD_c_blockDelimiters
1773*a28cd43dSSascha Wildner  * Default is 0 == ZSTD_sf_noBlockDelimiters.
1774*a28cd43dSSascha Wildner  *
1775*a28cd43dSSascha Wildner  * For use with sequence compression API: ZSTD_compressSequences().
1776*a28cd43dSSascha Wildner  *
1777*a28cd43dSSascha Wildner  * Designates whether or not the given array of ZSTD_Sequence contains block delimiters
1778*a28cd43dSSascha Wildner  * and last literals, which are defined as sequences with offset == 0 and matchLength == 0.
1779*a28cd43dSSascha Wildner  * See the definition of ZSTD_Sequence for more specifics.
1780*a28cd43dSSascha Wildner  */
1781*a28cd43dSSascha Wildner #define ZSTD_c_blockDelimiters ZSTD_c_experimentalParam11
1782*a28cd43dSSascha Wildner 
1783*a28cd43dSSascha Wildner /* ZSTD_c_validateSequences
1784*a28cd43dSSascha Wildner  * Default is 0 == disabled. Set to 1 to enable sequence validation.
1785*a28cd43dSSascha Wildner  *
1786*a28cd43dSSascha Wildner  * For use with sequence compression API: ZSTD_compressSequences().
1787*a28cd43dSSascha Wildner  * Designates whether or not we validate sequences provided to ZSTD_compressSequences()
1788*a28cd43dSSascha Wildner  * during function execution.
1789*a28cd43dSSascha Wildner  *
1790*a28cd43dSSascha Wildner  * Without validation, providing a sequence that does not conform to the zstd spec will cause
1791*a28cd43dSSascha Wildner  * undefined behavior, and may produce a corrupted block.
1792*a28cd43dSSascha Wildner  *
1793*a28cd43dSSascha Wildner  * With validation enabled, a if sequence is invalid (see doc/zstd_compression_format.md for
1794*a28cd43dSSascha Wildner  * specifics regarding offset/matchlength requirements) then the function will bail out and
1795*a28cd43dSSascha Wildner  * return an error.
1796*a28cd43dSSascha Wildner  *
1797*a28cd43dSSascha Wildner  */
1798*a28cd43dSSascha Wildner #define ZSTD_c_validateSequences ZSTD_c_experimentalParam12
1799*a28cd43dSSascha Wildner 
1800*a28cd43dSSascha Wildner /*! ZSTD_CCtx_getParameter() :
1801*a28cd43dSSascha Wildner  *  Get the requested compression parameter value, selected by enum ZSTD_cParameter,
1802*a28cd43dSSascha Wildner  *  and store it into int* value.
1803*a28cd43dSSascha Wildner  * @return : 0, or an error code (which can be tested with ZSTD_isError()).
1804*a28cd43dSSascha Wildner  */
1805*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_getParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value);
1806*a28cd43dSSascha Wildner 
1807*a28cd43dSSascha Wildner 
1808*a28cd43dSSascha Wildner /*! ZSTD_CCtx_params :
1809*a28cd43dSSascha Wildner  *  Quick howto :
1810*a28cd43dSSascha Wildner  *  - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure
1811*a28cd43dSSascha Wildner  *  - ZSTD_CCtxParams_setParameter() : Push parameters one by one into
1812*a28cd43dSSascha Wildner  *                                     an existing ZSTD_CCtx_params structure.
1813*a28cd43dSSascha Wildner  *                                     This is similar to
1814*a28cd43dSSascha Wildner  *                                     ZSTD_CCtx_setParameter().
1815*a28cd43dSSascha Wildner  *  - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to
1816*a28cd43dSSascha Wildner  *                                    an existing CCtx.
1817*a28cd43dSSascha Wildner  *                                    These parameters will be applied to
1818*a28cd43dSSascha Wildner  *                                    all subsequent frames.
1819*a28cd43dSSascha Wildner  *  - ZSTD_compressStream2() : Do compression using the CCtx.
1820*a28cd43dSSascha Wildner  *  - ZSTD_freeCCtxParams() : Free the memory.
1821*a28cd43dSSascha Wildner  *
1822*a28cd43dSSascha Wildner  *  This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams()
1823*a28cd43dSSascha Wildner  *  for static allocation of CCtx for single-threaded compression.
1824*a28cd43dSSascha Wildner  */
1825*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void);
1826*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);
1827*a28cd43dSSascha Wildner 
1828*a28cd43dSSascha Wildner /*! ZSTD_CCtxParams_reset() :
1829*a28cd43dSSascha Wildner  *  Reset params to default values.
1830*a28cd43dSSascha Wildner  */
1831*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params);
1832*a28cd43dSSascha Wildner 
1833*a28cd43dSSascha Wildner /*! ZSTD_CCtxParams_init() :
1834*a28cd43dSSascha Wildner  *  Initializes the compression parameters of cctxParams according to
1835*a28cd43dSSascha Wildner  *  compression level. All other parameters are reset to their default values.
1836*a28cd43dSSascha Wildner  */
1837*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel);
1838*a28cd43dSSascha Wildner 
1839*a28cd43dSSascha Wildner /*! ZSTD_CCtxParams_init_advanced() :
1840*a28cd43dSSascha Wildner  *  Initializes the compression and frame parameters of cctxParams according to
1841*a28cd43dSSascha Wildner  *  params. All other parameters are reset to their default values.
1842*a28cd43dSSascha Wildner  */
1843*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params);
1844*a28cd43dSSascha Wildner 
1845*a28cd43dSSascha Wildner /*! ZSTD_CCtxParams_setParameter() :
1846*a28cd43dSSascha Wildner  *  Similar to ZSTD_CCtx_setParameter.
1847*a28cd43dSSascha Wildner  *  Set one compression parameter, selected by enum ZSTD_cParameter.
1848*a28cd43dSSascha Wildner  *  Parameters must be applied to a ZSTD_CCtx using
1849*a28cd43dSSascha Wildner  *  ZSTD_CCtx_setParametersUsingCCtxParams().
1850*a28cd43dSSascha Wildner  * @result : a code representing success or failure (which can be tested with
1851*a28cd43dSSascha Wildner  *           ZSTD_isError()).
1852*a28cd43dSSascha Wildner  */
1853*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value);
1854*a28cd43dSSascha Wildner 
1855*a28cd43dSSascha Wildner /*! ZSTD_CCtxParams_getParameter() :
1856*a28cd43dSSascha Wildner  * Similar to ZSTD_CCtx_getParameter.
1857*a28cd43dSSascha Wildner  * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter.
1858*a28cd43dSSascha Wildner  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
1859*a28cd43dSSascha Wildner  */
1860*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtxParams_getParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value);
1861*a28cd43dSSascha Wildner 
1862*a28cd43dSSascha Wildner /*! ZSTD_CCtx_setParametersUsingCCtxParams() :
1863*a28cd43dSSascha Wildner  *  Apply a set of ZSTD_CCtx_params to the compression context.
1864*a28cd43dSSascha Wildner  *  This can be done even after compression is started,
1865*a28cd43dSSascha Wildner  *    if nbWorkers==0, this will have no impact until a new compression is started.
1866*a28cd43dSSascha Wildner  *    if nbWorkers>=1, new parameters will be picked up at next job,
1867*a28cd43dSSascha Wildner  *       with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated).
1868*a28cd43dSSascha Wildner  */
1869*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_CCtx_setParametersUsingCCtxParams(
1870*a28cd43dSSascha Wildner         ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params);
1871*a28cd43dSSascha Wildner 
1872*a28cd43dSSascha Wildner /*! ZSTD_compressStream2_simpleArgs() :
1873*a28cd43dSSascha Wildner  *  Same as ZSTD_compressStream2(),
1874*a28cd43dSSascha Wildner  *  but using only integral types as arguments.
1875*a28cd43dSSascha Wildner  *  This variant might be helpful for binders from dynamic languages
1876*a28cd43dSSascha Wildner  *  which have troubles handling structures containing memory pointers.
1877*a28cd43dSSascha Wildner  */
1878*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressStream2_simpleArgs (
1879*a28cd43dSSascha Wildner                             ZSTD_CCtx* cctx,
1880*a28cd43dSSascha Wildner                             void* dst, size_t dstCapacity, size_t* dstPos,
1881*a28cd43dSSascha Wildner                       const void* src, size_t srcSize, size_t* srcPos,
1882*a28cd43dSSascha Wildner                             ZSTD_EndDirective endOp);
1883*a28cd43dSSascha Wildner 
1884*a28cd43dSSascha Wildner 
1885*a28cd43dSSascha Wildner /***************************************
1886*a28cd43dSSascha Wildner *  Advanced decompression functions
1887*a28cd43dSSascha Wildner ***************************************/
1888*a28cd43dSSascha Wildner 
1889*a28cd43dSSascha Wildner /*! ZSTD_isFrame() :
1890*a28cd43dSSascha Wildner  *  Tells if the content of `buffer` starts with a valid Frame Identifier.
1891*a28cd43dSSascha Wildner  *  Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0.
1892*a28cd43dSSascha Wildner  *  Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled.
1893*a28cd43dSSascha Wildner  *  Note 3 : Skippable Frame Identifiers are considered valid. */
1894*a28cd43dSSascha Wildner ZSTDLIB_API unsigned ZSTD_isFrame(const void* buffer, size_t size);
1895*a28cd43dSSascha Wildner 
1896*a28cd43dSSascha Wildner /*! ZSTD_createDDict_byReference() :
1897*a28cd43dSSascha Wildner  *  Create a digested dictionary, ready to start decompression operation without startup delay.
1898*a28cd43dSSascha Wildner  *  Dictionary content is referenced, and therefore stays in dictBuffer.
1899*a28cd43dSSascha Wildner  *  It is important that dictBuffer outlives DDict,
1900*a28cd43dSSascha Wildner  *  it must remain read accessible throughout the lifetime of DDict */
1901*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize);
1902*a28cd43dSSascha Wildner 
1903*a28cd43dSSascha Wildner /*! ZSTD_DCtx_loadDictionary_byReference() :
1904*a28cd43dSSascha Wildner  *  Same as ZSTD_DCtx_loadDictionary(),
1905*a28cd43dSSascha Wildner  *  but references `dict` content instead of copying it into `dctx`.
1906*a28cd43dSSascha Wildner  *  This saves memory if `dict` remains around.,
1907*a28cd43dSSascha Wildner  *  However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression. */
1908*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
1909*a28cd43dSSascha Wildner 
1910*a28cd43dSSascha Wildner /*! ZSTD_DCtx_loadDictionary_advanced() :
1911*a28cd43dSSascha Wildner  *  Same as ZSTD_DCtx_loadDictionary(),
1912*a28cd43dSSascha Wildner  *  but gives direct control over
1913*a28cd43dSSascha Wildner  *  how to load the dictionary (by copy ? by reference ?)
1914*a28cd43dSSascha Wildner  *  and how to interpret it (automatic ? force raw mode ? full mode only ?). */
1915*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
1916*a28cd43dSSascha Wildner 
1917*a28cd43dSSascha Wildner /*! ZSTD_DCtx_refPrefix_advanced() :
1918*a28cd43dSSascha Wildner  *  Same as ZSTD_DCtx_refPrefix(), but gives finer control over
1919*a28cd43dSSascha Wildner  *  how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */
1920*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
1921*a28cd43dSSascha Wildner 
1922*a28cd43dSSascha Wildner /*! ZSTD_DCtx_setMaxWindowSize() :
1923*a28cd43dSSascha Wildner  *  Refuses allocating internal buffers for frames requiring a window size larger than provided limit.
1924*a28cd43dSSascha Wildner  *  This protects a decoder context from reserving too much memory for itself (potential attack scenario).
1925*a28cd43dSSascha Wildner  *  This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode.
1926*a28cd43dSSascha Wildner  *  By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT)
1927*a28cd43dSSascha Wildner  * @return : 0, or an error code (which can be tested using ZSTD_isError()).
1928*a28cd43dSSascha Wildner  */
1929*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize);
1930*a28cd43dSSascha Wildner 
1931*a28cd43dSSascha Wildner /*! ZSTD_DCtx_getParameter() :
1932*a28cd43dSSascha Wildner  *  Get the requested decompression parameter value, selected by enum ZSTD_dParameter,
1933*a28cd43dSSascha Wildner  *  and store it into int* value.
1934*a28cd43dSSascha Wildner  * @return : 0, or an error code (which can be tested with ZSTD_isError()).
1935*a28cd43dSSascha Wildner  */
1936*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value);
1937*a28cd43dSSascha Wildner 
1938*a28cd43dSSascha Wildner /* ZSTD_d_format
1939*a28cd43dSSascha Wildner  * experimental parameter,
1940*a28cd43dSSascha Wildner  * allowing selection between ZSTD_format_e input compression formats
1941*a28cd43dSSascha Wildner  */
1942*a28cd43dSSascha Wildner #define ZSTD_d_format ZSTD_d_experimentalParam1
1943*a28cd43dSSascha Wildner /* ZSTD_d_stableOutBuffer
1944*a28cd43dSSascha Wildner  * Experimental parameter.
1945*a28cd43dSSascha Wildner  * Default is 0 == disabled. Set to 1 to enable.
1946*a28cd43dSSascha Wildner  *
1947*a28cd43dSSascha Wildner  * Tells the decompressor that the ZSTD_outBuffer will ALWAYS be the same
1948*a28cd43dSSascha Wildner  * between calls, except for the modifications that zstd makes to pos (the
1949*a28cd43dSSascha Wildner  * caller must not modify pos). This is checked by the decompressor, and
1950*a28cd43dSSascha Wildner  * decompression will fail if it ever changes. Therefore the ZSTD_outBuffer
1951*a28cd43dSSascha Wildner  * MUST be large enough to fit the entire decompressed frame. This will be
1952*a28cd43dSSascha Wildner  * checked when the frame content size is known. The data in the ZSTD_outBuffer
1953*a28cd43dSSascha Wildner  * in the range [dst, dst + pos) MUST not be modified during decompression
1954*a28cd43dSSascha Wildner  * or you will get data corruption.
1955*a28cd43dSSascha Wildner  *
1956*a28cd43dSSascha Wildner  * When this flags is enabled zstd won't allocate an output buffer, because
1957*a28cd43dSSascha Wildner  * it can write directly to the ZSTD_outBuffer, but it will still allocate
1958*a28cd43dSSascha Wildner  * an input buffer large enough to fit any compressed block. This will also
1959*a28cd43dSSascha Wildner  * avoid the memcpy() from the internal output buffer to the ZSTD_outBuffer.
1960*a28cd43dSSascha Wildner  * If you need to avoid the input buffer allocation use the buffer-less
1961*a28cd43dSSascha Wildner  * streaming API.
1962*a28cd43dSSascha Wildner  *
1963*a28cd43dSSascha Wildner  * NOTE: So long as the ZSTD_outBuffer always points to valid memory, using
1964*a28cd43dSSascha Wildner  * this flag is ALWAYS memory safe, and will never access out-of-bounds
1965*a28cd43dSSascha Wildner  * memory. However, decompression WILL fail if you violate the preconditions.
1966*a28cd43dSSascha Wildner  *
1967*a28cd43dSSascha Wildner  * WARNING: The data in the ZSTD_outBuffer in the range [dst, dst + pos) MUST
1968*a28cd43dSSascha Wildner  * not be modified during decompression or you will get data corruption. This
1969*a28cd43dSSascha Wildner  * is because zstd needs to reference data in the ZSTD_outBuffer to regenerate
1970*a28cd43dSSascha Wildner  * matches. Normally zstd maintains its own buffer for this purpose, but passing
1971*a28cd43dSSascha Wildner  * this flag tells zstd to use the user provided buffer.
1972*a28cd43dSSascha Wildner  */
1973*a28cd43dSSascha Wildner #define ZSTD_d_stableOutBuffer ZSTD_d_experimentalParam2
1974*a28cd43dSSascha Wildner 
1975*a28cd43dSSascha Wildner /* ZSTD_d_forceIgnoreChecksum
1976*a28cd43dSSascha Wildner  * Experimental parameter.
1977*a28cd43dSSascha Wildner  * Default is 0 == disabled. Set to 1 to enable
1978*a28cd43dSSascha Wildner  *
1979*a28cd43dSSascha Wildner  * Tells the decompressor to skip checksum validation during decompression, regardless
1980*a28cd43dSSascha Wildner  * of whether checksumming was specified during compression. This offers some
1981*a28cd43dSSascha Wildner  * slight performance benefits, and may be useful for debugging.
1982*a28cd43dSSascha Wildner  * Param has values of type ZSTD_forceIgnoreChecksum_e
1983*a28cd43dSSascha Wildner  */
1984*a28cd43dSSascha Wildner #define ZSTD_d_forceIgnoreChecksum ZSTD_d_experimentalParam3
1985*a28cd43dSSascha Wildner 
1986*a28cd43dSSascha Wildner /*! ZSTD_DCtx_setFormat() :
1987*a28cd43dSSascha Wildner  *  Instruct the decoder context about what kind of data to decode next.
1988*a28cd43dSSascha Wildner  *  This instruction is mandatory to decode data without a fully-formed header,
1989*a28cd43dSSascha Wildner  *  such ZSTD_f_zstd1_magicless for example.
1990*a28cd43dSSascha Wildner  * @return : 0, or an error code (which can be tested using ZSTD_isError()). */
1991*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);
1992*a28cd43dSSascha Wildner 
1993*a28cd43dSSascha Wildner /*! ZSTD_decompressStream_simpleArgs() :
1994*a28cd43dSSascha Wildner  *  Same as ZSTD_decompressStream(),
1995*a28cd43dSSascha Wildner  *  but using only integral types as arguments.
1996*a28cd43dSSascha Wildner  *  This can be helpful for binders from dynamic languages
1997*a28cd43dSSascha Wildner  *  which have troubles handling structures containing memory pointers.
1998*a28cd43dSSascha Wildner  */
1999*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressStream_simpleArgs (
2000*a28cd43dSSascha Wildner                             ZSTD_DCtx* dctx,
2001*a28cd43dSSascha Wildner                             void* dst, size_t dstCapacity, size_t* dstPos,
2002*a28cd43dSSascha Wildner                       const void* src, size_t srcSize, size_t* srcPos);
2003*a28cd43dSSascha Wildner 
2004*a28cd43dSSascha Wildner 
2005*a28cd43dSSascha Wildner /********************************************************************
2006*a28cd43dSSascha Wildner *  Advanced streaming functions
2007*a28cd43dSSascha Wildner *  Warning : most of these functions are now redundant with the Advanced API.
2008*a28cd43dSSascha Wildner *  Once Advanced API reaches "stable" status,
2009*a28cd43dSSascha Wildner *  redundant functions will be deprecated, and then at some point removed.
2010*a28cd43dSSascha Wildner ********************************************************************/
2011*a28cd43dSSascha Wildner 
2012*a28cd43dSSascha Wildner /*=====   Advanced Streaming compression functions  =====*/
2013*a28cd43dSSascha Wildner 
2014*a28cd43dSSascha Wildner /*! ZSTD_initCStream_srcSize() :
2015*a28cd43dSSascha Wildner  * This function is deprecated, and equivalent to:
2016*a28cd43dSSascha Wildner  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2017*a28cd43dSSascha Wildner  *     ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)
2018*a28cd43dSSascha Wildner  *     ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);
2019*a28cd43dSSascha Wildner  *     ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);
2020*a28cd43dSSascha Wildner  *
2021*a28cd43dSSascha Wildner  * pledgedSrcSize must be correct. If it is not known at init time, use
2022*a28cd43dSSascha Wildner  * ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs,
2023*a28cd43dSSascha Wildner  * "0" also disables frame content size field. It may be enabled in the future.
2024*a28cd43dSSascha Wildner  * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2025*a28cd43dSSascha Wildner  */
2026*a28cd43dSSascha Wildner ZSTDLIB_API size_t
2027*a28cd43dSSascha Wildner ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
2028*a28cd43dSSascha Wildner                          int compressionLevel,
2029*a28cd43dSSascha Wildner                          unsigned long long pledgedSrcSize);
2030*a28cd43dSSascha Wildner 
2031*a28cd43dSSascha Wildner /*! ZSTD_initCStream_usingDict() :
2032*a28cd43dSSascha Wildner  * This function is deprecated, and is equivalent to:
2033*a28cd43dSSascha Wildner  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2034*a28cd43dSSascha Wildner  *     ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);
2035*a28cd43dSSascha Wildner  *     ZSTD_CCtx_loadDictionary(zcs, dict, dictSize);
2036*a28cd43dSSascha Wildner  *
2037*a28cd43dSSascha Wildner  * Creates of an internal CDict (incompatible with static CCtx), except if
2038*a28cd43dSSascha Wildner  * dict == NULL or dictSize < 8, in which case no dict is used.
2039*a28cd43dSSascha Wildner  * Note: dict is loaded with ZSTD_dct_auto (treated as a full zstd dictionary if
2040*a28cd43dSSascha Wildner  * it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy.
2041*a28cd43dSSascha Wildner  * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2042*a28cd43dSSascha Wildner  */
2043*a28cd43dSSascha Wildner ZSTDLIB_API size_t
2044*a28cd43dSSascha Wildner ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
2045*a28cd43dSSascha Wildner                      const void* dict, size_t dictSize,
2046*a28cd43dSSascha Wildner                            int compressionLevel);
2047*a28cd43dSSascha Wildner 
2048*a28cd43dSSascha Wildner /*! ZSTD_initCStream_advanced() :
2049*a28cd43dSSascha Wildner  * This function is deprecated, and is approximately equivalent to:
2050*a28cd43dSSascha Wildner  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2051*a28cd43dSSascha Wildner  *     // Pseudocode: Set each zstd parameter and leave the rest as-is.
2052*a28cd43dSSascha Wildner  *     for ((param, value) : params) {
2053*a28cd43dSSascha Wildner  *         ZSTD_CCtx_setParameter(zcs, param, value);
2054*a28cd43dSSascha Wildner  *     }
2055*a28cd43dSSascha Wildner  *     ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);
2056*a28cd43dSSascha Wildner  *     ZSTD_CCtx_loadDictionary(zcs, dict, dictSize);
2057*a28cd43dSSascha Wildner  *
2058*a28cd43dSSascha Wildner  * dict is loaded with ZSTD_dct_auto and ZSTD_dlm_byCopy.
2059*a28cd43dSSascha Wildner  * pledgedSrcSize must be correct.
2060*a28cd43dSSascha Wildner  * If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN.
2061*a28cd43dSSascha Wildner  * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2062*a28cd43dSSascha Wildner  */
2063*a28cd43dSSascha Wildner ZSTDLIB_API size_t
2064*a28cd43dSSascha Wildner ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
2065*a28cd43dSSascha Wildner                     const void* dict, size_t dictSize,
2066*a28cd43dSSascha Wildner                           ZSTD_parameters params,
2067*a28cd43dSSascha Wildner                           unsigned long long pledgedSrcSize);
2068*a28cd43dSSascha Wildner 
2069*a28cd43dSSascha Wildner /*! ZSTD_initCStream_usingCDict() :
2070*a28cd43dSSascha Wildner  * This function is deprecated, and equivalent to:
2071*a28cd43dSSascha Wildner  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2072*a28cd43dSSascha Wildner  *     ZSTD_CCtx_refCDict(zcs, cdict);
2073*a28cd43dSSascha Wildner  *
2074*a28cd43dSSascha Wildner  * note : cdict will just be referenced, and must outlive compression session
2075*a28cd43dSSascha Wildner  * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2076*a28cd43dSSascha Wildner  */
2077*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);
2078*a28cd43dSSascha Wildner 
2079*a28cd43dSSascha Wildner /*! ZSTD_initCStream_usingCDict_advanced() :
2080*a28cd43dSSascha Wildner  *   This function is DEPRECATED, and is approximately equivalent to:
2081*a28cd43dSSascha Wildner  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2082*a28cd43dSSascha Wildner  *     // Pseudocode: Set each zstd frame parameter and leave the rest as-is.
2083*a28cd43dSSascha Wildner  *     for ((fParam, value) : fParams) {
2084*a28cd43dSSascha Wildner  *         ZSTD_CCtx_setParameter(zcs, fParam, value);
2085*a28cd43dSSascha Wildner  *     }
2086*a28cd43dSSascha Wildner  *     ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);
2087*a28cd43dSSascha Wildner  *     ZSTD_CCtx_refCDict(zcs, cdict);
2088*a28cd43dSSascha Wildner  *
2089*a28cd43dSSascha Wildner  * same as ZSTD_initCStream_usingCDict(), with control over frame parameters.
2090*a28cd43dSSascha Wildner  * pledgedSrcSize must be correct. If srcSize is not known at init time, use
2091*a28cd43dSSascha Wildner  * value ZSTD_CONTENTSIZE_UNKNOWN.
2092*a28cd43dSSascha Wildner  * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2093*a28cd43dSSascha Wildner  */
2094*a28cd43dSSascha Wildner ZSTDLIB_API size_t
2095*a28cd43dSSascha Wildner ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
2096*a28cd43dSSascha Wildner                                const ZSTD_CDict* cdict,
2097*a28cd43dSSascha Wildner                                      ZSTD_frameParameters fParams,
2098*a28cd43dSSascha Wildner                                      unsigned long long pledgedSrcSize);
2099*a28cd43dSSascha Wildner 
2100*a28cd43dSSascha Wildner /*! ZSTD_resetCStream() :
2101*a28cd43dSSascha Wildner  * This function is deprecated, and is equivalent to:
2102*a28cd43dSSascha Wildner  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2103*a28cd43dSSascha Wildner  *     ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);
2104*a28cd43dSSascha Wildner  *
2105*a28cd43dSSascha Wildner  *  start a new frame, using same parameters from previous frame.
2106*a28cd43dSSascha Wildner  *  This is typically useful to skip dictionary loading stage, since it will re-use it in-place.
2107*a28cd43dSSascha Wildner  *  Note that zcs must be init at least once before using ZSTD_resetCStream().
2108*a28cd43dSSascha Wildner  *  If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN.
2109*a28cd43dSSascha Wildner  *  If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end.
2110*a28cd43dSSascha Wildner  *  For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs,
2111*a28cd43dSSascha Wildner  *  but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead.
2112*a28cd43dSSascha Wildner  * @return : 0, or an error code (which can be tested using ZSTD_isError())
2113*a28cd43dSSascha Wildner  *  Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2114*a28cd43dSSascha Wildner  */
2115*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
2116*a28cd43dSSascha Wildner 
2117*a28cd43dSSascha Wildner 
2118*a28cd43dSSascha Wildner typedef struct {
2119*a28cd43dSSascha Wildner     unsigned long long ingested;   /* nb input bytes read and buffered */
2120*a28cd43dSSascha Wildner     unsigned long long consumed;   /* nb input bytes actually compressed */
2121*a28cd43dSSascha Wildner     unsigned long long produced;   /* nb of compressed bytes generated and buffered */
2122*a28cd43dSSascha Wildner     unsigned long long flushed;    /* nb of compressed bytes flushed : not provided; can be tracked from caller side */
2123*a28cd43dSSascha Wildner     unsigned currentJobID;         /* MT only : latest started job nb */
2124*a28cd43dSSascha Wildner     unsigned nbActiveWorkers;      /* MT only : nb of workers actively compressing at probe time */
2125*a28cd43dSSascha Wildner } ZSTD_frameProgression;
2126*a28cd43dSSascha Wildner 
2127*a28cd43dSSascha Wildner /* ZSTD_getFrameProgression() :
2128*a28cd43dSSascha Wildner  * tells how much data has been ingested (read from input)
2129*a28cd43dSSascha Wildner  * consumed (input actually compressed) and produced (output) for current frame.
2130*a28cd43dSSascha Wildner  * Note : (ingested - consumed) is amount of input data buffered internally, not yet compressed.
2131*a28cd43dSSascha Wildner  * Aggregates progression inside active worker threads.
2132*a28cd43dSSascha Wildner  */
2133*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx);
2134*a28cd43dSSascha Wildner 
2135*a28cd43dSSascha Wildner /*! ZSTD_toFlushNow() :
2136*a28cd43dSSascha Wildner  *  Tell how many bytes are ready to be flushed immediately.
2137*a28cd43dSSascha Wildner  *  Useful for multithreading scenarios (nbWorkers >= 1).
2138*a28cd43dSSascha Wildner  *  Probe the oldest active job, defined as oldest job not yet entirely flushed,
2139*a28cd43dSSascha Wildner  *  and check its output buffer.
2140*a28cd43dSSascha Wildner  * @return : amount of data stored in oldest job and ready to be flushed immediately.
2141*a28cd43dSSascha Wildner  *  if @return == 0, it means either :
2142*a28cd43dSSascha Wildner  *  + there is no active job (could be checked with ZSTD_frameProgression()), or
2143*a28cd43dSSascha Wildner  *  + oldest job is still actively compressing data,
2144*a28cd43dSSascha Wildner  *    but everything it has produced has also been flushed so far,
2145*a28cd43dSSascha Wildner  *    therefore flush speed is limited by production speed of oldest job
2146*a28cd43dSSascha Wildner  *    irrespective of the speed of concurrent (and newer) jobs.
2147*a28cd43dSSascha Wildner  */
2148*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx);
2149*a28cd43dSSascha Wildner 
2150*a28cd43dSSascha Wildner 
2151*a28cd43dSSascha Wildner /*=====   Advanced Streaming decompression functions  =====*/
2152*a28cd43dSSascha Wildner 
2153*a28cd43dSSascha Wildner /*!
2154*a28cd43dSSascha Wildner  * This function is deprecated, and is equivalent to:
2155*a28cd43dSSascha Wildner  *
2156*a28cd43dSSascha Wildner  *     ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);
2157*a28cd43dSSascha Wildner  *     ZSTD_DCtx_loadDictionary(zds, dict, dictSize);
2158*a28cd43dSSascha Wildner  *
2159*a28cd43dSSascha Wildner  * note: no dictionary will be used if dict == NULL or dictSize < 8
2160*a28cd43dSSascha Wildner  * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2161*a28cd43dSSascha Wildner  */
2162*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize);
2163*a28cd43dSSascha Wildner 
2164*a28cd43dSSascha Wildner /*!
2165*a28cd43dSSascha Wildner  * This function is deprecated, and is equivalent to:
2166*a28cd43dSSascha Wildner  *
2167*a28cd43dSSascha Wildner  *     ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);
2168*a28cd43dSSascha Wildner  *     ZSTD_DCtx_refDDict(zds, ddict);
2169*a28cd43dSSascha Wildner  *
2170*a28cd43dSSascha Wildner  * note : ddict is referenced, it must outlive decompression session
2171*a28cd43dSSascha Wildner  * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2172*a28cd43dSSascha Wildner  */
2173*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict);
2174*a28cd43dSSascha Wildner 
2175*a28cd43dSSascha Wildner /*!
2176*a28cd43dSSascha Wildner  * This function is deprecated, and is equivalent to:
2177*a28cd43dSSascha Wildner  *
2178*a28cd43dSSascha Wildner  *     ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);
2179*a28cd43dSSascha Wildner  *
2180*a28cd43dSSascha Wildner  * re-use decompression parameters from previous init; saves dictionary loading
2181*a28cd43dSSascha Wildner  * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2182*a28cd43dSSascha Wildner  */
2183*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds);
2184*a28cd43dSSascha Wildner 
2185*a28cd43dSSascha Wildner 
2186*a28cd43dSSascha Wildner /*********************************************************************
2187*a28cd43dSSascha Wildner *  Buffer-less and synchronous inner streaming functions
2188*a28cd43dSSascha Wildner *
2189*a28cd43dSSascha Wildner *  This is an advanced API, giving full control over buffer management, for users which need direct control over memory.
2190*a28cd43dSSascha Wildner *  But it's also a complex one, with several restrictions, documented below.
2191*a28cd43dSSascha Wildner *  Prefer normal streaming API for an easier experience.
2192*a28cd43dSSascha Wildner ********************************************************************* */
2193*a28cd43dSSascha Wildner 
2194*a28cd43dSSascha Wildner /**
2195*a28cd43dSSascha Wildner   Buffer-less streaming compression (synchronous mode)
2196*a28cd43dSSascha Wildner 
2197*a28cd43dSSascha Wildner   A ZSTD_CCtx object is required to track streaming operations.
2198*a28cd43dSSascha Wildner   Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource.
2199*a28cd43dSSascha Wildner   ZSTD_CCtx object can be re-used multiple times within successive compression operations.
2200*a28cd43dSSascha Wildner 
2201*a28cd43dSSascha Wildner   Start by initializing a context.
2202*a28cd43dSSascha Wildner   Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression,
2203*a28cd43dSSascha Wildner   or ZSTD_compressBegin_advanced(), for finer parameter control.
2204*a28cd43dSSascha Wildner   It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx()
2205*a28cd43dSSascha Wildner 
2206*a28cd43dSSascha Wildner   Then, consume your input using ZSTD_compressContinue().
2207*a28cd43dSSascha Wildner   There are some important considerations to keep in mind when using this advanced function :
2208*a28cd43dSSascha Wildner   - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffers only.
2209*a28cd43dSSascha Wildner   - Interface is synchronous : input is consumed entirely and produces 1+ compressed blocks.
2210*a28cd43dSSascha Wildner   - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario.
2211*a28cd43dSSascha Wildner     Worst case evaluation is provided by ZSTD_compressBound().
2212*a28cd43dSSascha Wildner     ZSTD_compressContinue() doesn't guarantee recover after a failed compression.
2213*a28cd43dSSascha Wildner   - ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog).
2214*a28cd43dSSascha Wildner     It remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks)
2215*a28cd43dSSascha Wildner   - ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps.
2216*a28cd43dSSascha Wildner     In which case, it will "discard" the relevant memory section from its history.
2217*a28cd43dSSascha Wildner 
2218*a28cd43dSSascha Wildner   Finish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum.
2219*a28cd43dSSascha Wildner   It's possible to use srcSize==0, in which case, it will write a final empty block to end the frame.
2220*a28cd43dSSascha Wildner   Without last block mark, frames are considered unfinished (hence corrupted) by compliant decoders.
2221*a28cd43dSSascha Wildner 
2222*a28cd43dSSascha Wildner   `ZSTD_CCtx` object can be re-used (ZSTD_compressBegin()) to compress again.
2223*a28cd43dSSascha Wildner */
2224*a28cd43dSSascha Wildner 
2225*a28cd43dSSascha Wildner /*=====   Buffer-less streaming compression functions  =====*/
2226*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel);
2227*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel);
2228*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize); /**< pledgedSrcSize : If srcSize is not known at init time, use ZSTD_CONTENTSIZE_UNKNOWN */
2229*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */
2230*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_CDict* const cdict, ZSTD_frameParameters const fParams, unsigned long long const pledgedSrcSize);   /* compression parameters are already set within cdict. pledgedSrcSize must be correct. If srcSize is not known, use macro ZSTD_CONTENTSIZE_UNKNOWN */
2231*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx, unsigned long long pledgedSrcSize); /**<  note: if pledgedSrcSize is not known, use ZSTD_CONTENTSIZE_UNKNOWN */
2232*a28cd43dSSascha Wildner 
2233*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
2234*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
2235*a28cd43dSSascha Wildner 
2236*a28cd43dSSascha Wildner 
2237*a28cd43dSSascha Wildner /**
2238*a28cd43dSSascha Wildner   Buffer-less streaming decompression (synchronous mode)
2239*a28cd43dSSascha Wildner 
2240*a28cd43dSSascha Wildner   A ZSTD_DCtx object is required to track streaming operations.
2241*a28cd43dSSascha Wildner   Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it.
2242*a28cd43dSSascha Wildner   A ZSTD_DCtx object can be re-used multiple times.
2243*a28cd43dSSascha Wildner 
2244*a28cd43dSSascha Wildner   First typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader().
2245*a28cd43dSSascha Wildner   Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough.
2246*a28cd43dSSascha Wildner   Data fragment must be large enough to ensure successful decoding.
2247*a28cd43dSSascha Wildner  `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough.
2248*a28cd43dSSascha Wildner   @result : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled.
2249*a28cd43dSSascha Wildner            >0 : `srcSize` is too small, please provide at least @result bytes on next attempt.
2250*a28cd43dSSascha Wildner            errorCode, which can be tested using ZSTD_isError().
2251*a28cd43dSSascha Wildner 
2252*a28cd43dSSascha Wildner   It fills a ZSTD_frameHeader structure with important information to correctly decode the frame,
2253*a28cd43dSSascha Wildner   such as the dictionary ID, content size, or maximum back-reference distance (`windowSize`).
2254*a28cd43dSSascha Wildner   Note that these values could be wrong, either because of data corruption, or because a 3rd party deliberately spoofs false information.
2255*a28cd43dSSascha Wildner   As a consequence, check that values remain within valid application range.
2256*a28cd43dSSascha Wildner   For example, do not allocate memory blindly, check that `windowSize` is within expectation.
2257*a28cd43dSSascha Wildner   Each application can set its own limits, depending on local restrictions.
2258*a28cd43dSSascha Wildner   For extended interoperability, it is recommended to support `windowSize` of at least 8 MB.
2259*a28cd43dSSascha Wildner 
2260*a28cd43dSSascha Wildner   ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize` bytes.
2261*a28cd43dSSascha Wildner   ZSTD_decompressContinue() is very sensitive to contiguity,
2262*a28cd43dSSascha Wildner   if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place,
2263*a28cd43dSSascha Wildner   or that previous contiguous segment is large enough to properly handle maximum back-reference distance.
2264*a28cd43dSSascha Wildner   There are multiple ways to guarantee this condition.
2265*a28cd43dSSascha Wildner 
2266*a28cd43dSSascha Wildner   The most memory efficient way is to use a round buffer of sufficient size.
2267*a28cd43dSSascha Wildner   Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(),
2268*a28cd43dSSascha Wildner   which can @return an error code if required value is too large for current system (in 32-bits mode).
2269*a28cd43dSSascha Wildner   In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one,
2270*a28cd43dSSascha Wildner   up to the moment there is not enough room left in the buffer to guarantee decoding another full block,
2271*a28cd43dSSascha Wildner   which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`.
2272*a28cd43dSSascha Wildner   At which point, decoding can resume from the beginning of the buffer.
2273*a28cd43dSSascha Wildner   Note that already decoded data stored in the buffer should be flushed before being overwritten.
2274*a28cd43dSSascha Wildner 
2275*a28cd43dSSascha Wildner   There are alternatives possible, for example using two or more buffers of size `windowSize` each, though they consume more memory.
2276*a28cd43dSSascha Wildner 
2277*a28cd43dSSascha Wildner   Finally, if you control the compression process, you can also ignore all buffer size rules,
2278*a28cd43dSSascha Wildner   as long as the encoder and decoder progress in "lock-step",
2279*a28cd43dSSascha Wildner   aka use exactly the same buffer sizes, break contiguity at the same place, etc.
2280*a28cd43dSSascha Wildner 
2281*a28cd43dSSascha Wildner   Once buffers are setup, start decompression, with ZSTD_decompressBegin().
2282*a28cd43dSSascha Wildner   If decompression requires a dictionary, use ZSTD_decompressBegin_usingDict() or ZSTD_decompressBegin_usingDDict().
2283*a28cd43dSSascha Wildner 
2284*a28cd43dSSascha Wildner   Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively.
2285*a28cd43dSSascha Wildner   ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue().
2286*a28cd43dSSascha Wildner   ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail.
2287*a28cd43dSSascha Wildner 
2288*a28cd43dSSascha Wildner  @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).
2289*a28cd43dSSascha Wildner   It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item.
2290*a28cd43dSSascha Wildner   It can also be an error code, which can be tested with ZSTD_isError().
2291*a28cd43dSSascha Wildner 
2292*a28cd43dSSascha Wildner   A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero.
2293*a28cd43dSSascha Wildner   Context can then be reset to start a new decompression.
2294*a28cd43dSSascha Wildner 
2295*a28cd43dSSascha Wildner   Note : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType().
2296*a28cd43dSSascha Wildner   This information is not required to properly decode a frame.
2297*a28cd43dSSascha Wildner 
2298*a28cd43dSSascha Wildner   == Special case : skippable frames ==
2299*a28cd43dSSascha Wildner 
2300*a28cd43dSSascha Wildner   Skippable frames allow integration of user-defined data into a flow of concatenated frames.
2301*a28cd43dSSascha Wildner   Skippable frames will be ignored (skipped) by decompressor.
2302*a28cd43dSSascha Wildner   The format of skippable frames is as follows :
2303*a28cd43dSSascha Wildner   a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F
2304*a28cd43dSSascha Wildner   b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits
2305*a28cd43dSSascha Wildner   c) Frame Content - any content (User Data) of length equal to Frame Size
2306*a28cd43dSSascha Wildner   For skippable frames ZSTD_getFrameHeader() returns zfhPtr->frameType==ZSTD_skippableFrame.
2307*a28cd43dSSascha Wildner   For skippable frames ZSTD_decompressContinue() always returns 0 : it only skips the content.
2308*a28cd43dSSascha Wildner */
2309*a28cd43dSSascha Wildner 
2310*a28cd43dSSascha Wildner /*=====   Buffer-less streaming decompression functions  =====*/
2311*a28cd43dSSascha Wildner typedef enum { ZSTD_frame, ZSTD_skippableFrame } ZSTD_frameType_e;
2312*a28cd43dSSascha Wildner typedef struct {
2313*a28cd43dSSascha Wildner     unsigned long long frameContentSize; /* if == ZSTD_CONTENTSIZE_UNKNOWN, it means this field is not available. 0 means "empty" */
2314*a28cd43dSSascha Wildner     unsigned long long windowSize;       /* can be very large, up to <= frameContentSize */
2315*a28cd43dSSascha Wildner     unsigned blockSizeMax;
2316*a28cd43dSSascha Wildner     ZSTD_frameType_e frameType;          /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */
2317*a28cd43dSSascha Wildner     unsigned headerSize;
2318*a28cd43dSSascha Wildner     unsigned dictID;
2319*a28cd43dSSascha Wildner     unsigned checksumFlag;
2320*a28cd43dSSascha Wildner } ZSTD_frameHeader;
2321*a28cd43dSSascha Wildner 
2322*a28cd43dSSascha Wildner /*! ZSTD_getFrameHeader() :
2323*a28cd43dSSascha Wildner  *  decode Frame Header, or requires larger `srcSize`.
2324*a28cd43dSSascha Wildner  * @return : 0, `zfhPtr` is correctly filled,
2325*a28cd43dSSascha Wildner  *          >0, `srcSize` is too small, value is wanted `srcSize` amount,
2326*a28cd43dSSascha Wildner  *           or an error code, which can be tested using ZSTD_isError() */
2327*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_getFrameHeader(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize);   /**< doesn't consume input */
2328*a28cd43dSSascha Wildner /*! ZSTD_getFrameHeader_advanced() :
2329*a28cd43dSSascha Wildner  *  same as ZSTD_getFrameHeader(),
2330*a28cd43dSSascha Wildner  *  with added capability to select a format (like ZSTD_f_zstd1_magicless) */
2331*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_getFrameHeader_advanced(ZSTD_frameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format);
2332*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decodingBufferSize_min(unsigned long long windowSize, unsigned long long frameContentSize);  /**< when frame content size is not known, pass in frameContentSize == ZSTD_CONTENTSIZE_UNKNOWN */
2333*a28cd43dSSascha Wildner 
2334*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx);
2335*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
2336*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict);
2337*a28cd43dSSascha Wildner 
2338*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx);
2339*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
2340*a28cd43dSSascha Wildner 
2341*a28cd43dSSascha Wildner /* misc */
2342*a28cd43dSSascha Wildner ZSTDLIB_API void   ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx);
2343*a28cd43dSSascha Wildner typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e;
2344*a28cd43dSSascha Wildner ZSTDLIB_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx);
2345*a28cd43dSSascha Wildner 
2346*a28cd43dSSascha Wildner 
2347*a28cd43dSSascha Wildner 
2348*a28cd43dSSascha Wildner 
2349*a28cd43dSSascha Wildner /* ============================ */
2350*a28cd43dSSascha Wildner /**       Block level API       */
2351*a28cd43dSSascha Wildner /* ============================ */
2352*a28cd43dSSascha Wildner 
2353*a28cd43dSSascha Wildner /*!
2354*a28cd43dSSascha Wildner     Block functions produce and decode raw zstd blocks, without frame metadata.
2355*a28cd43dSSascha Wildner     Frame metadata cost is typically ~12 bytes, which can be non-negligible for very small blocks (< 100 bytes).
2356*a28cd43dSSascha Wildner     But users will have to take in charge needed metadata to regenerate data, such as compressed and content sizes.
2357*a28cd43dSSascha Wildner 
2358*a28cd43dSSascha Wildner     A few rules to respect :
2359*a28cd43dSSascha Wildner     - Compressing and decompressing require a context structure
2360*a28cd43dSSascha Wildner       + Use ZSTD_createCCtx() and ZSTD_createDCtx()
2361*a28cd43dSSascha Wildner     - It is necessary to init context before starting
2362*a28cd43dSSascha Wildner       + compression : any ZSTD_compressBegin*() variant, including with dictionary
2363*a28cd43dSSascha Wildner       + decompression : any ZSTD_decompressBegin*() variant, including with dictionary
2364*a28cd43dSSascha Wildner       + copyCCtx() and copyDCtx() can be used too
2365*a28cd43dSSascha Wildner     - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB
2366*a28cd43dSSascha Wildner       + If input is larger than a block size, it's necessary to split input data into multiple blocks
2367*a28cd43dSSascha Wildner       + For inputs larger than a single block, consider using regular ZSTD_compress() instead.
2368*a28cd43dSSascha Wildner         Frame metadata is not that costly, and quickly becomes negligible as source size grows larger than a block.
2369*a28cd43dSSascha Wildner     - When a block is considered not compressible enough, ZSTD_compressBlock() result will be 0 (zero) !
2370*a28cd43dSSascha Wildner       ===> In which case, nothing is produced into `dst` !
2371*a28cd43dSSascha Wildner       + User __must__ test for such outcome and deal directly with uncompressed data
2372*a28cd43dSSascha Wildner       + A block cannot be declared incompressible if ZSTD_compressBlock() return value was != 0.
2373*a28cd43dSSascha Wildner         Doing so would mess up with statistics history, leading to potential data corruption.
2374*a28cd43dSSascha Wildner       + ZSTD_decompressBlock() _doesn't accept uncompressed data as input_ !!
2375*a28cd43dSSascha Wildner       + In case of multiple successive blocks, should some of them be uncompressed,
2376*a28cd43dSSascha Wildner         decoder must be informed of their existence in order to follow proper history.
2377*a28cd43dSSascha Wildner         Use ZSTD_insertBlock() for such a case.
2378*a28cd43dSSascha Wildner */
2379*a28cd43dSSascha Wildner 
2380*a28cd43dSSascha Wildner /*=====   Raw zstd block functions  =====*/
2381*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_getBlockSize   (const ZSTD_CCtx* cctx);
2382*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_compressBlock  (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
2383*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
2384*a28cd43dSSascha Wildner ZSTDLIB_API size_t ZSTD_insertBlock    (ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize);  /**< insert uncompressed block into `dctx` history. Useful for multi-blocks decompression. */
2385*a28cd43dSSascha Wildner 
2386*a28cd43dSSascha Wildner 
2387*a28cd43dSSascha Wildner #endif   /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */
2388*a28cd43dSSascha Wildner 
2389*a28cd43dSSascha Wildner #if defined (__cplusplus)
2390*a28cd43dSSascha Wildner }
2391*a28cd43dSSascha Wildner #endif
2392