zstd-ruby 1.1.4.0 → 1.2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (31) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.md +1 -1
  4. data/ext/zstdruby/libzstd/Makefile +11 -1
  5. data/ext/zstdruby/libzstd/README.md +8 -0
  6. data/ext/zstdruby/libzstd/common/bitstream.h +56 -27
  7. data/ext/zstdruby/libzstd/common/error_private.c +2 -1
  8. data/ext/zstdruby/libzstd/common/fse.h +7 -3
  9. data/ext/zstdruby/libzstd/common/huf.h +42 -19
  10. data/ext/zstdruby/libzstd/common/mem.h +2 -3
  11. data/ext/zstdruby/libzstd/common/zstd_errors.h +1 -0
  12. data/ext/zstdruby/libzstd/common/zstd_internal.h +3 -2
  13. data/ext/zstdruby/libzstd/compress/fse_compress.c +10 -10
  14. data/ext/zstdruby/libzstd/compress/zstd_compress.c +455 -244
  15. data/ext/zstdruby/libzstd/compress/zstd_opt.h +6 -4
  16. data/ext/zstdruby/libzstd/compress/zstdmt_compress.c +40 -28
  17. data/ext/zstdruby/libzstd/decompress/zstd_decompress.c +115 -219
  18. data/ext/zstdruby/libzstd/dictBuilder/cover.c +34 -13
  19. data/ext/zstdruby/libzstd/dictBuilder/zdict.c +65 -43
  20. data/ext/zstdruby/libzstd/dictBuilder/zdict.h +7 -7
  21. data/ext/zstdruby/libzstd/dll/example/README.md +5 -5
  22. data/ext/zstdruby/libzstd/dll/example/build_package.bat +1 -0
  23. data/ext/zstdruby/libzstd/legacy/zstd_v01.c +1 -1
  24. data/ext/zstdruby/libzstd/legacy/zstd_v02.c +21 -21
  25. data/ext/zstdruby/libzstd/legacy/zstd_v03.c +20 -20
  26. data/ext/zstdruby/libzstd/legacy/zstd_v04.c +4 -4
  27. data/ext/zstdruby/libzstd/legacy/zstd_v05.c +2 -2
  28. data/ext/zstdruby/libzstd/legacy/zstd_v06.c +2 -2
  29. data/ext/zstdruby/libzstd/zstd.h +88 -68
  30. data/lib/zstd-ruby/version.rb +1 -1
  31. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d2610367f572e8865e7d21cc0ae3d2862f197aee
4
- data.tar.gz: a698813faf919578970b8deb156c81e51d4045b9
3
+ metadata.gz: 90c5ef25c36e660027688987e2c0d4c867aa33f6
4
+ data.tar.gz: 54806b961cf688772ac05d856d3d72359caa3dfb
5
5
  SHA512:
6
- metadata.gz: 6d742c4cf0fb3d0aae716a096317ddfa36ee933a10cc28111781b1897083d8ba9129f96518f8122e398be3137a73d0b3741f9fd289b6d9c824483439c6473614
7
- data.tar.gz: 835e4c344677e64c979be1a5f4c2cbd50aac95f29d214e3f23c84520d549f1e213d7a395a94e7a4bd8e0bdc8c3b3823167985c39e8ba566b3029cf3a425c4d0c
6
+ metadata.gz: a7c6df76d82bda82633e3e93971e77c42b721e766568a0993589c83494c887aa70363908d50d10372ba7a298deb5fa78a0f58662becd5186db440a7e6e90422a
7
+ data.tar.gz: 7cff0cfe30172d6c455b57e1785f0ddc2b612408cd5a83b98fabd7ff58399ae03e51c4dde244e36e736d7def3b16de788e33bd74450868826f0f6c293860d277
data/.travis.yml CHANGED
@@ -1,7 +1,7 @@
1
1
  sudo: false
2
2
  language: ruby
3
3
  rvm:
4
- - 2.4.0
4
+ - 2.4.1
5
5
  - 2.3.3
6
6
  - 2.2
7
7
 
data/README.md CHANGED
@@ -9,7 +9,7 @@ See https://github.com/facebook/zstd
9
9
  Fork from https://github.com/jarredholman/ruby-zstd.
