zstd-ruby 1.4.9.0 → 1.5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +8 -0
  3. data/README.md +1 -1
  4. data/ext/zstdruby/libzstd/BUCK +5 -7
  5. data/ext/zstdruby/libzstd/Makefile +42 -13
  6. data/ext/zstdruby/libzstd/README.md +8 -4
  7. data/ext/zstdruby/libzstd/common/bitstream.h +1 -1
  8. data/ext/zstdruby/libzstd/common/compiler.h +1 -1
  9. data/ext/zstdruby/libzstd/common/cpu.h +1 -1
  10. data/ext/zstdruby/libzstd/common/debug.c +1 -1
  11. data/ext/zstdruby/libzstd/common/debug.h +1 -1
  12. data/ext/zstdruby/libzstd/common/entropy_common.c +1 -1
  13. data/ext/zstdruby/libzstd/common/error_private.c +1 -1
  14. data/ext/zstdruby/libzstd/common/error_private.h +3 -3
  15. data/ext/zstdruby/libzstd/common/fse.h +2 -2
  16. data/ext/zstdruby/libzstd/common/fse_decompress.c +25 -15
  17. data/ext/zstdruby/libzstd/common/huf.h +3 -2
  18. data/ext/zstdruby/libzstd/common/mem.h +3 -5
  19. data/ext/zstdruby/libzstd/common/pool.c +1 -1
  20. data/ext/zstdruby/libzstd/common/pool.h +1 -1
  21. data/ext/zstdruby/libzstd/common/xxhash.c +2 -4
  22. data/ext/zstdruby/libzstd/common/xxhash.h +1 -1
  23. data/ext/zstdruby/libzstd/common/zstd_common.c +1 -1
  24. data/ext/zstdruby/libzstd/common/zstd_deps.h +1 -1
  25. data/ext/zstdruby/libzstd/common/zstd_internal.h +21 -9
  26. data/ext/zstdruby/libzstd/common/zstd_trace.h +7 -5
  27. data/ext/zstdruby/libzstd/compress/fse_compress.c +1 -1
  28. data/ext/zstdruby/libzstd/compress/hist.c +1 -1
  29. data/ext/zstdruby/libzstd/compress/hist.h +1 -1
  30. data/ext/zstdruby/libzstd/compress/huf_compress.c +51 -28
  31. data/ext/zstdruby/libzstd/compress/zstd_compress.c +1373 -275
  32. data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +164 -21
  33. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +2 -2
  34. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +1 -1
  35. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +14 -6
  36. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.h +1 -1
  37. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +5 -282
  38. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.h +1 -1
  39. data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +147 -46
  40. data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +3 -3
  41. data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +1 -1
  42. data/ext/zstdruby/libzstd/compress/zstd_fast.c +4 -4
  43. data/ext/zstdruby/libzstd/compress/zstd_fast.h +1 -1
  44. data/ext/zstdruby/libzstd/compress/zstd_lazy.c +914 -142
  45. data/ext/zstdruby/libzstd/compress/zstd_lazy.h +39 -1
  46. data/ext/zstdruby/libzstd/compress/zstd_ldm.c +51 -15
  47. data/ext/zstdruby/libzstd/compress/zstd_ldm.h +2 -1
  48. data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +1 -1
  49. data/ext/zstdruby/libzstd/compress/zstd_opt.c +1 -1
  50. data/ext/zstdruby/libzstd/compress/zstd_opt.h +1 -1
  51. data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +15 -6
  52. data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +5 -5
  53. data/ext/zstdruby/libzstd/decompress/huf_decompress.c +44 -43
  54. data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +1 -1
  55. data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +1 -1
  56. data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +3 -4
  57. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +44 -36
  58. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +1 -1
  59. data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +1 -2
  60. data/ext/zstdruby/libzstd/deprecated/zbuff.h +1 -1
  61. data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +1 -1
  62. data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +1 -1
  63. data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +1 -1
  64. data/ext/zstdruby/libzstd/dictBuilder/cover.c +7 -6
  65. data/ext/zstdruby/libzstd/dictBuilder/cover.h +6 -5
  66. data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +7 -6
  67. data/ext/zstdruby/libzstd/dictBuilder/zdict.c +8 -7
  68. data/ext/zstdruby/libzstd/dll/example/Makefile +1 -1
  69. data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +1 -1
  70. data/ext/zstdruby/libzstd/legacy/zstd_v01.c +1 -1
  71. data/ext/zstdruby/libzstd/legacy/zstd_v01.h +1 -1
  72. data/ext/zstdruby/libzstd/legacy/zstd_v02.c +1 -1
  73. data/ext/zstdruby/libzstd/legacy/zstd_v02.h +1 -1
  74. data/ext/zstdruby/libzstd/legacy/zstd_v03.c +1 -1
  75. data/ext/zstdruby/libzstd/legacy/zstd_v03.h +1 -1
  76. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +1 -1
  77. data/ext/zstdruby/libzstd/legacy/zstd_v04.h +1 -1
  78. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +1 -1
  79. data/ext/zstdruby/libzstd/legacy/zstd_v05.h +1 -1
  80. data/ext/zstdruby/libzstd/legacy/zstd_v06.c +1 -1
  81. data/ext/zstdruby/libzstd/legacy/zstd_v06.h +1 -1
  82. data/ext/zstdruby/libzstd/legacy/zstd_v07.c +1 -1
  83. data/ext/zstdruby/libzstd/legacy/zstd_v07.h +1 -1
  84. data/ext/zstdruby/libzstd/{dictBuilder/zdict.h → zdict.h} +148 -2
  85. data/ext/zstdruby/libzstd/zstd.h +165 -83
  86. data/ext/zstdruby/libzstd/{common/zstd_errors.h → zstd_errors.h} +1 -1
  87. data/lib/zstd-ruby/version.rb +1 -1
  88. metadata +5 -5
  89. data/ext/zstdruby/libzstd/common/zstd_trace.c +0 -42
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -36,6 +36,145 @@ extern "C" {
36
36
  # define ZDICTLIB_API ZDICTLIB_VISIBILITY
37
37
  #endif
38
38
 
39
+ /*******************************************************************************
40
+ * Zstd dictionary builder
41
+ *
42
+ * FAQ
43
+ * ===
44
+ * Why should I use a dictionary?
45
+ * ------------------------------
46
+ *
47
+ * Zstd can use dictionaries to improve compression ratio of small data.
48
+ * Traditionally small files don't compress well because there is very little
49
+ * repetion in a single sample, since it is small. But, if you are compressing
50
+ * many similar files, like a bunch of JSON records that share the same
51
+ * structure, you can train a dictionary on ahead of time on some samples of
52
+ * these files. Then, zstd can use the dictionary to find repetitions that are
53
+ * present across samples. This can vastly improve compression ratio.
54
+ *
55
+ * When is a dictionary useful?
56
+ * ----------------------------
57
+ *
58
+ * Dictionaries are useful when compressing many small files that are similar.
59
+ * The larger a file is, the less benefit a dictionary will have. Generally,
60
+ * we don't expect dictionary compression to be effective past 100KB. And the
61
+ * smaller a file is, the more we would expect the dictionary to help.
62
+ *
63
+ * How do I use a dictionary?
64
+ * --------------------------
65
+ *
66
+ * Simply pass the dictionary to the zstd compressor with
67
+ * `ZSTD_CCtx_loadDictionary()`. The same dictionary must then be passed to
68
+ * the decompressor, using `ZSTD_DCtx_loadDictionary()`. There are other
69
+ * more advanced functions that allow selecting some options, see zstd.h for
70
+ * complete documentation.
71
+ *
72
+ * What is a zstd dictionary?
73
+ * --------------------------
74
+ *
75
+ * A zstd dictionary has two pieces: Its header, and its content. The header
76
+ * contains a magic number, the dictionary ID, and entropy tables. These
77
+ * entropy tables allow zstd to save on header costs in the compressed file,
78
+ * which really matters for small data. The content is just bytes, which are
79
+ * repeated content that is common across many samples.
80
+ *
81
+ * What is a raw content dictionary?
82
+ * ---------------------------------
83
+ *
84
+ * A raw content dictionary is just bytes. It doesn't have a zstd dictionary
85
+ * header, a dictionary ID, or entropy tables. Any buffer is a valid raw
86
+ * content dictionary.
87
+ *
88
+ * How do I train a dictionary?
89
+ * ----------------------------
90
+ *
91
+ * Gather samples from your use case. These samples should be similar to each
92
+ * other. If you have several use cases, you could try to train one dictionary
93
+ * per use case.
94
+ *
95
+ * Pass those samples to `ZDICT_trainFromBuffer()` and that will train your
96
+ * dictionary. There are a few advanced versions of this function, but this
97
+ * is a great starting point. If you want to further tune your dictionary
98
+ * you could try `ZDICT_optimizeTrainFromBuffer_cover()`. If that is too slow
99
+ * you can try `ZDICT_optimizeTrainFromBuffer_fastCover()`.
100
+ *
101
+ * If the dictionary training function fails, that is likely because you
102
+ * either passed too few samples, or a dictionary would not be effective
103
+ * for your data. Look at the messages that the dictionary trainer printed,
104
+ * if it doesn't say too few samples, then a dictionary would not be effective.
105
+ *
106
+ * How large should my dictionary be?
107
+ * ----------------------------------
108
+ *
109
+ * A reasonable dictionary size, the `dictBufferCapacity`, is about 100KB.
110
+ * The zstd CLI defaults to a 110KB dictionary. You likely don't need a
111
+ * dictionary larger than that. But, most use cases can get away with a
112
+ * smaller dictionary. The advanced dictionary builders can automatically
113
+ * shrink the dictionary for you, and select a the smallest size that
114
+ * doesn't hurt compression ratio too much. See the `shrinkDict` parameter.
115
+ * A smaller dictionary can save memory, and potentially speed up
116
+ * compression.
117
+ *
118
+ * How many samples should I provide to the dictionary builder?
119
+ * ------------------------------------------------------------
120
+ *
121
+ * We generally recommend passing ~100x the size of the dictionary
122
+ * in samples. A few thousand should suffice. Having too few samples
123
+ * can hurt the dictionaries effectiveness. Having more samples will
124
+ * only improve the dictionaries effectiveness. But having too many
125
+ * samples can slow down the dictionary builder.
126
+ *
127
+ * How do I determine if a dictionary will be effective?
128
+ * -----------------------------------------------------
129
+ *
130
+ * Simply train a dictionary and try it out. You can use zstd's built in
131
+ * benchmarking tool to test the dictionary effectiveness.
132
+ *
133
+ * # Benchmark levels 1-3 without a dictionary
134
+ * zstd -b1e3 -r /path/to/my/files
135
+ * # Benchmark levels 1-3 with a dictioanry
136
+ * zstd -b1e3 -r /path/to/my/files -D /path/to/my/dictionary
137
+ *
138
+ * When should I retrain a dictionary?
139
+ * -----------------------------------
140
+ *
141
+ * You should retrain a dictionary when its effectiveness drops. Dictionary
142
+ * effectiveness drops as the data you are compressing changes. Generally, we do
143
+ * expect dictionaries to "decay" over time, as your data changes, but the rate
144
+ * at which they decay depends on your use case. Internally, we regularly
145
+ * retrain dictionaries, and if the new dictionary performs significantly
146
+ * better than the old dictionary, we will ship the new dictionary.
147
+ *
148
+ * I have a raw content dictionary, how do I turn it into a zstd dictionary?
149
+ * -------------------------------------------------------------------------
150
+ *
151
+ * If you have a raw content dictionary, e.g. by manually constructing it, or
152
+ * using a third-party dictionary builder, you can turn it into a zstd
153
+ * dictionary by using `ZDICT_finalizeDictionary()`. You'll also have to
154
+ * provide some samples of the data. It will add the zstd header to the
155
+ * raw content, which contains a dictionary ID and entropy tables, which
156
+ * will improve compression ratio, and allow zstd to write the dictionary ID
157
+ * into the frame, if you so choose.
158
+ *
159
+ * Do I have to use zstd's dictionary builder?
160
+ * -------------------------------------------
161
+ *
162
+ * No! You can construct dictionary content however you please, it is just
163
+ * bytes. It will always be valid as a raw content dictionary. If you want
164
+ * a zstd dictionary, which can improve compression ratio, use
165
+ * `ZDICT_finalizeDictionary()`.
166
+ *
167
+ * What is the attack surface of a zstd dictionary?
168
+ * ------------------------------------------------
169
+ *
170
+ * Zstd is heavily fuzz tested, including loading fuzzed dictionaries, so
171
+ * zstd should never crash, or access out-of-bounds memory no matter what
172
+ * the dictionary is. However, if an attacker can control the dictionary
173
+ * during decompression, they can cause zstd to generate arbitrary bytes,
174
+ * just like if they controlled the compressed data.
175
+ *
176
+ ******************************************************************************/
177
+
39
178
 
40
179
  /*! ZDICT_trainFromBuffer():
41
180
  * Train a dictionary from an array of samples.
@@ -64,7 +203,14 @@ ZDICTLIB_API size_t ZDICT_trainFromBuffer(void* dictBuffer, size_t dictBufferCap
64
203
  typedef struct {
65
204
  int compressionLevel; /*< optimize for a specific zstd compression level; 0 means default */
66
205
  unsigned notificationLevel; /*< Write log to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug; */
67
- unsigned dictID; /*< force dictID value; 0 means auto mode (32-bits random value) */
206
+ unsigned dictID; /*< force dictID value; 0 means auto mode (32-bits random value)
207
+ * NOTE: The zstd format reserves some dictionary IDs for future use.
208
+ * You may use them in private settings, but be warned that they
209
+ * may be used by zstd in a public dictionary registry in the future.
210
+ * These dictionary IDs are:
211
+ * - low range : <= 32767
212
+ * - high range : >= (2^31)
213
+ */
68
214
  } ZDICT_params_t;
