From: inikep Date: Wed, 1 Jun 2016 07:16:11 +0000 (+0200) Subject: Merge remote-tracking branch 'refs/remotes/Cyan4973/dev070' into dev070 X-Git-Tag: v0.7.0^2~49^2~31^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c2771710d69a775e879e971e7f1ff2bd13f45b6;p=thirdparty%2Fzstd.git Merge remote-tracking branch 'refs/remotes/Cyan4973/dev070' into dev070 # Conflicts: # .gitignore # lib/decompress/zstd_decompress.c # programs/zbufftest.c --- 5c2771710d69a775e879e971e7f1ff2bd13f45b6 diff --cc .gitignore index f0e2c9f12,c90212490..9a71d4bcd --- a/.gitignore +++ b/.gitignore @@@ -31,7 -31,5 +31,7 @@@ projects/VS201 .directory _codelite/ _zstdbench/ --zlib_wrapper/ + .clang_complete + +# CMake +projects/cmake/ diff --cc lib/decompress/zstd_decompress.c index da00799cf,4ef8de30f..6d79e678a --- a/lib/decompress/zstd_decompress.c +++ b/lib/decompress/zstd_decompress.c @@@ -1030,11 -1028,9 +1037,14 @@@ size_t ZSTD_nextSrcSizeToDecompress(ZST return dctx->expected; } +int ZSTD_isSkipFrame(ZSTD_DCtx* dctx) +{ + return dctx->stage == ZSTDds_skipFrame; +} + + /** ZSTD_decompressContinue() : + * @return : nb of bytes generated into `dst` (necessarily <= `dstCapacity) + * or an error code, which can be tested using ZSTD_isError() */ size_t ZSTD_decompressContinue(ZSTD_DCtx* dctx, void* dst, size_t dstCapacity, const void* src, size_t srcSize) { /* Sanity check */ @@@ -1107,19 -1104,10 +1124,21 @@@ dctx->stage = ZSTDds_decodeBlockHeader; dctx->expected = ZSTD_blockHeaderSize; dctx->previousDstEnd = (char*)dst + rSize; + if (ZSTD_isError(rSize)) return rSize; + if (dctx->fParams.checksumFlag) XXH64_update(&dctx->xxhState, dst, rSize); return rSize; } + case ZSTDds_decodeSkippableHeader: + { memcpy(dctx->headerBuffer + ZSTD_frameHeaderSize_min, src, dctx->expected); + dctx->expected = MEM_readLE32(dctx->headerBuffer + 4); + dctx->stage = ZSTDds_skipFrame; + return 0; + } + case ZSTDds_skipFrame: + { dctx->expected = 0; + dctx->stage = ZSTDds_getFrameHeaderSize; + return 0; + } default: return ERROR(GENERIC); /* impossible */ } diff --cc programs/zbufftest.c index 278339dd0,c7951eeff..19a385b42 --- a/programs/zbufftest.c +++ b/programs/zbufftest.c @@@ -147,12 -147,11 +147,12 @@@ static int basicUnitTests(U32 seed, dou int testResult = 0; size_t CNBufferSize = COMPRESSIBLE_NOISE_LENGTH; void* CNBuffer = malloc(CNBufferSize); - size_t const compressedBufferSize = ZSTD_compressBound(COMPRESSIBLE_NOISE_LENGTH); - void* const compressedBuffer = malloc(compressedBufferSize); + size_t const skippableFrameSize = 11; + size_t const compressedBufferSize = (8 + skippableFrameSize) + ZSTD_compressBound(COMPRESSIBLE_NOISE_LENGTH); + void* compressedBuffer = malloc(compressedBufferSize); size_t const decodedBufferSize = CNBufferSize; - void* const decodedBuffer = malloc(decodedBufferSize); - size_t cSize, readSize, genSize; + void* decodedBuffer = malloc(decodedBufferSize); - size_t result, cSize, readSize, readSkipSize, genSize; ++ size_t cSize, readSize, readSkipSize, genSize; U32 testNb=0; ZBUFF_CCtx* zc = ZBUFF_createCCtx_advanced(customMem); ZBUFF_DCtx* zd = ZBUFF_createDCtx_advanced(customMem); @@@ -173,30 -168,25 +173,31 @@@ ZBUFF_compressInitDictionary(zc, CNBuffer, 128 KB, 1); readSize = CNBufferSize; genSize = compressedBufferSize; - result = ZBUFF_compressContinue(zc, ((char*)compressedBuffer)+cSize, &genSize, CNBuffer, &readSize); - if (ZBUFF_isError(result)) goto _output_error; - { size_t const r = ZBUFF_compressContinue(zc, compressedBuffer, &genSize, CNBuffer, &readSize); ++ { size_t const r = ZBUFF_compressContinue(zc, ((char*)compressedBuffer)+cSize, &genSize, CNBuffer, &readSize); + if (ZBUFF_isError(r)) goto _output_error; } if (readSize != CNBufferSize) goto _output_error; /* entire input should be consumed */ - cSize = genSize; + cSize += genSize; genSize = compressedBufferSize - cSize; - result = ZBUFF_compressEnd(zc, ((char*)compressedBuffer)+cSize, &genSize); - if (result != 0) goto _output_error; /* error, or some data not flushed */ + { size_t const r = ZBUFF_compressEnd(zc, ((char*)compressedBuffer)+cSize, &genSize); + if (r != 0) goto _output_error; } /*< error, or some data not flushed */ cSize += genSize; DISPLAYLEVEL(4, "OK (%u bytes : %.2f%%)\n", (U32)cSize, (double)cSize/COMPRESSIBLE_NOISE_LENGTH*100); /* Basic decompression test */ DISPLAYLEVEL(4, "test%3i : decompress %u bytes : ", testNb++, COMPRESSIBLE_NOISE_LENGTH); ZBUFF_decompressInitDictionary(zd, CNBuffer, 128 KB); - readSize = cSize; + readSkipSize = cSize; + genSize = CNBufferSize; - result = ZBUFF_decompressContinue(zd, decodedBuffer, &genSize, compressedBuffer, &readSkipSize); - if (genSize != 0) goto _output_error; /* skippable frame */ ++ { size_t const r = ZBUFF_decompressContinue(zd, decodedBuffer, &genSize, compressedBuffer, &readSkipSize); ++ if (r != 0) goto _output_error; } ++ if (genSize != 0) goto _output_error; /* skippable frame len is 0 */ + ZBUFF_decompressInitDictionary(zd, CNBuffer, 128 KB); + readSize = cSize - readSkipSize; genSize = CNBufferSize; - result = ZBUFF_decompressContinue(zd, decodedBuffer, &genSize, ((char*)compressedBuffer)+readSkipSize, &readSize); - if (result != 0) goto _output_error; /* should reach end of frame == 0; otherwise, some data left, or an error */ - { size_t const r = ZBUFF_decompressContinue(zd, decodedBuffer, &genSize, compressedBuffer, &readSize); ++ { size_t const r = ZBUFF_decompressContinue(zd, decodedBuffer, &genSize, ((char*)compressedBuffer)+readSkipSize, &readSize); + if (r != 0) goto _output_error; } /* should reach end of frame == 0; otherwise, some data left, or an error */ if (genSize != CNBufferSize) goto _output_error; /* should regenerate the same amount */ - if (readSize != cSize) goto _output_error; /* should have read the entire frame */ + if (readSize+readSkipSize != cSize) goto _output_error; /* should have read the entire frame */ DISPLAYLEVEL(4, "OK \n"); /* check regenerated data is byte exact */