10
10
 
11
11
  ## Zstd version
12
- v1.1.4 (https://github.com/facebook/zstd/releases/tag/v1.1.4)
12
+ v1.2.0 (https://github.com/facebook/zstd/tree/v1.2.0)
13
13
 
14
14
  ## Installation
15
15
 
@@ -71,6 +71,9 @@ libzstd.a: $(ZSTD_OBJ)
71
71
  @echo compiling static library
72
72
  @$(AR) $(ARFLAGS) $@ $^
73
73
 
74
+ libzstd.a-mt: CPPFLAGS += -DZSTD_MULTHREAD
75
+ libzstd.a-mt: libzstd.a
76
+
74
77
  $(LIBZSTD): LDFLAGS += -shared -fPIC -fvisibility=hidden
75
78
  $(LIBZSTD): $(ZSTD_FILES)
76
79
  @echo compiling dynamic library $(LIBVER)
@@ -86,10 +89,17 @@ endif
86
89
 
87
90
  libzstd : $(LIBZSTD)
88
91
 
92
+ libzstd-mt : CPPFLAGS += -DZSTD_MULTITHREAD
93
+ libzstd-mt : libzstd
94
+
89
95
  lib: libzstd.a libzstd
90
96
 
91
- lib-release: DEBUGFLAGS :=
97
+ lib-mt: CPPFLAGS += -DZSTD_MULTITHREAD
98
+ lib-mt: lib
99
+
100
+ lib-release lib-release-mt: DEBUGFLAGS :=
92
101
  lib-release: lib
102
+ lib-release-mt: lib-mt
93
103
 
94
104
  clean:
95
105
  @$(RM) -r *.dSYM # Mac OS-X specific
@@ -22,6 +22,14 @@ Some additional API may be useful if you're looking into advanced features :
22
22
  They are not "stable", their definition may change in the future.
23
23
  Only static linking is allowed.
24
24
 
25
+ #### ZSTDMT API
26
+
27
+ To enable multithreaded compression within the library, invoke `make lib-mt` target.
28
+ Prototypes are defined in header file `compress/zstdmt_compress.h`.
29
+ When linking a program that uses ZSTDMT API against libzstd.a on a POSIX system,
30
+ `-pthread` flag must be provided to the compiler and linker.
31
+ Note : ZSTDMT prototypes can still be used with a library built without multithread support,
32
+ but in this case, they will be single threaded only.
25
33
 
26
34
  #### Modular build
27
35
 
@@ -2,7 +2,7 @@
2
2
  bitstream
3
3
  Part of FSE library
4
4
  header file (to include)
5
- Copyright (C) 2013-2016, Yann Collet.
5
+ Copyright (C) 2013-2017, Yann Collet.
6
6
 
7
7
  BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
8
8
 
@@ -53,6 +53,16 @@ extern "C" {
53
53
  #include "error_private.h" /* error codes and messages */
54
54
 
55
55
 
56
+ /*-*************************************
57
+ * Debug
58
+ ***************************************/
59
+ #if defined(BIT_DEBUG) && (BIT_DEBUG>=1)
60
+ # include <assert.h>
61
+ #else
62
+ # define assert(condition) ((void)0)
63
+ #endif
64
+
65
+
56
66
  /*=========================================
57
67
  * Target specific
58
68
  =========================================*/
@@ -74,7 +84,7 @@ extern "C" {
74
84
  typedef struct
75
85
  {
76
86
  size_t bitContainer;
77
- int bitPos;
87
+ unsigned bitPos;
78
88
  char* startPtr;
79
89
  char* ptr;
80
90
  char* endPtr;
@@ -112,6 +122,7 @@ typedef struct
112
122
  unsigned bitsConsumed;
113
123
  const char* ptr;
114
124
  const char* start;
125
+ const char* limitPtr;
115
126
  } BIT_DStream_t;
116
127
 
117
128
  typedef enum { BIT_DStream_unfinished = 0,
@@ -163,7 +174,10 @@ MEM_STATIC unsigned BIT_highbit32 (register U32 val)
163
174
  # elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
164
175
  return 31 - __builtin_clz (val);
165
176
  # else /* Software version */
166
- static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 };
177
+ static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29,
178
+ 11, 14, 16, 18, 22, 25, 3, 30,
179
+ 8, 12, 20, 28, 15, 17, 24, 7,
180
+ 19, 27, 23, 6, 26, 5, 4, 31 };
167
181
  U32 v = val;
168
182
  v |= v >> 1;
169
183
  v |= v >> 2;
@@ -175,31 +189,36 @@ MEM_STATIC unsigned BIT_highbit32 (register U32 val)
175
189
  }
176
190
 
177
191
  /*===== Local Constants =====*/
178
- static const unsigned BIT_mask[] = { 0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF }; /* up to 26 bits */
192
+ static const unsigned BIT_mask[] = { 0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F,
193
+ 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF,
194
+ 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF,
195
+ 0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF }; /* up to 26 bits */
179
196
 
180
197
 
181
198
  /*-**************************************************************
182
199
  * bitStream encoding
183
200
  ****************************************************************/
184
201
  /*! BIT_initCStream() :
185
- * `dstCapacity` must be > sizeof(void*)
202
+ * `dstCapacity` must be > sizeof(size_t)
186
203
  * @return : 0 if success,
187
204
  otherwise an error code (can be tested using ERR_isError() ) */
188
- MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, void* startPtr, size_t dstCapacity)
205
+ MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC,
206
+ void* startPtr, size_t dstCapacity)
189
207
  {
190
208
  bitC->bitContainer = 0;
191
209
  bitC->bitPos = 0;
192
210
  bitC->startPtr = (char*)startPtr;
193
211
  bitC->ptr = bitC->startPtr;
194
- bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->ptr);
195
- if (dstCapacity <= sizeof(bitC->ptr)) return ERROR(dstSize_tooSmall);
212
+ bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->bitContainer);
213
+ if (dstCapacity <= sizeof(bitC->bitContainer)) return ERROR(dstSize_tooSmall);
196
214
  return 0;
