zstdlib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES.md +9 -0
  3. data/Gemfile +3 -0
  4. data/README.md +96 -0
  5. data/Rakefile +29 -0
  6. data/ext/zstdlib/extconf.rb +53 -0
  7. data/ext/zstdlib/ruby/zlib-2.2/zlib.c +4659 -0
  8. data/ext/zstdlib/ruby/zlib-2.3/zlib.c +4686 -0
  9. data/ext/zstdlib/ruby/zlib-2.4/zlib.c +4843 -0
  10. data/ext/zstdlib/ruby/zlib-2.5/zlib.c +4848 -0
  11. data/ext/zstdlib/ruby/zlib-2.6/zlib.c +4890 -0
  12. data/ext/zstdlib/zlib-1.2.11/adler32.c +186 -0
  13. data/ext/zstdlib/zlib-1.2.11/compress.c +86 -0
  14. data/ext/zstdlib/zlib-1.2.11/crc32.c +442 -0
  15. data/ext/zstdlib/zlib-1.2.11/crc32.h +441 -0
  16. data/ext/zstdlib/zlib-1.2.11/deflate.c +2163 -0
  17. data/ext/zstdlib/zlib-1.2.11/deflate.h +349 -0
  18. data/ext/zstdlib/zlib-1.2.11/gzclose.c +25 -0
  19. data/ext/zstdlib/zlib-1.2.11/gzguts.h +218 -0
  20. data/ext/zstdlib/zlib-1.2.11/gzlib.c +637 -0
  21. data/ext/zstdlib/zlib-1.2.11/gzread.c +654 -0
  22. data/ext/zstdlib/zlib-1.2.11/gzwrite.c +665 -0
  23. data/ext/zstdlib/zlib-1.2.11/infback.c +640 -0
  24. data/ext/zstdlib/zlib-1.2.11/inffast.c +323 -0
  25. data/ext/zstdlib/zlib-1.2.11/inffast.h +11 -0
  26. data/ext/zstdlib/zlib-1.2.11/inffixed.h +94 -0
  27. data/ext/zstdlib/zlib-1.2.11/inflate.c +1561 -0
  28. data/ext/zstdlib/zlib-1.2.11/inflate.h +125 -0
  29. data/ext/zstdlib/zlib-1.2.11/inftrees.c +304 -0
  30. data/ext/zstdlib/zlib-1.2.11/inftrees.h +62 -0
  31. data/ext/zstdlib/zlib-1.2.11/trees.c +1203 -0
  32. data/ext/zstdlib/zlib-1.2.11/trees.h +128 -0
  33. data/ext/zstdlib/zlib-1.2.11/uncompr.c +93 -0
  34. data/ext/zstdlib/zlib-1.2.11/zconf.h +534 -0
  35. data/ext/zstdlib/zlib-1.2.11/zlib.h +1912 -0
  36. data/ext/zstdlib/zlib-1.2.11/zutil.c +325 -0
  37. data/ext/zstdlib/zlib-1.2.11/zutil.h +271 -0
  38. data/ext/zstdlib/zlib.mk +14 -0
  39. data/ext/zstdlib/zlibwrapper/zlibwrapper.c +14 -0
  40. data/ext/zstdlib/zlibwrapper.mk +14 -0
  41. data/ext/zstdlib/zstd-1.3.8/lib/common/bitstream.h +455 -0
  42. data/ext/zstdlib/zstd-1.3.8/lib/common/compiler.h +140 -0
  43. data/ext/zstdlib/zstd-1.3.8/lib/common/cpu.h +215 -0
  44. data/ext/zstdlib/zstd-1.3.8/lib/common/debug.c +44 -0
  45. data/ext/zstdlib/zstd-1.3.8/lib/common/debug.h +134 -0
  46. data/ext/zstdlib/zstd-1.3.8/lib/common/entropy_common.c +236 -0
  47. data/ext/zstdlib/zstd-1.3.8/lib/common/error_private.c +54 -0
  48. data/ext/zstdlib/zstd-1.3.8/lib/common/error_private.h +76 -0
  49. data/ext/zstdlib/zstd-1.3.8/lib/common/fse.h +708 -0
  50. data/ext/zstdlib/zstd-1.3.8/lib/common/fse_decompress.c +309 -0
  51. data/ext/zstdlib/zstd-1.3.8/lib/common/huf.h +358 -0
  52. data/ext/zstdlib/zstd-1.3.8/lib/common/mem.h +380 -0
  53. data/ext/zstdlib/zstd-1.3.8/lib/common/pool.c +340 -0
  54. data/ext/zstdlib/zstd-1.3.8/lib/common/pool.h +84 -0
  55. data/ext/zstdlib/zstd-1.3.8/lib/common/threading.c +75 -0
  56. data/ext/zstdlib/zstd-1.3.8/lib/common/threading.h +123 -0
  57. data/ext/zstdlib/zstd-1.3.8/lib/common/xxhash.c +876 -0
  58. data/ext/zstdlib/zstd-1.3.8/lib/common/xxhash.h +305 -0
  59. data/ext/zstdlib/zstd-1.3.8/lib/common/zstd_common.c +83 -0
  60. data/ext/zstdlib/zstd-1.3.8/lib/common/zstd_errors.h +93 -0
  61. data/ext/zstdlib/zstd-1.3.8/lib/common/zstd_internal.h +266 -0
  62. data/ext/zstdlib/zstd-1.3.8/lib/compress/fse_compress.c +721 -0
  63. data/ext/zstdlib/zstd-1.3.8/lib/compress/hist.c +203 -0
  64. data/ext/zstdlib/zstd-1.3.8/lib/compress/hist.h +95 -0
  65. data/ext/zstdlib/zstd-1.3.8/lib/compress/huf_compress.c +798 -0
  66. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_compress.c +4290 -0
  67. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_compress_internal.h +860 -0
  68. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_double_fast.c +499 -0
  69. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_double_fast.h +38 -0
  70. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_fast.c +391 -0
  71. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_fast.h +37 -0
  72. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_lazy.c +1106 -0
  73. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_lazy.h +67 -0
  74. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_ldm.c +597 -0
  75. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_ldm.h +105 -0
  76. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_opt.c +1217 -0
  77. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstd_opt.h +56 -0
  78. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstdmt_compress.c +2107 -0
  79. data/ext/zstdlib/zstd-1.3.8/lib/compress/zstdmt_compress.h +174 -0
  80. data/ext/zstdlib/zstd-1.3.8/lib/decompress/huf_decompress.c +1232 -0
  81. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_ddict.c +240 -0
  82. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_ddict.h +44 -0
  83. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_decompress.c +1672 -0
  84. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_decompress_block.c +1307 -0
  85. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_decompress_block.h +59 -0
  86. data/ext/zstdlib/zstd-1.3.8/lib/decompress/zstd_decompress_internal.h +168 -0
  87. data/ext/zstdlib/zstd-1.3.8/lib/zstd.h +1766 -0
  88. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzclose.c +28 -0
  89. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzcompatibility.h +68 -0
  90. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzguts.h +227 -0
  91. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzlib.c +640 -0
  92. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzread.c +670 -0
  93. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/gzwrite.c +671 -0
  94. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/zstd_zlibwrapper.c +1105 -0
  95. data/ext/zstdlib/zstd-1.3.8/zlibWrapper/zstd_zlibwrapper.h +88 -0
  96. data/ext/zstdlib/zstd.mk +14 -0
  97. data/lib/zstdlib.rb +6 -0
  98. data/test/zstdlib_test.rb +21 -0
  99. metadata +198 -0
