zstd-ruby 1.4.4.0 → 1.5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +8 -0
  3. data/.github/workflows/ruby.yml +35 -0
  4. data/README.md +2 -2
  5. data/ext/zstdruby/extconf.rb +1 -0
  6. data/ext/zstdruby/libzstd/BUCK +5 -7
  7. data/ext/zstdruby/libzstd/Makefile +241 -173
  8. data/ext/zstdruby/libzstd/README.md +76 -18
  9. data/ext/zstdruby/libzstd/common/bitstream.h +75 -57
  10. data/ext/zstdruby/libzstd/common/compiler.h +196 -20
  11. data/ext/zstdruby/libzstd/common/cpu.h +1 -3
  12. data/ext/zstdruby/libzstd/common/debug.c +11 -31
  13. data/ext/zstdruby/libzstd/common/debug.h +22 -49
  14. data/ext/zstdruby/libzstd/common/entropy_common.c +208 -76
  15. data/ext/zstdruby/libzstd/common/error_private.c +3 -1
  16. data/ext/zstdruby/libzstd/common/error_private.h +87 -4
  17. data/ext/zstdruby/libzstd/common/fse.h +51 -42
  18. data/ext/zstdruby/libzstd/common/fse_decompress.c +149 -57
  19. data/ext/zstdruby/libzstd/common/huf.h +60 -54
  20. data/ext/zstdruby/libzstd/common/mem.h +87 -98
  21. data/ext/zstdruby/libzstd/common/pool.c +23 -17
  22. data/ext/zstdruby/libzstd/common/pool.h +3 -3
  23. data/ext/zstdruby/libzstd/common/portability_macros.h +131 -0
  24. data/ext/zstdruby/libzstd/common/threading.c +10 -8
  25. data/ext/zstdruby/libzstd/common/threading.h +4 -3
  26. data/ext/zstdruby/libzstd/common/xxhash.c +15 -873
  27. data/ext/zstdruby/libzstd/common/xxhash.h +5572 -191
  28. data/ext/zstdruby/libzstd/common/zstd_common.c +10 -10
  29. data/ext/zstdruby/libzstd/common/zstd_deps.h +111 -0
  30. data/ext/zstdruby/libzstd/common/zstd_internal.h +252 -108
  31. data/ext/zstdruby/libzstd/common/zstd_trace.h +163 -0
  32. data/ext/zstdruby/libzstd/compress/clevels.h +134 -0
  33. data/ext/zstdruby/libzstd/compress/fse_compress.c +105 -85
  34. data/ext/zstdruby/libzstd/compress/hist.c +41 -63
  35. data/ext/zstdruby/libzstd/compress/hist.h +13 -33
  36. data/ext/zstdruby/libzstd/compress/huf_compress.c +831 -259
  37. data/ext/zstdruby/libzstd/compress/zstd_compress.c +3213 -1007
  38. data/ext/zstdruby/libzstd/compress/zstd_compress_internal.h +493 -71
  39. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.c +21 -16
  40. data/ext/zstdruby/libzstd/compress/zstd_compress_literals.h +4 -2
  41. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.c +51 -24
  42. data/ext/zstdruby/libzstd/compress/zstd_compress_sequences.h +10 -3
  43. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.c +573 -0
  44. data/ext/zstdruby/libzstd/compress/zstd_compress_superblock.h +32 -0
  45. data/ext/zstdruby/libzstd/compress/zstd_cwksp.h +208 -81
  46. data/ext/zstdruby/libzstd/compress/zstd_double_fast.c +315 -137
  47. data/ext/zstdruby/libzstd/compress/zstd_double_fast.h +2 -2
  48. data/ext/zstdruby/libzstd/compress/zstd_fast.c +319 -128
  49. data/ext/zstdruby/libzstd/compress/zstd_fast.h +2 -2
  50. data/ext/zstdruby/libzstd/compress/zstd_lazy.c +1156 -171
  51. data/ext/zstdruby/libzstd/compress/zstd_lazy.h +59 -1
  52. data/ext/zstdruby/libzstd/compress/zstd_ldm.c +331 -206
  53. data/ext/zstdruby/libzstd/compress/zstd_ldm.h +15 -3
  54. data/ext/zstdruby/libzstd/compress/zstd_ldm_geartab.h +106 -0
  55. data/ext/zstdruby/libzstd/compress/zstd_opt.c +403 -226
  56. data/ext/zstdruby/libzstd/compress/zstd_opt.h +1 -1
  57. data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +188 -453
  58. data/ext/zstdruby/libzstd/compress/zstdmt_compress.h +32 -114
  59. data/ext/zstdruby/libzstd/decompress/huf_decompress.c +1065 -410
  60. data/ext/zstdruby/libzstd/decompress/huf_decompress_amd64.S +571 -0
  61. data/ext/zstdruby/libzstd/decompress/zstd_ddict.c +20 -16
  62. data/ext/zstdruby/libzstd/decompress/zstd_ddict.h +3 -3
  63. data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +691 -230
  64. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.c +1072 -323
  65. data/ext/zstdruby/libzstd/decompress/zstd_decompress_block.h +16 -7
  66. data/ext/zstdruby/libzstd/decompress/zstd_decompress_internal.h +71 -10
  67. data/ext/zstdruby/libzstd/deprecated/zbuff.h +3 -3
  68. data/ext/zstdruby/libzstd/deprecated/zbuff_common.c +2 -2
  69. data/ext/zstdruby/libzstd/deprecated/zbuff_compress.c +24 -4
  70. data/ext/zstdruby/libzstd/deprecated/zbuff_decompress.c +1 -1
  71. data/ext/zstdruby/libzstd/dictBuilder/cover.c +57 -40
  72. data/ext/zstdruby/libzstd/dictBuilder/cover.h +20 -9
  73. data/ext/zstdruby/libzstd/dictBuilder/divsufsort.c +1 -1
  74. data/ext/zstdruby/libzstd/dictBuilder/fastcover.c +54 -35
  75. data/ext/zstdruby/libzstd/dictBuilder/zdict.c +151 -57
  76. data/ext/zstdruby/libzstd/dll/example/Makefile +2 -1
  77. data/ext/zstdruby/libzstd/dll/example/README.md +16 -22
  78. data/ext/zstdruby/libzstd/legacy/zstd_legacy.h +4 -4
  79. data/ext/zstdruby/libzstd/legacy/zstd_v01.c +25 -19
  80. data/ext/zstdruby/libzstd/legacy/zstd_v01.h +1 -1
  81. data/ext/zstdruby/libzstd/legacy/zstd_v02.c +18 -14
  82. data/ext/zstdruby/libzstd/legacy/zstd_v02.h +1 -1
  83. data/ext/zstdruby/libzstd/legacy/zstd_v03.c +18 -14
  84. data/ext/zstdruby/libzstd/legacy/zstd_v03.h +1 -1
  85. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +22 -16
  86. data/ext/zstdruby/libzstd/legacy/zstd_v04.h +1 -1
  87. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +29 -25
  88. data/ext/zstdruby/libzstd/legacy/zstd_v05.h +2 -2
  89. data/ext/zstdruby/libzstd/legacy/zstd_v06.c +29 -25
  90. data/ext/zstdruby/libzstd/legacy/zstd_v06.h +1 -1
  91. data/ext/zstdruby/libzstd/legacy/zstd_v07.c +34 -26
  92. data/ext/zstdruby/libzstd/legacy/zstd_v07.h +1 -1
  93. data/ext/zstdruby/libzstd/libzstd.mk +185 -0
  94. data/ext/zstdruby/libzstd/libzstd.pc.in +4 -3
  95. data/ext/zstdruby/libzstd/modulemap/module.modulemap +4 -0
  96. data/ext/zstdruby/libzstd/{dictBuilder/zdict.h → zdict.h} +201 -31
  97. data/ext/zstdruby/libzstd/zstd.h +760 -234
  98. data/ext/zstdruby/libzstd/{common/zstd_errors.h → zstd_errors.h} +3 -1
  99. data/ext/zstdruby/zstdruby.c +2 -2
  100. data/lib/zstd-ruby/version.rb +1 -1
  101. metadata +20 -9
  102. data/.travis.yml +0 -14
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-present, 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
@@ -15,9 +15,9 @@
15
15
  /*-*******************************************************
16
16
  * Dependencies
17
17
  *********************************************************/