69
215
 
70
216
  /*! ZDICT_finalizeDictionary():
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-2021, Yann Collet, Facebook, Inc.
2
+ * Copyright (c) Yann Collet, Facebook, Inc.
3
3
  * All rights reserved.
4
4
  *
5
5
  * This source code is licensed under both the BSD-style license (found in the
@@ -71,8 +71,8 @@ extern "C" {
71
71
 
72
72
  /*------ Version ------*/
73
73
  #define ZSTD_VERSION_MAJOR 1
74
- #define ZSTD_VERSION_MINOR 4
75
- #define ZSTD_VERSION_RELEASE 9
74
+ #define ZSTD_VERSION_MINOR 5
75
+ #define ZSTD_VERSION_RELEASE 0
76
76
  #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
77
77
 
78
78
  /*! ZSTD_versionNumber() :
@@ -109,7 +109,6 @@ ZSTDLIB_API const char* ZSTD_versionString(void);
109
109
  #define ZSTD_BLOCKSIZE_MAX (1<<ZSTD_BLOCKSIZELOG_MAX)
110
110
 
111
111
 
112
-
113
112
  /***************************************
114
113
  * Simple API
115
114
  ***************************************/
@@ -166,7 +165,7 @@ ZSTDLIB_API unsigned long long ZSTD_getFrameContentSize(const void *src, size_t
166
165
  * @return : decompressed size of `src` frame content _if known and not empty_, 0 otherwise. */
167
166
  ZSTDLIB_API unsigned long long ZSTD_getDecompressedSize(const void* src, size_t srcSize);
168
167
 
169
- /*! ZSTD_findFrameCompressedSize() :
168
+ /*! ZSTD_findFrameCompressedSize() : Requires v1.4.0+
170
169
  * `src` should point to the start of a ZSTD frame or skippable frame.
171
170
  * `srcSize` must be >= first frame size
172
171
  * @return : the compressed size of the first frame starting at `src`,
@@ -180,8 +179,9 @@ ZSTDLIB_API size_t ZSTD_findFrameCompressedSize(const void* src, size_t srcSize)
180
179
  ZSTDLIB_API size_t ZSTD_compressBound(size_t srcSize); /*!< maximum compressed size in worst case single-pass scenario */
181
180
  ZSTDLIB_API unsigned ZSTD_isError(size_t code); /*!< tells if a `size_t` function result is an error code */
182
181
  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 */
182
+ ZSTDLIB_API int ZSTD_minCLevel(void); /*!< minimum negative compression level allowed, requires v1.4.0+ */
184
183
  ZSTDLIB_API int ZSTD_maxCLevel(void); /*!< maximum compression level available */
184
+ ZSTDLIB_API int ZSTD_defaultCLevel(void); /*!< default compression level, specified by ZSTD_CLEVEL_DEFAULT, requires v1.5.0+ */
185
185
 
186
186
 
187
187
  /***************************************
@@ -199,7 +199,7 @@ ZSTDLIB_API int ZSTD_maxCLevel(void); /*!< maximum compres
199
199
  */
200
200
  typedef struct ZSTD_CCtx_s ZSTD_CCtx;
201
201
  ZSTDLIB_API ZSTD_CCtx* ZSTD_createCCtx(void);
202
- ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx);
202
+ ZSTDLIB_API size_t ZSTD_freeCCtx(ZSTD_CCtx* cctx); /* accept NULL pointer */
203
203
 
