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 ZSTDv06_H
|
|
@@ -41,6 +42,18 @@ extern "C" {
|
|
|
41
42
|
ZSTDLIBv06_API size_t ZSTDv06_decompress( void* dst, size_t dstCapacity,
|
|
42
43
|
const void* src, size_t compressedSize);
|
|
43
44
|
|
|
45
|
+
/**
|
|
46
|
+
ZSTDv06_findFrameSizeInfoLegacy() : get the source length and decompressed bound of a ZSTD frame compliant with v0.6.x format
|
|
47
|
+
srcSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
|
|
48
|
+
cSize (output parameter) : the number of bytes that would be read to decompress this frame
|
|
49
|
+
or an error code if it fails (which can be tested using ZSTDv01_isError())
|
|
50
|
+
dBound (output parameter) : an upper-bound for the decompressed size of the data in the frame
|
|
51
|
+
or ZSTD_CONTENTSIZE_ERROR if an error occurs
|
|
52
|
+
|
|
53
|
+
note : assumes `cSize` and `dBound` are _not_ NULL.
|
|
54
|
+
*/
|
|
55
|
+
void ZSTDv06_findFrameSizeInfoLegacy(const void *src, size_t srcSize,
|
|
56
|
+
size_t* cSize, unsigned long long* dBound);
|
|
44
57
|
|
|
45
58
|
/* *************************************
|
|
46
59
|
* 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,15 +14,17 @@
|
|
|
13
14
|
#include <string.h> /* memcpy */
|
|
14
15
|
#include <stdlib.h> /* malloc, free, qsort */
|
|
15
16
|
|
|
16
|
-
#
|
|
17
|
-
#
|
|
17
|
+
#ifndef XXH_STATIC_LINKING_ONLY
|
|
18
|
+
# define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
|
|
19
|
+
#endif
|
|
20
|
+
#include "../common/xxhash.h" /* XXH64_* */
|
|
18
21
|
#include "zstd_v07.h"
|
|
19
22
|
|
|
20
|
-
#define FSEv07_STATIC_LINKING_ONLY
|
|
21
|
-
#define HUFv07_STATIC_LINKING_ONLY
|
|
23
|
+
#define FSEv07_STATIC_LINKING_ONLY /* FSEv07_MIN_TABLELOG */
|
|
24
|
+
#define HUFv07_STATIC_LINKING_ONLY /* HUFv07_TABLELOG_ABSOLUTEMAX */
|
|
22
25
|
#define ZSTDv07_STATIC_LINKING_ONLY
|
|
23
26
|
|
|
24
|
-
#include "error_private.h"
|
|
27
|
+
#include "../common/error_private.h"
|
|
25
28
|
|
|
26
29
|
|
|
27
30
|
#ifdef ZSTDv07_STATIC_LINKING_ONLY
|
|
@@ -239,7 +242,11 @@ extern "C" {
|
|
|
239
242
|
* Basic Types
|
|
240
243
|
*****************************************************************/
|
|
241
244
|
#if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
|
|
242
|
-
#
|
|
245
|
+
# if defined(_AIX)
|
|
246
|
+
# include <inttypes.h>
|
|
247
|
+
# else
|
|
248
|
+
# include <stdint.h> /* intptr_t */
|
|
249
|
+
# endif
|
|
243
250
|
typedef uint8_t BYTE;
|
|
244
251
|
typedef uint16_t U16;
|
|
245
252
|
typedef int16_t S16;
|
|
@@ -345,7 +352,7 @@ MEM_STATIC U32 MEM_swap32(U32 in)
|
|
|
345
352
|
{
|
|
346
353
|
#if defined(_MSC_VER) /* Visual Studio */
|
|
347
354
|
return _byteswap_ulong(in);
|
|
348
|
-
#elif defined (__GNUC__)
|
|
355
|
+
#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)
|
|
349
356
|
return __builtin_bswap32(in);
|
|
350
357
|
#else
|
|
351
358
|
return ((in << 24) & 0xff000000 ) |
|
|
@@ -359,7 +366,7 @@ MEM_STATIC U64 MEM_swap64(U64 in)
|
|
|
359
366
|
{
|
|
360
367
|
#if defined(_MSC_VER) /* Visual Studio */
|
|
361
368
|
return _byteswap_uint64(in);
|
|
362
|
-
#elif defined (__GNUC__)
|
|
369
|
+
#elif defined (__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__ >= 403)
|
|
363
370
|
return __builtin_bswap64(in);
|
|
364
371
|
#else
|
|
365
372
|
return ((in << 56) & 0xff00000000000000ULL) |
|
|
@@ -508,16 +515,6 @@ MEM_STATIC BITv07_DStream_status BITv07_reloadDStream(BITv07_DStream_t* bitD);
|
|
|
508
515
|
MEM_STATIC unsigned BITv07_endOfDStream(const BITv07_DStream_t* bitD);
|
|
509
516
|
|
|
510
517
|
|
|
511
|
-
/* Start by invoking BITv07_initDStream().
|
|
512
|
-
* A chunk of the bitStream is then stored into a local register.
|
|
513
|
-
* Local register size is 64-bits on 64-bits systems, 32-bits on 32-bits systems (size_t).
|
|
514
|
-
* You can then retrieve bitFields stored into the local register, **in reverse order**.
|
|
515
|
-
* Local register is explicitly reloaded from memory by the BITv07_reloadDStream() method.
|
|
516
|
-
* A reload guarantee a minimum of ((8*sizeof(bitD->bitContainer))-7) bits when its result is BITv07_DStream_unfinished.
|
|
517
|
-
* Otherwise, it can be less than that, so proceed accordingly.
|
|
518
|
-
* Checking if DStream has reached its end can be performed with BITv07_endOfDStream().
|
|
519
|
-
*/
|
|
520
|
-
|
|
521
518
|
|
|
522
519
|
/*-****************************************
|
|
523
520
|
* unsafe API
|
|
@@ -530,14 +527,14 @@ MEM_STATIC size_t BITv07_readBitsFast(BITv07_DStream_t* bitD, unsigned nbBits);
|
|
|
530
527
|
/*-**************************************************************
|
|
531
528
|
* Internal functions
|
|
532
529
|
****************************************************************/
|
|
533
|
-
MEM_STATIC unsigned BITv07_highbit32 (
|
|
530
|
+
MEM_STATIC unsigned BITv07_highbit32 (U32 val)
|
|
534
531
|
{
|
|
535
532
|
# if defined(_MSC_VER) /* Visual */
|
|
536
533
|
unsigned long r=0;
|
|
537
534
|
_BitScanReverse ( &r, val );
|
|
538
535
|
return (unsigned) r;
|
|
539
536
|
# elif defined(__GNUC__) && (__GNUC__ >= 3) /* Use GCC Intrinsic */
|
|
540
|
-
return
|
|
537
|
+
return __builtin_clz (val) ^ 31;
|
|
541
538
|
# else /* Software version */
|
|
542
539
|
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 };
|
|
543
540
|
U32 v = val;
|
|
@@ -578,13 +575,13 @@ MEM_STATIC size_t BITv07_initDStream(BITv07_DStream_t* bitD, const void* srcBuff
|
|
|
578
575
|
bitD->bitContainer = *(const BYTE*)(bitD->start);
|
|
579
576
|
switch(srcSize)
|
|
580
577
|
{
|
|
581
|
-
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16)
|
|
582
|
-
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24)
|
|
583
|
-
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32)
|
|
584
|
-
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24;
|
|
585
|
-
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16;
|
|
586
|
-
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8;
|
|
587
|
-
default
|
|
578
|
+
case 7: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[6]) << (sizeof(bitD->bitContainer)*8 - 16);/* fall-through */
|
|
579
|
+
case 6: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[5]) << (sizeof(bitD->bitContainer)*8 - 24);/* fall-through */
|
|
580
|
+
case 5: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[4]) << (sizeof(bitD->bitContainer)*8 - 32);/* fall-through */
|
|
581
|
+
case 4: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[3]) << 24; /* fall-through */
|
|
582
|
+
case 3: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[2]) << 16; /* fall-through */
|
|
583
|
+
case 2: bitD->bitContainer += (size_t)(((const BYTE*)(srcBuffer))[1]) << 8; /* fall-through */
|
|
584
|
+
default: break;
|
|
588
585
|
}
|
|
589
586
|
{ BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1];
|
|
590
587
|
bitD->bitsConsumed = lastByte ? 8 - BITv07_highbit32(lastByte) : 0;
|
|
@@ -596,13 +593,6 @@ MEM_STATIC size_t BITv07_initDStream(BITv07_DStream_t* bitD, const void* srcBuff
|
|
|
596
593
|
}
|
|
597
594
|
|
|
598
595
|
|
|
599
|
-
/*! BITv07_lookBits() :
|
|
600
|
-
* Provides next n bits from local register.
|
|
601
|
-
* local register is not modified.
|
|
602
|
-
* On 32-bits, maxNbBits==24.
|
|
603
|
-
* On 64-bits, maxNbBits==56.
|
|
604
|
-
* @return : value extracted
|
|
605
|
-
*/
|
|
606
596
|
MEM_STATIC size_t BITv07_lookBits(const BITv07_DStream_t* bitD, U32 nbBits)
|
|
607
597
|
{
|
|
608
598
|
U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1;
|
|
@@ -622,11 +612,6 @@ MEM_STATIC void BITv07_skipBits(BITv07_DStream_t* bitD, U32 nbBits)
|
|
|
622
612
|
bitD->bitsConsumed += nbBits;
|
|
623
613
|
}
|
|
624
614
|
|
|
625
|
-
/*! BITv07_readBits() :
|
|
626
|
-
* Read (consume) next n bits from local register and update.
|
|
627
|
-
* Pay attention to not read more than nbBits contained into local register.
|
|
628
|
-
* @return : extracted value.
|
|
629
|
-
*/
|
|
630
615
|
MEM_STATIC size_t BITv07_readBits(BITv07_DStream_t* bitD, U32 nbBits)
|
|
631
616
|
{
|
|
632
617
|
size_t const value = BITv07_lookBits(bitD, nbBits);
|
|
@@ -643,11 +628,6 @@ MEM_STATIC size_t BITv07_readBitsFast(BITv07_DStream_t* bitD, U32 nbBits)
|
|
|
643
628
|
return value;
|
|
644
629
|
}
|
|
645
630
|
|
|
646
|
-
/*! BITv07_reloadDStream() :
|
|
647
|
-
* Refill `BITv07_DStream_t` from src buffer previously defined (see BITv07_initDStream() ).
|
|
648
|
-
* This function is safe, it guarantees it will not read beyond src buffer.
|
|
649
|
-
* @return : status of `BITv07_DStream_t` internal register.
|
|
650
|
-
if status == unfinished, internal register is filled with >= (sizeof(bitD->bitContainer)*8 - 7) bits */
|
|
651
631
|
MEM_STATIC BITv07_DStream_status BITv07_reloadDStream(BITv07_DStream_t* bitD)
|
|
652
632
|
{
|
|
653
633
|
if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8)) /* should not happen => corruption detected */
|
|
@@ -871,55 +851,6 @@ static void FSEv07_initDState(FSEv07_DState_t* DStatePtr, BITv07_DStream_t*
|
|
|
871
851
|
static unsigned char FSEv07_decodeSymbol(FSEv07_DState_t* DStatePtr, BITv07_DStream_t* bitD);
|
|
872
852
|
|
|
873
853
|
|
|
874
|
-
/**<
|
|
875
|
-
Let's now decompose FSEv07_decompress_usingDTable() into its unitary components.
|
|
876
|
-
You will decode FSE-encoded symbols from the bitStream,
|
|
877
|
-
and also any other bitFields you put in, **in reverse order**.
|
|
878
|
-
|
|
879
|
-
You will need a few variables to track your bitStream. They are :
|
|
880
|
-
|
|
881
|
-
BITv07_DStream_t DStream; // Stream context
|
|
882
|
-
FSEv07_DState_t DState; // State context. Multiple ones are possible
|
|
883
|
-
FSEv07_DTable* DTablePtr; // Decoding table, provided by FSEv07_buildDTable()
|
|
884
|
-
|
|
885
|
-
The first thing to do is to init the bitStream.
|
|
886
|
-
errorCode = BITv07_initDStream(&DStream, srcBuffer, srcSize);
|
|
887
|
-
|
|
888
|
-
You should then retrieve your initial state(s)
|
|
889
|
-
(in reverse flushing order if you have several ones) :
|
|
890
|
-
errorCode = FSEv07_initDState(&DState, &DStream, DTablePtr);
|
|
891
|
-
|
|
892
|
-
You can then decode your data, symbol after symbol.
|
|
893
|
-
For information the maximum number of bits read by FSEv07_decodeSymbol() is 'tableLog'.
|
|
894
|
-
Keep in mind that symbols are decoded in reverse order, like a LIFO stack (last in, first out).
|
|
895
|
-
unsigned char symbol = FSEv07_decodeSymbol(&DState, &DStream);
|
|
896
|
-
|
|
897
|
-
You can retrieve any bitfield you eventually stored into the bitStream (in reverse order)
|
|
898
|
-
Note : maximum allowed nbBits is 25, for 32-bits compatibility
|
|
899
|
-
size_t bitField = BITv07_readBits(&DStream, nbBits);
|
|
900
|
-
|
|
901
|
-
All above operations only read from local register (which size depends on size_t).
|
|
902
|
-
Refueling the register from memory is manually performed by the reload method.
|
|
903
|
-
endSignal = FSEv07_reloadDStream(&DStream);
|
|
904
|
-
|
|
905
|
-
BITv07_reloadDStream() result tells if there is still some more data to read from DStream.
|
|
906
|
-
BITv07_DStream_unfinished : there is still some data left into the DStream.
|
|
907
|
-
BITv07_DStream_endOfBuffer : Dstream reached end of buffer. Its container may no longer be completely filled.
|
|
908
|
-
BITv07_DStream_completed : Dstream reached its exact end, corresponding in general to decompression completed.
|
|
909
|
-
BITv07_DStream_tooFar : Dstream went too far. Decompression result is corrupted.
|
|
910
|
-
|
|
911
|
-
When reaching end of buffer (BITv07_DStream_endOfBuffer), progress slowly, notably if you decode multiple symbols per loop,
|
|
912
|
-
to properly detect the exact end of stream.
|
|
913
|
-
After each decoded symbol, check if DStream is fully consumed using this simple test :
|
|
914
|
-
BITv07_reloadDStream(&DStream) >= BITv07_DStream_completed
|
|
915
|
-
|
|
916
|
-
When it's done, verify decompression is fully completed, by checking both DStream and the relevant states.
|
|
917
|
-
Checking if DStream has reached its end is performed by :
|
|
918
|
-
BITv07_endOfDStream(&DStream);
|
|
919
|
-
Check also the states. There might be some symbols left there, if some high probability ones (>50%) are possible.
|
|
920
|
-
FSEv07_endOfDState(&DState);
|
|
921
|
-
*/
|
|
922
|
-
|
|
923
854
|
|
|
924
855
|
/* *****************************************
|
|
925
856
|
* FSE unsafe API
|
|
@@ -1387,7 +1318,7 @@ size_t HUFv07_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
|
|
|
1387
1318
|
|
|
1388
1319
|
if (!srcSize) return ERROR(srcSize_wrong);
|
|
1389
1320
|
iSize = ip[0];
|
|
1390
|
-
|
|
1321
|
+
/* memset(huffWeight, 0, hwSize); */ /* is not necessary, even though some analyzer complain ... */
|
|
1391
1322
|
|
|
1392
1323
|
if (iSize >= 128) { /* special header */
|
|
1393
1324
|
if (iSize >= (242)) { /* RLE */
|
|
@@ -1857,7 +1788,7 @@ size_t HUFv07_readDTableX2 (HUFv07_DTable* DTable, const void* src, size_t srcSi
|
|
|
1857
1788
|
HUFv07_DEltX2* const dt = (HUFv07_DEltX2*)dtPtr;
|
|
1858
1789
|
|
|
1859
1790
|
HUFv07_STATIC_ASSERT(sizeof(DTableDesc) == sizeof(HUFv07_DTable));
|
|
1860
|
-
|
|
1791
|
+
/* memset(huffWeight, 0, sizeof(huffWeight)); */ /* is not necessary, even though some analyzer complain ... */
|
|
1861
1792
|
|
|
1862
1793
|
iSize = HUFv07_readStats(huffWeight, HUFv07_SYMBOLVALUE_MAX + 1, rankVal, &nbSymbols, &tableLog, src, srcSize);
|
|
1863
1794
|
if (HUFv07_isError(iSize)) return iSize;
|
|
@@ -2221,7 +2152,7 @@ size_t HUFv07_readDTableX4 (HUFv07_DTable* DTable, const void* src, size_t srcSi
|
|
|
2221
2152
|
|
|
2222
2153
|
HUFv07_STATIC_ASSERT(sizeof(HUFv07_DEltX4) == sizeof(HUFv07_DTable)); /* if compilation fails here, assertion is false */
|
|
2223
2154
|
if (maxTableLog > HUFv07_TABLELOG_ABSOLUTEMAX) return ERROR(tableLog_tooLarge);
|
|
2224
|
-
|
|
2155
|
+
/* memset(weightList, 0, sizeof(weightList)); */ /* is not necessary, even though some analyzer complain ... */
|
|
2225
2156
|
|
|
2226
2157
|
iSize = HUFv07_readStats(weightList, HUFv07_SYMBOLVALUE_MAX + 1, rankStats, &nbSymbols, &tableLog, src, srcSize);
|
|
2227
2158
|
if (HUFv07_isError(iSize)) return iSize;
|
|
@@ -2603,8 +2534,8 @@ size_t HUFv07_decompress (void* dst, size_t dstSize, const void* cSrc, size_t cS
|
|
|
2603
2534
|
return decompress[algoNb](dst, dstSize, cSrc, cSrcSize);
|
|
2604
2535
|
}
|
|
2605
2536
|
|
|
2606
|
-
|
|
2607
|
-
|
|
2537
|
+
/* return HUFv07_decompress4X2(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams single-symbol decoding */
|
|
2538
|
+
/* return HUFv07_decompress4X4(dst, dstSize, cSrc, cSrcSize); */ /* multi-streams double-symbols decoding */
|
|
2608
2539
|
}
|
|
2609
2540
|
|
|
2610
2541
|
size_t HUFv07_decompress4X_DCtx (HUFv07_DTable* dctx, void* dst, size_t dstSize, const void* cSrc, size_t cSrcSize)
|
|
@@ -2701,7 +2632,7 @@ const char* ZBUFFv07_getErrorName(size_t errorCode) { return ERR_getErrorName(er
|
|
|
2701
2632
|
|
|
2702
2633
|
|
|
2703
2634
|
|
|
2704
|
-
void* ZSTDv07_defaultAllocFunction(void* opaque, size_t size)
|
|
2635
|
+
static void* ZSTDv07_defaultAllocFunction(void* opaque, size_t size)
|
|
2705
2636
|
{
|
|
2706
2637
|
void* address = malloc(size);
|
|
2707
2638
|
(void)opaque;
|
|
@@ -2709,7 +2640,7 @@ void* ZSTDv07_defaultAllocFunction(void* opaque, size_t size)
|
|
|
2709
2640
|
return address;
|
|
2710
2641
|
}
|
|
2711
2642
|
|
|
2712
|
-
void ZSTDv07_defaultFreeFunction(void* opaque, void* address)
|
|
2643
|
+
static void ZSTDv07_defaultFreeFunction(void* opaque, void* address)
|
|
2713
2644
|
{
|
|
2714
2645
|
(void)opaque;
|
|
2715
2646
|
/* if (address) printf("free %p opaque=%p \n", address, opaque); */
|
|
@@ -2813,6 +2744,8 @@ typedef enum { lbt_huffman, lbt_repeat, lbt_raw, lbt_rle } litBlockType_t;
|
|
|
2813
2744
|
#define FSEv07_ENCODING_STATIC 2
|
|
2814
2745
|
#define FSEv07_ENCODING_DYNAMIC 3
|
|
2815
2746
|
|
|
2747
|
+
#define ZSTD_CONTENTSIZE_ERROR (0ULL - 2)
|
|
2748
|
+
|
|
2816
2749
|
static const U32 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
2817
2750
|
1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9,10,11,12,
|
|
2818
2751
|
13,14,15,16 };
|
|
@@ -2845,7 +2778,7 @@ static void ZSTDv07_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|
|
2845
2778
|
/*! ZSTDv07_wildcopy() :
|
|
2846
2779
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
|
2847
2780
|
#define WILDCOPY_OVERLENGTH 8
|
|
2848
|
-
MEM_STATIC void ZSTDv07_wildcopy(void* dst, const void* src,
|
|
2781
|
+
MEM_STATIC void ZSTDv07_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
|
2849
2782
|
{
|
|
2850
2783
|
const BYTE* ip = (const BYTE*)src;
|
|
2851
2784
|
BYTE* op = (BYTE*)dst;
|
|
@@ -2918,8 +2851,6 @@ typedef struct {
|
|
|
2918
2851
|
void ZSTDv07_seqToCodes(const seqStore_t* seqStorePtr, size_t const nbSeq);
|
|
2919
2852
|
|
|
2920
2853
|
/* custom memory allocation functions */
|
|
2921
|
-
void* ZSTDv07_defaultAllocFunction(void* opaque, size_t size);
|
|
2922
|
-
void ZSTDv07_defaultFreeFunction(void* opaque, void* address);
|
|
2923
2854
|
static const ZSTDv07_customMem defaultCustomMem = { ZSTDv07_defaultAllocFunction, ZSTDv07_defaultFreeFunction, NULL };
|
|
2924
2855
|
|
|
2925
2856
|
#endif /* ZSTDv07_CCOMMON_H_MODULE */
|
|
@@ -3021,7 +2952,6 @@ struct ZSTDv07_DCtx_s
|
|
|
3021
2952
|
U32 dictID;
|
|
3022
2953
|
const BYTE* litPtr;
|
|
3023
2954
|
ZSTDv07_customMem customMem;
|
|
3024
|
-
size_t litBufSize;
|
|
3025
2955
|
size_t litSize;
|
|
3026
2956
|
BYTE litBuffer[ZSTDv07_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH];
|
|
3027
2957
|
BYTE headerBuffer[ZSTDv07_FRAMEHEADERSIZE_MAX];
|
|
@@ -3226,10 +3156,10 @@ size_t ZSTDv07_getFrameParams(ZSTDv07_frameParams* fparamsPtr, const void* src,
|
|
|
3226
3156
|
const BYTE* ip = (const BYTE*)src;
|
|
3227
3157
|
|
|
3228
3158
|
if (srcSize < ZSTDv07_frameHeaderSize_min) return ZSTDv07_frameHeaderSize_min;
|
|
3159
|
+
memset(fparamsPtr, 0, sizeof(*fparamsPtr));
|
|
3229
3160
|
if (MEM_readLE32(src) != ZSTDv07_MAGICNUMBER) {
|
|
3230
3161
|
if ((MEM_readLE32(src) & 0xFFFFFFF0U) == ZSTDv07_MAGIC_SKIPPABLE_START) {
|
|
3231
3162
|
if (srcSize < ZSTDv07_skippableHeaderSize) return ZSTDv07_skippableHeaderSize; /* magic number + skippable frame length */
|
|
3232
|
-
memset(fparamsPtr, 0, sizeof(*fparamsPtr));
|
|
3233
3163
|
fparamsPtr->frameContentSize = MEM_readLE32((const char *)src + 4);
|
|
3234
3164
|
fparamsPtr->windowSize = 0; /* windowSize==0 means a frame is skippable */
|
|
3235
3165
|
return 0;
|
|
@@ -3251,11 +3181,13 @@ size_t ZSTDv07_getFrameParams(ZSTDv07_frameParams* fparamsPtr, const void* src,
|
|
|
3251
3181
|
U32 windowSize = 0;
|
|
3252
3182
|
U32 dictID = 0;
|
|
3253
3183
|
U64 frameContentSize = 0;
|
|
3254
|
-
if ((fhdByte & 0x08) != 0)
|
|
3184
|
+
if ((fhdByte & 0x08) != 0) /* reserved bits, which must be zero */
|
|
3185
|
+
return ERROR(frameParameter_unsupported);
|
|
3255
3186
|
if (!directMode) {
|
|
3256
3187
|
BYTE const wlByte = ip[pos++];
|
|
3257
3188
|
U32 const windowLog = (wlByte >> 3) + ZSTDv07_WINDOWLOG_ABSOLUTEMIN;
|
|
3258
|
-
if (windowLog > ZSTDv07_WINDOWLOG_MAX)
|
|
3189
|
+
if (windowLog > ZSTDv07_WINDOWLOG_MAX)
|
|
3190
|
+
return ERROR(frameParameter_unsupported);
|
|
3259
3191
|
windowSize = (1U << windowLog);
|
|
3260
3192
|
windowSize += (windowSize >> 3) * (wlByte&7);
|
|
3261
3193
|
}
|
|
@@ -3277,7 +3209,8 @@ size_t ZSTDv07_getFrameParams(ZSTDv07_frameParams* fparamsPtr, const void* src,
|
|
|
3277
3209
|
case 3 : frameContentSize = MEM_readLE64(ip+pos); break;
|
|
3278
3210
|
}
|
|
3279
3211
|
if (!windowSize) windowSize = (U32)frameContentSize;
|
|
3280
|
-
if (windowSize > windowSizeMax)
|
|
3212
|
+
if (windowSize > windowSizeMax)
|
|
3213
|
+
return ERROR(frameParameter_unsupported);
|
|
3281
3214
|
fparamsPtr->frameContentSize = frameContentSize;
|
|
3282
3215
|
fparamsPtr->windowSize = windowSize;
|
|
3283
3216
|
fparamsPtr->dictID = dictID;
|
|
@@ -3296,11 +3229,10 @@ size_t ZSTDv07_getFrameParams(ZSTDv07_frameParams* fparamsPtr, const void* src,
|
|
|
3296
3229
|
- frame header not completely provided (`srcSize` too small) */
|
|
3297
3230
|
unsigned long long ZSTDv07_getDecompressedSize(const void* src, size_t srcSize)
|
|
3298
3231
|
{
|
|
3299
|
-
|
|
3300
|
-
|
|
3301
|
-
|
|
3302
|
-
|
|
3303
|
-
}
|
|
3232
|
+
ZSTDv07_frameParams fparams;
|
|
3233
|
+
size_t const frResult = ZSTDv07_getFrameParams(&fparams, src, srcSize);
|
|
3234
|
+
if (frResult!=0) return 0;
|
|
3235
|
+
return fparams.frameContentSize;
|
|
3304
3236
|
}
|
|
3305
3237
|
|
|
3306
3238
|
|
|
@@ -3324,7 +3256,7 @@ typedef struct
|
|
|
3324
3256
|
|
|
3325
3257
|
/*! ZSTDv07_getcBlockSize() :
|
|
3326
3258
|
* Provides the size of compressed block from block header `src` */
|
|
3327
|
-
size_t ZSTDv07_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
|
|
3259
|
+
static size_t ZSTDv07_getcBlockSize(const void* src, size_t srcSize, blockProperties_t* bpPtr)
|
|
3328
3260
|
{
|
|
3329
3261
|
const BYTE* const in = (const BYTE* const)src;
|
|
3330
3262
|
U32 cSize;
|
|
@@ -3344,14 +3276,16 @@ size_t ZSTDv07_getcBlockSize(const void* src, size_t srcSize, blockProperties_t*
|
|
|
3344
3276
|
static size_t ZSTDv07_copyRawBlock(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
|
3345
3277
|
{
|
|
3346
3278
|
if (srcSize > dstCapacity) return ERROR(dstSize_tooSmall);
|
|
3347
|
-
|
|
3279
|
+
if (srcSize > 0) {
|
|
3280
|
+
memcpy(dst, src, srcSize);
|
|
3281
|
+
}
|
|
3348
3282
|
return srcSize;
|
|
3349
3283
|
}
|
|
3350
3284
|
|
|
3351
3285
|
|
|
3352
3286
|
/*! ZSTDv07_decodeLiteralsBlock() :
|
|
3353
3287
|
@return : nb of bytes read from src (< srcSize ) */
|
|
3354
|
-
size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
3288
|
+
static size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
3355
3289
|
const void* src, size_t srcSize) /* note : srcSize < BLOCKSIZE */
|
|
3356
3290
|
{
|
|
3357
3291
|
const BYTE* const istart = (const BYTE*) src;
|
|
@@ -3395,9 +3329,9 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
|
3395
3329
|
return ERROR(corruption_detected);
|
|
3396
3330
|
|
|
3397
3331
|
dctx->litPtr = dctx->litBuffer;
|
|
3398
|
-
dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+8;
|
|
3399
3332
|
dctx->litSize = litSize;
|
|
3400
3333
|
dctx->litEntropy = 1;
|
|
3334
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3401
3335
|
return litCSize + lhSize;
|
|
3402
3336
|
}
|
|
3403
3337
|
case lbt_repeat:
|
|
@@ -3418,8 +3352,8 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
|
3418
3352
|
if (HUFv07_isError(errorCode)) return ERROR(corruption_detected);
|
|
3419
3353
|
}
|
|
3420
3354
|
dctx->litPtr = dctx->litBuffer;
|
|
3421
|
-
dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+WILDCOPY_OVERLENGTH;
|
|
3422
3355
|
dctx->litSize = litSize;
|
|
3356
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3423
3357
|
return litCSize + lhSize;
|
|
3424
3358
|
}
|
|
3425
3359
|
case lbt_raw:
|
|
@@ -3443,13 +3377,12 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
|
3443
3377
|
if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
|
|
3444
3378
|
memcpy(dctx->litBuffer, istart+lhSize, litSize);
|
|
3445
3379
|
dctx->litPtr = dctx->litBuffer;
|
|
3446
|
-
dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+8;
|
|
3447
3380
|
dctx->litSize = litSize;
|
|
3381
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
|
3448
3382
|
return lhSize+litSize;
|
|
3449
3383
|
}
|
|
3450
3384
|
/* direct reference into compressed stream */
|
|
3451
3385
|
dctx->litPtr = istart+lhSize;
|
|
3452
|
-
dctx->litBufSize = srcSize-lhSize;
|
|
3453
3386
|
dctx->litSize = litSize;
|
|
3454
3387
|
return lhSize+litSize;
|
|
3455
3388
|
}
|
|
@@ -3471,9 +3404,8 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
|
3471
3404
|
break;
|
|
3472
3405
|
}
|
|
3473
3406
|
if (litSize > ZSTDv07_BLOCKSIZE_ABSOLUTEMAX) return ERROR(corruption_detected);
|
|
3474
|
-
memset(dctx->litBuffer, istart[lhSize], litSize);
|
|
3407
|
+
memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
|
|
3475
3408
|
dctx->litPtr = dctx->litBuffer;
|
|
3476
|
-
dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+WILDCOPY_OVERLENGTH;
|
|
3477
3409
|
dctx->litSize = litSize;
|
|
3478
3410
|
return lhSize+1;
|
|
3479
3411
|
}
|
|
@@ -3487,7 +3419,7 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
|
3487
3419
|
@return : nb bytes read from src,
|
|
3488
3420
|
or an error code if it fails, testable with ZSTDv07_isError()
|
|
3489
3421
|
*/
|
|
3490
|
-
size_t ZSTDv07_buildSeqTable(FSEv07_DTable* DTable, U32 type, U32 max, U32 maxLog,
|
|
3422
|
+
static size_t ZSTDv07_buildSeqTable(FSEv07_DTable* DTable, U32 type, U32 max, U32 maxLog,
|
|
3491
3423
|
const void* src, size_t srcSize,
|
|
3492
3424
|
const S16* defaultNorm, U32 defaultLog, U32 flagRepeatTable)
|
|
3493
3425
|
{
|
|
@@ -3517,7 +3449,7 @@ size_t ZSTDv07_buildSeqTable(FSEv07_DTable* DTable, U32 type, U32 max, U32 maxLo
|
|
|
3517
3449
|
}
|
|
3518
3450
|
|
|
3519
3451
|
|
|
3520
|
-
size_t ZSTDv07_decodeSeqHeaders(int* nbSeqPtr,
|
|
3452
|
+
static size_t ZSTDv07_decodeSeqHeaders(int* nbSeqPtr,
|
|
3521
3453
|
FSEv07_DTable* DTableLL, FSEv07_DTable* DTableML, FSEv07_DTable* DTableOffb, U32 flagRepeatTable,
|
|
3522
3454
|
const void* src, size_t srcSize)
|
|
3523
3455
|
{
|
|
@@ -3544,14 +3476,12 @@ size_t ZSTDv07_decodeSeqHeaders(int* nbSeqPtr,
|
|
|
3544
3476
|
}
|
|
3545
3477
|
|
|
3546
3478
|
/* FSE table descriptors */
|
|
3479
|
+
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 */
|
|
3547
3480
|
{ U32 const LLtype = *ip >> 6;
|
|
3548
3481
|
U32 const OFtype = (*ip >> 4) & 3;
|
|
3549
3482
|
U32 const MLtype = (*ip >> 2) & 3;
|
|
3550
3483
|
ip++;
|
|
3551
3484
|
|
|
3552
|
-
/* check */
|
|
3553
|
-
if (ip > iend-3) return ERROR(srcSize_wrong); /* min : all 3 are "raw", hence no header, but at least xxLog bits per type */
|
|
3554
|
-
|
|
3555
3485
|
/* Build DTables */
|
|
3556
3486
|
{ size_t const llhSize = ZSTDv07_buildSeqTable(DTableLL, LLtype, MaxLL, LLFSELog, ip, iend-ip, LL_defaultNorm, LL_defaultNormLog, flagRepeatTable);
|
|
3557
3487
|
if (ZSTDv07_isError(llhSize)) return ERROR(corruption_detected);
|
|
@@ -3662,7 +3592,7 @@ static seq_t ZSTDv07_decodeSequence(seqState_t* seqState)
|
|
|
3662
3592
|
static
|
|
3663
3593
|
size_t ZSTDv07_execSequence(BYTE* op,
|
|
3664
3594
|
BYTE* const oend, seq_t sequence,
|
|
3665
|
-
const BYTE** litPtr, const BYTE* const
|
|
3595
|
+
const BYTE** litPtr, const BYTE* const litLimit,
|
|
3666
3596
|
const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
|
|
3667
3597
|
{
|
|
3668
3598
|
BYTE* const oLitEnd = op + sequence.litLength;
|
|
@@ -3674,7 +3604,7 @@ size_t ZSTDv07_execSequence(BYTE* op,
|
|
|
3674
3604
|
|
|
3675
3605
|
/* check */
|
|
3676
3606
|
if ((oLitEnd>oend_w) | (oMatchEnd>oend)) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of WILDCOPY_OVERLENGTH from oend */
|
|
3677
|
-
if (iLitEnd >
|
|
3607
|
+
if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
|
|
3678
3608
|
|
|
3679
3609
|
/* copy Literals */
|
|
3680
3610
|
ZSTDv07_wildcopy(op, *litPtr, sequence.litLength); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
|
|
@@ -3696,7 +3626,7 @@ size_t ZSTDv07_execSequence(BYTE* op,
|
|
|
3696
3626
|
op = oLitEnd + length1;
|
|
3697
3627
|
sequence.matchLength -= length1;
|
|
3698
3628
|
match = base;
|
|
3699
|
-
if (op > oend_w) {
|
|
3629
|
+
if (op > oend_w || sequence.matchLength < MINMATCH) {
|
|
3700
3630
|
while (op < oMatchEnd) *op++ = *match++;
|
|
3701
3631
|
return sequenceLength;
|
|
3702
3632
|
}
|
|
@@ -3707,7 +3637,7 @@ size_t ZSTDv07_execSequence(BYTE* op,
|
|
|
3707
3637
|
if (sequence.offset < 8) {
|
|
3708
3638
|
/* close range match, overlap */
|
|
3709
3639
|
static const U32 dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
|
|
3710
|
-
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /*
|
|
3640
|
+
static const int dec64table[] = { 8, 8, 8, 7, 8, 9,10,11 }; /* subtracted */
|
|
3711
3641
|
int const sub2 = dec64table[sequence.offset];
|
|
3712
3642
|
op[0] = match[0];
|
|
3713
3643
|
op[1] = match[1];
|
|
@@ -3729,7 +3659,7 @@ size_t ZSTDv07_execSequence(BYTE* op,
|
|
|
3729
3659
|
}
|
|
3730
3660
|
while (op < oMatchEnd) *op++ = *match++;
|
|
3731
3661
|
} else {
|
|
3732
|
-
ZSTDv07_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
3662
|
+
ZSTDv07_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
3733
3663
|
}
|
|
3734
3664
|
return sequenceLength;
|
|
3735
3665
|
}
|
|
@@ -3746,7 +3676,6 @@ static size_t ZSTDv07_decompressSequences(
|
|
|
3746
3676
|
BYTE* const oend = ostart + maxDstSize;
|
|
3747
3677
|
BYTE* op = ostart;
|
|
3748
3678
|
const BYTE* litPtr = dctx->litPtr;
|
|
3749
|
-
const BYTE* const litLimit_w = litPtr + dctx->litBufSize - WILDCOPY_OVERLENGTH;
|
|
3750
3679
|
const BYTE* const litEnd = litPtr + dctx->litSize;
|
|
3751
3680
|
FSEv07_DTable* DTableLL = dctx->LLTable;
|
|
3752
3681
|
FSEv07_DTable* DTableML = dctx->MLTable;
|
|
@@ -3776,7 +3705,7 @@ static size_t ZSTDv07_decompressSequences(
|
|
|
3776
3705
|
for ( ; (BITv07_reloadDStream(&(seqState.DStream)) <= BITv07_DStream_completed) && nbSeq ; ) {
|
|
3777
3706
|
nbSeq--;
|
|
3778
3707
|
{ seq_t const sequence = ZSTDv07_decodeSequence(&seqState);
|
|
3779
|
-
size_t const oneSeqSize = ZSTDv07_execSequence(op, oend, sequence, &litPtr,
|
|
3708
|
+
size_t const oneSeqSize = ZSTDv07_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
|
|
3780
3709
|
if (ZSTDv07_isError(oneSeqSize)) return oneSeqSize;
|
|
3781
3710
|
op += oneSeqSize;
|
|
3782
3711
|
} }
|
|
@@ -3789,10 +3718,12 @@ static size_t ZSTDv07_decompressSequences(
|
|
|
3789
3718
|
|
|
3790
3719
|
/* last literal segment */
|
|
3791
3720
|
{ size_t const lastLLSize = litEnd - litPtr;
|
|
3792
|
-
|
|
3721
|
+
/* if (litPtr > litEnd) return ERROR(corruption_detected); */ /* too many literals already used */
|
|
3793
3722
|
if (lastLLSize > (size_t)(oend-op)) return ERROR(dstSize_tooSmall);
|
|
3794
|
-
|
|
3795
|
-
|
|
3723
|
+
if (lastLLSize > 0) {
|
|
3724
|
+
memcpy(op, litPtr, lastLLSize);
|
|
3725
|
+
op += lastLLSize;
|
|
3726
|
+
}
|
|
3796
3727
|
}
|
|
3797
3728
|
|
|
3798
3729
|
return op-ostart;
|
|
@@ -3850,10 +3781,12 @@ ZSTDLIBv07_API size_t ZSTDv07_insertBlock(ZSTDv07_DCtx* dctx, const void* blockS
|
|
|
3850
3781
|
}
|
|
3851
3782
|
|
|
3852
3783
|
|
|
3853
|
-
size_t ZSTDv07_generateNxBytes(void* dst, size_t dstCapacity, BYTE byte, size_t length)
|
|
3784
|
+
static size_t ZSTDv07_generateNxBytes(void* dst, size_t dstCapacity, BYTE byte, size_t length)
|
|
3854
3785
|
{
|
|
3855
3786
|
if (length > dstCapacity) return ERROR(dstSize_tooSmall);
|
|
3856
|
-
|
|
3787
|
+
if (length > 0) {
|
|
3788
|
+
memset(dst, byte, length);
|
|
3789
|
+
}
|
|
3857
3790
|
return length;
|
|
3858
3791
|
}
|
|
3859
3792
|
|
|
@@ -3930,7 +3863,7 @@ static size_t ZSTDv07_decompressFrame(ZSTDv07_DCtx* dctx,
|
|
|
3930
3863
|
* It avoids reloading the dictionary each time.
|
|
3931
3864
|
* `preparedDCtx` must have been properly initialized using ZSTDv07_decompressBegin_usingDict().
|
|
3932
3865
|
* Requires 2 contexts : 1 for reference (preparedDCtx), which will not be modified, and 1 to run the decompression operation (dctx) */
|
|
3933
|
-
size_t ZSTDv07_decompress_usingPreparedDCtx(ZSTDv07_DCtx* dctx, const ZSTDv07_DCtx* refDCtx,
|
|
3866
|
+
static size_t ZSTDv07_decompress_usingPreparedDCtx(ZSTDv07_DCtx* dctx, const ZSTDv07_DCtx* refDCtx,
|
|
3934
3867
|
void* dst, size_t dstCapacity,
|
|
3935
3868
|
const void* src, size_t srcSize)
|
|
3936
3869
|
{
|
|
@@ -3972,6 +3905,70 @@ size_t ZSTDv07_decompress(void* dst, size_t dstCapacity, const void* src, size_t
|
|
|
3972
3905
|
#endif
|
|
3973
3906
|
}
|
|
3974
3907
|
|
|
3908
|
+
/* ZSTD_errorFrameSizeInfoLegacy() :
|
|
3909
|
+
assumes `cSize` and `dBound` are _not_ NULL */
|
|
3910
|
+
static void ZSTD_errorFrameSizeInfoLegacy(size_t* cSize, unsigned long long* dBound, size_t ret)
|
|
3911
|
+
{
|
|
3912
|
+
*cSize = ret;
|
|
3913
|
+
*dBound = ZSTD_CONTENTSIZE_ERROR;
|
|
3914
|
+
}
|
|
3915
|
+
|
|
3916
|
+
void ZSTDv07_findFrameSizeInfoLegacy(const void *src, size_t srcSize, size_t* cSize, unsigned long long* dBound)
|
|
3917
|
+
{
|
|
3918
|
+
const BYTE* ip = (const BYTE*)src;
|
|
3919
|
+
size_t remainingSize = srcSize;
|
|
3920
|
+
size_t nbBlocks = 0;
|
|
3921
|
+
|
|
3922
|
+
/* check */
|
|
3923
|
+
if (srcSize < ZSTDv07_frameHeaderSize_min+ZSTDv07_blockHeaderSize) {
|
|
3924
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3925
|
+
return;
|
|
3926
|
+
}
|
|
3927
|
+
|
|
3928
|
+
/* Frame Header */
|
|
3929
|
+
{ size_t const frameHeaderSize = ZSTDv07_frameHeaderSize(src, srcSize);
|
|
3930
|
+
if (ZSTDv07_isError(frameHeaderSize)) {
|
|
3931
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, frameHeaderSize);
|
|
3932
|
+
return;
|
|
3933
|
+
}
|
|
3934
|
+
if (MEM_readLE32(src) != ZSTDv07_MAGICNUMBER) {
|
|
3935
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(prefix_unknown));
|
|
3936
|
+
return;
|
|
3937
|
+
}
|
|
3938
|
+
if (srcSize < frameHeaderSize+ZSTDv07_blockHeaderSize) {
|
|
3939
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3940
|
+
return;
|
|
3941
|
+
}
|
|
3942
|
+
ip += frameHeaderSize; remainingSize -= frameHeaderSize;
|
|
3943
|
+
}
|
|
3944
|
+
|
|
3945
|
+
/* Loop on each block */
|
|
3946
|
+
while (1) {
|
|
3947
|
+
blockProperties_t blockProperties;
|
|
3948
|
+
size_t const cBlockSize = ZSTDv07_getcBlockSize(ip, remainingSize, &blockProperties);
|
|
3949
|
+
if (ZSTDv07_isError(cBlockSize)) {
|
|
3950
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, cBlockSize);
|
|
3951
|
+
return;
|
|
3952
|
+
}
|
|
3953
|
+
|
|
3954
|
+
ip += ZSTDv07_blockHeaderSize;
|
|
3955
|
+
remainingSize -= ZSTDv07_blockHeaderSize;
|
|
3956
|
+
|
|
3957
|
+
if (blockProperties.blockType == bt_end) break;
|
|
3958
|
+
|
|
3959
|
+
if (cBlockSize > remainingSize) {
|
|
3960
|
+
ZSTD_errorFrameSizeInfoLegacy(cSize, dBound, ERROR(srcSize_wrong));
|
|
3961
|
+
return;
|
|
3962
|
+
}
|
|
3963
|
+
|
|
3964
|
+
ip += cBlockSize;
|
|
3965
|
+
remainingSize -= cBlockSize;
|
|
3966
|
+
nbBlocks++;
|
|
3967
|
+
}
|
|
3968
|
+
|
|
3969
|
+
*cSize = ip - (const BYTE*)src;
|
|
3970
|
+
*dBound = nbBlocks * ZSTDv07_BLOCKSIZE_ABSOLUTEMAX;
|
|
3971
|
+
}
|
|
3975
3972
|
|
|
3976
3973
|
/*_******************************
|
|
3977
3974
|
* Streaming Decompression API
|
|
@@ -4014,7 +4011,7 @@ size_t ZSTDv07_decompressContinue(ZSTDv07_DCtx* dctx, void* dst, size_t dstCapac
|
|
|
4014
4011
|
return 0;
|
|
4015
4012
|
}
|
|
4016
4013
|
dctx->expected = 0; /* not necessary to copy more */
|
|
4017
|
-
|
|
4014
|
+
/* fall-through */
|
|
4018
4015
|
case ZSTDds_decodeFrameHeader:
|
|
4019
4016
|
{ size_t result;
|
|
4020
4017
|
memcpy(dctx->headerBuffer + ZSTDv07_frameHeaderSize_min, src, dctx->expected);
|
|
@@ -4138,9 +4135,9 @@ static size_t ZSTDv07_loadEntropy(ZSTDv07_DCtx* dctx, const void* const dict, si
|
|
|
4138
4135
|
}
|
|
4139
4136
|
|
|
4140
4137
|
if (dictPtr+12 > dictEnd) return ERROR(dictionary_corrupted);
|
|
4141
|
-
dctx->rep[0] = MEM_readLE32(dictPtr+0); if (dctx->rep[0] >= dictSize) return ERROR(dictionary_corrupted);
|
|
4142
|
-
dctx->rep[1] = MEM_readLE32(dictPtr+4); if (dctx->rep[1] >= dictSize) return ERROR(dictionary_corrupted);
|
|
4143
|
-
dctx->rep[2] = MEM_readLE32(dictPtr+8); if (dctx->rep[2] >= dictSize) return ERROR(dictionary_corrupted);
|
|
4138
|
+
dctx->rep[0] = MEM_readLE32(dictPtr+0); if (dctx->rep[0] == 0 || dctx->rep[0] >= dictSize) return ERROR(dictionary_corrupted);
|
|
4139
|
+
dctx->rep[1] = MEM_readLE32(dictPtr+4); if (dctx->rep[1] == 0 || dctx->rep[1] >= dictSize) return ERROR(dictionary_corrupted);
|
|
4140
|
+
dctx->rep[2] = MEM_readLE32(dictPtr+8); if (dctx->rep[2] == 0 || dctx->rep[2] >= dictSize) return ERROR(dictionary_corrupted);
|
|
4144
4141
|
dictPtr += 12;
|
|
4145
4142
|
|
|
4146
4143
|
dctx->litEntropy = dctx->fseEntropy = 1;
|
|
@@ -4190,7 +4187,7 @@ struct ZSTDv07_DDict_s {
|
|
|
4190
4187
|
ZSTDv07_DCtx* refContext;
|
|
4191
4188
|
}; /* typedef'd tp ZSTDv07_CDict within zstd.h */
|
|
4192
4189
|
|
|
4193
|
-
ZSTDv07_DDict* ZSTDv07_createDDict_advanced(const void* dict, size_t dictSize, ZSTDv07_customMem customMem)
|
|
4190
|
+
static ZSTDv07_DDict* ZSTDv07_createDDict_advanced(const void* dict, size_t dictSize, ZSTDv07_customMem customMem)
|
|
4194
4191
|
{
|
|
4195
4192
|
if (!customMem.customAlloc && !customMem.customFree)
|
|
4196
4193
|
customMem = defaultCustomMem;
|
|
@@ -4391,7 +4388,9 @@ size_t ZBUFFv07_decompressInit(ZBUFFv07_DCtx* zbd)
|
|
|
4391
4388
|
MEM_STATIC size_t ZBUFFv07_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
|
|
4392
4389
|
{
|
|
4393
4390
|
size_t const length = MIN(dstCapacity, srcSize);
|
|
4394
|
-
|
|
4391
|
+
if (length > 0) {
|
|
4392
|
+
memcpy(dst, src, length);
|
|
4393
|
+
}
|
|
4395
4394
|
return length;
|
|
4396
4395
|
}
|
|
4397
4396
|
|
|
@@ -4452,7 +4451,7 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd,
|
|
|
4452
4451
|
zbd->inBuff = (char*)zbd->customMem.customAlloc(zbd->customMem.opaque, blockSize);
|
|
4453
4452
|
if (zbd->inBuff == NULL) return ERROR(memory_allocation);
|
|
4454
4453
|
}
|
|
4455
|
-
{ size_t const neededOutSize = zbd->fParams.windowSize + blockSize;
|
|
4454
|
+
{ size_t const neededOutSize = zbd->fParams.windowSize + blockSize + WILDCOPY_OVERLENGTH * 2;
|
|
4456
4455
|
if (zbd->outBuffSize < neededOutSize) {
|
|
4457
4456
|
zbd->customMem.customFree(zbd->customMem.opaque, zbd->outBuff);
|
|
4458
4457
|
zbd->outBuffSize = neededOutSize;
|
|
@@ -4461,7 +4460,7 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd,
|
|
|
4461
4460
|
} } }
|
|
4462
4461
|
zbd->stage = ZBUFFds_read;
|
|
4463
4462
|
/* pass-through */
|
|
4464
|
-
|
|
4463
|
+
/* fall-through */
|
|
4465
4464
|
case ZBUFFds_read:
|
|
4466
4465
|
{ size_t const neededInSize = ZSTDv07_nextSrcSizeToDecompress(zbd->zd);
|
|
4467
4466
|
if (neededInSize==0) { /* end of frame */
|
|
@@ -4484,7 +4483,7 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd,
|
|
|
4484
4483
|
if (ip==iend) { notDone = 0; break; } /* no more input */
|
|
4485
4484
|
zbd->stage = ZBUFFds_load;
|
|
4486
4485
|
}
|
|
4487
|
-
|
|
4486
|
+
/* fall-through */
|
|
4488
4487
|
case ZBUFFds_load:
|
|
4489
4488
|
{ size_t const neededInSize = ZSTDv07_nextSrcSizeToDecompress(zbd->zd);
|
|
4490
4489
|
size_t const toLoad = neededInSize - zbd->inPos; /* should always be <= remaining space within inBuff */
|
|
@@ -4505,9 +4504,11 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd,
|
|
|
4505
4504
|
if (!decodedSize && !isSkipFrame) { zbd->stage = ZBUFFds_read; break; } /* this was just a header */
|
|
4506
4505
|
zbd->outEnd = zbd->outStart + decodedSize;
|
|
4507
4506
|
zbd->stage = ZBUFFds_flush;
|
|
4508
|
-
|
|
4509
|
-
|
|
4510
|
-
|
|
4507
|
+
/* break; */
|
|
4508
|
+
/* pass-through */
|
|
4509
|
+
}
|
|
4510
|
+
}
|
|
4511
|
+
/* fall-through */
|
|
4511
4512
|
case ZBUFFds_flush:
|
|
4512
4513
|
{ size_t const toFlushSize = zbd->outEnd - zbd->outStart;
|
|
4513
4514
|
size_t const flushedSize = ZBUFFv07_limitCopy(op, oend-op, zbd->outBuff + zbd->outStart, toFlushSize);
|