zstd-ruby 1.5.5.0 → 1.5.6.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/README.md +81 -11
- data/ext/zstdruby/common.h +172 -1
- data/ext/zstdruby/extconf.rb +3 -1
- data/ext/zstdruby/libzstd/common/allocations.h +1 -1
- data/ext/zstdruby/libzstd/common/bitstream.h +49 -29
- data/ext/zstdruby/libzstd/common/compiler.h +114 -22
- data/ext/zstdruby/libzstd/common/cpu.h +36 -0
- data/ext/zstdruby/libzstd/common/debug.c +6 -0
- data/ext/zstdruby/libzstd/common/debug.h +20 -11
- data/ext/zstdruby/libzstd/common/error_private.h +45 -36
- data/ext/zstdruby/libzstd/common/fse.h +3 -2
- data/ext/zstdruby/libzstd/common/fse_decompress.c +19 -17
- data/ext/zstdruby/libzstd/common/huf.h +14 -1
- data/ext/zstdruby/libzstd/common/mem.h +0 -9
- data/ext/zstdruby/libzstd/common/pool.c +1 -1
- data/ext/zstdruby/libzstd/common/pool.h +1 -1
- data/ext/zstdruby/libzstd/common/portability_macros.h +2 -0
- data/ext/zstdruby/libzstd/common/threading.c +8 -2
- data/ext/zstdruby/libzstd/common/xxhash.c +5 -11
- data/ext/zstdruby/libzstd/common/xxhash.h +2341 -1007
- data/ext/zstdruby/libzstd/common/zstd_internal.h +5 -5
- data/ext/zstdruby/libzstd/compress/fse_compress.c +8 -7
- data/ext/zstdruby/libzstd/compress/huf_compress.c +54 -25
- data/ext/zstdruby/libzstd/compress/zstd_compress.c +282 -161
- data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +29 -27
- data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +224 -113
- data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +19 -13
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +17 -5
- data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +11 -0
- data/ext/zstdruby/libzstd/compress/zstd_fast.c +14 -6
- data/ext/zstdruby/libzstd/compress/zstd_lazy.c +129 -87
- data/ext/zstdruby/libzstd/compress/zstd_lazy.h +103 -28
- data/ext/zstdruby/libzstd/compress/zstd_ldm.c +8 -2
- data/ext/zstdruby/libzstd/compress/zstd_opt.c +216 -112
- data/ext/zstdruby/libzstd/compress/zstd_opt.h +31 -7
- data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +94 -79
- data/ext/zstdruby/libzstd/decompress/huf_decompress.c +188 -126
- data/ext/zstdruby/libzstd/decompress/huf_decompress_amd64.S +38 -19
- data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +84 -32
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +231 -208
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +1 -1
- data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +2 -0
- data/ext/zstdruby/libzstd/dictBuilder/cover.c +16 -12
- data/ext/zstdruby/libzstd/dictBuilder/cover.h +2 -8
- data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +2 -2
- data/ext/zstdruby/libzstd/dictBuilder/zdict.c +12 -6
- data/ext/zstdruby/libzstd/zstd.h +129 -60
- data/ext/zstdruby/main.c +2 -1
- data/ext/zstdruby/skippable_frame.c +1 -1
- data/ext/zstdruby/streaming_compress.c +75 -23
- data/ext/zstdruby/streaming_decompress.c +41 -40
- data/ext/zstdruby/zstdruby.c +60 -52
- data/lib/zstd-ruby/stream_reader.rb +22 -0
- data/lib/zstd-ruby/stream_writer.rb +23 -0
- data/lib/zstd-ruby/version.rb +1 -1
- data/lib/zstd-ruby.rb +2 -0
- data/renovate.json +6 -0
- data/zstd-ruby.gemspec +2 -1
- metadata +20 -4
- data/ext/zstdruby/streaming_compress.h +0 -5
@@ -47,7 +47,7 @@ typedef enum {
|
|
47
47
|
*/
|
48
48
|
size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
|
49
49
|
void* dst, size_t dstCapacity,
|
50
|
-
const void* src, size_t srcSize, const
|
50
|
+
const void* src, size_t srcSize, const streaming_operation streaming);
|
51
51
|
|
52
52
|
/* ZSTD_buildFSETable() :
|
53
53
|
* generate FSE decoding table for one symbol (ll, ml or off)
|
@@ -153,6 +153,7 @@ struct ZSTD_DCtx_s
|
|
153
153
|
size_t litSize;
|
154
154
|
size_t rleSize;
|
155
155
|
size_t staticSize;
|
156
|
+
int isFrameDecompression;
|
156
157
|
#if DYNAMIC_BMI2 != 0
|
157
158
|
int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */
|
158
159
|
#endif
|
@@ -166,6 +167,7 @@ struct ZSTD_DCtx_s
|
|
166
167
|
ZSTD_DDictHashSet* ddictSet; /* Hash set for multiple ddicts */
|
167
168
|
ZSTD_refMultipleDDicts_e refMultipleDDicts; /* User specified: if == 1, will allow references to multiple DDicts. Default == 0 (disabled) */
|
168
169
|
int disableHufAsm;
|
170
|
+
int maxBlockSizeParam;
|
169
171
|
|
170
172
|
/* streaming */
|
171
173
|
ZSTD_dStreamStage streamStage;
|
@@ -31,8 +31,8 @@
|
|
31
31
|
#endif
|
32
32
|
|
33
33
|
#include "../common/mem.h" /* read */
|
34
|
-
#include "../common/pool.h"
|
35
|
-
#include "../common/threading.h"
|
34
|
+
#include "../common/pool.h" /* POOL_ctx */
|
35
|
+
#include "../common/threading.h" /* ZSTD_pthread_mutex_t */
|
36
36
|
#include "../common/zstd_internal.h" /* includes zstd.h */
|
37
37
|
#include "../common/bits.h" /* ZSTD_highbit32 */
|
38
38
|
#include "../zdict.h"
|
@@ -78,7 +78,7 @@ static clock_t g_time = 0;
|
|
78
78
|
#undef LOCALDISPLAYUPDATE
|
79
79
|
#define LOCALDISPLAYUPDATE(displayLevel, l, ...) \
|
80
80
|
if (displayLevel >= l) { \
|
81
|
-
if ((clock() - g_time > g_refreshRate) || (displayLevel >= 4)) {
|
81
|
+
if ((clock() - g_time > g_refreshRate) || (displayLevel >= 4)) { \
|
82
82
|
g_time = clock(); \
|
83
83
|
DISPLAY(__VA_ARGS__); \
|
84
84
|
} \
|
@@ -301,9 +301,10 @@ static int WIN_CDECL COVER_strict_cmp8(const void *lp, const void *rp) {
|
|
301
301
|
* Returns the first pointer in [first, last) whose element does not compare
|
302
302
|
* less than value. If no such element exists it returns last.
|
303
303
|
*/
|
304
|
-
static const size_t *COVER_lower_bound(const size_t
|
304
|
+
static const size_t *COVER_lower_bound(const size_t* first, const size_t* last,
|
305
305
|
size_t value) {
|
306
|
-
size_t count = last - first;
|
306
|
+
size_t count = (size_t)(last - first);
|
307
|
+
assert(last >= first);
|
307
308
|
while (count != 0) {
|
308
309
|
size_t step = count / 2;
|
309
310
|
const size_t *ptr = first;
|
@@ -549,7 +550,8 @@ static void COVER_ctx_destroy(COVER_ctx_t *ctx) {
|
|
549
550
|
*/
|
550
551
|
static size_t COVER_ctx_init(COVER_ctx_t *ctx, const void *samplesBuffer,
|
551
552
|
const size_t *samplesSizes, unsigned nbSamples,
|
552
|
-
unsigned d, double splitPoint)
|
553
|
+
unsigned d, double splitPoint)
|
554
|
+
{
|
553
555
|
const BYTE *const samples = (const BYTE *)samplesBuffer;
|
554
556
|
const size_t totalSamplesSize = COVER_sum(samplesSizes, nbSamples);
|
555
557
|
/* Split samples into testing and training sets */
|
@@ -733,7 +735,7 @@ static size_t COVER_buildDictionary(const COVER_ctx_t *ctx, U32 *freqs,
|
|
733
735
|
return tail;
|
734
736
|
}
|
735
737
|
|
736
|
-
|
738
|
+
ZDICTLIB_STATIC_API size_t ZDICT_trainFromBuffer_cover(
|
737
739
|
void *dictBuffer, size_t dictBufferCapacity,
|
738
740
|
const void *samplesBuffer, const size_t *samplesSizes, unsigned nbSamples,
|
739
741
|
ZDICT_cover_params_t parameters)
|
@@ -907,8 +909,10 @@ void COVER_best_start(COVER_best_t *best) {
|
|
907
909
|
* Decrements liveJobs and signals any waiting threads if liveJobs == 0.
|
908
910
|
* If this dictionary is the best so far save it and its parameters.
|
909
911
|
*/
|
910
|
-
void COVER_best_finish(COVER_best_t
|
911
|
-
|
912
|
+
void COVER_best_finish(COVER_best_t* best,
|
913
|
+
ZDICT_cover_params_t parameters,
|
914
|
+
COVER_dictSelection_t selection)
|
915
|
+
{
|
912
916
|
void* dict = selection.dictContent;
|
913
917
|
size_t compressedSize = selection.totalCompressedSize;
|
914
918
|
size_t dictSize = selection.dictSize;
|
@@ -980,8 +984,8 @@ COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent, size_t dictBuffe
|
|
980
984
|
size_t largestCompressed = 0;
|
981
985
|
BYTE* customDictContentEnd = customDictContent + dictContentSize;
|
982
986
|
|
983
|
-
BYTE
|
984
|
-
BYTE
|
987
|
+
BYTE* largestDictbuffer = (BYTE*)malloc(dictBufferCapacity);
|
988
|
+
BYTE* candidateDictBuffer = (BYTE*)malloc(dictBufferCapacity);
|
985
989
|
double regressionTolerance = ((double)params.shrinkDictMaxRegression / 100.0) + 1.00;
|
986
990
|
|
987
991
|
if (!largestDictbuffer || !candidateDictBuffer) {
|
@@ -1119,7 +1123,7 @@ _cleanup:
|
|
1119
1123
|
free(freqs);
|
1120
1124
|
}
|
1121
1125
|
|
1122
|
-
|
1126
|
+
ZDICTLIB_STATIC_API size_t ZDICT_optimizeTrainFromBuffer_cover(
|
1123
1127
|
void* dictBuffer, size_t dictBufferCapacity, const void* samplesBuffer,
|
1124
1128
|
const size_t* samplesSizes, unsigned nbSamples,
|
1125
1129
|
ZDICT_cover_params_t* parameters)
|
@@ -12,14 +12,8 @@
|
|
12
12
|
# define ZDICT_STATIC_LINKING_ONLY
|
13
13
|
#endif
|
14
14
|
|
15
|
-
#include
|
16
|
-
#include
|
17
|
-
#include <string.h> /* memset */
|
18
|
-
#include <time.h> /* clock */
|
19
|
-
#include "../common/mem.h" /* read */
|
20
|
-
#include "../common/pool.h"
|
21
|
-
#include "../common/threading.h"
|
22
|
-
#include "../common/zstd_internal.h" /* includes zstd.h */
|
15
|
+
#include "../common/threading.h" /* ZSTD_pthread_mutex_t */
|
16
|
+
#include "../common/mem.h" /* U32, BYTE */
|
23
17
|
#include "../zdict.h"
|
24
18
|
|
25
19
|
/**
|
@@ -545,7 +545,7 @@ FASTCOVER_convertToFastCoverParams(ZDICT_cover_params_t coverParams,
|
|
545
545
|
}
|
546
546
|
|
547
547
|
|
548
|
-
|
548
|
+
ZDICTLIB_STATIC_API size_t
|
549
549
|
ZDICT_trainFromBuffer_fastCover(void* dictBuffer, size_t dictBufferCapacity,
|
550
550
|
const void* samplesBuffer,
|
551
551
|
const size_t* samplesSizes, unsigned nbSamples,
|
@@ -614,7 +614,7 @@ ZDICT_trainFromBuffer_fastCover(void* dictBuffer, size_t dictBufferCapacity,
|
|
614
614
|
}
|
615
615
|
|
616
616
|
|
617
|
-
|
617
|
+
ZDICTLIB_STATIC_API size_t
|
618
618
|
ZDICT_optimizeTrainFromBuffer_fastCover(
|
619
619
|
void* dictBuffer, size_t dictBufferCapacity,
|
620
620
|
const void* samplesBuffer,
|
@@ -74,9 +74,9 @@ static const U32 g_selectivity_default = 9;
|
|
74
74
|
* Console display
|
75
75
|
***************************************/
|
76
76
|
#undef DISPLAY
|
77
|
-
#define DISPLAY(...) { fprintf(stderr, __VA_ARGS__); fflush( stderr ); }
|
77
|
+
#define DISPLAY(...) do { fprintf(stderr, __VA_ARGS__); fflush( stderr ); } while (0)
|
78
78
|
#undef DISPLAYLEVEL
|
79
|
-
#define DISPLAYLEVEL(l, ...) if (notificationLevel>=l) { DISPLAY(__VA_ARGS__); } /* 0 : no display; 1: errors; 2: default; 3: details; 4: debug */
|
79
|
+
#define DISPLAYLEVEL(l, ...) do { if (notificationLevel>=l) { DISPLAY(__VA_ARGS__); } } while (0) /* 0 : no display; 1: errors; 2: default; 3: details; 4: debug */
|
80
80
|
|
81
81
|
static clock_t ZDICT_clockSpan(clock_t nPrevious) { return clock() - nPrevious; }
|
82
82
|
|
@@ -477,10 +477,16 @@ static size_t ZDICT_trainBuffer_legacy(dictItem* dictList, U32 dictListSize,
|
|
477
477
|
clock_t const refreshRate = CLOCKS_PER_SEC * 3 / 10;
|
478
478
|
|
479
479
|
# undef DISPLAYUPDATE
|
480
|
-
# define DISPLAYUPDATE(l, ...)
|
481
|
-
|
482
|
-
|
483
|
-
|
480
|
+
# define DISPLAYUPDATE(l, ...) \
|
481
|
+
do { \
|
482
|
+
if (notificationLevel>=l) { \
|
483
|
+
if (ZDICT_clockSpan(displayClock) > refreshRate) { \
|
484
|
+
displayClock = clock(); \
|
485
|
+
DISPLAY(__VA_ARGS__); \
|
486
|
+
} \
|
487
|
+
if (notificationLevel>=4) fflush(stderr); \
|
488
|
+
} \
|
489
|
+
} while (0)
|
484
490
|
|
485
491
|
/* init */
|
486
492
|
DISPLAYLEVEL(2, "\r%70s\r", ""); /* clean display line */
|
data/ext/zstdruby/libzstd/zstd.h
CHANGED
@@ -106,7 +106,7 @@ extern "C" {
|
|
106
106
|
/*------ Version ------*/
|
107
107
|
#define ZSTD_VERSION_MAJOR 1
|
108
108
|
#define ZSTD_VERSION_MINOR 5
|
109
|
-
#define ZSTD_VERSION_RELEASE
|
109
|
+
#define ZSTD_VERSION_RELEASE 6
|
110
110
|
#define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
|
111
111
|
|
112
112
|
/*! ZSTD_versionNumber() :
|
@@ -228,7 +228,7 @@ ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize)
|
|
228
228
|
* for example to size a static array on stack.
|
229
229
|
* Will produce constant value 0 if srcSize too large.
|
230
230
|
*/
|
231
|
-
#define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ?
|
231
|
+
#define ZSTD_MAX_INPUT_SIZE ((sizeof(size_t)==8) ? 0xFF00FF00FF00FF00ULL : 0xFF00FF00U)
|
232
232
|
#define ZSTD_COMPRESSBOUND(srcSize) (((size_t)(srcSize) >= ZSTD_MAX_INPUT_SIZE) ? 0 : (srcSize) + ((srcSize)>>8) + (((srcSize) < (128<<10)) ? (((128<<10) - (srcSize)) >> 11) /* margin, from 64 to 0 */ : 0)) /* this formula ensures that bound(A) + bound(B) <= bound(A+B) as long as A and B >= 128 KB */
|
233
233
|
ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
|
234
234
|
/* ZSTD_isError() :
|
@@ -249,7 +249,7 @@ ZSTDLIB_API int ZSTD_defaultCLevel(void); /*!< default compres
|
|
249
249
|
/*= Compression context
|
250
250
|
* When compressing many times,
|
251
251
|
* it is recommended to allocate a context just once,
|
252
|
-
* and
|
252
|
+
* and reuse it for each successive compression operation.
|
253
253
|
* This will make workload friendlier for system's memory.
|
254
254
|
* Note : re-using context is just a speed / resource optimization.
|
255
255
|
* It doesn't change the compression ratio, which remains identical.
|
@@ -262,9 +262,9 @@ ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); /* accept NULL pointer *
|
|
262
262
|
|
263
263
|
/*! ZSTD_compressCCtx() :
|
264
264
|
* Same as ZSTD_compress(), using an explicit ZSTD_CCtx.
|
265
|
-
* Important : in order to
|
266
|
-
* this function compresses at requested compression level,
|
267
|
-
* __ignoring any other parameter__ .
|
265
|
+
* Important : in order to mirror `ZSTD_compress()` behavior,
|
266
|
+
* this function compresses at the requested compression level,
|
267
|
+
* __ignoring any other advanced parameter__ .
|
268
268
|
* If any advanced parameter was set using the advanced API,
|
269
269
|
* they will all be reset. Only `compressionLevel` remains.
|
270
270
|
*/
|
@@ -276,7 +276,7 @@ ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx,
|
|
276
276
|
/*= Decompression context
|
277
277
|
* When decompressing many times,
|
278
278
|
* it is recommended to allocate a context only once,
|
279
|
-
* and
|
279
|
+
* and reuse it for each successive compression operation.
|
280
280
|
* This will make workload friendlier for system's memory.
|
281
281
|
* Use one context per thread for parallel execution. */
|
282
282
|
typedef struct ZSTD_DCtx_s ZSTD_DCtx;
|
@@ -286,7 +286,7 @@ ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /* accept NULL pointer *
|
|
286
286
|
/*! ZSTD_decompressDCtx() :
|
287
287
|
* Same as ZSTD_decompress(),
|
288
288
|
* requires an allocated ZSTD_DCtx.
|
289
|
-
* Compatible with sticky parameters.
|
289
|
+
* Compatible with sticky parameters (see below).
|
290
290
|
*/
|
291
291
|
ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx,
|
292
292
|
void* dst, size_t dstCapacity,
|
@@ -302,12 +302,12 @@ ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx,
|
|
302
302
|
* using ZSTD_CCtx_set*() functions.
|
303
303
|
* Pushed parameters are sticky : they are valid for next compressed frame, and any subsequent frame.
|
304
304
|
* "sticky" parameters are applicable to `ZSTD_compress2()` and `ZSTD_compressStream*()` !
|
305
|
-
* __They do not apply to
|
305
|
+
* __They do not apply to one-shot variants such as ZSTD_compressCCtx()__ .
|
306
306
|
*
|
307
307
|
* It's possible to reset all parameters to "default" using ZSTD_CCtx_reset().
|
308
308
|
*
|
309
309
|
* This API supersedes all other "advanced" API entry points in the experimental section.
|
310
|
-
* In the future, we expect to remove
|
310
|
+
* In the future, we expect to remove API entry points from experimental which are redundant with this API.
|
311
311
|
*/
|
312
312
|
|
313
313
|
|
@@ -390,6 +390,19 @@ typedef enum {
|
|
390
390
|
* The higher the value of selected strategy, the more complex it is,
|
391
391
|
* resulting in stronger and slower compression.
|
392
392
|
* Special: value 0 means "use default strategy". */
|
393
|
+
|
394
|
+
ZSTD_c_targetCBlockSize=130, /* v1.5.6+
|
395
|
+
* Attempts to fit compressed block size into approximatively targetCBlockSize.
|
396
|
+
* Bound by ZSTD_TARGETCBLOCKSIZE_MIN and ZSTD_TARGETCBLOCKSIZE_MAX.
|
397
|
+
* Note that it's not a guarantee, just a convergence target (default:0).
|
398
|
+
* No target when targetCBlockSize == 0.
|
399
|
+
* This is helpful in low bandwidth streaming environments to improve end-to-end latency,
|
400
|
+
* when a client can make use of partial documents (a prominent example being Chrome).
|
401
|
+
* Note: this parameter is stable since v1.5.6.
|
402
|
+
* It was present as an experimental parameter in earlier versions,
|
403
|
+
* but it's not recommended using it with earlier library versions
|
404
|
+
* due to massive performance regressions.
|
405
|
+
*/
|
393
406
|
/* LDM mode parameters */
|
394
407
|
ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching.
|
395
408
|
* This parameter is designed to improve compression ratio
|
@@ -469,7 +482,6 @@ typedef enum {
|
|
469
482
|
* ZSTD_c_forceMaxWindow
|
470
483
|
* ZSTD_c_forceAttachDict
|
471
484
|
* ZSTD_c_literalCompressionMode
|
472
|
-
* ZSTD_c_targetCBlockSize
|
473
485
|
* ZSTD_c_srcSizeHint
|
474
486
|
* ZSTD_c_enableDedicatedDictSearch
|
475
487
|
* ZSTD_c_stableInBuffer
|
@@ -490,7 +502,7 @@ typedef enum {
|
|
490
502
|
ZSTD_c_experimentalParam3=1000,
|
491
503
|
ZSTD_c_experimentalParam4=1001,
|
492
504
|
ZSTD_c_experimentalParam5=1002,
|
493
|
-
ZSTD_c_experimentalParam6=1003
|
505
|
+
/* was ZSTD_c_experimentalParam6=1003; is now ZSTD_c_targetCBlockSize */
|
494
506
|
ZSTD_c_experimentalParam7=1004,
|
495
507
|
ZSTD_c_experimentalParam8=1005,
|
496
508
|
ZSTD_c_experimentalParam9=1006,
|
@@ -575,6 +587,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_reset(ZSTD_CCtx* cctx, ZSTD_ResetDirective reset);
|
|
575
587
|
|
576
588
|
/*! ZSTD_compress2() :
|
577
589
|
* Behave the same as ZSTD_compressCCtx(), but compression parameters are set using the advanced API.
|
590
|
+
* (note that this entry point doesn't even expose a compression level parameter).
|
578
591
|
* ZSTD_compress2() always starts a new frame.
|
579
592
|
* Should cctx hold data from a previously unfinished frame, everything about it is forgotten.
|
580
593
|
* - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()
|
@@ -618,6 +631,7 @@ typedef enum {
|
|
618
631
|
* ZSTD_d_forceIgnoreChecksum
|
619
632
|
* ZSTD_d_refMultipleDDicts
|
620
633
|
* ZSTD_d_disableHuffmanAssembly
|
634
|
+
* ZSTD_d_maxBlockSize
|
621
635
|
* Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
|
622
636
|
* note : never ever use experimentalParam? names directly
|
623
637
|
*/
|
@@ -625,7 +639,8 @@ typedef enum {
|
|
625
639
|
ZSTD_d_experimentalParam2=1001,
|
626
640
|
ZSTD_d_experimentalParam3=1002,
|
627
641
|
ZSTD_d_experimentalParam4=1003,
|
628
|
-
ZSTD_d_experimentalParam5=1004
|
642
|
+
ZSTD_d_experimentalParam5=1004,
|
643
|
+
ZSTD_d_experimentalParam6=1005
|
629
644
|
|
630
645
|
} ZSTD_dParameter;
|
631
646
|
|
@@ -680,14 +695,14 @@ typedef struct ZSTD_outBuffer_s {
|
|
680
695
|
* A ZSTD_CStream object is required to track streaming operation.
|
681
696
|
* Use ZSTD_createCStream() and ZSTD_freeCStream() to create/release resources.
|
682
697
|
* ZSTD_CStream objects can be reused multiple times on consecutive compression operations.
|
683
|
-
* It is recommended to
|
698
|
+
* It is recommended to reuse ZSTD_CStream since it will play nicer with system's memory, by re-using already allocated memory.
|
684
699
|
*
|
685
700
|
* For parallel execution, use one separate ZSTD_CStream per thread.
|
686
701
|
*
|
687
702
|
* note : since v1.3.0, ZSTD_CStream and ZSTD_CCtx are the same thing.
|
688
703
|
*
|
689
704
|
* Parameters are sticky : when starting a new compression on the same context,
|
690
|
-
* it will
|
705
|
+
* it will reuse the same sticky parameters as previous compression session.
|
691
706
|
* When in doubt, it's recommended to fully initialize the context before usage.
|
692
707
|
* Use ZSTD_CCtx_reset() to reset the context and ZSTD_CCtx_setParameter(),
|
693
708
|
* ZSTD_CCtx_setPledgedSrcSize(), or ZSTD_CCtx_loadDictionary() and friends to
|
@@ -776,6 +791,11 @@ typedef enum {
|
|
776
791
|
* only ZSTD_e_end or ZSTD_e_flush operations are allowed.
|
777
792
|
* Before starting a new compression job, or changing compression parameters,
|
778
793
|
* it is required to fully flush internal buffers.
|
794
|
+
* - note: if an operation ends with an error, it may leave @cctx in an undefined state.
|
795
|
+
* Therefore, it's UB to invoke ZSTD_compressStream2() of ZSTD_compressStream() on such a state.
|
796
|
+
* In order to be re-employed after an error, a state must be reset,
|
797
|
+
* which can be done explicitly (ZSTD_CCtx_reset()),
|
798
|
+
* or is sometimes implied by methods starting a new compression job (ZSTD_initCStream(), ZSTD_compressCCtx())
|
779
799
|
*/
|
780
800
|
ZSTDLIB_API size_t ZSTD_compressStream2( ZSTD_CCtx* cctx,
|
781
801
|
ZSTD_outBuffer* output,
|
@@ -835,7 +855,7 @@ ZSTDLIB_API size_t ZSTD_endStream(ZSTD_CStream* zcs, ZSTD_outBuffer* output);
|
|
835
855
|
*
|
836
856
|
* A ZSTD_DStream object is required to track streaming operations.
|
837
857
|
* Use ZSTD_createDStream() and ZSTD_freeDStream() to create/release resources.
|
838
|
-
* ZSTD_DStream objects can be
|
858
|
+
* ZSTD_DStream objects can be reused multiple times.
|
839
859
|
*
|
840
860
|
* Use ZSTD_initDStream() to start a new decompression operation.
|
841
861
|
* @return : recommended first input size
|
@@ -889,6 +909,12 @@ ZSTDLIB_API size_t ZSTD_initDStream(ZSTD_DStream* zds);
|
|
889
909
|
* @return : 0 when a frame is completely decoded and fully flushed,
|
890
910
|
* or an error code, which can be tested using ZSTD_isError(),
|
891
911
|
* or any other value > 0, which means there is some decoding or flushing to do to complete current frame.
|
912
|
+
*
|
913
|
+
* Note: when an operation returns with an error code, the @zds state may be left in undefined state.
|
914
|
+
* It's UB to invoke `ZSTD_decompressStream()` on such a state.
|
915
|
+
* In order to re-use such a state, it must be first reset,
|
916
|
+
* which can be done explicitly (`ZSTD_DCtx_reset()`),
|
917
|
+
* or is implied for operations starting some new decompression job (`ZSTD_initDStream`, `ZSTD_decompressDCtx()`, `ZSTD_decompress_usingDict()`)
|
892
918
|
*/
|
893
919
|
ZSTDLIB_API size_t ZSTD_decompressStream(ZSTD_DStream* zds, ZSTD_outBuffer* output, ZSTD_inBuffer* input);
|
894
920
|
|
@@ -1021,7 +1047,7 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
|
|
1021
1047
|
*
|
1022
1048
|
* This API allows dictionaries to be used with ZSTD_compress2(),
|
1023
1049
|
* ZSTD_compressStream2(), and ZSTD_decompressDCtx().
|
1024
|
-
* Dictionaries are sticky, they remain valid when same context is
|
1050
|
+
* Dictionaries are sticky, they remain valid when same context is reused,
|
1025
1051
|
* they only reset when the context is reset
|
1026
1052
|
* with ZSTD_reset_parameters or ZSTD_reset_session_and_parameters.
|
1027
1053
|
* In contrast, Prefixes are single-use.
|
@@ -1239,7 +1265,7 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
|
|
1239
1265
|
#define ZSTD_LDM_HASHRATELOG_MAX (ZSTD_WINDOWLOG_MAX - ZSTD_HASHLOG_MIN)
|
1240
1266
|
|
1241
1267
|
/* Advanced parameter bounds */
|
1242
|
-
#define ZSTD_TARGETCBLOCKSIZE_MIN
|
1268
|
+
#define ZSTD_TARGETCBLOCKSIZE_MIN 1340 /* suitable to fit into an ethernet / wifi / 4G transport frame */
|
1243
1269
|
#define ZSTD_TARGETCBLOCKSIZE_MAX ZSTD_BLOCKSIZE_MAX
|
1244
1270
|
#define ZSTD_SRCSIZEHINT_MIN 0
|
1245
1271
|
#define ZSTD_SRCSIZEHINT_MAX INT_MAX
|
@@ -1527,25 +1553,38 @@ typedef enum {
|
|
1527
1553
|
ZSTDLIB_STATIC_API size_t ZSTD_sequenceBound(size_t srcSize);
|
1528
1554
|
|
1529
1555
|
/*! ZSTD_generateSequences() :
|
1556
|
+
* WARNING: This function is meant for debugging and informational purposes ONLY!
|
1557
|
+
* Its implementation is flawed, and it will be deleted in a future version.
|
1558
|
+
* It is not guaranteed to succeed, as there are several cases where it will give
|
1559
|
+
* up and fail. You should NOT use this function in production code.
|
1560
|
+
*
|
1561
|
+
* This function is deprecated, and will be removed in a future version.
|
1562
|
+
*
|
1530
1563
|
* Generate sequences using ZSTD_compress2(), given a source buffer.
|
1531
1564
|
*
|
1565
|
+
* @param zc The compression context to be used for ZSTD_compress2(). Set any
|
1566
|
+
* compression parameters you need on this context.
|
1567
|
+
* @param outSeqs The output sequences buffer of size @p outSeqsSize
|
1568
|
+
* @param outSeqsSize The size of the output sequences buffer.
|
1569
|
+
* ZSTD_sequenceBound(srcSize) is an upper bound on the number
|
1570
|
+
* of sequences that can be generated.
|
1571
|
+
* @param src The source buffer to generate sequences from of size @p srcSize.
|
1572
|
+
* @param srcSize The size of the source buffer.
|
1573
|
+
*
|
1532
1574
|
* Each block will end with a dummy sequence
|
1533
1575
|
* with offset == 0, matchLength == 0, and litLength == length of last literals.
|
1534
1576
|
* litLength may be == 0, and if so, then the sequence of (of: 0 ml: 0 ll: 0)
|
1535
1577
|
* simply acts as a block delimiter.
|
1536
1578
|
*
|
1537
|
-
* @
|
1538
|
-
*
|
1539
|
-
*
|
1540
|
-
* The output of this function can be fed into ZSTD_compressSequences() with CCtx
|
1541
|
-
* setting of ZSTD_c_blockDelimiters as ZSTD_sf_explicitBlockDelimiters
|
1542
|
-
* @return : number of sequences generated
|
1579
|
+
* @returns The number of sequences generated, necessarily less than
|
1580
|
+
* ZSTD_sequenceBound(srcSize), or an error code that can be checked
|
1581
|
+
* with ZSTD_isError().
|
1543
1582
|
*/
|
1544
|
-
|
1583
|
+
ZSTD_DEPRECATED("For debugging only, will be replaced by ZSTD_extractSequences()")
|
1545
1584
|
ZSTDLIB_STATIC_API size_t
|
1546
|
-
ZSTD_generateSequences(
|
1547
|
-
|
1548
|
-
|
1585
|
+
ZSTD_generateSequences(ZSTD_CCtx* zc,
|
1586
|
+
ZSTD_Sequence* outSeqs, size_t outSeqsSize,
|
1587
|
+
const void* src, size_t srcSize);
|
1549
1588
|
|
1550
1589
|
/*! ZSTD_mergeBlockDelimiters() :
|
1551
1590
|
* Given an array of ZSTD_Sequence, remove all sequences that represent block delimiters/last literals
|
@@ -1640,56 +1679,59 @@ ZSTDLIB_API unsigned ZSTD_isSkippableFrame(const void* buffer, size_t size);
|
|
1640
1679
|
/*! ZSTD_estimate*() :
|
1641
1680
|
* These functions make it possible to estimate memory usage
|
1642
1681
|
* of a future {D,C}Ctx, before its creation.
|
1682
|
+
* This is useful in combination with ZSTD_initStatic(),
|
1683
|
+
* which makes it possible to employ a static buffer for ZSTD_CCtx* state.
|
1643
1684
|
*
|
1644
1685
|
* ZSTD_estimateCCtxSize() will provide a memory budget large enough
|
1645
|
-
*
|
1646
|
-
*
|
1647
|
-
* does not include space for a window buffer.
|
1648
|
-
* Therefore, the estimation is only guaranteed for single-shot compressions, not streaming.
|
1686
|
+
* to compress data of any size using one-shot compression ZSTD_compressCCtx() or ZSTD_compress2()
|
1687
|
+
* associated with any compression level up to max specified one.
|
1649
1688
|
* The estimate will assume the input may be arbitrarily large,
|
1650
1689
|
* which is the worst case.
|
1651
1690
|
*
|
1691
|
+
* Note that the size estimation is specific for one-shot compression,
|
1692
|
+
* it is not valid for streaming (see ZSTD_estimateCStreamSize*())
|
1693
|
+
* nor other potential ways of using a ZSTD_CCtx* state.
|
1694
|
+
*
|
1652
1695
|
* When srcSize can be bound by a known and rather "small" value,
|
1653
|
-
* this
|
1654
|
-
* because the
|
1655
|
-
* This tighter estimation can be provided by more advanced functions
|
1696
|
+
* this knowledge can be used to provide a tighter budget estimation
|
1697
|
+
* because the ZSTD_CCtx* state will need less memory for small inputs.
|
1698
|
+
* This tighter estimation can be provided by employing more advanced functions
|
1656
1699
|
* ZSTD_estimateCCtxSize_usingCParams(), which can be used in tandem with ZSTD_getCParams(),
|
1657
1700
|
* and ZSTD_estimateCCtxSize_usingCCtxParams(), which can be used in tandem with ZSTD_CCtxParams_setParameter().
|
1658
1701
|
* Both can be used to estimate memory using custom compression parameters and arbitrary srcSize limits.
|
1659
1702
|
*
|
1660
1703
|
* Note : only single-threaded compression is supported.
|
1661
1704
|
* ZSTD_estimateCCtxSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.
|
1662
|
-
*
|
1663
|
-
* Note 2 : ZSTD_estimateCCtxSize* functions are not compatible with the Block-Level Sequence Producer API at this time.
|
1664
|
-
* Size estimates assume that no external sequence producer is registered.
|
1665
1705
|
*/
|
1666
|
-
ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int
|
1706
|
+
ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize(int maxCompressionLevel);
|
1667
1707
|
ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCParams(ZSTD_compressionParameters cParams);
|
1668
1708
|
ZSTDLIB_STATIC_API size_t ZSTD_estimateCCtxSize_usingCCtxParams(const ZSTD_CCtx_params* params);
|
1669
1709
|
ZSTDLIB_STATIC_API size_t ZSTD_estimateDCtxSize(void);
|
1670
1710
|
|
1671
1711
|
/*! ZSTD_estimateCStreamSize() :
|
1672
|
-
* ZSTD_estimateCStreamSize() will provide a budget large enough for
|
1673
|
-
*
|
1712
|
+
* ZSTD_estimateCStreamSize() will provide a memory budget large enough for streaming compression
|
1713
|
+
* using any compression level up to the max specified one.
|
1714
|
+
* It will also consider src size to be arbitrarily "large", which is a worst case scenario.
|
1674
1715
|
* If srcSize is known to always be small, ZSTD_estimateCStreamSize_usingCParams() can provide a tighter estimation.
|
1675
1716
|
* ZSTD_estimateCStreamSize_usingCParams() can be used in tandem with ZSTD_getCParams() to create cParams from compressionLevel.
|
1676
1717
|
* 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.
|
1677
1718
|
* Note : CStream size estimation is only correct for single-threaded compression.
|
1678
|
-
*
|
1719
|
+
* ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.
|
1720
|
+
* Note 2 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time.
|
1721
|
+
* Size estimates assume that no external sequence producer is registered.
|
1722
|
+
*
|
1723
|
+
* ZSTD_DStream memory budget depends on frame's window Size.
|
1679
1724
|
* This information can be passed manually, using ZSTD_estimateDStreamSize,
|
1680
1725
|
* or deducted from a valid frame Header, using ZSTD_estimateDStreamSize_fromFrame();
|
1726
|
+
* Any frame requesting a window size larger than max specified one will be rejected.
|
1681
1727
|
* Note : if streaming is init with function ZSTD_init?Stream_usingDict(),
|
1682
1728
|
* an internal ?Dict will be created, which additional size is not estimated here.
|
1683
1729
|
* In this case, get total size by adding ZSTD_estimate?DictSize
|
1684
|
-
* Note 2 : only single-threaded compression is supported.
|
1685
|
-
* ZSTD_estimateCStreamSize_usingCCtxParams() will return an error code if ZSTD_c_nbWorkers is >= 1.
|
1686
|
-
* Note 3 : ZSTD_estimateCStreamSize* functions are not compatible with the Block-Level Sequence Producer API at this time.
|
1687
|
-
* Size estimates assume that no external sequence producer is registered.
|
1688
1730
|
*/
|
1689
|
-
ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int
|
1731
|
+
ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize(int maxCompressionLevel);
|
1690
1732
|
ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCParams(ZSTD_compressionParameters cParams);
|
1691
1733
|
ZSTDLIB_STATIC_API size_t ZSTD_estimateCStreamSize_usingCCtxParams(const ZSTD_CCtx_params* params);
|
1692
|
-
ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize(size_t
|
1734
|
+
ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize(size_t maxWindowSize);
|
1693
1735
|
ZSTDLIB_STATIC_API size_t ZSTD_estimateDStreamSize_fromFrame(const void* src, size_t srcSize);
|
1694
1736
|
|
1695
1737
|
/*! ZSTD_estimate?DictSize() :
|
@@ -1946,11 +1988,6 @@ ZSTDLIB_STATIC_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const vo
|
|
1946
1988
|
*/
|
1947
1989
|
#define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5
|
1948
1990
|
|
1949
|
-
/* Tries to fit compressed block size to be around targetCBlockSize.
|
1950
|
-
* No target when targetCBlockSize == 0.
|
1951
|
-
* There is no guarantee on compressed block size (default:0) */
|
1952
|
-
#define ZSTD_c_targetCBlockSize ZSTD_c_experimentalParam6
|
1953
|
-
|
1954
1991
|
/* User's best guess of source size.
|
1955
1992
|
* Hint is not valid when srcSizeHint == 0.
|
1956
1993
|
* There is no guarantee that hint is close to actual source size,
|
@@ -2430,6 +2467,22 @@ ZSTDLIB_STATIC_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParamete
|
|
2430
2467
|
*/
|
2431
2468
|
#define ZSTD_d_disableHuffmanAssembly ZSTD_d_experimentalParam5
|
2432
2469
|
|
2470
|
+
/* ZSTD_d_maxBlockSize
|
2471
|
+
* Allowed values are between 1KB and ZSTD_BLOCKSIZE_MAX (128KB).
|
2472
|
+
* The default is ZSTD_BLOCKSIZE_MAX, and setting to 0 will set to the default.
|
2473
|
+
*
|
2474
|
+
* Forces the decompressor to reject blocks whose content size is
|
2475
|
+
* larger than the configured maxBlockSize. When maxBlockSize is
|
2476
|
+
* larger than the windowSize, the windowSize is used instead.
|
2477
|
+
* This saves memory on the decoder when you know all blocks are small.
|
2478
|
+
*
|
2479
|
+
* This option is typically used in conjunction with ZSTD_c_maxBlockSize.
|
2480
|
+
*
|
2481
|
+
* WARNING: This causes the decoder to reject otherwise valid frames
|
2482
|
+
* that have block sizes larger than the configured maxBlockSize.
|
2483
|
+
*/
|
2484
|
+
#define ZSTD_d_maxBlockSize ZSTD_d_experimentalParam6
|
2485
|
+
|
2433
2486
|
|
2434
2487
|
/*! ZSTD_DCtx_setFormat() :
|
2435
2488
|
* This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter().
|
@@ -2557,7 +2610,7 @@ size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
|
|
2557
2610
|
* explicitly specified.
|
2558
2611
|
*
|
2559
2612
|
* start a new frame, using same parameters from previous frame.
|
2560
|
-
* This is typically useful to skip dictionary loading stage, since it will
|
2613
|
+
* This is typically useful to skip dictionary loading stage, since it will reuse it in-place.
|
2561
2614
|
* Note that zcs must be init at least once before using ZSTD_resetCStream().
|
2562
2615
|
* If pledgedSrcSize is not known at reset time, use macro ZSTD_CONTENTSIZE_UNKNOWN.
|
2563
2616
|
* If pledgedSrcSize > 0, its value must be correct, as it will be written in header, and controlled at the end.
|
@@ -2633,7 +2686,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_initDStream_usingDDict(ZSTD_DStream* zds, const Z
|
|
2633
2686
|
*
|
2634
2687
|
* ZSTD_DCtx_reset(zds, ZSTD_reset_session_only);
|
2635
2688
|
*
|
2636
|
-
*
|
2689
|
+
* reuse decompression parameters from previous init; saves dictionary loading
|
2637
2690
|
*/
|
2638
2691
|
ZSTD_DEPRECATED("use ZSTD_DCtx_reset, see zstd.h for detailed instructions")
|
2639
2692
|
ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds);
|
@@ -2765,7 +2818,7 @@ ZSTDLIB_STATIC_API size_t ZSTD_resetDStream(ZSTD_DStream* zds);
|
|
2765
2818
|
|
2766
2819
|
#define ZSTD_SEQUENCE_PRODUCER_ERROR ((size_t)(-1))
|
2767
2820
|
|
2768
|
-
typedef size_t ZSTD_sequenceProducer_F (
|
2821
|
+
typedef size_t (*ZSTD_sequenceProducer_F) (
|
2769
2822
|
void* sequenceProducerState,
|
2770
2823
|
ZSTD_Sequence* outSeqs, size_t outSeqsCapacity,
|
2771
2824
|
const void* src, size_t srcSize,
|
@@ -2797,7 +2850,23 @@ ZSTDLIB_STATIC_API void
|
|
2797
2850
|
ZSTD_registerSequenceProducer(
|
2798
2851
|
ZSTD_CCtx* cctx,
|
2799
2852
|
void* sequenceProducerState,
|
2800
|
-
ZSTD_sequenceProducer_F
|
2853
|
+
ZSTD_sequenceProducer_F sequenceProducer
|
2854
|
+
);
|
2855
|
+
|
2856
|
+
/*! ZSTD_CCtxParams_registerSequenceProducer() :
|
2857
|
+
* Same as ZSTD_registerSequenceProducer(), but operates on ZSTD_CCtx_params.
|
2858
|
+
* This is used for accurate size estimation with ZSTD_estimateCCtxSize_usingCCtxParams(),
|
2859
|
+
* which is needed when creating a ZSTD_CCtx with ZSTD_initStaticCCtx().
|
2860
|
+
*
|
2861
|
+
* If you are using the external sequence producer API in a scenario where ZSTD_initStaticCCtx()
|
2862
|
+
* is required, then this function is for you. Otherwise, you probably don't need it.
|
2863
|
+
*
|
2864
|
+
* See tests/zstreamtest.c for example usage. */
|
2865
|
+
ZSTDLIB_STATIC_API void
|
2866
|
+
ZSTD_CCtxParams_registerSequenceProducer(
|
2867
|
+
ZSTD_CCtx_params* params,
|
2868
|
+
void* sequenceProducerState,
|
2869
|
+
ZSTD_sequenceProducer_F sequenceProducer
|
2801
2870
|
);
|
2802
2871
|
|
2803
2872
|
|
@@ -2820,7 +2889,7 @@ ZSTD_registerSequenceProducer(
|
|
2820
2889
|
|
2821
2890
|
A ZSTD_CCtx object is required to track streaming operations.
|
2822
2891
|
Use ZSTD_createCCtx() / ZSTD_freeCCtx() to manage resource.
|
2823
|
-
ZSTD_CCtx object can be
|
2892
|
+
ZSTD_CCtx object can be reused multiple times within successive compression operations.
|
2824
2893
|
|
2825
2894
|
Start by initializing a context.
|
2826
2895
|
Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression.
|
@@ -2841,7 +2910,7 @@ ZSTD_registerSequenceProducer(
|
|
2841
2910
|
It's possible to use srcSize==0, in which case, it will write a final empty block to end the frame.
|
2842
2911
|
Without last block mark, frames are considered unfinished (hence corrupted) by compliant decoders.
|
2843
2912
|
|
2844
|
-
`ZSTD_CCtx` object can be
|
2913
|
+
`ZSTD_CCtx` object can be reused (ZSTD_compressBegin()) to compress again.
|
2845
2914
|
*/
|
2846
2915
|
|
2847
2916
|
/*===== Buffer-less streaming compression functions =====*/
|
@@ -2873,7 +2942,7 @@ size_t ZSTD_compressBegin_usingCDict_advanced(ZSTD_CCtx* const cctx, const ZSTD_
|
|
2873
2942
|
|
2874
2943
|
A ZSTD_DCtx object is required to track streaming operations.
|
2875
2944
|
Use ZSTD_createDCtx() / ZSTD_freeDCtx() to manage it.
|
2876
|
-
A ZSTD_DCtx object can be
|
2945
|
+
A ZSTD_DCtx object can be reused multiple times.
|
2877
2946
|
|
2878
2947
|
First typical operation is to retrieve frame parameters, using ZSTD_getFrameHeader().
|
2879
2948
|
Frame header is extracted from the beginning of compressed frame, so providing only the frame's beginning is enough.
|
data/ext/zstdruby/main.c
CHANGED