extzstd 0.1 → 0.3.2

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