@@ -0,0 +1,860 @@
1
+ /*
2
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under both the BSD-style license (found in the
6
+ * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7
+ * in the COPYING file in the root directory of this source tree).
8
+ * You may select, at your option, one of the above-listed licenses.
9
+ */
10
+
11
+ /* This header contains definitions
12
+ * that shall **only** be used by modules within lib/compress.
13
+ */
14
+
15
+ #ifndef ZSTD_COMPRESS_H
16
+ #define ZSTD_COMPRESS_H
17
+
18
+ /*-*************************************
19
+ * Dependencies
20
+ ***************************************/
21
+ #include "zstd_internal.h"
22
+ #ifdef ZSTD_MULTITHREAD
23
+ # include "zstdmt_compress.h"
24
+ #endif
25
+
26
+ #if defined (__cplusplus)
27
+ extern "C" {
28
+ #endif
29
+
30
+
31
+ /*-*************************************
32
+ * Constants
33
+ ***************************************/
34
+ #define kSearchStrength 8
35
+ #define HASH_READ_SIZE 8
36
+ #define ZSTD_DUBT_UNSORTED_MARK 1 /* For btlazy2 strategy, index 1 now means "unsorted".
37
+ It could be confused for a real successor at index "1", if sorted as larger than its predecessor.
38
+ It's not a big deal though : candidate will just be sorted again.
39
+ Additionnally, candidate position 1 will be lost.
40
+ But candidate 1 cannot hide a large tree of candidates, so it's a minimal loss.
41
+ The benefit is that ZSTD_DUBT_UNSORTED_MARK cannot be misdhandled after table re-use with a different strategy
42
+ Constant required by ZSTD_compressBlock_btlazy2() and ZSTD_reduceTable_internal() */
43
+
44
+
45
+ /*-*************************************
46
+ * Context memory management
47
+ ***************************************/
48
+ typedef enum { ZSTDcs_created=0, ZSTDcs_init, ZSTDcs_ongoing, ZSTDcs_ending } ZSTD_compressionStage_e;
49
+ typedef enum { zcss_init=0, zcss_load, zcss_flush } ZSTD_cStreamStage;
50
+
51
+ typedef struct ZSTD_prefixDict_s {
52
+ const void* dict;
53
+ size_t dictSize;
54
+ ZSTD_dictContentType_e dictContentType;
55
+ } ZSTD_prefixDict;
56
+
57
+ typedef struct {
58
+ U32 CTable[HUF_CTABLE_SIZE_U32(255)];
59
+ HUF_repeat repeatMode;
60
+ } ZSTD_hufCTables_t;
61
+
62
+ typedef struct {
63
+ FSE_CTable offcodeCTable[FSE_CTABLE_SIZE_U32(OffFSELog, MaxOff)];
64
+ FSE_CTable matchlengthCTable[FSE_CTABLE_SIZE_U32(MLFSELog, MaxML)];
65
+ FSE_CTable litlengthCTable[FSE_CTABLE_SIZE_U32(LLFSELog, MaxLL)];
66
+ FSE_repeat offcode_repeatMode;
67
+ FSE_repeat matchlength_repeatMode;
68
+ FSE_repeat litlength_repeatMode;
69
+ } ZSTD_fseCTables_t;
70
+
71
+ typedef struct {
72
+ ZSTD_hufCTables_t huf;
73
+ ZSTD_fseCTables_t fse;
74
+ } ZSTD_entropyCTables_t;
75
+
76
+ typedef struct {
77
+ U32 off;
78
+ U32 len;
79
+ } ZSTD_match_t;
80
+
81
+ typedef struct {
82
+ int price;
83
+ U32 off;
84
+ U32 mlen;
85
+ U32 litlen;
86
+ U32 rep[ZSTD_REP_NUM];
87
+ } ZSTD_optimal_t;
88
+
89
+ typedef enum { zop_dynamic=0, zop_predef } ZSTD_OptPrice_e;
90
+
91
+ typedef struct {
92
+ /* All tables are allocated inside cctx->workspace by ZSTD_resetCCtx_internal() */
93
+ unsigned* litFreq; /* table of literals statistics, of size 256 */
94
+ unsigned* litLengthFreq; /* table of litLength statistics, of size (MaxLL+1) */
95
+ unsigned* matchLengthFreq; /* table of matchLength statistics, of size (MaxML+1) */
96
+ unsigned* offCodeFreq; /* table of offCode statistics, of size (MaxOff+1) */
97
+ ZSTD_match_t* matchTable; /* list of found matches, of size ZSTD_OPT_NUM+1 */
98
+ ZSTD_optimal_t* priceTable; /* All positions tracked by optimal parser, of size ZSTD_OPT_NUM+1 */
99
+
100
+ U32 litSum; /* nb of literals */
101
+ U32 litLengthSum; /* nb of litLength codes */
102
+ U32 matchLengthSum; /* nb of matchLength codes */
103
+ U32 offCodeSum; /* nb of offset codes */
104
+ U32 litSumBasePrice; /* to compare to log2(litfreq) */
105
+ U32 litLengthSumBasePrice; /* to compare to log2(llfreq) */
106
+ U32 matchLengthSumBasePrice;/* to compare to log2(mlfreq) */
107
+ U32 offCodeSumBasePrice; /* to compare to log2(offreq) */
108
+ ZSTD_OptPrice_e priceType; /* prices can be determined dynamically, or follow a pre-defined cost structure */
109
+ const ZSTD_entropyCTables_t* symbolCosts; /* pre-calculated dictionary statistics */
110
+ } optState_t;
111
+
112
+ typedef struct {
113
+ ZSTD_entropyCTables_t entropy;
114
+ U32 rep[ZSTD_REP_NUM];
115
+ } ZSTD_compressedBlockState_t;
116
+
117
+ typedef struct {
118
+ BYTE const* nextSrc; /* next block here to continue on current prefix */
119
+ BYTE const* base; /* All regular indexes relative to this position */
120
+ BYTE const* dictBase; /* extDict indexes relative to this position */
121
+ U32 dictLimit; /* below that point, need extDict */
122
+ U32 lowLimit; /* below that point, no more data */
123
+ } ZSTD_window_t;
124
+
125
+ typedef struct ZSTD_matchState_t ZSTD_matchState_t;
126
+ struct ZSTD_matchState_t {
127
+ ZSTD_window_t window; /* State for window round buffer management */
128
+ U32 loadedDictEnd; /* index of end of dictionary */
129
+ U32 nextToUpdate; /* index from which to continue table update */
130
+ U32 nextToUpdate3; /* index from which to continue table update */
131
+ U32 hashLog3; /* dispatch table : larger == faster, more memory */
132
+ U32* hashTable;
133
+ U32* hashTable3;
134
+ U32* chainTable;
135
+ optState_t opt; /* optimal parser state */
136
+ const ZSTD_matchState_t * dictMatchState;
137
+ ZSTD_compressionParameters cParams;
138
+ };
139
+
140
+ typedef struct {
141
+ ZSTD_compressedBlockState_t* prevCBlock;
142
+ ZSTD_compressedBlockState_t* nextCBlock;
143
+ ZSTD_matchState_t matchState;
144
+ } ZSTD_blockState_t;
145
+
146
+ typedef struct {
147
+ U32 offset;
148
+ U32 checksum;
149
+ } ldmEntry_t;
150
+
151
+ typedef struct {
152
+ ZSTD_window_t window; /* State for the window round buffer management */
153
+ ldmEntry_t* hashTable;
154
+ BYTE* bucketOffsets; /* Next position in bucket to insert entry */
155
+ U64 hashPower; /* Used to compute the rolling hash.
156
+ * Depends on ldmParams.minMatchLength */
157
+ } ldmState_t;
158
+
159
+ typedef struct {
160
+ U32 enableLdm; /* 1 if enable long distance matching */
161
+ U32 hashLog; /* Log size of hashTable */
162
+ U32 bucketSizeLog; /* Log bucket size for collision resolution, at most 8 */
163
+ U32 minMatchLength; /* Minimum match length */
164
+ U32 hashRateLog; /* Log number of entries to skip */
165
+ U32 windowLog; /* Window log for the LDM */
166
+ } ldmParams_t;
167
+
168
+ typedef struct {
169
+ U32 offset;
170
+ U32 litLength;
171
+ U32 matchLength;
172
+ } rawSeq;
173
+
174
+ typedef struct {
175
+ rawSeq* seq; /* The start of the sequences */
176
+ size_t pos; /* The position where reading stopped. <= size. */
177
+ size_t size; /* The number of sequences. <= capacity. */
178
+ size_t capacity; /* The capacity starting from `seq` pointer */
179
+ } rawSeqStore_t;
180
+
181
+ struct ZSTD_CCtx_params_s {
182
+ ZSTD_format_e format;
183
+ ZSTD_compressionParameters cParams;
184
+ ZSTD_frameParameters fParams;
185
+
186
+ int compressionLevel;
187
+ int forceWindow; /* force back-references to respect limit of
188
+ * 1<<wLog, even for dictionary */
189
+
190
+ ZSTD_dictAttachPref_e attachDictPref;
191
+
192
+ /* Multithreading: used to pass parameters to mtctx */
193
+ int nbWorkers;
194
+ size_t jobSize;
195
+ int overlapLog;
196
+ int rsyncable;
197
+
198
+ /* Long distance matching parameters */
199
+ ldmParams_t ldmParams;
200
+
201
+ /* Internal use, for createCCtxParams() and freeCCtxParams() only */
202
+ ZSTD_customMem customMem;
203
+ }; /* typedef'd to ZSTD_CCtx_params within "zstd.h" */
204
+
205
+ struct ZSTD_CCtx_s {
206
+ ZSTD_compressionStage_e stage;
207
+ int cParamsChanged; /* == 1 if cParams(except wlog) or compression level are changed in requestedParams. Triggers transmission of new params to ZSTDMT (if available) then reset to 0. */
208
+ int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */
209
+ ZSTD_CCtx_params requestedParams;
210
+ ZSTD_CCtx_params appliedParams;
211
+ U32 dictID;
212
+
213
+ int workSpaceOversizedDuration;
214
+ void* workSpace;
215
+ size_t workSpaceSize;
216
+ size_t blockSize;
217
+ unsigned long long pledgedSrcSizePlusOne; /* this way, 0 (default) == unknown */
218
+ unsigned long long consumedSrcSize;
219
+ unsigned long long producedCSize;
220
+ XXH64_state_t xxhState;
221
+ ZSTD_customMem customMem;
222
+ size_t staticSize;
223
+
224
+ seqStore_t seqStore; /* sequences storage ptrs */
225
+ ldmState_t ldmState; /* long distance matching state */
226
+ rawSeq* ldmSequences; /* Storage for the ldm output sequences */
227
+ size_t maxNbLdmSequences;
228
+ rawSeqStore_t externSeqStore; /* Mutable reference to external sequences */
229
+ ZSTD_blockState_t blockState;
230
+ U32* entropyWorkspace; /* entropy workspace of HUF_WORKSPACE_SIZE bytes */
231
+
232
+ /* streaming */
233
+ char* inBuff;
234
+ size_t inBuffSize;
235
+ size_t inToCompress;
236
+ size_t inBuffPos;
237
+ size_t inBuffTarget;
238
+ char* outBuff;
239
+ size_t outBuffSize;
240
+ size_t outBuffContentSize;
241
+ size_t outBuffFlushedSize;
242
+ ZSTD_cStreamStage streamStage;
243
+ U32 frameEnded;
244
+
245
+ /* Dictionary */
246
+ ZSTD_CDict* cdictLocal;
247
+ const ZSTD_CDict* cdict;
248
+ ZSTD_prefixDict prefixDict; /* single-usage dictionary */
249
+
250
+ /* Multi-threading */
251
+ #ifdef ZSTD_MULTITHREAD
252
+ ZSTDMT_CCtx* mtctx;
253
+ #endif
254
+ };
255
+
256
+ typedef enum { ZSTD_dtlm_fast, ZSTD_dtlm_full } ZSTD_dictTableLoadMethod_e;
257
+
258
+ typedef enum { ZSTD_noDict = 0, ZSTD_extDict = 1, ZSTD_dictMatchState = 2 } ZSTD_dictMode_e;
259
+
260
+
261
+ typedef size_t (*ZSTD_blockCompressor) (
262
+ ZSTD_matchState_t* bs, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
263
+ void const* src, size_t srcSize);
264
+ ZSTD_blockCompressor ZSTD_selectBlockCompressor(ZSTD_strategy strat, ZSTD_dictMode_e dictMode);
265
+
266
+
267
+ MEM_STATIC U32 ZSTD_LLcode(U32 litLength)
268
+ {
269
+ static const BYTE LL_Code[64] = { 0, 1, 2, 3, 4, 5, 6, 7,
270
+ 8, 9, 10, 11, 12, 13, 14, 15,
271
+ 16, 16, 17, 17, 18, 18, 19, 19,
272
+ 20, 20, 20, 20, 21, 21, 21, 21,
273
+ 22, 22, 22, 22, 22, 22, 22, 22,
274
+ 23, 23, 23, 23, 23, 23, 23, 23,
275
+ 24, 24, 24, 24, 24, 24, 24, 24,
276
+ 24, 24, 24, 24, 24, 24, 24, 24 };
277
+ static const U32 LL_deltaCode = 19;
278
+ return (litLength > 63) ? ZSTD_highbit32(litLength) + LL_deltaCode : LL_Code[litLength];
279
+ }
280
+
281
+ /* ZSTD_MLcode() :
282
+ * note : mlBase = matchLength - MINMATCH;
283
+ * because it's the format it's stored in seqStore->sequences */
284
+ MEM_STATIC U32 ZSTD_MLcode(U32 mlBase)
285
+ {
286
+ static const BYTE ML_Code[128] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
287
+ 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,
288
+ 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, 36, 36, 37, 37, 37, 37,
289
+ 38, 38, 38, 38, 38, 38, 38, 38, 39, 39, 39, 39, 39, 39, 39, 39,
290
+ 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40, 40,
291
+ 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41,
292
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
293
+ 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42 };
294
+ static const U32 ML_deltaCode = 36;
295
+ return (mlBase > 127) ? ZSTD_highbit32(mlBase) + ML_deltaCode : ML_Code[mlBase];
296
+ }
297
+
298
+ /*! ZSTD_storeSeq() :
299
+ * Store a sequence (literal length, literals, offset code and match length code) into seqStore_t.
300
+ * `offsetCode` : distance to match + 3 (values 1-3 are repCodes).
301
+ * `mlBase` : matchLength - MINMATCH
302
+ */
303
+ MEM_STATIC void ZSTD_storeSeq(seqStore_t* seqStorePtr, size_t litLength, const void* literals, U32 offsetCode, size_t mlBase)
304
+ {
305
+ #if defined(DEBUGLEVEL) && (DEBUGLEVEL >= 6)
306
+ static const BYTE* g_start = NULL;
307
+ if (g_start==NULL) g_start = (const BYTE*)literals; /* note : index only works for compression within a single segment */
308
+ { U32 const pos = (U32)((const BYTE*)literals - g_start);
309
+ DEBUGLOG(6, "Cpos%7u :%3u literals, match%4u bytes at offCode%7u",
310
+ pos, (U32)litLength, (U32)mlBase+MINMATCH, (U32)offsetCode);
311
+ }
312
+ #endif
313
+ assert((size_t)(seqStorePtr->sequences - seqStorePtr->sequencesStart) < seqStorePtr->maxNbSeq);
314
+ /* copy Literals */
315
+ assert(seqStorePtr->maxNbLit <= 128 KB);
316
+ assert(seqStorePtr->lit + litLength <= seqStorePtr->litStart + seqStorePtr->maxNbLit);
317
+ ZSTD_wildcopy(seqStorePtr->lit, literals, litLength);
318
+ seqStorePtr->lit += litLength;
319
+
320
+ /* literal Length */
321
+ if (litLength>0xFFFF) {
322
+ assert(seqStorePtr->longLengthID == 0); /* there can only be a single long length */
323
+ seqStorePtr->longLengthID = 1;
324
+ seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
325
+ }
326
+ seqStorePtr->sequences[0].litLength = (U16)litLength;
327
+
328
+ /* match offset */
329
+ seqStorePtr->sequences[0].offset = offsetCode + 1;
330
+
331
+ /* match Length */
332
+ if (mlBase>0xFFFF) {
333
+ assert(seqStorePtr->longLengthID == 0); /* there can only be a single long length */
334
+ seqStorePtr->longLengthID = 2;
335
+ seqStorePtr->longLengthPos = (U32)(seqStorePtr->sequences - seqStorePtr->sequencesStart);
336
+ }
337
+ seqStorePtr->sequences[0].matchLength = (U16)mlBase;
338
+
339
+ seqStorePtr->sequences++;
340
+ }
341
+
342
+
343
+ /*-*************************************
344
+ * Match length counter
345
+ ***************************************/
346
+ static unsigned ZSTD_NbCommonBytes (size_t val)
347
+ {
348
+ if (MEM_isLittleEndian()) {
349
+ if (MEM_64bits()) {
350
+ # if defined(_MSC_VER) && defined(_WIN64)
351
+ unsigned long r = 0;
352
+ _BitScanForward64( &r, (U64)val );
353
+ return (unsigned)(r>>3);
354
+ # elif defined(__GNUC__) && (__GNUC__ >= 4)
355
+ return (__builtin_ctzll((U64)val) >> 3);
356
+ # else
357
+ static const int DeBruijnBytePos[64] = { 0, 0, 0, 0, 0, 1, 1, 2,
358
+ 0, 3, 1, 3, 1, 4, 2, 7,
359
+ 0, 2, 3, 6, 1, 5, 3, 5,
360
+ 1, 3, 4, 4, 2, 5, 6, 7,
361
+ 7, 0, 1, 2, 3, 3, 4, 6,
362
+ 2, 6, 5, 5, 3, 4, 5, 6,
363
+ 7, 1, 2, 4, 6, 4, 4, 5,
364
+ 7, 2, 6, 5, 7, 6, 7, 7 };
365
+ return DeBruijnBytePos[((U64)((val & -(long long)val) * 0x0218A392CDABBD3FULL)) >> 58];
366
+ # endif
367
+ } else { /* 32 bits */
368
+ # if defined(_MSC_VER)
369
+ unsigned long r=0;
370
+ _BitScanForward( &r, (U32)val );
371
+ return (unsigned)(r>>3);
372
+ # elif defined(__GNUC__) && (__GNUC__ >= 3)
373
+ return (__builtin_ctz((U32)val) >> 3);
374
+ # else
375
+ static const int DeBruijnBytePos[32] = { 0, 0, 3, 0, 3, 1, 3, 0,
376
+ 3, 2, 2, 1, 3, 2, 0, 1,
377
+ 3, 3, 1, 2, 2, 2, 2, 0,
378
+ 3, 1, 2, 0, 1, 0, 1, 1 };
379
+ return DeBruijnBytePos[((U32)((val & -(S32)val) * 0x077CB531U)) >> 27];
380
+ # endif
381
+ }
382
+ } else { /* Big Endian CPU */
383
+ if (MEM_64bits()) {
384
+ # if defined(_MSC_VER) && defined(_WIN64)
385
+ unsigned long r = 0;
386
+ _BitScanReverse64( &r, val );
387
+ return (unsigned)(r>>3);
388
+ # elif defined(__GNUC__) && (__GNUC__ >= 4)
389
+ return (__builtin_clzll(val) >> 3);
390
+ # else
391
+ unsigned r;
392
+ const unsigned n32 = sizeof(size_t)*4; /* calculate this way due to compiler complaining in 32-bits mode */
393
+ if (!(val>>n32)) { r=4; } else { r=0; val>>=n32; }
394
+ if (!(val>>16)) { r+=2; val>>=8; } else { val>>=24; }
395
+ r += (!val);
396
+ return r;
397
+ # endif
398
+ } else { /* 32 bits */
399
+ # if defined(_MSC_VER)
400
+ unsigned long r = 0;
401
+ _BitScanReverse( &r, (unsigned long)val );
402
+ return (unsigned)(r>>3);
403
+ # elif defined(__GNUC__) && (__GNUC__ >= 3)
404
+ return (__builtin_clz((U32)val) >> 3);
405
+ # else
406
+ unsigned r;
407
+ if (!(val>>16)) { r=2; val>>=8; } else { r=0; val>>=24; }
408
+ r += (!val);
409
+ return r;
410
+ # endif
411
+ } }
412
+ }
413
+
414
+
415
+ MEM_STATIC size_t ZSTD_count(const BYTE* pIn, const BYTE* pMatch, const BYTE* const pInLimit)
416
+ {
417
+ const BYTE* const pStart = pIn;
418
+ const BYTE* const pInLoopLimit = pInLimit - (sizeof(size_t)-1);
419
+
420
+ if (pIn < pInLoopLimit) {
421
+ { size_t const diff = MEM_readST(pMatch) ^ MEM_readST(pIn);
422
+ if (diff) return ZSTD_NbCommonBytes(diff); }
423
+ pIn+=sizeof(size_t); pMatch+=sizeof(size_t);
424
+ while (pIn < pInLoopLimit) {
425
+ size_t const diff = MEM_readST(pMatch) ^ MEM_readST(pIn);
426
+ if (!diff) { pIn+=sizeof(size_t); pMatch+=sizeof(size_t); continue; }
427
+ pIn += ZSTD_NbCommonBytes(diff);
428
+ return (size_t)(pIn - pStart);
429
+ } }
430
+ if (MEM_64bits() && (pIn<(pInLimit-3)) && (MEM_read32(pMatch) == MEM_read32(pIn))) { pIn+=4; pMatch+=4; }
431
+ if ((pIn<(pInLimit-1)) && (MEM_read16(pMatch) == MEM_read16(pIn))) { pIn+=2; pMatch+=2; }
432
+ if ((pIn<pInLimit) && (*pMatch == *pIn)) pIn++;
433
+ return (size_t)(pIn - pStart);
434
+ }
435
+
436
+ /** ZSTD_count_2segments() :
437
+ * can count match length with `ip` & `match` in 2 different segments.
438
+ * convention : on reaching mEnd, match count continue starting from iStart
439
+ */
440
+ MEM_STATIC size_t
441
+ ZSTD_count_2segments(const BYTE* ip, const BYTE* match,
442
+ const BYTE* iEnd, const BYTE* mEnd, const BYTE* iStart)
443
+ {
444
+ const BYTE* const vEnd = MIN( ip + (mEnd - match), iEnd);
445
+ size_t const matchLength = ZSTD_count(ip, match, vEnd);
446
+ if (match + matchLength != mEnd) return matchLength;
447
+ DEBUGLOG(7, "ZSTD_count_2segments: found a 2-parts match (current length==%zu)", matchLength);
448
+ DEBUGLOG(7, "distance from match beginning to end dictionary = %zi", mEnd - match);
449
+ DEBUGLOG(7, "distance from current pos to end buffer = %zi", iEnd - ip);
450
+ DEBUGLOG(7, "next byte : ip==%02X, istart==%02X", ip[matchLength], *iStart);
451
+ DEBUGLOG(7, "final match length = %zu", matchLength + ZSTD_count(ip+matchLength, iStart, iEnd));
452
+ return matchLength + ZSTD_count(ip+matchLength, iStart, iEnd);
453
+ }
454
+
455
+
456
+ /*-*************************************
457
+ * Hashes
458
+ ***************************************/
459
+ static const U32 prime3bytes = 506832829U;
460
+ static U32 ZSTD_hash3(U32 u, U32 h) { return ((u << (32-24)) * prime3bytes) >> (32-h) ; }
461
+ MEM_STATIC size_t ZSTD_hash3Ptr(const void* ptr, U32 h) { return ZSTD_hash3(MEM_readLE32(ptr), h); } /* only in zstd_opt.h */
462
+
463
+ static const U32 prime4bytes = 2654435761U;
464
+ static U32 ZSTD_hash4(U32 u, U32 h) { return (u * prime4bytes) >> (32-h) ; }
465
+ static size_t ZSTD_hash4Ptr(const void* ptr, U32 h) { return ZSTD_hash4(MEM_read32(ptr), h); }
466
+
467
+ static const U64 prime5bytes = 889523592379ULL;
468
+ static size_t ZSTD_hash5(U64 u, U32 h) { return (size_t)(((u << (64-40)) * prime5bytes) >> (64-h)) ; }
469
+ static size_t ZSTD_hash5Ptr(const void* p, U32 h) { return ZSTD_hash5(MEM_readLE64(p), h); }
470
+
471
+ static const U64 prime6bytes = 227718039650203ULL;
472
+ static size_t ZSTD_hash6(U64 u, U32 h) { return (size_t)(((u << (64-48)) * prime6bytes) >> (64-h)) ; }
473
+ static size_t ZSTD_hash6Ptr(const void* p, U32 h) { return ZSTD_hash6(MEM_readLE64(p), h); }
474
+
475
+ static const U64 prime7bytes = 58295818150454627ULL;
476
+ static size_t ZSTD_hash7(U64 u, U32 h) { return (size_t)(((u << (64-56)) * prime7bytes) >> (64-h)) ; }
477
+ static size_t ZSTD_hash7Ptr(const void* p, U32 h) { return ZSTD_hash7(MEM_readLE64(p), h); }
478
+
479
+ static const U64 prime8bytes = 0xCF1BBCDCB7A56463ULL;
480
+ static size_t ZSTD_hash8(U64 u, U32 h) { return (size_t)(((u) * prime8bytes) >> (64-h)) ; }
481
+ static size_t ZSTD_hash8Ptr(const void* p, U32 h) { return ZSTD_hash8(MEM_readLE64(p), h); }
482
+
483
+ MEM_STATIC size_t ZSTD_hashPtr(const void* p, U32 hBits, U32 mls)
484
+ {
485
+ switch(mls)
486
+ {
487
+ default:
488
+ case 4: return ZSTD_hash4Ptr(p, hBits);
489
+ case 5: return ZSTD_hash5Ptr(p, hBits);
490
+ case 6: return ZSTD_hash6Ptr(p, hBits);
491
+ case 7: return ZSTD_hash7Ptr(p, hBits);
492
+ case 8: return ZSTD_hash8Ptr(p, hBits);
493
+ }
494
+ }
495
+
496
+ /** ZSTD_ipow() :
497
+ * Return base^exponent.
498
+ */
499
+ static U64 ZSTD_ipow(U64 base, U64 exponent)
500
+ {
501
+ U64 power = 1;
502
+ while (exponent) {
503
+ if (exponent & 1) power *= base;
504
+ exponent >>= 1;
505
+ base *= base;
506
+ }
507
+ return power;
508
+ }
509
+
510
+ #define ZSTD_ROLL_HASH_CHAR_OFFSET 10
511
+
512
+ /** ZSTD_rollingHash_append() :
513
+ * Add the buffer to the hash value.
514
+ */
515
+ static U64 ZSTD_rollingHash_append(U64 hash, void const* buf, size_t size)
516
+ {
517
+ BYTE const* istart = (BYTE const*)buf;
518
+ size_t pos;
519
+ for (pos = 0; pos < size; ++pos) {
520
+ hash *= prime8bytes;
521
+ hash += istart[pos] + ZSTD_ROLL_HASH_CHAR_OFFSET;
522
+ }
523
+ return hash;
524
+ }
525
+
526
+ /** ZSTD_rollingHash_compute() :
527
+ * Compute the rolling hash value of the buffer.
528
+ */
529
+ MEM_STATIC U64 ZSTD_rollingHash_compute(void const* buf, size_t size)
530
+ {
531
+ return ZSTD_rollingHash_append(0, buf, size);
532
+ }
533
+
534
+ /** ZSTD_rollingHash_primePower() :
535
+ * Compute the primePower to be passed to ZSTD_rollingHash_rotate() for a hash
536
+ * over a window of length bytes.
537
+ */
538
+ MEM_STATIC U64 ZSTD_rollingHash_primePower(U32 length)
539
+ {
540
+ return ZSTD_ipow(prime8bytes, length - 1);
541
+ }
542
+
543
+ /** ZSTD_rollingHash_rotate() :
544
+ * Rotate the rolling hash by one byte.
545
+ */
546
+ MEM_STATIC U64 ZSTD_rollingHash_rotate(U64 hash, BYTE toRemove, BYTE toAdd, U64 primePower)
547
+ {
548
+ hash -= (toRemove + ZSTD_ROLL_HASH_CHAR_OFFSET) * primePower;
549
+ hash *= prime8bytes;
550
+ hash += toAdd + ZSTD_ROLL_HASH_CHAR_OFFSET;
551
+ return hash;
552
+ }
553
+
554
+ /*-*************************************
555
+ * Round buffer management
556
+ ***************************************/
557
+ /* Max current allowed */
558
+ #define ZSTD_CURRENT_MAX ((3U << 29) + (1U << ZSTD_WINDOWLOG_MAX))
559
+ /* Maximum chunk size before overflow correction needs to be called again */
560
+ #define ZSTD_CHUNKSIZE_MAX \
561
+ ( ((U32)-1) /* Maximum ending current index */ \
562
+ - ZSTD_CURRENT_MAX) /* Maximum beginning lowLimit */
563
+
564
+ /**
565
+ * ZSTD_window_clear():
566
+ * Clears the window containing the history by simply setting it to empty.
567
+ */
568
+ MEM_STATIC void ZSTD_window_clear(ZSTD_window_t* window)
569
+ {
570
+ size_t const endT = (size_t)(window->nextSrc - window->base);
571
+ U32 const end = (U32)endT;
572
+
573
+ window->lowLimit = end;
574
+ window->dictLimit = end;
575
+ }
576
+
577
+ /**
578
+ * ZSTD_window_hasExtDict():
579
+ * Returns non-zero if the window has a non-empty extDict.
580
+ */
581
+ MEM_STATIC U32 ZSTD_window_hasExtDict(ZSTD_window_t const window)
582
+ {
583
+ return window.lowLimit < window.dictLimit;
584
+ }
585
+
586
+ /**
587
+ * ZSTD_matchState_dictMode():
588
+ * Inspects the provided matchState and figures out what dictMode should be
589
+ * passed to the compressor.
590
+ */
591
+ MEM_STATIC ZSTD_dictMode_e ZSTD_matchState_dictMode(const ZSTD_matchState_t *ms)
592
+ {
593
+ return ZSTD_window_hasExtDict(ms->window) ?
594
+ ZSTD_extDict :
595
+ ms->dictMatchState != NULL ?
596
+ ZSTD_dictMatchState :
597
+ ZSTD_noDict;
598
+ }
599
+
600
+ /**
601
+ * ZSTD_window_needOverflowCorrection():
602
+ * Returns non-zero if the indices are getting too large and need overflow
603
+ * protection.
604
+ */
605
+ MEM_STATIC U32 ZSTD_window_needOverflowCorrection(ZSTD_window_t const window,
606
+ void const* srcEnd)
607
+ {
608
+ U32 const current = (U32)((BYTE const*)srcEnd - window.base);
609
+ return current > ZSTD_CURRENT_MAX;
610
+ }
611
+
612
+ /**
613
+ * ZSTD_window_correctOverflow():
614
+ * Reduces the indices to protect from index overflow.
615
+ * Returns the correction made to the indices, which must be applied to every
616
+ * stored index.
617
+ *
618
+ * The least significant cycleLog bits of the indices must remain the same,
619
+ * which may be 0. Every index up to maxDist in the past must be valid.
620
+ * NOTE: (maxDist & cycleMask) must be zero.
621
+ */
622
+ MEM_STATIC U32 ZSTD_window_correctOverflow(ZSTD_window_t* window, U32 cycleLog,
623
+ U32 maxDist, void const* src)
624
+ {
625
+ /* preemptive overflow correction:
626
+ * 1. correction is large enough:
627
+ * lowLimit > (3<<29) ==> current > 3<<29 + 1<<windowLog
628
+ * 1<<windowLog <= newCurrent < 1<<chainLog + 1<<windowLog
629
+ *
630
+ * current - newCurrent
631
+ * > (3<<29 + 1<<windowLog) - (1<<windowLog + 1<<chainLog)
632
+ * > (3<<29) - (1<<chainLog)
633
+ * > (3<<29) - (1<<30) (NOTE: chainLog <= 30)
634
+ * > 1<<29
635
+ *
636
+ * 2. (ip+ZSTD_CHUNKSIZE_MAX - cctx->base) doesn't overflow:
637
+ * After correction, current is less than (1<<chainLog + 1<<windowLog).
638
+ * In 64-bit mode we are safe, because we have 64-bit ptrdiff_t.
639
+ * In 32-bit mode we are safe, because (chainLog <= 29), so
640
+ * ip+ZSTD_CHUNKSIZE_MAX - cctx->base < 1<<32.
641
+ * 3. (cctx->lowLimit + 1<<windowLog) < 1<<32:
642
+ * windowLog <= 31 ==> 3<<29 + 1<<windowLog < 7<<29 < 1<<32.
643
+ */
644
+ U32 const cycleMask = (1U << cycleLog) - 1;
645
+ U32 const current = (U32)((BYTE const*)src - window->base);
646
+ U32 const newCurrent = (current & cycleMask) + maxDist;
647
+ U32 const correction = current - newCurrent;
648
+ assert((maxDist & cycleMask) == 0);
649
+ assert(current > newCurrent);
650
+ /* Loose bound, should be around 1<<29 (see above) */
651
+ assert(correction > 1<<28);
652
+
653
+ window->base += correction;
654
+ window->dictBase += correction;
655
+ window->lowLimit -= correction;
656
+ window->dictLimit -= correction;
657
+
658
+ DEBUGLOG(4, "Correction of 0x%x bytes to lowLimit=0x%x", correction,
659
+ window->lowLimit);
660
+ return correction;
661
+ }
662
+
663
+ /**
664
+ * ZSTD_window_enforceMaxDist():
665
+ * Updates lowLimit so that:
666
+ * (srcEnd - base) - lowLimit == maxDist + loadedDictEnd
667
+ *
668
+ * This allows a simple check that index >= lowLimit to see if index is valid.
669
+ * This must be called before a block compression call, with srcEnd as the block
670
+ * source end.
671
+ *
672
+ * If loadedDictEndPtr is not NULL, we set it to zero once we update lowLimit.
673
+ * This is because dictionaries are allowed to be referenced as long as the last
674
+ * byte of the dictionary is in the window, but once they are out of range,
675
+ * they cannot be referenced. If loadedDictEndPtr is NULL, we use
676
+ * loadedDictEnd == 0.
677
+ *
678
+ * In normal dict mode, the dict is between lowLimit and dictLimit. In
679
+ * dictMatchState mode, lowLimit and dictLimit are the same, and the dictionary
680
+ * is below them. forceWindow and dictMatchState are therefore incompatible.
681
+ */
682
+ MEM_STATIC void
683
+ ZSTD_window_enforceMaxDist(ZSTD_window_t* window,
684
+ void const* srcEnd,
685
+ U32 maxDist,
686
+ U32* loadedDictEndPtr,
687
+ const ZSTD_matchState_t** dictMatchStatePtr)
688
+ {
689
+ U32 const blockEndIdx = (U32)((BYTE const*)srcEnd - window->base);
690
+ U32 loadedDictEnd = (loadedDictEndPtr != NULL) ? *loadedDictEndPtr : 0;
691
+ DEBUGLOG(5, "ZSTD_window_enforceMaxDist: blockEndIdx=%u, maxDist=%u",
692
+ (unsigned)blockEndIdx, (unsigned)maxDist);
693
+ if (blockEndIdx > maxDist + loadedDictEnd) {
694
+ U32 const newLowLimit = blockEndIdx - maxDist;
695
+ if (window->lowLimit < newLowLimit) window->lowLimit = newLowLimit;
696
+ if (window->dictLimit < window->lowLimit) {
697
+ DEBUGLOG(5, "Update dictLimit to match lowLimit, from %u to %u",
698
+ (unsigned)window->dictLimit, (unsigned)window->lowLimit);
699
+ window->dictLimit = window->lowLimit;
700
+ }
701
+ if (loadedDictEndPtr)
702
+ *loadedDictEndPtr = 0;
703
+ if (dictMatchStatePtr)
704
+ *dictMatchStatePtr = NULL;
705
+ }
706
+ }
707
+
708
+ /**
709
+ * ZSTD_window_update():
710
+ * Updates the window by appending [src, src + srcSize) to the window.
711
+ * If it is not contiguous, the current prefix becomes the extDict, and we
712
+ * forget about the extDict. Handles overlap of the prefix and extDict.
713
+ * Returns non-zero if the segment is contiguous.
714
+ */
715
+ MEM_STATIC U32 ZSTD_window_update(ZSTD_window_t* window,
716
+ void const* src, size_t srcSize)
717
+ {
718
+ BYTE const* const ip = (BYTE const*)src;
719
+ U32 contiguous = 1;
720
+ DEBUGLOG(5, "ZSTD_window_update");
721
+ /* Check if blocks follow each other */
722
+ if (src != window->nextSrc) {
723
+ /* not contiguous */
724
+ size_t const distanceFromBase = (size_t)(window->nextSrc - window->base);
725
+ DEBUGLOG(5, "Non contiguous blocks, new segment starts at %u", window->dictLimit);
726
+ window->lowLimit = window->dictLimit;
727
+ assert(distanceFromBase == (size_t)(U32)distanceFromBase); /* should never overflow */
728
+ window->dictLimit = (U32)distanceFromBase;
729
+ window->dictBase = window->base;
730
+ window->base = ip - distanceFromBase;
731
+ // ms->nextToUpdate = window->dictLimit;
732
+ if (window->dictLimit - window->lowLimit < HASH_READ_SIZE) window->lowLimit = window->dictLimit; /* too small extDict */
733
+ contiguous = 0;
734
+ }
735
+ window->nextSrc = ip + srcSize;
736
+ /* if input and dictionary overlap : reduce dictionary (area presumed modified by input) */
737
+ if ( (ip+srcSize > window->dictBase + window->lowLimit)
738
+ & (ip < window->dictBase + window->dictLimit)) {
739
+ ptrdiff_t const highInputIdx = (ip + srcSize) - window->dictBase;
740
+ U32 const lowLimitMax = (highInputIdx > (ptrdiff_t)window->dictLimit) ? window->dictLimit : (U32)highInputIdx;
741
+ window->lowLimit = lowLimitMax;
742
+ DEBUGLOG(5, "Overlapping extDict and input : new lowLimit = %u", window->lowLimit);
743
+ }
744
+ return contiguous;
745
+ }
746
+
747
+
748
+ /* debug functions */
749
+ #if (DEBUGLEVEL>=2)
750
+
751
+ MEM_STATIC double ZSTD_fWeight(U32 rawStat)
752
+ {
753
+ U32 const fp_accuracy = 8;
754
+ U32 const fp_multiplier = (1 << fp_accuracy);
755
+ U32 const newStat = rawStat + 1;
756
+ U32 const hb = ZSTD_highbit32(newStat);
757
+ U32 const BWeight = hb * fp_multiplier;
758
+ U32 const FWeight = (newStat << fp_accuracy) >> hb;
759
+ U32 const weight = BWeight + FWeight;
760
+ assert(hb + fp_accuracy < 31);
761
+ return (double)weight / fp_multiplier;
762
+ }
763
+
764
+ /* display a table content,
765
+ * listing each element, its frequency, and its predicted bit cost */
766
+ MEM_STATIC void ZSTD_debugTable(const U32* table, U32 max)
767
+ {
768
+ unsigned u, sum;
769
+ for (u=0, sum=0; u<=max; u++) sum += table[u];
770
+ DEBUGLOG(2, "total nb elts: %u", sum);
771
+ for (u=0; u<=max; u++) {
772
+ DEBUGLOG(2, "%2u: %5u (%.2f)",
773
+ u, table[u], ZSTD_fWeight(sum) - ZSTD_fWeight(table[u]) );
774
+ }
775
+ }
776
+
777
+ #endif
778
+
779
+
780
+ #if defined (__cplusplus)
781
+ }
782
+ #endif
783
+
784
+
785
+ /* ==============================================================
786
+ * Private declarations
787
+ * These prototypes shall only be called from within lib/compress
788
+ * ============================================================== */
789
+
790
+ /* ZSTD_getCParamsFromCCtxParams() :
791
+ * cParams are built depending on compressionLevel, src size hints,
792
+ * LDM and manually set compression parameters.
793
+ */
794
+ ZSTD_compressionParameters ZSTD_getCParamsFromCCtxParams(
795
+ const ZSTD_CCtx_params* CCtxParams, U64 srcSizeHint, size_t dictSize);
796
+
797
+ /*! ZSTD_initCStream_internal() :
798
+ * Private use only. Init streaming operation.
799
+ * expects params to be valid.
800
+ * must receive dict, or cdict, or none, but not both.
801
+ * @return : 0, or an error code */
802
+ size_t ZSTD_initCStream_internal(ZSTD_CStream* zcs,
803
+ const void* dict, size_t dictSize,
804
+ const ZSTD_CDict* cdict,
805
+ ZSTD_CCtx_params params, unsigned long long pledgedSrcSize);
806
+
807
+ void ZSTD_resetSeqStore(seqStore_t* ssPtr);
808
+
809
+ /*! ZSTD_compressStream_generic() :
810
+ * Private use only. To be called from zstdmt_compress.c in single-thread mode. */
811
+ size_t ZSTD_compressStream_generic(ZSTD_CStream* zcs,
812
+ ZSTD_outBuffer* output,
813
+ ZSTD_inBuffer* input,
814
+ ZSTD_EndDirective const flushMode);
815
+
816
+ /*! ZSTD_getCParamsFromCDict() :
817
+ * as the name implies */
818
+ ZSTD_compressionParameters ZSTD_getCParamsFromCDict(const ZSTD_CDict* cdict);
819
+
820
+ /* ZSTD_compressBegin_advanced_internal() :
821
+ * Private use only. To be called from zstdmt_compress.c. */
822
+ size_t ZSTD_compressBegin_advanced_internal(ZSTD_CCtx* cctx,
823
+ const void* dict, size_t dictSize,
824
+ ZSTD_dictContentType_e dictContentType,
825
+ ZSTD_dictTableLoadMethod_e dtlm,
826
+ const ZSTD_CDict* cdict,
827
+ ZSTD_CCtx_params params,
828
+ unsigned long long pledgedSrcSize);
829
+
830
+ /* ZSTD_compress_advanced_internal() :
831
+ * Private use only. To be called from zstdmt_compress.c. */
832
+ size_t ZSTD_compress_advanced_internal(ZSTD_CCtx* cctx,
833
+ void* dst, size_t dstCapacity,
834
+ const void* src, size_t srcSize,
835
+ const void* dict,size_t dictSize,
836
+ ZSTD_CCtx_params params);
837
+
838
+
839
+ /* ZSTD_writeLastEmptyBlock() :
840
+ * output an empty Block with end-of-frame mark to complete a frame
841
+ * @return : size of data written into `dst` (== ZSTD_blockHeaderSize (defined in zstd_internal.h))
842
+ * or an error code if `dstCapcity` is too small (<ZSTD_blockHeaderSize)
843
+ */
844
+ size_t ZSTD_writeLastEmptyBlock(void* dst, size_t dstCapacity);
845
+
846
+
847
+ /* ZSTD_referenceExternalSequences() :
848
+ * Must be called before starting a compression operation.
849
+ * seqs must parse a prefix of the source.
850
+ * This cannot be used when long range matching is enabled.
851
+ * Zstd will use these sequences, and pass the literals to a secondary block
852
+ * compressor.
853
+ * @return : An error code on failure.
854
+ * NOTE: seqs are not verified! Invalid sequences can cause out-of-bounds memory
855
+ * access and data corruption.
856
+ */
857
+ size_t ZSTD_referenceExternalSequences(ZSTD_CCtx* cctx, rawSeq* seq, size_t nbSeq);
858
+
859
+
860
+ #endif /* ZSTD_COMPRESS_H */