18
- #include <stddef.h> /* size_t */
19
- #include "zstd.h" /* DCtx, and some public functions */
20
- #include "zstd_internal.h" /* blockProperties_t, and some public functions */
18
+ #include "../common/zstd_deps.h" /* size_t */
19
+ #include "../zstd.h" /* DCtx, and some public functions */
20
+ #include "../common/zstd_internal.h" /* blockProperties_t, and some public functions */
21
21
  #include "zstd_decompress_internal.h" /* ZSTD_seqSymbol */
22
22
 
23
23
 
@@ -33,6 +33,12 @@
33
33
  */
34
34
 
35
35
 
36
+ /* Streaming state is used to inform allocation of the literal buffer */
37
+ typedef enum {
38
+ not_streaming = 0,
39
+ is_streaming = 1
40
+ } streaming_operation;
41
+
36
42
  /* ZSTD_decompressBlock_internal() :
37
43
  * decompress block, starting at `src`,
38
44
  * into destination buffer `dst`.
@@ -41,19 +47,22 @@
41
47
  */
42
48
  size_t ZSTD_decompressBlock_internal(ZSTD_DCtx* dctx,
43
49
  void* dst, size_t dstCapacity,
44
- const void* src, size_t srcSize, const int frame);
50
+ const void* src, size_t srcSize, const int frame, const streaming_operation streaming);
45
51
 
46
52
  /* ZSTD_buildFSETable() :
47
53
  * generate FSE decoding table for one symbol (ll, ml or off)
48
54
  * this function must be called with valid parameters only
49
55
  * (dt is large enough, normalizedCounter distribution total is a power of 2, max is within range, etc.)
50
56
  * in which case it cannot fail.
57
+ * The workspace must be 4-byte aligned and at least ZSTD_BUILD_FSE_TABLE_WKSP_SIZE bytes, which is
58
+ * defined in zstd_decompress_internal.h.
51
59
  * Internal use only.
52
60
  */
53
61
  void ZSTD_buildFSETable(ZSTD_seqSymbol* dt,
54
62
  const short* normalizedCounter, unsigned maxSymbolValue,
55
- const U32* baseValue, const U32* nbAdditionalBits,
56
- unsigned tableLog);
63
+ const U32* baseValue, const U8* nbAdditionalBits,
64
+ unsigned tableLog, void* wksp, size_t wkspSize,
65
+ int bmi2);
57
66
 
58
67
 
59
68
  #endif /* ZSTD_DEC_BLOCK_H */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-present, 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
