extzstd 0.1 → 0.3.2
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 +5 -5
- data/HISTORY.ja.md +39 -0
- data/README.md +38 -56
- data/contrib/zstd/CHANGELOG +613 -0
- data/contrib/zstd/CODE_OF_CONDUCT.md +5 -0
- data/contrib/zstd/CONTRIBUTING.md +406 -0
- data/contrib/zstd/COPYING +339 -0
- data/contrib/zstd/Makefile +420 -0
- data/contrib/zstd/README.md +179 -41
- data/contrib/zstd/TESTING.md +44 -0
- data/contrib/zstd/appveyor.yml +292 -0
- data/contrib/zstd/lib/BUCK +234 -0
- data/contrib/zstd/lib/Makefile +451 -0
- data/contrib/zstd/lib/README.md +207 -0
- data/contrib/zstd/{common → lib/common}/bitstream.h +187 -138
- data/contrib/zstd/lib/common/compiler.h +288 -0
- data/contrib/zstd/lib/common/cpu.h +213 -0
- data/contrib/zstd/lib/common/debug.c +24 -0
- data/contrib/zstd/lib/common/debug.h +107 -0
- data/contrib/zstd/lib/common/entropy_common.c +362 -0
- data/contrib/zstd/{common → lib/common}/error_private.c +25 -12
- data/contrib/zstd/{common → lib/common}/error_private.h +14 -10
- data/contrib/zstd/{common → lib/common}/fse.h +173 -92
- data/contrib/zstd/{common → lib/common}/fse_decompress.c +149 -85
- data/contrib/zstd/lib/common/huf.h +361 -0
- data/contrib/zstd/{common → lib/common}/mem.h +115 -59
- data/contrib/zstd/lib/common/pool.c +350 -0
- data/contrib/zstd/lib/common/pool.h +84 -0
- data/contrib/zstd/lib/common/threading.c +122 -0
- data/contrib/zstd/lib/common/threading.h +155 -0
- data/contrib/zstd/{common → lib/common}/xxhash.c +55 -96
- data/contrib/zstd/{common → lib/common}/xxhash.h +23 -47
- data/contrib/zstd/lib/common/zstd_common.c +83 -0
- data/contrib/zstd/lib/common/zstd_deps.h +111 -0
- data/contrib/zstd/lib/common/zstd_errors.h +95 -0
- data/contrib/zstd/lib/common/zstd_internal.h +478 -0
- data/contrib/zstd/{compress → lib/compress}/fse_compress.c +214 -319
- data/contrib/zstd/lib/compress/hist.c +181 -0
- data/contrib/zstd/lib/compress/hist.h +75 -0
- data/contrib/zstd/lib/compress/huf_compress.c +913 -0
- data/contrib/zstd/lib/compress/zstd_compress.c +5208 -0
- data/contrib/zstd/lib/compress/zstd_compress_internal.h +1203 -0
- data/contrib/zstd/lib/compress/zstd_compress_literals.c +158 -0
- data/contrib/zstd/lib/compress/zstd_compress_literals.h +29 -0
- data/contrib/zstd/lib/compress/zstd_compress_sequences.c +433 -0
- data/contrib/zstd/lib/compress/zstd_compress_sequences.h +54 -0
- data/contrib/zstd/lib/compress/zstd_compress_superblock.c +849 -0
- data/contrib/zstd/lib/compress/zstd_compress_superblock.h +32 -0
- data/contrib/zstd/lib/compress/zstd_cwksp.h +561 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.c +521 -0
- data/contrib/zstd/lib/compress/zstd_double_fast.h +38 -0
- data/contrib/zstd/lib/compress/zstd_fast.c +496 -0
- data/contrib/zstd/lib/compress/zstd_fast.h +37 -0
- data/contrib/zstd/lib/compress/zstd_lazy.c +1412 -0
- data/contrib/zstd/lib/compress/zstd_lazy.h +87 -0
- data/contrib/zstd/lib/compress/zstd_ldm.c +660 -0
- data/contrib/zstd/lib/compress/zstd_ldm.h +116 -0
- data/contrib/zstd/lib/compress/zstd_opt.c +1345 -0
- data/contrib/zstd/lib/compress/zstd_opt.h +56 -0
- data/contrib/zstd/lib/compress/zstdmt_compress.c +1811 -0
- data/contrib/zstd/lib/compress/zstdmt_compress.h +110 -0
- data/contrib/zstd/lib/decompress/huf_decompress.c +1350 -0
- data/contrib/zstd/lib/decompress/zstd_ddict.c +244 -0
- data/contrib/zstd/lib/decompress/zstd_ddict.h +44 -0
- data/contrib/zstd/lib/decompress/zstd_decompress.c +1930 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_block.c +1540 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_block.h +62 -0
- data/contrib/zstd/lib/decompress/zstd_decompress_internal.h +190 -0
- data/contrib/zstd/{common → lib/deprecated}/zbuff.h +68 -45
- data/contrib/zstd/lib/deprecated/zbuff_common.c +26 -0
- data/contrib/zstd/lib/deprecated/zbuff_compress.c +147 -0
- data/contrib/zstd/lib/deprecated/zbuff_decompress.c +75 -0
- data/contrib/zstd/lib/dictBuilder/cover.c +1245 -0
- data/contrib/zstd/lib/dictBuilder/cover.h +157 -0
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/divsufsort.c +3 -3
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/divsufsort.h +0 -0
- data/contrib/zstd/lib/dictBuilder/fastcover.c +758 -0
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/zdict.c +318 -194
- data/contrib/zstd/lib/dictBuilder/zdict.h +305 -0
- data/contrib/zstd/{legacy → lib/legacy}/zstd_legacy.h +171 -15
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v01.c +191 -124
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v01.h +19 -5
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v02.c +125 -125
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v02.h +19 -5
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v03.c +125 -124
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v03.h +20 -6
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v04.c +151 -299
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v04.h +19 -5
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v05.c +237 -243
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v05.h +19 -6
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v06.c +130 -143
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v06.h +18 -5
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v07.c +158 -157
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v07.h +19 -5
- data/contrib/zstd/lib/libzstd.pc.in +15 -0
- data/contrib/zstd/lib/zstd.h +2391 -0
- data/ext/depend +2 -0
- data/ext/extconf.rb +15 -6
- data/ext/extzstd.c +76 -145
- data/ext/extzstd.h +80 -31
- data/ext/extzstd_stream.c +417 -142
- data/ext/libzstd_conf.h +8 -0
- data/ext/zstd_common.c +10 -7
- data/ext/zstd_compress.c +14 -5
- data/ext/zstd_decompress.c +5 -4
- data/ext/zstd_dictbuilder.c +9 -4
- data/ext/zstd_dictbuilder_fastcover.c +3 -0
- data/ext/zstd_legacy_v01.c +3 -1
- data/ext/zstd_legacy_v02.c +3 -1
- data/ext/zstd_legacy_v03.c +3 -1
- data/ext/zstd_legacy_v04.c +3 -1
- data/ext/zstd_legacy_v05.c +3 -1
- data/ext/zstd_legacy_v06.c +3 -1
- data/ext/zstd_legacy_v07.c +3 -1
- data/gemstub.rb +10 -24
- data/lib/extzstd.rb +64 -179
- data/lib/extzstd/version.rb +6 -1
- data/test/test_basic.rb +9 -6
- metadata +113 -57
- data/HISTORY.ja +0 -5
- data/contrib/zstd/common/entropy_common.c +0 -225
- data/contrib/zstd/common/huf.h +0 -228
- data/contrib/zstd/common/zstd_common.c +0 -83
- data/contrib/zstd/common/zstd_errors.h +0 -60
- data/contrib/zstd/common/zstd_internal.h +0 -267
- data/contrib/zstd/compress/huf_compress.c +0 -533
- data/contrib/zstd/compress/zbuff_compress.c +0 -319
- data/contrib/zstd/compress/zstd_compress.c +0 -3264
- data/contrib/zstd/compress/zstd_opt.h +0 -900
- data/contrib/zstd/decompress/huf_decompress.c +0 -883
- data/contrib/zstd/decompress/zbuff_decompress.c +0 -252
- data/contrib/zstd/decompress/zstd_decompress.c +0 -1842
- data/contrib/zstd/dictBuilder/zdict.h +0 -111
- data/contrib/zstd/zstd.h +0 -640
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
* Copyright (c) 2016-
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
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
|
|
7
|
-
*
|
|
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.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
#ifndef ZSTDv05_H
|
|
@@ -18,7 +19,7 @@ extern "C" {
|
|
|
18
19
|
* Dependencies
|
|
19
20
|
***************************************/
|
|
20
21
|
#include <stddef.h> /* size_t */
|
|
21
|
-
#include "mem.h" /* U64, U32 */
|
|
22
|
+
#include "../common/mem.h" /* U64, U32 */
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
/* *************************************
|
|
@@ -32,6 +33,18 @@ extern "C" {
|
|
|
32
33
|
size_t ZSTDv05_decompress( void* dst, size_t dstCapacity,
|
|
33
34
|
const void* src, size_t compressedSize);
|
|
34
35
|
|
|
36
|
+
/**
|
|
37
|
+
ZSTDv05_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.5.x format
|
|
38
|
+
srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
|
|
39
|
+
cSize (output parameter) : the number of bytes that would be read to decompress this frame
|
|
40
|
+
or an error code if it fails (which can be tested using ZSTDv01_isError())
|
|
41
|
+
dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame
|
|
42
|
+
or ZSTD_CONTENTSIZE_ERROR if an error occurs
|
|
43
|
+
|
|
44
|
+
note : assumes `cSize` and `dBound` are _not_ NULL.
|
|
45
|
+
*/
|
|
46
|
+
void ZSTDv05_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
|
|
47
|
+
size_t* cSize, unsigned long long* dBound);
|
|
35
48
|
|
|
36
49
|
/* *************************************
|
|
37
50
|
* Helper functions
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
|
|
2
|
-
* Copyright (c) 2016-
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
|
|
3
3
|
* All rights reserved.
|
|
4
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
|
|
7
|
-
*
|
|
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.
|
|
8
9
|
*/
|
|
9
10
|
|
|
10
11
|
|
|
@@ -13,7 +14,7 @@
|
|
|
13
14
|
#include <stddef.h> /* size_t, ptrdiff_t */
|
|
14
15
|
#include <string.h> /* memcpy */
|
|
15
16
|
#include <stdlib.h> /* malloc, free, qsort */
|
|
16
|
-
#include "error_private.h"
|
|
17
|
+
#include "../common/error_private.h"
|
|
17
18
|
|
|
18
19
|
|
|
19
20
|
|
|
@@ -81,7 +82,11 @@ extern "C" {
|
|
|
81
82
|
* Basic Types
|
|
82
83
|
*****************************************************************/
|
|
83
84
|
#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
|
|
84
|
-
#
|
|
85
|
+
# if defined(_AIX)
|
|
86
|
+
# include <inttypes.h>
|
|
87
|
+
# else
|
|
88
|
+
# include <stdint.h> /* intptr_t */
|
|
89
|
+
# endif
|
|
85
90
|
typedef uint8_t BYTE;
|
|
86
91
|
typedef uint16_t U16;
|
|
87
92
|
typedef int16_t S16;
|
|
@@ -188,7 +193,7 @@ MEM_STATIC U32 MEM_swap32(U32 in)
|
|
|
188
193
|
{
|
|
189
194
|
#if defined(_MSC_VER) /* Visual Studio */
|
|
190
195
|
return _byteswap_ulong(in);
|
|
191
|
-
#elif defined (__GNUC__)
|
|
196
|
+
#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)
|
|
192
197
|
return __builtin_bswap32(in);
|
|
193
198
|
#else
|
|
194
199
|
return ((in << 24) & 0xff000000 ) |
|
|
@@ -202,7 +207,7 @@ MEM_STATIC U64 MEM_swap64(U64 in)
|
|
|
202
207
|
{
|
|
203
208
|
#if defined(_MSC_VER) /* Visual Studio */
|
|
204
209
|
return _byteswap_uint64(in);
|
|
205
|
-
#elif defined (__GNUC__)
|
|
210
|
+
#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)
|
|
206
211
|
return __builtin_bswap64(in);
|
|
207
212
|
#else
|
|
208
213
|
return ((in << 56) & 0xff00000000000000ULL) |
|
|
@@ -505,6 +510,8 @@ typedef enum { bt_compressed, bt_raw, bt_rle, bt_end } blockType_t;
|
|
|
505
510
|
#define FSEv06_ENCODING_STATIC 2
|
|
506
511
|
#define FSEv06_ENCODING_DYNAMIC 3
|
|
507
512
|
|
|
513
|
+
#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
|
|
514
|
+
|
|
508
515
|
static const U32 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
509
516
|
1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9,10,11,12,
|
|
510
517
|
13,14,15,16 };
|
|
@@ -537,7 +544,7 @@ static void ZSTDv06_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|
|
537
544
|
/*! ZSTDv06_wildcopy() :
|
|
538
545
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
|
539
546
|
#define WILDCOPY_OVERLENGTH 8
|
|
540
|
-
MEM_STATIC void ZSTDv06_wildcopy(void* dst, const void* src,
|
|
547
|
+
MEM_STATIC void ZSTDv06_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
|
541
548
|
{
|
|
542
549
|
const BYTE* ip = (const BYTE*)src;
|
|
543
550
|
BYTE* op = (BYTE*)dst;
|
|
@@ -838,16 +845,6 @@ MEM_STATIC BITv06_DStream_status BITv06_reloadDStream(BITv06_DStream_t* bitD);
|
|
|
838
845
|
MEM_STATIC unsigned BITv06_endOfDStream(const BITv06_DStream_t* bitD);
|
|
839
846
|
|
|
840
847
|
|
|
841
|
-
/* Start by invoking BITv06_initDStream().
|
|
842
|
-
* A chunk of the bitStream is then stored into a local register.
|
|
843
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
|
844
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
|
845
|
-
* Local register is explicitly reloaded from memory by the BITv06_reloadDStream() method.
|
|
846
|
-
* A reload guarantee a minimum of ((8*sizeof(bitD->bitContainer))-7) bits when its result is BITv06_DStream_unfinished.
|
|
847
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
|
848
|
-
* Checking if DStream has reached its end can be performed with BITv06_endOfDStream().
|
|
849
|
-
*/
|
|
850
|
-
|
|
851
848
|
|
|
852
849
|
/*-****************************************
|
|
853
850
|
* unsafe API
|
|
@@ -860,14 +857,14 @@ MEM_STATIC size_t BITv06_readBitsFast(BITv06_DStream_t* bitD, unsigned nbBits);
|
|
|
860
857
|
/*-**************************************************************
|
|
861
858
|
* Internal functions
|
|
862
859
|
****************************************************************/
|
|
863
|
-
MEM_STATIC unsigned BITv06_highbit32 (
|
|
860
|
+
MEM_STATIC unsigned BITv06_highbit32 ( U32 val)
|
|
864
861
|
{
|
|
865
862
|
# if defined(_MSC_VER) /* Visual */
|
|
866
863
|
unsigned long r=0;
|
|
867
864
|
_BitScanReverse ( &r, val );
|
|
868
865
|
return (unsigned) r;
|
|
869
866
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
|
870
|
-
return
|
|
867
|
+
return __builtin_clz (val) ^ 31;
|
|
871
868
|
# else /* Software version */
|
|
872
869
|
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 };
|
|
873
870
|
U32 v = val;
|
|
@@ -910,13 +907,13 @@ MEM_STATIC size_t BITv06_initDStream(BITv06_DStream_t* bitD, const void* srcBuff
|
|
|
910
907
|
bitD->bitContainer = *(const BYTE*)(bitD->start);
|
|
911
908
|
switch(srcSize)
|
|
912
909
|
{
|
|
913
|
-
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16)
|
|
914
|
-
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24)
|
|
915
|
-
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32)
|
|
916
|
-
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24;
|
|
917
|
-
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16;
|
|
918
|
-
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8;
|
|
919
|
-
default
|
|
910
|
+
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16);/* fall-through */
|
|
911
|
+
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24);/* fall-through */
|
|
912
|
+
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32);/* fall-through */
|
|
913
|
+
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24; /* fall-through */
|
|
914
|
+
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16; /* fall-through */
|
|
915
|
+
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8; /* fall-through */
|
|
916
|
+
default: break;
|
|
920
917
|
}
|
|
921
918
|
{ BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1];
|
|
922
919
|
if (lastByte == 0) return ERROR(GENERIC); /* endMark not present */
|
|
@@ -928,13 +925,6 @@ MEM_STATIC size_t BITv06_initDStream(BITv06_DStream_t* bitD, const void* srcBuff
|
|
|
928
925
|
}
|
|
929
926
|
|
|
930
927
|
|
|
931
|
-
/*! BITv06_lookBits() :
|
|
932
|
-
* Provides next n bits from local register.
|
|
933
|
-
* local register is not modified.
|
|
934
|
-
* On 32-bits, maxNbBits==24.
|
|
935
|
-
* On 64-bits, maxNbBits==56.
|
|
936
|
-
* @return : value extracted
|
|
937
|
-
*/
|
|
938
928
|
MEM_STATIC size_t BITv06_lookBits(const BITv06_DStream_t* bitD, U32 nbBits)
|
|
939
929
|
{
|
|
940
930
|
U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
|
@@ -954,11 +944,6 @@ MEM_STATIC void BITv06_skipBits(BITv06_DStream_t* bitD, U32 nbBits)
|
|
|
954
944
|
bitD->bitsConsumed += nbBits;
|
|
955
945
|
}
|
|
956
946
|
|
|
957
|
-
/*! BITv06_readBits() :
|
|
958
|
-
* Read (consume) next n bits from local register and update.
|
|
959
|
-
* Pay attention to not read more than nbBits contained into local register.
|
|
960
|
-
* @return : extracted value.
|
|
961
|
-
*/
|
|
962
947
|
MEM_STATIC size_t BITv06_readBits(BITv06_DStream_t* bitD, U32 nbBits)
|
|
963
948
|
{
|
|
964
949
|
size_t const value = BITv06_lookBits(bitD, nbBits);
|
|
@@ -975,15 +960,10 @@ MEM_STATIC size_t BITv06_readBitsFast(BITv06_DStream_t* bitD, U32 nbBits)
|
|
|
975
960
|
return value;
|
|
976
961
|
}
|
|
977
962
|
|
|
978
|
-
/*! BITv06_reloadDStream() :
|
|
979
|
-
* Refill `BITv06_DStream_t` from src buffer previously defined (see BITv06_initDStream() ).
|
|
980
|
-
* This function is safe, it guarantees it will not read beyond src buffer.
|
|
981
|
-
* @return : status of `BITv06_DStream_t` internal register.
|
|
982
|
-
if status == unfinished, internal register is filled with >= (sizeof(bitD->bitContainer)*8 - 7) bits */
|
|
983
963
|
MEM_STATIC BITv06_DStream_status BITv06_reloadDStream(BITv06_DStream_t* bitD)
|
|
984
964
|
{
|
|
985
|
-
|
|
986
|
-
|
|
965
|
+
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should never happen */
|
|
966
|
+
return BITv06_DStream_overflow;
|
|
987
967
|
|
|
988
968
|
if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer)) {
|
|
989
969
|
bitD->ptr -= bitD->bitsConsumed >> 3;
|
|
@@ -1102,55 +1082,6 @@ static void FSEv06_initDState(FSEv06_DState_t* DStatePtr, BITv06_DStream_t*
|
|
|
1102
1082
|
|
|
1103
1083
|
static unsigned char FSEv06_decodeSymbol(FSEv06_DState_t* DStatePtr, BITv06_DStream_t* bitD);
|
|
1104
1084
|
|
|
1105
|
-
/*!
|
|
1106
|
-
Let's now decompose FSEv06_decompress_usingDTable() into its unitary components.
|
|
1107
|
-
You will decode FSE-encoded symbols from the bitStream,
|
|
1108
|
-
and also any other bitFields you put in, **in reverse order**.
|
|
1109
|
-
|
|
1110
|
-
You will need a few variables to track your bitStream. They are :
|
|
1111
|
-
|
|
1112
|
-
BITv06_DStream_t DStream; // Stream context
|
|
1113
|
-
FSEv06_DState_t DState; // State context. Multiple ones are possible
|
|
1114
|
-
FSEv06_DTable* DTablePtr; // Decoding table, provided by FSEv06_buildDTable()
|
|
1115
|
-
|
|
1116
|
-
The first thing to do is to init the bitStream.
|
|
1117
|
-
errorCode = BITv06_initDStream(&DStream, srcBuffer, srcSize);
|
|
1118
|
-
|
|
1119
|
-
You should then retrieve your initial state(s)
|
|
1120
|
-
(in reverse flushing order if you have several ones) :
|
|
1121
|
-
errorCode = FSEv06_initDState(&DState, &DStream, DTablePtr);
|
|
1122
|
-
|
|
1123
|
-
You can then decode your data, symbol after symbol.
|
|
1124
|
-
For information the maximum number of bits read by FSEv06_decodeSymbol() is 'tableLog'.
|
|
1125
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
|
1126
|
-
unsigned char symbol = FSEv06_decodeSymbol(&DState, &DStream);
|
|
1127
|
-
|
|
1128
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
|
1129
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
|
1130
|
-
size_t bitField = BITv06_readBits(&DStream, nbBits);
|
|
1131
|
-
|
|
1132
|
-
All above operations only read from local register (which size depends on size_t).
|
|
1133
|
-
Refueling the register from memory is manually performed by the reload method.
|
|
1134
|
-
endSignal = FSEv06_reloadDStream(&DStream);
|
|
1135
|
-
|
|
1136
|
-
BITv06_reloadDStream() result tells if there is still some more data to read from DStream.
|
|
1137
|
-
BITv06_DStream_unfinished : there is still some data left into the DStream.
|
|
1138
|
-
BITv06_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
|
1139
|
-
BITv06_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
|
1140
|
-
BITv06_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
|
1141
|
-
|
|
1142
|
-
When reaching end of buffer (BITv06_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
|
1143
|
-
to properly detect the exact end of stream.
|
|
1144
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
|
1145
|
-
BITv06_reloadDStream(&DStream) >= BITv06_DStream_completed
|
|
1146
|
-
|
|
1147
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
|
1148
|
-
Checking if DStream has reached its end is performed by :
|
|
1149
|
-
BITv06_endOfDStream(&DStream);
|
|
1150
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
|
1151
|
-
FSEv06_endOfDState(&DState);
|
|
1152
|
-
*/
|
|
1153
|
-
|
|
1154
1085
|
|
|
1155
1086
|
/* *****************************************
|
|
1156
1087
|
* FSE unsafe API
|
|
@@ -1325,9 +1256,7 @@ const char* FSEv06_getErrorName(size_t code) { return ERR_getErrorName(code); }
|
|
|
1325
1256
|
/* **************************************************************
|
|
1326
1257
|
* HUF Error Management
|
|
1327
1258
|
****************************************************************/
|
|
1328
|
-
unsigned HUFv06_isError(size_t code) { return ERR_isError(code); }
|
|
1329
|
-
|
|
1330
|
-
const char* HUFv06_getErrorName(size_t code) { return ERR_getErrorName(code); }
|
|
1259
|
+
static unsigned HUFv06_isError(size_t code) { return ERR_isError(code); }
|
|
1331
1260
|
|
|
1332
1261
|
|
|
1333
1262
|
/*-**************************************************************
|
|
@@ -1937,7 +1866,7 @@ MEM_STATIC size_t HUFv06_readStats(BYTE* huffWeight, size_t hwSize, U32* rankSta
|
|
|
1937
1866
|
|
|
1938
1867
|
if (!srcSize) return ERROR(srcSize_wrong);
|
|
1939
1868
|
iSize = ip[0];
|
|
1940
|
-
|
|
1869
|
+
/* memset(huffWeight, 0, hwSize); */ /* is not necessary, even though some analyzer complain ... */
|
|
1941
1870
|
|
|
1942
1871
|
if (iSize >= 128) { /* special header */
|
|
1943
1872
|
if (iSize >= (242)) { /* RLE */
|
|
@@ -2089,7 +2018,7 @@ size_t HUFv06_readDTableX2 (U16* DTable, const void* src, size_t srcSize)
|
|
|
2089
2018
|
HUFv06_DEltX2* const dt = (HUFv06_DEltX2*)dtPtr;
|
|
2090
2019
|
|
|
2091
2020
|
HUFv06_STATIC_ASSERT(sizeof(HUFv06_DEltX2) == sizeof(U16)); /* if compilation fails here, assertion is false */
|
|
2092
|
-
|
|
2021
|
+
/* memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */
|
|
2093
2022
|
|
|
2094
2023
|
iSize = HUFv06_readStats(huffWeight, HUFv06_MAX_SYMBOL_VALUE + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
|
|
2095
2024
|
if (HUFv06_isError(iSize)) return iSize;
|
|
@@ -2415,7 +2344,7 @@ size_t HUFv06_readDTableX4 (U32* DTable, const void* src, size_t srcSize)
|
|
|
2415
2344
|
|
|
2416
2345
|
HUFv06_STATIC_ASSERT(sizeof(HUFv06_DEltX4) == sizeof(U32)); /* if compilation fails here, assertion is false */
|
|
2417
2346
|
if (memLog > HUFv06_ABSOLUTEMAX_TABLELOG) return ERROR(tableLog_tooLarge);
|
|
2418
|
-
|
|
2347
|
+
/* memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */
|
|
2419
2348
|
|
|
2420
2349
|
iSize = HUFv06_readStats(weightList, HUFv06_MAX_SYMBOL_VALUE + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
|
|
2421
2350
|
if (HUFv06_isError(iSize)) return iSize;
|
|
@@ -2739,13 +2668,13 @@ size_t HUFv06_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS
|
|
|
2739
2668
|
|
|
2740
2669
|
{ U32 algoNb = 0;
|
|
2741
2670
|
if (Dtime[1] < Dtime[0]) algoNb = 1;
|
|
2742
|
-
|
|
2671
|
+
/* if (Dtime[2] < Dtime[algoNb]) algoNb = 2; */ /* current speed of HUFv06_decompress4X6 is not good */
|
|
2743
2672
|
return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
|
|
2744
2673
|
}
|
|
2745
2674
|
|
|
2746
|
-
|
|
2747
|
-
|
|
2748
|
-
|
|
2675
|
+
/* return HUFv06_decompress4X2(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams single-symbol decoding */
|
|
2676
|
+
/* return HUFv06_decompress4X4(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams double-symbols decoding */
|
|
2677
|
+
/* return HUFv06_decompress4X6(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams quad-symbols decoding */
|
|
2749
2678
|
}
|
|
2750
2679
|
/*
|
|
2751
2680
|
Common functions of Zstd compression library
|
|
@@ -2893,13 +2822,13 @@ struct ZSTDv06_DCtx_s
|
|
|
2893
2822
|
ZSTDv06_dStage stage;
|
|
2894
2823
|
U32 flagRepeatTable;
|
|
2895
2824
|
const BYTE* litPtr;
|
|
2896
|
-
size_t litBufSize;
|
|
2897
2825
|
size_t litSize;
|
|
2898
2826
|
BYTE litBuffer[ZSTDv06_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
|
|
2899
2827
|
BYTE headerBuffer[ZSTDv06_FRAMEHEADERSIZE_MAX];
|
|
2900
2828
|
}; /* typedef'd to ZSTDv06_DCtx within "zstd_static.h" */
|
|
2901
2829
|
|
|
2902
|
-
size_t ZSTDv06_sizeofDCtx (void)
|
|
2830
|
+
size_t ZSTDv06_sizeofDCtx (void); /* Hidden declaration */
|
|
2831
|
+
size_t ZSTDv06_sizeofDCtx (void) { return sizeof(ZSTDv06_DCtx); }
|
|
2903
2832
|
|
|
2904
2833
|
size_t ZSTDv06_decompressBegin(ZSTDv06_DCtx* dctx)
|
|
2905
2834
|
{
|
|
@@ -3085,7 +3014,7 @@ size_t ZSTDv06_getFrameParams(ZSTDv06_frameParams* fparamsPtr, const void* src,
|
|
|
3085
3014
|
static size_t ZSTDv06_decodeFrameHeader(ZSTDv06_DCtx* zc, const void* src, size_t srcSize)
|
|
3086
3015
|
{
|
|
3087
3016
|
size_t const result = ZSTDv06_getFrameParams(&(zc->fParams), src, srcSize);
|
|
3088
|
-
if ((MEM_32bits()) && (zc->fParams.windowLog > 25)) return ERROR(
|
|
3017
|
+
if ((MEM_32bits()) && (zc->fParams.windowLog > 25)) return ERROR(frameParameter_unsupported);
|
|
3089
3018
|
return result;
|
|
3090
3019
|
}
|
|
3091
3020
|
|
|
@@ -3098,7 +3027,7 @@ typedef struct
|
|
|
3098
3027
|
|
|
3099
3028
|
/*! ZSTDv06_getcBlockSize() :
|
|
3100
3029
|
* Provides the size of compressed block from block header `src` */
|
|
3101
|
-
size_t ZSTDv06_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
|
|
3030
|
+
static size_t ZSTDv06_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
|
|
3102
3031
|
{
|
|
3103
3032
|
const BYTE* const in = (const BYTE* const)src;
|
|
3104
3033
|
U32 cSize;
|
|
@@ -3117,6 +3046,7 @@ size_t ZSTDv06_getcBlockSize(const void* src, size_t srcSize, blockProperties_t*
|
|
|
3117
3046
|
|
|
3118
3047
|
static size_t ZSTDv06_copyRawBlock(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
|
3119
3048
|
{
|
|
3049
|
+
if (dst==NULL) return ERROR(dstSize_tooSmall);
|
|
3120
3050
|
if (srcSize > dstCapacity) return ERROR(dstSize_tooSmall);
|
|
3121
3051
|
memcpy(dst, src, srcSize);
|
|
3122
3052
|
return srcSize;
|
|
@@ -3125,7 +3055,7 @@ static size_t ZSTDv06_copyRawBlock(void* dst, size_t dstCapacity, const void* sr
|
|
|
3125
3055
|
|
|
3126
3056
|
/*! ZSTDv06_decodeLiteralsBlock() :
|
|
3127
3057
|
@return : nb of bytes read from src (< srcSize ) */
|
|
3128
|
-
size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
3058
|
+
static size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
3129
3059
|
const void* src, size_t srcSize) /* note : srcSize < BLOCKSIZE */
|
|
3130
3060
|
{
|
|
3131
3061
|
const BYTE* const istart = (const BYTE*) src;
|
|
@@ -3170,8 +3100,8 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
|
3170
3100
|
return ERROR(corruption_detected);
|
|
3171
3101
|
|
|
3172
3102
|
dctx->litPtr = dctx->litBuffer;
|
|
3173
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+8;
|
|
3174
3103
|
dctx->litSize = litSize;
|
|
3104
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3175
3105
|
return litCSize + lhSize;
|
|
3176
3106
|
}
|
|
3177
3107
|
case IS_PCH:
|
|
@@ -3186,14 +3116,14 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
|
3186
3116
|
lhSize=3;
|
|
3187
3117
|
litSize = ((istart[0] & 15) << 6) + (istart[1] >> 2);
|
|
3188
3118
|
litCSize = ((istart[1] & 3) << 8) + istart[2];
|
|
3189
|
-
if (litCSize +
|
|
3119
|
+
if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
|
|
3190
3120
|
|
|
3191
3121
|
{ size_t const errorCode = HUFv06_decompress1X4_usingDTable(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->hufTableX4);
|
|
3192
3122
|
if (HUFv06_isError(errorCode)) return ERROR(corruption_detected);
|
|
3193
3123
|
}
|
|
3194
3124
|
dctx->litPtr = dctx->litBuffer;
|
|
3195
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+WILDCOPY_OVERLENGTH;
|
|
3196
3125
|
dctx->litSize = litSize;
|
|
3126
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3197
3127
|
return litCSize + lhSize;
|
|
3198
3128
|
}
|
|
3199
3129
|
case IS_RAW:
|
|
@@ -3217,13 +3147,12 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
|
3217
3147
|
if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
|
|
3218
3148
|
memcpy(dctx->litBuffer, istart+lhSize, litSize);
|
|
3219
3149
|
dctx->litPtr = dctx->litBuffer;
|
|
3220
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+8;
|
|
3221
3150
|
dctx->litSize = litSize;
|
|
3151
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3222
3152
|
return lhSize+litSize;
|
|
3223
3153
|
}
|
|
3224
3154
|
/* direct reference into compressed stream */
|
|
3225
3155
|
dctx->litPtr = istart+lhSize;
|
|
3226
|
-
dctx->litBufSize = srcSize-lhSize;
|
|
3227
3156
|
dctx->litSize = litSize;
|
|
3228
3157
|
return lhSize+litSize;
|
|
3229
3158
|
}
|
|
@@ -3245,9 +3174,8 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
|
3245
3174
|
break;
|
|
3246
3175
|
}
|
|
3247
3176
|
if (litSize > ZSTDv06_BLOCKSIZE_MAX) return ERROR(corruption_detected);
|
|
3248
|
-
memset(dctx->litBuffer, istart[lhSize], litSize);
|
|
3177
|
+
memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
|
|
3249
3178
|
dctx->litPtr = dctx->litBuffer;
|
|
3250
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+WILDCOPY_OVERLENGTH;
|
|
3251
3179
|
dctx->litSize = litSize;
|
|
3252
3180
|
return lhSize+1;
|
|
3253
3181
|
}
|
|
@@ -3261,7 +3189,7 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
|
3261
3189
|
@return : nb bytes read from src,
|
|
3262
3190
|
or an error code if it fails, testable with ZSTDv06_isError()
|
|
3263
3191
|
*/
|
|
3264
|
-
size_t ZSTDv06_buildSeqTable(FSEv06_DTable* DTable, U32 type, U32 max, U32 maxLog,
|
|
3192
|
+
static size_t ZSTDv06_buildSeqTable(FSEv06_DTable* DTable, U32 type, U32 max, U32 maxLog,
|
|
3265
3193
|
const void* src, size_t srcSize,
|
|
3266
3194
|
const S16* defaultNorm, U32 defaultLog, U32 flagRepeatTable)
|
|
3267
3195
|
{
|
|
@@ -3291,7 +3219,7 @@ size_t ZSTDv06_buildSeqTable(FSEv06_DTable* DTable, U32 type, U32 max, U32 maxLo
|
|
|
3291
3219
|
}
|
|
3292
3220
|
|
|
3293
3221
|
|
|
3294
|
-
size_t ZSTDv06_decodeSeqHeaders(int* nbSeqPtr,
|
|
3222
|
+
static size_t ZSTDv06_decodeSeqHeaders(int* nbSeqPtr,
|
|
3295
3223
|
FSEv06_DTable* DTableLL, FSEv06_DTable* DTableML, FSEv06_DTable* DTableOffb, U32 flagRepeatTable,
|
|
3296
3224
|
const void* src, size_t srcSize)
|
|
3297
3225
|
{
|
|
@@ -3318,14 +3246,12 @@ size_t ZSTDv06_decodeSeqHeaders(int* nbSeqPtr,
|
|
|
3318
3246
|
}
|
|
3319
3247
|
|
|
3320
3248
|
/* FSE table descriptors */
|
|
3249
|
+
if (ip + 4 > iend) return ERROR(srcSize_wrong); /* min : header byte + all 3 are "raw", hence no header, but at least xxLog bits per type */
|
|
3321
3250
|
{ U32 const LLtype = *ip >> 6;
|
|
3322
3251
|
U32 const Offtype = (*ip >> 4) & 3;
|
|
3323
3252
|
U32 const MLtype = (*ip >> 2) & 3;
|
|
3324
3253
|
ip++;
|
|
3325
3254
|
|
|
3326
|
-
/* check */
|
|
3327
|
-
if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
|
|
3328
|
-
|
|
3329
3255
|
/* Build DTables */
|
|
3330
3256
|
{ size_t const bhSize = ZSTDv06_buildSeqTable(DTableLL, LLtype, MaxLL, LLFSELog, ip, iend-ip, LL_defaultNorm, LL_defaultNormLog, flagRepeatTable);
|
|
3331
3257
|
if (ZSTDv06_isError(bhSize)) return ERROR(corruption_detected);
|
|
@@ -3436,9 +3362,9 @@ static void ZSTDv06_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
|
3436
3362
|
}
|
|
3437
3363
|
|
|
3438
3364
|
|
|
3439
|
-
size_t ZSTDv06_execSequence(BYTE* op,
|
|
3365
|
+
static size_t ZSTDv06_execSequence(BYTE* op,
|
|
3440
3366
|
BYTE* const oend, seq_t sequence,
|
|
3441
|
-
const BYTE** litPtr, const BYTE* const
|
|
3367
|
+
const BYTE** litPtr, const BYTE* const litLimit,
|
|
3442
3368
|
const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
|
|
3443
3369
|
{
|
|
3444
3370
|
BYTE* const oLitEnd = op + sequence.litLength;
|
|
@@ -3451,7 +3377,7 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|
|
3451
3377
|
/* check */
|
|
3452
3378
|
if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */
|
|
3453
3379
|
if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
|
|
3454
|
-
if (iLitEnd >
|
|
3380
|
+
if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
|
|
3455
3381
|
|
|
3456
3382
|
/* copy Literals */
|
|
3457
3383
|
ZSTDv06_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
|
@@ -3473,7 +3399,7 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|
|
3473
3399
|
op = oLitEnd + length1;
|
|
3474
3400
|
sequence.matchLength -= length1;
|
|
3475
3401
|
match = base;
|
|
3476
|
-
if (op > oend_8) {
|
|
3402
|
+
if (op > oend_8 || sequence.matchLength < MINMATCH) {
|
|
3477
3403
|
while (op < oMatchEnd) *op++ = *match++;
|
|
3478
3404
|
return sequenceLength;
|
|
3479
3405
|
}
|
|
@@ -3484,7 +3410,7 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|
|
3484
3410
|
if (sequence.offset < 8) {
|
|
3485
3411
|
/* close range match, overlap */
|
|
3486
3412
|
static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
|
|
3487
|
-
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /*
|
|
3413
|
+
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
|
|
3488
3414
|
int const sub2 = dec64table[sequence.offset];
|
|
3489
3415
|
op[0] = match[0];
|
|
3490
3416
|
op[1] = match[1];
|
|
@@ -3506,7 +3432,7 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|
|
3506
3432
|
}
|
|
3507
3433
|
while (op < oMatchEnd) *op++ = *match++;
|
|
3508
3434
|
} else {
|
|
3509
|
-
ZSTDv06_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
3435
|
+
ZSTDv06_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
3510
3436
|
}
|
|
3511
3437
|
return sequenceLength;
|
|
3512
3438
|
}
|
|
@@ -3523,7 +3449,6 @@ static size_t ZSTDv06_decompressSequences(
|
|
|
3523
3449
|
BYTE* const oend = ostart + maxDstSize;
|
|
3524
3450
|
BYTE* op = ostart;
|
|
3525
3451
|
const BYTE* litPtr = dctx->litPtr;
|
|
3526
|
-
const BYTE* const litLimit_8 = litPtr + dctx->litBufSize - 8;
|
|
3527
3452
|
const BYTE* const litEnd = litPtr + dctx->litSize;
|
|
3528
3453
|
FSEv06_DTable* DTableLL = dctx->LLTable;
|
|
3529
3454
|
FSEv06_DTable* DTableML = dctx->MLTable;
|
|
@@ -3567,7 +3492,7 @@ static size_t ZSTDv06_decompressSequences(
|
|
|
3567
3492
|
pos, (U32)sequence.litLength, (U32)sequence.matchLength, (U32)sequence.offset);
|
|
3568
3493
|
#endif
|
|
3569
3494
|
|
|
3570
|
-
{ size_t const oneSeqSize = ZSTDv06_execSequence(op, oend, sequence, &litPtr,
|
|
3495
|
+
{ size_t const oneSeqSize = ZSTDv06_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
|
|
3571
3496
|
if (ZSTDv06_isError(oneSeqSize)) return oneSeqSize;
|
|
3572
3497
|
op += oneSeqSize;
|
|
3573
3498
|
} }
|
|
@@ -3580,8 +3505,10 @@ static size_t ZSTDv06_decompressSequences(
|
|
|
3580
3505
|
{ size_t const lastLLSize = litEnd - litPtr;
|
|
3581
3506
|
if (litPtr > litEnd) return ERROR(corruption_detected); /* too many literals already used */
|
|
3582
3507
|
if (op+lastLLSize > oend) return ERROR(dstSize_tooSmall);
|
|
3583
|
-
|
|
3584
|
-
|
|
3508
|
+
if (lastLLSize > 0) {
|
|
3509
|
+
memcpy(op, litPtr, lastLLSize);
|
|
3510
|
+
op += lastLLSize;
|
|
3511
|
+
}
|
|
3585
3512
|
}
|
|
3586
3513
|
|
|
3587
3514
|
return op-ostart;
|
|
@@ -3733,6 +3660,63 @@ size_t ZSTDv06_decompress(void* dst, size_t dstCapacity, const void* src, size_t
|
|
|
3733
3660
|
#endif
|
|
3734
3661
|
}
|
|
3735
3662
|
|
|
3663
|
+
/* ZSTD_errorFrameSizeInfoLegacy() :
|
|
3664
|
+
assumes `cSize` and `dBound` are _not_ NULL */
|
|
3665
|
+
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
|
|
3666
|
+
{
|
|
3667
|
+
*cSize = ret;
|
|
3668
|
+
*dBound = ZSTD_CONTENTSIZE_ERROR;
|
|
3669
|
+
}
|
|
3670
|
+
|
|
3671
|
+
void ZSTDv06_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
|
|
3672
|
+
{
|
|
3673
|
+
const BYTE* ip = (const BYTE*)src;
|
|
3674
|
+
size_t remainingSize = srcSize;
|
|
3675
|
+
size_t nbBlocks = 0;
|
|
3676
|
+
blockProperties_t blockProperties = { bt_compressed, 0 };
|
|
3677
|
+
|
|
3678
|
+
/* Frame Header */
|
|
3679
|
+
{ size_t const frameHeaderSize = ZSTDv06_frameHeaderSize(src, srcSize);
|
|
3680
|
+
if (ZSTDv06_isError(frameHeaderSize)) {
|
|
3681
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, frameHeaderSize);
|
|
3682
|
+
return;
|
|
3683
|
+
}
|
|
3684
|
+
if (MEM_readLE32(src) != ZSTDv06_MAGICNUMBER) {
|
|
3685
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
|
|
3686
|
+
return;
|
|
3687
|
+
}
|
|
3688
|
+
if (srcSize < frameHeaderSize+ZSTDv06_blockHeaderSize) {
|
|
3689
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3690
|
+
return;
|
|
3691
|
+
}
|
|
3692
|
+
ip += frameHeaderSize; remainingSize -= frameHeaderSize;
|
|
3693
|
+
}
|
|
3694
|
+
|
|
3695
|
+
/* Loop on each block */
|
|
3696
|
+
while (1) {
|
|
3697
|
+
size_t const cBlockSize = ZSTDv06_getcBlockSize(ip, remainingSize, &blockProperties);
|
|
3698
|
+
if (ZSTDv06_isError(cBlockSize)) {
|
|
3699
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
|
|
3700
|
+
return;
|
|
3701
|
+
}
|
|
3702
|
+
|
|
3703
|
+
ip += ZSTDv06_blockHeaderSize;
|
|
3704
|
+
remainingSize -= ZSTDv06_blockHeaderSize;
|
|
3705
|
+
if (cBlockSize > remainingSize) {
|
|
3706
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3707
|
+
return;
|
|
3708
|
+
}
|
|
3709
|
+
|
|
3710
|
+
if (cBlockSize == 0) break; /* bt_end */
|
|
3711
|
+
|
|
3712
|
+
ip += cBlockSize;
|
|
3713
|
+
remainingSize -= cBlockSize;
|
|
3714
|
+
nbBlocks++;
|
|
3715
|
+
}
|
|
3716
|
+
|
|
3717
|
+
*cSize = ip - (const BYTE*)src;
|
|
3718
|
+
*dBound = nbBlocks * ZSTDv06_BLOCKSIZE_MAX;
|
|
3719
|
+
}
|
|
3736
3720
|
|
|
3737
3721
|
/*_******************************
|
|
3738
3722
|
* Streaming Decompression API
|
|
@@ -3762,7 +3746,7 @@ size_t ZSTDv06_decompressContinue(ZSTDv06_DCtx* dctx, void* dst, size_t dstCapac
|
|
|
3762
3746
|
return 0;
|
|
3763
3747
|
}
|
|
3764
3748
|
dctx->expected = 0; /* not necessary to copy more */
|
|
3765
|
-
|
|
3749
|
+
/* fall-through */
|
|
3766
3750
|
case ZSTDds_decodeFrameHeader:
|
|
3767
3751
|
{ size_t result;
|
|
3768
3752
|
memcpy(dctx->headerBuffer + ZSTDv06_frameHeaderSize_min, src, dctx->expected);
|
|
@@ -4022,7 +4006,9 @@ size_t ZBUFFv06_decompressInit(ZBUFFv06_DCtx* zbd)
|
|
|
4022
4006
|
MEM_STATIC size_t ZBUFFv06_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
|
4023
4007
|
{
|
|
4024
4008
|
size_t length = MIN(dstCapacity, srcSize);
|
|
4025
|
-
|
|
4009
|
+
if (length > 0) {
|
|
4010
|
+
memcpy(dst, src, length);
|
|
4011
|
+
}
|
|
4026
4012
|
return length;
|
|
4027
4013
|
}
|
|
4028
4014
|
|
|
@@ -4054,7 +4040,7 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
|
4054
4040
|
if (ZSTDv06_isError(hSize)) return hSize;
|
|
4055
4041
|
if (toLoad > (size_t)(iend-ip)) { /* not enough input to load full header */
|
|
4056
4042
|
memcpy(zbd->headerBuffer + zbd->lhSize, ip, iend-ip);
|
|
4057
|
-
zbd->lhSize += iend-ip;
|
|
4043
|
+
zbd->lhSize += iend-ip;
|
|
4058
4044
|
*dstCapacityPtr = 0;
|
|
4059
4045
|
return (hSize - zbd->lhSize) + ZSTDv06_blockHeaderSize; /* remaining header bytes + next block header */
|
|
4060
4046
|
}
|
|
@@ -4081,7 +4067,7 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
|
4081
4067
|
zbd->inBuff = (char*)malloc(blockSize);
|
|
4082
4068
|
if (zbd->inBuff == NULL) return ERROR(memory_allocation);
|
|
4083
4069
|
}
|
|
4084
|
-
{ size_t const neededOutSize = ((size_t)1 << zbd->fParams.windowLog) + blockSize;
|
|
4070
|
+
{ size_t const neededOutSize = ((size_t)1 << zbd->fParams.windowLog) + blockSize + WILDCOPY_OVERLENGTH * 2;
|
|
4085
4071
|
if (zbd->outBuffSize < neededOutSize) {
|
|
4086
4072
|
free(zbd->outBuff);
|
|
4087
4073
|
zbd->outBuffSize = neededOutSize;
|
|
@@ -4089,7 +4075,7 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
|
4089
4075
|
if (zbd->outBuff == NULL) return ERROR(memory_allocation);
|
|
4090
4076
|
} } }
|
|
4091
4077
|
zbd->stage = ZBUFFds_read;
|
|
4092
|
-
|
|
4078
|
+
/* fall-through */
|
|
4093
4079
|
case ZBUFFds_read:
|
|
4094
4080
|
{ size_t const neededInSize = ZSTDv06_nextSrcSizeToDecompress(zbd->zd);
|
|
4095
4081
|
if (neededInSize==0) { /* end of frame */
|
|
@@ -4111,7 +4097,7 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
|
4111
4097
|
if (ip==iend) { notDone = 0; break; } /* no more input */
|
|
4112
4098
|
zbd->stage = ZBUFFds_load;
|
|
4113
4099
|
}
|
|
4114
|
-
|
|
4100
|
+
/* fall-through */
|
|
4115
4101
|
case ZBUFFds_load:
|
|
4116
4102
|
{ size_t const neededInSize = ZSTDv06_nextSrcSizeToDecompress(zbd->zd);
|
|
4117
4103
|
size_t const toLoad = neededInSize - zbd->inPos; /* should always be <= remaining space within inBuff */
|
|
@@ -4131,9 +4117,10 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
|
4131
4117
|
if (!decodedSize) { zbd->stage = ZBUFFds_read; break; } /* this was just a header */
|
|
4132
4118
|
zbd->outEnd = zbd->outStart + decodedSize;
|
|
4133
4119
|
zbd->stage = ZBUFFds_flush;
|
|
4134
|
-
|
|
4135
|
-
|
|
4136
|
-
|
|
4120
|
+
/* break; */ /* ZBUFFds_flush follows */
|
|
4121
|
+
}
|
|
4122
|
+
}
|
|
4123
|
+
/* fall-through */
|
|
4137
4124
|
case ZBUFFds_flush:
|
|
4138
4125
|
{ size_t const toFlushSize = zbd->outEnd - zbd->outStart;
|
|
4139
4126
|
size_t const flushedSize = ZBUFFv06_limitCopy(op, oend-op, zbd->outBuff + zbd->outStart, toFlushSize);
|