204
204
  /*! ZSTD_compressCCtx() :
205
205
  * Same as ZSTD_compress(), using an explicit ZSTD_CCtx.
@@ -222,7 +222,7 @@ ZSTDLIB_API size_t ZSTD_compressCCtx(ZSTD_CCtx* cctx,
222
222
  * Use one context per thread for parallel execution. */
223
223
  typedef struct ZSTD_DCtx_s ZSTD_DCtx;
224
224
  ZSTDLIB_API ZSTD_DCtx* ZSTD_createDCtx(void);
225
- ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx);
225
+ ZSTDLIB_API size_t ZSTD_freeDCtx(ZSTD_DCtx* dctx); /* accept NULL pointer */
226
226
 
227
227
  /*! ZSTD_decompressDCtx() :
228
228
  * Same as ZSTD_decompress(),
@@ -234,9 +234,9 @@ ZSTDLIB_API size_t ZSTD_decompressDCtx(ZSTD_DCtx* dctx,
234
234
  const void* src, size_t srcSize);
235
235
 
236
236
 
237
- /***************************************
238
- * Advanced compression API
239
- ***************************************/
237
+ /*********************************************
238
+ * Advanced compression API (Requires v1.4.0+)
239
+ **********************************************/
240
240
 
241
241
  /* API design :
242
242
  * Parameters are pushed one by one into an existing context,
@@ -266,7 +266,6 @@ typedef enum { ZSTD_fast=1,
266
266
  Only the order (from fast to strong) is guaranteed */
267
267
  } ZSTD_strategy;
268
268
 
269
-
270
269
  typedef enum {
271
270
 
272
271
  /* compression parameters
@@ -332,7 +331,6 @@ typedef enum {
332
331
  * The higher the value of selected strategy, the more complex it is,
333
332
  * resulting in stronger and slower compression.
334
333
  * Special: value 0 means "use default strategy". */
335
-
336
334
  /* LDM mode parameters */
337
335
  ZSTD_c_enableLongDistanceMatching=160, /* Enable long distance matching.
338
336
  * This parameter is designed to improve compression ratio
@@ -389,7 +387,7 @@ typedef enum {
389
387
  ZSTD_c_jobSize=401, /* Size of a compression job. This value is enforced only when nbWorkers >= 1.
390
388
  * Each compression job is completed in parallel, so this value can indirectly impact the nb of active threads.
391
389
  * 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.
390
+ * Job size must be a minimum of overlap size, or ZSTDMT_JOBSIZE_MIN (= 512 KB), whichever is largest.
393
391
  * The minimum size is automatically and transparently enforced. */
394
392
  ZSTD_c_overlapLog=402, /* Control the overlap size, as a fraction of window size.
395
393
  * The overlap size is an amount of data reloaded from previous job at the beginning of a new job.
@@ -419,6 +417,8 @@ typedef enum {
419
417
  * ZSTD_c_stableOutBuffer
420
418
  * ZSTD_c_blockDelimiters
421
419
  * ZSTD_c_validateSequences
420
+ * ZSTD_c_splitBlocks
421
+ * ZSTD_c_useRowMatchFinder
422
422
  * Because they are not stable, it's necessary to define ZSTD_STATIC_LINKING_ONLY to access them.
423
423
  * note : never ever use experimentalParam? names directly;
424
424
  * also, the enums values themselves are unstable and can still change.
@@ -434,7 +434,10 @@ typedef enum {
434
434
  ZSTD_c_experimentalParam9=1006,
435
435
  ZSTD_c_experimentalParam10=1007,
436
436
  ZSTD_c_experimentalParam11=1008,
437
- ZSTD_c_experimentalParam12=1009
437
+ ZSTD_c_experimentalParam12=1009,
438
+ ZSTD_c_experimentalParam13=1010,
439
+ ZSTD_c_experimentalParam14=1011,
440
+ ZSTD_c_experimentalParam15=1012
438
441
  } ZSTD_cParameter;
439
442
 
440
443
  typedef struct {
@@ -519,9 +522,9 @@ ZSTDLIB_API size_t ZSTD_compress2( ZSTD_CCtx* cctx,
519
522
  const void* src, size_t srcSize);
520
523
 
521
524
 
522
- /***************************************
523
- * Advanced decompression API
524
- ***************************************/
525
+ /***********************************************
526
+ * Advanced decompression API (Requires v1.4.0+)
527
+ ************************************************/
525
528
 
526
529
  /* The advanced API pushes parameters one by one into an existing DCtx context.
527
530
  * Parameters are sticky, and remain valid for all following frames
@@ -667,7 +670,7 @@ typedef ZSTD_CCtx ZSTD_CStream; /**< CCtx and CStream are now effectively same
667
670
  /* Continue to distinguish them for compatibility with older versions <= v1.2.0 */
668
671
  /*===== ZSTD_CStream management functions =====*/
669
672
  ZSTDLIB_API ZSTD_CStream* ZSTD_createCStream(void);
670
- ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs);
673
+ ZSTDLIB_API size_t ZSTD_freeCStream(ZSTD_CStream* zcs); /* accept NULL pointer */
671
674
 
