extzstd 0.1 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -509,7 +509,7 @@ static void ZSTDv05_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|
509
509
|
|
510
510
|
/*! ZSTDv05_wildcopy() :
|
511
511
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
512
|
-
MEM_STATIC void ZSTDv05_wildcopy(void* dst, const void* src,
|
512
|
+
MEM_STATIC void ZSTDv05_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
513
513
|
{
|
514
514
|
const BYTE* ip = (const BYTE*)src;
|
515
515
|
BYTE* op = (BYTE*)dst;
|
@@ -2731,7 +2731,6 @@ struct ZSTDv05_DCtx_s
|
|
2731
2731
|
ZSTDv05_dStage stage;
|
2732
2732
|
U32 flagStaticTables;
|
2733
2733
|
const BYTE* litPtr;
|
2734
|
-
size_t litBufSize;
|
2735
2734
|
size_t litSize;
|
2736
2735
|
BYTE litBuffer[BLOCKSIZE + WILDCOPY_OVERLENGTH];
|
2737
2736
|
BYTE headerBuffer[ZSTDv05_frameHeaderSize_max];
|
@@ -2978,8 +2977,8 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
2978
2977
|
return ERROR(corruption_detected);
|
2979
2978
|
|
2980
2979
|
dctx->litPtr = dctx->litBuffer;
|
2981
|
-
dctx->litBufSize = BLOCKSIZE+8;
|
2982
2980
|
dctx->litSize = litSize;
|
2981
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
2983
2982
|
return litCSize + lhSize;
|
2984
2983
|
}
|
2985
2984
|
case IS_PCH:
|
@@ -2996,14 +2995,14 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
2996
2995
|
lhSize=3;
|
2997
2996
|
litSize = ((istart[0] & 15) << 6) + (istart[1] >> 2);
|
2998
2997
|
litCSize = ((istart[1] & 3) << 8) + istart[2];
|
2999
|
-
if (litCSize +
|
2998
|
+
if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
|
3000
2999
|
|
3001
3000
|
errorCode = HUFv05_decompress1X4_usingDTable(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->hufTableX4);
|
3002
3001
|
if (HUFv05_isError(errorCode)) return ERROR(corruption_detected);
|
3003
3002
|
|
3004
3003
|
dctx->litPtr = dctx->litBuffer;
|
3005
|
-
dctx->litBufSize = BLOCKSIZE+WILDCOPY_OVERLENGTH;
|
3006
3004
|
dctx->litSize = litSize;
|
3005
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
3007
3006
|
return litCSize + lhSize;
|
3008
3007
|
}
|
3009
3008
|
case IS_RAW:
|
@@ -3028,13 +3027,12 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
3028
3027
|
if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
|
3029
3028
|
memcpy(dctx->litBuffer, istart+lhSize, litSize);
|
3030
3029
|
dctx->litPtr = dctx->litBuffer;
|
3031
|
-
dctx->litBufSize = BLOCKSIZE+8;
|
3032
3030
|
dctx->litSize = litSize;
|
3031
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
3033
3032
|
return lhSize+litSize;
|
3034
3033
|
}
|
3035
3034
|
/* direct reference into compressed stream */
|
3036
3035
|
dctx->litPtr = istart+lhSize;
|
3037
|
-
dctx->litBufSize = srcSize-lhSize;
|
3038
3036
|
dctx->litSize = litSize;
|
3039
3037
|
return lhSize+litSize;
|
3040
3038
|
}
|
@@ -3057,9 +3055,8 @@ size_t ZSTDv05_decodeLiteralsBlock(ZSTDv05_DCtx* dctx,
|
|
3057
3055
|
break;
|
3058
3056
|
}
|
3059
3057
|
if (litSize > BLOCKSIZE) return ERROR(corruption_detected);
|
3060
|
-
memset(dctx->litBuffer, istart[lhSize], litSize);
|
3058
|
+
memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
|
3061
3059
|
dctx->litPtr = dctx->litBuffer;
|
3062
|
-
dctx->litBufSize = BLOCKSIZE+WILDCOPY_OVERLENGTH;
|
3063
3060
|
dctx->litSize = litSize;
|
3064
3061
|
return lhSize+1;
|
3065
3062
|
}
|
@@ -3233,7 +3230,8 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
3233
3230
|
if (litLength&1) litLength>>=1, dumps += 3;
|
3234
3231
|
else litLength = (U16)(litLength)>>1, dumps += 2;
|
3235
3232
|
}
|
3236
|
-
if (dumps
|
3233
|
+
if (dumps > de) { litLength = MaxLL+255; } /* late correction, to avoid using uninitialized memory */
|
3234
|
+
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
3237
3235
|
}
|
3238
3236
|
|
3239
3237
|
/* Offset */
|
@@ -3266,7 +3264,8 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
3266
3264
|
if (matchLength&1) matchLength>>=1, dumps += 3;
|
3267
3265
|
else matchLength = (U16)(matchLength)>>1, dumps += 2;
|
3268
3266
|
}
|
3269
|
-
if (dumps
|
3267
|
+
if (dumps > de) { matchLength = MaxML+255; } /* late correction, to avoid using uninitialized memory */
|
3268
|
+
if (dumps >= de) { dumps = de-1; } /* late correction, to avoid read overflow (data is now corrupted anyway) */
|
3270
3269
|
}
|
3271
3270
|
matchLength += MINMATCH;
|
3272
3271
|
|
@@ -3289,7 +3288,7 @@ static void ZSTDv05_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
3289
3288
|
|
3290
3289
|
static size_t ZSTDv05_execSequence(BYTE* op,
|
3291
3290
|
BYTE* const oend, seq_t sequence,
|
3292
|
-
const BYTE** litPtr, const BYTE* const
|
3291
|
+
const BYTE** litPtr, const BYTE* const litLimit,
|
3293
3292
|
const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
|
3294
3293
|
{
|
3295
3294
|
static const int dec32table[] = { 0, 1, 2, 1, 4, 4, 4, 4 }; /* added */
|
@@ -3304,7 +3303,7 @@ static size_t ZSTDv05_execSequence(BYTE* op,
|
|
3304
3303
|
/* check */
|
3305
3304
|
if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */
|
3306
3305
|
if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
|
3307
|
-
if (litEnd >
|
3306
|
+
if (litEnd > litLimit) return ERROR(corruption_detected); /* risk read beyond lit buffer */
|
3308
3307
|
|
3309
3308
|
/* copy Literals */
|
3310
3309
|
ZSTDv05_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
@@ -3328,7 +3327,7 @@ static size_t ZSTDv05_execSequence(BYTE* op,
|
|
3328
3327
|
op = oLitEnd + length1;
|
3329
3328
|
sequence.matchLength -= length1;
|
3330
3329
|
match = base;
|
3331
|
-
if (op > oend_8) {
|
3330
|
+
if (op > oend_8 || sequence.matchLength < MINMATCH) {
|
3332
3331
|
while (op < oMatchEnd) *op++ = *match++;
|
3333
3332
|
return sequenceLength;
|
3334
3333
|
}
|
@@ -3351,7 +3350,7 @@ static size_t ZSTDv05_execSequence(BYTE* op,
|
|
3351
3350
|
}
|
3352
3351
|
op += 8; match += 8;
|
3353
3352
|
|
3354
|
-
if (oMatchEnd > oend-
|
3353
|
+
if (oMatchEnd > oend-(16-MINMATCH)) {
|
3355
3354
|
if (op < oend_8) {
|
3356
3355
|
ZSTDv05_wildcopy(op, match, oend_8 - op);
|
3357
3356
|
match += oend_8 - op;
|
@@ -3360,7 +3359,7 @@ static size_t ZSTDv05_execSequence(BYTE* op,
|
|
3360
3359
|
while (op < oMatchEnd)
|
3361
3360
|
*op++ = *match++;
|
3362
3361
|
} else {
|
3363
|
-
ZSTDv05_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
3362
|
+
ZSTDv05_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
3364
3363
|
}
|
3365
3364
|
return sequenceLength;
|
3366
3365
|
}
|
@@ -3378,7 +3377,6 @@ static size_t ZSTDv05_decompressSequences(
|
|
3378
3377
|
BYTE* const oend = ostart + maxDstSize;
|
3379
3378
|
size_t errorCode, dumpsLength;
|
3380
3379
|
const BYTE* litPtr = dctx->litPtr;
|
3381
|
-
const BYTE* const litLimit_8 = litPtr + dctx->litBufSize - 8;
|
3382
3380
|
const BYTE* const litEnd = litPtr + dctx->litSize;
|
3383
3381
|
int nbSeq;
|
3384
3382
|
const BYTE* dumps;
|
@@ -3416,7 +3414,7 @@ static size_t ZSTDv05_decompressSequences(
|
|
3416
3414
|
size_t oneSeqSize;
|
3417
3415
|
nbSeq--;
|
3418
3416
|
ZSTDv05_decodeSequence(&sequence, &seqState);
|
3419
|
-
oneSeqSize = ZSTDv05_execSequence(op, oend, sequence, &litPtr,
|
3417
|
+
oneSeqSize = ZSTDv05_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
|
3420
3418
|
if (ZSTDv05_isError(oneSeqSize)) return oneSeqSize;
|
3421
3419
|
op += oneSeqSize;
|
3422
3420
|
}
|
@@ -3585,6 +3583,35 @@ size_t ZSTDv05_decompress(void* dst, size_t maxDstSize, const void* src, size_t
|
|
3585
3583
|
#endif
|
3586
3584
|
}
|
3587
3585
|
|
3586
|
+
size_t ZSTDv05_findFrameCompressedSize(const void *src, size_t srcSize)
|
3587
|
+
{
|
3588
|
+
const BYTE* ip = (const BYTE*)src;
|
3589
|
+
size_t remainingSize = srcSize;
|
3590
|
+
blockProperties_t blockProperties;
|
3591
|
+
|
3592
|
+
/* Frame Header */
|
3593
|
+
if (srcSize < ZSTDv05_frameHeaderSize_min) return ERROR(srcSize_wrong);
|
3594
|
+
if (MEM_readLE32(src) != ZSTDv05_MAGICNUMBER) return ERROR(prefix_unknown);
|
3595
|
+
ip += ZSTDv05_frameHeaderSize_min; remainingSize -= ZSTDv05_frameHeaderSize_min;
|
3596
|
+
|
3597
|
+
/* Loop on each block */
|
3598
|
+
while (1)
|
3599
|
+
{
|
3600
|
+
size_t cBlockSize = ZSTDv05_getcBlockSize(ip, remainingSize, &blockProperties);
|
3601
|
+
if (ZSTDv05_isError(cBlockSize)) return cBlockSize;
|
3602
|
+
|
3603
|
+
ip += ZSTDv05_blockHeaderSize;
|
3604
|
+
remainingSize -= ZSTDv05_blockHeaderSize;
|
3605
|
+
if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
|
3606
|
+
|
3607
|
+
if (cBlockSize == 0) break; /* bt_end */
|
3608
|
+
|
3609
|
+
ip += cBlockSize;
|
3610
|
+
remainingSize -= cBlockSize;
|
3611
|
+
}
|
3612
|
+
|
3613
|
+
return ip - (const BYTE*)src;
|
3614
|
+
}
|
3588
3615
|
|
3589
3616
|
/* ******************************
|
3590
3617
|
* Streaming Decompression API
|
@@ -32,6 +32,13 @@ extern "C" {
|
|
32
32
|
size_t ZSTDv05_decompress( void* dst, size_t dstCapacity,
|
33
33
|
const void* src, size_t compressedSize);
|
34
34
|
|
35
|
+
/**
|
36
|
+
ZSTDv05_getFrameSrcSize() : get the source length of a ZSTD frame
|
37
|
+
compressedSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
|
38
|
+
return : the number of bytes that would be read to decompress this frame
|
39
|
+
or an errorCode if it fails (which can be tested using ZSTDv05_isError())
|
40
|
+
*/
|
41
|
+
size_t ZSTDv05_findFrameCompressedSize(const void* src, size_t compressedSize);
|
35
42
|
|
36
43
|
/* *************************************
|
37
44
|
* Helper functions
|
@@ -537,7 +537,7 @@ static void ZSTDv06_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|
537
537
|
/*! ZSTDv06_wildcopy() :
|
538
538
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
539
539
|
#define WILDCOPY_OVERLENGTH 8
|
540
|
-
MEM_STATIC void ZSTDv06_wildcopy(void* dst, const void* src,
|
540
|
+
MEM_STATIC void ZSTDv06_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
541
541
|
{
|
542
542
|
const BYTE* ip = (const BYTE*)src;
|
543
543
|
BYTE* op = (BYTE*)dst;
|
@@ -2893,7 +2893,6 @@ struct ZSTDv06_DCtx_s
|
|
2893
2893
|
ZSTDv06_dStage stage;
|
2894
2894
|
U32 flagRepeatTable;
|
2895
2895
|
const BYTE* litPtr;
|
2896
|
-
size_t litBufSize;
|
2897
2896
|
size_t litSize;
|
2898
2897
|
BYTE litBuffer[ZSTDv06_BLOCKSIZE_MAX + WILDCOPY_OVERLENGTH];
|
2899
2898
|
BYTE headerBuffer[ZSTDv06_FRAMEHEADERSIZE_MAX];
|
@@ -3170,8 +3169,8 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
3170
3169
|
return ERROR(corruption_detected);
|
3171
3170
|
|
3172
3171
|
dctx->litPtr = dctx->litBuffer;
|
3173
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+8;
|
3174
3172
|
dctx->litSize = litSize;
|
3173
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
3175
3174
|
return litCSize + lhSize;
|
3176
3175
|
}
|
3177
3176
|
case IS_PCH:
|
@@ -3186,14 +3185,14 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
3186
3185
|
lhSize=3;
|
3187
3186
|
litSize = ((istart[0] & 15) << 6) + (istart[1] >> 2);
|
3188
3187
|
litCSize = ((istart[1] & 3) << 8) + istart[2];
|
3189
|
-
if (litCSize +
|
3188
|
+
if (litCSize + lhSize > srcSize) return ERROR(corruption_detected);
|
3190
3189
|
|
3191
3190
|
{ size_t const errorCode = HUFv06_decompress1X4_usingDTable(dctx->litBuffer, litSize, istart+lhSize, litCSize, dctx->hufTableX4);
|
3192
3191
|
if (HUFv06_isError(errorCode)) return ERROR(corruption_detected);
|
3193
3192
|
}
|
3194
3193
|
dctx->litPtr = dctx->litBuffer;
|
3195
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+WILDCOPY_OVERLENGTH;
|
3196
3194
|
dctx->litSize = litSize;
|
3195
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
3197
3196
|
return litCSize + lhSize;
|
3198
3197
|
}
|
3199
3198
|
case IS_RAW:
|
@@ -3217,13 +3216,12 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
3217
3216
|
if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
|
3218
3217
|
memcpy(dctx->litBuffer, istart+lhSize, litSize);
|
3219
3218
|
dctx->litPtr = dctx->litBuffer;
|
3220
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+8;
|
3221
3219
|
dctx->litSize = litSize;
|
3220
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
3222
3221
|
return lhSize+litSize;
|
3223
3222
|
}
|
3224
3223
|
/* direct reference into compressed stream */
|
3225
3224
|
dctx->litPtr = istart+lhSize;
|
3226
|
-
dctx->litBufSize = srcSize-lhSize;
|
3227
3225
|
dctx->litSize = litSize;
|
3228
3226
|
return lhSize+litSize;
|
3229
3227
|
}
|
@@ -3245,9 +3243,8 @@ size_t ZSTDv06_decodeLiteralsBlock(ZSTDv06_DCtx* dctx,
|
|
3245
3243
|
break;
|
3246
3244
|
}
|
3247
3245
|
if (litSize > ZSTDv06_BLOCKSIZE_MAX) return ERROR(corruption_detected);
|
3248
|
-
memset(dctx->litBuffer, istart[lhSize], litSize);
|
3246
|
+
memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
|
3249
3247
|
dctx->litPtr = dctx->litBuffer;
|
3250
|
-
dctx->litBufSize = ZSTDv06_BLOCKSIZE_MAX+WILDCOPY_OVERLENGTH;
|
3251
3248
|
dctx->litSize = litSize;
|
3252
3249
|
return lhSize+1;
|
3253
3250
|
}
|
@@ -3438,7 +3435,7 @@ static void ZSTDv06_decodeSequence(seq_t* seq, seqState_t* seqState)
|
|
3438
3435
|
|
3439
3436
|
size_t ZSTDv06_execSequence(BYTE* op,
|
3440
3437
|
BYTE* const oend, seq_t sequence,
|
3441
|
-
const BYTE** litPtr, const BYTE* const
|
3438
|
+
const BYTE** litPtr, const BYTE* const litLimit,
|
3442
3439
|
const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
|
3443
3440
|
{
|
3444
3441
|
BYTE* const oLitEnd = op + sequence.litLength;
|
@@ -3451,7 +3448,7 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|
3451
3448
|
/* check */
|
3452
3449
|
if (oLitEnd > oend_8) return ERROR(dstSize_tooSmall); /* last match must start at a minimum distance of 8 from oend */
|
3453
3450
|
if (oMatchEnd > oend) return ERROR(dstSize_tooSmall); /* overwrite beyond dst buffer */
|
3454
|
-
if (iLitEnd >
|
3451
|
+
if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
|
3455
3452
|
|
3456
3453
|
/* copy Literals */
|
3457
3454
|
ZSTDv06_wildcopy(op, *litPtr, sequence.litLength); /* note : oLitEnd <= oend-8 : no risk of overwrite beyond oend */
|
@@ -3473,7 +3470,7 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|
3473
3470
|
op = oLitEnd + length1;
|
3474
3471
|
sequence.matchLength -= length1;
|
3475
3472
|
match = base;
|
3476
|
-
if (op > oend_8) {
|
3473
|
+
if (op > oend_8 || sequence.matchLength < MINMATCH) {
|
3477
3474
|
while (op < oMatchEnd) *op++ = *match++;
|
3478
3475
|
return sequenceLength;
|
3479
3476
|
}
|
@@ -3506,7 +3503,7 @@ size_t ZSTDv06_execSequence(BYTE* op,
|
|
3506
3503
|
}
|
3507
3504
|
while (op < oMatchEnd) *op++ = *match++;
|
3508
3505
|
} else {
|
3509
|
-
ZSTDv06_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
3506
|
+
ZSTDv06_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
3510
3507
|
}
|
3511
3508
|
return sequenceLength;
|
3512
3509
|
}
|
@@ -3523,7 +3520,6 @@ static size_t ZSTDv06_decompressSequences(
|
|
3523
3520
|
BYTE* const oend = ostart + maxDstSize;
|
3524
3521
|
BYTE* op = ostart;
|
3525
3522
|
const BYTE* litPtr = dctx->litPtr;
|
3526
|
-
const BYTE* const litLimit_8 = litPtr + dctx->litBufSize - 8;
|
3527
3523
|
const BYTE* const litEnd = litPtr + dctx->litSize;
|
3528
3524
|
FSEv06_DTable* DTableLL = dctx->LLTable;
|
3529
3525
|
FSEv06_DTable* DTableML = dctx->MLTable;
|
@@ -3567,7 +3563,7 @@ static size_t ZSTDv06_decompressSequences(
|
|
3567
3563
|
pos, (U32)sequence.litLength, (U32)sequence.matchLength, (U32)sequence.offset);
|
3568
3564
|
#endif
|
3569
3565
|
|
3570
|
-
{ size_t const oneSeqSize = ZSTDv06_execSequence(op, oend, sequence, &litPtr,
|
3566
|
+
{ size_t const oneSeqSize = ZSTDv06_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
|
3571
3567
|
if (ZSTDv06_isError(oneSeqSize)) return oneSeqSize;
|
3572
3568
|
op += oneSeqSize;
|
3573
3569
|
} }
|
@@ -3733,6 +3729,37 @@ size_t ZSTDv06_decompress(void* dst, size_t dstCapacity, const void* src, size_t
|
|
3733
3729
|
#endif
|
3734
3730
|
}
|
3735
3731
|
|
3732
|
+
size_t ZSTDv06_findFrameCompressedSize(const void* src, size_t srcSize)
|
3733
|
+
{
|
3734
|
+
const BYTE* ip = (const BYTE*)src;
|
3735
|
+
size_t remainingSize = srcSize;
|
3736
|
+
blockProperties_t blockProperties = { bt_compressed, 0 };
|
3737
|
+
|
3738
|
+
/* Frame Header */
|
3739
|
+
{ size_t const frameHeaderSize = ZSTDv06_frameHeaderSize(src, ZSTDv06_frameHeaderSize_min);
|
3740
|
+
if (ZSTDv06_isError(frameHeaderSize)) return frameHeaderSize;
|
3741
|
+
if (MEM_readLE32(src) != ZSTDv06_MAGICNUMBER) return ERROR(prefix_unknown);
|
3742
|
+
if (srcSize < frameHeaderSize+ZSTDv06_blockHeaderSize) return ERROR(srcSize_wrong);
|
3743
|
+
ip += frameHeaderSize; remainingSize -= frameHeaderSize;
|
3744
|
+
}
|
3745
|
+
|
3746
|
+
/* Loop on each block */
|
3747
|
+
while (1) {
|
3748
|
+
size_t const cBlockSize = ZSTDv06_getcBlockSize(ip, remainingSize, &blockProperties);
|
3749
|
+
if (ZSTDv06_isError(cBlockSize)) return cBlockSize;
|
3750
|
+
|
3751
|
+
ip += ZSTDv06_blockHeaderSize;
|
3752
|
+
remainingSize -= ZSTDv06_blockHeaderSize;
|
3753
|
+
if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
|
3754
|
+
|
3755
|
+
if (cBlockSize == 0) break; /* bt_end */
|
3756
|
+
|
3757
|
+
ip += cBlockSize;
|
3758
|
+
remainingSize -= cBlockSize;
|
3759
|
+
}
|
3760
|
+
|
3761
|
+
return ip - (const BYTE*)src;
|
3762
|
+
}
|
3736
3763
|
|
3737
3764
|
/*_******************************
|
3738
3765
|
* Streaming Decompression API
|
@@ -4081,7 +4108,7 @@ size_t ZBUFFv06_decompressContinue(ZBUFFv06_DCtx* zbd,
|
|
4081
4108
|
zbd->inBuff = (char*)malloc(blockSize);
|
4082
4109
|
if (zbd->inBuff == NULL) return ERROR(memory_allocation);
|
4083
4110
|
}
|
4084
|
-
{ size_t const neededOutSize = ((size_t)1 << zbd->fParams.windowLog) + blockSize;
|
4111
|
+
{ size_t const neededOutSize = ((size_t)1 << zbd->fParams.windowLog) + blockSize + WILDCOPY_OVERLENGTH * 2;
|
4085
4112
|
if (zbd->outBuffSize < neededOutSize) {
|
4086
4113
|
free(zbd->outBuff);
|
4087
4114
|
zbd->outBuffSize = neededOutSize;
|
@@ -41,6 +41,13 @@ extern "C" {
|
|
41
41
|
ZSTDLIBv06_API size_t ZSTDv06_decompress( void* dst, size_t dstCapacity,
|
42
42
|
const void* src, size_t compressedSize);
|
43
43
|
|
44
|
+
/**
|
45
|
+
ZSTDv06_getFrameSrcSize() : get the source length of a ZSTD frame
|
46
|
+
compressedSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
|
47
|
+
return : the number of bytes that would be read to decompress this frame
|
48
|
+
or an errorCode if it fails (which can be tested using ZSTDv06_isError())
|
49
|
+
*/
|
50
|
+
size_t ZSTDv06_findFrameCompressedSize(const void* src, size_t compressedSize);
|
44
51
|
|
45
52
|
/* *************************************
|
46
53
|
* Helper functions
|
@@ -13,12 +13,14 @@
|
|
13
13
|
#include <string.h> /* memcpy */
|
14
14
|
#include <stdlib.h> /* malloc, free, qsort */
|
15
15
|
|
16
|
-
#
|
17
|
-
#
|
16
|
+
#ifndef XXH_STATIC_LINKING_ONLY
|
17
|
+
# define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
|
18
|
+
#endif
|
19
|
+
#include "xxhash.h" /* XXH64_* */
|
18
20
|
#include "zstd_v07.h"
|
19
21
|
|
20
|
-
#define FSEv07_STATIC_LINKING_ONLY
|
21
|
-
#define HUFv07_STATIC_LINKING_ONLY
|
22
|
+
#define FSEv07_STATIC_LINKING_ONLY /* FSEv07_MIN_TABLELOG */
|
23
|
+
#define HUFv07_STATIC_LINKING_ONLY /* HUFv07_TABLELOG_ABSOLUTEMAX */
|
22
24
|
#define ZSTDv07_STATIC_LINKING_ONLY
|
23
25
|
|
24
26
|
#include "error_private.h"
|
@@ -2845,7 +2847,7 @@ static void ZSTDv07_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
|
|
2845
2847
|
/*! ZSTDv07_wildcopy() :
|
2846
2848
|
* custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
|
2847
2849
|
#define WILDCOPY_OVERLENGTH 8
|
2848
|
-
MEM_STATIC void ZSTDv07_wildcopy(void* dst, const void* src,
|
2850
|
+
MEM_STATIC void ZSTDv07_wildcopy(void* dst, const void* src, ptrdiff_t length)
|
2849
2851
|
{
|
2850
2852
|
const BYTE* ip = (const BYTE*)src;
|
2851
2853
|
BYTE* op = (BYTE*)dst;
|
@@ -3021,7 +3023,6 @@ struct ZSTDv07_DCtx_s
|
|
3021
3023
|
U32 dictID;
|
3022
3024
|
const BYTE* litPtr;
|
3023
3025
|
ZSTDv07_customMem customMem;
|
3024
|
-
size_t litBufSize;
|
3025
3026
|
size_t litSize;
|
3026
3027
|
BYTE litBuffer[ZSTDv07_BLOCKSIZE_ABSOLUTEMAX + WILDCOPY_OVERLENGTH];
|
3027
3028
|
BYTE headerBuffer[ZSTDv07_FRAMEHEADERSIZE_MAX];
|
@@ -3395,9 +3396,9 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
3395
3396
|
return ERROR(corruption_detected);
|
3396
3397
|
|
3397
3398
|
dctx->litPtr = dctx->litBuffer;
|
3398
|
-
dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+8;
|
3399
3399
|
dctx->litSize = litSize;
|
3400
3400
|
dctx->litEntropy = 1;
|
3401
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
3401
3402
|
return litCSize + lhSize;
|
3402
3403
|
}
|
3403
3404
|
case lbt_repeat:
|
@@ -3418,8 +3419,8 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
3418
3419
|
if (HUFv07_isError(errorCode)) return ERROR(corruption_detected);
|
3419
3420
|
}
|
3420
3421
|
dctx->litPtr = dctx->litBuffer;
|
3421
|
-
dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+WILDCOPY_OVERLENGTH;
|
3422
3422
|
dctx->litSize = litSize;
|
3423
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
3423
3424
|
return litCSize + lhSize;
|
3424
3425
|
}
|
3425
3426
|
case lbt_raw:
|
@@ -3443,13 +3444,12 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
3443
3444
|
if (litSize+lhSize > srcSize) return ERROR(corruption_detected);
|
3444
3445
|
memcpy(dctx->litBuffer, istart+lhSize, litSize);
|
3445
3446
|
dctx->litPtr = dctx->litBuffer;
|
3446
|
-
dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+8;
|
3447
3447
|
dctx->litSize = litSize;
|
3448
|
+
memset(dctx->litBuffer + dctx->litSize, 0, WILDCOPY_OVERLENGTH);
|
3448
3449
|
return lhSize+litSize;
|
3449
3450
|
}
|
3450
3451
|
/* direct reference into compressed stream */
|
3451
3452
|
dctx->litPtr = istart+lhSize;
|
3452
|
-
dctx->litBufSize = srcSize-lhSize;
|
3453
3453
|
dctx->litSize = litSize;
|
3454
3454
|
return lhSize+litSize;
|
3455
3455
|
}
|
@@ -3471,9 +3471,8 @@ size_t ZSTDv07_decodeLiteralsBlock(ZSTDv07_DCtx* dctx,
|
|
3471
3471
|
break;
|
3472
3472
|
}
|
3473
3473
|
if (litSize > ZSTDv07_BLOCKSIZE_ABSOLUTEMAX) return ERROR(corruption_detected);
|
3474
|
-
memset(dctx->litBuffer, istart[lhSize], litSize);
|
3474
|
+
memset(dctx->litBuffer, istart[lhSize], litSize + WILDCOPY_OVERLENGTH);
|
3475
3475
|
dctx->litPtr = dctx->litBuffer;
|
3476
|
-
dctx->litBufSize = ZSTDv07_BLOCKSIZE_ABSOLUTEMAX+WILDCOPY_OVERLENGTH;
|
3477
3476
|
dctx->litSize = litSize;
|
3478
3477
|
return lhSize+1;
|
3479
3478
|
}
|
@@ -3662,7 +3661,7 @@ static seq_t ZSTDv07_decodeSequence(seqState_t* seqState)
|
|
3662
3661
|
static
|
3663
3662
|
size_t ZSTDv07_execSequence(BYTE* op,
|
3664
3663
|
BYTE* const oend, seq_t sequence,
|
3665
|
-
const BYTE** litPtr, const BYTE* const
|
3664
|
+
const BYTE** litPtr, const BYTE* const litLimit,
|
3666
3665
|
const BYTE* const base, const BYTE* const vBase, const BYTE* const dictEnd)
|
3667
3666
|
{
|
3668
3667
|
BYTE* const oLitEnd = op + sequence.litLength;
|
@@ -3674,7 +3673,7 @@ size_t ZSTDv07_execSequence(BYTE* op,
|
|
3674
3673
|
|
3675
3674
|
/* check */
|
3676
3675
|
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 >
|
3676
|
+
if (iLitEnd > litLimit) return ERROR(corruption_detected); /* over-read beyond lit buffer */
|
3678
3677
|
|
3679
3678
|
/* copy Literals */
|
3680
3679
|
ZSTDv07_wildcopy(op, *litPtr, sequence.litLength); /* note : since oLitEnd <= oend-WILDCOPY_OVERLENGTH, no risk of overwrite beyond oend */
|
@@ -3696,7 +3695,7 @@ size_t ZSTDv07_execSequence(BYTE* op,
|
|
3696
3695
|
op = oLitEnd + length1;
|
3697
3696
|
sequence.matchLength -= length1;
|
3698
3697
|
match = base;
|
3699
|
-
if (op > oend_w) {
|
3698
|
+
if (op > oend_w || sequence.matchLength < MINMATCH) {
|
3700
3699
|
while (op < oMatchEnd) *op++ = *match++;
|
3701
3700
|
return sequenceLength;
|
3702
3701
|
}
|
@@ -3729,7 +3728,7 @@ size_t ZSTDv07_execSequence(BYTE* op,
|
|
3729
3728
|
}
|
3730
3729
|
while (op < oMatchEnd) *op++ = *match++;
|
3731
3730
|
} else {
|
3732
|
-
ZSTDv07_wildcopy(op, match, sequence.matchLength-8); /* works even if matchLength < 8 */
|
3731
|
+
ZSTDv07_wildcopy(op, match, (ptrdiff_t)sequence.matchLength-8); /* works even if matchLength < 8 */
|
3733
3732
|
}
|
3734
3733
|
return sequenceLength;
|
3735
3734
|
}
|
@@ -3746,7 +3745,6 @@ static size_t ZSTDv07_decompressSequences(
|
|
3746
3745
|
BYTE* const oend = ostart + maxDstSize;
|
3747
3746
|
BYTE* op = ostart;
|
3748
3747
|
const BYTE* litPtr = dctx->litPtr;
|
3749
|
-
const BYTE* const litLimit_w = litPtr + dctx->litBufSize - WILDCOPY_OVERLENGTH;
|
3750
3748
|
const BYTE* const litEnd = litPtr + dctx->litSize;
|
3751
3749
|
FSEv07_DTable* DTableLL = dctx->LLTable;
|
3752
3750
|
FSEv07_DTable* DTableML = dctx->MLTable;
|
@@ -3776,7 +3774,7 @@ static size_t ZSTDv07_decompressSequences(
|
|
3776
3774
|
for ( ; (BITv07_reloadDStream(&(seqState.DStream)) <= BITv07_DStream_completed) && nbSeq ; ) {
|
3777
3775
|
nbSeq--;
|
3778
3776
|
{ seq_t const sequence = ZSTDv07_decodeSequence(&seqState);
|
3779
|
-
size_t const oneSeqSize = ZSTDv07_execSequence(op, oend, sequence, &litPtr,
|
3777
|
+
size_t const oneSeqSize = ZSTDv07_execSequence(op, oend, sequence, &litPtr, litEnd, base, vBase, dictEnd);
|
3780
3778
|
if (ZSTDv07_isError(oneSeqSize)) return oneSeqSize;
|
3781
3779
|
op += oneSeqSize;
|
3782
3780
|
} }
|
@@ -3972,6 +3970,41 @@ size_t ZSTDv07_decompress(void* dst, size_t dstCapacity, const void* src, size_t
|
|
3972
3970
|
#endif
|
3973
3971
|
}
|
3974
3972
|
|
3973
|
+
size_t ZSTDv07_findFrameCompressedSize(const void* src, size_t srcSize)
|
3974
|
+
{
|
3975
|
+
const BYTE* ip = (const BYTE*)src;
|
3976
|
+
size_t remainingSize = srcSize;
|
3977
|
+
|
3978
|
+
/* check */
|
3979
|
+
if (srcSize < ZSTDv07_frameHeaderSize_min+ZSTDv07_blockHeaderSize) return ERROR(srcSize_wrong);
|
3980
|
+
|
3981
|
+
/* Frame Header */
|
3982
|
+
{ size_t const frameHeaderSize = ZSTDv07_frameHeaderSize(src, ZSTDv07_frameHeaderSize_min);
|
3983
|
+
if (ZSTDv07_isError(frameHeaderSize)) return frameHeaderSize;
|
3984
|
+
if (MEM_readLE32(src) != ZSTDv07_MAGICNUMBER) return ERROR(prefix_unknown);
|
3985
|
+
if (srcSize < frameHeaderSize+ZSTDv07_blockHeaderSize) return ERROR(srcSize_wrong);
|
3986
|
+
ip += frameHeaderSize; remainingSize -= frameHeaderSize;
|
3987
|
+
}
|
3988
|
+
|
3989
|
+
/* Loop on each block */
|
3990
|
+
while (1) {
|
3991
|
+
blockProperties_t blockProperties;
|
3992
|
+
size_t const cBlockSize = ZSTDv07_getcBlockSize(ip, remainingSize, &blockProperties);
|
3993
|
+
if (ZSTDv07_isError(cBlockSize)) return cBlockSize;
|
3994
|
+
|
3995
|
+
ip += ZSTDv07_blockHeaderSize;
|
3996
|
+
remainingSize -= ZSTDv07_blockHeaderSize;
|
3997
|
+
|
3998
|
+
if (blockProperties.blockType == bt_end) break;
|
3999
|
+
|
4000
|
+
if (cBlockSize > remainingSize) return ERROR(srcSize_wrong);
|
4001
|
+
|
4002
|
+
ip += cBlockSize;
|
4003
|
+
remainingSize -= cBlockSize;
|
4004
|
+
}
|
4005
|
+
|
4006
|
+
return ip - (const BYTE*)src;
|
4007
|
+
}
|
3975
4008
|
|
3976
4009
|
/*_******************************
|
3977
4010
|
* Streaming Decompression API
|
@@ -4138,9 +4171,9 @@ static size_t ZSTDv07_loadEntropy(ZSTDv07_DCtx* dctx, const void* const dict, si
|
|
4138
4171
|
}
|
4139
4172
|
|
4140
4173
|
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);
|
4174
|
+
dctx->rep[0] = MEM_readLE32(dictPtr+0); if (dctx->rep[0] == 0 || dctx->rep[0] >= dictSize) return ERROR(dictionary_corrupted);
|
4175
|
+
dctx->rep[1] = MEM_readLE32(dictPtr+4); if (dctx->rep[1] == 0 || dctx->rep[1] >= dictSize) return ERROR(dictionary_corrupted);
|
4176
|
+
dctx->rep[2] = MEM_readLE32(dictPtr+8); if (dctx->rep[2] == 0 || dctx->rep[2] >= dictSize) return ERROR(dictionary_corrupted);
|
4144
4177
|
dictPtr += 12;
|
4145
4178
|
|
4146
4179
|
dctx->litEntropy = dctx->fseEntropy = 1;
|
@@ -4452,7 +4485,7 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd,
|
|
4452
4485
|
zbd->inBuff = (char*)zbd->customMem.customAlloc(zbd->customMem.opaque, blockSize);
|
4453
4486
|
if (zbd->inBuff == NULL) return ERROR(memory_allocation);
|
4454
4487
|
}
|
4455
|
-
{ size_t const neededOutSize = zbd->fParams.windowSize + blockSize;
|
4488
|
+
{ size_t const neededOutSize = zbd->fParams.windowSize + blockSize + WILDCOPY_OVERLENGTH * 2;
|
4456
4489
|
if (zbd->outBuffSize < neededOutSize) {
|
4457
4490
|
zbd->customMem.customFree(zbd->customMem.opaque, zbd->outBuff);
|
4458
4491
|
zbd->outBuffSize = neededOutSize;
|
@@ -4505,7 +4538,8 @@ size_t ZBUFFv07_decompressContinue(ZBUFFv07_DCtx* zbd,
|
|
4505
4538
|
if (!decodedSize && !isSkipFrame) { zbd->stage = ZBUFFds_read; break; } /* this was just a header */
|
4506
4539
|
zbd->outEnd = zbd->outStart + decodedSize;
|
4507
4540
|
zbd->stage = ZBUFFds_flush;
|
4508
|
-
|
4541
|
+
/* break; */
|
4542
|
+
/* pass-through */
|
4509
4543
|
} }
|
4510
4544
|
|
4511
4545
|
case ZBUFFds_flush:
|
@@ -48,6 +48,14 @@ unsigned long long ZSTDv07_getDecompressedSize(const void* src, size_t srcSize);
|
|
48
48
|
ZSTDLIBv07_API size_t ZSTDv07_decompress( void* dst, size_t dstCapacity,
|
49
49
|
const void* src, size_t compressedSize);
|
50
50
|
|
51
|
+
/**
|
52
|
+
ZSTDv07_getFrameSrcSize() : get the source length of a ZSTD frame
|
53
|
+
compressedSize : The size of the 'src' buffer, at least as large as the frame pointed to by 'src'
|
54
|
+
return : the number of bytes that would be read to decompress this frame
|
55
|
+
or an errorCode if it fails (which can be tested using ZSTDv07_isError())
|
56
|
+
*/
|
57
|
+
size_t ZSTDv07_findFrameCompressedSize(const void* src, size_t compressedSize);
|
58
|
+
|
51
59
|
/*====== Helper functions ======*/
|
52
60
|
ZSTDLIBv07_API unsigned ZSTDv07_isError(size_t code); /*!< tells if a `size_t` function result is an error code */
|
53
61
|
ZSTDLIBv07_API const char* ZSTDv07_getErrorName(size_t code); /*!< provides readable string from an error code */
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# ZSTD - standard compression algorithm
|
2
|
+
# Copyright (C) 2014-2016, Yann Collet, Facebook
|
3
|
+
# BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
4
|
+
|
5
|
+
prefix=@PREFIX@
|
6
|
+
libdir=@LIBDIR@
|
7
|
+
includedir=@INCLUDEDIR@
|
8
|
+
|
9
|
+
Name: zstd
|
10
|
+
Description: fast lossless compression algorithm library
|
11
|
+
URL: http://www.zstd.net/
|
12
|
+
Version: @VERSION@
|
13
|
+
Libs: -L${libdir} -lzstd
|
14
|
+
Cflags: -I${includedir}
|