197
215
  }
198
216
 
199
217
  /*! BIT_addBits() :
200
218
  can add up to 26 bits into `bitC`.
201
219
  Does not check for register overflow ! */
202
- MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, size_t value, unsigned nbBits)
220
+ MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC,
221
+ size_t value, unsigned nbBits)
203
222
  {
204
223
  bitC->bitContainer |= (value & BIT_mask[nbBits]) << bitC->bitPos;
205
224
  bitC->bitPos += nbBits;
@@ -207,34 +226,42 @@ MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, size_t value, unsigned nbBits)
207
226
 
208
227
  /*! BIT_addBitsFast() :
209
228
  * works only if `value` is _clean_, meaning all high bits above nbBits are 0 */
210
- MEM_STATIC void BIT_addBitsFast(BIT_CStream_t* bitC, size_t value, unsigned nbBits)
229
+ MEM_STATIC void BIT_addBitsFast(BIT_CStream_t* bitC,
230
+ size_t value, unsigned nbBits)
211
231
  {
232
+ assert((value>>nbBits) == 0);
212
233
  bitC->bitContainer |= value << bitC->bitPos;
213
234
  bitC->bitPos += nbBits;
214
235
  }
215
236
 
216
237
  /*! BIT_flushBitsFast() :
238
+ * assumption : bitContainer has not overflowed
217
239
  * unsafe version; does not check buffer overflow */
218
240
  MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t* bitC)
219
241
  {
220
242
  size_t const nbBytes = bitC->bitPos >> 3;
243
+ assert( bitC->bitPos <= (sizeof(bitC->bitContainer)*8) );
221
244
  MEM_writeLEST(bitC->ptr, bitC->bitContainer);
222
245
  bitC->ptr += nbBytes;
246
+ assert(bitC->ptr <= bitC->endPtr);
223
247
  bitC->bitPos &= 7;
224
- bitC->bitContainer >>= nbBytes*8; /* if bitPos >= sizeof(bitContainer)*8 --> undefined behavior */
248
+ bitC->bitContainer >>= nbBytes*8;
225
249
  }
226
250
 
227
251
  /*! BIT_flushBits() :
252
+ * assumption : bitContainer has not overflowed
228
253
  * safe version; check for buffer overflow, and prevents it.
229
- * note : does not signal buffer overflow. This will be revealed later on using BIT_closeCStream() */
254
+ * note : does not signal buffer overflow.
255
+ * overflow will be revealed later on using BIT_closeCStream() */
230
256
  MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC)