672
675
  /*===== Streaming compression functions =====*/
673
676
  typedef enum {
@@ -683,7 +686,7 @@ typedef enum {
683
686
  : note : multithreaded compression will block to flush as much output as possible. */
684
687
  } ZSTD_EndDirective;
685
688
 
686
- /*! ZSTD_compressStream2() :
689
+ /*! ZSTD_compressStream2() : Requires v1.4.0+
687
690
  * Behaves about the same as ZSTD_compressStream, with additional control on end directive.
688
691
  * - Compression parameters are pushed into CCtx before starting compression, using ZSTD_CCtx_set*()
689
692
  * - Compression parameters cannot be changed once compression is started (save a list of exceptions in multi-threading mode)
@@ -729,11 +732,11 @@ ZSTDLIB_API size_t ZSTD_CStreamOutSize(void); /**< recommended size for output
729
732
 
730
733
 
731
734
  /* *****************************************************************************
732
- * This following is a legacy streaming API.
735
+ * This following is a legacy streaming API, available since v1.0+ .
733
736
  * It can be replaced by ZSTD_CCtx_reset() and ZSTD_compressStream2().
734
737
  * It is redundant, but remains fully supported.
735
- * Advanced parameters and dictionary compression can only be used through the
736
- * new API.
738
+ * Streaming in combination with advanced parameters and dictionary compression
739
+ * can only be used through the new API.
737
740
  ******************************************************************************/
738
741
 
739
742
  /*!
@@ -788,7 +791,7 @@ typedef ZSTD_DCtx ZSTD_DStream; /**< DCtx and DStream are now effectively same
788
791
  /* For compatibility with versions <= v1.2.0, prefer differentiating them. */
789
792
  /*===== ZSTD_DStream management functions =====*/
790
793
  ZSTDLIB_API ZSTD_DStream* ZSTD_createDStream(void);
791
- ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds);
794
+ ZSTDLIB_API size_t ZSTD_freeDStream(ZSTD_DStream* zds); /* accept NULL pointer */
792
795
 
793
796
  /*===== Streaming decompression functions =====*/
794
797
 
@@ -811,7 +814,7 @@ ZSTDLIB_API size_t ZSTD_DStreamOutSize(void); /*!< recommended size for output
811
814
  /*! ZSTD_compress_usingDict() :
812
815
  * Compression at an explicit compression level using a Dictionary.
813
816
  * A dictionary can be any arbitrary data segment (also called a prefix),
814
- * or a buffer with specified information (see dictBuilder/zdict.h).
817
+ * or a buffer with specified information (see zdict.h).
815
818
  * Note : This function loads the dictionary, resulting in significant startup delay.
816
819
  * It's intended for a dictionary used only once.
817
820
  * Note 2 : When `dict == NULL || dictSize < 8` no dictionary is used. */
@@ -854,7 +857,8 @@ ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict(const void* dictBuffer, size_t dictSize
854
857
  int compressionLevel);
855
858
 
856
859
  /*! ZSTD_freeCDict() :
857
- * Function frees memory allocated by ZSTD_createCDict(). */
860
+ * Function frees memory allocated by ZSTD_createCDict().
861
+ * If a NULL pointer is passed, no operation is performed. */
858
862
  ZSTDLIB_API size_t ZSTD_freeCDict(ZSTD_CDict* CDict);
859
863
 
860
864
  /*! ZSTD_compress_usingCDict() :
@@ -876,7 +880,8 @@ typedef struct ZSTD_DDict_s ZSTD_DDict;
876
880
  ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict(const void* dictBuffer, size_t dictSize);
877
881
 
878
882
  /*! ZSTD_freeDDict() :
879
- * Function frees memory allocated with ZSTD_createDDict() */
883
+ * Function frees memory allocated with ZSTD_createDDict()
884
+ * If a NULL pointer is passed, no operation is performed. */
880
885
  ZSTDLIB_API size_t ZSTD_freeDDict(ZSTD_DDict* ddict);
881
886
 
882
887
  /*! ZSTD_decompress_usingDDict() :
@@ -892,19 +897,25 @@ ZSTDLIB_API size_t ZSTD_decompress_usingDDict(ZSTD_DCtx* dctx,
892
897
  * Dictionary helper functions
893
898
  *******************************/
894
899
 
895
- /*! ZSTD_getDictID_fromDict() :
900
+ /*! ZSTD_getDictID_fromDict() : Requires v1.4.0+
896
901
  * Provides the dictID stored within dictionary.
897
902
  * if @return == 0, the dictionary is not conformant with Zstandard specification.
898
903
  * It can still be loaded, but as a content-only dictionary. */
899
904
  ZSTDLIB_API unsigned ZSTD_getDictID_fromDict(const void* dict, size_t dictSize);
900
905
 
901
- /*! ZSTD_getDictID_fromDDict() :
906
+ /*! ZSTD_getDictID_fromCDict() : Requires v1.5.0+
907
+ * Provides the dictID of the dictionary loaded into `cdict`.
908
+ * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
909
+ * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
910
+ ZSTDLIB_API unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict);
911
+
912
+ /*! ZSTD_getDictID_fromDDict() : Requires v1.4.0+
902
913
  * Provides the dictID of the dictionary loaded into `ddict`.
903
914
  * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
904
915
  * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
905
916
  ZSTDLIB_API unsigned ZSTD_getDictID_fromDDict(const ZSTD_DDict* ddict);
906
917
 
907
- /*! ZSTD_getDictID_fromFrame() :
918
+ /*! ZSTD_getDictID_fromFrame() : Requires v1.4.0+
908
919
  * Provides the dictID required to decompressed the frame stored within `src`.
909
920
  * If @return == 0, the dictID could not be decoded.
910
921
  * This could for one of the following reasons :
@@ -918,7 +929,7 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
918
929
 
919
930
 
920
931
  /*******************************************************************************
921
- * Advanced dictionary and prefix API
932
+ * Advanced dictionary and prefix API (Requires v1.4.0+)
922
933
  *
923
934
  * This API allows dictionaries to be used with ZSTD_compress2(),
924
935
  * ZSTD_compressStream2(), and ZSTD_decompress(). Dictionaries are sticky, and
@@ -927,7 +938,7 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
927
938
  ******************************************************************************/
