xref: /linux-6.15/include/linux/zstd_lib.h (revision 65d1f550)
1*65d1f550SNick Terrell /* SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause */
2cf30f6a5SNick Terrell /*
3*65d1f550SNick Terrell  * Copyright (c) Meta Platforms, Inc. and affiliates.
4cf30f6a5SNick Terrell  * All rights reserved.
5cf30f6a5SNick Terrell  *
6e0c1b49fSNick Terrell  * This source code is licensed under both the BSD-style license (found in the
7e0c1b49fSNick Terrell  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
8e0c1b49fSNick Terrell  * in the COPYING file in the root directory of this source tree).
9e0c1b49fSNick Terrell  * You may select, at your option, one of the above-listed licenses.
10cf30f6a5SNick Terrell  */
11cf30f6a5SNick Terrell 
12e0c1b49fSNick Terrell #ifndef ZSTD_H_235446
13e0c1b49fSNick Terrell #define ZSTD_H_235446
14cf30f6a5SNick Terrell 
15*65d1f550SNick Terrell 
16*65d1f550SNick Terrell /* ======   Dependencies   ======*/
17cf30f6a5SNick Terrell #include <linux/types.h>   /* size_t */
18cf30f6a5SNick Terrell 
19*65d1f550SNick Terrell #include <linux/zstd_errors.h> /* list of errors */
20*65d1f550SNick Terrell #if !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY)
21*65d1f550SNick Terrell #include <linux/limits.h>   /* INT_MAX */
22*65d1f550SNick Terrell #endif /* ZSTD_STATIC_LINKING_ONLY */
23*65d1f550SNick Terrell 
24cf30f6a5SNick Terrell 
25e0c1b49fSNick Terrell /* =====   ZSTDLIB_API : control library symbols visibility   ===== */
26*65d1f550SNick Terrell #define ZSTDLIB_VISIBLE
27*65d1f550SNick Terrell 
28*65d1f550SNick Terrell #ifndef ZSTDLIB_HIDDEN
292aa14b1aSNick Terrell #  if (__GNUC__ >= 4) && !defined(__MINGW32__)
302aa14b1aSNick Terrell #    define ZSTDLIB_HIDDEN __attribute__ ((visibility ("hidden")))
312aa14b1aSNick Terrell #  else
322aa14b1aSNick Terrell #    define ZSTDLIB_HIDDEN
332aa14b1aSNick Terrell #  endif
342aa14b1aSNick Terrell #endif
35*65d1f550SNick Terrell 
362aa14b1aSNick Terrell #define ZSTDLIB_API ZSTDLIB_VISIBLE
37e0c1b49fSNick Terrell 
38*65d1f550SNick Terrell /* Deprecation warnings :
39*65d1f550SNick Terrell  * Should these warnings be a problem, it is generally possible to disable them,
40*65d1f550SNick Terrell  * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual.
41*65d1f550SNick Terrell  * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS.
42*65d1f550SNick Terrell  */
43*65d1f550SNick Terrell #ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS
44*65d1f550SNick Terrell #  define ZSTD_DEPRECATED(message) /* disable deprecation warnings */
45*65d1f550SNick Terrell #else
46*65d1f550SNick Terrell #  if (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__) || defined(__IAR_SYSTEMS_ICC__)
47*65d1f550SNick Terrell #    define ZSTD_DEPRECATED(message) __attribute__((deprecated(message)))
48*65d1f550SNick Terrell #  elif (__GNUC__ >= 3)
49*65d1f550SNick Terrell #    define ZSTD_DEPRECATED(message) __attribute__((deprecated))
50*65d1f550SNick Terrell #  else
51*65d1f550SNick Terrell #    pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler")
52*65d1f550SNick Terrell #    define ZSTD_DEPRECATED(message)
53*65d1f550SNick Terrell #  endif
54*65d1f550SNick Terrell #endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */
55*65d1f550SNick Terrell 
56e0c1b49fSNick Terrell 
57e0c1b49fSNick Terrell /* *****************************************************************************
58e0c1b49fSNick Terrell   Introduction
59e0c1b49fSNick Terrell 
60e0c1b49fSNick Terrell   zstd, short for Zstandard, is a fast lossless compression algorithm, targeting
61e0c1b49fSNick Terrell   real-time compression scenarios at zlib-level and better compression ratios.
62e0c1b49fSNick Terrell   The zstd compression library provides in-memory compression and decompression
63e0c1b49fSNick Terrell   functions.
64e0c1b49fSNick Terrell 
65e0c1b49fSNick Terrell   The library supports regular compression levels from 1 up to ZSTD_maxCLevel(),
66e0c1b49fSNick Terrell   which is currently 22. Levels >= 20, labeled `--ultra`, should be used with
67e0c1b49fSNick Terrell   caution, as they require more memory. The library also offers negative
68e0c1b49fSNick Terrell   compression levels, which extend the range of speed vs. ratio preferences.
69e0c1b49fSNick Terrell   The lower the level, the faster the speed (at the cost of compression).
70e0c1b49fSNick Terrell 
71e0c1b49fSNick Terrell   Compression can be done in:
72e0c1b49fSNick Terrell     - a single step (described as Simple API)
73e0c1b49fSNick Terrell     - a single step, reusing a context (described as Explicit context)
74e0c1b49fSNick Terrell     - unbounded multiple steps (described as Streaming compression)
75e0c1b49fSNick Terrell 
76e0c1b49fSNick Terrell   The compression ratio achievable on small data can be highly improved using
77e0c1b49fSNick Terrell   a dictionary. Dictionary compression can be performed in:
78e0c1b49fSNick Terrell     - a single step (described as Simple dictionary API)
79e0c1b49fSNick Terrell     - a single step, reusing a dictionary (described as Bulk-processing
80e0c1b49fSNick Terrell       dictionary API)
81e0c1b49fSNick Terrell 
82e0c1b49fSNick Terrell   Advanced experimental functions can be accessed using
83e0c1b49fSNick Terrell   `#define ZSTD_STATIC_LINKING_ONLY` before including zstd.h.
84e0c1b49fSNick Terrell 
85e0c1b49fSNick Terrell   Advanced experimental APIs should never be used with a dynamically-linked
86e0c1b49fSNick Terrell   library. They are not "stable"; their definitions or signatures may change in
87e0c1b49fSNick Terrell   the future. Only static linking is allowed.
88e0c1b49fSNick Terrell *******************************************************************************/
89e0c1b49fSNick Terrell 
90e0c1b49fSNick Terrell /*------   Version   ------*/
91e0c1b49fSNick Terrell #define ZSTD_VERSION_MAJOR    1
922aa14b1aSNick Terrell #define ZSTD_VERSION_MINOR    5
93*65d1f550SNick Terrell #define ZSTD_VERSION_RELEASE  7
94e0c1b49fSNick Terrell #define ZSTD_VERSION_NUMBER  (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
95e0c1b49fSNick Terrell 
96e0c1b49fSNick Terrell /*! ZSTD_versionNumber() :
97e0c1b49fSNick Terrell  *  Return runtime library version, the value is (MAJOR*100*100 + MINOR*100 + RELEASE). */
98e0c1b49fSNick Terrell ZSTDLIB_API unsigned ZSTD_versionNumber(void);
99e0c1b49fSNick Terrell 
100e0c1b49fSNick Terrell #define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE
101e0c1b49fSNick Terrell #define ZSTD_QUOTE(str) #str
102e0c1b49fSNick Terrell #define ZSTD_EXPAND_AND_QUOTE(str) ZSTD_QUOTE(str)
103e0c1b49fSNick Terrell #define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION)
104e0c1b49fSNick Terrell 
105e0c1b49fSNick Terrell /*! ZSTD_versionString() :
106e0c1b49fSNick Terrell  *  Return runtime library version, like "1.4.5". Requires v1.3.0+. */
107e0c1b49fSNick Terrell ZSTDLIB_API const char* ZSTD_versionString(void);
108e0c1b49fSNick Terrell 
109e0c1b49fSNick Terrell /* *************************************
110e0c1b49fSNick Terrell  *  Default constant
111e0c1b49fSNick Terrell  ***************************************/
112e0c1b49fSNick Terrell #ifndef ZSTD_CLEVEL_DEFAULT
113e0c1b49fSNick Terrell #  define ZSTD_CLEVEL_DEFAULT 3
114e0c1b49fSNick Terrell #endif
115e0c1b49fSNick Terrell 
116e0c1b49fSNick Terrell /* *************************************
117e0c1b49fSNick Terrell  *  Constants
118e0c1b49fSNick Terrell  ***************************************/
119e0c1b49fSNick Terrell 
120e0c1b49fSNick Terrell /* All magic numbers are supposed read/written to/from files/memory using little-endian convention */
121e0c1b49fSNick Terrell #define ZSTD_MAGICNUMBER            0xFD2FB528    /* valid since v0.8.0 */
122e0c1b49fSNick Terrell #define ZSTD_MAGIC_DICTIONARY       0xEC30A437    /* valid since v0.7.0 */
123e0c1b49fSNick Terrell #define ZSTD_MAGIC_SKIPPABLE_START  0x184D2A50    /* all 16 values, from 0x184D2A50 to 0x184D2A5F, signal the beginning of a skippable frame */
124e0c1b49fSNick Terrell #define ZSTD_MAGIC_SKIPPABLE_MASK   0xFFFFFFF0
125e0c1b49fSNick Terrell 
126e0c1b49fSNick Terrell #define ZSTD_BLOCKSIZELOG_MAX  17
127e0c1b49fSNick Terrell #define ZSTD_BLOCKSIZE_MAX     (1<<ZSTD_BLOCKSIZELOG_MAX)
128e0c1b49fSNick Terrell 
129e0c1b49fSNick Terrell 
130e0c1b49fSNick Terrell /* *************************************
131*65d1f550SNick Terrell *  Simple Core API
132e0c1b49fSNick Terrell ***************************************/
133e0c1b49fSNick Terrell /*! ZSTD_compress() :
134e0c1b49fSNick Terrell  *  Compresses `src` content as a single zstd compressed frame into already allocated `dst`.
135*65d1f550SNick Terrell  *  NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have
136*65d1f550SNick Terrell  *        enough space to successfully compress the data.
137e0c1b49fSNick Terrell  *  @return : compressed size written into `dst` (<= `dstCapacity),
138e0c1b49fSNick Terrell  *            or an error code if it fails (which can be tested using ZSTD_isError()). */
139e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity,
140e0c1b49fSNick Terrell                             const void* src, size_t srcSize,
141e0c1b49fSNick Terrell                                   int compressionLevel);
142e0c1b49fSNick Terrell 
143e0c1b49fSNick Terrell /*! ZSTD_decompress() :
144e0c1b49fSNick Terrell  * `compressedSize` : must be the _exact_ size of some number of compressed and/or skippable frames.
145*65d1f550SNick Terrell  *  Multiple compressed frames can be decompressed at once with this method.
146*65d1f550SNick Terrell  *  The result will be the concatenation of all decompressed frames, back to back.
147e0c1b49fSNick Terrell  * `dstCapacity` is an upper bound of originalSize to regenerate.
148*65d1f550SNick Terrell  *  First frame's decompressed size can be extracted using ZSTD_getFrameContentSize().
149*65d1f550SNick Terrell  *  If maximum upper bound isn't known, prefer using streaming mode to decompress data.
150e0c1b49fSNick Terrell  * @return : the number of bytes decompressed into `dst` (<= `dstCapacity`),
151e0c1b49fSNick Terrell  *           or an errorCode if it fails (which can be tested using ZSTD_isError()). */
152e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity,
153e0c1b49fSNick Terrell                               const void* src, size_t compressedSize);
154e0c1b49fSNick Terrell 
155*65d1f550SNick Terrell 
156*65d1f550SNick Terrell /*======  Decompression helper functions  ======*/
157*65d1f550SNick Terrell 
158e0c1b49fSNick Terrell /*! ZSTD_getFrameContentSize() : requires v1.3.0+
159e0c1b49fSNick Terrell  * `src` should point to the start of a ZSTD encoded frame.
160e0c1b49fSNick Terrell  * `srcSize` must be at least as large as the frame header.
161e0c1b49fSNick Terrell  *           hint : any size >= `ZSTD_frameHeaderSize_max` is large enough.
162e0c1b49fSNick Terrell  * @return : - decompressed size of `src` frame content, if known
163e0c1b49fSNick Terrell  *           - ZSTD_CONTENTSIZE_UNKNOWN if the size cannot be determined
164e0c1b49fSNick Terrell  *           - ZSTD_CONTENTSIZE_ERROR if an error occurred (e.g. invalid magic number, srcSize too small)
165e0c1b49fSNick Terrell  *  note 1 : a 0 return value means the frame is valid but "empty".
166*65d1f550SNick Terrell  *           When invoking this method on a skippable frame, it will return 0.
167*65d1f550SNick Terrell  *  note 2 : decompressed size is an optional field, it may not be present (typically in streaming mode).
168e0c1b49fSNick Terrell  *           When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size.
169e0c1b49fSNick Terrell  *           In which case, it's necessary to use streaming mode to decompress data.
170e0c1b49fSNick Terrell  *           Optionally, application can rely on some implicit limit,
171e0c1b49fSNick Terrell  *           as ZSTD_decompress() only needs an upper bound of decompressed size.
172e0c1b49fSNick Terrell  *           (For example, data could be necessarily cut into blocks <= 16 KB).
173e0c1b49fSNick Terrell  *  note 3 : decompressed size is always present when compression is completed using single-pass functions,
174e0c1b49fSNick Terrell  *           such as ZSTD_compress(), ZSTD_compressCCtx() ZSTD_compress_usingDict() or ZSTD_compress_usingCDict().
175e0c1b49fSNick Terrell  *  note 4 : decompressed size can be very large (64-bits value),
176e0c1b49fSNick Terrell  *           potentially larger than what local system can handle as a single memory segment.
177e0c1b49fSNick Terrell  *           In which case, it's necessary to use streaming mode to decompress data.
178e0c1b49fSNick Terrell  *  note 5 : If source is untrusted, decompressed size could be wrong or intentionally modified.
179e0c1b49fSNick Terrell  *           Always ensure return value fits within application's authorized limits.
180e0c1b49fSNick Terrell  *           Each application can set its own limits.
181e0c1b49fSNick Terrell  *  note 6 : This function replaces ZSTD_getDecompressedSize() */
182e0c1b49fSNick Terrell #define ZSTD_CONTENTSIZE_UNKNOWN (0ULL - 1)
183e0c1b49fSNick Terrell #define ZSTD_CONTENTSIZE_ERROR   (0ULL - 2)
184e0c1b49fSNick Terrell ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t srcSize);
185e0c1b49fSNick Terrell 
186*65d1f550SNick Terrell /*! ZSTD_getDecompressedSize() (obsolete):
187*65d1f550SNick Terrell  *  This function is now obsolete, in favor of ZSTD_getFrameContentSize().
188e0c1b49fSNick Terrell  *  Both functions work the same way, but ZSTD_getDecompressedSize() blends
189e0c1b49fSNick Terrell  *  "empty", "unknown" and "error" results to the same return value (0),
190e0c1b49fSNick Terrell  *  while ZSTD_getFrameContentSize() gives them separate return values.
191e0c1b49fSNick Terrell  * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */
192*65d1f550SNick Terrell ZSTD_DEPRECATED("Replaced by ZSTD_getFrameContentSize")
193e0c1b49fSNick Terrell ZSTDLIB_API unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
194e0c1b49fSNick Terrell 
1952aa14b1aSNick Terrell /*! ZSTD_findFrameCompressedSize() : Requires v1.4.0+
196e0c1b49fSNick Terrell  * `src` should point to the start of a ZSTD frame or skippable frame.
197e0c1b49fSNick Terrell  * `srcSize` must be >= first frame size
198e0c1b49fSNick Terrell  * @return : the compressed size of the first frame starting at `src`,
199e0c1b49fSNick Terrell  *           suitable to pass as `srcSize` to `ZSTD_decompress` or similar,
200*65d1f550SNick Terrell  *           or an error code if input is invalid
201*65d1f550SNick Terrell  *  Note 1: this method is called _find*() because it's not enough to read the header,
202*65d1f550SNick Terrell  *          it may have to scan through the frame's content, to reach its end.
203*65d1f550SNick Terrell  *  Note 2: this method also works with Skippable Frames. In which case,
204*65d1f550SNick Terrell  *          it returns the size of the complete skippable frame,
205*65d1f550SNick Terrell  *          which is always equal to its content size + 8 bytes for headers. */
206e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize);
207e0c1b49fSNick Terrell 
208cf30f6a5SNick Terrell 
209*65d1f550SNick Terrell /*======  Compression helper functions  ======*/
210*65d1f550SNick Terrell 
211*65d1f550SNick Terrell /*! ZSTD_compressBound() :
212*65d1f550SNick Terrell  * maximum compressed size in worst case single-pass scenario.
213*65d1f550SNick Terrell  * When invoking `ZSTD_compress()`, or any other one-pass compression function,
214*65d1f550SNick Terrell  * it's recommended to provide @dstCapacity >= ZSTD_compressBound(srcSize)
215*65d1f550SNick Terrell  * as it eliminates one potential failure scenario,
216*65d1f550SNick Terrell  * aka not enough room in dst buffer to write the compressed frame.
217*65d1f550SNick Terrell  * Note : ZSTD_compressBound() itself can fail, if @srcSize >= ZSTD_MAX_INPUT_SIZE .
218*65d1f550SNick Terrell  *        In which case, ZSTD_compressBound() will return an error code
219*65d1f550SNick Terrell  *        which can be tested using ZSTD_isError().
220*65d1f550SNick Terrell  *
221*65d1f550SNick Terrell  * ZSTD_COMPRESSBOUND() :
222*65d1f550SNick Terrell  * same as ZSTD_compressBound(), but as a macro.
223*65d1f550SNick Terrell  * It can be used to produce constants, which can be useful for static allocation,
224*65d1f550SNick Terrell  * for example to size a static array on stack.
225*65d1f550SNick Terrell  * Will produce constant value 0 if srcSize is too large.
226*65d1f550SNick Terrell  */
227*65d1f550SNick Terrell #define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00ULL : 0xFF00FF00U)
228*65d1f550SNick Terrell #define ZSTD_COMPRESSBOUND(srcSize)   (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (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 */
229e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
230*65d1f550SNick Terrell 
231*65d1f550SNick Terrell 
232*65d1f550SNick Terrell /*======  Error helper functions  ======*/
233*65d1f550SNick Terrell /* ZSTD_isError() :
234*65d1f550SNick Terrell  * Most ZSTD_* functions returning a size_t value can be tested for error,
235*65d1f550SNick Terrell  * using ZSTD_isError().
236*65d1f550SNick Terrell  * @return 1 if error, 0 otherwise
237*65d1f550SNick Terrell  */
238*65d1f550SNick Terrell ZSTDLIB_API unsigned     ZSTD_isError(size_t result);      /*!< tells if a `size_t` function result is an error code */
239*65d1f550SNick Terrell ZSTDLIB_API ZSTD_ErrorCode ZSTD_getErrorCode(size_t functionResult); /* convert a result into an error code, which can be compared to error enum list */
240*65d1f550SNick Terrell ZSTDLIB_API const char*  ZSTD_getErrorName(size_t result); /*!< provides readable string from a function result */
2412aa14b1aSNick Terrell ZSTDLIB_API int          ZSTD_minCLevel(void);             /*!< minimum negative compression level allowed, requires v1.4.0+ */
242e0c1b49fSNick Terrell ZSTDLIB_API int          ZSTD_maxCLevel(void);             /*!< maximum compression level available */
2432aa14b1aSNick Terrell ZSTDLIB_API int          ZSTD_defaultCLevel(void);         /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */
244cf30f6a5SNick Terrell 
245cf30f6a5SNick Terrell 
246e0c1b49fSNick Terrell /* *************************************
247e0c1b49fSNick Terrell *  Explicit context
248e0c1b49fSNick Terrell ***************************************/
249e0c1b49fSNick Terrell /*= Compression context
250e0c1b49fSNick Terrell  *  When compressing many times,
251*65d1f550SNick Terrell  *  it is recommended to allocate a compression context just once,
252*65d1f550SNick Terrell  *  and reuse it for each successive compression operation.
253*65d1f550SNick Terrell  *  This will make the workload easier for system's memory.
254e0c1b49fSNick Terrell  *  Note : re-using context is just a speed / resource optimization.
255e0c1b49fSNick Terrell  *         It doesn't change the compression ratio, which remains identical.
256*65d1f550SNick Terrell  *  Note 2: For parallel execution in multi-threaded environments,
257*65d1f550SNick Terrell  *         use one different context per thread .
258cf30f6a5SNick Terrell  */
259e0c1b49fSNick Terrell typedef struct ZSTD_CCtx_s ZSTD_CCtx;
260e0c1b49fSNick Terrell ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void);
261*65d1f550SNick Terrell ZSTDLIB_API size_t     ZSTD_freeCCtx(ZSTD_CCtx* cctx);  /* compatible with NULL pointer */
262cf30f6a5SNick Terrell 
263e0c1b49fSNick Terrell /*! ZSTD_compressCCtx() :
264e0c1b49fSNick Terrell  *  Same as ZSTD_compress(), using an explicit ZSTD_CCtx.
265*65d1f550SNick Terrell  *  Important : in order to mirror `ZSTD_compress()` behavior,
266*65d1f550SNick Terrell  *  this function compresses at the requested compression level,
267*65d1f550SNick Terrell  *  __ignoring any other advanced parameter__ .
268e0c1b49fSNick Terrell  *  If any advanced parameter was set using the advanced API,
269*65d1f550SNick Terrell  *  they will all be reset. Only @compressionLevel remains.
270cf30f6a5SNick Terrell  */
271e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx,
272e0c1b49fSNick Terrell                                      void* dst, size_t dstCapacity,
273e0c1b49fSNick Terrell                                const void* src, size_t srcSize,
274e0c1b49fSNick Terrell                                      int compressionLevel);
275e0c1b49fSNick Terrell 
276e0c1b49fSNick Terrell /*= Decompression context
277e0c1b49fSNick Terrell  *  When decompressing many times,
278e0c1b49fSNick Terrell  *  it is recommended to allocate a context only once,
279*65d1f550SNick Terrell  *  and reuse it for each successive compression operation.
280e0c1b49fSNick Terrell  *  This will make workload friendlier for system's memory.
281e0c1b49fSNick Terrell  *  Use one context per thread for parallel execution. */
282e0c1b49fSNick Terrell typedef struct ZSTD_DCtx_s ZSTD_DCtx;
283e0c1b49fSNick Terrell ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void);
284e0c1b49fSNick Terrell ZSTDLIB_API size_t     ZSTD_freeDCtx(ZSTD_DCtx* dctx);  /* accept NULL pointer */
285e0c1b49fSNick Terrell 
286e0c1b49fSNick Terrell /*! ZSTD_decompressDCtx() :
287e0c1b49fSNick Terrell  *  Same as ZSTD_decompress(),
288e0c1b49fSNick Terrell  *  requires an allocated ZSTD_DCtx.
289*65d1f550SNick Terrell  *  Compatible with sticky parameters (see below).
290e0c1b49fSNick Terrell  */
291e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx,
292e0c1b49fSNick Terrell                                        void* dst, size_t dstCapacity,
293e0c1b49fSNick Terrell                                  const void* src, size_t srcSize);
294e0c1b49fSNick Terrell 
295e0c1b49fSNick Terrell 
2962aa14b1aSNick Terrell /* *******************************************
2972aa14b1aSNick Terrell *  Advanced compression API (Requires v1.4.0+)
2982aa14b1aSNick Terrell **********************************************/
299e0c1b49fSNick Terrell 
300e0c1b49fSNick Terrell /* API design :
301e0c1b49fSNick Terrell  *   Parameters are pushed one by one into an existing context,
302e0c1b49fSNick Terrell  *   using ZSTD_CCtx_set*() functions.
303e0c1b49fSNick Terrell  *   Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame.
304e0c1b49fSNick Terrell  *   "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` !
305*65d1f550SNick Terrell  *   __They do not apply to one-shot variants such as ZSTD_compressCCtx()__ .
306e0c1b49fSNick Terrell  *
307e0c1b49fSNick Terrell  *   It's possible to reset all parameters to "default" using ZSTD_CCtx_reset().
308e0c1b49fSNick Terrell  *
3092aa14b1aSNick Terrell  *   This API supersedes all other "advanced" API entry points in the experimental section.
310*65d1f550SNick Terrell  *   In the future, we expect to remove API entry points from experimental which are redundant with this API.
311e0c1b49fSNick Terrell  */
312e0c1b49fSNick Terrell 
313e0c1b49fSNick Terrell 
314e0c1b49fSNick Terrell /* Compression strategies, listed from fastest to strongest */
315e0c1b49fSNick Terrell typedef enum { ZSTD_fast=1,
316e0c1b49fSNick Terrell                ZSTD_dfast=2,
317e0c1b49fSNick Terrell                ZSTD_greedy=3,
318e0c1b49fSNick Terrell                ZSTD_lazy=4,
319e0c1b49fSNick Terrell                ZSTD_lazy2=5,
320e0c1b49fSNick Terrell                ZSTD_btlazy2=6,
321e0c1b49fSNick Terrell                ZSTD_btopt=7,
322e0c1b49fSNick Terrell                ZSTD_btultra=8,
323e0c1b49fSNick Terrell                ZSTD_btultra2=9
324e0c1b49fSNick Terrell                /* note : new strategies _might_ be added in the future.
325e0c1b49fSNick Terrell                          Only the order (from fast to strong) is guaranteed */
326cf30f6a5SNick Terrell } ZSTD_strategy;
327cf30f6a5SNick Terrell 
328e0c1b49fSNick Terrell typedef enum {
329e0c1b49fSNick Terrell 
330e0c1b49fSNick Terrell     /* compression parameters
331e0c1b49fSNick Terrell      * Note: When compressing with a ZSTD_CDict these parameters are superseded
332e0c1b49fSNick Terrell      * by the parameters used to construct the ZSTD_CDict.
333e0c1b49fSNick Terrell      * See ZSTD_CCtx_refCDict() for more info (superseded-by-cdict). */
334e0c1b49fSNick Terrell     ZSTD_c_compressionLevel=100, /* Set compression parameters according to pre-defined cLevel table.
335e0c1b49fSNick Terrell                               * Note that exact compression parameters are dynamically determined,
336e0c1b49fSNick Terrell                               * depending on both compression level and srcSize (when known).
337e0c1b49fSNick Terrell                               * Default level is ZSTD_CLEVEL_DEFAULT==3.
338e0c1b49fSNick Terrell                               * Special: value 0 means default, which is controlled by ZSTD_CLEVEL_DEFAULT.
339e0c1b49fSNick Terrell                               * Note 1 : it's possible to pass a negative compression level.
340e0c1b49fSNick Terrell                               * Note 2 : setting a level does not automatically set all other compression parameters
341e0c1b49fSNick Terrell                               *   to default. Setting this will however eventually dynamically impact the compression
342e0c1b49fSNick Terrell                               *   parameters which have not been manually set. The manually set
343e0c1b49fSNick Terrell                               *   ones will 'stick'. */
344e0c1b49fSNick Terrell     /* Advanced compression parameters :
345e0c1b49fSNick Terrell      * It's possible to pin down compression parameters to some specific values.
346e0c1b49fSNick Terrell      * In which case, these values are no longer dynamically selected by the compressor */
347e0c1b49fSNick Terrell     ZSTD_c_windowLog=101,    /* Maximum allowed back-reference distance, expressed as power of 2.
348e0c1b49fSNick Terrell                               * This will set a memory budget for streaming decompression,
349e0c1b49fSNick Terrell                               * with larger values requiring more memory
350e0c1b49fSNick Terrell                               * and typically compressing more.
351e0c1b49fSNick Terrell                               * Must be clamped between ZSTD_WINDOWLOG_MIN and ZSTD_WINDOWLOG_MAX.
352e0c1b49fSNick Terrell                               * Special: value 0 means "use default windowLog".
353e0c1b49fSNick Terrell                               * Note: Using a windowLog greater than ZSTD_WINDOWLOG_LIMIT_DEFAULT
354e0c1b49fSNick Terrell                               *       requires explicitly allowing such size at streaming decompression stage. */
355e0c1b49fSNick Terrell     ZSTD_c_hashLog=102,      /* Size of the initial probe table, as a power of 2.
356e0c1b49fSNick Terrell                               * Resulting memory usage is (1 << (hashLog+2)).
357e0c1b49fSNick Terrell                               * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX.
358e0c1b49fSNick Terrell                               * Larger tables improve compression ratio of strategies <= dFast,
359e0c1b49fSNick Terrell                               * and improve speed of strategies > dFast.
360e0c1b49fSNick Terrell                               * Special: value 0 means "use default hashLog". */
361e0c1b49fSNick Terrell     ZSTD_c_chainLog=103,     /* Size of the multi-probe search table, as a power of 2.
362e0c1b49fSNick Terrell                               * Resulting memory usage is (1 << (chainLog+2)).
363e0c1b49fSNick Terrell                               * Must be clamped between ZSTD_CHAINLOG_MIN and ZSTD_CHAINLOG_MAX.
364e0c1b49fSNick Terrell                               * Larger tables result in better and slower compression.
365e0c1b49fSNick Terrell                               * This parameter is useless for "fast" strategy.
366e0c1b49fSNick Terrell                               * It's still useful when using "dfast" strategy,
367e0c1b49fSNick Terrell                               * in which case it defines a secondary probe table.
368e0c1b49fSNick Terrell                               * Special: value 0 means "use default chainLog". */
369e0c1b49fSNick Terrell     ZSTD_c_searchLog=104,    /* Number of search attempts, as a power of 2.
370e0c1b49fSNick Terrell                               * More attempts result in better and slower compression.
371e0c1b49fSNick Terrell                               * This parameter is useless for "fast" and "dFast" strategies.
372e0c1b49fSNick Terrell                               * Special: value 0 means "use default searchLog". */
373e0c1b49fSNick Terrell     ZSTD_c_minMatch=105,     /* Minimum size of searched matches.
374e0c1b49fSNick Terrell                               * Note that Zstandard can still find matches of smaller size,
375e0c1b49fSNick Terrell                               * it just tweaks its search algorithm to look for this size and larger.
376e0c1b49fSNick Terrell                               * Larger values increase compression and decompression speed, but decrease ratio.
377e0c1b49fSNick Terrell                               * Must be clamped between ZSTD_MINMATCH_MIN and ZSTD_MINMATCH_MAX.
378e0c1b49fSNick Terrell                               * Note that currently, for all strategies < btopt, effective minimum is 4.
379e0c1b49fSNick Terrell                               *                    , for all strategies > fast, effective maximum is 6.
380e0c1b49fSNick Terrell                               * Special: value 0 means "use default minMatchLength". */
381e0c1b49fSNick Terrell     ZSTD_c_targetLength=106, /* Impact of this field depends on strategy.
382e0c1b49fSNick Terrell                               * For strategies btopt, btultra & btultra2:
383e0c1b49fSNick Terrell                               *     Length of Match considered "good enough" to stop search.
384e0c1b49fSNick Terrell                               *     Larger values make compression stronger, and slower.
385e0c1b49fSNick Terrell                               * For strategy fast:
386e0c1b49fSNick Terrell                               *     Distance between match sampling.
387e0c1b49fSNick Terrell                               *     Larger values make compression faster, and weaker.
388e0c1b49fSNick Terrell                               * Special: value 0 means "use default targetLength". */
389e0c1b49fSNick Terrell     ZSTD_c_strategy=107,     /* See ZSTD_strategy enum definition.
390e0c1b49fSNick Terrell                               * The higher the value of selected strategy, the more complex it is,
391e0c1b49fSNick Terrell                               * resulting in stronger and slower compression.
392e0c1b49fSNick Terrell                               * Special: value 0 means "use default strategy". */
393*65d1f550SNick Terrell 
394*65d1f550SNick Terrell     ZSTD_c_targetCBlockSize=130, /* v1.5.6+
395*65d1f550SNick Terrell                                   * Attempts to fit compressed block size into approximately targetCBlockSize.
396*65d1f550SNick Terrell                                   * Bound by ZSTD_TARGETCBLOCKSIZE_MIN and ZSTD_TARGETCBLOCKSIZE_MAX.
397*65d1f550SNick Terrell                                   * Note that it's not a guarantee, just a convergence target (default:0).
398*65d1f550SNick Terrell                                   * No target when targetCBlockSize == 0.
399*65d1f550SNick Terrell                                   * This is helpful in low bandwidth streaming environments to improve end-to-end latency,
400*65d1f550SNick Terrell                                   * when a client can make use of partial documents (a prominent example being Chrome).
401*65d1f550SNick Terrell                                   * Note: this parameter is stable since v1.5.6.
402*65d1f550SNick Terrell                                   * It was present as an experimental parameter in earlier versions,
403*65d1f550SNick Terrell                                   * but it's not recommended using it with earlier library versions
404*65d1f550SNick Terrell                                   * due to massive performance regressions.
405*65d1f550SNick Terrell                                   */
406e0c1b49fSNick Terrell     /* LDM mode parameters */
407e0c1b49fSNick Terrell     ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching.
408e0c1b49fSNick Terrell                                      * This parameter is designed to improve compression ratio
409e0c1b49fSNick Terrell                                      * for large inputs, by finding large matches at long distance.
410e0c1b49fSNick Terrell                                      * It increases memory usage and window size.
411e0c1b49fSNick Terrell                                      * Note: enabling this parameter increases default ZSTD_c_windowLog to 128 MB
412e0c1b49fSNick Terrell                                      * except when expressly set to a different value.
413e0c1b49fSNick Terrell                                      * Note: will be enabled by default if ZSTD_c_windowLog >= 128 MB and
414e0c1b49fSNick Terrell                                      * compression strategy >= ZSTD_btopt (== compression level 16+) */
415e0c1b49fSNick Terrell     ZSTD_c_ldmHashLog=161,   /* Size of the table for long distance matching, as a power of 2.
416e0c1b49fSNick Terrell                               * Larger values increase memory usage and compression ratio,
417e0c1b49fSNick Terrell                               * but decrease compression speed.
418e0c1b49fSNick Terrell                               * Must be clamped between ZSTD_HASHLOG_MIN and ZSTD_HASHLOG_MAX
419e0c1b49fSNick Terrell                               * default: windowlog - 7.
420e0c1b49fSNick Terrell                               * Special: value 0 means "automatically determine hashlog". */
421e0c1b49fSNick Terrell     ZSTD_c_ldmMinMatch=162,  /* Minimum match size for long distance matcher.
422e0c1b49fSNick Terrell                               * Larger/too small values usually decrease compression ratio.
423e0c1b49fSNick Terrell                               * Must be clamped between ZSTD_LDM_MINMATCH_MIN and ZSTD_LDM_MINMATCH_MAX.
424e0c1b49fSNick Terrell                               * Special: value 0 means "use default value" (default: 64). */
425e0c1b49fSNick Terrell     ZSTD_c_ldmBucketSizeLog=163, /* Log size of each bucket in the LDM hash table for collision resolution.
426e0c1b49fSNick Terrell                               * Larger values improve collision resolution but decrease compression speed.
427e0c1b49fSNick Terrell                               * The maximum value is ZSTD_LDM_BUCKETSIZELOG_MAX.
428e0c1b49fSNick Terrell                               * Special: value 0 means "use default value" (default: 3). */
429e0c1b49fSNick Terrell     ZSTD_c_ldmHashRateLog=164, /* Frequency of inserting/looking up entries into the LDM hash table.
430e0c1b49fSNick Terrell                               * Must be clamped between 0 and (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN).
431e0c1b49fSNick Terrell                               * Default is MAX(0, (windowLog - ldmHashLog)), optimizing hash table usage.
432e0c1b49fSNick Terrell                               * Larger values improve compression speed.
433e0c1b49fSNick Terrell                               * Deviating far from default value will likely result in a compression ratio decrease.
434e0c1b49fSNick Terrell                               * Special: value 0 means "automatically determine hashRateLog". */
435e0c1b49fSNick Terrell 
436e0c1b49fSNick Terrell     /* frame parameters */
437e0c1b49fSNick Terrell     ZSTD_c_contentSizeFlag=200, /* Content size will be written into frame header _whenever known_ (default:1)
438e0c1b49fSNick Terrell                               * Content size must be known at the beginning of compression.
439e0c1b49fSNick Terrell                               * This is automatically the case when using ZSTD_compress2(),
440e0c1b49fSNick Terrell                               * For streaming scenarios, content size must be provided with ZSTD_CCtx_setPledgedSrcSize() */
441e0c1b49fSNick Terrell     ZSTD_c_checksumFlag=201, /* A 32-bits checksum of content is written at end of frame (default:0) */
442e0c1b49fSNick Terrell     ZSTD_c_dictIDFlag=202,   /* When applicable, dictionary's ID is written into frame header (default:1) */
443e0c1b49fSNick Terrell 
444e0c1b49fSNick Terrell     /* multi-threading parameters */
445e0c1b49fSNick Terrell     /* These parameters are only active if multi-threading is enabled (compiled with build macro ZSTD_MULTITHREAD).
446e0c1b49fSNick Terrell      * Otherwise, trying to set any other value than default (0) will be a no-op and return an error.
447e0c1b49fSNick Terrell      * In a situation where it's unknown if the linked library supports multi-threading or not,
448e0c1b49fSNick Terrell      * setting ZSTD_c_nbWorkers to any value >= 1 and consulting the return value provides a quick way to check this property.
449cf30f6a5SNick Terrell      */
450e0c1b49fSNick Terrell     ZSTD_c_nbWorkers=400,    /* Select how many threads will be spawned to compress in parallel.
451e0c1b49fSNick Terrell                               * When nbWorkers >= 1, triggers asynchronous mode when invoking ZSTD_compressStream*() :
452e0c1b49fSNick Terrell                               * ZSTD_compressStream*() consumes input and flush output if possible, but immediately gives back control to caller,
453e0c1b49fSNick Terrell                               * while compression is performed in parallel, within worker thread(s).
454e0c1b49fSNick Terrell                               * (note : a strong exception to this rule is when first invocation of ZSTD_compressStream2() sets ZSTD_e_end :
455e0c1b49fSNick Terrell                               *  in which case, ZSTD_compressStream2() delegates to ZSTD_compress2(), which is always a blocking call).
456e0c1b49fSNick Terrell                               * More workers improve speed, but also increase memory usage.
457e0c1b49fSNick Terrell                               * Default value is `0`, aka "single-threaded mode" : no worker is spawned,
458e0c1b49fSNick Terrell                               * compression is performed inside Caller's thread, and all invocations are blocking */
459e0c1b49fSNick Terrell     ZSTD_c_jobSize=401,      /* Size of a compression job. This value is enforced only when nbWorkers >= 1.
460e0c1b49fSNick Terrell                               * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads.
461e0c1b49fSNick Terrell                               * 0 means default, which is dynamically determined based on compression parameters.
4622aa14b1aSNick Terrell                               * Job size must be a minimum of overlap size, or ZSTDMT_JOBSIZE_MIN (= 512 KB), whichever is largest.
463e0c1b49fSNick Terrell                               * The minimum size is automatically and transparently enforced. */
464e0c1b49fSNick Terrell     ZSTD_c_overlapLog=402,   /* Control the overlap size, as a fraction of window size.
465e0c1b49fSNick Terrell                               * The overlap size is an amount of data reloaded from previous job at the beginning of a new job.
466e0c1b49fSNick Terrell                               * It helps preserve compression ratio, while each job is compressed in parallel.
467e0c1b49fSNick Terrell                               * This value is enforced only when nbWorkers >= 1.
468e0c1b49fSNick Terrell                               * Larger values increase compression ratio, but decrease speed.
469e0c1b49fSNick Terrell                               * Possible values range from 0 to 9 :
470e0c1b49fSNick Terrell                               * - 0 means "default" : value will be determined by the library, depending on strategy
471e0c1b49fSNick Terrell                               * - 1 means "no overlap"
472e0c1b49fSNick Terrell                               * - 9 means "full overlap", using a full window size.
473e0c1b49fSNick Terrell                               * Each intermediate rank increases/decreases load size by a factor 2 :
474e0c1b49fSNick Terrell                               * 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
475e0c1b49fSNick Terrell                               * default value varies between 6 and 9, depending on strategy */
476e0c1b49fSNick Terrell 
477e0c1b49fSNick Terrell     /* note : additional experimental parameters are also available
478e0c1b49fSNick Terrell      * within the experimental section of the API.
479e0c1b49fSNick Terrell      * At the time of this writing, they include :
480e0c1b49fSNick Terrell      * ZSTD_c_rsyncable
481e0c1b49fSNick Terrell      * ZSTD_c_format
482e0c1b49fSNick Terrell      * ZSTD_c_forceMaxWindow
483e0c1b49fSNick Terrell      * ZSTD_c_forceAttachDict
484e0c1b49fSNick Terrell      * ZSTD_c_literalCompressionMode
485e0c1b49fSNick Terrell      * ZSTD_c_srcSizeHint
486e0c1b49fSNick Terrell      * ZSTD_c_enableDedicatedDictSearch
487e0c1b49fSNick Terrell      * ZSTD_c_stableInBuffer
488e0c1b49fSNick Terrell      * ZSTD_c_stableOutBuffer
489e0c1b49fSNick Terrell      * ZSTD_c_blockDelimiters
490e0c1b49fSNick Terrell      * ZSTD_c_validateSequences
491*65d1f550SNick Terrell      * ZSTD_c_blockSplitterLevel
492*65d1f550SNick Terrell      * ZSTD_c_splitAfterSequences
4932aa14b1aSNick Terrell      * ZSTD_c_useRowMatchFinder
494*65d1f550SNick Terrell      * ZSTD_c_prefetchCDictTables
495*65d1f550SNick Terrell      * ZSTD_c_enableSeqProducerFallback
496*65d1f550SNick Terrell      * ZSTD_c_maxBlockSize
497e0c1b49fSNick Terrell      * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
498e0c1b49fSNick Terrell      * note : never ever use experimentalParam? names directly;
499e0c1b49fSNick Terrell      *        also, the enums values themselves are unstable and can still change.
500e0c1b49fSNick Terrell      */
501e0c1b49fSNick Terrell      ZSTD_c_experimentalParam1=500,
502e0c1b49fSNick Terrell      ZSTD_c_experimentalParam2=10,
503e0c1b49fSNick Terrell      ZSTD_c_experimentalParam3=1000,
504e0c1b49fSNick Terrell      ZSTD_c_experimentalParam4=1001,
505e0c1b49fSNick Terrell      ZSTD_c_experimentalParam5=1002,
506*65d1f550SNick Terrell      /* was ZSTD_c_experimentalParam6=1003; is now ZSTD_c_targetCBlockSize */
507e0c1b49fSNick Terrell      ZSTD_c_experimentalParam7=1004,
508e0c1b49fSNick Terrell      ZSTD_c_experimentalParam8=1005,
509e0c1b49fSNick Terrell      ZSTD_c_experimentalParam9=1006,
510e0c1b49fSNick Terrell      ZSTD_c_experimentalParam10=1007,
511e0c1b49fSNick Terrell      ZSTD_c_experimentalParam11=1008,
5122aa14b1aSNick Terrell      ZSTD_c_experimentalParam12=1009,
5132aa14b1aSNick Terrell      ZSTD_c_experimentalParam13=1010,
5142aa14b1aSNick Terrell      ZSTD_c_experimentalParam14=1011,
515*65d1f550SNick Terrell      ZSTD_c_experimentalParam15=1012,
516*65d1f550SNick Terrell      ZSTD_c_experimentalParam16=1013,
517*65d1f550SNick Terrell      ZSTD_c_experimentalParam17=1014,
518*65d1f550SNick Terrell      ZSTD_c_experimentalParam18=1015,
519*65d1f550SNick Terrell      ZSTD_c_experimentalParam19=1016,
520*65d1f550SNick Terrell      ZSTD_c_experimentalParam20=1017
521e0c1b49fSNick Terrell } ZSTD_cParameter;
522e0c1b49fSNick Terrell 
523cf30f6a5SNick Terrell typedef struct {
524e0c1b49fSNick Terrell     size_t error;
525e0c1b49fSNick Terrell     int lowerBound;
526e0c1b49fSNick Terrell     int upperBound;
527e0c1b49fSNick Terrell } ZSTD_bounds;
528e0c1b49fSNick Terrell 
529e0c1b49fSNick Terrell /*! ZSTD_cParam_getBounds() :
530e0c1b49fSNick Terrell  *  All parameters must belong to an interval with lower and upper bounds,
531e0c1b49fSNick Terrell  *  otherwise they will either trigger an error or be automatically clamped.
532e0c1b49fSNick Terrell  * @return : a structure, ZSTD_bounds, which contains
533e0c1b49fSNick Terrell  *         - an error status field, which must be tested using ZSTD_isError()
534e0c1b49fSNick Terrell  *         - lower and upper bounds, both inclusive
535e0c1b49fSNick Terrell  */
536e0c1b49fSNick Terrell ZSTDLIB_API ZSTD_bounds ZSTD_cParam_getBounds(ZSTD_cParameter cParam);
537e0c1b49fSNick Terrell 
538e0c1b49fSNick Terrell /*! ZSTD_CCtx_setParameter() :
539e0c1b49fSNick Terrell  *  Set one compression parameter, selected by enum ZSTD_cParameter.
540e0c1b49fSNick Terrell  *  All parameters have valid bounds. Bounds can be queried using ZSTD_cParam_getBounds().
541e0c1b49fSNick Terrell  *  Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter).
542e0c1b49fSNick Terrell  *  Setting a parameter is generally only possible during frame initialization (before starting compression).
543e0c1b49fSNick Terrell  *  Exception : when using multi-threading mode (nbWorkers >= 1),
544e0c1b49fSNick Terrell  *              the following parameters can be updated _during_ compression (within same frame):
545e0c1b49fSNick Terrell  *              => compressionLevel, hashLog, chainLog, searchLog, minMatch, targetLength and strategy.
546e0c1b49fSNick Terrell  *              new parameters will be active for next job only (after a flush()).
547e0c1b49fSNick Terrell  * @return : an error code (which can be tested using ZSTD_isError()).
548e0c1b49fSNick Terrell  */
549e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_CCtx_setParameter(ZSTD_CCtx* cctx, ZSTD_cParameter param, int value);
550e0c1b49fSNick Terrell 
551e0c1b49fSNick Terrell /*! ZSTD_CCtx_setPledgedSrcSize() :
552e0c1b49fSNick Terrell  *  Total input data size to be compressed as a single frame.
553e0c1b49fSNick Terrell  *  Value will be written in frame header, unless if explicitly forbidden using ZSTD_c_contentSizeFlag.
554e0c1b49fSNick Terrell  *  This value will also be controlled at end of frame, and trigger an error if not respected.
555e0c1b49fSNick Terrell  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
556e0c1b49fSNick Terrell  *  Note 1 : pledgedSrcSize==0 actually means zero, aka an empty frame.
557e0c1b49fSNick Terrell  *           In order to mean "unknown content size", pass constant ZSTD_CONTENTSIZE_UNKNOWN.
558e0c1b49fSNick Terrell  *           ZSTD_CONTENTSIZE_UNKNOWN is default value for any new frame.
559e0c1b49fSNick Terrell  *  Note 2 : pledgedSrcSize is only valid once, for the next frame.
560e0c1b49fSNick Terrell  *           It's discarded at the end of the frame, and replaced by ZSTD_CONTENTSIZE_UNKNOWN.
561e0c1b49fSNick Terrell  *  Note 3 : Whenever all input data is provided and consumed in a single round,
562e0c1b49fSNick Terrell  *           for example with ZSTD_compress2(),
563e0c1b49fSNick Terrell  *           or invoking immediately ZSTD_compressStream2(,,,ZSTD_e_end),
564e0c1b49fSNick Terrell  *           this value is automatically overridden by srcSize instead.
565e0c1b49fSNick Terrell  */
566e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_CCtx_setPledgedSrcSize(ZSTD_CCtx* cctx, unsigned long long pledgedSrcSize);
567e0c1b49fSNick Terrell 
568e0c1b49fSNick Terrell typedef enum {
569e0c1b49fSNick Terrell     ZSTD_reset_session_only = 1,
570e0c1b49fSNick Terrell     ZSTD_reset_parameters = 2,
571e0c1b49fSNick Terrell     ZSTD_reset_session_and_parameters = 3
572e0c1b49fSNick Terrell } ZSTD_ResetDirective;
573e0c1b49fSNick Terrell 
574e0c1b49fSNick Terrell /*! ZSTD_CCtx_reset() :
575e0c1b49fSNick Terrell  *  There are 2 different things that can be reset, independently or jointly :
576e0c1b49fSNick Terrell  *  - The session : will stop compressing current frame, and make CCtx ready to start a new one.
577e0c1b49fSNick Terrell  *                  Useful after an error, or to interrupt any ongoing compression.
578e0c1b49fSNick Terrell  *                  Any internal data not yet flushed is cancelled.
579e0c1b49fSNick Terrell  *                  Compression parameters and dictionary remain unchanged.
580e0c1b49fSNick Terrell  *                  They will be used to compress next frame.
581e0c1b49fSNick Terrell  *                  Resetting session never fails.
582e0c1b49fSNick Terrell  *  - The parameters : changes all parameters back to "default".
583*65d1f550SNick Terrell  *                  This also removes any reference to any dictionary or external sequence producer.
584e0c1b49fSNick Terrell  *                  Parameters can only be changed between 2 sessions (i.e. no compression is currently ongoing)
585e0c1b49fSNick Terrell  *                  otherwise the reset fails, and function returns an error value (which can be tested using ZSTD_isError())
586e0c1b49fSNick Terrell  *  - Both : similar to resetting the session, followed by resetting parameters.
587e0c1b49fSNick Terrell  */
588e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset);
589e0c1b49fSNick Terrell 
590e0c1b49fSNick Terrell /*! ZSTD_compress2() :
591e0c1b49fSNick Terrell  *  Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API.
592*65d1f550SNick Terrell  *  (note that this entry point doesn't even expose a compression level parameter).
593e0c1b49fSNick Terrell  *  ZSTD_compress2() always starts a new frame.
594e0c1b49fSNick Terrell  *  Should cctx hold data from a previously unfinished frame, everything about it is forgotten.
595e0c1b49fSNick Terrell  *  - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()
596e0c1b49fSNick Terrell  *  - The function is always blocking, returns when compression is completed.
597*65d1f550SNick Terrell  *  NOTE: Providing `dstCapacity >= ZSTD_compressBound(srcSize)` guarantees that zstd will have
598*65d1f550SNick Terrell  *        enough space to successfully compress the data, though it is possible it fails for other reasons.
599e0c1b49fSNick Terrell  * @return : compressed size written into `dst` (<= `dstCapacity),
600e0c1b49fSNick Terrell  *           or an error code if it fails (which can be tested using ZSTD_isError()).
601e0c1b49fSNick Terrell  */
602e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx,
603e0c1b49fSNick Terrell                                    void* dst, size_t dstCapacity,
604e0c1b49fSNick Terrell                              const void* src, size_t srcSize);
605e0c1b49fSNick Terrell 
606e0c1b49fSNick Terrell 
6072aa14b1aSNick Terrell /* *********************************************
6082aa14b1aSNick Terrell *  Advanced decompression API (Requires v1.4.0+)
6092aa14b1aSNick Terrell ************************************************/
610e0c1b49fSNick Terrell 
611e0c1b49fSNick Terrell /* The advanced API pushes parameters one by one into an existing DCtx context.
612e0c1b49fSNick Terrell  * Parameters are sticky, and remain valid for all following frames
613e0c1b49fSNick Terrell  * using the same DCtx context.
614e0c1b49fSNick Terrell  * It's possible to reset parameters to default values using ZSTD_DCtx_reset().
615e0c1b49fSNick Terrell  * Note : This API is compatible with existing ZSTD_decompressDCtx() and ZSTD_decompressStream().
616e0c1b49fSNick Terrell  *        Therefore, no new decompression function is necessary.
617e0c1b49fSNick Terrell  */
618e0c1b49fSNick Terrell 
619e0c1b49fSNick Terrell typedef enum {
620e0c1b49fSNick Terrell 
621e0c1b49fSNick Terrell     ZSTD_d_windowLogMax=100, /* Select a size limit (in power of 2) beyond which
622e0c1b49fSNick Terrell                               * the streaming API will refuse to allocate memory buffer
623e0c1b49fSNick Terrell                               * in order to protect the host from unreasonable memory requirements.
624e0c1b49fSNick Terrell                               * This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode.
625e0c1b49fSNick Terrell                               * By default, a decompression context accepts window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT).
626e0c1b49fSNick Terrell                               * Special: value 0 means "use default maximum windowLog". */
627e0c1b49fSNick Terrell 
628e0c1b49fSNick Terrell     /* note : additional experimental parameters are also available
629e0c1b49fSNick Terrell      * within the experimental section of the API.
630e0c1b49fSNick Terrell      * At the time of this writing, they include :
631e0c1b49fSNick Terrell      * ZSTD_d_format
632e0c1b49fSNick Terrell      * ZSTD_d_stableOutBuffer
633e0c1b49fSNick Terrell      * ZSTD_d_forceIgnoreChecksum
634e0c1b49fSNick Terrell      * ZSTD_d_refMultipleDDicts
635*65d1f550SNick Terrell      * ZSTD_d_disableHuffmanAssembly
636*65d1f550SNick Terrell      * ZSTD_d_maxBlockSize
637e0c1b49fSNick Terrell      * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
638e0c1b49fSNick Terrell      * note : never ever use experimentalParam? names directly
639e0c1b49fSNick Terrell      */
640e0c1b49fSNick Terrell      ZSTD_d_experimentalParam1=1000,
641e0c1b49fSNick Terrell      ZSTD_d_experimentalParam2=1001,
642e0c1b49fSNick Terrell      ZSTD_d_experimentalParam3=1002,
643*65d1f550SNick Terrell      ZSTD_d_experimentalParam4=1003,
644*65d1f550SNick Terrell      ZSTD_d_experimentalParam5=1004,
645*65d1f550SNick Terrell      ZSTD_d_experimentalParam6=1005
646e0c1b49fSNick Terrell 
647e0c1b49fSNick Terrell } ZSTD_dParameter;
648e0c1b49fSNick Terrell 
649e0c1b49fSNick Terrell /*! ZSTD_dParam_getBounds() :
650e0c1b49fSNick Terrell  *  All parameters must belong to an interval with lower and upper bounds,
651e0c1b49fSNick Terrell  *  otherwise they will either trigger an error or be automatically clamped.
652e0c1b49fSNick Terrell  * @return : a structure, ZSTD_bounds, which contains
653e0c1b49fSNick Terrell  *         - an error status field, which must be tested using ZSTD_isError()
654e0c1b49fSNick Terrell  *         - both lower and upper bounds, inclusive
655e0c1b49fSNick Terrell  */
656e0c1b49fSNick Terrell ZSTDLIB_API ZSTD_bounds ZSTD_dParam_getBounds(ZSTD_dParameter dParam);
657e0c1b49fSNick Terrell 
658e0c1b49fSNick Terrell /*! ZSTD_DCtx_setParameter() :
659e0c1b49fSNick Terrell  *  Set one compression parameter, selected by enum ZSTD_dParameter.
660e0c1b49fSNick Terrell  *  All parameters have valid bounds. Bounds can be queried using ZSTD_dParam_getBounds().
661e0c1b49fSNick Terrell  *  Providing a value beyond bound will either clamp it, or trigger an error (depending on parameter).
662e0c1b49fSNick Terrell  *  Setting a parameter is only possible during frame initialization (before starting decompression).
663e0c1b49fSNick Terrell  * @return : 0, or an error code (which can be tested using ZSTD_isError()).
664e0c1b49fSNick Terrell  */
665e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_DCtx_setParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int value);
666e0c1b49fSNick Terrell 
667e0c1b49fSNick Terrell /*! ZSTD_DCtx_reset() :
668e0c1b49fSNick Terrell  *  Return a DCtx to clean state.
669e0c1b49fSNick Terrell  *  Session and parameters can be reset jointly or separately.
670e0c1b49fSNick Terrell  *  Parameters can only be reset when no active frame is being decompressed.
671e0c1b49fSNick Terrell  * @return : 0, or an error code, which can be tested with ZSTD_isError()
672e0c1b49fSNick Terrell  */
673e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_DCtx_reset(ZSTD_DCtx* dctx, ZSTD_ResetDirective reset);
674e0c1b49fSNick Terrell 
675e0c1b49fSNick Terrell 
676e0c1b49fSNick Terrell /* **************************
677e0c1b49fSNick Terrell *  Streaming
678e0c1b49fSNick Terrell ****************************/
679e0c1b49fSNick Terrell 
680e0c1b49fSNick Terrell typedef struct ZSTD_inBuffer_s {
681e0c1b49fSNick Terrell   const void* src;    /*< start of input buffer */
682e0c1b49fSNick Terrell   size_t size;        /*< size of input buffer */
683e0c1b49fSNick Terrell   size_t pos;         /*< position where reading stopped. Will be updated. Necessarily 0 <= pos <= size */
684e0c1b49fSNick Terrell } ZSTD_inBuffer;
685e0c1b49fSNick Terrell 
686e0c1b49fSNick Terrell typedef struct ZSTD_outBuffer_s {
687e0c1b49fSNick Terrell   void*  dst;         /*< start of output buffer */
688e0c1b49fSNick Terrell   size_t size;        /*< size of output buffer */
689e0c1b49fSNick Terrell   size_t pos;         /*< position where writing stopped. Will be updated. Necessarily 0 <= pos <= size */
690e0c1b49fSNick Terrell } ZSTD_outBuffer;
691e0c1b49fSNick Terrell 
692e0c1b49fSNick Terrell 
693e0c1b49fSNick Terrell 
694e0c1b49fSNick Terrell /*-***********************************************************************
695e0c1b49fSNick Terrell *  Streaming compression - HowTo
696e0c1b49fSNick Terrell *
697e0c1b49fSNick Terrell *  A ZSTD_CStream object is required to track streaming operation.
698e0c1b49fSNick Terrell *  Use ZSTD_createCStream() and ZSTD_freeCStream() to create/release resources.
699e0c1b49fSNick Terrell *  ZSTD_CStream objects can be reused multiple times on consecutive compression operations.
700*65d1f550SNick Terrell *  It is recommended to reuse ZSTD_CStream since it will play nicer with system's memory, by re-using already allocated memory.
701e0c1b49fSNick Terrell *
702e0c1b49fSNick Terrell *  For parallel execution, use one separate ZSTD_CStream per thread.
703e0c1b49fSNick Terrell *
704e0c1b49fSNick Terrell *  note : since v1.3.0, ZSTD_CStream and ZSTD_CCtx are the same thing.
705e0c1b49fSNick Terrell *
706e0c1b49fSNick Terrell *  Parameters are sticky : when starting a new compression on the same context,
707*65d1f550SNick Terrell *  it will reuse the same sticky parameters as previous compression session.
708e0c1b49fSNick Terrell *  When in doubt, it's recommended to fully initialize the context before usage.
709e0c1b49fSNick Terrell *  Use ZSTD_CCtx_reset() to reset the context and ZSTD_CCtx_setParameter(),
710e0c1b49fSNick Terrell *  ZSTD_CCtx_setPledgedSrcSize(), or ZSTD_CCtx_loadDictionary() and friends to
711e0c1b49fSNick Terrell *  set more specific parameters, the pledged source size, or load a dictionary.
712e0c1b49fSNick Terrell *
713e0c1b49fSNick Terrell *  Use ZSTD_compressStream2() with ZSTD_e_continue as many times as necessary to
714e0c1b49fSNick Terrell *  consume input stream. The function will automatically update both `pos`
715e0c1b49fSNick Terrell *  fields within `input` and `output`.
716e0c1b49fSNick Terrell *  Note that the function may not consume the entire input, for example, because
717e0c1b49fSNick Terrell *  the output buffer is already full, in which case `input.pos < input.size`.
718e0c1b49fSNick Terrell *  The caller must check if input has been entirely consumed.
719e0c1b49fSNick Terrell *  If not, the caller must make some room to receive more compressed data,
720e0c1b49fSNick Terrell *  and then present again remaining input data.
721e0c1b49fSNick Terrell *  note: ZSTD_e_continue is guaranteed to make some forward progress when called,
722e0c1b49fSNick Terrell *        but doesn't guarantee maximal forward progress. This is especially relevant
723e0c1b49fSNick Terrell *        when compressing with multiple threads. The call won't block if it can
724e0c1b49fSNick Terrell *        consume some input, but if it can't it will wait for some, but not all,
725e0c1b49fSNick Terrell *        output to be flushed.
726e0c1b49fSNick Terrell * @return : provides a minimum amount of data remaining to be flushed from internal buffers
727e0c1b49fSNick Terrell *           or an error code, which can be tested using ZSTD_isError().
728e0c1b49fSNick Terrell *
729e0c1b49fSNick Terrell *  At any moment, it's possible to flush whatever data might remain stuck within internal buffer,
730e0c1b49fSNick Terrell *  using ZSTD_compressStream2() with ZSTD_e_flush. `output->pos` will be updated.
731e0c1b49fSNick Terrell *  Note that, if `output->size` is too small, a single invocation with ZSTD_e_flush might not be enough (return code > 0).
732e0c1b49fSNick Terrell *  In which case, make some room to receive more compressed data, and call again ZSTD_compressStream2() with ZSTD_e_flush.
733e0c1b49fSNick Terrell *  You must continue calling ZSTD_compressStream2() with ZSTD_e_flush until it returns 0, at which point you can change the
734e0c1b49fSNick Terrell *  operation.
735e0c1b49fSNick Terrell *  note: ZSTD_e_flush will flush as much output as possible, meaning when compressing with multiple threads, it will
736e0c1b49fSNick Terrell *        block until the flush is complete or the output buffer is full.
737e0c1b49fSNick Terrell *  @return : 0 if internal buffers are entirely flushed,
738e0c1b49fSNick Terrell *            >0 if some data still present within internal buffer (the value is minimal estimation of remaining size),
739e0c1b49fSNick Terrell *            or an error code, which can be tested using ZSTD_isError().
740e0c1b49fSNick Terrell *
741e0c1b49fSNick Terrell *  Calling ZSTD_compressStream2() with ZSTD_e_end instructs to finish a frame.
742e0c1b49fSNick Terrell *  It will perform a flush and write frame epilogue.
743e0c1b49fSNick Terrell *  The epilogue is required for decoders to consider a frame completed.
744e0c1b49fSNick Terrell *  flush operation is the same, and follows same rules as calling ZSTD_compressStream2() with ZSTD_e_flush.
745e0c1b49fSNick Terrell *  You must continue calling ZSTD_compressStream2() with ZSTD_e_end until it returns 0, at which point you are free to
746e0c1b49fSNick Terrell *  start a new frame.
747e0c1b49fSNick Terrell *  note: ZSTD_e_end will flush as much output as possible, meaning when compressing with multiple threads, it will
748e0c1b49fSNick Terrell *        block until the flush is complete or the output buffer is full.
749e0c1b49fSNick Terrell *  @return : 0 if frame fully completed and fully flushed,
750e0c1b49fSNick Terrell *            >0 if some data still present within internal buffer (the value is minimal estimation of remaining size),
751e0c1b49fSNick Terrell *            or an error code, which can be tested using ZSTD_isError().
752e0c1b49fSNick Terrell *
753e0c1b49fSNick Terrell * *******************************************************************/
754e0c1b49fSNick Terrell 
755e0c1b49fSNick Terrell typedef ZSTD_CCtx ZSTD_CStream;  /*< CCtx and CStream are now effectively same object (>= v1.3.0) */
756e0c1b49fSNick Terrell                                  /* Continue to distinguish them for compatibility with older versions <= v1.2.0 */
757e0c1b49fSNick Terrell /*===== ZSTD_CStream management functions =====*/
758e0c1b49fSNick Terrell ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(void);
759e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs);  /* accept NULL pointer */
760e0c1b49fSNick Terrell 
761e0c1b49fSNick Terrell /*===== Streaming compression functions =====*/
762e0c1b49fSNick Terrell typedef enum {
763e0c1b49fSNick Terrell     ZSTD_e_continue=0, /* collect more data, encoder decides when to output compressed result, for optimal compression ratio */
764e0c1b49fSNick Terrell     ZSTD_e_flush=1,    /* flush any data provided so far,
765e0c1b49fSNick Terrell                         * it creates (at least) one new block, that can be decoded immediately on reception;
766e0c1b49fSNick Terrell                         * frame will continue: any future data can still reference previously compressed data, improving compression.
767e0c1b49fSNick Terrell                         * note : multithreaded compression will block to flush as much output as possible. */
768e0c1b49fSNick Terrell     ZSTD_e_end=2       /* flush any remaining data _and_ close current frame.
769e0c1b49fSNick Terrell                         * note that frame is only closed after compressed data is fully flushed (return value == 0).
770e0c1b49fSNick Terrell                         * After that point, any additional data starts a new frame.
771e0c1b49fSNick Terrell                         * note : each frame is independent (does not reference any content from previous frame).
772e0c1b49fSNick Terrell                         : note : multithreaded compression will block to flush as much output as possible. */
773e0c1b49fSNick Terrell } ZSTD_EndDirective;
774e0c1b49fSNick Terrell 
7752aa14b1aSNick Terrell /*! ZSTD_compressStream2() : Requires v1.4.0+
776e0c1b49fSNick Terrell  *  Behaves about the same as ZSTD_compressStream, with additional control on end directive.
777e0c1b49fSNick Terrell  *  - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()
778e0c1b49fSNick Terrell  *  - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode)
779e0c1b49fSNick Terrell  *  - output->pos must be <= dstCapacity, input->pos must be <= srcSize
780e0c1b49fSNick Terrell  *  - output->pos and input->pos will be updated. They are guaranteed to remain below their respective limit.
781e0c1b49fSNick Terrell  *  - endOp must be a valid directive
782e0c1b49fSNick Terrell  *  - When nbWorkers==0 (default), function is blocking : it completes its job before returning to caller.
783e0c1b49fSNick Terrell  *  - 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,
784e0c1b49fSNick Terrell  *                                                  and then immediately returns, just indicating that there is some data remaining to be flushed.
785e0c1b49fSNick Terrell  *                                                  The function nonetheless guarantees forward progress : it will return only after it reads or write at least 1+ byte.
786e0c1b49fSNick Terrell  *  - 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.
787e0c1b49fSNick Terrell  *  - @return provides a minimum amount of data remaining to be flushed from internal buffers
788e0c1b49fSNick Terrell  *            or an error code, which can be tested using ZSTD_isError().
789e0c1b49fSNick Terrell  *            if @return != 0, flush is not fully completed, there is still some data left within internal buffers.
790e0c1b49fSNick Terrell  *            This is useful for ZSTD_e_flush, since in this case more flushes are necessary to empty all buffers.
791e0c1b49fSNick Terrell  *            For ZSTD_e_end, @return == 0 when internal buffers are fully flushed and frame is completed.
792e0c1b49fSNick Terrell  *  - after a ZSTD_e_end directive, if internal buffer is not fully flushed (@return != 0),
793e0c1b49fSNick Terrell  *            only ZSTD_e_end or ZSTD_e_flush operations are allowed.
794e0c1b49fSNick Terrell  *            Before starting a new compression job, or changing compression parameters,
795e0c1b49fSNick Terrell  *            it is required to fully flush internal buffers.
796*65d1f550SNick Terrell  *  - note: if an operation ends with an error, it may leave @cctx in an undefined state.
797*65d1f550SNick Terrell  *          Therefore, it's UB to invoke ZSTD_compressStream2() of ZSTD_compressStream() on such a state.
798*65d1f550SNick Terrell  *          In order to be re-employed after an error, a state must be reset,
799*65d1f550SNick Terrell  *          which can be done explicitly (ZSTD_CCtx_reset()),
800*65d1f550SNick Terrell  *          or is sometimes implied by methods starting a new compression job (ZSTD_initCStream(), ZSTD_compressCCtx())
801e0c1b49fSNick Terrell  */
802e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
803e0c1b49fSNick Terrell                                          ZSTD_outBuffer* output,
804e0c1b49fSNick Terrell                                          ZSTD_inBuffer* input,
805e0c1b49fSNick Terrell                                          ZSTD_EndDirective endOp);
806e0c1b49fSNick Terrell 
807e0c1b49fSNick Terrell 
808e0c1b49fSNick Terrell /* These buffer sizes are softly recommended.
809e0c1b49fSNick Terrell  * They are not required : ZSTD_compressStream*() happily accepts any buffer size, for both input and output.
810e0c1b49fSNick Terrell  * Respecting the recommended size just makes it a bit easier for ZSTD_compressStream*(),
811e0c1b49fSNick Terrell  * reducing the amount of memory shuffling and buffering, resulting in minor performance savings.
812e0c1b49fSNick Terrell  *
813e0c1b49fSNick Terrell  * However, note that these recommendations are from the perspective of a C caller program.
814e0c1b49fSNick Terrell  * If the streaming interface is invoked from some other language,
815e0c1b49fSNick Terrell  * especially managed ones such as Java or Go, through a foreign function interface such as jni or cgo,
816e0c1b49fSNick Terrell  * a major performance rule is to reduce crossing such interface to an absolute minimum.
817e0c1b49fSNick Terrell  * It's not rare that performance ends being spent more into the interface, rather than compression itself.
818e0c1b49fSNick Terrell  * In which cases, prefer using large buffers, as large as practical,
819e0c1b49fSNick Terrell  * for both input and output, to reduce the nb of roundtrips.
820e0c1b49fSNick Terrell  */
821e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_CStreamInSize(void);    /*< recommended size for input buffer */
822e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_CStreamOutSize(void);   /*< recommended size for output buffer. Guarantee to successfully flush at least one complete compressed block. */
823e0c1b49fSNick Terrell 
824e0c1b49fSNick Terrell 
825e0c1b49fSNick Terrell /* *****************************************************************************
8262aa14b1aSNick Terrell  * This following is a legacy streaming API, available since v1.0+ .
827e0c1b49fSNick Terrell  * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2().
828e0c1b49fSNick Terrell  * It is redundant, but remains fully supported.
829e0c1b49fSNick Terrell  ******************************************************************************/
830e0c1b49fSNick Terrell 
831e0c1b49fSNick Terrell /*!
832e0c1b49fSNick Terrell  * Equivalent to:
833e0c1b49fSNick Terrell  *
834e0c1b49fSNick Terrell  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
835e0c1b49fSNick Terrell  *     ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)
836e0c1b49fSNick Terrell  *     ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);
837*65d1f550SNick Terrell  *
838*65d1f550SNick Terrell  * Note that ZSTD_initCStream() clears any previously set dictionary. Use the new API
839*65d1f550SNick Terrell  * to compress with a dictionary.
840e0c1b49fSNick Terrell  */
841e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_initCStream(ZSTD_CStream* zcs, int compressionLevel);
842e0c1b49fSNick Terrell /*!
843e0c1b49fSNick Terrell  * Alternative for ZSTD_compressStream2(zcs, output, input, ZSTD_e_continue).
844e0c1b49fSNick Terrell  * NOTE: The return value is different. ZSTD_compressStream() returns a hint for
845e0c1b49fSNick Terrell  * the next read size (if non-zero and not an error). ZSTD_compressStream2()
846e0c1b49fSNick Terrell  * returns the minimum nb of bytes left to flush (if non-zero and not an error).
847e0c1b49fSNick Terrell  */
848e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_compressStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output, ZSTD_inBuffer* input);
849e0c1b49fSNick Terrell /*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_flush). */
850e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_flushStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output);
851e0c1b49fSNick Terrell /*! Equivalent to ZSTD_compressStream2(zcs, output, &emptyInput, ZSTD_e_end). */
852e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output);
853e0c1b49fSNick Terrell 
854e0c1b49fSNick Terrell 
855e0c1b49fSNick Terrell /*-***************************************************************************
856e0c1b49fSNick Terrell *  Streaming decompression - HowTo
857e0c1b49fSNick Terrell *
858e0c1b49fSNick Terrell *  A ZSTD_DStream object is required to track streaming operations.
859e0c1b49fSNick Terrell *  Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources.
860*65d1f550SNick Terrell *  ZSTD_DStream objects can be re-employed multiple times.
861e0c1b49fSNick Terrell *
862e0c1b49fSNick Terrell *  Use ZSTD_initDStream() to start a new decompression operation.
863e0c1b49fSNick Terrell * @return : recommended first input size
864e0c1b49fSNick Terrell *  Alternatively, use advanced API to set specific properties.
865e0c1b49fSNick Terrell *
866e0c1b49fSNick Terrell *  Use ZSTD_decompressStream() repetitively to consume your input.
867e0c1b49fSNick Terrell *  The function will update both `pos` fields.
868e0c1b49fSNick Terrell *  If `input.pos < input.size`, some input has not been consumed.
869e0c1b49fSNick Terrell *  It's up to the caller to present again remaining data.
870*65d1f550SNick Terrell *
871e0c1b49fSNick Terrell *  The function tries to flush all data decoded immediately, respecting output buffer size.
872e0c1b49fSNick Terrell *  If `output.pos < output.size`, decoder has flushed everything it could.
873*65d1f550SNick Terrell *
874*65d1f550SNick Terrell *  However, when `output.pos == output.size`, it's more difficult to know.
875*65d1f550SNick Terrell *  If @return > 0, the frame is not complete, meaning
876*65d1f550SNick Terrell *  either there is still some data left to flush within internal buffers,
877*65d1f550SNick Terrell *  or there is more input to read to complete the frame (or both).
878e0c1b49fSNick Terrell *  In which case, call ZSTD_decompressStream() again to flush whatever remains in the buffer.
879e0c1b49fSNick Terrell *  Note : with no additional input provided, amount of data flushed is necessarily <= ZSTD_BLOCKSIZE_MAX.
880e0c1b49fSNick Terrell * @return : 0 when a frame is completely decoded and fully flushed,
881e0c1b49fSNick Terrell *        or an error code, which can be tested using ZSTD_isError(),
882e0c1b49fSNick Terrell *        or any other value > 0, which means there is still some decoding or flushing to do to complete current frame :
883e0c1b49fSNick Terrell *                                the return value is a suggested next input size (just a hint for better latency)
884*65d1f550SNick Terrell *                                that will never request more than the remaining content of the compressed frame.
885e0c1b49fSNick Terrell * *******************************************************************************/
886e0c1b49fSNick Terrell 
887e0c1b49fSNick Terrell typedef ZSTD_DCtx ZSTD_DStream;  /*< DCtx and DStream are now effectively same object (>= v1.3.0) */
888e0c1b49fSNick Terrell                                  /* For compatibility with versions <= v1.2.0, prefer differentiating them. */
889e0c1b49fSNick Terrell /*===== ZSTD_DStream management functions =====*/
890e0c1b49fSNick Terrell ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream(void);
891e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds);  /* accept NULL pointer */
892e0c1b49fSNick Terrell 
893e0c1b49fSNick Terrell /*===== Streaming decompression functions =====*/
894e0c1b49fSNick Terrell 
895*65d1f550SNick Terrell /*! ZSTD_initDStream() :
896*65d1f550SNick Terrell  * Initialize/reset DStream state for new decompression operation.
897*65d1f550SNick Terrell  * Call before new decompression operation using same DStream.
898e0c1b49fSNick Terrell  *
899*65d1f550SNick Terrell  * Note : This function is redundant with the advanced API and equivalent to:
900e0c1b49fSNick Terrell  *     ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);
901e0c1b49fSNick Terrell  *     ZSTD_DCtx_refDDict(zds, NULL);
902e0c1b49fSNick Terrell  */
903e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds);
904e0c1b49fSNick Terrell 
905*65d1f550SNick Terrell /*! ZSTD_decompressStream() :
906*65d1f550SNick Terrell  * Streaming decompression function.
907*65d1f550SNick Terrell  * Call repetitively to consume full input updating it as necessary.
908*65d1f550SNick Terrell  * Function will update both input and output `pos` fields exposing current state via these fields:
909*65d1f550SNick Terrell  * - `input.pos < input.size`, some input remaining and caller should provide remaining input
910*65d1f550SNick Terrell  *   on the next call.
911*65d1f550SNick Terrell  * - `output.pos < output.size`, decoder flushed internal output buffer.
912*65d1f550SNick Terrell  * - `output.pos == output.size`, unflushed data potentially present in the internal buffers,
913*65d1f550SNick Terrell  *   check ZSTD_decompressStream() @return value,
914*65d1f550SNick Terrell  *   if > 0, invoke it again to flush remaining data to output.
915*65d1f550SNick Terrell  * Note : with no additional input, amount of data flushed <= ZSTD_BLOCKSIZE_MAX.
916*65d1f550SNick Terrell  *
917*65d1f550SNick Terrell  * @return : 0 when a frame is completely decoded and fully flushed,
918*65d1f550SNick Terrell  *           or an error code, which can be tested using ZSTD_isError(),
919*65d1f550SNick Terrell  *           or any other value > 0, which means there is some decoding or flushing to do to complete current frame.
920*65d1f550SNick Terrell  *
921*65d1f550SNick Terrell  * Note: when an operation returns with an error code, the @zds state may be left in undefined state.
922*65d1f550SNick Terrell  *       It's UB to invoke `ZSTD_decompressStream()` on such a state.
923*65d1f550SNick Terrell  *       In order to re-use such a state, it must be first reset,
924*65d1f550SNick Terrell  *       which can be done explicitly (`ZSTD_DCtx_reset()`),
925*65d1f550SNick Terrell  *       or is implied for operations starting some new decompression job (`ZSTD_initDStream`, `ZSTD_decompressDCtx()`, `ZSTD_decompress_usingDict()`)
926*65d1f550SNick Terrell  */
927e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input);
928e0c1b49fSNick Terrell 
929e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_DStreamInSize(void);    /*!< recommended size for input buffer */
930e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_DStreamOutSize(void);   /*!< recommended size for output buffer. Guarantee to successfully flush at least one complete block in all circumstances. */
931e0c1b49fSNick Terrell 
932e0c1b49fSNick Terrell 
933e0c1b49fSNick Terrell /* ************************
934e0c1b49fSNick Terrell *  Simple dictionary API
935e0c1b49fSNick Terrell ***************************/
936e0c1b49fSNick Terrell /*! ZSTD_compress_usingDict() :
937e0c1b49fSNick Terrell  *  Compression at an explicit compression level using a Dictionary.
938e0c1b49fSNick Terrell  *  A dictionary can be any arbitrary data segment (also called a prefix),
9392aa14b1aSNick Terrell  *  or a buffer with specified information (see zdict.h).
940e0c1b49fSNick Terrell  *  Note : This function loads the dictionary, resulting in significant startup delay.
941e0c1b49fSNick Terrell  *         It's intended for a dictionary used only once.
942e0c1b49fSNick Terrell  *  Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */
943e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx,
944e0c1b49fSNick Terrell                                            void* dst, size_t dstCapacity,
945e0c1b49fSNick Terrell                                      const void* src, size_t srcSize,
946e0c1b49fSNick Terrell                                      const void* dict,size_t dictSize,
947e0c1b49fSNick Terrell                                            int compressionLevel);
948e0c1b49fSNick Terrell 
949e0c1b49fSNick Terrell /*! ZSTD_decompress_usingDict() :
950e0c1b49fSNick Terrell  *  Decompression using a known Dictionary.
951e0c1b49fSNick Terrell  *  Dictionary must be identical to the one used during compression.
952e0c1b49fSNick Terrell  *  Note : This function loads the dictionary, resulting in significant startup delay.
953e0c1b49fSNick Terrell  *         It's intended for a dictionary used only once.
954e0c1b49fSNick Terrell  *  Note : When `dict == NULL || dictSize < 8` no dictionary is used. */
955e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
956e0c1b49fSNick Terrell                                              void* dst, size_t dstCapacity,
957e0c1b49fSNick Terrell                                        const void* src, size_t srcSize,
958e0c1b49fSNick Terrell                                        const void* dict,size_t dictSize);
959e0c1b49fSNick Terrell 
960e0c1b49fSNick Terrell 
961e0c1b49fSNick Terrell /* *********************************
962e0c1b49fSNick Terrell  *  Bulk processing dictionary API
963e0c1b49fSNick Terrell  **********************************/
964e0c1b49fSNick Terrell typedef struct ZSTD_CDict_s ZSTD_CDict;
965e0c1b49fSNick Terrell 
966e0c1b49fSNick Terrell /*! ZSTD_createCDict() :
967e0c1b49fSNick Terrell  *  When compressing multiple messages or blocks using the same dictionary,
968e0c1b49fSNick Terrell  *  it's recommended to digest the dictionary only once, since it's a costly operation.
969e0c1b49fSNick Terrell  *  ZSTD_createCDict() will create a state from digesting a dictionary.
970e0c1b49fSNick Terrell  *  The resulting state can be used for future compression operations with very limited startup cost.
971e0c1b49fSNick Terrell  *  ZSTD_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only.
972e0c1b49fSNick Terrell  * @dictBuffer can be released after ZSTD_CDict creation, because its content is copied within CDict.
973e0c1b49fSNick Terrell  *  Note 1 : Consider experimental function `ZSTD_createCDict_byReference()` if you prefer to not duplicate @dictBuffer content.
974e0c1b49fSNick Terrell  *  Note 2 : A ZSTD_CDict can be created from an empty @dictBuffer,
975e0c1b49fSNick Terrell  *      in which case the only thing that it transports is the @compressionLevel.
976e0c1b49fSNick Terrell  *      This can be useful in a pipeline featuring ZSTD_compress_usingCDict() exclusively,
977e0c1b49fSNick Terrell  *      expecting a ZSTD_CDict parameter with any data, including those without a known dictionary. */
978e0c1b49fSNick Terrell ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize,
979e0c1b49fSNick Terrell                                          int compressionLevel);
980e0c1b49fSNick Terrell 
981e0c1b49fSNick Terrell /*! ZSTD_freeCDict() :
982e0c1b49fSNick Terrell  *  Function frees memory allocated by ZSTD_createCDict().
983e0c1b49fSNick Terrell  *  If a NULL pointer is passed, no operation is performed. */
984e0c1b49fSNick Terrell ZSTDLIB_API size_t      ZSTD_freeCDict(ZSTD_CDict* CDict);
985e0c1b49fSNick Terrell 
986e0c1b49fSNick Terrell /*! ZSTD_compress_usingCDict() :
987e0c1b49fSNick Terrell  *  Compression using a digested Dictionary.
988e0c1b49fSNick Terrell  *  Recommended when same dictionary is used multiple times.
989e0c1b49fSNick Terrell  *  Note : compression level is _decided at dictionary creation time_,
990e0c1b49fSNick Terrell  *     and frame parameters are hardcoded (dictID=yes, contentSize=yes, checksum=no) */
991e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx,
992e0c1b49fSNick Terrell                                             void* dst, size_t dstCapacity,
993e0c1b49fSNick Terrell                                       const void* src, size_t srcSize,
994e0c1b49fSNick Terrell                                       const ZSTD_CDict* cdict);
995e0c1b49fSNick Terrell 
996e0c1b49fSNick Terrell 
997e0c1b49fSNick Terrell typedef struct ZSTD_DDict_s ZSTD_DDict;
998e0c1b49fSNick Terrell 
999e0c1b49fSNick Terrell /*! ZSTD_createDDict() :
1000e0c1b49fSNick Terrell  *  Create a digested dictionary, ready to start decompression operation without startup delay.
1001e0c1b49fSNick Terrell  *  dictBuffer can be released after DDict creation, as its content is copied inside DDict. */
1002e0c1b49fSNick Terrell ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize);
1003e0c1b49fSNick Terrell 
1004e0c1b49fSNick Terrell /*! ZSTD_freeDDict() :
1005e0c1b49fSNick Terrell  *  Function frees memory allocated with ZSTD_createDDict()
1006e0c1b49fSNick Terrell  *  If a NULL pointer is passed, no operation is performed. */
1007e0c1b49fSNick Terrell ZSTDLIB_API size_t      ZSTD_freeDDict(ZSTD_DDict* ddict);
1008e0c1b49fSNick Terrell 
1009e0c1b49fSNick Terrell /*! ZSTD_decompress_usingDDict() :
1010e0c1b49fSNick Terrell  *  Decompression using a digested Dictionary.
1011e0c1b49fSNick Terrell  *  Recommended when same dictionary is used multiple times. */
1012e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
1013e0c1b49fSNick Terrell                                               void* dst, size_t dstCapacity,
1014e0c1b49fSNick Terrell                                         const void* src, size_t srcSize,
1015e0c1b49fSNick Terrell                                         const ZSTD_DDict* ddict);
1016e0c1b49fSNick Terrell 
1017e0c1b49fSNick Terrell 
1018e0c1b49fSNick Terrell /* ******************************
1019e0c1b49fSNick Terrell  *  Dictionary helper functions
1020e0c1b49fSNick Terrell  *******************************/
1021e0c1b49fSNick Terrell 
10222aa14b1aSNick Terrell /*! ZSTD_getDictID_fromDict() : Requires v1.4.0+
1023e0c1b49fSNick Terrell  *  Provides the dictID stored within dictionary.
1024e0c1b49fSNick Terrell  *  if @return == 0, the dictionary is not conformant with Zstandard specification.
1025e0c1b49fSNick Terrell  *  It can still be loaded, but as a content-only dictionary. */
1026e0c1b49fSNick Terrell ZSTDLIB_API unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize);
1027e0c1b49fSNick Terrell 
10282aa14b1aSNick Terrell /*! ZSTD_getDictID_fromCDict() : Requires v1.5.0+
10292aa14b1aSNick Terrell  *  Provides the dictID of the dictionary loaded into `cdict`.
10302aa14b1aSNick Terrell  *  If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
10312aa14b1aSNick Terrell  *  Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
10322aa14b1aSNick Terrell ZSTDLIB_API unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict);
10332aa14b1aSNick Terrell 
10342aa14b1aSNick Terrell /*! ZSTD_getDictID_fromDDict() : Requires v1.4.0+
1035e0c1b49fSNick Terrell  *  Provides the dictID of the dictionary loaded into `ddict`.
1036e0c1b49fSNick Terrell  *  If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
1037e0c1b49fSNick Terrell  *  Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
1038e0c1b49fSNick Terrell ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict);
1039e0c1b49fSNick Terrell 
10402aa14b1aSNick Terrell /*! ZSTD_getDictID_fromFrame() : Requires v1.4.0+
1041e0c1b49fSNick Terrell  *  Provides the dictID required to decompressed the frame stored within `src`.
1042e0c1b49fSNick Terrell  *  If @return == 0, the dictID could not be decoded.
1043e0c1b49fSNick Terrell  *  This could for one of the following reasons :
1044e0c1b49fSNick Terrell  *  - The frame does not require a dictionary to be decoded (most common case).
1045*65d1f550SNick Terrell  *  - The frame was built with dictID intentionally removed. Whatever dictionary is necessary is a hidden piece of information.
1046e0c1b49fSNick Terrell  *    Note : this use case also happens when using a non-conformant dictionary.
1047e0c1b49fSNick Terrell  *  - `srcSize` is too small, and as a result, the frame header could not be decoded (only possible if `srcSize < ZSTD_FRAMEHEADERSIZE_MAX`).
1048e0c1b49fSNick Terrell  *  - This is not a Zstandard frame.
1049e0c1b49fSNick Terrell  *  When identifying the exact failure cause, it's possible to use ZSTD_getFrameHeader(), which will provide a more precise error code. */
1050e0c1b49fSNick Terrell ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
1051e0c1b49fSNick Terrell 
1052e0c1b49fSNick Terrell 
1053e0c1b49fSNick Terrell /* *****************************************************************************
10542aa14b1aSNick Terrell  * Advanced dictionary and prefix API (Requires v1.4.0+)
1055e0c1b49fSNick Terrell  *
1056e0c1b49fSNick Terrell  * This API allows dictionaries to be used with ZSTD_compress2(),
1057*65d1f550SNick Terrell  * ZSTD_compressStream2(), and ZSTD_decompressDCtx().
1058*65d1f550SNick Terrell  * Dictionaries are sticky, they remain valid when same context is reused,
1059*65d1f550SNick Terrell  * they only reset when the context is reset
1060*65d1f550SNick Terrell  * with ZSTD_reset_parameters or ZSTD_reset_session_and_parameters.
1061*65d1f550SNick Terrell  * In contrast, Prefixes are single-use.
1062e0c1b49fSNick Terrell  ******************************************************************************/
1063e0c1b49fSNick Terrell 
1064e0c1b49fSNick Terrell 
10652aa14b1aSNick Terrell /*! ZSTD_CCtx_loadDictionary() : Requires v1.4.0+
1066e0c1b49fSNick Terrell  *  Create an internal CDict from `dict` buffer.
1067e0c1b49fSNick Terrell  *  Decompression will have to use same dictionary.
1068e0c1b49fSNick Terrell  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
1069e0c1b49fSNick Terrell  *  Special: Loading a NULL (or 0-size) dictionary invalidates previous dictionary,
1070e0c1b49fSNick Terrell  *           meaning "return to no-dictionary mode".
1071*65d1f550SNick Terrell  *  Note 1 : Dictionary is sticky, it will be used for all future compressed frames,
1072*65d1f550SNick Terrell  *           until parameters are reset, a new dictionary is loaded, or the dictionary
1073*65d1f550SNick Terrell  *           is explicitly invalidated by loading a NULL dictionary.
1074e0c1b49fSNick Terrell  *  Note 2 : Loading a dictionary involves building tables.
1075e0c1b49fSNick Terrell  *           It's also a CPU consuming operation, with non-negligible impact on latency.
1076e0c1b49fSNick Terrell  *           Tables are dependent on compression parameters, and for this reason,
1077e0c1b49fSNick Terrell  *           compression parameters can no longer be changed after loading a dictionary.
1078e0c1b49fSNick Terrell  *  Note 3 :`dict` content will be copied internally.
1079e0c1b49fSNick Terrell  *           Use experimental ZSTD_CCtx_loadDictionary_byReference() to reference content instead.
1080e0c1b49fSNick Terrell  *           In such a case, dictionary buffer must outlive its users.
1081e0c1b49fSNick Terrell  *  Note 4 : Use ZSTD_CCtx_loadDictionary_advanced()
1082*65d1f550SNick Terrell  *           to precisely select how dictionary content must be interpreted.
1083*65d1f550SNick Terrell  *  Note 5 : This method does not benefit from LDM (long distance mode).
1084*65d1f550SNick Terrell  *           If you want to employ LDM on some large dictionary content,
1085*65d1f550SNick Terrell  *           prefer employing ZSTD_CCtx_refPrefix() described below.
1086*65d1f550SNick Terrell  */
1087e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
1088e0c1b49fSNick Terrell 
10892aa14b1aSNick Terrell /*! ZSTD_CCtx_refCDict() : Requires v1.4.0+
1090*65d1f550SNick Terrell  *  Reference a prepared dictionary, to be used for all future compressed frames.
1091e0c1b49fSNick Terrell  *  Note that compression parameters are enforced from within CDict,
1092e0c1b49fSNick Terrell  *  and supersede any compression parameter previously set within CCtx.
1093e0c1b49fSNick Terrell  *  The parameters ignored are labelled as "superseded-by-cdict" in the ZSTD_cParameter enum docs.
1094e0c1b49fSNick Terrell  *  The ignored parameters will be used again if the CCtx is returned to no-dictionary mode.
1095e0c1b49fSNick Terrell  *  The dictionary will remain valid for future compressed frames using same CCtx.
1096e0c1b49fSNick Terrell  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
1097e0c1b49fSNick Terrell  *  Special : Referencing a NULL CDict means "return to no-dictionary mode".
1098e0c1b49fSNick Terrell  *  Note 1 : Currently, only one dictionary can be managed.
1099e0c1b49fSNick Terrell  *           Referencing a new dictionary effectively "discards" any previous one.
1100e0c1b49fSNick Terrell  *  Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx. */
1101e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
1102e0c1b49fSNick Terrell 
11032aa14b1aSNick Terrell /*! ZSTD_CCtx_refPrefix() : Requires v1.4.0+
1104e0c1b49fSNick Terrell  *  Reference a prefix (single-usage dictionary) for next compressed frame.
1105e0c1b49fSNick Terrell  *  A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end).
1106e0c1b49fSNick Terrell  *  Decompression will need same prefix to properly regenerate data.
1107e0c1b49fSNick Terrell  *  Compressing with a prefix is similar in outcome as performing a diff and compressing it,
1108e0c1b49fSNick Terrell  *  but performs much faster, especially during decompression (compression speed is tunable with compression level).
1109*65d1f550SNick Terrell  *  This method is compatible with LDM (long distance mode).
1110e0c1b49fSNick Terrell  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
1111e0c1b49fSNick Terrell  *  Special: Adding any prefix (including NULL) invalidates any previous prefix or dictionary
1112e0c1b49fSNick Terrell  *  Note 1 : Prefix buffer is referenced. It **must** outlive compression.
1113e0c1b49fSNick Terrell  *           Its content must remain unmodified during compression.
1114e0c1b49fSNick Terrell  *  Note 2 : If the intention is to diff some large src data blob with some prior version of itself,
1115e0c1b49fSNick Terrell  *           ensure that the window size is large enough to contain the entire source.
1116e0c1b49fSNick Terrell  *           See ZSTD_c_windowLog.
1117e0c1b49fSNick Terrell  *  Note 3 : Referencing a prefix involves building tables, which are dependent on compression parameters.
1118e0c1b49fSNick Terrell  *           It's a CPU consuming operation, with non-negligible impact on latency.
1119e0c1b49fSNick Terrell  *           If there is a need to use the same prefix multiple times, consider loadDictionary instead.
1120e0c1b49fSNick Terrell  *  Note 4 : By default, the prefix is interpreted as raw content (ZSTD_dct_rawContent).
1121e0c1b49fSNick Terrell  *           Use experimental ZSTD_CCtx_refPrefix_advanced() to alter dictionary interpretation. */
1122e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx,
1123e0c1b49fSNick Terrell                                  const void* prefix, size_t prefixSize);
1124e0c1b49fSNick Terrell 
11252aa14b1aSNick Terrell /*! ZSTD_DCtx_loadDictionary() : Requires v1.4.0+
1126*65d1f550SNick Terrell  *  Create an internal DDict from dict buffer, to be used to decompress all future frames.
1127*65d1f550SNick Terrell  *  The dictionary remains valid for all future frames, until explicitly invalidated, or
1128*65d1f550SNick Terrell  *  a new dictionary is loaded.
1129e0c1b49fSNick Terrell  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
1130e0c1b49fSNick Terrell  *  Special : Adding a NULL (or 0-size) dictionary invalidates any previous dictionary,
1131e0c1b49fSNick Terrell  *            meaning "return to no-dictionary mode".
1132e0c1b49fSNick Terrell  *  Note 1 : Loading a dictionary involves building tables,
1133e0c1b49fSNick Terrell  *           which has a non-negligible impact on CPU usage and latency.
1134e0c1b49fSNick Terrell  *           It's recommended to "load once, use many times", to amortize the cost
1135e0c1b49fSNick Terrell  *  Note 2 :`dict` content will be copied internally, so `dict` can be released after loading.
1136e0c1b49fSNick Terrell  *           Use ZSTD_DCtx_loadDictionary_byReference() to reference dictionary content instead.
1137e0c1b49fSNick Terrell  *  Note 3 : Use ZSTD_DCtx_loadDictionary_advanced() to take control of
1138e0c1b49fSNick Terrell  *           how dictionary content is loaded and interpreted.
1139e0c1b49fSNick Terrell  */
1140e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
1141e0c1b49fSNick Terrell 
11422aa14b1aSNick Terrell /*! ZSTD_DCtx_refDDict() : Requires v1.4.0+
1143e0c1b49fSNick Terrell  *  Reference a prepared dictionary, to be used to decompress next frames.
1144e0c1b49fSNick Terrell  *  The dictionary remains active for decompression of future frames using same DCtx.
1145e0c1b49fSNick Terrell  *
1146e0c1b49fSNick Terrell  *  If called with ZSTD_d_refMultipleDDicts enabled, repeated calls of this function
1147e0c1b49fSNick Terrell  *  will store the DDict references in a table, and the DDict used for decompression
1148e0c1b49fSNick Terrell  *  will be determined at decompression time, as per the dict ID in the frame.
1149e0c1b49fSNick Terrell  *  The memory for the table is allocated on the first call to refDDict, and can be
1150e0c1b49fSNick Terrell  *  freed with ZSTD_freeDCtx().
1151e0c1b49fSNick Terrell  *
1152*65d1f550SNick Terrell  *  If called with ZSTD_d_refMultipleDDicts disabled (the default), only one dictionary
1153*65d1f550SNick Terrell  *  will be managed, and referencing a dictionary effectively "discards" any previous one.
1154*65d1f550SNick Terrell  *
1155e0c1b49fSNick Terrell  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
1156e0c1b49fSNick Terrell  *  Special: referencing a NULL DDict means "return to no-dictionary mode".
1157e0c1b49fSNick Terrell  *  Note 2 : DDict is just referenced, its lifetime must outlive its usage from DCtx.
1158e0c1b49fSNick Terrell  */
1159e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict);
1160e0c1b49fSNick Terrell 
11612aa14b1aSNick Terrell /*! ZSTD_DCtx_refPrefix() : Requires v1.4.0+
1162e0c1b49fSNick Terrell  *  Reference a prefix (single-usage dictionary) to decompress next frame.
1163e0c1b49fSNick Terrell  *  This is the reverse operation of ZSTD_CCtx_refPrefix(),
1164e0c1b49fSNick Terrell  *  and must use the same prefix as the one used during compression.
1165e0c1b49fSNick Terrell  *  Prefix is **only used once**. Reference is discarded at end of frame.
1166e0c1b49fSNick Terrell  *  End of frame is reached when ZSTD_decompressStream() returns 0.
1167e0c1b49fSNick Terrell  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
1168e0c1b49fSNick Terrell  *  Note 1 : Adding any prefix (including NULL) invalidates any previously set prefix or dictionary
1169e0c1b49fSNick Terrell  *  Note 2 : Prefix buffer is referenced. It **must** outlive decompression.
1170e0c1b49fSNick Terrell  *           Prefix buffer must remain unmodified up to the end of frame,
1171e0c1b49fSNick Terrell  *           reached when ZSTD_decompressStream() returns 0.
1172e0c1b49fSNick Terrell  *  Note 3 : By default, the prefix is treated as raw content (ZSTD_dct_rawContent).
1173e0c1b49fSNick Terrell  *           Use ZSTD_CCtx_refPrefix_advanced() to alter dictMode (Experimental section)
1174e0c1b49fSNick Terrell  *  Note 4 : Referencing a raw content prefix has almost no cpu nor memory cost.
1175e0c1b49fSNick Terrell  *           A full dictionary is more costly, as it requires building tables.
1176e0c1b49fSNick Terrell  */
1177e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx,
1178e0c1b49fSNick Terrell                                  const void* prefix, size_t prefixSize);
1179e0c1b49fSNick Terrell 
1180e0c1b49fSNick Terrell /* ===   Memory management   === */
1181e0c1b49fSNick Terrell 
11822aa14b1aSNick Terrell /*! ZSTD_sizeof_*() : Requires v1.4.0+
1183e0c1b49fSNick Terrell  *  These functions give the _current_ memory usage of selected object.
1184e0c1b49fSNick Terrell  *  Note that object memory usage can evolve (increase or decrease) over time. */
1185e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx);
1186e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_sizeof_DCtx(const ZSTD_DCtx* dctx);
1187e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_sizeof_CStream(const ZSTD_CStream* zcs);
1188e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_sizeof_DStream(const ZSTD_DStream* zds);
1189e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_sizeof_CDict(const ZSTD_CDict* cdict);
1190e0c1b49fSNick Terrell ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
1191e0c1b49fSNick Terrell 
1192*65d1f550SNick Terrell 
1193e0c1b49fSNick Terrell #endif  /* ZSTD_H_235446 */
1194e0c1b49fSNick Terrell 
1195e0c1b49fSNick Terrell 
1196e0c1b49fSNick Terrell /* **************************************************************************************
1197e0c1b49fSNick Terrell  *   ADVANCED AND EXPERIMENTAL FUNCTIONS
1198e0c1b49fSNick Terrell  ****************************************************************************************
1199e0c1b49fSNick Terrell  * The definitions in the following section are considered experimental.
1200e0c1b49fSNick Terrell  * They are provided for advanced scenarios.
1201e0c1b49fSNick Terrell  * They should never be used with a dynamic library, as prototypes may change in the future.
1202e0c1b49fSNick Terrell  * Use them only in association with static linking.
1203e0c1b49fSNick Terrell  * ***************************************************************************************/
1204e0c1b49fSNick Terrell 
1205e0c1b49fSNick Terrell #if !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY)
1206e0c1b49fSNick Terrell #define ZSTD_H_ZSTD_STATIC_LINKING_ONLY
1207e0c1b49fSNick Terrell 
1208*65d1f550SNick Terrell 
12092aa14b1aSNick Terrell /* This can be overridden externally to hide static symbols. */
12102aa14b1aSNick Terrell #ifndef ZSTDLIB_STATIC_API
12112aa14b1aSNick Terrell #define ZSTDLIB_STATIC_API ZSTDLIB_VISIBLE
12122aa14b1aSNick Terrell #endif
12132aa14b1aSNick Terrell 
1214e0c1b49fSNick Terrell /* **************************************************************************************
1215e0c1b49fSNick Terrell  *   experimental API (static linking only)
1216e0c1b49fSNick Terrell  ****************************************************************************************
1217e0c1b49fSNick Terrell  * The following symbols and constants
1218e0c1b49fSNick Terrell  * are not planned to join "stable API" status in the near future.
1219e0c1b49fSNick Terrell  * They can still change in future versions.
1220e0c1b49fSNick Terrell  * Some of them are planned to remain in the static_only section indefinitely.
1221e0c1b49fSNick Terrell  * Some of them might be removed in the future (especially when redundant with existing stable functions)
1222e0c1b49fSNick Terrell  * ***************************************************************************************/
1223e0c1b49fSNick Terrell 
1224e0c1b49fSNick Terrell #define ZSTD_FRAMEHEADERSIZE_PREFIX(format) ((format) == ZSTD_f_zstd1 ? 5 : 1)   /* minimum input size required to query frame header size */
1225e0c1b49fSNick Terrell #define ZSTD_FRAMEHEADERSIZE_MIN(format)    ((format) == ZSTD_f_zstd1 ? 6 : 2)
1226e0c1b49fSNick Terrell #define ZSTD_FRAMEHEADERSIZE_MAX   18   /* can be useful for static allocation */
1227e0c1b49fSNick Terrell #define ZSTD_SKIPPABLEHEADERSIZE    8
1228e0c1b49fSNick Terrell 
1229e0c1b49fSNick Terrell /* compression parameter bounds */
1230e0c1b49fSNick Terrell #define ZSTD_WINDOWLOG_MAX_32    30
1231e0c1b49fSNick Terrell #define ZSTD_WINDOWLOG_MAX_64    31
1232e0c1b49fSNick Terrell #define ZSTD_WINDOWLOG_MAX     ((int)(sizeof(size_t) == 4 ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64))
1233e0c1b49fSNick Terrell #define ZSTD_WINDOWLOG_MIN       10
1234e0c1b49fSNick Terrell #define ZSTD_HASHLOG_MAX       ((ZSTD_WINDOWLOG_MAX < 30) ? ZSTD_WINDOWLOG_MAX : 30)
1235e0c1b49fSNick Terrell #define ZSTD_HASHLOG_MIN          6
1236e0c1b49fSNick Terrell #define ZSTD_CHAINLOG_MAX_32     29
1237e0c1b49fSNick Terrell #define ZSTD_CHAINLOG_MAX_64     30
1238e0c1b49fSNick Terrell #define ZSTD_CHAINLOG_MAX      ((int)(sizeof(size_t) == 4 ? ZSTD_CHAINLOG_MAX_32 : ZSTD_CHAINLOG_MAX_64))
1239e0c1b49fSNick Terrell #define ZSTD_CHAINLOG_MIN        ZSTD_HASHLOG_MIN
1240e0c1b49fSNick Terrell #define ZSTD_SEARCHLOG_MAX      (ZSTD_WINDOWLOG_MAX-1)
1241e0c1b49fSNick Terrell #define ZSTD_SEARCHLOG_MIN        1
1242e0c1b49fSNick Terrell #define ZSTD_MINMATCH_MAX         7   /* only for ZSTD_fast, other strategies are limited to 6 */
1243e0c1b49fSNick Terrell #define ZSTD_MINMATCH_MIN         3   /* only for ZSTD_btopt+, faster strategies are limited to 4 */
1244e0c1b49fSNick Terrell #define ZSTD_TARGETLENGTH_MAX    ZSTD_BLOCKSIZE_MAX
1245e0c1b49fSNick Terrell #define ZSTD_TARGETLENGTH_MIN     0   /* note : comparing this constant to an unsigned results in a tautological test */
1246e0c1b49fSNick Terrell #define ZSTD_STRATEGY_MIN        ZSTD_fast
1247e0c1b49fSNick Terrell #define ZSTD_STRATEGY_MAX        ZSTD_btultra2
1248*65d1f550SNick Terrell #define ZSTD_BLOCKSIZE_MAX_MIN (1 << 10) /* The minimum valid max blocksize. Maximum blocksizes smaller than this make compressBound() inaccurate. */
1249e0c1b49fSNick Terrell 
1250e0c1b49fSNick Terrell 
1251e0c1b49fSNick Terrell #define ZSTD_OVERLAPLOG_MIN       0
1252e0c1b49fSNick Terrell #define ZSTD_OVERLAPLOG_MAX       9
1253e0c1b49fSNick Terrell 
1254e0c1b49fSNick Terrell #define ZSTD_WINDOWLOG_LIMIT_DEFAULT 27   /* by default, the streaming decoder will refuse any frame
1255e0c1b49fSNick Terrell                                            * requiring larger than (1<<ZSTD_WINDOWLOG_LIMIT_DEFAULT) window size,
1256e0c1b49fSNick Terrell                                            * to preserve host's memory from unreasonable requirements.
1257e0c1b49fSNick Terrell                                            * This limit can be overridden using ZSTD_DCtx_setParameter(,ZSTD_d_windowLogMax,).
1258e0c1b49fSNick Terrell                                            * The limit does not apply for one-pass decoders (such as ZSTD_decompress()), since no additional memory is allocated */
1259e0c1b49fSNick Terrell 
1260e0c1b49fSNick Terrell 
1261e0c1b49fSNick Terrell /* LDM parameter bounds */
1262e0c1b49fSNick Terrell #define ZSTD_LDM_HASHLOG_MIN      ZSTD_HASHLOG_MIN
1263e0c1b49fSNick Terrell #define ZSTD_LDM_HASHLOG_MAX      ZSTD_HASHLOG_MAX
1264e0c1b49fSNick Terrell #define ZSTD_LDM_MINMATCH_MIN        4
1265e0c1b49fSNick Terrell #define ZSTD_LDM_MINMATCH_MAX     4096
1266e0c1b49fSNick Terrell #define ZSTD_LDM_BUCKETSIZELOG_MIN   1
1267e0c1b49fSNick Terrell #define ZSTD_LDM_BUCKETSIZELOG_MAX   8
1268e0c1b49fSNick Terrell #define ZSTD_LDM_HASHRATELOG_MIN     0
1269e0c1b49fSNick Terrell #define ZSTD_LDM_HASHRATELOG_MAX (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN)
1270e0c1b49fSNick Terrell 
1271e0c1b49fSNick Terrell /* Advanced parameter bounds */
1272*65d1f550SNick Terrell #define ZSTD_TARGETCBLOCKSIZE_MIN   1340 /* suitable to fit into an ethernet / wifi / 4G transport frame */
1273e0c1b49fSNick Terrell #define ZSTD_TARGETCBLOCKSIZE_MAX   ZSTD_BLOCKSIZE_MAX
1274e0c1b49fSNick Terrell #define ZSTD_SRCSIZEHINT_MIN        0
1275e0c1b49fSNick Terrell #define ZSTD_SRCSIZEHINT_MAX        INT_MAX
1276e0c1b49fSNick Terrell 
1277e0c1b49fSNick Terrell 
1278e0c1b49fSNick Terrell /* ---  Advanced types  --- */
1279e0c1b49fSNick Terrell 
1280e0c1b49fSNick Terrell typedef struct ZSTD_CCtx_params_s ZSTD_CCtx_params;
1281e0c1b49fSNick Terrell 
1282e0c1b49fSNick Terrell typedef struct {
1283e0c1b49fSNick Terrell     unsigned int offset;      /* The offset of the match. (NOT the same as the offset code)
1284e0c1b49fSNick Terrell                                * If offset == 0 and matchLength == 0, this sequence represents the last
1285e0c1b49fSNick Terrell                                * literals in the block of litLength size.
1286e0c1b49fSNick Terrell                                */
1287e0c1b49fSNick Terrell 
1288e0c1b49fSNick Terrell     unsigned int litLength;   /* Literal length of the sequence. */
1289e0c1b49fSNick Terrell     unsigned int matchLength; /* Match length of the sequence. */
1290e0c1b49fSNick Terrell 
1291e0c1b49fSNick Terrell                               /* Note: Users of this API may provide a sequence with matchLength == litLength == offset == 0.
1292e0c1b49fSNick Terrell                                * In this case, we will treat the sequence as a marker for a block boundary.
1293e0c1b49fSNick Terrell                                */
1294e0c1b49fSNick Terrell 
1295e0c1b49fSNick Terrell     unsigned int rep;         /* Represents which repeat offset is represented by the field 'offset'.
1296e0c1b49fSNick Terrell                                * Ranges from [0, 3].
1297e0c1b49fSNick Terrell                                *
1298e0c1b49fSNick Terrell                                * Repeat offsets are essentially previous offsets from previous sequences sorted in
1299e0c1b49fSNick Terrell                                * recency order. For more detail, see doc/zstd_compression_format.md
1300e0c1b49fSNick Terrell                                *
1301e0c1b49fSNick Terrell                                * If rep == 0, then 'offset' does not contain a repeat offset.
1302e0c1b49fSNick Terrell                                * If rep > 0:
1303e0c1b49fSNick Terrell                                *  If litLength != 0:
1304e0c1b49fSNick Terrell                                *      rep == 1 --> offset == repeat_offset_1
1305e0c1b49fSNick Terrell                                *      rep == 2 --> offset == repeat_offset_2
1306e0c1b49fSNick Terrell                                *      rep == 3 --> offset == repeat_offset_3
1307e0c1b49fSNick Terrell                                *  If litLength == 0:
1308e0c1b49fSNick Terrell                                *      rep == 1 --> offset == repeat_offset_2
1309e0c1b49fSNick Terrell                                *      rep == 2 --> offset == repeat_offset_3
1310e0c1b49fSNick Terrell                                *      rep == 3 --> offset == repeat_offset_1 - 1
1311e0c1b49fSNick Terrell                                *
1312e0c1b49fSNick Terrell                                * Note: This field is optional. ZSTD_generateSequences() will calculate the value of
1313e0c1b49fSNick Terrell                                * 'rep', but repeat offsets do not necessarily need to be calculated from an external
1314*65d1f550SNick Terrell                                * sequence provider perspective. For example, ZSTD_compressSequences() does not
1315e0c1b49fSNick Terrell                                * use this 'rep' field at all (as of now).
1316e0c1b49fSNick Terrell                                */
1317e0c1b49fSNick Terrell } ZSTD_Sequence;
1318e0c1b49fSNick Terrell 
1319e0c1b49fSNick Terrell typedef struct {
1320e0c1b49fSNick Terrell     unsigned windowLog;       /*< largest match distance : larger == more compression, more memory needed during decompression */
1321e0c1b49fSNick Terrell     unsigned chainLog;        /*< fully searched segment : larger == more compression, slower, more memory (useless for fast) */
1322e0c1b49fSNick Terrell     unsigned hashLog;         /*< dispatch table : larger == faster, more memory */
1323e0c1b49fSNick Terrell     unsigned searchLog;       /*< nb of searches : larger == more compression, slower */
1324e0c1b49fSNick Terrell     unsigned minMatch;        /*< match length searched : larger == faster decompression, sometimes less compression */
1325e0c1b49fSNick Terrell     unsigned targetLength;    /*< acceptable match size for optimal parser (only) : larger == more compression, slower */
1326e0c1b49fSNick Terrell     ZSTD_strategy strategy;   /*< see ZSTD_strategy definition above */
1327cf30f6a5SNick Terrell } ZSTD_compressionParameters;
1328cf30f6a5SNick Terrell 
1329cf30f6a5SNick Terrell typedef struct {
1330e0c1b49fSNick Terrell     int contentSizeFlag; /*< 1: content size will be in frame header (when known) */
1331e0c1b49fSNick Terrell     int checksumFlag;    /*< 1: generate a 32-bits checksum using XXH64 algorithm at end of frame, for error detection */
1332e0c1b49fSNick Terrell     int noDictIDFlag;    /*< 1: no dictID will be saved into frame header (dictID is only useful for dictionary compression) */
1333cf30f6a5SNick Terrell } ZSTD_frameParameters;
1334cf30f6a5SNick Terrell 
1335cf30f6a5SNick Terrell typedef struct {
1336cf30f6a5SNick Terrell     ZSTD_compressionParameters cParams;
1337cf30f6a5SNick Terrell     ZSTD_frameParameters fParams;
1338cf30f6a5SNick Terrell } ZSTD_parameters;
1339cf30f6a5SNick Terrell 
1340e0c1b49fSNick Terrell typedef enum {
1341e0c1b49fSNick Terrell     ZSTD_dct_auto = 0,       /* dictionary is "full" when starting with ZSTD_MAGIC_DICTIONARY, otherwise it is "rawContent" */
1342e0c1b49fSNick Terrell     ZSTD_dct_rawContent = 1, /* ensures dictionary is always loaded as rawContent, even if it starts with ZSTD_MAGIC_DICTIONARY */
1343e0c1b49fSNick Terrell     ZSTD_dct_fullDict = 2    /* refuses to load a dictionary if it does not respect Zstandard's specification, starting with ZSTD_MAGIC_DICTIONARY */
1344e0c1b49fSNick Terrell } ZSTD_dictContentType_e;
1345cf30f6a5SNick Terrell 
1346e0c1b49fSNick Terrell typedef enum {
1347e0c1b49fSNick Terrell     ZSTD_dlm_byCopy = 0,  /*< Copy dictionary content internally */
1348e0c1b49fSNick Terrell     ZSTD_dlm_byRef = 1    /*< Reference dictionary content -- the dictionary buffer must outlive its users. */
1349e0c1b49fSNick Terrell } ZSTD_dictLoadMethod_e;
1350cf30f6a5SNick Terrell 
1351e0c1b49fSNick Terrell typedef enum {
1352e0c1b49fSNick Terrell     ZSTD_f_zstd1 = 0,           /* zstd frame format, specified in zstd_compression_format.md (default) */
1353e0c1b49fSNick Terrell     ZSTD_f_zstd1_magicless = 1  /* Variant of zstd frame format, without initial 4-bytes magic number.
1354e0c1b49fSNick Terrell                                  * Useful to save 4 bytes per generated frame.
1355e0c1b49fSNick Terrell                                  * Decoder cannot recognise automatically this format, requiring this instruction. */
1356e0c1b49fSNick Terrell } ZSTD_format_e;
1357cf30f6a5SNick Terrell 
1358e0c1b49fSNick Terrell typedef enum {
1359e0c1b49fSNick Terrell     /* Note: this enum controls ZSTD_d_forceIgnoreChecksum */
1360e0c1b49fSNick Terrell     ZSTD_d_validateChecksum = 0,
1361e0c1b49fSNick Terrell     ZSTD_d_ignoreChecksum = 1
1362e0c1b49fSNick Terrell } ZSTD_forceIgnoreChecksum_e;
1363cf30f6a5SNick Terrell 
1364e0c1b49fSNick Terrell typedef enum {
1365e0c1b49fSNick Terrell     /* Note: this enum controls ZSTD_d_refMultipleDDicts */
1366e0c1b49fSNick Terrell     ZSTD_rmd_refSingleDDict = 0,
1367e0c1b49fSNick Terrell     ZSTD_rmd_refMultipleDDicts = 1
1368e0c1b49fSNick Terrell } ZSTD_refMultipleDDicts_e;
1369cf30f6a5SNick Terrell 
1370e0c1b49fSNick Terrell typedef enum {
1371e0c1b49fSNick Terrell     /* Note: this enum and the behavior it controls are effectively internal
1372e0c1b49fSNick Terrell      * implementation details of the compressor. They are expected to continue
1373e0c1b49fSNick Terrell      * to evolve and should be considered only in the context of extremely
1374e0c1b49fSNick Terrell      * advanced performance tuning.
1375cf30f6a5SNick Terrell      *
1376e0c1b49fSNick Terrell      * Zstd currently supports the use of a CDict in three ways:
1377e0c1b49fSNick Terrell      *
1378e0c1b49fSNick Terrell      * - The contents of the CDict can be copied into the working context. This
1379e0c1b49fSNick Terrell      *   means that the compression can search both the dictionary and input
1380e0c1b49fSNick Terrell      *   while operating on a single set of internal tables. This makes
1381e0c1b49fSNick Terrell      *   the compression faster per-byte of input. However, the initial copy of
1382e0c1b49fSNick Terrell      *   the CDict's tables incurs a fixed cost at the beginning of the
1383e0c1b49fSNick Terrell      *   compression. For small compressions (< 8 KB), that copy can dominate
1384e0c1b49fSNick Terrell      *   the cost of the compression.
1385e0c1b49fSNick Terrell      *
1386e0c1b49fSNick Terrell      * - The CDict's tables can be used in-place. In this model, compression is
1387e0c1b49fSNick Terrell      *   slower per input byte, because the compressor has to search two sets of
1388e0c1b49fSNick Terrell      *   tables. However, this model incurs no start-up cost (as long as the
1389e0c1b49fSNick Terrell      *   working context's tables can be reused). For small inputs, this can be
1390e0c1b49fSNick Terrell      *   faster than copying the CDict's tables.
1391e0c1b49fSNick Terrell      *
1392e0c1b49fSNick Terrell      * - The CDict's tables are not used at all, and instead we use the working
1393e0c1b49fSNick Terrell      *   context alone to reload the dictionary and use params based on the source
1394e0c1b49fSNick Terrell      *   size. See ZSTD_compress_insertDictionary() and ZSTD_compress_usingDict().
1395e0c1b49fSNick Terrell      *   This method is effective when the dictionary sizes are very small relative
1396e0c1b49fSNick Terrell      *   to the input size, and the input size is fairly large to begin with.
1397e0c1b49fSNick Terrell      *
1398e0c1b49fSNick Terrell      * Zstd has a simple internal heuristic that selects which strategy to use
1399e0c1b49fSNick Terrell      * at the beginning of a compression. However, if experimentation shows that
1400e0c1b49fSNick Terrell      * Zstd is making poor choices, it is possible to override that choice with
1401e0c1b49fSNick Terrell      * this enum.
1402cf30f6a5SNick Terrell      */
1403e0c1b49fSNick Terrell     ZSTD_dictDefaultAttach = 0, /* Use the default heuristic. */
1404e0c1b49fSNick Terrell     ZSTD_dictForceAttach   = 1, /* Never copy the dictionary. */
1405e0c1b49fSNick Terrell     ZSTD_dictForceCopy     = 2, /* Always copy the dictionary. */
1406e0c1b49fSNick Terrell     ZSTD_dictForceLoad     = 3  /* Always reload the dictionary */
1407e0c1b49fSNick Terrell } ZSTD_dictAttachPref_e;
1408cf30f6a5SNick Terrell 
1409e0c1b49fSNick Terrell typedef enum {
1410e0c1b49fSNick Terrell   ZSTD_lcm_auto = 0,          /*< Automatically determine the compression mode based on the compression level.
1411e0c1b49fSNick Terrell                                *   Negative compression levels will be uncompressed, and positive compression
1412e0c1b49fSNick Terrell                                *   levels will be compressed. */
1413e0c1b49fSNick Terrell   ZSTD_lcm_huffman = 1,       /*< Always attempt Huffman compression. Uncompressed literals will still be
1414e0c1b49fSNick Terrell                                *   emitted if Huffman compression is not profitable. */
1415e0c1b49fSNick Terrell   ZSTD_lcm_uncompressed = 2   /*< Always emit uncompressed literals. */
1416e0c1b49fSNick Terrell } ZSTD_literalCompressionMode_e;
1417cf30f6a5SNick Terrell 
14182aa14b1aSNick Terrell typedef enum {
1419*65d1f550SNick Terrell   /* Note: This enum controls features which are conditionally beneficial.
1420*65d1f550SNick Terrell    * Zstd can take a decision on whether or not to enable the feature (ZSTD_ps_auto),
1421*65d1f550SNick Terrell    * but setting the switch to ZSTD_ps_enable or ZSTD_ps_disable force enable/disable the feature.
14222aa14b1aSNick Terrell    */
14232aa14b1aSNick Terrell   ZSTD_ps_auto = 0,         /* Let the library automatically determine whether the feature shall be enabled */
14242aa14b1aSNick Terrell   ZSTD_ps_enable = 1,       /* Force-enable the feature */
14252aa14b1aSNick Terrell   ZSTD_ps_disable = 2       /* Do not use the feature */
1426*65d1f550SNick Terrell } ZSTD_ParamSwitch_e;
1427*65d1f550SNick Terrell #define ZSTD_paramSwitch_e ZSTD_ParamSwitch_e  /* old name */
1428cf30f6a5SNick Terrell 
1429e0c1b49fSNick Terrell /* *************************************
1430*65d1f550SNick Terrell *  Frame header and size functions
1431e0c1b49fSNick Terrell ***************************************/
1432e0c1b49fSNick Terrell 
1433e0c1b49fSNick Terrell /*! ZSTD_findDecompressedSize() :
1434e0c1b49fSNick Terrell  *  `src` should point to the start of a series of ZSTD encoded and/or skippable frames
1435e0c1b49fSNick Terrell  *  `srcSize` must be the _exact_ size of this series
1436e0c1b49fSNick Terrell  *       (i.e. there should be a frame boundary at `src + srcSize`)
1437e0c1b49fSNick Terrell  *  @return : - decompressed size of all data in all successive frames
1438e0c1b49fSNick Terrell  *            - if the decompressed size cannot be determined: ZSTD_CONTENTSIZE_UNKNOWN
1439e0c1b49fSNick Terrell  *            - if an error occurred: ZSTD_CONTENTSIZE_ERROR
1440cf30f6a5SNick Terrell  *
1441e0c1b49fSNick Terrell  *   note 1 : decompressed size is an optional field, that may not be present, especially in streaming mode.
1442e0c1b49fSNick Terrell  *            When `return==ZSTD_CONTENTSIZE_UNKNOWN`, data to decompress could be any size.
1443e0c1b49fSNick Terrell  *            In which case, it's necessary to use streaming mode to decompress data.
1444e0c1b49fSNick Terrell  *   note 2 : decompressed size is always present when compression is done with ZSTD_compress()
1445e0c1b49fSNick Terrell  *   note 3 : decompressed size can be very large (64-bits value),
1446e0c1b49fSNick Terrell  *            potentially larger than what local system can handle as a single memory segment.
1447e0c1b49fSNick Terrell  *            In which case, it's necessary to use streaming mode to decompress data.
1448e0c1b49fSNick Terrell  *   note 4 : If source is untrusted, decompressed size could be wrong or intentionally modified.
1449e0c1b49fSNick Terrell  *            Always ensure result fits within application's authorized limits.
1450e0c1b49fSNick Terrell  *            Each application can set its own limits.
1451e0c1b49fSNick Terrell  *   note 5 : ZSTD_findDecompressedSize handles multiple frames, and so it must traverse the input to
1452e0c1b49fSNick Terrell  *            read each contained frame header.  This is fast as most of the data is skipped,
1453e0c1b49fSNick Terrell  *            however it does mean that all frame data must be present and valid. */
14542aa14b1aSNick Terrell ZSTDLIB_STATIC_API unsigned long long ZSTD_findDecompressedSize(const void* src, size_t srcSize);
1455e0c1b49fSNick Terrell 
1456e0c1b49fSNick Terrell /*! ZSTD_decompressBound() :
1457e0c1b49fSNick Terrell  *  `src` should point to the start of a series of ZSTD encoded and/or skippable frames
1458e0c1b49fSNick Terrell  *  `srcSize` must be the _exact_ size of this series
1459e0c1b49fSNick Terrell  *       (i.e. there should be a frame boundary at `src + srcSize`)
1460e0c1b49fSNick Terrell  *  @return : - upper-bound for the decompressed size of all data in all successive frames
1461e0c1b49fSNick Terrell  *            - if an error occurred: ZSTD_CONTENTSIZE_ERROR
1462e0c1b49fSNick Terrell  *
1463e0c1b49fSNick Terrell  *  note 1  : an error can occur if `src` contains an invalid or incorrectly formatted frame.
1464e0c1b49fSNick Terrell  *  note 2  : the upper-bound is exact when the decompressed size field is available in every ZSTD encoded frame of `src`.
1465e0c1b49fSNick Terrell  *            in this case, `ZSTD_findDecompressedSize` and `ZSTD_decompressBound` return the same value.
1466e0c1b49fSNick Terrell  *  note 3  : when the decompressed size field isn't available, the upper-bound for that frame is calculated by:
1467e0c1b49fSNick Terrell  *              upper-bound = # blocks * min(128 KB, Window_Size)
1468cf30f6a5SNick Terrell  */
14692aa14b1aSNick Terrell ZSTDLIB_STATIC_API unsigned long long ZSTD_decompressBound(const void* src, size_t srcSize);
1470e0c1b49fSNick Terrell 
1471e0c1b49fSNick Terrell /*! ZSTD_frameHeaderSize() :
1472*65d1f550SNick Terrell  *  srcSize must be large enough, aka >= ZSTD_FRAMEHEADERSIZE_PREFIX.
1473e0c1b49fSNick Terrell  * @return : size of the Frame Header,
1474e0c1b49fSNick Terrell  *           or an error code (if srcSize is too small) */
14752aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_frameHeaderSize(const void* src, size_t srcSize);
1476e0c1b49fSNick Terrell 
1477*65d1f550SNick Terrell typedef enum { ZSTD_frame, ZSTD_skippableFrame } ZSTD_FrameType_e;
1478*65d1f550SNick Terrell #define ZSTD_frameType_e ZSTD_FrameType_e /* old name */
1479*65d1f550SNick Terrell typedef struct {
1480*65d1f550SNick Terrell     unsigned long long frameContentSize; /* if == ZSTD_CONTENTSIZE_UNKNOWN, it means this field is not available. 0 means "empty" */
1481*65d1f550SNick Terrell     unsigned long long windowSize;       /* can be very large, up to <= frameContentSize */
1482*65d1f550SNick Terrell     unsigned blockSizeMax;
1483*65d1f550SNick Terrell     ZSTD_FrameType_e frameType;          /* if == ZSTD_skippableFrame, frameContentSize is the size of skippable content */
1484*65d1f550SNick Terrell     unsigned headerSize;
1485*65d1f550SNick Terrell     unsigned dictID;                     /* for ZSTD_skippableFrame, contains the skippable magic variant [0-15] */
1486*65d1f550SNick Terrell     unsigned checksumFlag;
1487*65d1f550SNick Terrell     unsigned _reserved1;
1488*65d1f550SNick Terrell     unsigned _reserved2;
1489*65d1f550SNick Terrell } ZSTD_FrameHeader;
1490*65d1f550SNick Terrell #define ZSTD_frameHeader ZSTD_FrameHeader /* old name */
1491*65d1f550SNick Terrell 
1492*65d1f550SNick Terrell /*! ZSTD_getFrameHeader() :
1493*65d1f550SNick Terrell  *  decode Frame Header into `zfhPtr`, or requires larger `srcSize`.
1494*65d1f550SNick Terrell  * @return : 0 => header is complete, `zfhPtr` is correctly filled,
1495*65d1f550SNick Terrell  *          >0 => `srcSize` is too small, @return value is the wanted `srcSize` amount, `zfhPtr` is not filled,
1496*65d1f550SNick Terrell  *           or an error code, which can be tested using ZSTD_isError() */
1497*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader(ZSTD_FrameHeader* zfhPtr, const void* src, size_t srcSize);
1498*65d1f550SNick Terrell /*! ZSTD_getFrameHeader_advanced() :
1499*65d1f550SNick Terrell  *  same as ZSTD_getFrameHeader(),
1500*65d1f550SNick Terrell  *  with added capability to select a format (like ZSTD_f_zstd1_magicless) */
1501*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_getFrameHeader_advanced(ZSTD_FrameHeader* zfhPtr, const void* src, size_t srcSize, ZSTD_format_e format);
1502*65d1f550SNick Terrell 
1503*65d1f550SNick Terrell /*! ZSTD_decompressionMargin() :
1504*65d1f550SNick Terrell  * Zstd supports in-place decompression, where the input and output buffers overlap.
1505*65d1f550SNick Terrell  * In this case, the output buffer must be at least (Margin + Output_Size) bytes large,
1506*65d1f550SNick Terrell  * and the input buffer must be at the end of the output buffer.
1507*65d1f550SNick Terrell  *
1508*65d1f550SNick Terrell  *  _______________________ Output Buffer ________________________
1509*65d1f550SNick Terrell  * |                                                              |
1510*65d1f550SNick Terrell  * |                                        ____ Input Buffer ____|
1511*65d1f550SNick Terrell  * |                                       |                      |
1512*65d1f550SNick Terrell  * v                                       v                      v
1513*65d1f550SNick Terrell  * |---------------------------------------|-----------|----------|
1514*65d1f550SNick Terrell  * ^                                                   ^          ^
1515*65d1f550SNick Terrell  * |___________________ Output_Size ___________________|_ Margin _|
1516*65d1f550SNick Terrell  *
1517*65d1f550SNick Terrell  * NOTE: See also ZSTD_DECOMPRESSION_MARGIN().
1518*65d1f550SNick Terrell  * NOTE: This applies only to single-pass decompression through ZSTD_decompress() or
1519*65d1f550SNick Terrell  * ZSTD_decompressDCtx().
1520*65d1f550SNick Terrell  * NOTE: This function supports multi-frame input.
1521*65d1f550SNick Terrell  *
1522*65d1f550SNick Terrell  * @param src The compressed frame(s)
1523*65d1f550SNick Terrell  * @param srcSize The size of the compressed frame(s)
1524*65d1f550SNick Terrell  * @returns The decompression margin or an error that can be checked with ZSTD_isError().
1525*65d1f550SNick Terrell  */
1526*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_decompressionMargin(const void* src, size_t srcSize);
1527*65d1f550SNick Terrell 
1528*65d1f550SNick Terrell /*! ZSTD_DECOMPRESS_MARGIN() :
1529*65d1f550SNick Terrell  * Similar to ZSTD_decompressionMargin(), but instead of computing the margin from
1530*65d1f550SNick Terrell  * the compressed frame, compute it from the original size and the blockSizeLog.
1531*65d1f550SNick Terrell  * See ZSTD_decompressionMargin() for details.
1532*65d1f550SNick Terrell  *
1533*65d1f550SNick Terrell  * WARNING: This macro does not support multi-frame input, the input must be a single
1534*65d1f550SNick Terrell  * zstd frame. If you need that support use the function, or implement it yourself.
1535*65d1f550SNick Terrell  *
1536*65d1f550SNick Terrell  * @param originalSize The original uncompressed size of the data.
1537*65d1f550SNick Terrell  * @param blockSize    The block size == MIN(windowSize, ZSTD_BLOCKSIZE_MAX).
1538*65d1f550SNick Terrell  *                     Unless you explicitly set the windowLog smaller than
1539*65d1f550SNick Terrell  *                     ZSTD_BLOCKSIZELOG_MAX you can just use ZSTD_BLOCKSIZE_MAX.
1540*65d1f550SNick Terrell  */
1541*65d1f550SNick Terrell #define ZSTD_DECOMPRESSION_MARGIN(originalSize, blockSize) ((size_t)(                                              \
1542*65d1f550SNick Terrell         ZSTD_FRAMEHEADERSIZE_MAX                                                              /* Frame header */ + \
1543*65d1f550SNick Terrell         4                                                                                         /* checksum */ + \
1544*65d1f550SNick Terrell         ((originalSize) == 0 ? 0 : 3 * (((originalSize) + (blockSize) - 1) / blockSize)) /* 3 bytes per block */ + \
1545*65d1f550SNick Terrell         (blockSize)                                                                    /* One block of margin */   \
1546*65d1f550SNick Terrell     ))
1547*65d1f550SNick Terrell 
1548e0c1b49fSNick Terrell typedef enum {
1549*65d1f550SNick Terrell   ZSTD_sf_noBlockDelimiters = 0,         /* ZSTD_Sequence[] has no block delimiters, just sequences */
1550*65d1f550SNick Terrell   ZSTD_sf_explicitBlockDelimiters = 1    /* ZSTD_Sequence[] contains explicit block delimiters */
1551*65d1f550SNick Terrell } ZSTD_SequenceFormat_e;
1552*65d1f550SNick Terrell #define ZSTD_sequenceFormat_e ZSTD_SequenceFormat_e /* old name */
1553*65d1f550SNick Terrell 
1554*65d1f550SNick Terrell /*! ZSTD_sequenceBound() :
1555*65d1f550SNick Terrell  * `srcSize` : size of the input buffer
1556*65d1f550SNick Terrell  *  @return : upper-bound for the number of sequences that can be generated
1557*65d1f550SNick Terrell  *            from a buffer of srcSize bytes
1558*65d1f550SNick Terrell  *
1559*65d1f550SNick Terrell  *  note : returns number of sequences - to get bytes, multiply by sizeof(ZSTD_Sequence).
1560*65d1f550SNick Terrell  */
1561*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_sequenceBound(size_t srcSize);
1562e0c1b49fSNick Terrell 
1563e0c1b49fSNick Terrell /*! ZSTD_generateSequences() :
1564*65d1f550SNick Terrell  * WARNING: This function is meant for debugging and informational purposes ONLY!
1565*65d1f550SNick Terrell  * Its implementation is flawed, and it will be deleted in a future version.
1566*65d1f550SNick Terrell  * It is not guaranteed to succeed, as there are several cases where it will give
1567*65d1f550SNick Terrell  * up and fail. You should NOT use this function in production code.
1568*65d1f550SNick Terrell  *
1569*65d1f550SNick Terrell  * This function is deprecated, and will be removed in a future version.
1570*65d1f550SNick Terrell  *
1571*65d1f550SNick Terrell  * Generate sequences using ZSTD_compress2(), given a source buffer.
1572*65d1f550SNick Terrell  *
1573*65d1f550SNick Terrell  * @param zc The compression context to be used for ZSTD_compress2(). Set any
1574*65d1f550SNick Terrell  *           compression parameters you need on this context.
1575*65d1f550SNick Terrell  * @param outSeqs The output sequences buffer of size @p outSeqsSize
1576*65d1f550SNick Terrell  * @param outSeqsCapacity The size of the output sequences buffer.
1577*65d1f550SNick Terrell  *                    ZSTD_sequenceBound(srcSize) is an upper bound on the number
1578*65d1f550SNick Terrell  *                    of sequences that can be generated.
1579*65d1f550SNick Terrell  * @param src The source buffer to generate sequences from of size @p srcSize.
1580*65d1f550SNick Terrell  * @param srcSize The size of the source buffer.
1581e0c1b49fSNick Terrell  *
1582e0c1b49fSNick Terrell  * Each block will end with a dummy sequence
1583e0c1b49fSNick Terrell  * with offset == 0, matchLength == 0, and litLength == length of last literals.
1584e0c1b49fSNick Terrell  * litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0)
1585e0c1b49fSNick Terrell  * simply acts as a block delimiter.
1586e0c1b49fSNick Terrell  *
1587*65d1f550SNick Terrell  * @returns The number of sequences generated, necessarily less than
1588*65d1f550SNick Terrell  *          ZSTD_sequenceBound(srcSize), or an error code that can be checked
1589*65d1f550SNick Terrell  *          with ZSTD_isError().
1590e0c1b49fSNick Terrell  */
1591*65d1f550SNick Terrell ZSTD_DEPRECATED("For debugging only, will be replaced by ZSTD_extractSequences()")
1592*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t
1593*65d1f550SNick Terrell ZSTD_generateSequences(ZSTD_CCtx* zc,
1594*65d1f550SNick Terrell                        ZSTD_Sequence* outSeqs, size_t outSeqsCapacity,
1595*65d1f550SNick Terrell                        const void* src, size_t srcSize);
1596e0c1b49fSNick Terrell 
1597e0c1b49fSNick Terrell /*! ZSTD_mergeBlockDelimiters() :
1598e0c1b49fSNick Terrell  * Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals
159988a30946STom Rix  * by merging them into the literals of the next sequence.
1600e0c1b49fSNick Terrell  *
1601e0c1b49fSNick Terrell  * As such, the final generated result has no explicit representation of block boundaries,
1602e0c1b49fSNick Terrell  * and the final last literals segment is not represented in the sequences.
1603e0c1b49fSNick Terrell  *
1604e0c1b49fSNick Terrell  * The output of this function can be fed into ZSTD_compressSequences() with CCtx
1605e0c1b49fSNick Terrell  * setting of ZSTD_c_blockDelimiters as ZSTD_sf_noBlockDelimiters
1606e0c1b49fSNick Terrell  * @return : number of sequences left after merging
1607e0c1b49fSNick Terrell  */
16082aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_mergeBlockDelimiters(ZSTD_Sequence* sequences, size_t seqsSize);
1609e0c1b49fSNick Terrell 
1610e0c1b49fSNick Terrell /*! ZSTD_compressSequences() :
1611*65d1f550SNick Terrell  * Compress an array of ZSTD_Sequence, associated with @src buffer, into dst.
1612*65d1f550SNick Terrell  * @src contains the entire input (not just the literals).
1613*65d1f550SNick Terrell  * If @srcSize > sum(sequence.length), the remaining bytes are considered all literals
1614*65d1f550SNick Terrell  * If a dictionary is included, then the cctx should reference the dict (see: ZSTD_CCtx_refCDict(), ZSTD_CCtx_loadDictionary(), etc.).
1615e0c1b49fSNick Terrell  * The entire source is compressed into a single frame.
1616e0c1b49fSNick Terrell  *
1617e0c1b49fSNick Terrell  * The compression behavior changes based on cctx params. In particular:
1618e0c1b49fSNick Terrell  *    If ZSTD_c_blockDelimiters == ZSTD_sf_noBlockDelimiters, the array of ZSTD_Sequence is expected to contain
1619e0c1b49fSNick Terrell  *    no block delimiters (defined in ZSTD_Sequence). Block boundaries are roughly determined based on
1620e0c1b49fSNick Terrell  *    the block size derived from the cctx, and sequences may be split. This is the default setting.
1621e0c1b49fSNick Terrell  *
1622e0c1b49fSNick Terrell  *    If ZSTD_c_blockDelimiters == ZSTD_sf_explicitBlockDelimiters, the array of ZSTD_Sequence is expected to contain
1623*65d1f550SNick Terrell  *    valid block delimiters (defined in ZSTD_Sequence). Behavior is undefined if no block delimiters are provided.
1624e0c1b49fSNick Terrell  *
1625*65d1f550SNick Terrell  *    When ZSTD_c_blockDelimiters == ZSTD_sf_explicitBlockDelimiters, it's possible to decide generating repcodes
1626*65d1f550SNick Terrell  *    using the advanced parameter ZSTD_c_repcodeResolution. Repcodes will improve compression ratio, though the benefit
1627*65d1f550SNick Terrell  *    can vary greatly depending on Sequences. On the other hand, repcode resolution is an expensive operation.
1628*65d1f550SNick Terrell  *    By default, it's disabled at low (<10) compression levels, and enabled above the threshold (>=10).
1629*65d1f550SNick Terrell  *    ZSTD_c_repcodeResolution makes it possible to directly manage this processing in either direction.
1630*65d1f550SNick Terrell  *
1631*65d1f550SNick Terrell  *    If ZSTD_c_validateSequences == 0, this function blindly accepts the Sequences provided. Invalid Sequences cause undefined
1632*65d1f550SNick Terrell  *    behavior. If ZSTD_c_validateSequences == 1, then the function will detect invalid Sequences (see doc/zstd_compression_format.md for
1633*65d1f550SNick Terrell  *    specifics regarding offset/matchlength requirements) and then bail out and return an error.
1634e0c1b49fSNick Terrell  *
1635e0c1b49fSNick Terrell  *    In addition to the two adjustable experimental params, there are other important cctx params.
1636e0c1b49fSNick Terrell  *    - 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.
1637e0c1b49fSNick Terrell  *    - ZSTD_c_compressionLevel accordingly adjusts the strength of the entropy coder, as it would in typical compression.
1638e0c1b49fSNick Terrell  *    - ZSTD_c_windowLog affects offset validation: this function will return an error at higher debug levels if a provided offset
1639e0c1b49fSNick Terrell  *      is larger than what the spec allows for a given window log and dictionary (if present). See: doc/zstd_compression_format.md
1640e0c1b49fSNick Terrell  *
1641*65d1f550SNick Terrell  * Note: Repcodes are, as of now, always re-calculated within this function, ZSTD_Sequence.rep is effectively unused.
1642*65d1f550SNick Terrell  * Dev Note: Once ability to ingest repcodes become available, the explicit block delims mode must respect those repcodes exactly,
1643*65d1f550SNick Terrell  *         and cannot emit an RLE block that disagrees with the repcode history.
1644*65d1f550SNick Terrell  * @return : final compressed size, or a ZSTD error code.
1645e0c1b49fSNick Terrell  */
1646*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t
1647*65d1f550SNick Terrell ZSTD_compressSequences(ZSTD_CCtx* cctx,
1648*65d1f550SNick Terrell                        void* dst, size_t dstCapacity,
1649e0c1b49fSNick Terrell                  const ZSTD_Sequence* inSeqs, size_t inSeqsSize,
1650cf30f6a5SNick Terrell                  const void* src, size_t srcSize);
1651cf30f6a5SNick Terrell 
1652cf30f6a5SNick Terrell 
1653*65d1f550SNick Terrell /*! ZSTD_compressSequencesAndLiterals() :
1654*65d1f550SNick Terrell  * This is a variant of ZSTD_compressSequences() which,
1655*65d1f550SNick Terrell  * instead of receiving (src,srcSize) as input parameter, receives (literals,litSize),
1656*65d1f550SNick Terrell  * aka all the literals, already extracted and laid out into a single continuous buffer.
1657*65d1f550SNick Terrell  * This can be useful if the process generating the sequences also happens to generate the buffer of literals,
1658*65d1f550SNick Terrell  * thus skipping an extraction + caching stage.
1659*65d1f550SNick Terrell  * It's a speed optimization, useful when the right conditions are met,
1660*65d1f550SNick Terrell  * but it also features the following limitations:
1661*65d1f550SNick Terrell  * - Only supports explicit delimiter mode
1662*65d1f550SNick Terrell  * - Currently does not support Sequences validation (so input Sequences are trusted)
1663*65d1f550SNick Terrell  * - Not compatible with frame checksum, which must be disabled
1664*65d1f550SNick Terrell  * - If any block is incompressible, will fail and return an error
1665*65d1f550SNick Terrell  * - @litSize must be == sum of all @.litLength fields in @inSeqs. Any discrepancy will generate an error.
1666*65d1f550SNick Terrell  * - @litBufCapacity is the size of the underlying buffer into which literals are written, starting at address @literals.
1667*65d1f550SNick Terrell  *   @litBufCapacity must be at least 8 bytes larger than @litSize.
1668*65d1f550SNick Terrell  * - @decompressedSize must be correct, and correspond to the sum of all Sequences. Any discrepancy will generate an error.
1669*65d1f550SNick Terrell  * @return : final compressed size, or a ZSTD error code.
1670*65d1f550SNick Terrell  */
1671*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t
1672*65d1f550SNick Terrell ZSTD_compressSequencesAndLiterals(ZSTD_CCtx* cctx,
1673*65d1f550SNick Terrell                                   void* dst, size_t dstCapacity,
1674*65d1f550SNick Terrell                             const ZSTD_Sequence* inSeqs, size_t nbSequences,
1675*65d1f550SNick Terrell                             const void* literals, size_t litSize, size_t litBufCapacity,
1676*65d1f550SNick Terrell                             size_t decompressedSize);
1677*65d1f550SNick Terrell 
1678*65d1f550SNick Terrell 
1679e0c1b49fSNick Terrell /*! ZSTD_writeSkippableFrame() :
1680e0c1b49fSNick Terrell  * Generates a zstd skippable frame containing data given by src, and writes it to dst buffer.
1681cf30f6a5SNick Terrell  *
168288a30946STom Rix  * Skippable frames begin with a 4-byte magic number. There are 16 possible choices of magic number,
1683e0c1b49fSNick Terrell  * ranging from ZSTD_MAGIC_SKIPPABLE_START to ZSTD_MAGIC_SKIPPABLE_START+15.
1684*65d1f550SNick Terrell  * As such, the parameter magicVariant controls the exact skippable frame magic number variant used,
1685*65d1f550SNick Terrell  * so the magic number used will be ZSTD_MAGIC_SKIPPABLE_START + magicVariant.
1686cf30f6a5SNick Terrell  *
1687e0c1b49fSNick Terrell  * Returns an error if destination buffer is not large enough, if the source size is not representable
1688e0c1b49fSNick Terrell  * with a 4-byte unsigned int, or if the parameter magicVariant is greater than 15 (and therefore invalid).
1689e0c1b49fSNick Terrell  *
1690e0c1b49fSNick Terrell  * @return : number of bytes written or a ZSTD error.
1691cf30f6a5SNick Terrell  */
16922aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_writeSkippableFrame(void* dst, size_t dstCapacity,
1693*65d1f550SNick Terrell                                              const void* src, size_t srcSize,
1694*65d1f550SNick Terrell                                                    unsigned magicVariant);
1695e0c1b49fSNick Terrell 
16962aa14b1aSNick Terrell /*! ZSTD_readSkippableFrame() :
1697*65d1f550SNick Terrell  * Retrieves the content of a zstd skippable frame starting at @src, and writes it to @dst buffer.
16982aa14b1aSNick Terrell  *
1699*65d1f550SNick Terrell  * The parameter @magicVariant will receive the magicVariant that was supplied when the frame was written,
1700*65d1f550SNick Terrell  * i.e. magicNumber - ZSTD_MAGIC_SKIPPABLE_START.
1701*65d1f550SNick Terrell  * This can be NULL if the caller is not interested in the magicVariant.
17022aa14b1aSNick Terrell  *
17032aa14b1aSNick Terrell  * Returns an error if destination buffer is not large enough, or if the frame is not skippable.
17042aa14b1aSNick Terrell  *
17052aa14b1aSNick Terrell  * @return : number of bytes written or a ZSTD error.
17062aa14b1aSNick Terrell  */
1707*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_readSkippableFrame(void* dst, size_t dstCapacity,
1708*65d1f550SNick Terrell                                                   unsigned* magicVariant,
17092aa14b1aSNick Terrell                                                   const void* src, size_t srcSize);
17102aa14b1aSNick Terrell 
17112aa14b1aSNick Terrell /*! ZSTD_isSkippableFrame() :
17122aa14b1aSNick Terrell  *  Tells if the content of `buffer` starts with a valid Frame Identifier for a skippable frame.
17132aa14b1aSNick Terrell  */
1714*65d1f550SNick Terrell ZSTDLIB_STATIC_API unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size);
17152aa14b1aSNick Terrell 
17162aa14b1aSNick Terrell 
1717e0c1b49fSNick Terrell 
1718e0c1b49fSNick Terrell /* *************************************
1719e0c1b49fSNick Terrell *  Memory management
1720e0c1b49fSNick Terrell ***************************************/
1721e0c1b49fSNick Terrell 
1722e0c1b49fSNick Terrell /*! ZSTD_estimate*() :
1723e0c1b49fSNick Terrell  *  These functions make it possible to estimate memory usage
1724e0c1b49fSNick Terrell  *  of a future {D,C}Ctx, before its creation.
1725*65d1f550SNick Terrell  *  This is useful in combination with ZSTD_initStatic(),
1726*65d1f550SNick Terrell  *  which makes it possible to employ a static buffer for ZSTD_CCtx* state.
1727e0c1b49fSNick Terrell  *
1728e0c1b49fSNick Terrell  *  ZSTD_estimateCCtxSize() will provide a memory budget large enough
1729*65d1f550SNick Terrell  *  to compress data of any size using one-shot compression ZSTD_compressCCtx() or ZSTD_compress2()
1730*65d1f550SNick Terrell  *  associated with any compression level up to max specified one.
1731e0c1b49fSNick Terrell  *  The estimate will assume the input may be arbitrarily large,
1732e0c1b49fSNick Terrell  *  which is the worst case.
1733e0c1b49fSNick Terrell  *
1734*65d1f550SNick Terrell  *  Note that the size estimation is specific for one-shot compression,
1735*65d1f550SNick Terrell  *  it is not valid for streaming (see ZSTD_estimateCStreamSize*())
1736*65d1f550SNick Terrell  *  nor other potential ways of using a ZSTD_CCtx* state.
1737*65d1f550SNick Terrell  *
1738e0c1b49fSNick Terrell  *  When srcSize can be bound by a known and rather "small" value,
1739*65d1f550SNick Terrell  *  this knowledge can be used to provide a tighter budget estimation
1740*65d1f550SNick Terrell  *  because the ZSTD_CCtx* state will need less memory for small inputs.
1741*65d1f550SNick Terrell  *  This tighter estimation can be provided by employing more advanced functions
1742e0c1b49fSNick Terrell  *  ZSTD_estimateCCtxSize_usingCParams(), which can be used in tandem with ZSTD_getCParams(),
1743e0c1b49fSNick Terrell  *  and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter().
1744e0c1b49fSNick Terrell  *  Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits.
1745e0c1b49fSNick Terrell  *
1746*65d1f550SNick Terrell  *  Note : only single-threaded compression is supported.
1747e0c1b49fSNick Terrell  *  ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.
1748e0c1b49fSNick Terrell  */
1749*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int maxCompressionLevel);
17502aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams);
17512aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params);
17522aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void);
1753e0c1b49fSNick Terrell 
1754e0c1b49fSNick Terrell /*! ZSTD_estimateCStreamSize() :
1755*65d1f550SNick Terrell  *  ZSTD_estimateCStreamSize() will provide a memory budget large enough for streaming compression
1756*65d1f550SNick Terrell  *  using any compression level up to the max specified one.
1757*65d1f550SNick Terrell  *  It will also consider src size to be arbitrarily "large", which is a worst case scenario.
1758e0c1b49fSNick Terrell  *  If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation.
1759e0c1b49fSNick Terrell  *  ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel.
1760e0c1b49fSNick Terrell  *  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.
1761e0c1b49fSNick Terrell  *  Note : CStream size estimation is only correct for single-threaded compression.
1762*65d1f550SNick Terrell  *  ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.
1763*65d1f550SNick Terrell  *  Note 2 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time.
1764*65d1f550SNick Terrell  *  Size estimates assume that no external sequence producer is registered.
1765*65d1f550SNick Terrell  *
1766*65d1f550SNick Terrell  *  ZSTD_DStream memory budget depends on frame's window Size.
1767e0c1b49fSNick Terrell  *  This information can be passed manually, using ZSTD_estimateDStreamSize,
1768e0c1b49fSNick Terrell  *  or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame();
1769*65d1f550SNick Terrell  *  Any frame requesting a window size larger than max specified one will be rejected.
1770e0c1b49fSNick Terrell  *  Note : if streaming is init with function ZSTD_init?Stream_usingDict(),
1771e0c1b49fSNick Terrell  *         an internal ?Dict will be created, which additional size is not estimated here.
1772*65d1f550SNick Terrell  *         In this case, get total size by adding ZSTD_estimate?DictSize
1773*65d1f550SNick Terrell  */
1774*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int maxCompressionLevel);
17752aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams);
17762aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params);
1777*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize(size_t maxWindowSize);
17782aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize);
1779e0c1b49fSNick Terrell 
1780e0c1b49fSNick Terrell /*! ZSTD_estimate?DictSize() :
1781e0c1b49fSNick Terrell  *  ZSTD_estimateCDictSize() will bet that src size is relatively "small", and content is copied, like ZSTD_createCDict().
1782e0c1b49fSNick Terrell  *  ZSTD_estimateCDictSize_advanced() makes it possible to control compression parameters precisely, like ZSTD_createCDict_advanced().
1783e0c1b49fSNick Terrell  *  Note : dictionaries created by reference (`ZSTD_dlm_byRef`) are logically smaller.
1784e0c1b49fSNick Terrell  */
17852aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize(size_t dictSize, int compressionLevel);
17862aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateCDictSize_advanced(size_t dictSize, ZSTD_compressionParameters cParams, ZSTD_dictLoadMethod_e dictLoadMethod);
17872aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_estimateDDictSize(size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod);
1788e0c1b49fSNick Terrell 
1789e0c1b49fSNick Terrell /*! ZSTD_initStatic*() :
1790e0c1b49fSNick Terrell  *  Initialize an object using a pre-allocated fixed-size buffer.
1791e0c1b49fSNick Terrell  *  workspace: The memory area to emplace the object into.
1792e0c1b49fSNick Terrell  *             Provided pointer *must be 8-bytes aligned*.
1793e0c1b49fSNick Terrell  *             Buffer must outlive object.
1794e0c1b49fSNick Terrell  *  workspaceSize: Use ZSTD_estimate*Size() to determine
1795e0c1b49fSNick Terrell  *                 how large workspace must be to support target scenario.
1796e0c1b49fSNick Terrell  * @return : pointer to object (same address as workspace, just different type),
1797e0c1b49fSNick Terrell  *           or NULL if error (size too small, incorrect alignment, etc.)
1798e0c1b49fSNick Terrell  *  Note : zstd will never resize nor malloc() when using a static buffer.
1799e0c1b49fSNick Terrell  *         If the object requires more memory than available,
1800e0c1b49fSNick Terrell  *         zstd will just error out (typically ZSTD_error_memory_allocation).
1801e0c1b49fSNick Terrell  *  Note 2 : there is no corresponding "free" function.
1802e0c1b49fSNick Terrell  *           Since workspace is allocated externally, it must be freed externally too.
1803e0c1b49fSNick Terrell  *  Note 3 : cParams : use ZSTD_getCParams() to convert a compression level
1804e0c1b49fSNick Terrell  *           into its associated cParams.
1805e0c1b49fSNick Terrell  *  Limitation 1 : currently not compatible with internal dictionary creation, triggered by
1806e0c1b49fSNick Terrell  *                 ZSTD_CCtx_loadDictionary(), ZSTD_initCStream_usingDict() or ZSTD_initDStream_usingDict().
1807e0c1b49fSNick Terrell  *  Limitation 2 : static cctx currently not compatible with multi-threading.
1808e0c1b49fSNick Terrell  *  Limitation 3 : static dctx is incompatible with legacy support.
1809e0c1b49fSNick Terrell  */
18102aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_CCtx*    ZSTD_initStaticCCtx(void* workspace, size_t workspaceSize);
18112aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_initStaticCStream(void* workspace, size_t workspaceSize);    /*< same as ZSTD_initStaticCCtx() */
1812e0c1b49fSNick Terrell 
18132aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_DCtx*    ZSTD_initStaticDCtx(void* workspace, size_t workspaceSize);
18142aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_initStaticDStream(void* workspace, size_t workspaceSize);    /*< same as ZSTD_initStaticDCtx() */
1815e0c1b49fSNick Terrell 
18162aa14b1aSNick Terrell ZSTDLIB_STATIC_API const ZSTD_CDict* ZSTD_initStaticCDict(
1817e0c1b49fSNick Terrell                                         void* workspace, size_t workspaceSize,
1818e0c1b49fSNick Terrell                                         const void* dict, size_t dictSize,
1819e0c1b49fSNick Terrell                                         ZSTD_dictLoadMethod_e dictLoadMethod,
1820e0c1b49fSNick Terrell                                         ZSTD_dictContentType_e dictContentType,
1821e0c1b49fSNick Terrell                                         ZSTD_compressionParameters cParams);
1822e0c1b49fSNick Terrell 
18232aa14b1aSNick Terrell ZSTDLIB_STATIC_API const ZSTD_DDict* ZSTD_initStaticDDict(
1824e0c1b49fSNick Terrell                                         void* workspace, size_t workspaceSize,
1825e0c1b49fSNick Terrell                                         const void* dict, size_t dictSize,
1826e0c1b49fSNick Terrell                                         ZSTD_dictLoadMethod_e dictLoadMethod,
1827e0c1b49fSNick Terrell                                         ZSTD_dictContentType_e dictContentType);
1828e0c1b49fSNick Terrell 
1829e0c1b49fSNick Terrell 
1830e0c1b49fSNick Terrell /*! Custom memory allocation :
1831e0c1b49fSNick Terrell  *  These prototypes make it possible to pass your own allocation/free functions.
1832e0c1b49fSNick Terrell  *  ZSTD_customMem is provided at creation time, using ZSTD_create*_advanced() variants listed below.
1833e0c1b49fSNick Terrell  *  All allocation/free operations will be completed using these custom variants instead of regular <stdlib.h> ones.
1834e0c1b49fSNick Terrell  */
1835e0c1b49fSNick Terrell typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size);
1836e0c1b49fSNick Terrell typedef void  (*ZSTD_freeFunction) (void* opaque, void* address);
1837e0c1b49fSNick Terrell typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem;
1838e0c1b49fSNick Terrell static
1839e0c1b49fSNick Terrell __attribute__((__unused__))
1840*65d1f550SNick Terrell 
1841*65d1f550SNick Terrell #if defined(__clang__) && __clang_major__ >= 5
1842*65d1f550SNick Terrell #pragma clang diagnostic push
1843*65d1f550SNick Terrell #pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
1844*65d1f550SNick Terrell #endif
1845e0c1b49fSNick Terrell ZSTD_customMem const ZSTD_defaultCMem = { NULL, NULL, NULL };  /*< this constant defers to stdlib's functions */
1846*65d1f550SNick Terrell #if defined(__clang__) && __clang_major__ >= 5
1847*65d1f550SNick Terrell #pragma clang diagnostic pop
1848*65d1f550SNick Terrell #endif
1849e0c1b49fSNick Terrell 
18502aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_CCtx*    ZSTD_createCCtx_advanced(ZSTD_customMem customMem);
18512aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_CStream* ZSTD_createCStream_advanced(ZSTD_customMem customMem);
18522aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_DCtx*    ZSTD_createDCtx_advanced(ZSTD_customMem customMem);
18532aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_DStream* ZSTD_createDStream_advanced(ZSTD_customMem customMem);
1854e0c1b49fSNick Terrell 
18552aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize,
1856e0c1b49fSNick Terrell                                                   ZSTD_dictLoadMethod_e dictLoadMethod,
1857e0c1b49fSNick Terrell                                                   ZSTD_dictContentType_e dictContentType,
1858e0c1b49fSNick Terrell                                                   ZSTD_compressionParameters cParams,
1859e0c1b49fSNick Terrell                                                   ZSTD_customMem customMem);
1860e0c1b49fSNick Terrell 
1861e0c1b49fSNick Terrell /*! Thread pool :
1862e0c1b49fSNick Terrell  *  These prototypes make it possible to share a thread pool among multiple compression contexts.
1863e0c1b49fSNick Terrell  *  This can limit resources for applications with multiple threads where each one uses
1864e0c1b49fSNick Terrell  *  a threaded compression mode (via ZSTD_c_nbWorkers parameter).
1865e0c1b49fSNick Terrell  *  ZSTD_createThreadPool creates a new thread pool with a given number of threads.
1866e0c1b49fSNick Terrell  *  Note that the lifetime of such pool must exist while being used.
1867e0c1b49fSNick Terrell  *  ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value
1868e0c1b49fSNick Terrell  *  to use an internal thread pool).
1869e0c1b49fSNick Terrell  *  ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer.
1870e0c1b49fSNick Terrell  */
1871e0c1b49fSNick Terrell typedef struct POOL_ctx_s ZSTD_threadPool;
18722aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads);
18732aa14b1aSNick Terrell ZSTDLIB_STATIC_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool);  /* accept NULL pointer */
18742aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool);
1875e0c1b49fSNick Terrell 
1876e0c1b49fSNick Terrell 
1877e0c1b49fSNick Terrell /*
1878e0c1b49fSNick Terrell  * This API is temporary and is expected to change or disappear in the future!
1879e0c1b49fSNick Terrell  */
18802aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_advanced2(
1881e0c1b49fSNick Terrell     const void* dict, size_t dictSize,
1882e0c1b49fSNick Terrell     ZSTD_dictLoadMethod_e dictLoadMethod,
1883e0c1b49fSNick Terrell     ZSTD_dictContentType_e dictContentType,
1884e0c1b49fSNick Terrell     const ZSTD_CCtx_params* cctxParams,
1885e0c1b49fSNick Terrell     ZSTD_customMem customMem);
1886e0c1b49fSNick Terrell 
18872aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_advanced(
1888e0c1b49fSNick Terrell     const void* dict, size_t dictSize,
1889e0c1b49fSNick Terrell     ZSTD_dictLoadMethod_e dictLoadMethod,
1890e0c1b49fSNick Terrell     ZSTD_dictContentType_e dictContentType,
1891e0c1b49fSNick Terrell     ZSTD_customMem customMem);
1892e0c1b49fSNick Terrell 
1893e0c1b49fSNick Terrell 
1894e0c1b49fSNick Terrell /* *************************************
1895e0c1b49fSNick Terrell *  Advanced compression functions
1896e0c1b49fSNick Terrell ***************************************/
1897e0c1b49fSNick Terrell 
1898e0c1b49fSNick Terrell /*! ZSTD_createCDict_byReference() :
1899e0c1b49fSNick Terrell  *  Create a digested dictionary for compression
1900e0c1b49fSNick Terrell  *  Dictionary content is just referenced, not duplicated.
1901e0c1b49fSNick Terrell  *  As a consequence, `dictBuffer` **must** outlive CDict,
1902e0c1b49fSNick Terrell  *  and its content must remain unmodified throughout the lifetime of CDict.
1903e0c1b49fSNick Terrell  *  note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef */
19042aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel);
1905e0c1b49fSNick Terrell 
1906e0c1b49fSNick Terrell /*! ZSTD_getCParams() :
1907e0c1b49fSNick Terrell  * @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize.
1908e0c1b49fSNick Terrell  * `estimatedSrcSize` value is optional, select 0 if not known */
19092aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
1910e0c1b49fSNick Terrell 
1911e0c1b49fSNick Terrell /*! ZSTD_getParams() :
1912e0c1b49fSNick Terrell  *  same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of sub-component `ZSTD_compressionParameters`.
1913e0c1b49fSNick Terrell  *  All fields of `ZSTD_frameParameters` are set to default : contentSize=1, checksum=0, noDictID=0 */
19142aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long estimatedSrcSize, size_t dictSize);
1915e0c1b49fSNick Terrell 
1916e0c1b49fSNick Terrell /*! ZSTD_checkCParams() :
1917e0c1b49fSNick Terrell  *  Ensure param values remain within authorized range.
1918e0c1b49fSNick Terrell  * @return 0 on success, or an error code (can be checked with ZSTD_isError()) */
19192aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params);
1920e0c1b49fSNick Terrell 
1921e0c1b49fSNick Terrell /*! ZSTD_adjustCParams() :
1922e0c1b49fSNick Terrell  *  optimize params for a given `srcSize` and `dictSize`.
1923e0c1b49fSNick Terrell  * `srcSize` can be unknown, in which case use ZSTD_CONTENTSIZE_UNKNOWN.
1924e0c1b49fSNick Terrell  * `dictSize` must be `0` when there is no dictionary.
1925e0c1b49fSNick Terrell  *  cPar can be invalid : all parameters will be clamped within valid range in the @return struct.
1926e0c1b49fSNick Terrell  *  This function never fails (wide contract) */
19272aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize);
1928e0c1b49fSNick Terrell 
1929*65d1f550SNick Terrell /*! ZSTD_CCtx_setCParams() :
1930*65d1f550SNick Terrell  *  Set all parameters provided within @p cparams into the working @p cctx.
1931*65d1f550SNick Terrell  *  Note : if modifying parameters during compression (MT mode only),
1932*65d1f550SNick Terrell  *         note that changes to the .windowLog parameter will be ignored.
1933*65d1f550SNick Terrell  * @return 0 on success, or an error code (can be checked with ZSTD_isError()).
1934*65d1f550SNick Terrell  *         On failure, no parameters are updated.
1935*65d1f550SNick Terrell  */
1936*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setCParams(ZSTD_CCtx* cctx, ZSTD_compressionParameters cparams);
1937*65d1f550SNick Terrell 
1938*65d1f550SNick Terrell /*! ZSTD_CCtx_setFParams() :
1939*65d1f550SNick Terrell  *  Set all parameters provided within @p fparams into the working @p cctx.
1940*65d1f550SNick Terrell  * @return 0 on success, or an error code (can be checked with ZSTD_isError()).
1941*65d1f550SNick Terrell  */
1942*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setFParams(ZSTD_CCtx* cctx, ZSTD_frameParameters fparams);
1943*65d1f550SNick Terrell 
1944*65d1f550SNick Terrell /*! ZSTD_CCtx_setParams() :
1945*65d1f550SNick Terrell  *  Set all parameters provided within @p params into the working @p cctx.
1946*65d1f550SNick Terrell  * @return 0 on success, or an error code (can be checked with ZSTD_isError()).
1947*65d1f550SNick Terrell  */
1948*65d1f550SNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParams(ZSTD_CCtx* cctx, ZSTD_parameters params);
1949*65d1f550SNick Terrell 
1950e0c1b49fSNick Terrell /*! ZSTD_compress_advanced() :
1951e0c1b49fSNick Terrell  *  Note : this function is now DEPRECATED.
1952e0c1b49fSNick Terrell  *         It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters.
19532aa14b1aSNick Terrell  *  This prototype will generate compilation warnings. */
19542aa14b1aSNick Terrell ZSTD_DEPRECATED("use ZSTD_compress2")
1955*65d1f550SNick Terrell ZSTDLIB_STATIC_API
19562aa14b1aSNick Terrell size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx,
1957e0c1b49fSNick Terrell                               void* dst, size_t dstCapacity,
1958e0c1b49fSNick Terrell                         const void* src, size_t srcSize,
1959e0c1b49fSNick Terrell                         const void* dict,size_t dictSize,
1960cf30f6a5SNick Terrell                               ZSTD_parameters params);
1961cf30f6a5SNick Terrell 
1962e0c1b49fSNick Terrell /*! ZSTD_compress_usingCDict_advanced() :
19632aa14b1aSNick Terrell  *  Note : this function is now DEPRECATED.
1964e0c1b49fSNick Terrell  *         It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters.
19652aa14b1aSNick Terrell  *  This prototype will generate compilation warnings. */
19662aa14b1aSNick Terrell ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary")
1967*65d1f550SNick Terrell ZSTDLIB_STATIC_API
19682aa14b1aSNick Terrell size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
1969e0c1b49fSNick Terrell                                               void* dst, size_t dstCapacity,
1970e0c1b49fSNick Terrell                                         const void* src, size_t srcSize,
1971e0c1b49fSNick Terrell                                         const ZSTD_CDict* cdict,
1972e0c1b49fSNick Terrell                                               ZSTD_frameParameters fParams);
1973e0c1b49fSNick Terrell 
1974e0c1b49fSNick Terrell 
1975e0c1b49fSNick Terrell /*! ZSTD_CCtx_loadDictionary_byReference() :
1976e0c1b49fSNick Terrell  *  Same as ZSTD_CCtx_loadDictionary(), but dictionary content is referenced, instead of being copied into CCtx.
1977e0c1b49fSNick Terrell  *  It saves some memory, but also requires that `dict` outlives its usage within `cctx` */
19782aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_byReference(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
1979e0c1b49fSNick Terrell 
1980e0c1b49fSNick Terrell /*! ZSTD_CCtx_loadDictionary_advanced() :
1981e0c1b49fSNick Terrell  *  Same as ZSTD_CCtx_loadDictionary(), but gives finer control over
1982e0c1b49fSNick Terrell  *  how to load the dictionary (by copy ? by reference ?)
1983e0c1b49fSNick Terrell  *  and how to interpret it (automatic ? force raw mode ? full mode only ?) */
19842aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtx_loadDictionary_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
1985e0c1b49fSNick Terrell 
1986e0c1b49fSNick Terrell /*! ZSTD_CCtx_refPrefix_advanced() :
1987e0c1b49fSNick Terrell  *  Same as ZSTD_CCtx_refPrefix(), but gives finer control over
1988e0c1b49fSNick Terrell  *  how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */
19892aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
1990e0c1b49fSNick Terrell 
1991e0c1b49fSNick Terrell /* ===   experimental parameters   === */
1992e0c1b49fSNick Terrell /* these parameters can be used with ZSTD_setParameter()
1993e0c1b49fSNick Terrell  * they are not guaranteed to remain supported in the future */
1994e0c1b49fSNick Terrell 
1995e0c1b49fSNick Terrell  /* Enables rsyncable mode,
1996e0c1b49fSNick Terrell   * which makes compressed files more rsync friendly
1997e0c1b49fSNick Terrell   * by adding periodic synchronization points to the compressed data.
1998e0c1b49fSNick Terrell   * The target average block size is ZSTD_c_jobSize / 2.
1999e0c1b49fSNick Terrell   * It's possible to modify the job size to increase or decrease
2000e0c1b49fSNick Terrell   * the granularity of the synchronization point.
2001e0c1b49fSNick Terrell   * Once the jobSize is smaller than the window size,
2002e0c1b49fSNick Terrell   * it will result in compression ratio degradation.
2003e0c1b49fSNick Terrell   * NOTE 1: rsyncable mode only works when multithreading is enabled.
2004e0c1b49fSNick Terrell   * NOTE 2: rsyncable performs poorly in combination with long range mode,
2005e0c1b49fSNick Terrell   * since it will decrease the effectiveness of synchronization points,
2006e0c1b49fSNick Terrell   * though mileage may vary.
2007e0c1b49fSNick Terrell   * NOTE 3: Rsyncable mode limits maximum compression speed to ~400 MB/s.
2008e0c1b49fSNick Terrell   * If the selected compression level is already running significantly slower,
2009e0c1b49fSNick Terrell   * the overall speed won't be significantly impacted.
2010cf30f6a5SNick Terrell   */
2011e0c1b49fSNick Terrell  #define ZSTD_c_rsyncable ZSTD_c_experimentalParam1
2012cf30f6a5SNick Terrell 
2013e0c1b49fSNick Terrell /* Select a compression format.
2014e0c1b49fSNick Terrell  * The value must be of type ZSTD_format_e.
2015e0c1b49fSNick Terrell  * See ZSTD_format_e enum definition for details */
2016e0c1b49fSNick Terrell #define ZSTD_c_format ZSTD_c_experimentalParam2
2017cf30f6a5SNick Terrell 
2018e0c1b49fSNick Terrell /* Force back-reference distances to remain < windowSize,
2019e0c1b49fSNick Terrell  * even when referencing into Dictionary content (default:0) */
2020e0c1b49fSNick Terrell #define ZSTD_c_forceMaxWindow ZSTD_c_experimentalParam3
2021e0c1b49fSNick Terrell 
2022e0c1b49fSNick Terrell /* Controls whether the contents of a CDict
2023e0c1b49fSNick Terrell  * are used in place, or copied into the working context.
2024e0c1b49fSNick Terrell  * Accepts values from the ZSTD_dictAttachPref_e enum.
2025e0c1b49fSNick Terrell  * See the comments on that enum for an explanation of the feature. */
2026e0c1b49fSNick Terrell #define ZSTD_c_forceAttachDict ZSTD_c_experimentalParam4
2027e0c1b49fSNick Terrell 
2028*65d1f550SNick Terrell /* Controlled with ZSTD_ParamSwitch_e enum.
20292aa14b1aSNick Terrell  * Default is ZSTD_ps_auto.
20302aa14b1aSNick Terrell  * Set to ZSTD_ps_disable to never compress literals.
20312aa14b1aSNick Terrell  * Set to ZSTD_ps_enable to always compress literals. (Note: uncompressed literals
20322aa14b1aSNick Terrell  * may still be emitted if huffman is not beneficial to use.)
20332aa14b1aSNick Terrell  *
20342aa14b1aSNick Terrell  * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use
20352aa14b1aSNick Terrell  * literals compression based on the compression parameters - specifically,
20362aa14b1aSNick Terrell  * negative compression levels do not use literal compression.
2037cf30f6a5SNick Terrell  */
2038e0c1b49fSNick Terrell #define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5
2039cf30f6a5SNick Terrell 
2040e0c1b49fSNick Terrell /* User's best guess of source size.
2041e0c1b49fSNick Terrell  * Hint is not valid when srcSizeHint == 0.
2042e0c1b49fSNick Terrell  * There is no guarantee that hint is close to actual source size,
2043e0c1b49fSNick Terrell  * but compression ratio may regress significantly if guess considerably underestimates */
2044e0c1b49fSNick Terrell #define ZSTD_c_srcSizeHint ZSTD_c_experimentalParam7
2045e0c1b49fSNick Terrell 
2046e0c1b49fSNick Terrell /* Controls whether the new and experimental "dedicated dictionary search
2047e0c1b49fSNick Terrell  * structure" can be used. This feature is still rough around the edges, be
2048e0c1b49fSNick Terrell  * prepared for surprising behavior!
2049e0c1b49fSNick Terrell  *
2050e0c1b49fSNick Terrell  * How to use it:
2051e0c1b49fSNick Terrell  *
2052e0c1b49fSNick Terrell  * When using a CDict, whether to use this feature or not is controlled at
2053e0c1b49fSNick Terrell  * CDict creation, and it must be set in a CCtxParams set passed into that
2054e0c1b49fSNick Terrell  * construction (via ZSTD_createCDict_advanced2()). A compression will then
2055e0c1b49fSNick Terrell  * use the feature or not based on how the CDict was constructed; the value of
2056e0c1b49fSNick Terrell  * this param, set in the CCtx, will have no effect.
2057e0c1b49fSNick Terrell  *
2058e0c1b49fSNick Terrell  * However, when a dictionary buffer is passed into a CCtx, such as via
2059e0c1b49fSNick Terrell  * ZSTD_CCtx_loadDictionary(), this param can be set on the CCtx to control
2060e0c1b49fSNick Terrell  * whether the CDict that is created internally can use the feature or not.
2061e0c1b49fSNick Terrell  *
2062e0c1b49fSNick Terrell  * What it does:
2063e0c1b49fSNick Terrell  *
2064e0c1b49fSNick Terrell  * Normally, the internal data structures of the CDict are analogous to what
2065e0c1b49fSNick Terrell  * would be stored in a CCtx after compressing the contents of a dictionary.
2066e0c1b49fSNick Terrell  * To an approximation, a compression using a dictionary can then use those
2067e0c1b49fSNick Terrell  * data structures to simply continue what is effectively a streaming
2068e0c1b49fSNick Terrell  * compression where the simulated compression of the dictionary left off.
2069e0c1b49fSNick Terrell  * Which is to say, the search structures in the CDict are normally the same
2070e0c1b49fSNick Terrell  * format as in the CCtx.
2071e0c1b49fSNick Terrell  *
2072e0c1b49fSNick Terrell  * It is possible to do better, since the CDict is not like a CCtx: the search
2073e0c1b49fSNick Terrell  * structures are written once during CDict creation, and then are only read
2074e0c1b49fSNick Terrell  * after that, while the search structures in the CCtx are both read and
2075e0c1b49fSNick Terrell  * written as the compression goes along. This means we can choose a search
2076e0c1b49fSNick Terrell  * structure for the dictionary that is read-optimized.
2077e0c1b49fSNick Terrell  *
2078e0c1b49fSNick Terrell  * This feature enables the use of that different structure.
2079e0c1b49fSNick Terrell  *
2080e0c1b49fSNick Terrell  * Note that some of the members of the ZSTD_compressionParameters struct have
2081e0c1b49fSNick Terrell  * different semantics and constraints in the dedicated search structure. It is
2082e0c1b49fSNick Terrell  * highly recommended that you simply set a compression level in the CCtxParams
2083e0c1b49fSNick Terrell  * you pass into the CDict creation call, and avoid messing with the cParams
2084e0c1b49fSNick Terrell  * directly.
2085e0c1b49fSNick Terrell  *
2086e0c1b49fSNick Terrell  * Effects:
2087e0c1b49fSNick Terrell  *
2088e0c1b49fSNick Terrell  * This will only have any effect when the selected ZSTD_strategy
2089e0c1b49fSNick Terrell  * implementation supports this feature. Currently, that's limited to
2090e0c1b49fSNick Terrell  * ZSTD_greedy, ZSTD_lazy, and ZSTD_lazy2.
2091e0c1b49fSNick Terrell  *
2092e0c1b49fSNick Terrell  * Note that this means that the CDict tables can no longer be copied into the
2093e0c1b49fSNick Terrell  * CCtx, so the dict attachment mode ZSTD_dictForceCopy will no longer be
20942aa14b1aSNick Terrell  * usable. The dictionary can only be attached or reloaded.
2095e0c1b49fSNick Terrell  *
2096e0c1b49fSNick Terrell  * In general, you should expect compression to be faster--sometimes very much
2097e0c1b49fSNick Terrell  * so--and CDict creation to be slightly slower. Eventually, we will probably
2098e0c1b49fSNick Terrell  * make this mode the default.
2099cf30f6a5SNick Terrell  */
2100e0c1b49fSNick Terrell #define ZSTD_c_enableDedicatedDictSearch ZSTD_c_experimentalParam8
2101cf30f6a5SNick Terrell 
2102e0c1b49fSNick Terrell /* ZSTD_c_stableInBuffer
2103e0c1b49fSNick Terrell  * Experimental parameter.
2104e0c1b49fSNick Terrell  * Default is 0 == disabled. Set to 1 to enable.
2105cf30f6a5SNick Terrell  *
2106*65d1f550SNick Terrell  * Tells the compressor that input data presented with ZSTD_inBuffer
2107*65d1f550SNick Terrell  * will ALWAYS be the same between calls.
2108*65d1f550SNick Terrell  * Technically, the @src pointer must never be changed,
2109*65d1f550SNick Terrell  * and the @pos field can only be updated by zstd.
2110*65d1f550SNick Terrell  * However, it's possible to increase the @size field,
2111*65d1f550SNick Terrell  * allowing scenarios where more data can be appended after compressions starts.
2112*65d1f550SNick Terrell  * These conditions are checked by the compressor,
2113*65d1f550SNick Terrell  * and compression will fail if they are not respected.
2114*65d1f550SNick Terrell  * Also, data in the ZSTD_inBuffer within the range [src, src + pos)
2115*65d1f550SNick Terrell  * MUST not be modified during compression or it will result in data corruption.
2116cf30f6a5SNick Terrell  *
2117e0c1b49fSNick Terrell  * When this flag is enabled zstd won't allocate an input window buffer,
2118e0c1b49fSNick Terrell  * because the user guarantees it can reference the ZSTD_inBuffer until
2119e0c1b49fSNick Terrell  * the frame is complete. But, it will still allocate an output buffer
2120e0c1b49fSNick Terrell  * large enough to fit a block (see ZSTD_c_stableOutBuffer). This will also
2121e0c1b49fSNick Terrell  * avoid the memcpy() from the input buffer to the input window buffer.
2122e0c1b49fSNick Terrell  *
2123e0c1b49fSNick Terrell  * NOTE: So long as the ZSTD_inBuffer always points to valid memory, using
2124e0c1b49fSNick Terrell  * this flag is ALWAYS memory safe, and will never access out-of-bounds
2125*65d1f550SNick Terrell  * memory. However, compression WILL fail if conditions are not respected.
2126e0c1b49fSNick Terrell  *
2127*65d1f550SNick Terrell  * WARNING: The data in the ZSTD_inBuffer in the range [src, src + pos) MUST
2128*65d1f550SNick Terrell  * not be modified during compression or it will result in data corruption.
2129*65d1f550SNick Terrell  * This is because zstd needs to reference data in the ZSTD_inBuffer to find
2130e0c1b49fSNick Terrell  * matches. Normally zstd maintains its own window buffer for this purpose,
2131*65d1f550SNick Terrell  * but passing this flag tells zstd to rely on user provided buffer instead.
2132cf30f6a5SNick Terrell  */
2133e0c1b49fSNick Terrell #define ZSTD_c_stableInBuffer ZSTD_c_experimentalParam9
2134cf30f6a5SNick Terrell 
2135e0c1b49fSNick Terrell /* ZSTD_c_stableOutBuffer
2136e0c1b49fSNick Terrell  * Experimental parameter.
2137e0c1b49fSNick Terrell  * Default is 0 == disabled. Set to 1 to enable.
2138cf30f6a5SNick Terrell  *
2139e0c1b49fSNick Terrell  * Tells he compressor that the ZSTD_outBuffer will not be resized between
2140e0c1b49fSNick Terrell  * calls. Specifically: (out.size - out.pos) will never grow. This gives the
2141e0c1b49fSNick Terrell  * compressor the freedom to say: If the compressed data doesn't fit in the
2142e0c1b49fSNick Terrell  * output buffer then return ZSTD_error_dstSizeTooSmall. This allows us to
2143e0c1b49fSNick Terrell  * always decompress directly into the output buffer, instead of decompressing
2144e0c1b49fSNick Terrell  * into an internal buffer and copying to the output buffer.
2145cf30f6a5SNick Terrell  *
2146e0c1b49fSNick Terrell  * When this flag is enabled zstd won't allocate an output buffer, because
2147e0c1b49fSNick Terrell  * it can write directly to the ZSTD_outBuffer. It will still allocate the
2148e0c1b49fSNick Terrell  * input window buffer (see ZSTD_c_stableInBuffer).
2149e0c1b49fSNick Terrell  *
2150e0c1b49fSNick Terrell  * Zstd will check that (out.size - out.pos) never grows and return an error
2151e0c1b49fSNick Terrell  * if it does. While not strictly necessary, this should prevent surprises.
2152cf30f6a5SNick Terrell  */
2153e0c1b49fSNick Terrell #define ZSTD_c_stableOutBuffer ZSTD_c_experimentalParam10
2154cf30f6a5SNick Terrell 
2155e0c1b49fSNick Terrell /* ZSTD_c_blockDelimiters
2156e0c1b49fSNick Terrell  * Default is 0 == ZSTD_sf_noBlockDelimiters.
2157cf30f6a5SNick Terrell  *
2158e0c1b49fSNick Terrell  * For use with sequence compression API: ZSTD_compressSequences().
2159e0c1b49fSNick Terrell  *
2160e0c1b49fSNick Terrell  * Designates whether or not the given array of ZSTD_Sequence contains block delimiters
2161e0c1b49fSNick Terrell  * and last literals, which are defined as sequences with offset == 0 and matchLength == 0.
2162e0c1b49fSNick Terrell  * See the definition of ZSTD_Sequence for more specifics.
2163cf30f6a5SNick Terrell  */
2164e0c1b49fSNick Terrell #define ZSTD_c_blockDelimiters ZSTD_c_experimentalParam11
2165cf30f6a5SNick Terrell 
2166e0c1b49fSNick Terrell /* ZSTD_c_validateSequences
2167e0c1b49fSNick Terrell  * Default is 0 == disabled. Set to 1 to enable sequence validation.
2168e0c1b49fSNick Terrell  *
2169*65d1f550SNick Terrell  * For use with sequence compression API: ZSTD_compressSequences*().
2170*65d1f550SNick Terrell  * Designates whether or not provided sequences are validated within ZSTD_compressSequences*()
2171e0c1b49fSNick Terrell  * during function execution.
2172e0c1b49fSNick Terrell  *
2173*65d1f550SNick Terrell  * When Sequence validation is disabled (default), Sequences are compressed as-is,
2174*65d1f550SNick Terrell  * so they must correct, otherwise it would result in a corruption error.
2175e0c1b49fSNick Terrell  *
2176*65d1f550SNick Terrell  * Sequence validation adds some protection, by ensuring that all values respect boundary conditions.
2177*65d1f550SNick Terrell  * If a Sequence is detected invalid (see doc/zstd_compression_format.md for
2178e0c1b49fSNick Terrell  * specifics regarding offset/matchlength requirements) then the function will bail out and
2179e0c1b49fSNick Terrell  * return an error.
2180cf30f6a5SNick Terrell  */
2181e0c1b49fSNick Terrell #define ZSTD_c_validateSequences ZSTD_c_experimentalParam12
2182cf30f6a5SNick Terrell 
2183*65d1f550SNick Terrell /* ZSTD_c_blockSplitterLevel
2184*65d1f550SNick Terrell  * note: this parameter only influences the first splitter stage,
2185*65d1f550SNick Terrell  *       which is active before producing the sequences.
2186*65d1f550SNick Terrell  *       ZSTD_c_splitAfterSequences controls the next splitter stage,
2187*65d1f550SNick Terrell  *       which is active after sequence production.
2188*65d1f550SNick Terrell  *       Note that both can be combined.
2189*65d1f550SNick Terrell  * Allowed values are between 0 and ZSTD_BLOCKSPLITTER_LEVEL_MAX included.
2190*65d1f550SNick Terrell  * 0 means "auto", which will select a value depending on current ZSTD_c_strategy.
2191*65d1f550SNick Terrell  * 1 means no splitting.
2192*65d1f550SNick Terrell  * Then, values from 2 to 6 are sorted in increasing cpu load order.
2193*65d1f550SNick Terrell  *
2194*65d1f550SNick Terrell  * Note that currently the first block is never split,
2195*65d1f550SNick Terrell  * to ensure expansion guarantees in presence of incompressible data.
2196*65d1f550SNick Terrell  */
2197*65d1f550SNick Terrell #define ZSTD_BLOCKSPLITTER_LEVEL_MAX 6
2198*65d1f550SNick Terrell #define ZSTD_c_blockSplitterLevel ZSTD_c_experimentalParam20
2199*65d1f550SNick Terrell 
2200*65d1f550SNick Terrell /* ZSTD_c_splitAfterSequences
2201*65d1f550SNick Terrell  * This is a stronger splitter algorithm,
2202*65d1f550SNick Terrell  * based on actual sequences previously produced by the selected parser.
2203*65d1f550SNick Terrell  * It's also slower, and as a consequence, mostly used for high compression levels.
2204*65d1f550SNick Terrell  * While the post-splitter does overlap with the pre-splitter,
2205*65d1f550SNick Terrell  * both can nonetheless be combined,
2206*65d1f550SNick Terrell  * notably with ZSTD_c_blockSplitterLevel at ZSTD_BLOCKSPLITTER_LEVEL_MAX,
2207*65d1f550SNick Terrell  * resulting in higher compression ratio than just one of them.
2208*65d1f550SNick Terrell  *
22092aa14b1aSNick Terrell  * Default is ZSTD_ps_auto.
22102aa14b1aSNick Terrell  * Set to ZSTD_ps_disable to never use block splitter.
22112aa14b1aSNick Terrell  * Set to ZSTD_ps_enable to always use block splitter.
22122aa14b1aSNick Terrell  *
22132aa14b1aSNick Terrell  * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use
22142aa14b1aSNick Terrell  * block splitting based on the compression parameters.
22152aa14b1aSNick Terrell  */
2216*65d1f550SNick Terrell #define ZSTD_c_splitAfterSequences ZSTD_c_experimentalParam13
22172aa14b1aSNick Terrell 
22182aa14b1aSNick Terrell /* ZSTD_c_useRowMatchFinder
2219*65d1f550SNick Terrell  * Controlled with ZSTD_ParamSwitch_e enum.
22202aa14b1aSNick Terrell  * Default is ZSTD_ps_auto.
22212aa14b1aSNick Terrell  * Set to ZSTD_ps_disable to never use row-based matchfinder.
22222aa14b1aSNick Terrell  * Set to ZSTD_ps_enable to force usage of row-based matchfinder.
22232aa14b1aSNick Terrell  *
22242aa14b1aSNick Terrell  * By default, in ZSTD_ps_auto, the library will decide at runtime whether to use
22252aa14b1aSNick Terrell  * the row-based matchfinder based on support for SIMD instructions and the window log.
22262aa14b1aSNick Terrell  * Note that this only pertains to compression strategies: greedy, lazy, and lazy2
22272aa14b1aSNick Terrell  */
22282aa14b1aSNick Terrell #define ZSTD_c_useRowMatchFinder ZSTD_c_experimentalParam14
22292aa14b1aSNick Terrell 
22302aa14b1aSNick Terrell /* ZSTD_c_deterministicRefPrefix
22312aa14b1aSNick Terrell  * Default is 0 == disabled. Set to 1 to enable.
22322aa14b1aSNick Terrell  *
22332aa14b1aSNick Terrell  * Zstd produces different results for prefix compression when the prefix is
22342aa14b1aSNick Terrell  * directly adjacent to the data about to be compressed vs. when it isn't.
22352aa14b1aSNick Terrell  * This is because zstd detects that the two buffers are contiguous and it can
22362aa14b1aSNick Terrell  * use a more efficient match finding algorithm. However, this produces different
22372aa14b1aSNick Terrell  * results than when the two buffers are non-contiguous. This flag forces zstd
22382aa14b1aSNick Terrell  * to always load the prefix in non-contiguous mode, even if it happens to be
22392aa14b1aSNick Terrell  * adjacent to the data, to guarantee determinism.
22402aa14b1aSNick Terrell  *
22412aa14b1aSNick Terrell  * If you really care about determinism when using a dictionary or prefix,
22422aa14b1aSNick Terrell  * like when doing delta compression, you should select this option. It comes
22432aa14b1aSNick Terrell  * at a speed penalty of about ~2.5% if the dictionary and data happened to be
22442aa14b1aSNick Terrell  * contiguous, and is free if they weren't contiguous. We don't expect that
22452aa14b1aSNick Terrell  * intentionally making the dictionary and data contiguous will be worth the
22462aa14b1aSNick Terrell  * cost to memcpy() the data.
22472aa14b1aSNick Terrell  */
22482aa14b1aSNick Terrell #define ZSTD_c_deterministicRefPrefix ZSTD_c_experimentalParam15
22492aa14b1aSNick Terrell 
2250*65d1f550SNick Terrell /* ZSTD_c_prefetchCDictTables
2251*65d1f550SNick Terrell  * Controlled with ZSTD_ParamSwitch_e enum. Default is ZSTD_ps_auto.
2252*65d1f550SNick Terrell  *
2253*65d1f550SNick Terrell  * In some situations, zstd uses CDict tables in-place rather than copying them
2254*65d1f550SNick Terrell  * into the working context. (See docs on ZSTD_dictAttachPref_e above for details).
2255*65d1f550SNick Terrell  * In such situations, compression speed is seriously impacted when CDict tables are
2256*65d1f550SNick Terrell  * "cold" (outside CPU cache). This parameter instructs zstd to prefetch CDict tables
2257*65d1f550SNick Terrell  * when they are used in-place.
2258*65d1f550SNick Terrell  *
2259*65d1f550SNick Terrell  * For sufficiently small inputs, the cost of the prefetch will outweigh the benefit.
2260*65d1f550SNick Terrell  * For sufficiently large inputs, zstd will by default memcpy() CDict tables
2261*65d1f550SNick Terrell  * into the working context, so there is no need to prefetch. This parameter is
2262*65d1f550SNick Terrell  * targeted at a middle range of input sizes, where a prefetch is cheap enough to be
2263*65d1f550SNick Terrell  * useful but memcpy() is too expensive. The exact range of input sizes where this
2264*65d1f550SNick Terrell  * makes sense is best determined by careful experimentation.
2265*65d1f550SNick Terrell  *
2266*65d1f550SNick Terrell  * Note: for this parameter, ZSTD_ps_auto is currently equivalent to ZSTD_ps_disable,
2267*65d1f550SNick Terrell  * but in the future zstd may conditionally enable this feature via an auto-detection
2268*65d1f550SNick Terrell  * heuristic for cold CDicts.
2269*65d1f550SNick Terrell  * Use ZSTD_ps_disable to opt out of prefetching under any circumstances.
2270*65d1f550SNick Terrell  */
2271*65d1f550SNick Terrell #define ZSTD_c_prefetchCDictTables ZSTD_c_experimentalParam16
2272*65d1f550SNick Terrell 
2273*65d1f550SNick Terrell /* ZSTD_c_enableSeqProducerFallback
2274*65d1f550SNick Terrell  * Allowed values are 0 (disable) and 1 (enable). The default setting is 0.
2275*65d1f550SNick Terrell  *
2276*65d1f550SNick Terrell  * Controls whether zstd will fall back to an internal sequence producer if an
2277*65d1f550SNick Terrell  * external sequence producer is registered and returns an error code. This fallback
2278*65d1f550SNick Terrell  * is block-by-block: the internal sequence producer will only be called for blocks
2279*65d1f550SNick Terrell  * where the external sequence producer returns an error code. Fallback parsing will
2280*65d1f550SNick Terrell  * follow any other cParam settings, such as compression level, the same as in a
2281*65d1f550SNick Terrell  * normal (fully-internal) compression operation.
2282*65d1f550SNick Terrell  *
2283*65d1f550SNick Terrell  * The user is strongly encouraged to read the full Block-Level Sequence Producer API
2284*65d1f550SNick Terrell  * documentation (below) before setting this parameter. */
2285*65d1f550SNick Terrell #define ZSTD_c_enableSeqProducerFallback ZSTD_c_experimentalParam17
2286*65d1f550SNick Terrell 
2287*65d1f550SNick Terrell /* ZSTD_c_maxBlockSize
2288*65d1f550SNick Terrell  * Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB).
2289*65d1f550SNick Terrell  * The default is ZSTD_BLOCKSIZE_MAX, and setting to 0 will set to the default.
2290*65d1f550SNick Terrell  *
2291*65d1f550SNick Terrell  * This parameter can be used to set an upper bound on the blocksize
2292*65d1f550SNick Terrell  * that overrides the default ZSTD_BLOCKSIZE_MAX. It cannot be used to set upper
2293*65d1f550SNick Terrell  * bounds greater than ZSTD_BLOCKSIZE_MAX or bounds lower than 1KB (will make
2294*65d1f550SNick Terrell  * compressBound() inaccurate). Only currently meant to be used for testing.
2295*65d1f550SNick Terrell  */
2296*65d1f550SNick Terrell #define ZSTD_c_maxBlockSize ZSTD_c_experimentalParam18
2297*65d1f550SNick Terrell 
2298*65d1f550SNick Terrell /* ZSTD_c_repcodeResolution
2299*65d1f550SNick Terrell  * This parameter only has an effect if ZSTD_c_blockDelimiters is
2300*65d1f550SNick Terrell  * set to ZSTD_sf_explicitBlockDelimiters (may change in the future).
2301*65d1f550SNick Terrell  *
2302*65d1f550SNick Terrell  * This parameter affects how zstd parses external sequences,
2303*65d1f550SNick Terrell  * provided via the ZSTD_compressSequences*() API
2304*65d1f550SNick Terrell  * or from an external block-level sequence producer.
2305*65d1f550SNick Terrell  *
2306*65d1f550SNick Terrell  * If set to ZSTD_ps_enable, the library will check for repeated offsets within
2307*65d1f550SNick Terrell  * external sequences, even if those repcodes are not explicitly indicated in
2308*65d1f550SNick Terrell  * the "rep" field. Note that this is the only way to exploit repcode matches
2309*65d1f550SNick Terrell  * while using compressSequences*() or an external sequence producer, since zstd
2310*65d1f550SNick Terrell  * currently ignores the "rep" field of external sequences.
2311*65d1f550SNick Terrell  *
2312*65d1f550SNick Terrell  * If set to ZSTD_ps_disable, the library will not exploit repeated offsets in
2313*65d1f550SNick Terrell  * external sequences, regardless of whether the "rep" field has been set. This
2314*65d1f550SNick Terrell  * reduces sequence compression overhead by about 25% while sacrificing some
2315*65d1f550SNick Terrell  * compression ratio.
2316*65d1f550SNick Terrell  *
2317*65d1f550SNick Terrell  * The default value is ZSTD_ps_auto, for which the library will enable/disable
2318*65d1f550SNick Terrell  * based on compression level (currently: level<10 disables, level>=10 enables).
2319*65d1f550SNick Terrell  */
2320*65d1f550SNick Terrell #define ZSTD_c_repcodeResolution ZSTD_c_experimentalParam19
2321*65d1f550SNick Terrell #define ZSTD_c_searchForExternalRepcodes ZSTD_c_experimentalParam19 /* older name */
2322*65d1f550SNick Terrell 
2323*65d1f550SNick Terrell 
2324e0c1b49fSNick Terrell /*! ZSTD_CCtx_getParameter() :
2325e0c1b49fSNick Terrell  *  Get the requested compression parameter value, selected by enum ZSTD_cParameter,
2326e0c1b49fSNick Terrell  *  and store it into int* value.
2327e0c1b49fSNick Terrell  * @return : 0, or an error code (which can be tested with ZSTD_isError()).
2328cf30f6a5SNick Terrell  */
23292aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter param, int* value);
2330cf30f6a5SNick Terrell 
2331e0c1b49fSNick Terrell 
2332e0c1b49fSNick Terrell /*! ZSTD_CCtx_params :
2333e0c1b49fSNick Terrell  *  Quick howto :
2334e0c1b49fSNick Terrell  *  - ZSTD_createCCtxParams() : Create a ZSTD_CCtx_params structure
2335e0c1b49fSNick Terrell  *  - ZSTD_CCtxParams_setParameter() : Push parameters one by one into
2336e0c1b49fSNick Terrell  *                                     an existing ZSTD_CCtx_params structure.
2337e0c1b49fSNick Terrell  *                                     This is similar to
2338e0c1b49fSNick Terrell  *                                     ZSTD_CCtx_setParameter().
2339e0c1b49fSNick Terrell  *  - ZSTD_CCtx_setParametersUsingCCtxParams() : Apply parameters to
2340e0c1b49fSNick Terrell  *                                    an existing CCtx.
2341e0c1b49fSNick Terrell  *                                    These parameters will be applied to
2342e0c1b49fSNick Terrell  *                                    all subsequent frames.
2343e0c1b49fSNick Terrell  *  - ZSTD_compressStream2() : Do compression using the CCtx.
2344e0c1b49fSNick Terrell  *  - ZSTD_freeCCtxParams() : Free the memory, accept NULL pointer.
2345cf30f6a5SNick Terrell  *
2346e0c1b49fSNick Terrell  *  This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams()
2347e0c1b49fSNick Terrell  *  for static allocation of CCtx for single-threaded compression.
2348cf30f6a5SNick Terrell  */
23492aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void);
23502aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);  /* accept NULL pointer */
2351cf30f6a5SNick Terrell 
2352e0c1b49fSNick Terrell /*! ZSTD_CCtxParams_reset() :
2353e0c1b49fSNick Terrell  *  Reset params to default values.
2354cf30f6a5SNick Terrell  */
23552aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_reset(ZSTD_CCtx_params* params);
2356cf30f6a5SNick Terrell 
2357e0c1b49fSNick Terrell /*! ZSTD_CCtxParams_init() :
2358e0c1b49fSNick Terrell  *  Initializes the compression parameters of cctxParams according to
2359e0c1b49fSNick Terrell  *  compression level. All other parameters are reset to their default values.
2360cf30f6a5SNick Terrell  */
23612aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compressionLevel);
2362cf30f6a5SNick Terrell 
2363e0c1b49fSNick Terrell /*! ZSTD_CCtxParams_init_advanced() :
2364e0c1b49fSNick Terrell  *  Initializes the compression and frame parameters of cctxParams according to
2365e0c1b49fSNick Terrell  *  params. All other parameters are reset to their default values.
2366cf30f6a5SNick Terrell  */
23672aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params);
2368cf30f6a5SNick Terrell 
23692aa14b1aSNick Terrell /*! ZSTD_CCtxParams_setParameter() : Requires v1.4.0+
2370e0c1b49fSNick Terrell  *  Similar to ZSTD_CCtx_setParameter.
2371e0c1b49fSNick Terrell  *  Set one compression parameter, selected by enum ZSTD_cParameter.
2372e0c1b49fSNick Terrell  *  Parameters must be applied to a ZSTD_CCtx using
2373e0c1b49fSNick Terrell  *  ZSTD_CCtx_setParametersUsingCCtxParams().
2374e0c1b49fSNick Terrell  * @result : a code representing success or failure (which can be tested with
2375e0c1b49fSNick Terrell  *           ZSTD_isError()).
2376cf30f6a5SNick Terrell  */
23772aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_setParameter(ZSTD_CCtx_params* params, ZSTD_cParameter param, int value);
2378cf30f6a5SNick Terrell 
2379e0c1b49fSNick Terrell /*! ZSTD_CCtxParams_getParameter() :
2380e0c1b49fSNick Terrell  * Similar to ZSTD_CCtx_getParameter.
2381e0c1b49fSNick Terrell  * Get the requested value of one compression parameter, selected by enum ZSTD_cParameter.
2382e0c1b49fSNick Terrell  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
2383cf30f6a5SNick Terrell  */
23842aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtxParams_getParameter(const ZSTD_CCtx_params* params, ZSTD_cParameter param, int* value);
2385cf30f6a5SNick Terrell 
2386e0c1b49fSNick Terrell /*! ZSTD_CCtx_setParametersUsingCCtxParams() :
2387e0c1b49fSNick Terrell  *  Apply a set of ZSTD_CCtx_params to the compression context.
2388e0c1b49fSNick Terrell  *  This can be done even after compression is started,
2389e0c1b49fSNick Terrell  *    if nbWorkers==0, this will have no impact until a new compression is started.
2390e0c1b49fSNick Terrell  *    if nbWorkers>=1, new parameters will be picked up at next job,
2391e0c1b49fSNick Terrell  *       with a few restrictions (windowLog, pledgedSrcSize, nbWorkers, jobSize, and overlapLog are not updated).
2392cf30f6a5SNick Terrell  */
23932aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_CCtx_setParametersUsingCCtxParams(
2394e0c1b49fSNick Terrell         ZSTD_CCtx* cctx, const ZSTD_CCtx_params* params);
2395cf30f6a5SNick Terrell 
2396e0c1b49fSNick Terrell /*! ZSTD_compressStream2_simpleArgs() :
2397e0c1b49fSNick Terrell  *  Same as ZSTD_compressStream2(),
2398e0c1b49fSNick Terrell  *  but using only integral types as arguments.
2399e0c1b49fSNick Terrell  *  This variant might be helpful for binders from dynamic languages
2400e0c1b49fSNick Terrell  *  which have troubles handling structures containing memory pointers.
2401cf30f6a5SNick Terrell  */
24022aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_compressStream2_simpleArgs (
2403e0c1b49fSNick Terrell                             ZSTD_CCtx* cctx,
2404e0c1b49fSNick Terrell                             void* dst, size_t dstCapacity, size_t* dstPos,
2405e0c1b49fSNick Terrell                       const void* src, size_t srcSize, size_t* srcPos,
2406e0c1b49fSNick Terrell                             ZSTD_EndDirective endOp);
2407e0c1b49fSNick Terrell 
2408e0c1b49fSNick Terrell 
2409e0c1b49fSNick Terrell /* *************************************
2410e0c1b49fSNick Terrell *  Advanced decompression functions
2411e0c1b49fSNick Terrell ***************************************/
2412e0c1b49fSNick Terrell 
2413e0c1b49fSNick Terrell /*! ZSTD_isFrame() :
2414e0c1b49fSNick Terrell  *  Tells if the content of `buffer` starts with a valid Frame Identifier.
2415e0c1b49fSNick Terrell  *  Note : Frame Identifier is 4 bytes. If `size < 4`, @return will always be 0.
2416e0c1b49fSNick Terrell  *  Note 2 : Legacy Frame Identifiers are considered valid only if Legacy Support is enabled.
2417e0c1b49fSNick Terrell  *  Note 3 : Skippable Frame Identifiers are considered valid. */
24182aa14b1aSNick Terrell ZSTDLIB_STATIC_API unsigned ZSTD_isFrame(const void* buffer, size_t size);
2419e0c1b49fSNick Terrell 
2420e0c1b49fSNick Terrell /*! ZSTD_createDDict_byReference() :
2421e0c1b49fSNick Terrell  *  Create a digested dictionary, ready to start decompression operation without startup delay.
2422e0c1b49fSNick Terrell  *  Dictionary content is referenced, and therefore stays in dictBuffer.
2423e0c1b49fSNick Terrell  *  It is important that dictBuffer outlives DDict,
2424e0c1b49fSNick Terrell  *  it must remain read accessible throughout the lifetime of DDict */
24252aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_DDict* ZSTD_createDDict_byReference(const void* dictBuffer, size_t dictSize);
2426e0c1b49fSNick Terrell 
2427e0c1b49fSNick Terrell /*! ZSTD_DCtx_loadDictionary_byReference() :
2428e0c1b49fSNick Terrell  *  Same as ZSTD_DCtx_loadDictionary(),
2429e0c1b49fSNick Terrell  *  but references `dict` content instead of copying it into `dctx`.
2430e0c1b49fSNick Terrell  *  This saves memory if `dict` remains around.,
2431e0c1b49fSNick Terrell  *  However, it's imperative that `dict` remains accessible (and unmodified) while being used, so it must outlive decompression. */
24322aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_byReference(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
2433e0c1b49fSNick Terrell 
2434e0c1b49fSNick Terrell /*! ZSTD_DCtx_loadDictionary_advanced() :
2435e0c1b49fSNick Terrell  *  Same as ZSTD_DCtx_loadDictionary(),
2436e0c1b49fSNick Terrell  *  but gives direct control over
2437e0c1b49fSNick Terrell  *  how to load the dictionary (by copy ? by reference ?)
2438e0c1b49fSNick Terrell  *  and how to interpret it (automatic ? force raw mode ? full mode only ?). */
24392aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_DCtx_loadDictionary_advanced(ZSTD_DCtx* dctx, const void* dict, size_t dictSize, ZSTD_dictLoadMethod_e dictLoadMethod, ZSTD_dictContentType_e dictContentType);
2440e0c1b49fSNick Terrell 
2441e0c1b49fSNick Terrell /*! ZSTD_DCtx_refPrefix_advanced() :
2442e0c1b49fSNick Terrell  *  Same as ZSTD_DCtx_refPrefix(), but gives finer control over
2443e0c1b49fSNick Terrell  *  how to interpret prefix content (automatic ? force raw mode (default) ? full mode only ?) */
24442aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_DCtx_refPrefix_advanced(ZSTD_DCtx* dctx, const void* prefix, size_t prefixSize, ZSTD_dictContentType_e dictContentType);
2445e0c1b49fSNick Terrell 
2446e0c1b49fSNick Terrell /*! ZSTD_DCtx_setMaxWindowSize() :
2447e0c1b49fSNick Terrell  *  Refuses allocating internal buffers for frames requiring a window size larger than provided limit.
2448e0c1b49fSNick Terrell  *  This protects a decoder context from reserving too much memory for itself (potential attack scenario).
2449e0c1b49fSNick Terrell  *  This parameter is only useful in streaming mode, since no internal buffer is allocated in single-pass mode.
2450e0c1b49fSNick Terrell  *  By default, a decompression context accepts all window sizes <= (1 << ZSTD_WINDOWLOG_LIMIT_DEFAULT)
2451e0c1b49fSNick Terrell  * @return : 0, or an error code (which can be tested using ZSTD_isError()).
2452cf30f6a5SNick Terrell  */
24532aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_DCtx_setMaxWindowSize(ZSTD_DCtx* dctx, size_t maxWindowSize);
2454e0c1b49fSNick Terrell 
2455e0c1b49fSNick Terrell /*! ZSTD_DCtx_getParameter() :
2456e0c1b49fSNick Terrell  *  Get the requested decompression parameter value, selected by enum ZSTD_dParameter,
2457e0c1b49fSNick Terrell  *  and store it into int* value.
2458e0c1b49fSNick Terrell  * @return : 0, or an error code (which can be tested with ZSTD_isError()).
2459cf30f6a5SNick Terrell  */
24602aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param, int* value);
2461e0c1b49fSNick Terrell 
2462e0c1b49fSNick Terrell /* ZSTD_d_format
2463e0c1b49fSNick Terrell  * experimental parameter,
2464e0c1b49fSNick Terrell  * allowing selection between ZSTD_format_e input compression formats
2465cf30f6a5SNick Terrell  */
2466e0c1b49fSNick Terrell #define ZSTD_d_format ZSTD_d_experimentalParam1
2467e0c1b49fSNick Terrell /* ZSTD_d_stableOutBuffer
2468e0c1b49fSNick Terrell  * Experimental parameter.
2469e0c1b49fSNick Terrell  * Default is 0 == disabled. Set to 1 to enable.
2470cf30f6a5SNick Terrell  *
2471e0c1b49fSNick Terrell  * Tells the decompressor that the ZSTD_outBuffer will ALWAYS be the same
2472e0c1b49fSNick Terrell  * between calls, except for the modifications that zstd makes to pos (the
2473e0c1b49fSNick Terrell  * caller must not modify pos). This is checked by the decompressor, and
2474e0c1b49fSNick Terrell  * decompression will fail if it ever changes. Therefore the ZSTD_outBuffer
2475e0c1b49fSNick Terrell  * MUST be large enough to fit the entire decompressed frame. This will be
2476e0c1b49fSNick Terrell  * checked when the frame content size is known. The data in the ZSTD_outBuffer
2477e0c1b49fSNick Terrell  * in the range [dst, dst + pos) MUST not be modified during decompression
2478e0c1b49fSNick Terrell  * or you will get data corruption.
2479e0c1b49fSNick Terrell  *
2480*65d1f550SNick Terrell  * When this flag is enabled zstd won't allocate an output buffer, because
2481e0c1b49fSNick Terrell  * it can write directly to the ZSTD_outBuffer, but it will still allocate
2482e0c1b49fSNick Terrell  * an input buffer large enough to fit any compressed block. This will also
2483e0c1b49fSNick Terrell  * avoid the memcpy() from the internal output buffer to the ZSTD_outBuffer.
2484e0c1b49fSNick Terrell  * If you need to avoid the input buffer allocation use the buffer-less
2485e0c1b49fSNick Terrell  * streaming API.
2486e0c1b49fSNick Terrell  *
2487e0c1b49fSNick Terrell  * NOTE: So long as the ZSTD_outBuffer always points to valid memory, using
2488e0c1b49fSNick Terrell  * this flag is ALWAYS memory safe, and will never access out-of-bounds
2489e0c1b49fSNick Terrell  * memory. However, decompression WILL fail if you violate the preconditions.
2490e0c1b49fSNick Terrell  *
2491e0c1b49fSNick Terrell  * WARNING: The data in the ZSTD_outBuffer in the range [dst, dst + pos) MUST
2492e0c1b49fSNick Terrell  * not be modified during decompression or you will get data corruption. This
2493e0c1b49fSNick Terrell  * is because zstd needs to reference data in the ZSTD_outBuffer to regenerate
2494e0c1b49fSNick Terrell  * matches. Normally zstd maintains its own buffer for this purpose, but passing
2495e0c1b49fSNick Terrell  * this flag tells zstd to use the user provided buffer.
2496cf30f6a5SNick Terrell  */
2497e0c1b49fSNick Terrell #define ZSTD_d_stableOutBuffer ZSTD_d_experimentalParam2
2498e0c1b49fSNick Terrell 
2499e0c1b49fSNick Terrell /* ZSTD_d_forceIgnoreChecksum
2500e0c1b49fSNick Terrell  * Experimental parameter.
2501e0c1b49fSNick Terrell  * Default is 0 == disabled. Set to 1 to enable
2502cf30f6a5SNick Terrell  *
2503e0c1b49fSNick Terrell  * Tells the decompressor to skip checksum validation during decompression, regardless
2504e0c1b49fSNick Terrell  * of whether checksumming was specified during compression. This offers some
2505e0c1b49fSNick Terrell  * slight performance benefits, and may be useful for debugging.
2506e0c1b49fSNick Terrell  * Param has values of type ZSTD_forceIgnoreChecksum_e
2507cf30f6a5SNick Terrell  */
2508e0c1b49fSNick Terrell #define ZSTD_d_forceIgnoreChecksum ZSTD_d_experimentalParam3
2509cf30f6a5SNick Terrell 
2510e0c1b49fSNick Terrell /* ZSTD_d_refMultipleDDicts
2511e0c1b49fSNick Terrell  * Experimental parameter.
2512e0c1b49fSNick Terrell  * Default is 0 == disabled. Set to 1 to enable
2513cf30f6a5SNick Terrell  *
2514e0c1b49fSNick Terrell  * If enabled and dctx is allocated on the heap, then additional memory will be allocated
2515e0c1b49fSNick Terrell  * to store references to multiple ZSTD_DDict. That is, multiple calls of ZSTD_refDDict()
2516e0c1b49fSNick Terrell  * using a given ZSTD_DCtx, rather than overwriting the previous DDict reference, will instead
2517e0c1b49fSNick Terrell  * store all references. At decompression time, the appropriate dictID is selected
2518e0c1b49fSNick Terrell  * from the set of DDicts based on the dictID in the frame.
2519cf30f6a5SNick Terrell  *
2520e0c1b49fSNick Terrell  * Usage is simply calling ZSTD_refDDict() on multiple dict buffers.
2521cf30f6a5SNick Terrell  *
2522e0c1b49fSNick Terrell  * Param has values of byte ZSTD_refMultipleDDicts_e
2523e0c1b49fSNick Terrell  *
2524e0c1b49fSNick Terrell  * WARNING: Enabling this parameter and calling ZSTD_DCtx_refDDict(), will trigger memory
2525e0c1b49fSNick Terrell  * allocation for the hash table. ZSTD_freeDCtx() also frees this memory.
2526e0c1b49fSNick Terrell  * Memory is allocated as per ZSTD_DCtx::customMem.
2527e0c1b49fSNick Terrell  *
2528e0c1b49fSNick Terrell  * Although this function allocates memory for the table, the user is still responsible for
2529e0c1b49fSNick Terrell  * memory management of the underlying ZSTD_DDict* themselves.
2530cf30f6a5SNick Terrell  */
2531e0c1b49fSNick Terrell #define ZSTD_d_refMultipleDDicts ZSTD_d_experimentalParam4
2532cf30f6a5SNick Terrell 
2533*65d1f550SNick Terrell /* ZSTD_d_disableHuffmanAssembly
2534*65d1f550SNick Terrell  * Set to 1 to disable the Huffman assembly implementation.
2535*65d1f550SNick Terrell  * The default value is 0, which allows zstd to use the Huffman assembly
2536*65d1f550SNick Terrell  * implementation if available.
2537*65d1f550SNick Terrell  *
2538*65d1f550SNick Terrell  * This parameter can be used to disable Huffman assembly at runtime.
2539*65d1f550SNick Terrell  * If you want to disable it at compile time you can define the macro
2540*65d1f550SNick Terrell  * ZSTD_DISABLE_ASM.
2541*65d1f550SNick Terrell  */
2542*65d1f550SNick Terrell #define ZSTD_d_disableHuffmanAssembly ZSTD_d_experimentalParam5
2543*65d1f550SNick Terrell 
2544*65d1f550SNick Terrell /* ZSTD_d_maxBlockSize
2545*65d1f550SNick Terrell  * Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB).
2546*65d1f550SNick Terrell  * The default is ZSTD_BLOCKSIZE_MAX, and setting to 0 will set to the default.
2547*65d1f550SNick Terrell  *
2548*65d1f550SNick Terrell  * Forces the decompressor to reject blocks whose content size is
2549*65d1f550SNick Terrell  * larger than the configured maxBlockSize. When maxBlockSize is
2550*65d1f550SNick Terrell  * larger than the windowSize, the windowSize is used instead.
2551*65d1f550SNick Terrell  * This saves memory on the decoder when you know all blocks are small.
2552*65d1f550SNick Terrell  *
2553*65d1f550SNick Terrell  * This option is typically used in conjunction with ZSTD_c_maxBlockSize.
2554*65d1f550SNick Terrell  *
2555*65d1f550SNick Terrell  * WARNING: This causes the decoder to reject otherwise valid frames
2556*65d1f550SNick Terrell  * that have block sizes larger than the configured maxBlockSize.
2557*65d1f550SNick Terrell  */
2558*65d1f550SNick Terrell #define ZSTD_d_maxBlockSize ZSTD_d_experimentalParam6
2559*65d1f550SNick Terrell 
2560e0c1b49fSNick Terrell 
2561e0c1b49fSNick Terrell /*! ZSTD_DCtx_setFormat() :
25622aa14b1aSNick Terrell  *  This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter().
2563e0c1b49fSNick Terrell  *  Instruct the decoder context about what kind of data to decode next.
2564e0c1b49fSNick Terrell  *  This instruction is mandatory to decode data without a fully-formed header,
2565e0c1b49fSNick Terrell  *  such ZSTD_f_zstd1_magicless for example.
2566e0c1b49fSNick Terrell  * @return : 0, or an error code (which can be tested using ZSTD_isError()). */
25672aa14b1aSNick Terrell ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead")
2568*65d1f550SNick Terrell ZSTDLIB_STATIC_API
25692aa14b1aSNick Terrell size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);
2570e0c1b49fSNick Terrell 
2571e0c1b49fSNick Terrell /*! ZSTD_decompressStream_simpleArgs() :
2572e0c1b49fSNick Terrell  *  Same as ZSTD_decompressStream(),
2573e0c1b49fSNick Terrell  *  but using only integral types as arguments.
2574e0c1b49fSNick Terrell  *  This can be helpful for binders from dynamic languages
2575e0c1b49fSNick Terrell  *  which have troubles handling structures containing memory pointers.
2576cf30f6a5SNick Terrell  */
25772aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_decompressStream_simpleArgs (
2578e0c1b49fSNick Terrell                             ZSTD_DCtx* dctx,
2579e0c1b49fSNick Terrell                             void* dst, size_t dstCapacity, size_t* dstPos,
2580e0c1b49fSNick Terrell                       const void* src, size_t srcSize, size_t* srcPos);
2581e0c1b49fSNick Terrell 
2582e0c1b49fSNick Terrell 
2583e0c1b49fSNick Terrell /* ******************************************************************
2584e0c1b49fSNick Terrell *  Advanced streaming functions
2585e0c1b49fSNick Terrell *  Warning : most of these functions are now redundant with the Advanced API.
2586e0c1b49fSNick Terrell *  Once Advanced API reaches "stable" status,
2587e0c1b49fSNick Terrell *  redundant functions will be deprecated, and then at some point removed.
2588e0c1b49fSNick Terrell ********************************************************************/
2589e0c1b49fSNick Terrell 
2590e0c1b49fSNick Terrell /*=====   Advanced Streaming compression functions  =====*/
2591e0c1b49fSNick Terrell 
2592e0c1b49fSNick Terrell /*! ZSTD_initCStream_srcSize() :
25932aa14b1aSNick Terrell  * This function is DEPRECATED, and equivalent to:
2594e0c1b49fSNick Terrell  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2595e0c1b49fSNick Terrell  *     ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)
2596e0c1b49fSNick Terrell  *     ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);
2597e0c1b49fSNick Terrell  *     ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);
2598cf30f6a5SNick Terrell  *
2599e0c1b49fSNick Terrell  * pledgedSrcSize must be correct. If it is not known at init time, use
2600e0c1b49fSNick Terrell  * ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs,
2601e0c1b49fSNick Terrell  * "0" also disables frame content size field. It may be enabled in the future.
26022aa14b1aSNick Terrell  * This prototype will generate compilation warnings.
2603cf30f6a5SNick Terrell  */
26042aa14b1aSNick Terrell ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
2605*65d1f550SNick Terrell ZSTDLIB_STATIC_API
26062aa14b1aSNick Terrell size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
2607e0c1b49fSNick Terrell                          int compressionLevel,
2608e0c1b49fSNick Terrell                          unsigned long long pledgedSrcSize);
2609e0c1b49fSNick Terrell 
2610e0c1b49fSNick Terrell /*! ZSTD_initCStream_usingDict() :
26112aa14b1aSNick Terrell  * This function is DEPRECATED, and is equivalent to:
2612e0c1b49fSNick Terrell  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2613e0c1b49fSNick Terrell  *     ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);
2614e0c1b49fSNick Terrell  *     ZSTD_CCtx_loadDictionary(zcs, dict, dictSize);
2615cf30f6a5SNick Terrell  *
2616e0c1b49fSNick Terrell  * Creates of an internal CDict (incompatible with static CCtx), except if
2617e0c1b49fSNick Terrell  * dict == NULL or dictSize < 8, in which case no dict is used.
2618e0c1b49fSNick Terrell  * Note: dict is loaded with ZSTD_dct_auto (treated as a full zstd dictionary if
2619e0c1b49fSNick Terrell  * it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy.
26202aa14b1aSNick Terrell  * This prototype will generate compilation warnings.
2621cf30f6a5SNick Terrell  */
26222aa14b1aSNick Terrell ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
2623*65d1f550SNick Terrell ZSTDLIB_STATIC_API
26242aa14b1aSNick Terrell size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
2625e0c1b49fSNick Terrell                      const void* dict, size_t dictSize,
2626e0c1b49fSNick Terrell                            int compressionLevel);
2627cf30f6a5SNick Terrell 
2628e0c1b49fSNick Terrell /*! ZSTD_initCStream_advanced() :
2629*65d1f550SNick Terrell  * This function is DEPRECATED, and is equivalent to:
2630e0c1b49fSNick Terrell  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2631*65d1f550SNick Terrell  *     ZSTD_CCtx_setParams(zcs, params);
2632e0c1b49fSNick Terrell  *     ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);
2633e0c1b49fSNick Terrell  *     ZSTD_CCtx_loadDictionary(zcs, dict, dictSize);
2634cf30f6a5SNick Terrell  *
2635e0c1b49fSNick Terrell  * dict is loaded with ZSTD_dct_auto and ZSTD_dlm_byCopy.
2636e0c1b49fSNick Terrell  * pledgedSrcSize must be correct.
2637e0c1b49fSNick Terrell  * If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN.
26382aa14b1aSNick Terrell  * This prototype will generate compilation warnings.
2639cf30f6a5SNick Terrell  */
26402aa14b1aSNick Terrell ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
2641*65d1f550SNick Terrell ZSTDLIB_STATIC_API
26422aa14b1aSNick Terrell size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
2643e0c1b49fSNick Terrell                     const void* dict, size_t dictSize,
2644e0c1b49fSNick Terrell                           ZSTD_parameters params,
2645e0c1b49fSNick Terrell                           unsigned long long pledgedSrcSize);
2646e0c1b49fSNick Terrell 
2647e0c1b49fSNick Terrell /*! ZSTD_initCStream_usingCDict() :
26482aa14b1aSNick Terrell  * This function is DEPRECATED, and equivalent to:
2649e0c1b49fSNick Terrell  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2650e0c1b49fSNick Terrell  *     ZSTD_CCtx_refCDict(zcs, cdict);
2651cf30f6a5SNick Terrell  *
2652e0c1b49fSNick Terrell  * note : cdict will just be referenced, and must outlive compression session
26532aa14b1aSNick Terrell  * This prototype will generate compilation warnings.
2654cf30f6a5SNick Terrell  */
26552aa14b1aSNick Terrell ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
2656*65d1f550SNick Terrell ZSTDLIB_STATIC_API
26572aa14b1aSNick Terrell size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);
2658cf30f6a5SNick Terrell 
2659e0c1b49fSNick Terrell /*! ZSTD_initCStream_usingCDict_advanced() :
2660*65d1f550SNick Terrell  *   This function is DEPRECATED, and is equivalent to:
2661e0c1b49fSNick Terrell  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2662*65d1f550SNick Terrell  *     ZSTD_CCtx_setFParams(zcs, fParams);
2663e0c1b49fSNick Terrell  *     ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);
2664e0c1b49fSNick Terrell  *     ZSTD_CCtx_refCDict(zcs, cdict);
2665cf30f6a5SNick Terrell  *
2666e0c1b49fSNick Terrell  * same as ZSTD_initCStream_usingCDict(), with control over frame parameters.
2667e0c1b49fSNick Terrell  * pledgedSrcSize must be correct. If srcSize is not known at init time, use
2668e0c1b49fSNick Terrell  * value ZSTD_CONTENTSIZE_UNKNOWN.
26692aa14b1aSNick Terrell  * This prototype will generate compilation warnings.
2670cf30f6a5SNick Terrell  */
26712aa14b1aSNick Terrell ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
2672*65d1f550SNick Terrell ZSTDLIB_STATIC_API
26732aa14b1aSNick Terrell size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
2674e0c1b49fSNick Terrell                                const ZSTD_CDict* cdict,
2675e0c1b49fSNick Terrell                                      ZSTD_frameParameters fParams,
2676e0c1b49fSNick Terrell                                      unsigned long long pledgedSrcSize);
2677e0c1b49fSNick Terrell 
2678e0c1b49fSNick Terrell /*! ZSTD_resetCStream() :
26792aa14b1aSNick Terrell  * This function is DEPRECATED, and is equivalent to:
2680e0c1b49fSNick Terrell  *     ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2681e0c1b49fSNick Terrell  *     ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);
26822aa14b1aSNick Terrell  * Note: ZSTD_resetCStream() interprets pledgedSrcSize == 0 as ZSTD_CONTENTSIZE_UNKNOWN, but
26832aa14b1aSNick Terrell  *       ZSTD_CCtx_setPledgedSrcSize() does not do the same, so ZSTD_CONTENTSIZE_UNKNOWN must be
26842aa14b1aSNick Terrell  *       explicitly specified.
2685cf30f6a5SNick Terrell  *
2686e0c1b49fSNick Terrell  *  start a new frame, using same parameters from previous frame.
2687*65d1f550SNick Terrell  *  This is typically useful to skip dictionary loading stage, since it will reuse it in-place.
2688e0c1b49fSNick Terrell  *  Note that zcs must be init at least once before using ZSTD_resetCStream().
2689e0c1b49fSNick Terrell  *  If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN.
2690e0c1b49fSNick Terrell  *  If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end.
2691e0c1b49fSNick Terrell  *  For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs,
2692e0c1b49fSNick Terrell  *  but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead.
2693e0c1b49fSNick Terrell  * @return : 0, or an error code (which can be tested using ZSTD_isError())
26942aa14b1aSNick Terrell  *  This prototype will generate compilation warnings.
2695cf30f6a5SNick Terrell  */
26962aa14b1aSNick Terrell ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
2697*65d1f550SNick Terrell ZSTDLIB_STATIC_API
26982aa14b1aSNick Terrell size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
2699cf30f6a5SNick Terrell 
2700cf30f6a5SNick Terrell 
2701cf30f6a5SNick Terrell typedef struct {
2702e0c1b49fSNick Terrell     unsigned long long ingested;   /* nb input bytes read and buffered */
2703e0c1b49fSNick Terrell     unsigned long long consumed;   /* nb input bytes actually compressed */
2704e0c1b49fSNick Terrell     unsigned long long produced;   /* nb of compressed bytes generated and buffered */
2705e0c1b49fSNick Terrell     unsigned long long flushed;    /* nb of compressed bytes flushed : not provided; can be tracked from caller side */
2706e0c1b49fSNick Terrell     unsigned currentJobID;         /* MT only : latest started job nb */
2707e0c1b49fSNick Terrell     unsigned nbActiveWorkers;      /* MT only : nb of workers actively compressing at probe time */
2708e0c1b49fSNick Terrell } ZSTD_frameProgression;
2709cf30f6a5SNick Terrell 
2710e0c1b49fSNick Terrell /* ZSTD_getFrameProgression() :
2711e0c1b49fSNick Terrell  * tells how much data has been ingested (read from input)
2712e0c1b49fSNick Terrell  * consumed (input actually compressed) and produced (output) for current frame.
2713e0c1b49fSNick Terrell  * Note : (ingested - consumed) is amount of input data buffered internally, not yet compressed.
2714e0c1b49fSNick Terrell  * Aggregates progression inside active worker threads.
2715cf30f6a5SNick Terrell  */
27162aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_frameProgression ZSTD_getFrameProgression(const ZSTD_CCtx* cctx);
2717cf30f6a5SNick Terrell 
2718e0c1b49fSNick Terrell /*! ZSTD_toFlushNow() :
2719e0c1b49fSNick Terrell  *  Tell how many bytes are ready to be flushed immediately.
2720e0c1b49fSNick Terrell  *  Useful for multithreading scenarios (nbWorkers >= 1).
2721e0c1b49fSNick Terrell  *  Probe the oldest active job, defined as oldest job not yet entirely flushed,
2722e0c1b49fSNick Terrell  *  and check its output buffer.
2723e0c1b49fSNick Terrell  * @return : amount of data stored in oldest job and ready to be flushed immediately.
2724e0c1b49fSNick Terrell  *  if @return == 0, it means either :
2725e0c1b49fSNick Terrell  *  + there is no active job (could be checked with ZSTD_frameProgression()), or
2726e0c1b49fSNick Terrell  *  + oldest job is still actively compressing data,
2727e0c1b49fSNick Terrell  *    but everything it has produced has also been flushed so far,
2728e0c1b49fSNick Terrell  *    therefore flush speed is limited by production speed of oldest job
2729e0c1b49fSNick Terrell  *    irrespective of the speed of concurrent (and newer) jobs.
2730e0c1b49fSNick Terrell  */
27312aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_toFlushNow(ZSTD_CCtx* cctx);
2732e0c1b49fSNick Terrell 
2733e0c1b49fSNick Terrell 
2734e0c1b49fSNick Terrell /*=====   Advanced Streaming decompression functions  =====*/
2735e0c1b49fSNick Terrell 
2736e0c1b49fSNick Terrell /*!
2737e0c1b49fSNick Terrell  * This function is deprecated, and is equivalent to:
2738e0c1b49fSNick Terrell  *
2739e0c1b49fSNick Terrell  *     ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);
2740e0c1b49fSNick Terrell  *     ZSTD_DCtx_loadDictionary(zds, dict, dictSize);
2741e0c1b49fSNick Terrell  *
2742e0c1b49fSNick Terrell  * note: no dictionary will be used if dict == NULL or dictSize < 8
2743e0c1b49fSNick Terrell  */
2744*65d1f550SNick Terrell ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_loadDictionary, see zstd.h for detailed instructions")
27452aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDict(ZSTD_DStream* zds, const void* dict, size_t dictSize);
2746e0c1b49fSNick Terrell 
2747e0c1b49fSNick Terrell /*!
2748e0c1b49fSNick Terrell  * This function is deprecated, and is equivalent to:
2749e0c1b49fSNick Terrell  *
2750e0c1b49fSNick Terrell  *     ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);
2751e0c1b49fSNick Terrell  *     ZSTD_DCtx_refDDict(zds, ddict);
2752e0c1b49fSNick Terrell  *
2753e0c1b49fSNick Terrell  * note : ddict is referenced, it must outlive decompression session
2754e0c1b49fSNick Terrell  */
2755*65d1f550SNick Terrell ZSTD_DEPRECATED("use ZSTD_DCtx_reset + ZSTD_DCtx_refDDict, see zstd.h for detailed instructions")
27562aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const ZSTD_DDict* ddict);
2757e0c1b49fSNick Terrell 
2758e0c1b49fSNick Terrell /*!
2759e0c1b49fSNick Terrell  * This function is deprecated, and is equivalent to:
2760e0c1b49fSNick Terrell  *
2761e0c1b49fSNick Terrell  *     ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);
2762e0c1b49fSNick Terrell  *
2763*65d1f550SNick Terrell  * reuse decompression parameters from previous init; saves dictionary loading
2764e0c1b49fSNick Terrell  */
2765*65d1f550SNick Terrell ZSTD_DEPRECATED("use ZSTD_DCtx_reset, see zstd.h for detailed instructions")
27662aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds);
2767e0c1b49fSNick Terrell 
2768e0c1b49fSNick Terrell 
2769*65d1f550SNick Terrell /* ********************* BLOCK-LEVEL SEQUENCE PRODUCER API *********************
2770cf30f6a5SNick Terrell  *
2771*65d1f550SNick Terrell  * *** OVERVIEW ***
2772*65d1f550SNick Terrell  * The Block-Level Sequence Producer API allows users to provide their own custom
2773*65d1f550SNick Terrell  * sequence producer which libzstd invokes to process each block. The produced list
2774*65d1f550SNick Terrell  * of sequences (literals and matches) is then post-processed by libzstd to produce
2775*65d1f550SNick Terrell  * valid compressed blocks.
2776*65d1f550SNick Terrell  *
2777*65d1f550SNick Terrell  * This block-level offload API is a more granular complement of the existing
2778*65d1f550SNick Terrell  * frame-level offload API compressSequences() (introduced in v1.5.1). It offers
2779*65d1f550SNick Terrell  * an easier migration story for applications already integrated with libzstd: the
2780*65d1f550SNick Terrell  * user application continues to invoke the same compression functions
2781*65d1f550SNick Terrell  * ZSTD_compress2() or ZSTD_compressStream2() as usual, and transparently benefits
2782*65d1f550SNick Terrell  * from the specific advantages of the external sequence producer. For example,
2783*65d1f550SNick Terrell  * the sequence producer could be tuned to take advantage of known characteristics
2784*65d1f550SNick Terrell  * of the input, to offer better speed / ratio, or could leverage hardware
2785*65d1f550SNick Terrell  * acceleration not available within libzstd itself.
2786*65d1f550SNick Terrell  *
2787*65d1f550SNick Terrell  * See contrib/externalSequenceProducer for an example program employing the
2788*65d1f550SNick Terrell  * Block-Level Sequence Producer API.
2789*65d1f550SNick Terrell  *
2790*65d1f550SNick Terrell  * *** USAGE ***
2791*65d1f550SNick Terrell  * The user is responsible for implementing a function of type
2792*65d1f550SNick Terrell  * ZSTD_sequenceProducer_F. For each block, zstd will pass the following
2793*65d1f550SNick Terrell  * arguments to the user-provided function:
2794*65d1f550SNick Terrell  *
2795*65d1f550SNick Terrell  *   - sequenceProducerState: a pointer to a user-managed state for the sequence
2796*65d1f550SNick Terrell  *     producer.
2797*65d1f550SNick Terrell  *
2798*65d1f550SNick Terrell  *   - outSeqs, outSeqsCapacity: an output buffer for the sequence producer.
2799*65d1f550SNick Terrell  *     outSeqsCapacity is guaranteed >= ZSTD_sequenceBound(srcSize). The memory
2800*65d1f550SNick Terrell  *     backing outSeqs is managed by the CCtx.
2801*65d1f550SNick Terrell  *
2802*65d1f550SNick Terrell  *   - src, srcSize: an input buffer for the sequence producer to parse.
2803*65d1f550SNick Terrell  *     srcSize is guaranteed to be <= ZSTD_BLOCKSIZE_MAX.
2804*65d1f550SNick Terrell  *
2805*65d1f550SNick Terrell  *   - dict, dictSize: a history buffer, which may be empty, which the sequence
2806*65d1f550SNick Terrell  *     producer may reference as it parses the src buffer. Currently, zstd will
2807*65d1f550SNick Terrell  *     always pass dictSize == 0 into external sequence producers, but this will
2808*65d1f550SNick Terrell  *     change in the future.
2809*65d1f550SNick Terrell  *
2810*65d1f550SNick Terrell  *   - compressionLevel: a signed integer representing the zstd compression level
2811*65d1f550SNick Terrell  *     set by the user for the current operation. The sequence producer may choose
2812*65d1f550SNick Terrell  *     to use this information to change its compression strategy and speed/ratio
2813*65d1f550SNick Terrell  *     tradeoff. Note: the compression level does not reflect zstd parameters set
2814*65d1f550SNick Terrell  *     through the advanced API.
2815*65d1f550SNick Terrell  *
2816*65d1f550SNick Terrell  *   - windowSize: a size_t representing the maximum allowed offset for external
2817*65d1f550SNick Terrell  *     sequences. Note that sequence offsets are sometimes allowed to exceed the
2818*65d1f550SNick Terrell  *     windowSize if a dictionary is present, see doc/zstd_compression_format.md
2819*65d1f550SNick Terrell  *     for details.
2820*65d1f550SNick Terrell  *
2821*65d1f550SNick Terrell  * The user-provided function shall return a size_t representing the number of
2822*65d1f550SNick Terrell  * sequences written to outSeqs. This return value will be treated as an error
2823*65d1f550SNick Terrell  * code if it is greater than outSeqsCapacity. The return value must be non-zero
2824*65d1f550SNick Terrell  * if srcSize is non-zero. The ZSTD_SEQUENCE_PRODUCER_ERROR macro is provided
2825*65d1f550SNick Terrell  * for convenience, but any value greater than outSeqsCapacity will be treated as
2826*65d1f550SNick Terrell  * an error code.
2827*65d1f550SNick Terrell  *
2828*65d1f550SNick Terrell  * If the user-provided function does not return an error code, the sequences
2829*65d1f550SNick Terrell  * written to outSeqs must be a valid parse of the src buffer. Data corruption may
2830*65d1f550SNick Terrell  * occur if the parse is not valid. A parse is defined to be valid if the
2831*65d1f550SNick Terrell  * following conditions hold:
2832*65d1f550SNick Terrell  *   - The sum of matchLengths and literalLengths must equal srcSize.
2833*65d1f550SNick Terrell  *   - All sequences in the parse, except for the final sequence, must have
2834*65d1f550SNick Terrell  *     matchLength >= ZSTD_MINMATCH_MIN. The final sequence must have
2835*65d1f550SNick Terrell  *     matchLength >= ZSTD_MINMATCH_MIN or matchLength == 0.
2836*65d1f550SNick Terrell  *   - All offsets must respect the windowSize parameter as specified in
2837*65d1f550SNick Terrell  *     doc/zstd_compression_format.md.
2838*65d1f550SNick Terrell  *   - If the final sequence has matchLength == 0, it must also have offset == 0.
2839*65d1f550SNick Terrell  *
2840*65d1f550SNick Terrell  * zstd will only validate these conditions (and fail compression if they do not
2841*65d1f550SNick Terrell  * hold) if the ZSTD_c_validateSequences cParam is enabled. Note that sequence
2842*65d1f550SNick Terrell  * validation has a performance cost.
2843*65d1f550SNick Terrell  *
2844*65d1f550SNick Terrell  * If the user-provided function returns an error, zstd will either fall back
2845*65d1f550SNick Terrell  * to an internal sequence producer or fail the compression operation. The user can
2846*65d1f550SNick Terrell  * choose between the two behaviors by setting the ZSTD_c_enableSeqProducerFallback
2847*65d1f550SNick Terrell  * cParam. Fallback compression will follow any other cParam settings, such as
2848*65d1f550SNick Terrell  * compression level, the same as in a normal compression operation.
2849*65d1f550SNick Terrell  *
2850*65d1f550SNick Terrell  * The user shall instruct zstd to use a particular ZSTD_sequenceProducer_F
2851*65d1f550SNick Terrell  * function by calling
2852*65d1f550SNick Terrell  *         ZSTD_registerSequenceProducer(cctx,
2853*65d1f550SNick Terrell  *                                       sequenceProducerState,
2854*65d1f550SNick Terrell  *                                       sequenceProducer)
2855*65d1f550SNick Terrell  * This setting will persist until the next parameter reset of the CCtx.
2856*65d1f550SNick Terrell  *
2857*65d1f550SNick Terrell  * The sequenceProducerState must be initialized by the user before calling
2858*65d1f550SNick Terrell  * ZSTD_registerSequenceProducer(). The user is responsible for destroying the
2859*65d1f550SNick Terrell  * sequenceProducerState.
2860*65d1f550SNick Terrell  *
2861*65d1f550SNick Terrell  * *** LIMITATIONS ***
2862*65d1f550SNick Terrell  * This API is compatible with all zstd compression APIs which respect advanced parameters.
2863*65d1f550SNick Terrell  * However, there are three limitations:
2864*65d1f550SNick Terrell  *
2865*65d1f550SNick Terrell  * First, the ZSTD_c_enableLongDistanceMatching cParam is not currently supported.
2866*65d1f550SNick Terrell  * COMPRESSION WILL FAIL if it is enabled and the user tries to compress with a block-level
2867*65d1f550SNick Terrell  * external sequence producer.
2868*65d1f550SNick Terrell  *   - Note that ZSTD_c_enableLongDistanceMatching is auto-enabled by default in some
2869*65d1f550SNick Terrell  *     cases (see its documentation for details). Users must explicitly set
2870*65d1f550SNick Terrell  *     ZSTD_c_enableLongDistanceMatching to ZSTD_ps_disable in such cases if an external
2871*65d1f550SNick Terrell  *     sequence producer is registered.
2872*65d1f550SNick Terrell  *   - As of this writing, ZSTD_c_enableLongDistanceMatching is disabled by default
2873*65d1f550SNick Terrell  *     whenever ZSTD_c_windowLog < 128MB, but that's subject to change. Users should
2874*65d1f550SNick Terrell  *     check the docs on ZSTD_c_enableLongDistanceMatching whenever the Block-Level Sequence
2875*65d1f550SNick Terrell  *     Producer API is used in conjunction with advanced settings (like ZSTD_c_windowLog).
2876*65d1f550SNick Terrell  *
2877*65d1f550SNick Terrell  * Second, history buffers are not currently supported. Concretely, zstd will always pass
2878*65d1f550SNick Terrell  * dictSize == 0 to the external sequence producer (for now). This has two implications:
2879*65d1f550SNick Terrell  *   - Dictionaries are not currently supported. Compression will *not* fail if the user
2880*65d1f550SNick Terrell  *     references a dictionary, but the dictionary won't have any effect.
2881*65d1f550SNick Terrell  *   - Stream history is not currently supported. All advanced compression APIs, including
2882*65d1f550SNick Terrell  *     streaming APIs, work with external sequence producers, but each block is treated as
2883*65d1f550SNick Terrell  *     an independent chunk without history from previous blocks.
2884*65d1f550SNick Terrell  *
2885*65d1f550SNick Terrell  * Third, multi-threading within a single compression is not currently supported. In other words,
2886*65d1f550SNick Terrell  * COMPRESSION WILL FAIL if ZSTD_c_nbWorkers > 0 and an external sequence producer is registered.
2887*65d1f550SNick Terrell  * Multi-threading across compressions is fine: simply create one CCtx per thread.
2888*65d1f550SNick Terrell  *
2889*65d1f550SNick Terrell  * Long-term, we plan to overcome all three limitations. There is no technical blocker to
2890*65d1f550SNick Terrell  * overcoming them. It is purely a question of engineering effort.
2891*65d1f550SNick Terrell  */
2892*65d1f550SNick Terrell 
2893*65d1f550SNick Terrell #define ZSTD_SEQUENCE_PRODUCER_ERROR ((size_t)(-1))
2894*65d1f550SNick Terrell 
2895*65d1f550SNick Terrell typedef size_t (*ZSTD_sequenceProducer_F) (
2896*65d1f550SNick Terrell   void* sequenceProducerState,
2897*65d1f550SNick Terrell   ZSTD_Sequence* outSeqs, size_t outSeqsCapacity,
2898*65d1f550SNick Terrell   const void* src, size_t srcSize,
2899*65d1f550SNick Terrell   const void* dict, size_t dictSize,
2900*65d1f550SNick Terrell   int compressionLevel,
2901*65d1f550SNick Terrell   size_t windowSize
2902*65d1f550SNick Terrell );
2903*65d1f550SNick Terrell 
2904*65d1f550SNick Terrell /*! ZSTD_registerSequenceProducer() :
2905*65d1f550SNick Terrell  * Instruct zstd to use a block-level external sequence producer function.
2906*65d1f550SNick Terrell  *
2907*65d1f550SNick Terrell  * The sequenceProducerState must be initialized by the caller, and the caller is
2908*65d1f550SNick Terrell  * responsible for managing its lifetime. This parameter is sticky across
2909*65d1f550SNick Terrell  * compressions. It will remain set until the user explicitly resets compression
2910*65d1f550SNick Terrell  * parameters.
2911*65d1f550SNick Terrell  *
2912*65d1f550SNick Terrell  * Sequence producer registration is considered to be an "advanced parameter",
2913*65d1f550SNick Terrell  * part of the "advanced API". This means it will only have an effect on compression
2914*65d1f550SNick Terrell  * APIs which respect advanced parameters, such as compress2() and compressStream2().
2915*65d1f550SNick Terrell  * Older compression APIs such as compressCCtx(), which predate the introduction of
2916*65d1f550SNick Terrell  * "advanced parameters", will ignore any external sequence producer setting.
2917*65d1f550SNick Terrell  *
2918*65d1f550SNick Terrell  * The sequence producer can be "cleared" by registering a NULL function pointer. This
2919*65d1f550SNick Terrell  * removes all limitations described above in the "LIMITATIONS" section of the API docs.
2920*65d1f550SNick Terrell  *
2921*65d1f550SNick Terrell  * The user is strongly encouraged to read the full API documentation (above) before
2922*65d1f550SNick Terrell  * calling this function. */
2923*65d1f550SNick Terrell ZSTDLIB_STATIC_API void
2924*65d1f550SNick Terrell ZSTD_registerSequenceProducer(
2925*65d1f550SNick Terrell   ZSTD_CCtx* cctx,
2926*65d1f550SNick Terrell   void* sequenceProducerState,
2927*65d1f550SNick Terrell   ZSTD_sequenceProducer_F sequenceProducer
2928*65d1f550SNick Terrell );
2929*65d1f550SNick Terrell 
2930*65d1f550SNick Terrell /*! ZSTD_CCtxParams_registerSequenceProducer() :
2931*65d1f550SNick Terrell  * Same as ZSTD_registerSequenceProducer(), but operates on ZSTD_CCtx_params.
2932*65d1f550SNick Terrell  * This is used for accurate size estimation with ZSTD_estimateCCtxSize_usingCCtxParams(),
2933*65d1f550SNick Terrell  * which is needed when creating a ZSTD_CCtx with ZSTD_initStaticCCtx().
2934*65d1f550SNick Terrell  *
2935*65d1f550SNick Terrell  * If you are using the external sequence producer API in a scenario where ZSTD_initStaticCCtx()
2936*65d1f550SNick Terrell  * is required, then this function is for you. Otherwise, you probably don't need it.
2937*65d1f550SNick Terrell  *
2938*65d1f550SNick Terrell  * See tests/zstreamtest.c for example usage. */
2939*65d1f550SNick Terrell ZSTDLIB_STATIC_API void
2940*65d1f550SNick Terrell ZSTD_CCtxParams_registerSequenceProducer(
2941*65d1f550SNick Terrell   ZSTD_CCtx_params* params,
2942*65d1f550SNick Terrell   void* sequenceProducerState,
2943*65d1f550SNick Terrell   ZSTD_sequenceProducer_F sequenceProducer
2944*65d1f550SNick Terrell );
2945*65d1f550SNick Terrell 
2946*65d1f550SNick Terrell 
2947*65d1f550SNick Terrell /* *******************************************************************
2948*65d1f550SNick Terrell *  Buffer-less and synchronous inner streaming functions (DEPRECATED)
2949*65d1f550SNick Terrell *
2950*65d1f550SNick Terrell *  This API is deprecated, and will be removed in a future version.
2951*65d1f550SNick Terrell *  It allows streaming (de)compression with user allocated buffers.
2952*65d1f550SNick Terrell *  However, it is hard to use, and not as well tested as the rest of
2953*65d1f550SNick Terrell *  our API.
2954*65d1f550SNick Terrell *
2955*65d1f550SNick Terrell *  Please use the normal streaming API instead: ZSTD_compressStream2,
2956*65d1f550SNick Terrell *  and ZSTD_decompressStream.
2957*65d1f550SNick Terrell *  If there is functionality that you need, but it doesn't provide,
2958*65d1f550SNick Terrell *  please open an issue on our GitHub.
2959e0c1b49fSNick Terrell ********************************************************************* */
2960cf30f6a5SNick Terrell 
2961e0c1b49fSNick Terrell /*
2962e0c1b49fSNick Terrell   Buffer-less streaming compression (synchronous mode)
2963e0c1b49fSNick Terrell 
2964e0c1b49fSNick Terrell   A ZSTD_CCtx object is required to track streaming operations.
2965e0c1b49fSNick Terrell   Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource.
2966*65d1f550SNick Terrell   ZSTD_CCtx object can be reused multiple times within successive compression operations.
2967e0c1b49fSNick Terrell 
2968e0c1b49fSNick Terrell   Start by initializing a context.
29692aa14b1aSNick Terrell   Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression.
2970e0c1b49fSNick Terrell 
2971e0c1b49fSNick Terrell   Then, consume your input using ZSTD_compressContinue().
2972e0c1b49fSNick Terrell   There are some important considerations to keep in mind when using this advanced function :
2973e0c1b49fSNick Terrell   - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffers only.
2974e0c1b49fSNick Terrell   - Interface is synchronous : input is consumed entirely and produces 1+ compressed blocks.
2975e0c1b49fSNick Terrell   - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario.
2976e0c1b49fSNick Terrell     Worst case evaluation is provided by ZSTD_compressBound().
2977e0c1b49fSNick Terrell     ZSTD_compressContinue() doesn't guarantee recover after a failed compression.
2978e0c1b49fSNick Terrell   - ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog).
2979e0c1b49fSNick Terrell     It remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks)
2980e0c1b49fSNick Terrell   - ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps.
2981e0c1b49fSNick Terrell     In which case, it will "discard" the relevant memory section from its history.
2982e0c1b49fSNick Terrell 
2983e0c1b49fSNick Terrell   Finish a frame with ZSTD_compressEnd(), which will write the last block(s) and optional checksum.
2984e0c1b49fSNick Terrell   It's possible to use srcSize==0, in which case, it will write a final empty block to end the frame.
2985e0c1b49fSNick Terrell   Without last block mark, frames are considered unfinished (hence corrupted) by compliant decoders.
2986e0c1b49fSNick Terrell 
2987*65d1f550SNick Terrell   `ZSTD_CCtx` object can be reused (ZSTD_compressBegin()) to compress again.
2988e0c1b49fSNick Terrell */
2989cf30f6a5SNick Terrell 
2990cf30f6a5SNick Terrell /*=====   Buffer-less streaming compression functions  =====*/
2991*65d1f550SNick Terrell ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.")
29922aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel);
2993*65d1f550SNick Terrell ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.")
29942aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel);
2995*65d1f550SNick Terrell ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.")
29962aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /*< note: fails if cdict==NULL */
2997e0c1b49fSNick Terrell 
2998*65d1f550SNick Terrell ZSTD_DEPRECATED("This function will likely be removed in a future release. It is misleading and has very limited utility.")
2999*65d1f550SNick Terrell ZSTDLIB_STATIC_API
3000*65d1f550SNick Terrell 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 */
3001*65d1f550SNick Terrell 
3002*65d1f550SNick Terrell ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.")
30032aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
3004*65d1f550SNick Terrell ZSTD_DEPRECATED("The buffer-less API is deprecated in favor of the normal streaming API. See docs.")
30052aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
3006cf30f6a5SNick Terrell 
30072aa14b1aSNick Terrell /* The ZSTD_compressBegin_advanced() and ZSTD_compressBegin_usingCDict_advanced() are now DEPRECATED and will generate a compiler warning */
30082aa14b1aSNick Terrell ZSTD_DEPRECATED("use advanced API to access custom parameters")
3009*65d1f550SNick Terrell ZSTDLIB_STATIC_API
30102aa14b1aSNick Terrell 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 */
30112aa14b1aSNick Terrell ZSTD_DEPRECATED("use advanced API to access custom parameters")
3012*65d1f550SNick Terrell ZSTDLIB_STATIC_API
30132aa14b1aSNick Terrell 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 */
3014e0c1b49fSNick Terrell /*
3015e0c1b49fSNick Terrell   Buffer-less streaming decompression (synchronous mode)
3016cf30f6a5SNick Terrell 
3017e0c1b49fSNick Terrell   A ZSTD_DCtx object is required to track streaming operations.
3018e0c1b49fSNick Terrell   Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it.
3019*65d1f550SNick Terrell   A ZSTD_DCtx object can be reused multiple times.
3020e0c1b49fSNick Terrell 
3021e0c1b49fSNick Terrell   First typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader().
3022e0c1b49fSNick Terrell   Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough.
3023e0c1b49fSNick Terrell   Data fragment must be large enough to ensure successful decoding.
3024e0c1b49fSNick Terrell  `ZSTD_frameHeaderSize_max` bytes is guaranteed to always be large enough.
3025*65d1f550SNick Terrell   result  : 0 : successful decoding, the `ZSTD_frameHeader` structure is correctly filled.
3026*65d1f550SNick Terrell            >0 : `srcSize` is too small, please provide at least result bytes on next attempt.
3027e0c1b49fSNick Terrell            errorCode, which can be tested using ZSTD_isError().
3028e0c1b49fSNick Terrell 
3029*65d1f550SNick Terrell   It fills a ZSTD_FrameHeader structure with important information to correctly decode the frame,
3030e0c1b49fSNick Terrell   such as the dictionary ID, content size, or maximum back-reference distance (`windowSize`).
3031e0c1b49fSNick Terrell   Note that these values could be wrong, either because of data corruption, or because a 3rd party deliberately spoofs false information.
3032e0c1b49fSNick Terrell   As a consequence, check that values remain within valid application range.
3033e0c1b49fSNick Terrell   For example, do not allocate memory blindly, check that `windowSize` is within expectation.
3034e0c1b49fSNick Terrell   Each application can set its own limits, depending on local restrictions.
3035e0c1b49fSNick Terrell   For extended interoperability, it is recommended to support `windowSize` of at least 8 MB.
3036e0c1b49fSNick Terrell 
3037e0c1b49fSNick Terrell   ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize` bytes.
3038e0c1b49fSNick Terrell   ZSTD_decompressContinue() is very sensitive to contiguity,
3039e0c1b49fSNick Terrell   if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place,
3040e0c1b49fSNick Terrell   or that previous contiguous segment is large enough to properly handle maximum back-reference distance.
3041e0c1b49fSNick Terrell   There are multiple ways to guarantee this condition.
3042e0c1b49fSNick Terrell 
3043e0c1b49fSNick Terrell   The most memory efficient way is to use a round buffer of sufficient size.
3044e0c1b49fSNick Terrell   Sufficient size is determined by invoking ZSTD_decodingBufferSize_min(),
3045*65d1f550SNick Terrell   which can return an error code if required value is too large for current system (in 32-bits mode).
3046e0c1b49fSNick Terrell   In a round buffer methodology, ZSTD_decompressContinue() decompresses each block next to previous one,
3047e0c1b49fSNick Terrell   up to the moment there is not enough room left in the buffer to guarantee decoding another full block,
3048e0c1b49fSNick Terrell   which maximum size is provided in `ZSTD_frameHeader` structure, field `blockSizeMax`.
3049e0c1b49fSNick Terrell   At which point, decoding can resume from the beginning of the buffer.
3050e0c1b49fSNick Terrell   Note that already decoded data stored in the buffer should be flushed before being overwritten.
3051e0c1b49fSNick Terrell 
3052e0c1b49fSNick Terrell   There are alternatives possible, for example using two or more buffers of size `windowSize` each, though they consume more memory.
3053e0c1b49fSNick Terrell 
3054e0c1b49fSNick Terrell   Finally, if you control the compression process, you can also ignore all buffer size rules,
3055e0c1b49fSNick Terrell   as long as the encoder and decoder progress in "lock-step",
3056e0c1b49fSNick Terrell   aka use exactly the same buffer sizes, break contiguity at the same place, etc.
3057e0c1b49fSNick Terrell 
3058e0c1b49fSNick Terrell   Once buffers are setup, start decompression, with ZSTD_decompressBegin().
3059e0c1b49fSNick Terrell   If decompression requires a dictionary, use ZSTD_decompressBegin_usingDict() or ZSTD_decompressBegin_usingDDict().
3060e0c1b49fSNick Terrell 
3061e0c1b49fSNick Terrell   Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively.
3062e0c1b49fSNick Terrell   ZSTD_nextSrcSizeToDecompress() tells how many bytes to provide as 'srcSize' to ZSTD_decompressContinue().
3063e0c1b49fSNick Terrell   ZSTD_decompressContinue() requires this _exact_ amount of bytes, or it will fail.
3064e0c1b49fSNick Terrell 
3065*65d1f550SNick Terrell   result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).
3066e0c1b49fSNick Terrell   It can be zero : it just means ZSTD_decompressContinue() has decoded some metadata item.
3067e0c1b49fSNick Terrell   It can also be an error code, which can be tested with ZSTD_isError().
3068e0c1b49fSNick Terrell 
3069e0c1b49fSNick Terrell   A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero.
3070e0c1b49fSNick Terrell   Context can then be reset to start a new decompression.
3071e0c1b49fSNick Terrell 
3072e0c1b49fSNick Terrell   Note : it's possible to know if next input to present is a header or a block, using ZSTD_nextInputType().
3073e0c1b49fSNick Terrell   This information is not required to properly decode a frame.
3074e0c1b49fSNick Terrell 
3075e0c1b49fSNick Terrell   == Special case : skippable frames ==
3076e0c1b49fSNick Terrell 
3077e0c1b49fSNick Terrell   Skippable frames allow integration of user-defined data into a flow of concatenated frames.
3078e0c1b49fSNick Terrell   Skippable frames will be ignored (skipped) by decompressor.
3079e0c1b49fSNick Terrell   The format of skippable frames is as follows :
3080e0c1b49fSNick Terrell   a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F
3081e0c1b49fSNick Terrell   b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits
3082e0c1b49fSNick Terrell   c) Frame Content - any content (User Data) of length equal to Frame Size
3083e0c1b49fSNick Terrell   For skippable frames ZSTD_getFrameHeader() returns zfhPtr->frameType==ZSTD_skippableFrame.
3084e0c1b49fSNick Terrell   For skippable frames ZSTD_decompressContinue() always returns 0 : it only skips the content.
3085e0c1b49fSNick Terrell */
3086cf30f6a5SNick Terrell 
3087cf30f6a5SNick Terrell /*=====   Buffer-less streaming decompression functions  =====*/
3088cf30f6a5SNick Terrell 
30892aa14b1aSNick Terrell ZSTDLIB_STATIC_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 */
3090cf30f6a5SNick Terrell 
30912aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx);
30922aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
30932aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_decompressBegin_usingDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict);
3094e0c1b49fSNick Terrell 
30952aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx);
30962aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
3097e0c1b49fSNick Terrell 
3098e0c1b49fSNick Terrell /* misc */
3099*65d1f550SNick Terrell ZSTD_DEPRECATED("This function will likely be removed in the next minor release. It is misleading and has very limited utility.")
31002aa14b1aSNick Terrell ZSTDLIB_STATIC_API void   ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx);
3101e0c1b49fSNick Terrell typedef enum { ZSTDnit_frameHeader, ZSTDnit_blockHeader, ZSTDnit_block, ZSTDnit_lastBlock, ZSTDnit_checksum, ZSTDnit_skippableFrame } ZSTD_nextInputType_e;
31022aa14b1aSNick Terrell ZSTDLIB_STATIC_API ZSTD_nextInputType_e ZSTD_nextInputType(ZSTD_DCtx* dctx);
3103e0c1b49fSNick Terrell 
3104e0c1b49fSNick Terrell 
3105e0c1b49fSNick Terrell 
3106e0c1b49fSNick Terrell 
3107*65d1f550SNick Terrell /* ========================================= */
3108*65d1f550SNick Terrell /*       Block level API (DEPRECATED)       */
3109*65d1f550SNick Terrell /* ========================================= */
3110e0c1b49fSNick Terrell 
3111e0c1b49fSNick Terrell /*!
3112*65d1f550SNick Terrell 
3113*65d1f550SNick Terrell     This API is deprecated in favor of the regular compression API.
3114*65d1f550SNick Terrell     You can get the frame header down to 2 bytes by setting:
3115*65d1f550SNick Terrell       - ZSTD_c_format = ZSTD_f_zstd1_magicless
3116*65d1f550SNick Terrell       - ZSTD_c_contentSizeFlag = 0
3117*65d1f550SNick Terrell       - ZSTD_c_checksumFlag = 0
3118*65d1f550SNick Terrell       - ZSTD_c_dictIDFlag = 0
3119*65d1f550SNick Terrell 
3120*65d1f550SNick Terrell     This API is not as well tested as our normal API, so we recommend not using it.
3121*65d1f550SNick Terrell     We will be removing it in a future version. If the normal API doesn't provide
3122*65d1f550SNick Terrell     the functionality you need, please open a GitHub issue.
3123*65d1f550SNick Terrell 
3124e0c1b49fSNick Terrell     Block functions produce and decode raw zstd blocks, without frame metadata.
3125e0c1b49fSNick Terrell     Frame metadata cost is typically ~12 bytes, which can be non-negligible for very small blocks (< 100 bytes).
3126e0c1b49fSNick Terrell     But users will have to take in charge needed metadata to regenerate data, such as compressed and content sizes.
3127e0c1b49fSNick Terrell 
3128e0c1b49fSNick Terrell     A few rules to respect :
3129e0c1b49fSNick Terrell     - Compressing and decompressing require a context structure
3130e0c1b49fSNick Terrell       + Use ZSTD_createCCtx() and ZSTD_createDCtx()
3131e0c1b49fSNick Terrell     - It is necessary to init context before starting
3132e0c1b49fSNick Terrell       + compression : any ZSTD_compressBegin*() variant, including with dictionary
3133e0c1b49fSNick Terrell       + decompression : any ZSTD_decompressBegin*() variant, including with dictionary
3134e0c1b49fSNick Terrell     - Block size is limited, it must be <= ZSTD_getBlockSize() <= ZSTD_BLOCKSIZE_MAX == 128 KB
3135e0c1b49fSNick Terrell       + If input is larger than a block size, it's necessary to split input data into multiple blocks
3136e0c1b49fSNick Terrell       + For inputs larger than a single block, consider using regular ZSTD_compress() instead.
3137e0c1b49fSNick Terrell         Frame metadata is not that costly, and quickly becomes negligible as source size grows larger than a block.
3138e0c1b49fSNick Terrell     - When a block is considered not compressible enough, ZSTD_compressBlock() result will be 0 (zero) !
3139e0c1b49fSNick Terrell       ===> In which case, nothing is produced into `dst` !
3140e0c1b49fSNick Terrell       + User __must__ test for such outcome and deal directly with uncompressed data
3141e0c1b49fSNick Terrell       + A block cannot be declared incompressible if ZSTD_compressBlock() return value was != 0.
3142e0c1b49fSNick Terrell         Doing so would mess up with statistics history, leading to potential data corruption.
3143e0c1b49fSNick Terrell       + ZSTD_decompressBlock() _doesn't accept uncompressed data as input_ !!
3144e0c1b49fSNick Terrell       + In case of multiple successive blocks, should some of them be uncompressed,
3145e0c1b49fSNick Terrell         decoder must be informed of their existence in order to follow proper history.
3146e0c1b49fSNick Terrell         Use ZSTD_insertBlock() for such a case.
3147e0c1b49fSNick Terrell */
3148e0c1b49fSNick Terrell 
3149cf30f6a5SNick Terrell /*=====   Raw zstd block functions  =====*/
3150*65d1f550SNick Terrell ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.")
31512aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_getBlockSize   (const ZSTD_CCtx* cctx);
3152*65d1f550SNick Terrell ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.")
31532aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_compressBlock  (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
3154*65d1f550SNick Terrell ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.")
31552aa14b1aSNick Terrell ZSTDLIB_STATIC_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
3156*65d1f550SNick Terrell ZSTD_DEPRECATED("The block API is deprecated in favor of the normal compression API. See docs.")
31572aa14b1aSNick Terrell ZSTDLIB_STATIC_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. */
3158cf30f6a5SNick Terrell 
3159e0c1b49fSNick Terrell 
3160e0c1b49fSNick Terrell #endif   /* ZSTD_H_ZSTD_STATIC_LINKING_ONLY */
3161