231
257
  {
232
258
  size_t const nbBytes = bitC->bitPos >> 3;
259
+ assert( bitC->bitPos <= (sizeof(bitC->bitContainer)*8) );
233
260
  MEM_writeLEST(bitC->ptr, bitC->bitContainer);
234
261
  bitC->ptr += nbBytes;
235
262
  if (bitC->ptr > bitC->endPtr) bitC->ptr = bitC->endPtr;
236
263
  bitC->bitPos &= 7;
237
- bitC->bitContainer >>= nbBytes*8; /* if bitPos >= sizeof(bitContainer)*8 --> undefined behavior */
264
+ bitC->bitContainer >>= nbBytes*8;
238
265
  }
239
266
 
240
267
  /*! BIT_closeCStream() :
@@ -244,9 +271,7 @@ MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC)
244
271
  {
245
272
  BIT_addBitsFast(bitC, 1, 1); /* endMark */
246
273
  BIT_flushBits(bitC);
247
-
248
- if (bitC->ptr >= bitC->endPtr) return 0; /* doesn't fit within authorized budget : cancel */
249
-
274
+ if (bitC->ptr >= bitC->endPtr) return 0; /* overflow detected */
250
275
  return (bitC->ptr - bitC->startPtr) + (bitC->bitPos > 0);
251
276
  }
252
277
 
@@ -264,15 +289,16 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si
264
289
  {
265
290
  if (srcSize < 1) { memset(bitD, 0, sizeof(*bitD)); return ERROR(srcSize_wrong); }
266
291
 
292
+ bitD->start = (const char*)srcBuffer;
293
+ bitD->limitPtr = bitD->start + sizeof(bitD->bitContainer);
294
+
267
295
  if (srcSize >= sizeof(bitD->bitContainer)) { /* normal case */
268
- bitD->start = (const char*)srcBuffer;
269
296
  bitD->ptr = (const char*)srcBuffer + srcSize - sizeof(bitD->bitContainer);
270
297
  bitD->bitContainer = MEM_readLEST(bitD->ptr);
271
298
  { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1];
272
299
  bitD->bitsConsumed = lastByte ? 8 - BIT_highbit32(lastByte) : 0; /* ensures bitsConsumed is always set */
273
300
  if (lastByte == 0) return ERROR(GENERIC); /* endMark not present */ }
274
301
  } else {
275
- bitD->start = (const char*)srcBuffer;
276
302
  bitD->ptr = bitD->start;
277
303
  bitD->bitContainer = *(const BYTE*)(bitD->start);
278
304
  switch(srcSize)
@@ -330,17 +356,18 @@ MEM_STATIC size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)
330
356
  #if defined(__BMI__) && defined(__GNUC__) /* experimental; fails if bitD->bitsConsumed + nbBits > sizeof(bitD->bitContainer)*8 */
331
357
  return BIT_getMiddleBits(bitD->bitContainer, (sizeof(bitD->bitContainer)*8) - bitD->bitsConsumed - nbBits, nbBits);
332
358
  #else
333
- U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1;
334
- return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask);
359
+ U32 const regMask = sizeof(bitD->bitContainer)*8 - 1;
360
+ return ((bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> 1) >> ((regMask-nbBits) & regMask);
335
361
  #endif
336
362
  }
337
363
 
338
364
  /*! BIT_lookBitsFast() :
339
- * unsafe version; only works only if nbBits >= 1 */
365
+ * unsafe version; only works if nbBits >= 1 */
340
366
  MEM_STATIC size_t BIT_lookBitsFast(const BIT_DStream_t* bitD, U32 nbBits)
341
367
  {
342
- U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1;
343
- return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask);
368
+ U32 const regMask = sizeof(bitD->bitContainer)*8 - 1;
369
+ assert(nbBits >= 1);
370
+ return (bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> (((regMask+1)-nbBits) & regMask);
344
371
  }
345
372
 
346
373
  MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits)
@@ -365,6 +392,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)
365
392
  MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