928
939
 
929
940
 
930
- /*! ZSTD_CCtx_loadDictionary() :
941
+ /*! ZSTD_CCtx_loadDictionary() : Requires v1.4.0+
931
942
  * Create an internal CDict from `dict` buffer.
932
943
  * Decompression will have to use same dictionary.
933
944
  * @result : 0, or an error code (which can be tested with ZSTD_isError()).
@@ -946,7 +957,7 @@ ZSTDLIB_API unsigned ZSTD_getDictID_fromFrame(const void* src, size_t srcSize);
946
957
  * to precisely select how dictionary content must be interpreted. */
947
958
  ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, size_t dictSize);
948
959
 
949
- /*! ZSTD_CCtx_refCDict() :
960
+ /*! ZSTD_CCtx_refCDict() : Requires v1.4.0+
950
961
  * Reference a prepared dictionary, to be used for all next compressed frames.
951
962
  * Note that compression parameters are enforced from within CDict,
952
963
  * and supersede any compression parameter previously set within CCtx.
@@ -960,7 +971,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_loadDictionary(ZSTD_CCtx* cctx, const void* dict, s
960
971
  * Note 2 : CDict is just referenced, its lifetime must outlive its usage within CCtx. */
961
972
  ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
962
973
 
963
- /*! ZSTD_CCtx_refPrefix() :
974
+ /*! ZSTD_CCtx_refPrefix() : Requires v1.4.0+
964
975
  * Reference a prefix (single-usage dictionary) for next compressed frame.
965
976
  * A prefix is **only used once**. Tables are discarded at end of frame (ZSTD_e_end).
966
977
  * Decompression will need same prefix to properly regenerate data.
@@ -981,7 +992,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_refCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict);
981
992
  ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx,
982
993
  const void* prefix, size_t prefixSize);
983
994
 
984
- /*! ZSTD_DCtx_loadDictionary() :
995
+ /*! ZSTD_DCtx_loadDictionary() : Requires v1.4.0+
985
996
  * Create an internal DDict from dict buffer,
986
997
  * to be used to decompress next frames.
987
998
  * The dictionary remains valid for all future frames, until explicitly invalidated.
@@ -998,7 +1009,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix(ZSTD_CCtx* cctx,
998
1009
  */
999
1010
  ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, size_t dictSize);
1000
1011
 
1001
- /*! ZSTD_DCtx_refDDict() :
1012
+ /*! ZSTD_DCtx_refDDict() : Requires v1.4.0+
1002
1013
  * Reference a prepared dictionary, to be used to decompress next frames.
1003
1014
  * The dictionary remains active for decompression of future frames using same DCtx.
1004
1015
  *
@@ -1016,7 +1027,7 @@ ZSTDLIB_API size_t ZSTD_DCtx_loadDictionary(ZSTD_DCtx* dctx, const void* dict, s
1016
1027
  */
1017
1028
  ZSTDLIB_API size_t ZSTD_DCtx_refDDict(ZSTD_DCtx* dctx, const ZSTD_DDict* ddict);
1018
1029
 
1019
- /*! ZSTD_DCtx_refPrefix() :
1030
+ /*! ZSTD_DCtx_refPrefix() : Requires v1.4.0+
1020
1031
  * Reference a prefix (single-usage dictionary) to decompress next frame.
1021
1032
  * This is the reverse operation of ZSTD_CCtx_refPrefix(),
1022
1033
  * and must use the same prefix as the one used during compression.
@@ -1037,7 +1048,7 @@ ZSTDLIB_API size_t ZSTD_DCtx_refPrefix(ZSTD_DCtx* dctx,
1037
1048
 
1038
1049
  /* === Memory management === */
1039
1050
 
1040
- /*! ZSTD_sizeof_*() :
1051
+ /*! ZSTD_sizeof_*() : Requires v1.4.0+
1041
1052
  * These functions give the _current_ memory usage of selected object.
1042
1053
  * Note that object memory usage can evolve (increase or decrease) over time. */
1043
1054
  ZSTDLIB_API size_t ZSTD_sizeof_CCtx(const ZSTD_CCtx* cctx);
@@ -1062,6 +1073,28 @@ ZSTDLIB_API size_t ZSTD_sizeof_DDict(const ZSTD_DDict* ddict);
1062
1073
  #if defined(ZSTD_STATIC_LINKING_ONLY) && !defined(ZSTD_H_ZSTD_STATIC_LINKING_ONLY)
1063
1074
  #define ZSTD_H_ZSTD_STATIC_LINKING_ONLY
1064
1075
 
1076
+ /* Deprecation warnings :
1077
+ * Should these warnings be a problem, it is generally possible to disable them,
1078
+ * typically with -Wno-deprecated-declarations for gcc or _CRT_SECURE_NO_WARNINGS in Visual.
1079
+ * Otherwise, it's also possible to define ZSTD_DISABLE_DEPRECATE_WARNINGS.
1080
+ */
1081
+ #ifdef ZSTD_DISABLE_DEPRECATE_WARNINGS
1082
+ # define ZSTD_DEPRECATED(message) ZSTDLIB_API /* disable deprecation warnings */
1083
+ #else
1084
+ # if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */
1085
+ # define ZSTD_DEPRECATED(message) [[deprecated(message)]] ZSTDLIB_API
1086
+ # elif (defined(GNUC) && (GNUC > 4 || (GNUC == 4 && GNUC_MINOR >= 5))) || defined(__clang__)
1087
+ # define ZSTD_DEPRECATED(message) ZSTDLIB_API __attribute__((deprecated(message)))
1088
+ # elif defined(__GNUC__) && (__GNUC__ >= 3)
1089
+ # define ZSTD_DEPRECATED(message) ZSTDLIB_API __attribute__((deprecated))
1090
+ # elif defined(_MSC_VER)
1091
+ # define ZSTD_DEPRECATED(message) ZSTDLIB_API __declspec(deprecated(message))
1092
+ # else
1093
+ # pragma message("WARNING: You need to implement ZSTD_DEPRECATED for this compiler")
1094
+ # define ZSTD_DEPRECATED(message) ZSTDLIB_API
1095
+ # endif
1096
+ #endif /* ZSTD_DISABLE_DEPRECATE_WARNINGS */
1097
+
1065
1098
  /****************************************************************************************
1066
1099
  * experimental API (static linking only)
1067
1100
  ****************************************************************************************
@@ -1268,6 +1301,11 @@ typedef enum {
1268
1301
  ZSTD_lcm_uncompressed = 2 /**< Always emit uncompressed literals. */
