extzstd 0.0.3.CONCEPT-x86-mingw32 → 0.1-x86-mingw32

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 (69) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY.ja +5 -0
  3. data/LICENSE +6 -6
  4. data/README.md +35 -22
  5. data/contrib/zstd/LICENSE +13 -9
  6. data/contrib/zstd/README.md +37 -44
  7. data/contrib/zstd/common/entropy_common.c +33 -39
  8. data/contrib/zstd/common/error_private.c +43 -0
  9. data/contrib/zstd/common/error_private.h +11 -60
  10. data/contrib/zstd/common/fse.h +11 -5
  11. data/contrib/zstd/common/fse_decompress.c +14 -16
  12. data/contrib/zstd/common/huf.h +1 -1
  13. data/contrib/zstd/common/mem.h +36 -43
  14. data/contrib/zstd/common/xxhash.c +31 -18
  15. data/contrib/zstd/common/xxhash.h +71 -35
  16. data/contrib/zstd/common/zbuff.h +29 -35
  17. data/contrib/zstd/common/zstd_common.c +24 -32
  18. data/contrib/zstd/common/zstd_errors.h +60 -0
  19. data/contrib/zstd/common/zstd_internal.h +109 -80
  20. data/contrib/zstd/compress/fse_compress.c +9 -6
  21. data/contrib/zstd/compress/huf_compress.c +30 -74
  22. data/contrib/zstd/compress/zbuff_compress.c +43 -51
  23. data/contrib/zstd/compress/zstd_compress.c +953 -763
  24. data/contrib/zstd/compress/zstd_opt.h +115 -261
  25. data/contrib/zstd/decompress/huf_decompress.c +29 -40
  26. data/contrib/zstd/decompress/zbuff_decompress.c +36 -78
  27. data/contrib/zstd/decompress/zstd_decompress.c +976 -496
  28. data/contrib/zstd/dictBuilder/divsufsort.h +5 -5
  29. data/contrib/zstd/dictBuilder/zdict.c +194 -229
  30. data/contrib/zstd/dictBuilder/zdict.h +66 -68
  31. data/contrib/zstd/legacy/zstd_legacy.h +168 -49
  32. data/contrib/zstd/legacy/zstd_v01.c +95 -178
  33. data/contrib/zstd/legacy/zstd_v01.h +12 -32
  34. data/contrib/zstd/legacy/zstd_v02.c +48 -274
  35. data/contrib/zstd/legacy/zstd_v02.h +12 -32
  36. data/contrib/zstd/legacy/zstd_v03.c +48 -274
  37. data/contrib/zstd/legacy/zstd_v03.h +12 -32
  38. data/contrib/zstd/legacy/zstd_v04.c +63 -320
  39. data/contrib/zstd/legacy/zstd_v04.h +13 -33
  40. data/contrib/zstd/legacy/zstd_v05.c +80 -345
  41. data/contrib/zstd/legacy/zstd_v05.h +9 -31
  42. data/contrib/zstd/legacy/zstd_v06.c +48 -458
  43. data/contrib/zstd/legacy/zstd_v06.h +41 -67
  44. data/contrib/zstd/legacy/zstd_v07.c +4544 -0
  45. data/contrib/zstd/legacy/zstd_v07.h +173 -0
  46. data/contrib/zstd/zstd.h +640 -0
  47. data/ext/extconf.rb +7 -3
  48. data/ext/extzstd.c +263 -106
  49. data/ext/extzstd.h +8 -6
  50. data/ext/extzstd_nogvls.h +0 -117
  51. data/ext/extzstd_stream.c +347 -0
  52. data/ext/zstd_common.c +8 -0
  53. data/ext/zstd_compress.c +6 -0
  54. data/ext/zstd_decompress.c +5 -0
  55. data/ext/zstd_dictbuilder.c +5 -0
  56. data/ext/zstd_legacy_v07.c +1 -0
  57. data/gemstub.rb +18 -16
  58. data/lib/2.1/extzstd.so +0 -0
  59. data/lib/2.2/extzstd.so +0 -0
  60. data/lib/2.3/extzstd.so +0 -0
  61. data/lib/extzstd/version.rb +1 -1
  62. data/lib/extzstd.rb +77 -43
  63. data/test/test_basic.rb +11 -6
  64. metadata +23 -11
  65. data/contrib/zstd/common/error_public.h +0 -77
  66. data/contrib/zstd/common/zstd.h +0 -475
  67. data/ext/extzstd_buffered.c +0 -265
  68. data/ext/zstd_amalgam.c +0 -18
  69. data/lib/2.0/extzstd.so +0 -0