@@ -19,34 +19,34 @@
19
19
  /*-*******************************************************
20
20
  * Dependencies
21
21
  *********************************************************/
22
- #include "mem.h" /* BYTE, U16, U32 */
23
- #include "zstd_internal.h" /* ZSTD_seqSymbol */
22
+ #include "../common/mem.h" /* BYTE, U16, U32 */
23
+ #include "../common/zstd_internal.h" /* constants : MaxLL, MaxML, MaxOff, LLFSELog, etc. */
24
24
 
25
25
 
26
26
 
27
27
  /*-*******************************************************
28
28
  * Constants
29
29
  *********************************************************/
30
- static const U32 LL_base[MaxLL+1] = {
30
+ static UNUSED_ATTR const U32 LL_base[MaxLL+1] = {
31
31
  0, 1, 2, 3, 4, 5, 6, 7,
32
32
  8, 9, 10, 11, 12, 13, 14, 15,
33
33
  16, 18, 20, 22, 24, 28, 32, 40,
34
34
  48, 64, 0x80, 0x100, 0x200, 0x400, 0x800, 0x1000,
35
35
  0x2000, 0x4000, 0x8000, 0x10000 };
36
36
 
37
- static const U32 OF_base[MaxOff+1] = {
37
+ static UNUSED_ATTR const U32 OF_base[MaxOff+1] = {
38
38
  0, 1, 1, 5, 0xD, 0x1D, 0x3D, 0x7D,
39
39
  0xFD, 0x1FD, 0x3FD, 0x7FD, 0xFFD, 0x1FFD, 0x3FFD, 0x7FFD,
40
40
  0xFFFD, 0x1FFFD, 0x3FFFD, 0x7FFFD, 0xFFFFD, 0x1FFFFD, 0x3FFFFD, 0x7FFFFD,
41
41
  0xFFFFFD, 0x1FFFFFD, 0x3FFFFFD, 0x7FFFFFD, 0xFFFFFFD, 0x1FFFFFFD, 0x3FFFFFFD, 0x7FFFFFFD };
42
42
 
43
- static const U32 OF_bits[MaxOff+1] = {
43
+ static UNUSED_ATTR const U8 OF_bits[MaxOff+1] = {
44
44
  0, 1, 2, 3, 4, 5, 6, 7,
45
45
  8, 9, 10, 11, 12, 13, 14, 15,
46
46
  16, 17, 18, 19, 20, 21, 22, 23,
47
47
  24, 25, 26, 27, 28, 29, 30, 31 };
48
48
 
49
- static const U32 ML_base[MaxML+1] = {
49
+ static UNUSED_ATTR const U32 ML_base[MaxML+1] = {
50
50
  3, 4, 5, 6, 7, 8, 9, 10,
51
51
  11, 12, 13, 14, 15, 16, 17, 18,
52
52
  19, 20, 21, 22, 23, 24, 25, 26,
@@ -73,12 +73,16 @@ static const U32 ML_base[MaxML+1] = {
73
73
 
74
74
  #define SEQSYMBOL_TABLE_SIZE(log) (1 + (1 << (log)))
75
75
 
76
+ #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE (sizeof(S16) * (MaxSeq + 1) + (1u << MaxFSELog) + sizeof(U64))
77
+ #define ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32 ((ZSTD_BUILD_FSE_TABLE_WKSP_SIZE + sizeof(U32) - 1) / sizeof(U32))
78
+
76
79
  typedef struct {
77
80
  ZSTD_seqSymbol LLTable[SEQSYMBOL_TABLE_SIZE(LLFSELog)]; /* Note : Space reserved for FSE Tables */
78
81
  ZSTD_seqSymbol OFTable[SEQSYMBOL_TABLE_SIZE(OffFSELog)]; /* is also used as temporary workspace while building hufTable during DDict creation */
79
82
  ZSTD_seqSymbol MLTable[SEQSYMBOL_TABLE_SIZE(MLFSELog)]; /* and therefore must be at least HUF_DECOMPRESS_WORKSPACE_SIZE large */
80
83
  HUF_DTable hufTable[HUF_DTABLE_SIZE(HufLog)]; /* can accommodate HUF_decompress4X */
81
84
  U32 rep[ZSTD_REP_NUM];
85
+ U32 workspace[ZSTD_BUILD_FSE_TABLE_WKSP_SIZE_U32];
82
86
  } ZSTD_entropyDTables_t;
83
87
 
84
88
  typedef enum { ZSTDds_getFrameHeaderSize, ZSTDds_decodeFrameHeader,
@@ -95,6 +99,29 @@ typedef enum {
95
99
  ZSTD_use_once = 1 /* Use the dictionary once and set to ZSTD_dont_use */
96
100
  } ZSTD_dictUses_e;
97
101
 
102
+ /* Hashset for storing references to multiple ZSTD_DDict within ZSTD_DCtx */
103
+ typedef struct {
104
+ const ZSTD_DDict** ddictPtrTable;
105
+ size_t ddictPtrTableSize;
106
+ size_t ddictPtrCount;
107
+ } ZSTD_DDictHashSet;
108
+
109
+ #ifndef ZSTD_DECODER_INTERNAL_BUFFER
110
+ # define ZSTD_DECODER_INTERNAL_BUFFER (1 << 16)
111
+ #endif
112
+
113
+ #define ZSTD_LBMIN 64
114
+ #define ZSTD_LBMAX (128 << 10)
115
+
116
+ /* extra buffer, compensates when dst is not large enough to store litBuffer */
117
+ #define ZSTD_LITBUFFEREXTRASIZE BOUNDED(ZSTD_LBMIN, ZSTD_DECODER_INTERNAL_BUFFER, ZSTD_LBMAX)
118
+
119
+ typedef enum {
120
+ ZSTD_not_in_dst = 0, /* Stored entirely within litExtraBuffer */
121
+ ZSTD_in_dst = 1, /* Stored entirely within dst (in memory after current output write) */
122
+ ZSTD_split = 2 /* Split between litExtraBuffer and dst */
123
+ } ZSTD_litLocation_e;
124
+
98
125
  struct ZSTD_DCtx_s
99
126
  {
100
127
  const ZSTD_seqSymbol* LLTptr;
@@ -109,6 +136,7 @@ struct ZSTD_DCtx_s
109
136
  const void* dictEnd; /* end of previous segment */
110
137
  size_t expected;
111
138
  ZSTD_frameHeader fParams;
139
+ U64 processedCSize;
112
140
  U64 decodedSize;
113
141
  blockType_e bType; /* used in ZSTD_decompressContinue(), store blockType between block header decoding and block decompression stages */
114
142
  ZSTD_dStage stage;
@@ -117,12 +145,16 @@ struct ZSTD_DCtx_s
117
145
  XXH64_state_t xxhState;
118
146
  size_t headerSize;
119
147
  ZSTD_format_e format;
148
+ ZSTD_forceIgnoreChecksum_e forceIgnoreChecksum; /* User specified: if == 1, will ignore checksums in compressed frame. Default == 0 */
149
+ U32 validateChecksum; /* if == 1, will validate checksum. Is == 1 if (fParams.checksumFlag == 1) and (forceIgnoreChecksum == 0). */
120
150
  const BYTE* litPtr;
121
151
  ZSTD_customMem customMem;
122
152
  size_t litSize;
123
153
  size_t rleSize;
124
154
  size_t staticSize;
155
+ #if DYNAMIC_BMI2 != 0
125
156
  int bmi2; /* == 1 if the CPU supports BMI2 and 0 otherwise. CPU support is determined dynamically once per context lifetime. */
157
+ #endif
126
158
 
127
159
  /* dictionary */
128
160
  ZSTD_DDict* ddictLocal;
@@ -130,6 +162,8 @@ struct ZSTD_DCtx_s
130
162
  U32 dictID;
131
163
  int ddictIsCold; /* if == 1 : dictionary is "new" for working context, and presumed "cold" (not in cpu cache) */
132
164
  ZSTD_dictUses_e dictUses;
165
+ ZSTD_DDictHashSet* ddictSet; /* Hash set for multiple ddicts */
166
+ ZSTD_refMultipleDDicts_e refMultipleDDicts; /* User specified: if == 1, will allow references to multiple DDicts. Default == 0 (disabled) */
133
167
 
134
168
  /* streaming */
135
169
  ZSTD_dStreamStage streamStage;
@@ -142,17 +176,44 @@ struct ZSTD_DCtx_s
142
176
  size_t outStart;
143
177
  size_t outEnd;
144
178
  size_t lhSize;
179
+ #if defined(ZSTD_LEGACY_SUPPORT) && (ZSTD_LEGACY_SUPPORT>=1)
145
180
  void* legacyContext;
146
181
  U32 previousLegacyVersion;
147
182
  U32 legacyVersion;
183
+ #endif
148
184
  U32 hostageByte;
149
185
  int noForwardProgress;
186
+ ZSTD_bufferMode_e outBufferMode;
187
+ ZSTD_outBuffer expectedOutBuffer;
150
188
 
151
189
  /* workspace */
152
- BYTE litBuffer[ZSTD_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
190
+ BYTE* litBuffer;
191
+ const BYTE* litBufferEnd;
192
+ ZSTD_litLocation_e litBufferLocation;
193
+ BYTE litExtraBuffer[ZSTD_LITBUFFEREXTRASIZE + WILDCOPY_OVERLENGTH]; /* literal buffer can be split between storage within dst and within this scratch buffer */
153
194
  BYTE headerBuffer[ZSTD_FRAMEHEADERSIZE_MAX];
195
+
196
+ size_t oversizedDuration;
197
+
198
+ #ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
199
+ void const* dictContentBeginForFuzzing;
200
+ void const* dictContentEndForFuzzing;
201
+ #endif
202
+
203
+ /* Tracing */
204
+ #if ZSTD_TRACE
205
+ ZSTD_TraceCtx traceCtx;
206
+ #endif
154
207
  }; /* typedef'd to ZSTD_DCtx within "zstd.h" */
155
208
 
209
+ MEM_STATIC int ZSTD_DCtx_get_bmi2(const struct ZSTD_DCtx_s *dctx) {
210
+ #if DYNAMIC_BMI2 != 0
211
+ return dctx->bmi2;
212
+ #else
213
+ (void)dctx;
214
+ return 0;
215
+ #endif
216
+ }
156
217
 
157
218
  /*-*******************************************************
158
219
  * Shared internal functions
@@ -160,7 +221,7 @@ struct ZSTD_DCtx_s
160
221
 
161
222
  /*! ZSTD_loadDEntropy() :
162
223
  * dict : must point at beginning of a valid zstd dictionary.
163
- * @return : size of entropy tables read */
224
+ * @return : size of dictionary header (size of magic number + dict ID + entropy tables) */
164
225
  size_t ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy,
165
226
  const void* const dict, size_t const dictSize);
166
227
 
@@ -169,7 +230,7 @@ size_t ZSTD_loadDEntropy(ZSTD_entropyDTables_t* entropy,
169
230
  * If yes, do nothing (continue on current segment).
170
231
  * If not, classify previous segment as "external dictionary", and start a new segment.
171
232
  * This function cannot fail. */
172
- void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst);
233
+ void ZSTD_checkContinuity(ZSTD_DCtx* dctx, const void* dst, size_t dstSize);
173
234
 
174
235
 
175
236
  #endif /* ZSTD_DECOMPRESS_INTERNAL_H */
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-present, 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
@@ -28,7 +28,7 @@ extern "C" {
28
28
  * Dependencies
29
29
  ***************************************/
30
30
  #include <stddef.h> /* size_t */
31
- #include "zstd.h" /* ZSTD_CStream, ZSTD_DStream, ZSTDLIB_API */
31
+ #include "../zstd.h" /* ZSTD_CStream, ZSTD_DStream, ZSTDLIB_API */
32
32
 
33
33
 
34
34
  /* ***************************************************************
@@ -186,7 +186,7 @@ ZBUFF_DEPRECATED("use ZSTD_DStreamOutSize") size_t ZBUFF_recommendedDOutSize(voi
186
186
 
187
187
  /*--- Dependency ---*/
188
188
  #define ZSTD_STATIC_LINKING_ONLY /* ZSTD_parameters, ZSTD_customMem */
189
- #include "zstd.h"
189
+ #include "../zstd.h"
190
190
 
191
191
 
192
192
  /*--- Custom memory allocator ---*/
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-present, 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
@@ -11,7 +11,7 @@
11
11
  /*-*************************************
12
12
  * Dependencies
13
13
  ***************************************/
14
- #include "error_private.h"
14
+ #include "../common/error_private.h"
15
15
  #include "zbuff.h"
16
16
 
17
17
  /*-****************************************
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-present, 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
@@ -15,6 +15,7 @@
15
15
  ***************************************/
16
16
  #define ZBUFF_STATIC_LINKING_ONLY
17
17
  #include "zbuff.h"
18
+ #include "../common/error_private.h"
18
19
 
19
20
 
20
21
  /*-***********************************************************
@@ -73,13 +74,32 @@ size_t ZBUFF_compressInit_advanced(ZBUFF_CCtx* zbc,
73
74
  ZSTD_parameters params, unsigned long long pledgedSrcSize)
74
75
  {
75
76
  if (pledgedSrcSize==0) pledgedSrcSize = ZSTD_CONTENTSIZE_UNKNOWN; /* preserve "0 == unknown" behavior */
76
- return ZSTD_initCStream_advanced(zbc, dict, dictSize, params, pledgedSrcSize);
77
+ FORWARD_IF_ERROR(ZSTD_CCtx_reset(zbc, ZSTD_reset_session_only), "");
78
+ FORWARD_IF_ERROR(ZSTD_CCtx_setPledgedSrcSize(zbc, pledgedSrcSize), "");
79
+
80
+ FORWARD_IF_ERROR(ZSTD_checkCParams(params.cParams), "");
81
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_windowLog, params.cParams.windowLog), "");
82
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_hashLog, params.cParams.hashLog), "");
83
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_chainLog, params.cParams.chainLog), "");
84
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_searchLog, params.cParams.searchLog), "");
85
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_minMatch, params.cParams.minMatch), "");
86
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_targetLength, params.cParams.targetLength), "");
87
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_strategy, params.cParams.strategy), "");
88
+
89
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_contentSizeFlag, params.fParams.contentSizeFlag), "");
90
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_checksumFlag, params.fParams.checksumFlag), "");
91
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_dictIDFlag, params.fParams.noDictIDFlag), "");
92
+
93
+ FORWARD_IF_ERROR(ZSTD_CCtx_loadDictionary(zbc, dict, dictSize), "");
94
+ return 0;
77
95
  }