1269
1302
  } ZSTD_literalCompressionMode_e;
1270
1303
 
1304
+ typedef enum {
1305
+ ZSTD_urm_auto = 0, /* Automatically determine whether or not we use row matchfinder */
1306
+ ZSTD_urm_disableRowMatchFinder = 1, /* Never use row matchfinder */
1307
+ ZSTD_urm_enableRowMatchFinder = 2 /* Always use row matchfinder when applicable */
1308
+ } ZSTD_useRowMatchFinderMode_e;
1271
1309
 
1272
1310
  /***************************************
1273
1311
  * Frame size functions
@@ -1538,11 +1576,11 @@ ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_advanced(const void* dict, size_t dictS
1538
1576
  * Note that the lifetime of such pool must exist while being used.
1539
1577
  * ZSTD_CCtx_refThreadPool assigns a thread pool to a context (use NULL argument value
1540
1578
  * to use an internal thread pool).
1541
- * ZSTD_freeThreadPool frees a thread pool.
1579
+ * ZSTD_freeThreadPool frees a thread pool, accepts NULL pointer.
1542
1580
  */
1543
1581
  typedef struct POOL_ctx_s ZSTD_threadPool;
1544
1582
  ZSTDLIB_API ZSTD_threadPool* ZSTD_createThreadPool(size_t numThreads);
1545
- ZSTDLIB_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool);
1583
+ ZSTDLIB_API void ZSTD_freeThreadPool (ZSTD_threadPool* pool); /* accept NULL pointer */
1546
1584
  ZSTDLIB_API size_t ZSTD_CCtx_refThreadPool(ZSTD_CCtx* cctx, ZSTD_threadPool* pool);
1547
1585
 
1548
1586
 