@@ -35,24 +35,8 @@
35
35
  /* **************************************************************
36
36
  * Compiler specifics
37
37
  ****************************************************************/
38
- #if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
39
- /* inline is defined */
40
- #elif defined(_MSC_VER)
41
- # define inline __inline
42
- #else
43
- # define inline /* disable inline */
44
- #endif
45
-
46
-
47
38
  #ifdef _MSC_VER /* Visual Studio */
48
- # define FORCE_INLINE static __forceinline
49
39
  # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
50
- #else
51
- # ifdef __GNUC__
52
- # define FORCE_INLINE static inline __attribute__((always_inline))
53
- # else
54
- # define FORCE_INLINE static inline
55
- # endif
56
40
  #endif
57
41
 
58
42
 
@@ -89,7 +73,7 @@ unsigned HUF_optimalTableLog(unsigned maxTableLog, size_t srcSize, unsigned maxS
89
73
  struct HUF_CElt_s {
90
74
  U16 val;
91
75
  BYTE nbBits;
92
- }; /* typedef'd to HUF_CElt within huf_static.h */
76
+ }; /* typedef'd to HUF_CElt within "huf.h" */
93
77
 
94
78
  typedef struct nodeElt_s {
95
79
  U32 count;
@@ -105,66 +89,38 @@ size_t HUF_writeCTable (void* dst, size_t maxDstSize,
105
89
  const HUF_CElt* CTable, U32 maxSymbolValue, U32 huffLog)
106
90
  {
107
91
  BYTE bitsToWeight[HUF_TABLELOG_MAX + 1];
108
- BYTE huffWeight[HUF_SYMBOLVALUE_MAX + 1];
109
- U32 n;
92
+ BYTE huffWeight[HUF_SYMBOLVALUE_MAX];
110
93
  BYTE* op = (BYTE*)dst;
111
- size_t size;
94
+ U32 n;
112
95
 
113
96
  /* check conditions */
114
- if (maxSymbolValue > HUF_SYMBOLVALUE_MAX + 1)
115
- return ERROR(GENERIC);
97
+ if (maxSymbolValue > HUF_SYMBOLVALUE_MAX) return ERROR(GENERIC);
116
98
 
117
99
  /* convert to weight */
118
100
  bitsToWeight[0] = 0;
119
- for (n=1; n<=huffLog; n++)
101
+ for (n=1; n<huffLog+1; n++)
120
102
  bitsToWeight[n] = (BYTE)(huffLog + 1 - n);
121
103
  for (n=0; n<maxSymbolValue; n++)
122
104
  huffWeight[n] = bitsToWeight[CTable[n].nbBits];
123
105
 
124
- size = FSE_compress(op+1, maxDstSize-1, huffWeight, maxSymbolValue); /* don't need last symbol stat : implied */
125
- if (HUF_isError(size)) return size;
126
- if (size >= 128) return ERROR(GENERIC); /* should never happen, since maxSymbolValue <= 255 */
127
- if ((size <= 1) || (size >= maxSymbolValue/2)) {
128
- if (size==1) { /* RLE */
129
- /* only possible case : series of 1 (because there are at least 2) */
130
- /* can only be 2^n or (2^n-1), otherwise not an huffman tree */
131
- BYTE code;
132
- switch(maxSymbolValue)
133
- {
134
- case 1: code = 0; break;
135
- case 2: code = 1; break;
136
- case 3: code = 2; break;
137
- case 4: code = 3; break;
138
- case 7: code = 4; break;
139
- case 8: code = 5; break;
140
- case 15: code = 6; break;
141
- case 16: code = 7; break;
142
- case 31: code = 8; break;
143
- case 32: code = 9; break;
144
- case 63: code = 10; break;
145
- case 64: code = 11; break;
146
- case 127: code = 12; break;
147
- case 128: code = 13; break;
148
- default : return ERROR(corruption_detected);
149
- }
150
- op[0] = (BYTE)(255-13 + code);
151
- return 1;
106
+ { size_t const size = FSE_compress(op+1, maxDstSize-1, huffWeight, maxSymbolValue);
107
+ if (FSE_isError(size)) return size;
108
+ if ((size>1) & (size < maxSymbolValue/2)) { /* FSE compressed */
109
+ op[0] = (BYTE)size;
110
+ return size+1;
152
111
  }
153
- /* Not compressible */
154
- if (maxSymbolValue > (241-128)) return ERROR(GENERIC); /* not implemented (not possible with current format) */
155
- if (((maxSymbolValue+1)/2) + 1 > maxDstSize) return ERROR(dstSize_tooSmall); /* not enough space within dst buffer */
156
- op[0] = (BYTE)(128 /*special case*/ + 0 /* Not Compressible */ + (maxSymbolValue-1));
157
- huffWeight[maxSymbolValue] = 0; /* to be sure it doesn't cause issue in final combination */
158
- for (n=0; n<maxSymbolValue; n+=2)
159
- op[(n/2)+1] = (BYTE)((huffWeight[n] << 4) + huffWeight[n+1]);
160
- return ((maxSymbolValue+1)/2) + 1;
161
112
  }
162
113
 
163
- /* normal header case */
164
- op[0] = (BYTE)size;
165
- return size+1;
166
- }
114
+ /* raw values */
115
+ if (maxSymbolValue > (256-128)) return ERROR(GENERIC); /* should not happen */
116
+ if (((maxSymbolValue+1)/2) + 1 > maxDstSize) return ERROR(dstSize_tooSmall); /* not enough space within dst buffer */
117
+ op[0] = (BYTE)(128 /*special case*/ + (maxSymbolValue-1));
118
+ huffWeight[maxSymbolValue] = 0; /* to be sure it doesn't cause issue in final combination */
119
+ for (n=0; n<maxSymbolValue; n+=2)
120
+ op[(n/2)+1] = (BYTE)((huffWeight[n] << 4) + huffWeight[n+1]);
121
+ return ((maxSymbolValue+1)/2) + 1;
167
122
 
123
+ }
168
124
 
169
125
 
170
126
  size_t HUF_readCTable (HUF_CElt* CTable, U32 maxSymbolValue, const void* src, size_t srcSize)
@@ -174,7 +130,7 @@ size_t HUF_readCTable (HUF_CElt* CTable, U32 maxSymbolValue, const void* src, si
174
130
  U32 tableLog = 0;
175
131
  size_t readSize;
176
132
  U32 nbSymbols = 0;
177
- //memset(huffWeight, 0, sizeof(huffWeight)); /* is not necessary, even though some analyzer complain ... */
133
+ /*memset(huffWeight, 0, sizeof(huffWeight));*/ /* is not necessary, even though some analyzer complain ... */
178
134
 
179
135
  /* get symbol weights */
180
136
  readSize = HUF_readStats(huffWeight, HUF_SYMBOLVALUE_MAX+1, rankVal, &nbSymbols, &tableLog, src, srcSize);
@@ -193,19 +149,20 @@ size_t HUF_readCTable (HUF_CElt* CTable, U32 maxSymbolValue, const void* src, si
193
149
  } }
194
150
 
195
151
  /* fill nbBits */
196
- { U32 n; for (n=0; n<nbSymbols; n++) {
197
- const U32 w = huffWeight[n];
198
- CTable[n].nbBits = (BYTE)(tableLog + 1 - w);
199
- }}
152
+ { U32 n; for (n=0; n<nbSymbols; n++) {
153
+ const U32 w = huffWeight[n];
154
+ CTable[n].nbBits = (BYTE)(tableLog + 1 - w);
155
+ } }
200
156
 
201
157
  /* fill val */
202
- { U16 nbPerRank[HUF_TABLELOG_MAX+1] = {0};
203
- U16 valPerRank[HUF_TABLELOG_MAX+1] = {0};
158
+ { U16 nbPerRank[HUF_TABLELOG_MAX+2] = {0}; /* support w=0=>n=tableLog+1 */
159
+ U16 valPerRank[HUF_TABLELOG_MAX+2] = {0};
204
160
  { U32 n; for (n=0; n<nbSymbols; n++) nbPerRank[CTable[n].nbBits]++; }
205
161
  /* determine stating value per rank */
162
+ valPerRank[tableLog+1] = 0; /* for w==0 */
206
163
  { U16 min = 0;
207
- U32 n; for (n=HUF_TABLELOG_MAX; n>0; n--) {
208
- valPerRank[n] = min; /* get starting value within each rank */
164
+ U32 n; for (n=tableLog; n>0; n--) { /* start at n=tablelog <-> w=1 */
165
+ valPerRank[n] = min; /* get starting value within each rank */
209
166
  min += nbPerRank[n];
210
167
  min >>= 1;
211
168
  } }
@@ -520,7 +477,7 @@ static size_t HUF_compress_internal (
520
477
  /* Scan input and build symbol stats */
521
478
  { size_t const largest = FSE_count (count, &maxSymbolValue, (const BYTE*)src, srcSize);
522
479
  if (HUF_isError(largest)) return largest;
523
- if (largest == srcSize) { *ostart = ((const BYTE*)src)[0]; return 1; } /* rle */
480
+ if (largest == srcSize) { *ostart = ((const BYTE*)src)[0]; return 1; } /* single symbol, rle */
524
481
  if (largest <= (srcSize >> 7)+1) return 0; /* Fast heuristic : not compressible enough */
525
482
  }
526
483
 
@@ -535,7 +492,6 @@ static size_t HUF_compress_internal (
535
492
  { size_t const hSize = HUF_writeCTable (op, dstSize, CTable, maxSymbolValue, huffLog);
536
493
  if (HUF_isError(hSize)) return hSize;
537
494
  if (hSize + 12 >= srcSize) return 0; /* not useful to try compression */
538
- //static U64 totalHSize = 0; static U32 nbHSize = 0; totalHSize += hSize; nbHSize++; if ((nbHSize & 63) == 1) printf("average : %6.3f \n", (double)totalHSize / nbHSize);
539
495
  op += hSize;
540
496
  }
541
497
 
@@ -1,33 +1,12 @@
1
- /*
2
- Buffered version of Zstd compression library
3
- Copyright (C) 2015-2016, Yann Collet.
4
-
5
- BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
6
-
7
- Redistribution and use in source and binary forms, with or without
8
- modification, are permitted provided that the following conditions are
9
- met:
10
- * Redistributions of source code must retain the above copyright
11
- notice, this list of conditions and the following disclaimer.
12
- * Redistributions in binary form must reproduce the above
13
- copyright notice, this list of conditions and the following disclaimer
14
- in the documentation and/or other materials provided with the
15
- distribution.
16
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
-
28
- You can contact the author at :
29
- - zstd homepage : http://www.zstd.net/
30
- */
1
+ /**
2
+ * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
3
+ * All rights reserved.
4
+ *
5
+ * This source code is licensed under the BSD-style license found in the
6
+ * LICENSE file in the root directory of this source tree. An additional grant
7
+ * of patent rights can be found in the PATENTS file in the same directory.
8
+ */
9
+
31
10
 
32
11
 
33
12
  /* *************************************
@@ -46,7 +25,7 @@
46
25
  static size_t const ZBUFF_endFrameSize = ZSTD_BLOCKHEADERSIZE;
47
26
 
48
27
 
49
- /*_**************************************************
28
+ /*-***********************************************************
50
29
  * Streaming compression
51
30
  *
52
31
  * A ZBUFF_CCtx object is required to track streaming operation.
@@ -77,7 +56,7 @@ static size_t const ZBUFF_endFrameSize = ZSTD_BLOCKHEADERSIZE;
77
56
  * Hint : recommended buffer sizes (not compulsory)
78
57
  * input : ZSTD_BLOCKSIZE_MAX (128 KB), internal unit size, it improves latency to use this value.
79
58
  * output : ZSTD_compressBound(ZSTD_BLOCKSIZE_MAX) + ZSTD_blockHeaderSize + ZBUFF_endFrameSize : ensures it's always possible to write/flush/end a full block at best speed.
80
- * **************************************************/
59
+ * ***********************************************************/
81
60
 
82
61
  typedef enum { ZBUFFcs_init, ZBUFFcs_load, ZBUFFcs_flush, ZBUFFcs_final } ZBUFF_cStage;
83
62
 
@@ -95,8 +74,10 @@ struct ZBUFF_CCtx_s {
95
74
  size_t outBuffContentSize;
96
75
  size_t outBuffFlushedSize;
97
76
  ZBUFF_cStage stage;
77
+ U32 checksum;
78
+ U32 frameEnded;
98
79
  ZSTD_customMem customMem;
99
- }; /* typedef'd tp ZBUFF_CCtx within "zstd_buffered.h" */
80
+ }; /* typedef'd tp ZBUFF_CCtx within "zbuff.h" */
100
81
 
101
82
  ZBUFF_CCtx* ZBUFF_createCCtx(void)
102
83
  {
@@ -133,7 +114,7 @@ size_t ZBUFF_freeCCtx(ZBUFF_CCtx* zbc)
133
114
  }
134
115
 
135
116
 
136
- /* *** Initialization *** */
117
+ /* ====== Initialization ====== */
137
118
 
138
119
  size_t ZBUFF_compressInit_advanced(ZBUFF_CCtx* zbc,
139
120
  const void* dict, size_t dictSize,
@@ -147,7 +128,7 @@ size_t ZBUFF_compressInit_advanced(ZBUFF_CCtx* zbc,
147
128
  zbc->inBuff = (char*)zbc->customMem.customAlloc(zbc->customMem.opaque, neededInBuffSize);
148
129
  if (zbc->inBuff == NULL) return ERROR(memory_allocation);
149
130
  }
150
- zbc->blockSize = MIN(ZSTD_BLOCKSIZE_MAX, neededInBuffSize);
131
+ zbc->blockSize = MIN(ZSTD_BLOCKSIZE_ABSOLUTEMAX, neededInBuffSize);
151
132
  }
152
133
  if (zbc->outBuffSize < ZSTD_compressBound(zbc->blockSize)+1) {
153
134
  zbc->outBuffSize = ZSTD_compressBound(zbc->blockSize)+1;
@@ -164,6 +145,8 @@ size_t ZBUFF_compressInit_advanced(ZBUFF_CCtx* zbc,
164
145
  zbc->inBuffTarget = zbc->blockSize;
165
146
  zbc->outBuffContentSize = zbc->outBuffFlushedSize = 0;
166
147
  zbc->stage = ZBUFFcs_load;
148
+ zbc->checksum = params.fParams.checksumFlag > 0;
149
+ zbc->frameEnded = 0;
167
150
  return 0; /* ready to go */
168
151
  }
169
152
 
@@ -189,14 +172,16 @@ MEM_STATIC size_t ZBUFF_limitCopy(void* dst, size_t dstCapacity, const void* src
189
172
  }
190
173
 
191
174
 
192
- /* *** Compression *** */
175
+ /* ====== Compression ====== */
176
+
177
+ typedef enum { zbf_gather, zbf_flush, zbf_end } ZBUFF_flush_e;
193
178
 
194
179
  static size_t ZBUFF_compressContinue_generic(ZBUFF_CCtx* zbc,
195
180
  void* dst, size_t* dstCapacityPtr,
196
181
  const void* src, size_t* srcSizePtr,
197
- int flush)
182
+ ZBUFF_flush_e const flush)
198
183
  {
199
- U32 notDone = 1;
184
+ U32 someMoreWork = 1;
200
185
  const char* const istart = (const char*)src;
201
186
  const char* const iend = istart + *srcSizePtr;
202
187
  const char* ip = istart;
@@ -204,7 +189,7 @@ static size_t ZBUFF_compressContinue_generic(ZBUFF_CCtx* zbc,
204
189
  char* const oend = ostart + *dstCapacityPtr;
205
190
  char* op = ostart;
206
191
 
207
- while (notDone) {
192
+ while (someMoreWork) {
208
193
  switch(zbc->stage)
209
194
  {
210
195
  case ZBUFFcs_init: return ERROR(init_missing); /* call ZBUFF_compressInit() first ! */
@@ -216,7 +201,7 @@ static size_t ZBUFF_compressContinue_generic(ZBUFF_CCtx* zbc,
216
201
  zbc->inBuffPos += loaded;
217
202
  ip += loaded;
218
203
  if ( (zbc->inBuffPos==zbc->inToCompress) || (!flush && (toLoad != loaded)) ) {
219
- notDone = 0; break; /* not enough input to get a full block : stop there, wait for more */
204
+ someMoreWork = 0; break; /* not enough input to get a full block : stop there, wait for more */
220
205
  } }
221
206
  /* compress current block (note : this stage cannot be stopped in the middle) */
222
207
  { void* cDst;
@@ -227,8 +212,11 @@ static size_t ZBUFF_compressContinue_generic(ZBUFF_CCtx* zbc,
227
212
  cDst = op; /* compress directly into output buffer (avoid flush stage) */
228
213
  else
229
214
  cDst = zbc->outBuff, oSize = zbc->outBuffSize;
230
- cSize = ZSTD_compressContinue(zbc->zc, cDst, oSize, zbc->inBuff + zbc->inToCompress, iSize);
215
+ cSize = (flush == zbf_end) ?
216
+ ZSTD_compressEnd(zbc->zc, cDst, oSize, zbc->inBuff + zbc->inToCompress, iSize) :
217
+ ZSTD_compressContinue(zbc->zc, cDst, oSize, zbc->inBuff + zbc->inToCompress, iSize);
231
218
  if (ZSTD_isError(cSize)) return cSize;
219
+ if (flush == zbf_end) zbc->frameEnded = 1;
232
220
  /* prepare next block */
233
221
  zbc->inBuffTarget = zbc->inBuffPos + zbc->blockSize;
234
222
  if (zbc->inBuffTarget > zbc->inBuffSize)
@@ -245,14 +233,14 @@ static size_t ZBUFF_compressContinue_generic(ZBUFF_CCtx* zbc,
245
233
  size_t const flushed = ZBUFF_limitCopy(op, oend-op, zbc->outBuff + zbc->outBuffFlushedSize, toFlush);
246
234
  op += flushed;
247
235
  zbc->outBuffFlushedSize += flushed;
248
- if (toFlush!=flushed) { notDone = 0; break; } /* dst too small to store flushed data : stop there */
236
+ if (toFlush!=flushed) { someMoreWork = 0; break; } /* dst too small to store flushed data : stop there */
249
237
  zbc->outBuffContentSize = zbc->outBuffFlushedSize = 0;
250
238
  zbc->stage = ZBUFFcs_load;
251
239
  break;
252
240
  }
253
241
 
254
242
  case ZBUFFcs_final:
255
- notDone = 0; /* do nothing */
243
+ someMoreWork = 0; /* do nothing */
256
244
  break;
257
245
 
258
246
  default:
@@ -262,6 +250,7 @@ static size_t ZBUFF_compressContinue_generic(ZBUFF_CCtx* zbc,
262
250
 
263
251
  *srcSizePtr = ip - istart;
264
252
  *dstCapacityPtr = op - ostart;
253
+ if (zbc->frameEnded) return 0;
265
254
  { size_t hintInSize = zbc->inBuffTarget - zbc->inBuffPos;
266
255
  if (hintInSize==0) hintInSize = zbc->blockSize;
267
256
  return hintInSize;
@@ -272,17 +261,17 @@ size_t ZBUFF_compressContinue(ZBUFF_CCtx* zbc,
272
261
  void* dst, size_t* dstCapacityPtr,
273
262
  const void* src, size_t* srcSizePtr)
274
263
  {
275
- return ZBUFF_compressContinue_generic(zbc, dst, dstCapacityPtr, src, srcSizePtr, 0);
264
+ return ZBUFF_compressContinue_generic(zbc, dst, dstCapacityPtr, src, srcSizePtr, zbf_gather);
276
265
  }
277
266
 
278
267
 
279
268
 
280
- /* *** Finalize *** */
269
+ /* ====== Finalize ====== */
281
270
 
282
271
  size_t ZBUFF_compressFlush(ZBUFF_CCtx* zbc, void* dst, size_t* dstCapacityPtr)
283
272
  {
284
273
  size_t srcSize = 0;
285
- ZBUFF_compressContinue_generic(zbc, dst, dstCapacityPtr, &srcSize, &srcSize, 1); /* use a valid src address instead of NULL */
274
+ ZBUFF_compressContinue_generic(zbc, dst, dstCapacityPtr, &srcSize, &srcSize, zbf_flush); /* use a valid src address instead of NULL */
286
275
  return zbc->outBuffContentSize - zbc->outBuffFlushedSize;
287
276
  }
288
277
 
@@ -296,15 +285,18 @@ size_t ZBUFF_compressEnd(ZBUFF_CCtx* zbc, void* dst, size_t* dstCapacityPtr)
296
285
  if (zbc->stage != ZBUFFcs_final) {
297
286
  /* flush whatever remains */
298
287
  size_t outSize = *dstCapacityPtr;
299
- size_t const remainingToFlush = ZBUFF_compressFlush(zbc, dst, &outSize);
288
+ size_t srcSize = 0;
289
+ size_t const notEnded = ZBUFF_compressContinue_generic(zbc, dst, &outSize, &srcSize, &srcSize, zbf_end); /* use a valid address instead of NULL */
290
+ size_t const remainingToFlush = zbc->outBuffContentSize - zbc->outBuffFlushedSize;
300
291
  op += outSize;
301
292
  if (remainingToFlush) {
302
293
  *dstCapacityPtr = op-ostart;
303
- return remainingToFlush + ZBUFF_endFrameSize;
294
+ return remainingToFlush + ZBUFF_endFrameSize + (zbc->checksum * 4);
304
295
  }
305
296
  /* create epilogue */
306
297
  zbc->stage = ZBUFFcs_final;
307
- zbc->outBuffContentSize = ZSTD_compressEnd(zbc->zc, zbc->outBuff, zbc->outBuffSize); /* epilogue into outBuff */
298
+ zbc->outBuffContentSize = !notEnded ? 0 :
299
+ ZSTD_compressEnd(zbc->zc, zbc->outBuff, zbc->outBuffSize, NULL, 0); /* write epilogue into outBuff */
308
300
  }
309
301
 
310
302
  /* flush epilogue */
@@ -323,5 +315,5 @@ size_t ZBUFF_compressEnd(ZBUFF_CCtx* zbc, void* dst, size_t* dstCapacityPtr)
323
315
  /* *************************************
324
316
  * Tool functions
325
317
  ***************************************/
326
- size_t ZBUFF_recommendedCInSize(void) { return ZSTD_BLOCKSIZE_MAX; }
327
- size_t ZBUFF_recommendedCOutSize(void) { return ZSTD_compressBound(ZSTD_BLOCKSIZE_MAX) + ZSTD_blockHeaderSize + ZBUFF_endFrameSize; }
318
+ size_t ZBUFF_recommendedCInSize(void) { return ZSTD_BLOCKSIZE_ABSOLUTEMAX; }
319
+ size_t ZBUFF_recommendedCOutSize(void) { return ZSTD_compressBound(ZSTD_BLOCKSIZE_ABSOLUTEMAX) + ZSTD_blockHeaderSize + ZBUFF_endFrameSize; }