366
393
  {
367
394
  size_t const value = BIT_lookBitsFast(bitD, nbBits);
395
+ assert(nbBits >= 1);
368
396
  BIT_skipBits(bitD, nbBits);
369
397
  return value;
370
398
  }
@@ -376,10 +404,10 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)
376
404
  if status == BIT_DStream_unfinished, internal register is filled with >= (sizeof(bitD->bitContainer)*8 - 7) bits */
377
405
  MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
378
406
  {
379
- if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should not happen => corruption detected */
380
- return BIT_DStream_overflow;
407
+ if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* overflow detected, like end of stream */
408
+ return BIT_DStream_overflow;
381
409
 
382
- if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer)) {
410
+ if (bitD->ptr >= bitD->limitPtr) {
383
411
  bitD->ptr -= bitD->bitsConsumed >> 3;
384
412
  bitD->bitsConsumed &= 7;
385
413
  bitD->bitContainer = MEM_readLEST(bitD->ptr);
@@ -389,6 +417,7 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
389
417
  if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer;
390
418
  return BIT_DStream_completed;
391
419
  }
420
+ /* start < ptr < limitPtr */
392
421
  { U32 nbBytes = bitD->bitsConsumed >> 3;
393
422
  BIT_DStream_status result = BIT_DStream_unfinished;
394
423
  if (bitD->ptr - nbBytes < bitD->start) {
@@ -397,7 +426,7 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)
397
426
  }
398
427
  bitD->ptr -= nbBytes;
399
428
  bitD->bitsConsumed -= nbBytes*8;
400
- bitD->bitContainer = MEM_readLEST(bitD->ptr); /* reminder : srcSize > sizeof(bitD) */
429
+ bitD->bitContainer = MEM_readLEST(bitD->ptr); /* reminder : srcSize > sizeof(bitD->bitContainer), otherwise bitD->ptr == bitD->start */
401
430
  return result;
402
431
  }
403
432
  }
@@ -29,7 +29,7 @@ const char* ERR_getErrorString(ERR_enum code)
29
29
  case PREFIX(memory_allocation): return "Allocation error : not enough memory";
30
30
  case PREFIX(stage_wrong): return "Operation not authorized at current processing stage";
31
31
  case PREFIX(dstSize_tooSmall): return "Destination buffer is too small";
32
- case PREFIX(srcSize_wrong): return "Src size incorrect";
32
+ case PREFIX(srcSize_wrong): return "Src size is incorrect";
33
33
  case PREFIX(corruption_detected): return "Corrupted block detected";
34
34
  case PREFIX(checksum_wrong): return "Restored data doesn't match checksum";
35
35
  case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported";
@@ -37,6 +37,7 @@ const char* ERR_getErrorString(ERR_enum code)
37
37
  case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small";
38
38
  case PREFIX(dictionary_corrupted): return "Dictionary is corrupted";
39
39
  case PREFIX(dictionary_wrong): return "Dictionary mismatch";
40
+ case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples";
40
41
  case PREFIX(maxCode):
41
42
  default: return notErrorCode;
42
43
  }
@@ -316,6 +316,10 @@ If there is an error, the function will return an error code, which can be teste
316
316
  #define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) (1 + (1<<(maxTableLog-1)) + ((maxSymbolValue+1)*2))
317
317
  #define FSE_DTABLE_SIZE_U32(maxTableLog) (1 + (1<<maxTableLog))
318
318
 
319
+ /* or use the size to malloc() space directly. Pay attention to alignment restrictions though */
320
+ #define FSE_CTABLE_SIZE(maxTableLog, maxSymbolValue) (FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(FSE_CTable))
321
+ #define FSE_DTABLE_SIZE(maxTableLog) (FSE_DTABLE_SIZE_U32(maxTableLog) * sizeof(FSE_DTable))
322
+
319
323
 
320
324
  /* *****************************************
321
325
  * FSE advanced API
@@ -353,7 +357,7 @@ unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsi
353
357
  * Same as FSE_compress2(), but using an externally allocated scratch buffer (`workSpace`).
354
358
  * FSE_WKSP_SIZE_U32() provides the minimum size required for `workSpace` as a table of FSE_CTable.
355
359
  */