@@ -1575,12 +1613,6 @@ ZSTDLIB_API ZSTD_DDict* ZSTD_createDDict_advanced(
1575
1613
  * note: equivalent to ZSTD_createCDict_advanced(), with dictLoadMethod==ZSTD_dlm_byRef */
1576
1614
  ZSTDLIB_API ZSTD_CDict* ZSTD_createCDict_byReference(const void* dictBuffer, size_t dictSize, int compressionLevel);
1577
1615
 
1578
- /*! ZSTD_getDictID_fromCDict() :
1579
- * Provides the dictID of the dictionary loaded into `cdict`.
1580
- * If @return == 0, the dictionary is not conformant to Zstandard specification, or empty.
1581
- * Non-conformant dictionaries can still be loaded, but as content-only dictionaries. */
1582
- ZSTDLIB_API unsigned ZSTD_getDictID_fromCDict(const ZSTD_CDict* cdict);
1583
-
1584
1616
  /*! ZSTD_getCParams() :
1585
1617
  * @return ZSTD_compressionParameters structure for a selected compression level and estimated srcSize.
1586
1618
  * `estimatedSrcSize` value is optional, select 0 if not known */
@@ -1607,18 +1639,20 @@ ZSTDLIB_API ZSTD_compressionParameters ZSTD_adjustCParams(ZSTD_compressionParame
1607
1639
  /*! ZSTD_compress_advanced() :
1608
1640
  * Note : this function is now DEPRECATED.
1609
1641
  * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_setParameter() and other parameter setters.
1610
- * This prototype will be marked as deprecated and generate compilation warning on reaching v1.5.x */
1611
- ZSTDLIB_API size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx,
1642
+ * This prototype will generate compilation warnings. */
1643
+ ZSTD_DEPRECATED("use ZSTD_compress2")
1644
+ size_t ZSTD_compress_advanced(ZSTD_CCtx* cctx,
1612
1645
  void* dst, size_t dstCapacity,
1613
1646
  const void* src, size_t srcSize,
1614
1647
  const void* dict,size_t dictSize,
1615
1648
  ZSTD_parameters params);
1616
1649
 
1617
1650
  /*! ZSTD_compress_usingCDict_advanced() :
1618
- * Note : this function is now REDUNDANT.
1651
+ * Note : this function is now DEPRECATED.
1619
1652
  * It can be replaced by ZSTD_compress2(), in combination with ZSTD_CCtx_loadDictionary() and other parameter setters.
1620
- * This prototype will be marked as deprecated and generate compilation warning in some future version */
1621
- ZSTDLIB_API size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
1653
+ * This prototype will generate compilation warnings. */
1654
+ ZSTD_DEPRECATED("use ZSTD_compress2 with ZSTD_CCtx_loadDictionary")
1655
+ size_t ZSTD_compress_usingCDict_advanced(ZSTD_CCtx* cctx,
1622
1656
  void* dst, size_t dstCapacity,
1623
1657
  const void* src, size_t srcSize,
1624
1658
  const ZSTD_CDict* cdict,
@@ -1680,7 +1714,7 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre
1680
1714
 
1681
1715
  /* Controls how the literals are compressed (default is auto).
1682
1716
  * The value must be of type ZSTD_literalCompressionMode_e.
1683
- * See ZSTD_literalCompressionMode_t enum definition for details.
1717
+ * See ZSTD_literalCompressionMode_e enum definition for details.
1684
1718
  */
1685
1719
  #define ZSTD_c_literalCompressionMode ZSTD_c_experimentalParam5
1686
1720
 
@@ -1832,6 +1866,46 @@ ZSTDLIB_API size_t ZSTD_CCtx_refPrefix_advanced(ZSTD_CCtx* cctx, const void* pre
1832
1866
  */
1833
1867
  #define ZSTD_c_validateSequences ZSTD_c_experimentalParam12
1834
1868
 
1869
+ /* ZSTD_c_splitBlocks
1870
+ * Default is 0 == disabled. Set to 1 to enable block splitting.
1871
+ *
1872
+ * Will attempt to split blocks in order to improve compression ratio at the cost of speed.
1873
+ */
1874
+ #define ZSTD_c_splitBlocks ZSTD_c_experimentalParam13
1875
+
1876
+ /* ZSTD_c_useRowMatchFinder
1877
+ * Default is ZSTD_urm_auto.
1878
+ * Controlled with ZSTD_useRowMatchFinderMode_e enum.
1879
+ *
1880
+ * By default, in ZSTD_urm_auto, when finalizing the compression parameters, the library
1881
+ * will decide at runtime whether to use the row-based matchfinder based on support for SIMD
1882
+ * instructions as well as the windowLog.
1883
+ *
1884
+ * Set to ZSTD_urm_disableRowMatchFinder to never use row-based matchfinder.
1885
+ * Set to ZSTD_urm_enableRowMatchFinder to force usage of row-based matchfinder.
1886
+ */
1887
+ #define ZSTD_c_useRowMatchFinder ZSTD_c_experimentalParam14
1888
+
1889
+ /* ZSTD_c_deterministicRefPrefix
1890
+ * Default is 0 == disabled. Set to 1 to enable.
1891
+ *
1892
+ * Zstd produces different results for prefix compression when the prefix is
1893
+ * directly adjacent to the data about to be compressed vs. when it isn't.
1894
+ * This is because zstd detects that the two buffers are contiguous and it can
1895
+ * use a more efficient match finding algorithm. However, this produces different
1896
+ * results than when the two buffers are non-contiguous. This flag forces zstd
1897
+ * to always load the prefix in non-contiguous mode, even if it happens to be
1898
+ * adjacent to the data, to guarantee determinism.
1899
+ *
1900
+ * If you really care about determinism when using a dictionary or prefix,
1901
+ * like when doing delta compression, you should select this option. It comes
1902
+ * at a speed penalty of about ~2.5% if the dictionary and data happened to be
1903
+ * contiguous, and is free if they weren't contiguous. We don't expect that
1904
+ * intentionally making the dictionary and data contiguous will be worth the
1905
+ * cost to memcpy() the data.
1906
+ */
1907
+ #define ZSTD_c_deterministicRefPrefix ZSTD_c_experimentalParam15
1908
+
1835
1909
  /*! ZSTD_CCtx_getParameter() :
1836
1910
  * Get the requested compression parameter value, selected by enum ZSTD_cParameter,
1837
1911
  * and store it into int* value.
@@ -1852,13 +1926,13 @@ ZSTDLIB_API size_t ZSTD_CCtx_getParameter(const ZSTD_CCtx* cctx, ZSTD_cParameter
1852
1926
  * These parameters will be applied to
1853
1927
  * all subsequent frames.
1854
1928
  * - ZSTD_compressStream2() : Do compression using the CCtx.
1855
- * - ZSTD_freeCCtxParams() : Free the memory.
1929
+ * - ZSTD_freeCCtxParams() : Free the memory, accept NULL pointer.
1856
1930
  *
1857
1931
  * This can be used with ZSTD_estimateCCtxSize_advanced_usingCCtxParams()
1858
1932
  * for static allocation of CCtx for single-threaded compression.
1859
1933
  */
1860
1934
  ZSTDLIB_API ZSTD_CCtx_params* ZSTD_createCCtxParams(void);
1861
- ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params);
1935
+ ZSTDLIB_API size_t ZSTD_freeCCtxParams(ZSTD_CCtx_params* params); /* accept NULL pointer */
1862
1936
 
1863
1937
  /*! ZSTD_CCtxParams_reset() :
1864
1938
  * Reset params to default values.
@@ -1877,7 +1951,7 @@ ZSTDLIB_API size_t ZSTD_CCtxParams_init(ZSTD_CCtx_params* cctxParams, int compre
1877
1951
  */
1878
1952
  ZSTDLIB_API size_t ZSTD_CCtxParams_init_advanced(ZSTD_CCtx_params* cctxParams, ZSTD_parameters params);
1879
1953
 
1880
- /*! ZSTD_CCtxParams_setParameter() :
1954
+ /*! ZSTD_CCtxParams_setParameter() : Requires v1.4.0+
1881
1955
  * Similar to ZSTD_CCtx_setParameter.
1882
1956
  * Set one compression parameter, selected by enum ZSTD_cParameter.
1883
1957
  * Parameters must be applied to a ZSTD_CCtx using
@@ -2043,11 +2117,13 @@ ZSTDLIB_API size_t ZSTD_DCtx_getParameter(ZSTD_DCtx* dctx, ZSTD_dParameter param
2043
2117
 
2044
2118
 
2045
2119
  /*! ZSTD_DCtx_setFormat() :
2120
+ * This function is REDUNDANT. Prefer ZSTD_DCtx_setParameter().
2046
2121
  * Instruct the decoder context about what kind of data to decode next.
2047
2122
  * This instruction is mandatory to decode data without a fully-formed header,
2048
2123
  * such ZSTD_f_zstd1_magicless for example.
2049
2124
  * @return : 0, or an error code (which can be tested using ZSTD_isError()). */
2050
- ZSTDLIB_API size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);
2125
+ ZSTD_DEPRECATED("use ZSTD_DCtx_setParameter() instead")
2126
+ size_t ZSTD_DCtx_setFormat(ZSTD_DCtx* dctx, ZSTD_format_e format);
2051
2127
 
2052
2128
  /*! ZSTD_decompressStream_simpleArgs() :
2053
2129
  * Same as ZSTD_decompressStream(),
@@ -2071,7 +2147,7 @@ ZSTDLIB_API size_t ZSTD_decompressStream_simpleArgs (
2071
2147
  /*===== Advanced Streaming compression functions =====*/
2072
2148
 
2073
2149
  /*! ZSTD_initCStream_srcSize() :
2074
- * This function is deprecated, and equivalent to:
2150
+ * This function is DEPRECATED, and equivalent to:
2075
2151
  * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2076
2152
  * ZSTD_CCtx_refCDict(zcs, NULL); // clear the dictionary (if any)
2077
2153
  * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);
@@ -2080,15 +2156,15 @@ ZSTDLIB_API size_t ZSTD_decompressStream_simpleArgs (
2080
2156
  * pledgedSrcSize must be correct. If it is not known at init time, use
2081
2157
  * ZSTD_CONTENTSIZE_UNKNOWN. Note that, for compatibility with older programs,
2082
2158
  * "0" also disables frame content size field. It may be enabled in the future.
2083
- * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2159
+ * This prototype will generate compilation warnings.
2084
2160
  */
2085
- ZSTDLIB_API size_t
2086
- ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
2161
+ ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
2162
+ size_t ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
2087
2163
  int compressionLevel,
2088
2164
  unsigned long long pledgedSrcSize);
2089
2165
 
2090
2166
  /*! ZSTD_initCStream_usingDict() :
2091
- * This function is deprecated, and is equivalent to:
2167
+ * This function is DEPRECATED, and is equivalent to:
2092
2168
  * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2093
2169
  * ZSTD_CCtx_setParameter(zcs, ZSTD_c_compressionLevel, compressionLevel);
2094
2170
  * ZSTD_CCtx_loadDictionary(zcs, dict, dictSize);
@@ -2097,15 +2173,15 @@ ZSTD_initCStream_srcSize(ZSTD_CStream* zcs,
2097
2173
  * dict == NULL or dictSize < 8, in which case no dict is used.
2098
2174
  * Note: dict is loaded with ZSTD_dct_auto (treated as a full zstd dictionary if
2099
2175
  * it begins with ZSTD_MAGIC_DICTIONARY, else as raw content) and ZSTD_dlm_byCopy.
2100
- * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2176
+ * This prototype will generate compilation warnings.
2101
2177
  */
2102
- ZSTDLIB_API size_t
2103
- ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
2178
+ ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
2179
+ size_t ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
2104
2180
  const void* dict, size_t dictSize,
2105
2181
  int compressionLevel);
2106
2182
 