78
96
 
79
-
80
97
  size_t ZBUFF_compressInitDictionary(ZBUFF_CCtx* zbc, const void* dict, size_t dictSize, int compressionLevel)
81
98
  {
82
- return ZSTD_initCStream_usingDict(zbc, dict, dictSize, compressionLevel);
99
+ FORWARD_IF_ERROR(ZSTD_CCtx_reset(zbc, ZSTD_reset_session_only), "");
100
+ FORWARD_IF_ERROR(ZSTD_CCtx_setParameter(zbc, ZSTD_c_compressionLevel, compressionLevel), "");
101
+ FORWARD_IF_ERROR(ZSTD_CCtx_loadDictionary(zbc, dict, dictSize), "");
102
+ return 0;
83
103
  }
84
104
 
85
105
  size_t ZBUFF_compressInit(ZBUFF_CCtx* zbc, int compressionLevel)
@@ -1,5 +1,5 @@
1
1
  /*
2
- * Copyright (c) 2016-present, 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-present, 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
@@ -26,47 +26,64 @@
26
26
  #include <string.h> /* memset */
27
27
  #include <time.h> /* clock */
28
28
 
29
- #include "mem.h" /* read */
30
- #include "pool.h"
31
- #include "threading.h"
32
- #include "cover.h"
33
- #include "zstd_internal.h" /* includes zstd.h */
34
29
  #ifndef ZDICT_STATIC_LINKING_ONLY
