extzstd 0.1 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/HISTORY.ja +5 -0
- data/README.md +5 -5
- data/contrib/zstd/CONTRIBUTING.md +42 -0
- data/contrib/zstd/LICENSE-examples +11 -0
- data/contrib/zstd/Makefile +315 -0
- data/contrib/zstd/NEWS +261 -0
- data/contrib/zstd/PATENTS +33 -0
- data/contrib/zstd/README.md +121 -41
- data/contrib/zstd/TESTING.md +44 -0
- data/contrib/zstd/appveyor.yml +178 -0
- data/contrib/zstd/circle.yml +75 -0
- data/contrib/zstd/lib/BUCK +186 -0
- data/contrib/zstd/lib/Makefile +163 -0
- data/contrib/zstd/lib/README.md +77 -0
- data/contrib/zstd/{common → lib/common}/bitstream.h +7 -4
- data/contrib/zstd/{common → lib/common}/entropy_common.c +19 -23
- data/contrib/zstd/{common → lib/common}/error_private.c +0 -0
- data/contrib/zstd/{common → lib/common}/error_private.h +0 -0
- data/contrib/zstd/{common → lib/common}/fse.h +94 -34
- data/contrib/zstd/{common → lib/common}/fse_decompress.c +18 -19
- data/contrib/zstd/{common → lib/common}/huf.h +52 -20
- data/contrib/zstd/{common → lib/common}/mem.h +17 -13
- data/contrib/zstd/lib/common/pool.c +194 -0
- data/contrib/zstd/lib/common/pool.h +56 -0
- data/contrib/zstd/lib/common/threading.c +80 -0
- data/contrib/zstd/lib/common/threading.h +104 -0
- data/contrib/zstd/{common → lib/common}/xxhash.c +3 -1
- data/contrib/zstd/{common → lib/common}/xxhash.h +11 -15
- data/contrib/zstd/{common → lib/common}/zstd_common.c +1 -11
- data/contrib/zstd/{common → lib/common}/zstd_errors.h +16 -2
- data/contrib/zstd/{common → lib/common}/zstd_internal.h +17 -1
- data/contrib/zstd/{compress → lib/compress}/fse_compress.c +138 -91
- data/contrib/zstd/{compress → lib/compress}/huf_compress.c +218 -67
- data/contrib/zstd/{compress → lib/compress}/zstd_compress.c +231 -108
- data/contrib/zstd/{compress → lib/compress}/zstd_opt.h +44 -25
- data/contrib/zstd/lib/compress/zstdmt_compress.c +739 -0
- data/contrib/zstd/lib/compress/zstdmt_compress.h +78 -0
- data/contrib/zstd/{decompress → lib/decompress}/huf_decompress.c +28 -23
- data/contrib/zstd/{decompress → lib/decompress}/zstd_decompress.c +814 -176
- data/contrib/zstd/{common → lib/deprecated}/zbuff.h +60 -39
- data/contrib/zstd/lib/deprecated/zbuff_common.c +26 -0
- data/contrib/zstd/lib/deprecated/zbuff_compress.c +145 -0
- data/contrib/zstd/lib/deprecated/zbuff_decompress.c +74 -0
- data/contrib/zstd/lib/dictBuilder/cover.c +1029 -0
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/divsufsort.c +0 -0
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/divsufsort.h +0 -0
- data/contrib/zstd/{dictBuilder → lib/dictBuilder}/zdict.c +68 -18
- data/contrib/zstd/lib/dictBuilder/zdict.h +201 -0
- data/contrib/zstd/{legacy → lib/legacy}/zstd_legacy.h +122 -7
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v01.c +34 -3
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v01.h +8 -0
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v02.c +45 -12
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v02.h +8 -0
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v03.c +45 -12
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v03.h +8 -0
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v04.c +56 -33
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v04.h +8 -0
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v05.c +45 -18
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v05.h +7 -0
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v06.c +43 -16
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v06.h +7 -0
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v07.c +57 -23
- data/contrib/zstd/{legacy → lib/legacy}/zstd_v07.h +8 -0
- data/contrib/zstd/lib/libzstd.pc.in +14 -0
- data/contrib/zstd/{zstd.h → lib/zstd.h} +206 -71
- data/ext/depend +2 -0
- data/ext/extconf.rb +4 -4
- data/ext/extzstd.c +1 -1
- data/ext/zstd_common.c +5 -5
- data/ext/zstd_compress.c +3 -3
- data/ext/zstd_decompress.c +2 -2
- data/ext/zstd_dictbuilder.c +2 -2
- data/ext/zstd_legacy_v01.c +1 -1
- data/ext/zstd_legacy_v02.c +1 -1
- data/ext/zstd_legacy_v03.c +1 -1
- data/ext/zstd_legacy_v04.c +1 -1
- data/ext/zstd_legacy_v05.c +1 -1
- data/ext/zstd_legacy_v06.c +1 -1
- data/ext/zstd_legacy_v07.c +1 -1
- data/gemstub.rb +9 -5
- data/lib/extzstd/version.rb +1 -1
- metadata +73 -51
- data/contrib/zstd/compress/zbuff_compress.c +0 -319
- data/contrib/zstd/decompress/zbuff_decompress.c +0 -252
- data/contrib/zstd/dictBuilder/zdict.h +0 -111
|
File without changes
|
|
File without changes
|
|
@@ -36,12 +36,11 @@
|
|
|
36
36
|
#include <time.h> /* clock */
|
|
37
37
|
|
|
38
38
|
#include "mem.h" /* read */
|
|
39
|
-
#include "error_private.h"
|
|
40
39
|
#include "fse.h" /* FSE_normalizeCount, FSE_writeNCount */
|
|
41
40
|
#define HUF_STATIC_LINKING_ONLY
|
|
42
|
-
#include "huf.h"
|
|
41
|
+
#include "huf.h" /* HUF_buildCTable, HUF_writeCTable */
|
|
43
42
|
#include "zstd_internal.h" /* includes zstd.h */
|
|
44
|
-
#include "xxhash.h"
|
|
43
|
+
#include "xxhash.h" /* XXH64 */
|
|
45
44
|
#include "divsufsort.h"
|
|
46
45
|
#ifndef ZDICT_STATIC_LINKING_ONLY
|
|
47
46
|
# define ZDICT_STATIC_LINKING_ONLY
|
|
@@ -61,7 +60,7 @@
|
|
|
61
60
|
#define NOISELENGTH 32
|
|
62
61
|
|
|
63
62
|
#define MINRATIO 4
|
|
64
|
-
static const int g_compressionLevel_default =
|
|
63
|
+
static const int g_compressionLevel_default = 6;
|
|
65
64
|
static const U32 g_selectivity_default = 9;
|
|
66
65
|
static const size_t g_provision_entropySize = 200;
|
|
67
66
|
static const size_t g_min_fast_dictContent = 192;
|
|
@@ -307,13 +306,13 @@ static dictItem ZDICT_analyzePos(
|
|
|
307
306
|
} while (length >=MINMATCHLENGTH);
|
|
308
307
|
|
|
309
308
|
/* look backward */
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
309
|
+
length = MINMATCHLENGTH;
|
|
310
|
+
while ((length >= MINMATCHLENGTH) & (start > 0)) {
|
|
311
|
+
length = ZDICT_count(b + pos, b + suffix[start - 1]);
|
|
312
|
+
if (length >= LLIMIT) length = LLIMIT - 1;
|
|
313
|
+
lengthList[length]++;
|
|
314
|
+
if (length >= MINMATCHLENGTH) start--;
|
|
315
|
+
}
|
|
317
316
|
|
|
318
317
|
/* largest useful length */
|
|
319
318
|
memset(cumulLength, 0, sizeof(cumulLength));
|
|
@@ -570,7 +569,7 @@ static void ZDICT_countEStats(EStats_ress_t esr, ZSTD_parameters params,
|
|
|
570
569
|
if (ZSTD_isError(errorCode)) { DISPLAYLEVEL(1, "warning : ZSTD_copyCCtx failed \n"); return; }
|
|
571
570
|
}
|
|
572
571
|
cSize = ZSTD_compressBlock(esr.zc, esr.workPlace, ZSTD_BLOCKSIZE_ABSOLUTEMAX, src, srcSize);
|
|
573
|
-
if (ZSTD_isError(cSize)) { DISPLAYLEVEL(
|
|
572
|
+
if (ZSTD_isError(cSize)) { DISPLAYLEVEL(3, "warning : could not compress sample size %u \n", (U32)srcSize); return; }
|
|
574
573
|
|
|
575
574
|
if (cSize) { /* if == 0; block is not compressible */
|
|
576
575
|
const seqStore_t* seqStorePtr = ZSTD_getSeqStore(esr.zc);
|
|
@@ -825,6 +824,55 @@ _cleanup:
|
|
|
825
824
|
}
|
|
826
825
|
|
|
827
826
|
|
|
827
|
+
|
|
828
|
+
size_t ZDICT_finalizeDictionary(void* dictBuffer, size_t dictBufferCapacity,
|
|
829
|
+
const void* customDictContent, size_t dictContentSize,
|
|
830
|
+
const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples,
|
|
831
|
+
ZDICT_params_t params)
|
|
832
|
+
{
|
|
833
|
+
size_t hSize;
|
|
834
|
+
#define HBUFFSIZE 256
|
|
835
|
+
BYTE header[HBUFFSIZE];
|
|
836
|
+
int const compressionLevel = (params.compressionLevel <= 0) ? g_compressionLevel_default : params.compressionLevel;
|
|
837
|
+
U32 const notificationLevel = params.notificationLevel;
|
|
838
|
+
|
|
839
|
+
/* check conditions */
|
|
840
|
+
if (dictBufferCapacity < dictContentSize) return ERROR(dstSize_tooSmall);
|
|
841
|
+
if (dictContentSize < ZDICT_CONTENTSIZE_MIN) return ERROR(srcSize_wrong);
|
|
842
|
+
if (dictBufferCapacity < ZDICT_DICTSIZE_MIN) return ERROR(dstSize_tooSmall);
|
|
843
|
+
|
|
844
|
+
/* dictionary header */
|
|
845
|
+
MEM_writeLE32(header, ZSTD_DICT_MAGIC);
|
|
846
|
+
{ U64 const randomID = XXH64(customDictContent, dictContentSize, 0);
|
|
847
|
+
U32 const compliantID = (randomID % ((1U<<31)-32768)) + 32768;
|
|
848
|
+
U32 const dictID = params.dictID ? params.dictID : compliantID;
|
|
849
|
+
MEM_writeLE32(header+4, dictID);
|
|
850
|
+
}
|
|
851
|
+
hSize = 8;
|
|
852
|
+
|
|
853
|
+
/* entropy tables */
|
|
854
|
+
DISPLAYLEVEL(2, "\r%70s\r", ""); /* clean display line */
|
|
855
|
+
DISPLAYLEVEL(2, "statistics ... \n");
|
|
856
|
+
{ size_t const eSize = ZDICT_analyzeEntropy(header+hSize, HBUFFSIZE-hSize,
|
|
857
|
+
compressionLevel,
|
|
858
|
+
samplesBuffer, samplesSizes, nbSamples,
|
|
859
|
+
customDictContent, dictContentSize,
|
|
860
|
+
notificationLevel);
|
|
861
|
+
if (ZDICT_isError(eSize)) return eSize;
|
|
862
|
+
hSize += eSize;
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
/* copy elements in final buffer ; note : src and dst buffer can overlap */
|
|
866
|
+
if (hSize + dictContentSize > dictBufferCapacity) dictContentSize = dictBufferCapacity - hSize;
|
|
867
|
+
{ size_t const dictSize = hSize + dictContentSize;
|
|
868
|
+
char* dictEnd = (char*)dictBuffer + dictSize;
|
|
869
|
+
memmove(dictEnd - dictContentSize, customDictContent, dictContentSize);
|
|
870
|
+
memcpy(dictBuffer, header, hSize);
|
|
871
|
+
return dictSize;
|
|
872
|
+
}
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
|
|
828
876
|
size_t ZDICT_addEntropyTablesFromBuffer_advanced(void* dictBuffer, size_t dictContentSize, size_t dictBufferCapacity,
|
|
829
877
|
const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples,
|
|
830
878
|
ZDICT_params_t params)
|
|
@@ -898,12 +946,14 @@ size_t ZDICT_trainFromBuffer_unsafe(
|
|
|
898
946
|
U32 const nb = MIN(25, dictList[0].pos);
|
|
899
947
|
U32 const dictContentSize = ZDICT_dictSize(dictList);
|
|
900
948
|
U32 u;
|
|
901
|
-
DISPLAYLEVEL(3, "\n %u segments found, of total size %u \n", dictList[0].pos, dictContentSize);
|
|
902
|
-
DISPLAYLEVEL(3, "list %u best segments \n", nb);
|
|
903
|
-
for (u=1; u
|
|
904
|
-
U32 pos = dictList[u].pos;
|
|
905
|
-
U32 length = dictList[u].length;
|
|
906
|
-
U32 printedLength = MIN(40, length);
|
|
949
|
+
DISPLAYLEVEL(3, "\n %u segments found, of total size %u \n", dictList[0].pos-1, dictContentSize);
|
|
950
|
+
DISPLAYLEVEL(3, "list %u best segments \n", nb-1);
|
|
951
|
+
for (u=1; u<nb; u++) {
|
|
952
|
+
U32 const pos = dictList[u].pos;
|
|
953
|
+
U32 const length = dictList[u].length;
|
|
954
|
+
U32 const printedLength = MIN(40, length);
|
|
955
|
+
if ((pos > samplesBuffSize) || ((pos + length) > samplesBuffSize))
|
|
956
|
+
return ERROR(GENERIC); /* should never happen */
|
|
907
957
|
DISPLAYLEVEL(3, "%3u:%3u bytes at pos %8u, savings %7u bytes |",
|
|
908
958
|
u, length, pos, dictList[u].savings);
|
|
909
959
|
ZDICT_printHex((const char*)samplesBuffer+pos, printedLength);
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree. An additional grant
|
|
7
|
+
* of patent rights can be found in the PATENTS file in the same directory.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
#ifndef DICTBUILDER_H_001
|
|
11
|
+
#define DICTBUILDER_H_001
|
|
12
|
+
|
|
13
|
+
#if defined (__cplusplus)
|
|
14
|
+
extern "C" {
|
|
15
|
+
#endif
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
/*====== Dependencies ======*/
|
|
19
|
+
#include <stddef.h> /* size_t */
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
/* ===== ZDICTLIB_API : control library symbols visibility ===== */
|
|
23
|
+
#if defined(__GNUC__) && (__GNUC__ >= 4)
|
|
24
|
+
# define ZDICTLIB_VISIBILITY __attribute__ ((visibility ("default")))
|
|
25
|
+
#else
|
|
26
|
+
# define ZDICTLIB_VISIBILITY
|
|
27
|
+
#endif
|
|
28
|
+
#if defined(ZSTD_DLL_EXPORT) && (ZSTD_DLL_EXPORT==1)
|
|
29
|
+
# define ZDICTLIB_API __declspec(dllexport) ZDICTLIB_VISIBILITY
|
|
30
|
+
#elif defined(ZSTD_DLL_IMPORT) && (ZSTD_DLL_IMPORT==1)
|
|
31
|
+
# define ZDICTLIB_API __declspec(dllimport) ZDICTLIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/
|
|
32
|
+
#else
|
|
33
|
+
# define ZDICTLIB_API ZDICTLIB_VISIBILITY
|
|
34
|
+
#endif
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
/*! ZDICT_trainFromBuffer() :
|
|
38
|
+
Train a dictionary from an array of samples.
|
|
39
|
+
Samples must be stored concatenated in a single flat buffer `samplesBuffer`,
|
|
40
|
+
supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.
|
|
41
|
+
The resulting dictionary will be saved into `dictBuffer`.
|
|
42
|
+
@return : size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)
|
|
43
|
+
or an error code, which can be tested with ZDICT_isError().
|
|
44
|
+
Tips : In general, a reasonable dictionary has a size of ~ 100 KB.
|
|
45
|
+
It's obviously possible to target smaller or larger ones, just by specifying different `dictBufferCapacity`.
|
|
46
|
+
In general, it's recommended to provide a few thousands samples, but this can vary a lot.
|
|
47
|
+
It's recommended that total size of all samples be about ~x100 times the target size of dictionary.
|
|
48
|
+
*/
|
|
49
|
+
ZDICTLIB_API size_t ZDICT_trainFromBuffer(void* dictBuffer, size_t dictBufferCapacity,
|
|
50
|
+
const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples);
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
/*====== Helper functions ======*/
|
|
54
|
+
ZDICTLIB_API unsigned ZDICT_getDictID(const void* dictBuffer, size_t dictSize); /**< extracts dictID; @return zero if error (not a valid dictionary) */
|
|
55
|
+
ZDICTLIB_API unsigned ZDICT_isError(size_t errorCode);
|
|
56
|
+
ZDICTLIB_API const char* ZDICT_getErrorName(size_t errorCode);
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
#ifdef ZDICT_STATIC_LINKING_ONLY
|
|
61
|
+
|
|
62
|
+
/* ====================================================================================
|
|
63
|
+
* The definitions in this section are considered experimental.
|
|
64
|
+
* They should never be used with a dynamic library, as they may change in the future.
|
|
65
|
+
* They are provided for advanced usages.
|
|
66
|
+
* Use them only in association with static linking.
|
|
67
|
+
* ==================================================================================== */
|
|
68
|
+
|
|
69
|
+
typedef struct {
|
|
70
|
+
unsigned selectivityLevel; /* 0 means default; larger => select more => larger dictionary */
|
|
71
|
+
int compressionLevel; /* 0 means default; target a specific zstd compression level */
|
|
72
|
+
unsigned notificationLevel; /* Write to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug; */
|
|
73
|
+
unsigned dictID; /* 0 means auto mode (32-bits random value); other : force dictID value */
|
|
74
|
+
unsigned reserved[2]; /* reserved space for future parameters */
|
|
75
|
+
} ZDICT_params_t;
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
/*! ZDICT_trainFromBuffer_advanced() :
|
|
79
|
+
Same as ZDICT_trainFromBuffer() with control over more parameters.
|
|
80
|
+
`parameters` is optional and can be provided with values set to 0 to mean "default".
|
|
81
|
+
@return : size of dictionary stored into `dictBuffer` (<= `dictBufferSize`),
|
|
82
|
+
or an error code, which can be tested by ZDICT_isError().
|
|
83
|
+
note : ZDICT_trainFromBuffer_advanced() will send notifications into stderr if instructed to, using notificationLevel>0.
|
|
84
|
+
*/
|
|
85
|
+
ZDICTLIB_API size_t ZDICT_trainFromBuffer_advanced(void* dictBuffer, size_t dictBufferCapacity,
|
|
86
|
+
const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples,
|
|
87
|
+
ZDICT_params_t parameters);
|
|
88
|
+
|
|
89
|
+
/*! COVER_params_t :
|
|
90
|
+
For all values 0 means default.
|
|
91
|
+
kMin and d are the only required parameters.
|
|
92
|
+
*/
|
|
93
|
+
typedef struct {
|
|
94
|
+
unsigned k; /* Segment size : constraint: 0 < k : Reasonable range [16, 2048+] */
|
|
95
|
+
unsigned d; /* dmer size : constraint: 0 < d <= k : Reasonable range [6, 16] */
|
|
96
|
+
unsigned steps; /* Number of steps : Only used for optimization : 0 means default (32) : Higher means more parameters checked */
|
|
97
|
+
|
|
98
|
+
unsigned nbThreads; /* Number of threads : constraint: 0 < nbThreads : 1 means single-threaded : Only used for optimization : Ignored if ZSTD_MULTITHREAD is not defined */
|
|
99
|
+
unsigned notificationLevel; /* Write to stderr; 0 = none (default); 1 = errors; 2 = progression; 3 = details; 4 = debug; */
|
|
100
|
+
unsigned dictID; /* 0 means auto mode (32-bits random value); other : force dictID value */
|
|
101
|
+
int compressionLevel; /* 0 means default; target a specific zstd compression level */
|
|
102
|
+
} COVER_params_t;
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
/*! COVER_trainFromBuffer() :
|
|
106
|
+
Train a dictionary from an array of samples using the COVER algorithm.
|
|
107
|
+
Samples must be stored concatenated in a single flat buffer `samplesBuffer`,
|
|
108
|
+
supplied with an array of sizes `samplesSizes`, providing the size of each sample, in order.
|
|
109
|
+
The resulting dictionary will be saved into `dictBuffer`.
|
|
110
|
+
@return : size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)
|
|
111
|
+
or an error code, which can be tested with ZDICT_isError().
|
|
112
|
+
Note : COVER_trainFromBuffer() requires about 9 bytes of memory for each input byte.
|
|
113
|
+
Tips : In general, a reasonable dictionary has a size of ~ 100 KB.
|
|
114
|
+
It's obviously possible to target smaller or larger ones, just by specifying different `dictBufferCapacity`.
|
|
115
|
+
In general, it's recommended to provide a few thousands samples, but this can vary a lot.
|
|
116
|
+
It's recommended that total size of all samples be about ~x100 times the target size of dictionary.
|
|
117
|
+
*/
|
|
118
|
+
ZDICTLIB_API size_t COVER_trainFromBuffer(void* dictBuffer, size_t dictBufferCapacity,
|
|
119
|
+
const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples,
|
|
120
|
+
COVER_params_t parameters);
|
|
121
|
+
|
|
122
|
+
/*! COVER_optimizeTrainFromBuffer() :
|
|
123
|
+
The same requirements as above hold for all the parameters except `parameters`.
|
|
124
|
+
This function tries many parameter combinations and picks the best parameters.
|
|
125
|
+
`*parameters` is filled with the best parameters found, and the dictionary
|
|
126
|
+
constructed with those parameters is stored in `dictBuffer`.
|
|
127
|
+
|
|
128
|
+
All of the parameters d, k, steps are optional.
|
|
129
|
+
If d is non-zero then we don't check multiple values of d, otherwise we check d = {6, 8, 10, 12, 14, 16}.
|
|
130
|
+
if steps is zero it defaults to its default value.
|
|
131
|
+
If k is non-zero then we don't check multiple values of k, otherwise we check steps values in [16, 2048].
|
|
132
|
+
|
|
133
|
+
@return : size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`)
|
|
134
|
+
or an error code, which can be tested with ZDICT_isError().
|
|
135
|
+
On success `*parameters` contains the parameters selected.
|
|
136
|
+
Note : COVER_optimizeTrainFromBuffer() requires about 8 bytes of memory for each input byte and additionally another 5 bytes of memory for each byte of memory for each thread.
|
|
137
|
+
*/
|
|
138
|
+
ZDICTLIB_API size_t COVER_optimizeTrainFromBuffer(void* dictBuffer, size_t dictBufferCapacity,
|
|
139
|
+
const void* samplesBuffer, const size_t *samplesSizes, unsigned nbSamples,
|
|
140
|
+
COVER_params_t *parameters);
|
|
141
|
+
|
|
142
|
+
/*! ZDICT_finalizeDictionary() :
|
|
143
|
+
|
|
144
|
+
Given a custom content as a basis for dictionary, and a set of samples,
|
|
145
|
+
finalize dictionary by adding headers and statistics.
|
|
146
|
+
|
|
147
|
+
Samples must be stored concatenated in a flat buffer `samplesBuffer`,
|
|
148
|
+
supplied with an array of sizes `samplesSizes`, providing the size of each sample in order.
|
|
149
|
+
|
|
150
|
+
dictContentSize must be > ZDICT_CONTENTSIZE_MIN bytes.
|
|
151
|
+
maxDictSize must be >= dictContentSize, and must be > ZDICT_DICTSIZE_MIN bytes.
|
|
152
|
+
|
|
153
|
+
@return : size of dictionary stored into `dictBuffer` (<= `dictBufferCapacity`),
|
|
154
|
+
or an error code, which can be tested by ZDICT_isError().
|
|
155
|
+
note : ZDICT_finalizeDictionary() will push notifications into stderr if instructed to, using notificationLevel>0.
|
|
156
|
+
note 2 : dictBuffer and customDictContent can overlap
|
|
157
|
+
*/
|
|
158
|
+
#define ZDICT_CONTENTSIZE_MIN 256
|
|
159
|
+
#define ZDICT_DICTSIZE_MIN 512
|
|
160
|
+
ZDICTLIB_API size_t ZDICT_finalizeDictionary(void* dictBuffer, size_t dictBufferCapacity,
|
|
161
|
+
const void* customDictContent, size_t dictContentSize,
|
|
162
|
+
const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples,
|
|
163
|
+
ZDICT_params_t parameters);
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
/* Deprecation warnings */
|
|
168
|
+
/* It is generally possible to disable deprecation warnings from compiler,
|
|
169
|
+
for example with -Wno-deprecated-declarations for gcc
|
|
170
|
+
or _CRT_SECURE_NO_WARNINGS in Visual.
|
|
171
|
+
Otherwise, it's also possible to manually define ZDICT_DISABLE_DEPRECATE_WARNINGS */
|
|
172
|
+
#ifdef ZDICT_DISABLE_DEPRECATE_WARNINGS
|
|
173
|
+
# define ZDICT_DEPRECATED(message) ZDICTLIB_API /* disable deprecation warnings */
|
|
174
|
+
#else
|
|
175
|
+
# define ZDICT_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
|
176
|
+
# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */
|
|
177
|
+
# define ZDICT_DEPRECATED(message) [[deprecated(message)]] ZDICTLIB_API
|
|
178
|
+
# elif (ZDICT_GCC_VERSION >= 405) || defined(__clang__)
|
|
179
|
+
# define ZDICT_DEPRECATED(message) ZDICTLIB_API __attribute__((deprecated(message)))
|
|
180
|
+
# elif (ZDICT_GCC_VERSION >= 301)
|
|
181
|
+
# define ZDICT_DEPRECATED(message) ZDICTLIB_API __attribute__((deprecated))
|
|
182
|
+
# elif defined(_MSC_VER)
|
|
183
|
+
# define ZDICT_DEPRECATED(message) ZDICTLIB_API __declspec(deprecated(message))
|
|
184
|
+
# else
|
|
185
|
+
# pragma message("WARNING: You need to implement ZDICT_DEPRECATED for this compiler")
|
|
186
|
+
# define ZDICT_DEPRECATED(message) ZDICTLIB_API
|
|
187
|
+
# endif
|
|
188
|
+
#endif /* ZDICT_DISABLE_DEPRECATE_WARNINGS */
|
|
189
|
+
|
|
190
|
+
ZDICT_DEPRECATED("use ZDICT_finalizeDictionary() instead")
|
|
191
|
+
size_t ZDICT_addEntropyTablesFromBuffer(void* dictBuffer, size_t dictContentSize, size_t dictBufferCapacity,
|
|
192
|
+
const void* samplesBuffer, const size_t* samplesSizes, unsigned nbSamples);
|
|
193
|
+
|
|
194
|
+
|
|
195
|
+
#endif /* ZDICT_STATIC_LINKING_ONLY */
|
|
196
|
+
|
|
197
|
+
#if defined (__cplusplus)
|
|
198
|
+
}
|
|
199
|
+
#endif
|
|
200
|
+
|
|
201
|
+
#endif /* DICTBUILDER_H_001 */
|
|
@@ -20,14 +20,33 @@ extern "C" {
|
|
|
20
20
|
#include "mem.h" /* MEM_STATIC */
|
|
21
21
|
#include "error_private.h" /* ERROR */
|
|
22
22
|
#include "zstd.h" /* ZSTD_inBuffer, ZSTD_outBuffer */
|
|
23
|
-
#include "zstd_v01.h"
|
|
24
|
-
#include "zstd_v02.h"
|
|
25
|
-
#include "zstd_v03.h"
|
|
26
|
-
#include "zstd_v04.h"
|
|
27
|
-
#include "zstd_v05.h"
|
|
28
|
-
#include "zstd_v06.h"
|
|
29
|
-
#include "zstd_v07.h"
|
|
30
23
|
|
|
24
|
+
#if !defined (ZSTD_LEGACY_SUPPORT) || (ZSTD_LEGACY_SUPPORT == 0)
|
|
25
|
+
# undef ZSTD_LEGACY_SUPPORT
|
|
26
|
+
# define ZSTD_LEGACY_SUPPORT 8
|
|
27
|
+
#endif
|
|
28
|
+
|
|
29
|
+
#if (ZSTD_LEGACY_SUPPORT <= 1)
|
|
30
|
+
# include "zstd_v01.h"
|
|
31
|
+
#endif
|
|
32
|
+
#if (ZSTD_LEGACY_SUPPORT <= 2)
|
|
33
|
+
# include "zstd_v02.h"
|
|
34
|
+
#endif
|
|
35
|
+
#if (ZSTD_LEGACY_SUPPORT <= 3)
|
|
36
|
+
# include "zstd_v03.h"
|
|
37
|
+
#endif
|
|
38
|
+
#if (ZSTD_LEGACY_SUPPORT <= 4)
|
|
39
|
+
# include "zstd_v04.h"
|
|
40
|
+
#endif
|
|
41
|
+
#if (ZSTD_LEGACY_SUPPORT <= 5)
|
|
42
|
+
# include "zstd_v05.h"
|
|
43
|
+
#endif
|
|
44
|
+
#if (ZSTD_LEGACY_SUPPORT <= 6)
|
|
45
|
+
# include "zstd_v06.h"
|
|
46
|
+
#endif
|
|
47
|
+
#if (ZSTD_LEGACY_SUPPORT <= 7)
|
|
48
|
+
# include "zstd_v07.h"
|
|
49
|
+
#endif
|
|
31
50
|
|
|
32
51
|
/** ZSTD_isLegacy() :
|
|
33
52
|
@return : > 0 if supported by legacy decoder. 0 otherwise.
|
|
@@ -40,13 +59,27 @@ MEM_STATIC unsigned ZSTD_isLegacy(const void* src, size_t srcSize)
|
|
|
40
59
|
magicNumberLE = MEM_readLE32(src);
|
|
41
60
|
switch(magicNumberLE)
|
|
42
61
|
{
|
|
62
|
+
#if (ZSTD_LEGACY_SUPPORT <= 1)
|
|
43
63
|
case ZSTDv01_magicNumberLE:return 1;
|
|
64
|
+
#endif
|
|
65
|
+
#if (ZSTD_LEGACY_SUPPORT <= 2)
|
|
44
66
|
case ZSTDv02_magicNumber : return 2;
|
|
67
|
+
#endif
|
|
68
|
+
#if (ZSTD_LEGACY_SUPPORT <= 3)
|
|
45
69
|
case ZSTDv03_magicNumber : return 3;
|
|
70
|
+
#endif
|
|
71
|
+
#if (ZSTD_LEGACY_SUPPORT <= 4)
|
|
46
72
|
case ZSTDv04_magicNumber : return 4;
|
|
73
|
+
#endif
|
|
74
|
+
#if (ZSTD_LEGACY_SUPPORT <= 5)
|
|
47
75
|
case ZSTDv05_MAGICNUMBER : return 5;
|
|
76
|
+
#endif
|
|
77
|
+
#if (ZSTD_LEGACY_SUPPORT <= 6)
|
|
48
78
|
case ZSTDv06_MAGICNUMBER : return 6;
|
|
79
|
+
#endif
|
|
80
|
+
#if (ZSTD_LEGACY_SUPPORT <= 7)
|
|
49
81
|
case ZSTDv07_MAGICNUMBER : return 7;
|
|
82
|
+
#endif
|
|
50
83
|
default : return 0;
|
|
51
84
|
}
|
|
52
85
|
}
|
|
@@ -56,24 +89,30 @@ MEM_STATIC unsigned long long ZSTD_getDecompressedSize_legacy(const void* src, s
|
|
|
56
89
|
{
|
|
57
90
|
U32 const version = ZSTD_isLegacy(src, srcSize);
|
|
58
91
|
if (version < 5) return 0; /* no decompressed size in frame header, or not a legacy format */
|
|
92
|
+
#if (ZSTD_LEGACY_SUPPORT <= 5)
|
|
59
93
|
if (version==5) {
|
|
60
94
|
ZSTDv05_parameters fParams;
|
|
61
95
|
size_t const frResult = ZSTDv05_getFrameParams(&fParams, src, srcSize);
|
|
62
96
|
if (frResult != 0) return 0;
|
|
63
97
|
return fParams.srcSize;
|
|
64
98
|
}
|
|
99
|
+
#endif
|
|
100
|
+
#if (ZSTD_LEGACY_SUPPORT <= 6)
|
|
65
101
|
if (version==6) {
|
|
66
102
|
ZSTDv06_frameParams fParams;
|
|
67
103
|
size_t const frResult = ZSTDv06_getFrameParams(&fParams, src, srcSize);
|
|
68
104
|
if (frResult != 0) return 0;
|
|
69
105
|
return fParams.frameContentSize;
|
|
70
106
|
}
|
|
107
|
+
#endif
|
|
108
|
+
#if (ZSTD_LEGACY_SUPPORT <= 7)
|
|
71
109
|
if (version==7) {
|
|
72
110
|
ZSTDv07_frameParams fParams;
|
|
73
111
|
size_t const frResult = ZSTDv07_getFrameParams(&fParams, src, srcSize);
|
|
74
112
|
if (frResult != 0) return 0;
|
|
75
113
|
return fParams.frameContentSize;
|
|
76
114
|
}
|
|
115
|
+
#endif
|
|
77
116
|
return 0; /* should not be possible */
|
|
78
117
|
}
|
|
79
118
|
|
|
@@ -86,14 +125,23 @@ MEM_STATIC size_t ZSTD_decompressLegacy(
|
|
|
86
125
|
U32 const version = ZSTD_isLegacy(src, compressedSize);
|
|
87
126
|
switch(version)
|
|
88
127
|
{
|
|
128
|
+
#if (ZSTD_LEGACY_SUPPORT <= 1)
|
|
89
129
|
case 1 :
|
|
90
130
|
return ZSTDv01_decompress(dst, dstCapacity, src, compressedSize);
|
|
131
|
+
#endif
|
|
132
|
+
#if (ZSTD_LEGACY_SUPPORT <= 2)
|
|
91
133
|
case 2 :
|
|
92
134
|
return ZSTDv02_decompress(dst, dstCapacity, src, compressedSize);
|
|
135
|
+
#endif
|
|
136
|
+
#if (ZSTD_LEGACY_SUPPORT <= 3)
|
|
93
137
|
case 3 :
|
|
94
138
|
return ZSTDv03_decompress(dst, dstCapacity, src, compressedSize);
|
|
139
|
+
#endif
|
|
140
|
+
#if (ZSTD_LEGACY_SUPPORT <= 4)
|
|
95
141
|
case 4 :
|
|
96
142
|
return ZSTDv04_decompress(dst, dstCapacity, src, compressedSize);
|
|
143
|
+
#endif
|
|
144
|
+
#if (ZSTD_LEGACY_SUPPORT <= 5)
|
|
97
145
|
case 5 :
|
|
98
146
|
{ size_t result;
|
|
99
147
|
ZSTDv05_DCtx* const zd = ZSTDv05_createDCtx();
|
|
@@ -102,6 +150,8 @@ MEM_STATIC size_t ZSTD_decompressLegacy(
|
|
|
102
150
|
ZSTDv05_freeDCtx(zd);
|
|
103
151
|
return result;
|
|
104
152
|
}
|
|
153
|
+
#endif
|
|
154
|
+
#if (ZSTD_LEGACY_SUPPORT <= 6)
|
|
105
155
|
case 6 :
|
|
106
156
|
{ size_t result;
|
|
107
157
|
ZSTDv06_DCtx* const zd = ZSTDv06_createDCtx();
|
|
@@ -110,6 +160,8 @@ MEM_STATIC size_t ZSTD_decompressLegacy(
|
|
|
110
160
|
ZSTDv06_freeDCtx(zd);
|
|
111
161
|
return result;
|
|
112
162
|
}
|
|
163
|
+
#endif
|
|
164
|
+
#if (ZSTD_LEGACY_SUPPORT <= 7)
|
|
113
165
|
case 7 :
|
|
114
166
|
{ size_t result;
|
|
115
167
|
ZSTDv07_DCtx* const zd = ZSTDv07_createDCtx();
|
|
@@ -118,11 +170,50 @@ MEM_STATIC size_t ZSTD_decompressLegacy(
|
|
|
118
170
|
ZSTDv07_freeDCtx(zd);
|
|
119
171
|
return result;
|
|
120
172
|
}
|
|
173
|
+
#endif
|
|
121
174
|
default :
|
|
122
175
|
return ERROR(prefix_unknown);
|
|
123
176
|
}
|
|
124
177
|
}
|
|
125
178
|
|
|
179
|
+
MEM_STATIC size_t ZSTD_findFrameCompressedSizeLegacy(const void *src,
|
|
180
|
+
size_t compressedSize)
|
|
181
|
+
{
|
|
182
|
+
U32 const version = ZSTD_isLegacy(src, compressedSize);
|
|
183
|
+
switch(version)
|
|
184
|
+
{
|
|
185
|
+
#if (ZSTD_LEGACY_SUPPORT <= 1)
|
|
186
|
+
case 1 :
|
|
187
|
+
return ZSTDv01_findFrameCompressedSize(src, compressedSize);
|
|
188
|
+
#endif
|
|
189
|
+
#if (ZSTD_LEGACY_SUPPORT <= 2)
|
|
190
|
+
case 2 :
|
|
191
|
+
return ZSTDv02_findFrameCompressedSize(src, compressedSize);
|
|
192
|
+
#endif
|
|
193
|
+
#if (ZSTD_LEGACY_SUPPORT <= 3)
|
|
194
|
+
case 3 :
|
|
195
|
+
return ZSTDv03_findFrameCompressedSize(src, compressedSize);
|
|
196
|
+
#endif
|
|
197
|
+
#if (ZSTD_LEGACY_SUPPORT <= 4)
|
|
198
|
+
case 4 :
|
|
199
|
+
return ZSTDv04_findFrameCompressedSize(src, compressedSize);
|
|
200
|
+
#endif
|
|
201
|
+
#if (ZSTD_LEGACY_SUPPORT <= 5)
|
|
202
|
+
case 5 :
|
|
203
|
+
return ZSTDv05_findFrameCompressedSize(src, compressedSize);
|
|
204
|
+
#endif
|
|
205
|
+
#if (ZSTD_LEGACY_SUPPORT <= 6)
|
|
206
|
+
case 6 :
|
|
207
|
+
return ZSTDv06_findFrameCompressedSize(src, compressedSize);
|
|
208
|
+
#endif
|
|
209
|
+
#if (ZSTD_LEGACY_SUPPORT <= 7)
|
|
210
|
+
case 7 :
|
|
211
|
+
return ZSTDv07_findFrameCompressedSize(src, compressedSize);
|
|
212
|
+
#endif
|
|
213
|
+
default :
|
|
214
|
+
return ERROR(prefix_unknown);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
126
217
|
|
|
127
218
|
MEM_STATIC size_t ZSTD_freeLegacyStreamContext(void* legacyContext, U32 version)
|
|
128
219
|
{
|
|
@@ -133,10 +224,18 @@ MEM_STATIC size_t ZSTD_freeLegacyStreamContext(void* legacyContext, U32 version)
|
|
|
133
224
|
case 2 :
|
|
134
225
|
case 3 :
|
|
135
226
|
return ERROR(version_unsupported);
|
|
227
|
+
#if (ZSTD_LEGACY_SUPPORT <= 4)
|
|
136
228
|
case 4 : return ZBUFFv04_freeDCtx((ZBUFFv04_DCtx*)legacyContext);
|
|
229
|
+
#endif
|
|
230
|
+
#if (ZSTD_LEGACY_SUPPORT <= 5)
|
|
137
231
|
case 5 : return ZBUFFv05_freeDCtx((ZBUFFv05_DCtx*)legacyContext);
|
|
232
|
+
#endif
|
|
233
|
+
#if (ZSTD_LEGACY_SUPPORT <= 6)
|
|
138
234
|
case 6 : return ZBUFFv06_freeDCtx((ZBUFFv06_DCtx*)legacyContext);
|
|
235
|
+
#endif
|
|
236
|
+
#if (ZSTD_LEGACY_SUPPORT <= 7)
|
|
139
237
|
case 7 : return ZBUFFv07_freeDCtx((ZBUFFv07_DCtx*)legacyContext);
|
|
238
|
+
#endif
|
|
140
239
|
}
|
|
141
240
|
}
|
|
142
241
|
|
|
@@ -152,6 +251,7 @@ MEM_STATIC size_t ZSTD_initLegacyStream(void** legacyContext, U32 prevVersion, U
|
|
|
152
251
|
case 2 :
|
|
153
252
|
case 3 :
|
|
154
253
|
return 0;
|
|
254
|
+
#if (ZSTD_LEGACY_SUPPORT <= 4)
|
|
155
255
|
case 4 :
|
|
156
256
|
{
|
|
157
257
|
ZBUFFv04_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv04_createDCtx() : (ZBUFFv04_DCtx*)*legacyContext;
|
|
@@ -161,6 +261,8 @@ MEM_STATIC size_t ZSTD_initLegacyStream(void** legacyContext, U32 prevVersion, U
|
|
|
161
261
|
*legacyContext = dctx;
|
|
162
262
|
return 0;
|
|
163
263
|
}
|
|
264
|
+
#endif
|
|
265
|
+
#if (ZSTD_LEGACY_SUPPORT <= 5)
|
|
164
266
|
case 5 :
|
|
165
267
|
{
|
|
166
268
|
ZBUFFv05_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv05_createDCtx() : (ZBUFFv05_DCtx*)*legacyContext;
|
|
@@ -169,6 +271,8 @@ MEM_STATIC size_t ZSTD_initLegacyStream(void** legacyContext, U32 prevVersion, U
|
|
|
169
271
|
*legacyContext = dctx;
|
|
170
272
|
return 0;
|
|
171
273
|
}
|
|
274
|
+
#endif
|
|
275
|
+
#if (ZSTD_LEGACY_SUPPORT <= 6)
|
|
172
276
|
case 6 :
|
|
173
277
|
{
|
|
174
278
|
ZBUFFv06_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv06_createDCtx() : (ZBUFFv06_DCtx*)*legacyContext;
|
|
@@ -177,6 +281,8 @@ MEM_STATIC size_t ZSTD_initLegacyStream(void** legacyContext, U32 prevVersion, U
|
|
|
177
281
|
*legacyContext = dctx;
|
|
178
282
|
return 0;
|
|
179
283
|
}
|
|
284
|
+
#endif
|
|
285
|
+
#if (ZSTD_LEGACY_SUPPORT <= 7)
|
|
180
286
|
case 7 :
|
|
181
287
|
{
|
|
182
288
|
ZBUFFv07_DCtx* dctx = (prevVersion != newVersion) ? ZBUFFv07_createDCtx() : (ZBUFFv07_DCtx*)*legacyContext;
|
|
@@ -185,6 +291,7 @@ MEM_STATIC size_t ZSTD_initLegacyStream(void** legacyContext, U32 prevVersion, U
|
|
|
185
291
|
*legacyContext = dctx;
|
|
186
292
|
return 0;
|
|
187
293
|
}
|
|
294
|
+
#endif
|
|
188
295
|
}
|
|
189
296
|
}
|
|
190
297
|
|
|
@@ -200,6 +307,7 @@ MEM_STATIC size_t ZSTD_decompressLegacyStream(void* legacyContext, U32 version,
|
|
|
200
307
|
case 2 :
|
|
201
308
|
case 3 :
|
|
202
309
|
return ERROR(version_unsupported);
|
|
310
|
+
#if (ZSTD_LEGACY_SUPPORT <= 4)
|
|
203
311
|
case 4 :
|
|
204
312
|
{
|
|
205
313
|
ZBUFFv04_DCtx* dctx = (ZBUFFv04_DCtx*) legacyContext;
|
|
@@ -212,6 +320,8 @@ MEM_STATIC size_t ZSTD_decompressLegacyStream(void* legacyContext, U32 version,
|
|
|
212
320
|
input->pos += readSize;
|
|
213
321
|
return hintSize;
|
|
214
322
|
}
|
|
323
|
+
#endif
|
|
324
|
+
#if (ZSTD_LEGACY_SUPPORT <= 5)
|
|
215
325
|
case 5 :
|
|
216
326
|
{
|
|
217
327
|
ZBUFFv05_DCtx* dctx = (ZBUFFv05_DCtx*) legacyContext;
|
|
@@ -224,6 +334,8 @@ MEM_STATIC size_t ZSTD_decompressLegacyStream(void* legacyContext, U32 version,
|
|
|
224
334
|
input->pos += readSize;
|
|
225
335
|
return hintSize;
|
|
226
336
|
}
|
|
337
|
+
#endif
|
|
338
|
+
#if (ZSTD_LEGACY_SUPPORT <= 6)
|
|
227
339
|
case 6 :
|
|
228
340
|
{
|
|
229
341
|
ZBUFFv06_DCtx* dctx = (ZBUFFv06_DCtx*) legacyContext;
|
|
@@ -236,6 +348,8 @@ MEM_STATIC size_t ZSTD_decompressLegacyStream(void* legacyContext, U32 version,
|
|
|
236
348
|
input->pos += readSize;
|
|
237
349
|
return hintSize;
|
|
238
350
|
}
|
|
351
|
+
#endif
|
|
352
|
+
#if (ZSTD_LEGACY_SUPPORT <= 7)
|
|
239
353
|
case 7 :
|
|
240
354
|
{
|
|
241
355
|
ZBUFFv07_DCtx* dctx = (ZBUFFv07_DCtx*) legacyContext;
|
|
@@ -248,6 +362,7 @@ MEM_STATIC size_t ZSTD_decompressLegacyStream(void* legacyContext, U32 version,
|
|
|
248
362
|
input->pos += readSize;
|
|
249
363
|
return hintSize;
|
|
250
364
|
}
|
|
365
|
+
#endif
|
|
251
366
|
}
|
|
252
367
|
}
|
|
253
368
|
|
|
@@ -1354,7 +1354,7 @@ static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|
|
1354
1354
|
|
|
1355
1355
|
#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
|
|
1356
1356
|
|
|
1357
|
-
static void ZSTD_wildcopy(void* dst, const void* src,
|
|
1357
|
+
static void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
|
1358
1358
|
{
|
|
1359
1359
|
const BYTE* ip = (const BYTE*)src;
|
|
1360
1360
|
BYTE* op = (BYTE*)dst;
|
|
@@ -1803,7 +1803,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
|
1803
1803
|
} else { ZSTD_copy8(op, match); }
|
|
1804
1804
|
op += 8; match += 8;
|
|
1805
1805
|
|
|
1806
|
-
if (endMatch > oend-
|
|
1806
|
+
if (endMatch > oend-(16-MINMATCH))
|
|
1807
1807
|
{
|
|
1808
1808
|
if (op < oend-8)
|
|
1809
1809
|
{
|
|
@@ -1814,7 +1814,7 @@ static size_t ZSTD_execSequence(BYTE* op,
|
|
|
1814
1814
|
while (op<endMatch) *op++ = *match++;
|
|
1815
1815
|
}
|
|
1816
1816
|
else
|
|
1817
|
-
ZSTD_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
1817
|
+
ZSTD_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
|
1818
1818
|
|
|
1819
1819
|
/* restore, in case of overlap */
|
|
1820
1820
|
if (overlapRisk) memcpy(endMatch, saved, qutt);
|
|
@@ -1992,6 +1992,37 @@ size_t ZSTDv01_decompress(void* dst, size_t maxDstSize, const void* src, size_t
|
|
|
1992
1992
|
return ZSTDv01_decompressDCtx(&ctx, dst, maxDstSize, src, srcSize);
|
|
1993
1993
|
}
|
|
1994
1994
|
|
|
1995
|
+
size_t ZSTDv01_findFrameCompressedSize(const void* src, size_t srcSize)
|
|
1996
|
+
{
|
|
1997
|
+
const BYTE* ip = (const BYTE*)src;
|
|
1998
|
+
size_t remainingSize = srcSize;
|
|
1999
|
+
U32 magicNumber;
|
|
2000
|
+
blockProperties_t blockProperties;
|
|
2001
|
+
|
|
2002
|
+
/* Frame Header */
|
|
2003
|
+
if (srcSize < ZSTD_frameHeaderSize+ZSTD_blockHeaderSize) return ERROR(srcSize_wrong);
|
|
2004
|
+
magicNumber = ZSTD_readBE32(src);
|
|
2005
|
+
if (magicNumber != ZSTD_magicNumber) return ERROR(prefix_unknown);
|
|
2006
|
+
ip += ZSTD_frameHeaderSize; remainingSize -= ZSTD_frameHeaderSize;
|
|
2007
|
+
|
|
2008
|
+
/* Loop on each block */
|
|
2009
|
+
while (1)
|
|
2010
|
+
{
|
|
2011
|
+
size_t blockSize = ZSTDv01_getcBlockSize(ip, remainingSize, &blockProperties);
|
|
2012
|
+
if (ZSTDv01_isError(blockSize)) return blockSize;
|
|
2013
|
+
|
|
2014
|
+
ip += ZSTD_blockHeaderSize;
|
|
2015
|
+
remainingSize -= ZSTD_blockHeaderSize;
|
|
2016
|
+
if (blockSize > remainingSize) return ERROR(srcSize_wrong);
|
|
2017
|
+
|
|
2018
|
+
if (blockSize == 0) break; /* bt_end */
|
|
2019
|
+
|
|
2020
|
+
ip += blockSize;
|
|
2021
|
+
remainingSize -= blockSize;
|
|
2022
|
+
}
|
|
2023
|
+
|
|
2024
|
+
return ip - (const BYTE*)src;
|
|
2025
|
+
}
|
|
1995
2026
|
|
|
1996
2027
|
/*******************************
|
|
1997
2028
|
* Streaming Decompression API
|