2107
2183
  /*! ZSTD_initCStream_advanced() :
2108
- * This function is deprecated, and is approximately equivalent to:
2184
+ * This function is DEPRECATED, and is approximately equivalent to:
2109
2185
  * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2110
2186
  * // Pseudocode: Set each zstd parameter and leave the rest as-is.
2111
2187
  * for ((param, value) : params) {
@@ -2117,23 +2193,24 @@ ZSTD_initCStream_usingDict(ZSTD_CStream* zcs,
2117
2193
  * dict is loaded with ZSTD_dct_auto and ZSTD_dlm_byCopy.
2118
2194
  * pledgedSrcSize must be correct.
2119
2195
  * If srcSize is not known at init time, use value ZSTD_CONTENTSIZE_UNKNOWN.
2120
- * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2196
+ * This prototype will generate compilation warnings.
2121
2197
  */
2122
- ZSTDLIB_API size_t
2123
- ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
2198
+ ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
2199
+ size_t ZSTD_initCStream_advanced(ZSTD_CStream* zcs,
2124
2200
  const void* dict, size_t dictSize,
2125
2201
  ZSTD_parameters params,
2126
2202
  unsigned long long pledgedSrcSize);
2127
2203
 
2128
2204
  /*! ZSTD_initCStream_usingCDict() :
2129
- * This function is deprecated, and equivalent to:
2205
+ * This function is DEPRECATED, and equivalent to:
2130
2206
  * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2131
2207
  * ZSTD_CCtx_refCDict(zcs, cdict);
2132
- *
2208
+ *
2133
2209
  * note : cdict will just be referenced, and must outlive compression session
2134
- * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2210
+ * This prototype will generate compilation warnings.
2135
2211
  */
2136
- ZSTDLIB_API size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);
2212
+ ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
2213
+ size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDict* cdict);
2137
2214
 
2138
2215
  /*! ZSTD_initCStream_usingCDict_advanced() :
2139
2216
  * This function is DEPRECATED, and is approximately equivalent to:
@@ -2148,18 +2225,21 @@ ZSTDLIB_API size_t ZSTD_initCStream_usingCDict(ZSTD_CStream* zcs, const ZSTD_CDi
2148
2225
  * same as ZSTD_initCStream_usingCDict(), with control over frame parameters.
2149
2226
  * pledgedSrcSize must be correct. If srcSize is not known at init time, use
2150
2227
  * value ZSTD_CONTENTSIZE_UNKNOWN.
2151
- * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2228
+ * This prototype will generate compilation warnings.
2152
2229
  */
2153
- ZSTDLIB_API size_t
2154
- ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
2230
+ ZSTD_DEPRECATED("use ZSTD_CCtx_reset and ZSTD_CCtx_refCDict, see zstd.h for detailed instructions")
2231
+ size_t ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
2155
2232
  const ZSTD_CDict* cdict,
2156
2233
  ZSTD_frameParameters fParams,
2157
2234
  unsigned long long pledgedSrcSize);
2158
2235
 
2159
2236
  /*! ZSTD_resetCStream() :
2160
- * This function is deprecated, and is equivalent to:
2237
+ * This function is DEPRECATED, and is equivalent to:
2161
2238
  * ZSTD_CCtx_reset(zcs, ZSTD_reset_session_only);
2162
2239
  * ZSTD_CCtx_setPledgedSrcSize(zcs, pledgedSrcSize);
2240
+ * Note: ZSTD_resetCStream() interprets pledgedSrcSize == 0 as ZSTD_CONTENTSIZE_UNKNOWN, but
2241
+ * ZSTD_CCtx_setPledgedSrcSize() does not do the same, so ZSTD_CONTENTSIZE_UNKNOWN must be
2242
+ * explicitly specified.
2163
2243
  *
2164
2244
  * start a new frame, using same parameters from previous frame.
2165
2245
  * This is typically useful to skip dictionary loading stage, since it will re-use it in-place.
@@ -2169,9 +2249,10 @@ ZSTD_initCStream_usingCDict_advanced(ZSTD_CStream* zcs,
2169
2249
  * For the time being, pledgedSrcSize==0 is interpreted as "srcSize unknown" for compatibility with older programs,
2170
2250
  * but it will change to mean "empty" in future version, so use macro ZSTD_CONTENTSIZE_UNKNOWN instead.
2171
2251
  * @return : 0, or an error code (which can be tested using ZSTD_isError())
2172
- * Note : this prototype will be marked as deprecated and generate compilation warnings on reaching v1.5.x
2252
+ * This prototype will generate compilation warnings.
2173
2253
  */
2174
- ZSTDLIB_API size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
2254
+ ZSTD_DEPRECATED("use ZSTD_CCtx_reset, see zstd.h for detailed instructions")
2255
+ size_t ZSTD_resetCStream(ZSTD_CStream* zcs, unsigned long long pledgedSrcSize);
2175
2256
 
2176
2257
 
2177
2258
  typedef struct {
@@ -2258,8 +2339,7 @@ ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds);
2258
2339
  ZSTD_CCtx object can be re-used multiple times within successive compression operations.
2259
2340
 
2260
2341
  Start by initializing a context.
2261
- Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression,
2262
- or ZSTD_compressBegin_advanced(), for finer parameter control.
2342
+ Use ZSTD_compressBegin(), or ZSTD_compressBegin_usingDict() for dictionary compression.
2263
2343
  It's also possible to duplicate a reference context which has already been initialized, using ZSTD_copyCCtx()
2264
2344
 
2265
2345
  Then, consume your input using ZSTD_compressContinue().
@@ -2284,15 +2364,17 @@ ZSTDLIB_API size_t ZSTD_resetDStream(ZSTD_DStream* zds);
2284
2364
  /*===== Buffer-less streaming compression functions =====*/
2285
2365
  ZSTDLIB_API size_t ZSTD_compressBegin(ZSTD_CCtx* cctx, int compressionLevel);
2286
2366
  ZSTDLIB_API size_t ZSTD_compressBegin_usingDict(ZSTD_CCtx* cctx, const void* dict, size_t dictSize, int compressionLevel);
2287
- 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 */
2288
2367
  ZSTDLIB_API size_t ZSTD_compressBegin_usingCDict(ZSTD_CCtx* cctx, const ZSTD_CDict* cdict); /**< note: fails if cdict==NULL */
2289
- 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 */
2290
2368
  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 */
2291
2369
 
2292
2370
  ZSTDLIB_API size_t ZSTD_compressContinue(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
2293
2371
  ZSTDLIB_API size_t ZSTD_compressEnd(ZSTD_CCtx* cctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize);
2294
2372
 
2295
-
2373
+ /* The ZSTD_compressBegin_advanced() and ZSTD_compressBegin_usingCDict_advanced() are now DEPRECATED and will generate a compiler warning */
2374
+ ZSTD_DEPRECATED("use advanced API to access custom parameters")
2375
+ 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 */
2376
+ ZSTD_DEPRECATED("use advanced API to access custom parameters")
2377
+ 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 */
2296
2378
  /**
2297
2379
  Buffer-less streaming decompression (synchronous mode)
2298
2380