extzstd 0.0.2.CONCEPT → 0.0.3.CONCEPT

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +72 -22
  3. data/Rakefile +73 -19
  4. data/contrib/zstd/README.md +68 -0
  5. data/contrib/zstd/common/bitstream.h +414 -0
  6. data/contrib/zstd/common/entropy_common.c +231 -0
  7. data/contrib/zstd/common/error_private.h +125 -0
  8. data/contrib/zstd/common/error_public.h +77 -0
  9. data/contrib/zstd/common/fse.h +628 -0
  10. data/contrib/zstd/common/fse_decompress.c +331 -0
  11. data/contrib/zstd/common/huf.h +228 -0
  12. data/contrib/zstd/common/mem.h +377 -0
  13. data/contrib/zstd/common/xxhash.c +854 -0
  14. data/contrib/zstd/common/xxhash.h +273 -0
  15. data/contrib/zstd/common/zbuff.h +197 -0
  16. data/contrib/zstd/common/zstd.h +475 -0
  17. data/contrib/zstd/common/zstd_common.c +91 -0
  18. data/contrib/zstd/common/zstd_internal.h +238 -0
  19. data/contrib/zstd/compress/fse_compress.c +807 -0
  20. data/contrib/zstd/compress/huf_compress.c +577 -0
  21. data/contrib/zstd/compress/zbuff_compress.c +327 -0
  22. data/contrib/zstd/compress/zstd_compress.c +3074 -0
  23. data/contrib/zstd/compress/zstd_opt.h +1046 -0
  24. data/contrib/zstd/decompress/huf_decompress.c +894 -0
  25. data/contrib/zstd/decompress/zbuff_decompress.c +294 -0
  26. data/contrib/zstd/decompress/zstd_decompress.c +1362 -0
  27. data/contrib/zstd/dictBuilder/divsufsort.c +1913 -0
  28. data/contrib/zstd/dictBuilder/divsufsort.h +67 -0
  29. data/contrib/zstd/dictBuilder/zdict.c +1045 -0
  30. data/contrib/zstd/dictBuilder/zdict.h +113 -0
  31. data/contrib/zstd/legacy/zstd_legacy.h +140 -0
  32. data/contrib/zstd/legacy/zstd_v01.c +2178 -0
  33. data/contrib/zstd/{zstd.h → legacy/zstd_v01.h} +46 -39
  34. data/contrib/zstd/legacy/zstd_v02.c +3748 -0
  35. data/contrib/zstd/legacy/zstd_v02.h +99 -0
  36. data/contrib/zstd/legacy/zstd_v03.c +3389 -0
  37. data/contrib/zstd/legacy/zstd_v03.h +99 -0
  38. data/contrib/zstd/legacy/zstd_v04.c +4056 -0
  39. data/contrib/zstd/legacy/zstd_v04.h +148 -0
  40. data/contrib/zstd/legacy/zstd_v05.c +4325 -0
  41. data/contrib/zstd/legacy/zstd_v05.h +171 -0
  42. data/contrib/zstd/legacy/zstd_v06.c +4581 -0
  43. data/contrib/zstd/legacy/zstd_v06.h +185 -0
  44. data/ext/extconf.rb +10 -12
  45. data/ext/extzstd.c +497 -144
  46. data/ext/extzstd.h +127 -22
  47. data/ext/extzstd_buffered.c +265 -0
  48. data/ext/extzstd_nogvls.h +174 -0
  49. data/ext/zstd_amalgam.c +18 -0
  50. data/ext/zstd_legacy_v01.c +1 -0
  51. data/ext/zstd_legacy_v02.c +1 -0
  52. data/ext/zstd_legacy_v03.c +1 -0
  53. data/ext/zstd_legacy_v04.c +1 -0
  54. data/ext/zstd_legacy_v05.c +1 -0
  55. data/ext/zstd_legacy_v06.c +1 -0
  56. data/gemstub.rb +17 -1
  57. data/lib/extzstd.rb +197 -77
  58. data/lib/extzstd/version.rb +1 -1
  59. data/test/test_basic.rb +41 -0
  60. metadata +70 -20
  61. data/contrib/zstd/Makefile +0 -115
  62. data/contrib/zstd/fse.c +0 -2466
  63. data/contrib/zstd/fse.h +0 -320
  64. data/contrib/zstd/fse_static.h +0 -282
  65. data/contrib/zstd/libzstd.pc.in +0 -14
  66. data/contrib/zstd/zstd.c +0 -1768
  67. data/contrib/zstd/zstd_static.h +0 -89
  68. data/ext/extzstd-stream.c +0 -398