35
- #define ZDICT_STATIC_LINKING_ONLY
30
+ # define ZDICT_STATIC_LINKING_ONLY
36
31
  #endif
37
- #include "zdict.h"
32
+
33
+ #include "../common/mem.h" /* read */
34
+ #include "../common/pool.h"
35
+ #include "../common/threading.h"
36
+ #include "../common/zstd_internal.h" /* includes zstd.h */
37
+ #include "../zdict.h"
38
+ #include "cover.h"
38
39
 
39
40
  /*-*************************************
40
41
  * Constants
41
42
  ***************************************/
43
+ /**
44
+ * There are 32bit indexes used to ref samples, so limit samples size to 4GB
45
+ * on 64bit builds.
46
+ * For 32bit builds we choose 1 GB.
47
+ * Most 32bit platforms have 2GB user-mode addressable space and we allocate a large
48
+ * contiguous buffer, so 1GB is already a high limit.
49
+ */
42
50
  #define COVER_MAX_SAMPLES_SIZE (sizeof(size_t) == 8 ? ((unsigned)-1) : ((unsigned)1 GB))
43
- #define DEFAULT_SPLITPOINT 1.0
51
+ #define COVER_DEFAULT_SPLITPOINT 1.0
44
52
 
45
53
  /*-*************************************
46
54
  * Console display
47
55
  ***************************************/