356
- #define FSE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) ( FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) + (1<<((maxTableLog>2)?(maxTableLog-2):0)) )
360
+ #define FSE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue) ( FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) + ((maxTableLog > 12) ? (1 << (maxTableLog - 2)) : 1024) )
357
361
  size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
358
362
 
359
363
  size_t FSE_buildCTable_raw (FSE_CTable* ct, unsigned nbBits);
@@ -550,9 +554,9 @@ MEM_STATIC void FSE_initCState2(FSE_CState_t* statePtr, const FSE_CTable* ct, U3
550
554
 
551
555
  MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr, U32 symbol)
552
556
  {
553
- const FSE_symbolCompressionTransform symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol];
557
+ FSE_symbolCompressionTransform const symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol];
554
558
  const U16* const stateTable = (const U16*)(statePtr->stateTable);
555
- U32 nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16);
559
+ U32 const nbBitsOut = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16);
556
560
  BIT_addBits(bitC, statePtr->value, nbBitsOut);
557
561
  statePtr->value = stateTable[ (statePtr->value >> nbBitsOut) + symbolTT.deltaFindState];
558
562
  }
@@ -43,6 +43,21 @@ extern "C" {
43
43
  #include <stddef.h> /* size_t */
44
44
 
45
45
 
46
+ /* *** library symbols visibility *** */
47
+ /* Note : when linking with -fvisibility=hidden on gcc, or by default on Visual,
48
+ * HUF symbols remain "private" (internal symbols for library only).
49
+ * Set macro FSE_DLL_EXPORT to 1 if you want HUF symbols visible on DLL interface */
50
+ #if defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) && defined(__GNUC__) && (__GNUC__ >= 4)
51
+ # define HUF_PUBLIC_API __attribute__ ((visibility ("default")))
52
+ #elif defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) /* Visual expected */
53
+ # define HUF_PUBLIC_API __declspec(dllexport)
54
+ #elif defined(FSE_DLL_IMPORT) && (FSE_DLL_IMPORT==1)
55
+ # define HUF_PUBLIC_API __declspec(dllimport) /* not required, just to generate faster code (saves a function pointer load from IAT and an indirect jump) */
56
+ #else
57
+ # define HUF_PUBLIC_API
58
+ #endif
59
+
60
+
46
61
  /* *** simple functions *** */
47
62
  /**
48
63
  HUF_compress() :
@@ -55,8 +70,8 @@ HUF_compress() :
55
70
  if return == 1, srcData is a single repeated byte symbol (RLE compression).
56
71
  if HUF_isError(return), compression failed (more details using HUF_getErrorName())
57
72
  */
58
- size_t HUF_compress(void* dst, size_t dstCapacity,
59
- const void* src, size_t srcSize);
73
+ HUF_PUBLIC_API size_t HUF_compress(void* dst, size_t dstCapacity,
74
+ const void* src, size_t srcSize);
60
75
 
61
76
  /**
62
77
  HUF_decompress() :
@@ -69,32 +84,42 @@ HUF_decompress() :
69
84
  @return : size of regenerated data (== originalSize),
70
85
  or an error code, which can be tested using HUF_isError()
71
86
  */
72
- size_t HUF_decompress(void* dst, size_t originalSize,
73
- const void* cSrc, size_t cSrcSize);
87
+ HUF_PUBLIC_API size_t HUF_decompress(void* dst, size_t originalSize,
88
+ const void* cSrc, size_t cSrcSize);
74
89
 
75
90
 
76
91
  /* *** Tool functions *** */
77
- #define HUF_BLOCKSIZE_MAX (128 * 1024) /**< maximum input size for a single block compressed with HUF_compress */
78
- size_t HUF_compressBound(size_t size); /**< maximum compressed size (worst case) */
92
+ #define HUF_BLOCKSIZE_MAX (128 * 1024) /**< maximum input size for a single block compressed with HUF_compress */
93
+ HUF_PUBLIC_API size_t HUF_compressBound(size_t size); /**< maximum compressed size (worst case) */
79
94
 
80
95
  /* Error Management */
81
- unsigned HUF_isError(size_t code); /**< tells if a return value is an error code */
82
- const char* HUF_getErrorName(size_t code); /**< provides error code string (useful for debugging) */
96
+ HUF_PUBLIC_API unsigned HUF_isError(size_t code); /**< tells if a return value is an error code */
97
+ HUF_PUBLIC_API const char* HUF_getErrorName(size_t code); /**< provides error code string (useful for debugging) */
83
98
 
84
99
 
85
100
  /* *** Advanced function *** */
86
101
 
87
102
  /** HUF_compress2() :
88
- * Same as HUF_compress(), but offers direct control over `maxSymbolValue` and `tableLog` .
89
- * `tableLog` must be `<= HUF_TABLELOG_MAX` . */
90
- size_t HUF_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
103
+ * Same as HUF_compress(), but offers direct control over `maxSymbolValue` and `tableLog`.
104
+ * `tableLog` must be `<= HUF_TABLELOG_MAX` . */
105
+ HUF_PUBLIC_API size_t HUF_compress2 (void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);
91
106
 
92
107
  /** HUF_compress4X_wksp() :
93
- * Same as HUF_compress2(), but uses externally allocated `workSpace`, which must be a table of >= 1024 unsigned */
94
- size_t HUF_compress4X_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); /**< `workSpace` must be a table of at least HUF_WORKSPACE_SIZE_U32 unsigned */
108
+ * Same as HUF_compress2(), but uses externally allocated `workSpace`.
109
+ * `workspace` must have minimum alignment of 4, and be at least as large as following macro */
110
+ #define HUF_WORKSPACE_SIZE (6 << 10)
111
+ #define HUF_WORKSPACE_SIZE_U32 (HUF_WORKSPACE_SIZE / sizeof(U32))
112
+ HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);
95
113
 
