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.
- checksums.yaml +4 -4
- data/HISTORY.ja +5 -0
- data/LICENSE +6 -6
- data/README.md +35 -22
- data/contrib/zstd/LICENSE +13 -9
- data/contrib/zstd/README.md +37 -44
- data/contrib/zstd/common/entropy_common.c +33 -39
- data/contrib/zstd/common/error_private.c +43 -0
- data/contrib/zstd/common/error_private.h +11 -60
- data/contrib/zstd/common/fse.h +11 -5
- data/contrib/zstd/common/fse_decompress.c +14 -16
- data/contrib/zstd/common/huf.h +1 -1
- data/contrib/zstd/common/mem.h +36 -43
- data/contrib/zstd/common/xxhash.c +31 -18
- data/contrib/zstd/common/xxhash.h +71 -35
- data/contrib/zstd/common/zbuff.h +29 -35
- data/contrib/zstd/common/zstd_common.c +24 -32
- data/contrib/zstd/common/zstd_errors.h +60 -0
- data/contrib/zstd/common/zstd_internal.h +109 -80
- data/contrib/zstd/compress/fse_compress.c +9 -6
- data/contrib/zstd/compress/huf_compress.c +30 -74
- data/contrib/zstd/compress/zbuff_compress.c +43 -51
- data/contrib/zstd/compress/zstd_compress.c +953 -763
- data/contrib/zstd/compress/zstd_opt.h +115 -261
- data/contrib/zstd/decompress/huf_decompress.c +29 -40
- data/contrib/zstd/decompress/zbuff_decompress.c +36 -78
- data/contrib/zstd/decompress/zstd_decompress.c +976 -496
- data/contrib/zstd/dictBuilder/divsufsort.h +5 -5
- data/contrib/zstd/dictBuilder/zdict.c +194 -229
- data/contrib/zstd/dictBuilder/zdict.h +66 -68
- data/contrib/zstd/legacy/zstd_legacy.h +168 -49
- data/contrib/zstd/legacy/zstd_v01.c +95 -178
- data/contrib/zstd/legacy/zstd_v01.h +12 -32
- data/contrib/zstd/legacy/zstd_v02.c +48 -274
- data/contrib/zstd/legacy/zstd_v02.h +12 -32
- data/contrib/zstd/legacy/zstd_v03.c +48 -274
- data/contrib/zstd/legacy/zstd_v03.h +12 -32
- data/contrib/zstd/legacy/zstd_v04.c +63 -320
- data/contrib/zstd/legacy/zstd_v04.h +13 -33
- data/contrib/zstd/legacy/zstd_v05.c +80 -345
- data/contrib/zstd/legacy/zstd_v05.h +9 -31
- data/contrib/zstd/legacy/zstd_v06.c +48 -458
- data/contrib/zstd/legacy/zstd_v06.h +41 -67
- data/contrib/zstd/legacy/zstd_v07.c +4544 -0
- data/contrib/zstd/legacy/zstd_v07.h +173 -0
- data/contrib/zstd/zstd.h +640 -0
- data/ext/extconf.rb +7 -3
- data/ext/extzstd.c +263 -106
- data/ext/extzstd.h +8 -6
- data/ext/extzstd_nogvls.h +0 -117
- data/ext/extzstd_stream.c +347 -0
- data/ext/zstd_common.c +8 -0
- data/ext/zstd_compress.c +6 -0
- data/ext/zstd_decompress.c +5 -0
- data/ext/zstd_dictbuilder.c +5 -0
- data/ext/zstd_legacy_v07.c +1 -0
- data/gemstub.rb +18 -16
- data/lib/2.1/extzstd.so +0 -0
- data/lib/2.2/extzstd.so +0 -0
- data/lib/2.3/extzstd.so +0 -0
- data/lib/extzstd/version.rb +1 -1
- data/lib/extzstd.rb +77 -43
- data/test/test_basic.rb +11 -6
- metadata +23 -11
- data/contrib/zstd/common/error_public.h +0 -77
- data/contrib/zstd/common/zstd.h +0 -475
- data/ext/extzstd_buffered.c +0 -265
- data/ext/zstd_amalgam.c +0 -18
- 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
|
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
|
109
|
-
U32 n;
|
92
|
+
BYTE huffWeight[HUF_SYMBOLVALUE_MAX];
|
110
93
|
BYTE* op = (BYTE*)dst;
|
111
|
-
|
94
|
+
U32 n;
|
112
95
|
|
113
96
|
/* check conditions */
|
114
|
-
if (maxSymbolValue > HUF_SYMBOLVALUE_MAX
|
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
|
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);
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
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
|
-
/*
|
164
|
-
|
165
|
-
|
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
|
-
|
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
|
-
{
|
197
|
-
|
198
|
-
|
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+
|
203
|
-
U16 valPerRank[HUF_TABLELOG_MAX+
|
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=
|
208
|
-
valPerRank[n] = min;
|
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
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
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 "
|
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
|
-
/*
|
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(
|
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
|
-
/*
|
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
|
-
|
182
|
+
ZBUFF_flush_e const flush)
|
198
183
|
{
|
199
|
-
U32
|
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 (
|
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
|
-
|
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 =
|
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) {
|
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
|
-
|
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,
|
264
|
+
return ZBUFF_compressContinue_generic(zbc, dst, dstCapacityPtr, src, srcSizePtr, zbf_gather);
|
276
265
|
}
|
277
266
|
|
278
267
|
|
279
268
|
|
280
|
-
/*
|
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,
|
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
|
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 =
|
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
|
327
|
-
size_t ZBUFF_recommendedCOutSize(void) { return ZSTD_compressBound(
|
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; }
|