48
- static int g_displayLevel = 2;
56
+ #ifndef LOCALDISPLAYLEVEL
57
+ static int g_displayLevel = 0;
58
+ #endif
59
+ #undef DISPLAY
49
60
  #define DISPLAY(...) \
50
61
  { \
51
62
  fprintf(stderr, __VA_ARGS__); \
52
63
  fflush(stderr); \
53
64
  }
65
+ #undef LOCALDISPLAYLEVEL
54
66
  #define LOCALDISPLAYLEVEL(displayLevel, l, ...) \
55
67
  if (displayLevel >= l) { \
56
68
  DISPLAY(__VA_ARGS__); \
57
69
  } /* 0 : no display; 1: errors; 2: default; 3: details; 4: debug */
70
+ #undef DISPLAYLEVEL
58
71
  #define DISPLAYLEVEL(l, ...) LOCALDISPLAYLEVEL(g_displayLevel, l, __VA_ARGS__)
59
72
 
73
+ #ifndef LOCALDISPLAYUPDATE
74
+ static const clock_t g_refreshRate = CLOCKS_PER_SEC * 15 / 100;
75
+ static clock_t g_time = 0;
76
+ #endif
77
+ #undef LOCALDISPLAYUPDATE
60
78
  #define LOCALDISPLAYUPDATE(displayLevel, l, ...) \