96
114
 
97
115
 
116
+ /* ******************************************************************
117
+ * WARNING !!
118
+ * The following section contains advanced and experimental definitions
119
+ * which shall never be used in the context of dll
120
+ * because they are not guaranteed to remain stable in the future.
121
+ * Only consider them in association with static linking.
122
+ *******************************************************************/
98
123
  #ifdef HUF_STATIC_LINKING_ONLY
99
124
 
100
125
  /* *** Dependencies *** */
@@ -117,12 +142,14 @@ size_t HUF_compress4X_wksp (void* dst, size_t dstSize, const void* src, size_t s
117
142
  ******************************************/
118
143
  /* HUF buffer bounds */
119
144
  #define HUF_CTABLEBOUND 129
120
- #define HUF_BLOCKBOUND(size) (size + (size>>8) + 8) /* only true if incompressible pre-filtered with fast heuristic */
145
+ #define HUF_BLOCKBOUND(size) (size + (size>>8) + 8) /* only true when incompressible is pre-filtered with fast heuristic */
121
146
  #define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size)) /* Macro version, useful for static allocation */
122
147
 
123
148
  /* static allocation of HUF's Compression Table */
149
+ #define HUF_CTABLE_SIZE_U32(maxSymbolValue) ((maxSymbolValue)+1) /* Use tables of U32, for proper alignment */
150
+ #define HUF_CTABLE_SIZE(maxSymbolValue) (HUF_CTABLE_SIZE_U32(maxSymbolValue) * sizeof(U32))
124
151
  #define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \
125
- U32 name##hb[maxSymbolValue+1]; \
152
+ U32 name##hb[HUF_CTABLE_SIZE_U32(maxSymbolValue)]; \
126
153
  void* name##hv = &(name##hb); \
127
154
  HUF_CElt* name = (HUF_CElt*)(name##hv) /* no final ; */
128
155
 
@@ -134,10 +161,6 @@ typedef U32 HUF_DTable;
134
161
  #define HUF_CREATE_STATIC_DTABLEX4(DTable, maxTableLog) \
135
162
  HUF_DTable DTable[HUF_DTABLE_SIZE(maxTableLog)] = { ((U32)(maxTableLog) * 0x01000001) }
136
163
 
137
- /* The workspace must have alignment at least 4 and be at least this large */
138
- #define HUF_WORKSPACE_SIZE (6 << 10)
139
- #define HUF_WORKSPACE_SIZE_U32 (HUF_WORKSPACE_SIZE / sizeof(U32))
140
-
141
164
 
142
165
  /* ****************************************
143
166
  * Advanced decompression functions