@@ -0,0 +1,475 @@
1
+ /*
2
+ zstd - standard compression library
3
+ Header File
4
+ Copyright (C) 2014-2016, Yann Collet.
5
+
6
+ BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
7
+
8
+ Redistribution and use in source and binary forms, with or without
9
+ modification, are permitted provided that the following conditions are
10
+ met:
11
+ * Redistributions of source code must retain the above copyright
12
+ notice, this list of conditions and the following disclaimer.
13
+ * Redistributions in binary form must reproduce the above
14
+ copyright notice, this list of conditions and the following disclaimer
15
+ in the documentation and/or other materials provided with the
16
+ distribution.
17
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23
+ LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
+
29
+ You can contact the author at :
30
+ - zstd source repository : https://github.com/Cyan4973/zstd
31
+ */
32
+ #ifndef ZSTD_H_235446
33
+ #define ZSTD_H_235446
34
+
35
+ #if defined (__cplusplus)
36
+ extern "C" {
37
+ #endif
38
+
39
+ /*-*************************************
40
+ * Dependencies
41
+ ***************************************/
42
+ #include <stddef.h> /* size_t */
43
+
44
+
45
+ /*-***************************************************************
46
+ * Export parameters
47
+ *****************************************************************/
48
+ /*!
49
+ * ZSTD_DLL_EXPORT :
50
+ * Enable exporting of functions when building a Windows DLL
51
+ */
52
+ #if defined(_WIN32) && defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1)
53
+ # define ZSTDLIB_API __declspec(dllexport)
54
+ #else
55
+ # define ZSTDLIB_API
56
+ #endif
57
+
58
+
59
+ /* *************************************
60
+ * Version
61
+ ***************************************/
62
+ #define ZSTD_VERSION_MAJOR 0
63
+ #define ZSTD_VERSION_MINOR 7
64
+ #define ZSTD_VERSION_RELEASE 4
65
+
66
+ #define ZSTD_LIB_VERSION ZSTD_VERSION_MAJOR.ZSTD_VERSION_MINOR.ZSTD_VERSION_RELEASE
67
+ #define ZSTD_QUOTE(str) #str
68
+ #define ZSTD_EXPAND_AND_QUOTE(str) ZSTD_QUOTE(str)
69
+ #define ZSTD_VERSION_STRING ZSTD_EXPAND_AND_QUOTE(ZSTD_LIB_VERSION)
70
+
71
+ #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
72
+ ZSTDLIB_API unsigned ZSTD_versionNumber (void);
73
+
74
+
75
+ /* *************************************
76
+ * Simple functions
77
+ ***************************************/
78
+ /*! ZSTD_compress() :
79
+ Compresses `srcSize` bytes from buffer `src` into buffer `dst` of size `dstCapacity`.
80
+ Destination buffer must be already allocated.
81
+ Compression runs faster if `dstCapacity` >= `ZSTD_compressBound(srcSize)`.
82
+ @return : the number of bytes written into `dst`,
83
+ or an error code if it fails (which can be tested using ZSTD_isError()) */
84
+ ZSTDLIB_API size_t ZSTD_compress( void* dst, size_t dstCapacity,
85
+ const void* src, size_t srcSize,
86
+ int compressionLevel);
87
+
88
+ /** ZSTD_getDecompressedSize() :
89
+ * @return : decompressed size if known, 0 otherwise.
90
+ note : to know precise reason why result is `0`, follow up with ZSTD_getFrameParams() */
91
+ unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
92
+
93
+ /*! ZSTD_decompress() :
94
+ `compressedSize` : is the _exact_ size of compressed input, otherwise decompression will fail.
95
+ `dstCapacity` must be equal or larger than originalSize.
96
+ @return : the number of bytes decompressed into `dst` (<= `dstCapacity`),
97
+ or an errorCode if it fails (which can be tested using ZSTD_isError()) */
98
+ ZSTDLIB_API size_t ZSTD_decompress( void* dst, size_t dstCapacity,
99
+ const void* src, size_t compressedSize);
100
+
101
+
102
+ /* *************************************
103
+ * Helper functions
104
+ ***************************************/
105
+ ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size (worst case scenario) */
106
+
107
+ /* Error Management */
108
+ ZSTDLIB_API unsigned ZSTD_isError(size_t code); /*!< tells if a `size_t` function result is an error code */
109
+ ZSTDLIB_API const char* ZSTD_getErrorName(size_t code); /*!< provides readable string for an error code */
110
+
111
+
112
+ /* *************************************
113
+ * Explicit memory management
114
+ ***************************************/
115
+ /** Compression context */
116
+ typedef struct ZSTD_CCtx_s ZSTD_CCtx; /*< incomplete type */
117
+ ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void);
118
+ ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); /*!< @return : errorCode */
119
+
120
+ /** ZSTD_compressCCtx() :
121
+ Same as ZSTD_compress(), but requires an already allocated ZSTD_CCtx (see ZSTD_createCCtx()) */
122
+ ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize, int compressionLevel);
123
+
124
+ /** Decompression context */
125
+ typedef struct ZSTD_DCtx_s ZSTD_DCtx;
126
+ ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void);
127
+ ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /*!< @return : errorCode */
128
+
129
+ /** ZSTD_decompressDCtx() :
130
+ * Same as ZSTD_decompress(), but requires an already allocated ZSTD_DCtx (see ZSTD_createDCtx()) */
131
+ ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* ctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
132
+
133
+
134
+ /*-************************
135
+ * Simple dictionary API
136
+ ***************************/
137
+ /*! ZSTD_compress_usingDict() :
138
+ * Compression using a pre-defined Dictionary content (see dictBuilder).
139
+ * Note 1 : This function load the dictionary, resulting in a significant startup time.
140
+ * Note 2 : `dict` must remain accessible and unmodified during compression operation.
141
+ * Note 3 : `dict` can be `NULL`, in which case, it's equivalent to ZSTD_compressCCtx() */
142
+ ZSTDLIB_API size_t ZSTD_compress_usingDict(ZSTD_CCtx* ctx,
143
+ void* dst, size_t dstCapacity,
144
+ const void* src, size_t srcSize,
145
+ const void* dict,size_t dictSize,
146
+ int compressionLevel);
147
+
148
+ /*! ZSTD_decompress_usingDict() :
149
+ * Decompression using a pre-defined Dictionary content (see dictBuilder).
150
+ * Dictionary must be identical to the one used during compression.
151
+ * Note 1 : This function load the dictionary, resulting in a significant startup time
152
+ * Note 2 : `dict` must remain accessible and unmodified during compression operation.
153
+ * Note 3 : `dict` can be `NULL`, in which case, it's equivalent to ZSTD_decompressDCtx() */
154
+ ZSTDLIB_API size_t ZSTD_decompress_usingDict(ZSTD_DCtx* dctx,
155
+ void* dst, size_t dstCapacity,
156
+ const void* src, size_t srcSize,
157
+ const void* dict,size_t dictSize);
158
+
159
+
160
+ /*-**************************
161
+ * Advanced Dictionary API
162
+ ****************************/
163
+ /*! ZSTD_createCDict() :
164
+ * Create a digested dictionary, ready to start compression operation without startup delay.
165
+ * `dict` can be released after creation */
166
+ typedef struct ZSTD_CDict_s ZSTD_CDict;
167
+ ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dict, size_t dictSize, int compressionLevel);
168
+ ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict);
169
+
170
+ /*! ZSTD_compress_usingCDict() :
171
+ * Compression using a pre-digested Dictionary.
172
+ * Much faster than ZSTD_compress_usingDict() when same dictionary is used multiple times.
173
+ * Note that compression level is decided during dictionary creation */
174
+ ZSTDLIB_API size_t ZSTD_compress_usingCDict(ZSTD_CCtx* cctx,
175
+ void* dst, size_t dstCapacity,
176
+ const void* src, size_t srcSize,
177
+ const ZSTD_CDict* cdict);
178
+
179
+ /*! ZSTD_createDDict() :
180
+ * Create a digested dictionary, ready to start decompression operation without startup delay.
181
+ * `dict` can be released after creation */
182
+ typedef struct ZSTD_DDict_s ZSTD_DDict;
183
+ ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dict, size_t dictSize);
184
+ ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict);
185
+
186
+ /*! ZSTD_decompress_usingDDict() :
187
+ * Decompression using a pre-digested Dictionary
188
+ * Much faster than ZSTD_decompress_usingDict() when same dictionary is used multiple times. */
189
+ ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
190
+ void* dst, size_t dstCapacity,
191
+ const void* src, size_t srcSize,
192
+ const ZSTD_DDict* ddict);
193
+
194
+
195
+
196
+ #ifdef ZSTD_STATIC_LINKING_ONLY
197
+
198
+ /* ====================================================================================
199
+ * The definitions in this section are considered experimental.
200
+ * They should never be used with a dynamic library, as they may change in the future.
201
+ * They are provided for advanced usages.
202
+ * Use them only in association with static linking.
203
+ * ==================================================================================== */
204
+
205
+ /*--- Constants ---*/
206
+ #define ZSTD_MAGICNUMBER 0xFD2FB527 /* v0.7 */
207
+ #define ZSTD_MAGIC_SKIPPABLE_START 0x184D2A50U
208
+
209
+ #define ZSTD_WINDOWLOG_MAX_32 25
210
+ #define ZSTD_WINDOWLOG_MAX_64 27
211
+ #define ZSTD_WINDOWLOG_MAX ((U32)(MEM_32bits() ? ZSTD_WINDOWLOG_MAX_32 : ZSTD_WINDOWLOG_MAX_64))
212
+ #define ZSTD_WINDOWLOG_MIN 18
213
+ #define ZSTD_CHAINLOG_MAX (ZSTD_WINDOWLOG_MAX+1)
214
+ #define ZSTD_CHAINLOG_MIN 4
215
+ #define ZSTD_HASHLOG_MAX ZSTD_WINDOWLOG_MAX
216
+ #define ZSTD_HASHLOG_MIN 12
217
+ #define ZSTD_HASHLOG3_MAX 17
218
+ //#define ZSTD_HASHLOG3_MIN 15
219
+ #define ZSTD_SEARCHLOG_MAX (ZSTD_WINDOWLOG_MAX-1)
220
+ #define ZSTD_SEARCHLOG_MIN 1
221
+ #define ZSTD_SEARCHLENGTH_MAX 7
222
+ #define ZSTD_SEARCHLENGTH_MIN 3
223
+ #define ZSTD_TARGETLENGTH_MIN 4
224
+ #define ZSTD_TARGETLENGTH_MAX 999
225
+
226
+ #define ZSTD_FRAMEHEADERSIZE_MAX 18 /* for static allocation */
227
+ static const size_t ZSTD_frameHeaderSize_min = 5;
228
+ static const size_t ZSTD_frameHeaderSize_max = ZSTD_FRAMEHEADERSIZE_MAX;
229
+ static const size_t ZSTD_skippableHeaderSize = 8; /* magic number + skippable frame length */
230
+
231
+
232
+ /*--- Types ---*/
233
+ typedef enum { ZSTD_fast, ZSTD_dfast, ZSTD_greedy, ZSTD_lazy, ZSTD_lazy2, ZSTD_btlazy2, ZSTD_btopt } ZSTD_strategy; /*< from faster to stronger */
234
+
235
+ typedef struct {
236
+ unsigned windowLog; /*< largest match distance : larger == more compression, more memory needed during decompression */
237
+ unsigned chainLog; /*< fully searched segment : larger == more compression, slower, more memory (useless for fast) */
238
+ unsigned hashLog; /*< dispatch table : larger == faster, more memory */
239
+ unsigned searchLog; /*< nb of searches : larger == more compression, slower */
240
+ unsigned searchLength; /*< match length searched : larger == faster decompression, sometimes less compression */
241
+ unsigned targetLength; /*< acceptable match size for optimal parser (only) : larger == more compression, slower */
242
+ ZSTD_strategy strategy;
243
+ } ZSTD_compressionParameters;
244
+
245
+ typedef struct {
246
+ unsigned contentSizeFlag; /*< 1: content size will be in frame header (if known). */
247
+ unsigned checksumFlag; /*< 1: will generate a 22-bits checksum at end of frame, to be used for error detection by decompressor */
248
+ unsigned noDictIDFlag; /*< 1: no dict ID will be saved into frame header (if dictionary compression) */
249
+ } ZSTD_frameParameters;
250
+
251
+ typedef struct {
252
+ ZSTD_compressionParameters cParams;
253
+ ZSTD_frameParameters fParams;
254
+ } ZSTD_parameters;
255
+
256
+ /* custom memory allocation functions */
257
+ typedef void* (*ZSTD_allocFunction) (void* opaque, size_t size);
258
+ typedef void (*ZSTD_freeFunction) (void* opaque, void* address);
259
+ typedef struct { ZSTD_allocFunction customAlloc; ZSTD_freeFunction customFree; void* opaque; } ZSTD_customMem;
260
+
261
+
262
+ /*-*************************************
263
+ * Advanced compression functions
264
+ ***************************************/
265
+ /*! ZSTD_estimateCCtxSize() :
266
+ * Gives the amount of memory allocated for a ZSTD_CCtx given a set of compression parameters.
267
+ * `frameContentSize` is an optional parameter, provide `0` if unknown */
268
+ ZSTDLIB_API size_t ZSTD_estimateCCtxSize(ZSTD_compressionParameters cParams);
269
+
270
+ /*! ZSTD_createCCtx_advanced() :
271
+ * Create a ZSTD compression context using external alloc and free functions */
272
+ ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx_advanced(ZSTD_customMem customMem);
273
+
274
+ /*! ZSTD_createCDict_advanced() :
275
+ * Create a ZSTD_CDict using external alloc and free, and customized compression parameters */
276
+ ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictSize,
277
+ ZSTD_parameters params, ZSTD_customMem customMem);
278
+
279
+ /*! ZSTD_sizeofCCtx() :
280
+ * Gives the amount of memory used by a given ZSTD_CCtx */
281
+ ZSTDLIB_API size_t ZSTD_sizeofCCtx(const ZSTD_CCtx* cctx);
282
+
283
+ ZSTDLIB_API unsigned ZSTD_maxCLevel (void);
284
+
285
+ /*! ZSTD_getParams() :
286
+ * same as ZSTD_getCParams(), but @return a full `ZSTD_parameters` object instead of a `ZSTD_compressionParameters`.
287
+ * All fields of `ZSTD_frameParameters` are set to default (0) */
288
+ ZSTD_parameters ZSTD_getParams(int compressionLevel, unsigned long long srcSize, size_t dictSize);
289
+
290
+ /*! ZSTD_getCParams() :
291
+ * @return ZSTD_compressionParameters structure for a selected compression level and srcSize.
292
+ * `srcSize` value is optional, select 0 if not known */
293
+ ZSTDLIB_API ZSTD_compressionParameters ZSTD_getCParams(int compressionLevel, unsigned long long srcSize, size_t dictSize);
294
+
295
+ /*! ZSTD_checkCParams() :
296
+ * Ensure param values remain within authorized range */
297
+ ZSTDLIB_API size_t ZSTD_checkCParams(ZSTD_compressionParameters params);
298
+
299
+ /*! ZSTD_adjustCParams() :
300
+ * optimize params for a given `srcSize` and `dictSize`.
301
+ * both values are optional, select `0` if unknown. */
302
+ ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParameters cPar, unsigned long long srcSize, size_t dictSize);
303
+
304
+ /*! ZSTD_compress_advanced() :
305
+ * Same as ZSTD_compress_usingDict(), with fine-tune control of each compression parameter */
306
+ ZSTDLIB_API size_t ZSTD_compress_advanced (ZSTD_CCtx* ctx,
307
+ void* dst, size_t dstCapacity,
308
+ const void* src, size_t srcSize,
309
+ const void* dict,size_t dictSize,
310
+ ZSTD_parameters params);
311
+
312
+
313
+ /*--- Advanced Decompression functions ---*/
314
+
315
+ /*! ZSTD_estimateDCtxSize() :
316
+ * Gives the potential amount of memory allocated to create a ZSTD_DCtx */
317
+ ZSTDLIB_API size_t ZSTD_estimateDCtxSize(void);
318
+
319
+ /*! ZSTD_createDCtx_advanced() :
320
+ * Create a ZSTD decompression context using external alloc and free functions */
321
+ ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx_advanced(ZSTD_customMem customMem);
322
+
323
+ /*! ZSTD_sizeofDCtx() :
324
+ * Gives the amount of memory used by a given ZSTD_DCtx */
325
+ ZSTDLIB_API size_t ZSTD_sizeofDCtx(const ZSTD_DCtx* dctx);
326
+
327
+
328
+ /* ******************************************************************
329
+ * Streaming functions (direct mode - synchronous and buffer-less)
330
+ ********************************************************************/
331
+ ZSTDLIB_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel);
332
+ ZSTDLIB_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel);
333
+ ZSTDLIB_API size_t ZSTD_compressBegin_advanced(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, ZSTD_parameters params, unsigned long long pledgedSrcSize);
334
+ ZSTDLIB_API size_t ZSTD_copyCCtx(ZSTD_CCtx* cctx, const ZSTD_CCtx* preparedCCtx);
335
+
336
+ ZSTDLIB_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
337
+ ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity);
338
+
339
+ /*
340
+ A ZSTD_CCtx object is required to track streaming operations.
341
+ Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource.
342
+ ZSTD_CCtx object can be re-used multiple times within successive compression operations.
343
+
344
+ Start by initializing a context.
345
+ Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression,
346
+ or ZSTD_compressBegin_advanced(), for finer parameter control.
347
+ It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx()
348
+
349
+ Then, consume your input using ZSTD_compressContinue().
350
+ There are some important considerations to keep in mind when using this advanced function :
351
+ - ZSTD_compressContinue() has no internal buffer. It uses externally provided buffer only.
352
+ - Interface is synchronous : input is consumed entirely and produce 1 (or more) compressed blocks.
353
+ - Caller must ensure there is enough space in `dst` to store compressed data under worst case scenario.
354
+ Worst case evaluation is provided by ZSTD_compressBound().
355
+ ZSTD_compressContinue() doesn't guarantee recover after a failed compression.
356
+ - ZSTD_compressContinue() presumes prior input ***is still accessible and unmodified*** (up to maximum distance size, see WindowLog).
357
+ It remembers all previous contiguous blocks, plus one separated memory segment (which can itself consists of multiple contiguous blocks)
358
+ - ZSTD_compressContinue() detects that prior input has been overwritten when `src` buffer overlaps.
359
+ In which case, it will "discard" the relevant memory section from its history.
360
+
361
+
362
+ Finish a frame with ZSTD_compressEnd(), which will write the epilogue.
363
+ Without epilogue, frames will be considered unfinished (broken) by decoders.
364
+
365
+ You can then reuse `ZSTD_CCtx` (ZSTD_compressBegin()) to compress some new frame.
366
+ */
367
+
368
+ typedef struct {
369
+ unsigned long long frameContentSize;
370
+ unsigned windowSize;
371
+ unsigned dictID;
372
+ unsigned checksumFlag;
373
+ } ZSTD_frameParams;
374
+
375
+ ZSTDLIB_API size_t ZSTD_getFrameParams(ZSTD_frameParams* fparamsPtr, const void* src, size_t srcSize); /**< doesn't consume input */
376
+
377
+ ZSTDLIB_API size_t ZSTD_decompressBegin(ZSTD_DCtx* dctx);
378
+ ZSTDLIB_API size_t ZSTD_decompressBegin_usingDict(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
379
+ ZSTDLIB_API void ZSTD_copyDCtx(ZSTD_DCtx* dctx, const ZSTD_DCtx* preparedDCtx);
380
+
381
+ ZSTDLIB_API size_t ZSTD_nextSrcSizeToDecompress(ZSTD_DCtx* dctx);
382
+ ZSTDLIB_API size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
383
+
384
+ /*
385
+ Streaming decompression, direct mode (bufferless)
386
+
387
+ A ZSTD_DCtx object is required to track streaming operations.
388
+ Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it.
389
+ A ZSTD_DCtx object can be re-used multiple times.
390
+
391
+ First optional operation is to retrieve frame parameters, using ZSTD_getFrameParams(), which doesn't consume the input.
392
+ It can provide the minimum size of rolling buffer required to properly decompress data (`windowSize`),
393
+ and optionally the final size of uncompressed content.
394
+ (Note : content size is an optional info that may not be present. 0 means : content size unknown)
395
+ Frame parameters are extracted from the beginning of compressed frame.
396
+ The amount of data to read is variable, from ZSTD_frameHeaderSize_min to ZSTD_frameHeaderSize_max (so if `srcSize` >= ZSTD_frameHeaderSize_max, it will always work)
397
+ If `srcSize` is too small for operation to succeed, function will return the minimum size it requires to produce a result.
398
+ Result : 0 when successful, it means the ZSTD_frameParams structure has been filled.
399
+ >0 : means there is not enough data into `src`. Provides the expected size to successfully decode header.
400
+ errorCode, which can be tested using ZSTD_isError()
401
+
402
+ Start decompression, with ZSTD_decompressBegin() or ZSTD_decompressBegin_usingDict().
403
+ Alternatively, you can copy a prepared context, using ZSTD_copyDCtx().
404
+
405
+ Then use ZSTD_nextSrcSizeToDecompress() and ZSTD_decompressContinue() alternatively.
406
+ ZSTD_nextSrcSizeToDecompress() tells how much bytes to provide as 'srcSize' to ZSTD_decompressContinue().
407
+ ZSTD_decompressContinue() requires this exact amount of bytes, or it will fail.
408
+
409
+ @result of ZSTD_decompressContinue() is the number of bytes regenerated within 'dst' (necessarily <= dstCapacity).
410
+ It can be zero, which is not an error; it just means ZSTD_decompressContinue() has decoded some header.
411
+
412
+ ZSTD_decompressContinue() needs previous data blocks during decompression, up to `windowSize`.
413
+ They should preferably be located contiguously, prior to current block.
414
+ Alternatively, a round buffer of sufficient size is also possible. Sufficient size is determined by frame parameters.
415
+ ZSTD_decompressContinue() is very sensitive to contiguity,
416
+ if 2 blocks don't follow each other, make sure that either the compressor breaks contiguity at the same place,
417
+ or that previous contiguous segment is large enough to properly handle maximum back-reference.
418
+
419
+ A frame is fully decoded when ZSTD_nextSrcSizeToDecompress() returns zero.
420
+ Context can then be reset to start a new decompression.
421
+
422
+
423
+ == Special case : skippable frames ==
424
+
425
+ Skippable frames allow the integration of user-defined data into a flow of concatenated frames.
426
+ Skippable frames will be ignored (skipped) by a decompressor. The format of skippable frame is following:
427
+ a) Skippable frame ID - 4 Bytes, Little endian format, any value from 0x184D2A50 to 0x184D2A5F
428
+ b) Frame Size - 4 Bytes, Little endian format, unsigned 32-bits
429
+ c) Frame Content - any content (User Data) of length equal to Frame Size
430
+ For skippable frames ZSTD_decompressContinue() always returns 0.
431
+ For skippable frames ZSTD_getFrameParams() returns fparamsPtr->windowLog==0 what means that a frame is skippable.
432
+ It also returns Frame Size as fparamsPtr->frameContentSize.
433
+ */
434
+
435
+
436
+ /* **************************************
437
+ * Block functions
438
+ ****************************************/
439
+ /*! Block functions produce and decode raw zstd blocks, without frame metadata.
440
+ Frame metadata cost is typically ~18 bytes, which is non-negligible on very small blocks.
441
+ User will have to take in charge required information to regenerate data, such as compressed and content sizes.
442
+
443
+ A few rules to respect :
444
+ - Uncompressed block size must be <= MIN (128 KB, 1 << windowLog)
445
+ + If you need to compress more, cut data into multiple blocks
446
+ + Consider using the regular ZSTD_compress() instead, as frame metadata costs become negligible when source size is large.
447
+ - Compressing and decompressing require a context structure
448
+ + Use ZSTD_createCCtx() and ZSTD_createDCtx()
449
+ - It is necessary to init context before starting
450
+ + compression : ZSTD_compressBegin()
451
+ + decompression : ZSTD_decompressBegin()
452
+ + variants _usingDict() are also allowed
453
+ + copyCCtx() and copyDCtx() work too
454
+ - When a block is considered not compressible enough, ZSTD_compressBlock() result will be zero.
455
+ In which case, nothing is produced into `dst`.
456
+ + User must test for such outcome and deal directly with uncompressed data
457
+ + ZSTD_decompressBlock() doesn't accept uncompressed data as input !!!
458
+ + In case of multiple successive blocks, decoder must be informed of uncompressed block existence to follow proper history.
459
+ Use ZSTD_insertBlock() in such a case.
460
+ Insert block once it's copied into its final position.
461
+ */
462
+
463
+ #define ZSTD_BLOCKSIZE_MAX (128 * 1024) /* define, for static allocation */
464
+ ZSTDLIB_API size_t ZSTD_compressBlock (ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
465
+ ZSTDLIB_API size_t ZSTD_decompressBlock(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
466
+ ZSTDLIB_API size_t ZSTD_insertBlock(ZSTD_DCtx* dctx, const void* blockStart, size_t blockSize); /**< insert block into `dctx` history. Useful to track uncompressed blocks */
467
+
468
+
469
+ #endif /* ZSTD_STATIC_LINKING_ONLY */
470
+
471
+ #if defined (__cplusplus)
472
+ }
473
+ #endif
474
+
475
+ #endif /* ZSTD_H_235446 */