61
79
  if (displayLevel >= l) { \
62
- if ((clock() - g_time > refreshRate) || (displayLevel >= 4)) { \
80
+ if ((clock() - g_time > g_refreshRate) || (displayLevel >= 4)) { \
63
81
  g_time = clock(); \
64
82
  DISPLAY(__VA_ARGS__); \
65
83
  } \
66
84
  }
85
+ #undef DISPLAYUPDATE
67
86
  #define DISPLAYUPDATE(l, ...) LOCALDISPLAYUPDATE(g_displayLevel, l, __VA_ARGS__)
68
- static const clock_t refreshRate = CLOCKS_PER_SEC * 15 / 100;
69
- static clock_t g_time = 0;
70
87
 
71
88
  /*-*************************************
72
89
  * Hash table
@@ -120,9 +137,9 @@ static int COVER_map_init(COVER_map_t *map, U32 size) {
120
137
  /**
121
138
  * Internal hash function
122
139
  */
123
- static const U32 prime4bytes = 2654435761U;
140
+ static const U32 COVER_prime4bytes = 2654435761U;
124
141
  static U32 COVER_map_hash(COVER_map_t *map, U32 key) {
125
- return (key * prime4bytes) >> (32 - map->sizeLog);
142
+ return (key * COVER_prime4bytes) >> (32 - map->sizeLog);
126
143
  }
127
144
 
128
145
  /**
@@ -215,7 +232,7 @@ typedef struct {
215
232
  } COVER_ctx_t;
216
233
 
217
234
  /* We need a global context for qsort... */
218
- static COVER_ctx_t *g_ctx = NULL;
235
+ static COVER_ctx_t *g_coverCtx = NULL;
219
236
 
220
237
  /*-*************************************
221
238
  * Helper functions
@@ -258,11 +275,11 @@ static int COVER_cmp8(COVER_ctx_t *ctx, const void *lp, const void *rp) {
258
275
 
259
276
  /**
260
277
  * Same as COVER_cmp() except ties are broken by pointer value
261
- * NOTE: g_ctx must be set to call this function. A global is required because
278
+ * NOTE: g_coverCtx must be set to call this function. A global is required because
262
279
  * qsort doesn't take an opaque pointer.
263
280
  */
264
- static int COVER_strict_cmp(const void *lp, const void *rp) {
265
- int result = COVER_cmp(g_ctx, lp, rp);
281
+ static int WIN_CDECL COVER_strict_cmp(const void *lp, const void *rp) {
282
+ int result = COVER_cmp(g_coverCtx, lp, rp);
266
283
  if (result == 0) {
267
284
  result = lp < rp ? -1 : 1;
268
285
  }
@@ -271,8 +288,8 @@ static int COVER_strict_cmp(const void *lp, const void *rp) {
271
288
  /**
272
289
  * Faster version for d <= 8.
273
290
  */
274
- static int COVER_strict_cmp8(const void *lp, const void *rp) {
275
- int result = COVER_cmp8(g_ctx, lp, rp);
291
+ static int WIN_CDECL COVER_strict_cmp8(const void *lp, const void *rp) {
292
+ int result = COVER_cmp8(g_coverCtx, lp, rp);
276
293
  if (result == 0) {
277
294
  result = lp < rp ? -1 : 1;
278
295
  }
@@ -603,7 +620,7 @@ static size_t COVER_ctx_init(COVER_ctx_t *ctx, const void *samplesBuffer,
603
620
  /* qsort doesn't take an opaque pointer, so pass as a global.
604
621
  * On OpenBSD qsort() is not guaranteed to be stable, their mergesort() is.
605
622
  */
606
- g_ctx = ctx;
623
+ g_coverCtx = ctx;
607
624
  #if defined(__OpenBSD__)
608
625
  mergesort(ctx->suffix, ctx->suffixSize, sizeof(U32),
609
626
  (ctx->d <= 8 ? &COVER_strict_cmp8 : &COVER_strict_cmp));
@@ -725,7 +742,7 @@ ZDICTLIB_API size_t ZDICT_trainFromBuffer_cover(
725
742
  COVER_map_t activeDmers;
726
743
  parameters.splitPoint = 1.0;
727
744
  /* Initialize global data */
728
- g_displayLevel = parameters.zParams.notificationLevel;
745
+ g_displayLevel = (int)parameters.zParams.notificationLevel;
729
746
  /* Checks */
730
747
  if (!COVER_checkParameters(parameters, dictBufferCapacity)) {
731
748
  DISPLAYLEVEL(1, "Cover parameters incorrect\n");
@@ -946,7 +963,7 @@ void COVER_dictSelectionFree(COVER_dictSelection_t selection){
946
963
  free(selection.dictContent);
947
964
  }
948
965
 
949
- COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent,
966
+ COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent, size_t dictBufferCapacity,
950
967
  size_t dictContentSize, const BYTE* samplesBuffer, const size_t* samplesSizes, unsigned nbFinalizeSamples,
951
968
  size_t nbCheckSamples, size_t nbSamples, ZDICT_cover_params_t params, size_t* offsets, size_t totalCompressedSize) {
952
969
 
@@ -954,8 +971,8 @@ COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent,
954
971
  size_t largestCompressed = 0;
955
972
  BYTE* customDictContentEnd = customDictContent + dictContentSize;
956
973
 
957
- BYTE * largestDictbuffer = (BYTE *)malloc(dictContentSize);
958
- BYTE * candidateDictBuffer = (BYTE *)malloc(dictContentSize);
974
+ BYTE * largestDictbuffer = (BYTE *)malloc(dictBufferCapacity);
975
+ BYTE * candidateDictBuffer = (BYTE *)malloc(dictBufferCapacity);
959
976
  double regressionTolerance = ((double)params.shrinkDictMaxRegression / 100.0) + 1.00;
960
977
 
961
978
  if (!largestDictbuffer || !candidateDictBuffer) {
@@ -967,7 +984,7 @@ COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent,
967
984
  /* Initial dictionary size and compressed size */
968
985
  memcpy(largestDictbuffer, customDictContent, dictContentSize);
969
986
  dictContentSize = ZDICT_finalizeDictionary(
970
- largestDictbuffer, dictContentSize, customDictContent, dictContentSize,
987
+ largestDictbuffer, dictBufferCapacity, customDictContent, dictContentSize,
971
988
  samplesBuffer, samplesSizes, nbFinalizeSamples, params.zParams);
972
989
 
973
990
  if (ZDICT_isError(dictContentSize)) {
@@ -1001,7 +1018,7 @@ COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent,
1001
1018
  while (dictContentSize < largestDict) {
1002
1019
  memcpy(candidateDictBuffer, largestDictbuffer, largestDict);
1003
1020
  dictContentSize = ZDICT_finalizeDictionary(
1004
- candidateDictBuffer, dictContentSize, customDictContentEnd - dictContentSize, dictContentSize,
1021
+ candidateDictBuffer, dictBufferCapacity, customDictContentEnd - dictContentSize, dictContentSize,
1005
1022
  samplesBuffer, samplesSizes, nbFinalizeSamples, params.zParams);
1006
1023
 
1007
1024
  if (ZDICT_isError(dictContentSize)) {
@@ -1053,18 +1070,19 @@ typedef struct COVER_tryParameters_data_s {
1053
1070
  * This function is thread safe if zstd is compiled with multithreaded support.
1054
1071
  * It takes its parameters as an *OWNING* opaque pointer to support threading.
1055
1072
  */
1056
- static void COVER_tryParameters(void *opaque) {
1073
+ static void COVER_tryParameters(void *opaque)
1074
+ {
1057
1075
  /* Save parameters as local variables */
1058
- COVER_tryParameters_data_t *const data = (COVER_tryParameters_data_t *)opaque;
1076
+ COVER_tryParameters_data_t *const data = (COVER_tryParameters_data_t*)opaque;
1059
1077
  const COVER_ctx_t *const ctx = data->ctx;
1060
1078
  const ZDICT_cover_params_t parameters = data->parameters;
1061
1079
  size_t dictBufferCapacity = data->dictBufferCapacity;
1062
1080
  size_t totalCompressedSize = ERROR(GENERIC);
1063
1081
  /* Allocate space for hash table, dict, and freqs */
1064
1082
  COVER_map_t activeDmers;
1065
- BYTE *const dict = (BYTE * const)malloc(dictBufferCapacity);
1083
+ BYTE* const dict = (BYTE*)malloc(dictBufferCapacity);
1066
1084
  COVER_dictSelection_t selection = COVER_dictSelectionError(ERROR(GENERIC));
1067
- U32 *freqs = (U32 *)malloc(ctx->suffixSize * sizeof(U32));
1085
+ U32* const freqs = (U32*)malloc(ctx->suffixSize * sizeof(U32));
1068
1086
  if (!COVER_map_init(&activeDmers, parameters.k - parameters.d + 1)) {
1069
1087
  DISPLAYLEVEL(1, "Failed to allocate dmer map: out of memory\n");
1070
1088
  goto _cleanup;
@@ -1079,7 +1097,7 @@ static void COVER_tryParameters(void *opaque) {
1079
1097
  {
1080
1098
  const size_t tail = COVER_buildDictionary(ctx, freqs, &activeDmers, dict,
1081
1099
  dictBufferCapacity, parameters);
1082
- selection = COVER_selectDict(dict + tail, dictBufferCapacity - tail,
1100
+ selection = COVER_selectDict(dict + tail, dictBufferCapacity, dictBufferCapacity - tail,
1083
1101
  ctx->samples, ctx->samplesSizes, (unsigned)ctx->nbTrainSamples, ctx->nbTrainSamples, ctx->nbSamples, parameters, ctx->offsets,
1084
1102
  totalCompressedSize);
1085
1103
 
@@ -1094,19 +1112,18 @@ _cleanup:
1094
1112
  free(data);
1095
1113
  COVER_map_destroy(&activeDmers);
1096
1114
  COVER_dictSelectionFree(selection);
1097
- if (freqs) {
1098
- free(freqs);
1099
- }
1115
+ free(freqs);
1100
1116
  }
1101
1117
 
1102
1118
  ZDICTLIB_API size_t ZDICT_optimizeTrainFromBuffer_cover(
1103
- void *dictBuffer, size_t dictBufferCapacity, const void *samplesBuffer,
1104
- const size_t *samplesSizes, unsigned nbSamples,
1105
- ZDICT_cover_params_t *parameters) {
1119
+ void* dictBuffer, size_t dictBufferCapacity, const void* samplesBuffer,
1120
+ const size_t* samplesSizes, unsigned nbSamples,
1121
+ ZDICT_cover_params_t* parameters)
1122
+ {
1106
1123
  /* constants */
1107
1124
  const unsigned nbThreads = parameters->nbThreads;
1108
1125
  const double splitPoint =
1109
- parameters->splitPoint <= 0.0 ? DEFAULT_SPLITPOINT : parameters->splitPoint;
1126
+ parameters->splitPoint <= 0.0 ? COVER_DEFAULT_SPLITPOINT : parameters->splitPoint;
1110
1127
  const unsigned kMinD = parameters->d == 0 ? 6 : parameters->d;
1111
1128
  const unsigned kMaxD = parameters->d == 0 ? 8 : parameters->d;
1112
1129
  const unsigned kMinK = parameters->k == 0 ? 50 : parameters->k;
@@ -1,15 +1,26 @@
1
+ /*
2
+ * Copyright (c) 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
+ #ifndef ZDICT_STATIC_LINKING_ONLY
12
+ # define ZDICT_STATIC_LINKING_ONLY
13
+ #endif
14
+
1
15
  #include <stdio.h> /* fprintf */
2
16
  #include <stdlib.h> /* malloc, free, qsort */
3
17
  #include <string.h> /* memset */
4
18
  #include <time.h> /* clock */
5
- #include "mem.h" /* read */
6
- #include "pool.h"
7
- #include "threading.h"
8
- #include "zstd_internal.h" /* includes zstd.h */
9
- #ifndef ZDICT_STATIC_LINKING_ONLY
10
- #define ZDICT_STATIC_LINKING_ONLY
11
- #endif
12
- #include "zdict.h"
19
+ #include "../common/mem.h" /* read */
20
+ #include "../common/pool.h"
21
+ #include "../common/threading.h"
22
+ #include "../common/zstd_internal.h" /* includes zstd.h */
23
+ #include "../zdict.h"
13
24
 
14
25
  /**
15
26
  * COVER_best_t is used for two purposes:
@@ -142,6 +153,6 @@ void COVER_dictSelectionFree(COVER_dictSelection_t selection);
142
153
  * smallest dictionary within a specified regression of the compressed size
143
154
  * from the largest dictionary.
144
155
  */
145
- COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent,
156
+ COVER_dictSelection_t COVER_selectDict(BYTE* customDictContent, size_t dictBufferCapacity,
146
157
  size_t dictContentSize, const BYTE* samplesBuffer, const size_t* samplesSizes, unsigned nbFinalizeSamples,
147
158
  size_t nbCheckSamples, size_t nbSamples, ZDICT_cover_params_t params, size_t* offsets, size_t totalCompressedSize);
@@ -1576,7 +1576,7 @@ note:
1576
1576
  /* Construct the inverse suffix array of type B* suffixes using trsort. */
1577
1577
  trsort(ISAb, SA, m, 1);
1578
1578
 
1579
- /* Set the sorted order of tyoe B* suffixes. */
1579
+ /* Set the sorted order of type B* suffixes. */
1580
1580
  for(i = n - 1, j = m, c0 = T[n - 1]; 0 <= i;) {
1581
1581
  for(--i, c1 = c0; (0 <= i) && ((c0 = T[i]) >= c1); --i, c1 = c0) { }
1582
1582
  if(0 <= i) {