From 2630a5eadc3cd7f591b747dfc95e3aba271695f0 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 14 Jan 2016 19:13:22 +0100 Subject: [PATCH 01/12] benchmark uses ZSTD_duplicateCCtx() --- programs/bench.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/programs/bench.c b/programs/bench.c index b80d6990b..3c74a572c 100644 --- a/programs/bench.c +++ b/programs/bench.c @@ -224,6 +224,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize, const size_t maxCompressedSize = ZSTD_compressBound(srcSize) + (maxNbBlocks * 1024); /* add some room for safety */ void* const compressedBuffer = malloc(maxCompressedSize); void* const resultBuffer = malloc(srcSize); + ZSTD_CCtx* refCtx = ZSTD_createCCtx(); ZSTD_CCtx* ctx = ZSTD_createCCtx(); ZSTD_DCtx* dctx = ZSTD_createDCtx(); U64 crcOrig = XXH64(srcBuffer, srcSize, 0); @@ -233,7 +234,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize, if (strlen(displayName)>17) displayName += strlen(displayName)-17; /* can only display 17 characters */ /* Memory allocation & restrictions */ - if (!compressedBuffer || !resultBuffer || !blockTable || !ctx || !dctx) + if (!compressedBuffer || !resultBuffer || !blockTable || !refCtx || !ctx || !dctx) EXM_THROW(31, "not enough memory"); /* Init blockTable data */ @@ -291,12 +292,27 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize, milliTime = BMK_GetMilliStart(); while (BMK_GetMilliSpan(milliTime) < TIMELOOP) { + ZSTD_compressBegin_advanced(refCtx, ZSTD_getParams(cLevel, dictBufferSize+blockSize)); + ZSTD_compress_insertDictionary(refCtx, dictBuffer, dictBufferSize); for (blockNb=0; blockNb Date: Sun, 17 Jan 2016 00:12:55 +0100 Subject: [PATCH 02/12] small compression speed --- lib/zstd.h | 2 +- lib/zstd_compress.c | 25 ++++++++++++++++++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/zstd.h b/lib/zstd.h index e201b5e0b..f7d364ad3 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -62,7 +62,7 @@ extern "C" { ***************************************/ #define ZSTD_VERSION_MAJOR 0 /* for breaking interface changes */ #define ZSTD_VERSION_MINOR 4 /* for new (non-breaking) interface capabilities */ -#define ZSTD_VERSION_RELEASE 6 /* for tweaks, bug-fixes, or development */ +#define ZSTD_VERSION_RELEASE 7 /* for tweaks, bug-fixes, or development */ #define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE) ZSTDLIB_API unsigned ZSTD_versionNumber (void); diff --git a/lib/zstd_compress.c b/lib/zstd_compress.c index 399f81169..19c64c112 100644 --- a/lib/zstd_compress.c +++ b/lib/zstd_compress.c @@ -1043,18 +1043,41 @@ static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, co const U32 current = (U32)(ip-base); const U32 btLow = btMask >= current ? 0 : current - btMask; U32* smallerPtr = bt + 2*(current&btMask); - U32* largerPtr = bt + 2*(current&btMask) + 1; + U32* largerPtr = smallerPtr + 1; U32 dummy32; /* to be nullified at the end */ const U32 windowLow = zc->lowLimit; U32 matchEndIdx = current+8; + U32 predictedSmall = *(bt + 2*((current-1)&btMask) + 0) + 1; + U32 predictedLarge = *(bt + 2*((current-1)&btMask) + 1) + 1; hashTable[h] = current; /* Update Hash Table */ while (nbCompares-- && (matchIndex > windowLow)) { U32* nextPtr = bt + 2*(matchIndex & btMask); + const U32* predictPtr = bt + 2*((matchIndex-1) & btMask); /* written this way, as bt is a roll buffer */ size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ + if (matchIndex == predictedSmall) + { /* no need to check length, result known */ + *smallerPtr = matchIndex; + if (matchIndex <= btLow) { smallerPtr=&dummy32; break; } /* beyond tree size, stop the search */ + smallerPtr = nextPtr+1; /* new "smaller" => larger of match */ + matchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */ + predictedSmall = predictPtr[1] + 1; + continue; + } + + if (matchIndex == predictedLarge) + { + *largerPtr = matchIndex; + if (matchIndex <= btLow) { largerPtr=&dummy32; break; } /* beyond tree size, stop the search */ + largerPtr = nextPtr; + matchIndex = nextPtr[0]; + predictedLarge = predictPtr[0] + 1; + continue; + } + if ((!extDict) || (matchIndex+matchLength >= dictLimit)) { match = base + matchIndex; From fba6aed175676673d869d03c3bbf2e3c4f23c5ed Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Mon, 18 Jan 2016 12:03:27 +0100 Subject: [PATCH 03/12] changed : ZSTD_LEGACY_SUPPORT set to 0 by default within `zstd_decompress.c` (#113) --- lib/zstd.h | 2 +- lib/zstd_decompress.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/zstd.h b/lib/zstd.h index f7d364ad3..695d26db9 100644 --- a/lib/zstd.h +++ b/lib/zstd.h @@ -44,7 +44,7 @@ extern "C" { /* *************************************************************** -* Tuning parameters +* Export parameters *****************************************************************/ /*! * ZSTD_DLL_EXPORT : diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index d11f65009..cf68b1c13 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -44,10 +44,10 @@ /*! * LEGACY_SUPPORT : -* ZSTD_decompress() can decode older formats (starting from zstd 0.1+) +* ZSTD_decompress() can decode older formats (v0.1+) if set to 1 */ #ifndef ZSTD_LEGACY_SUPPORT -# define ZSTD_LEGACY_SUPPORT 1 +# define ZSTD_LEGACY_SUPPORT 0 #endif From 1840d6af33478654358d540415625679c2d8fc0a Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Wed, 20 Jan 2016 15:39:06 +0100 Subject: [PATCH 04/12] bench pay attention to variable block sizes --- lib/zstd_static.h | 6 +++--- programs/bench.c | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/zstd_static.h b/lib/zstd_static.h index f1e72e955..a98cfead9 100644 --- a/lib/zstd_static.h +++ b/lib/zstd_static.h @@ -284,8 +284,8 @@ static const ZSTD_parameters ZSTD_defaultParameters[4][ZSTD_MAX_CLEVEL+1] = { /* W, C, H, S, L, strat */ { 0, 17, 12, 12, 1, 4, ZSTD_fast }, /* level 0 - never used */ { 0, 17, 12, 13, 1, 6, ZSTD_fast }, /* level 1 */ - { 0, 17, 15, 16, 1, 5, ZSTD_fast }, /* level 2 */ - { 0, 17, 16, 17, 1, 5, ZSTD_fast }, /* level 3 */ + { 0, 17, 14, 16, 1, 5, ZSTD_fast }, /* level 2 */ + { 0, 17, 15, 17, 1, 5, ZSTD_fast }, /* level 3 */ { 0, 17, 13, 15, 2, 4, ZSTD_greedy }, /* level 4 */ { 0, 17, 15, 17, 3, 4, ZSTD_greedy }, /* level 5 */ { 0, 17, 14, 17, 3, 4, ZSTD_lazy }, /* level 6 */ @@ -308,7 +308,7 @@ static const ZSTD_parameters ZSTD_defaultParameters[4][ZSTD_MAX_CLEVEL+1] = { /* W, C, H, S, L, strat */ { 0, 0, 0, 0, 0, 0, ZSTD_fast }, /* level 0 - never used */ { 0, 14, 14, 14, 1, 4, ZSTD_fast }, /* level 1 */ - { 0, 14, 14, 16, 1, 4, ZSTD_fast }, /* level 1 */ + { 0, 14, 14, 16, 1, 4, ZSTD_fast }, /* level 2 */ { 0, 14, 14, 14, 5, 4, ZSTD_greedy }, /* level 3 */ { 0, 14, 14, 14, 8, 4, ZSTD_greedy }, /* level 4 */ { 0, 14, 11, 14, 6, 4, ZSTD_lazy }, /* level 5 */ diff --git a/programs/bench.c b/programs/bench.c index 3c74a572c..14b36b489 100644 --- a/programs/bench.c +++ b/programs/bench.c @@ -220,6 +220,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize, { const size_t blockSize = (g_blockSize ? g_blockSize : srcSize) + (!srcSize); /* avoid div by 0 */ const U32 maxNbBlocks = (U32) ((srcSize + (blockSize-1)) / blockSize) + nbFiles; + size_t largestBlockSize = 0; blockParam_t* const blockTable = (blockParam_t*) malloc(maxNbBlocks * sizeof(blockParam_t)); const size_t maxCompressedSize = ZSTD_compressBound(srcSize) + (maxNbBlocks * 1024); /* add some room for safety */ void* const compressedBuffer = malloc(maxCompressedSize); @@ -260,6 +261,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize, cPtr += blockTable[nbBlocks].cRoom; resPtr += thisBlockSize; remaining -= thisBlockSize; + if (thisBlockSize > largestBlockSize) largestBlockSize = thisBlockSize; } } } @@ -292,7 +294,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize, milliTime = BMK_GetMilliStart(); while (BMK_GetMilliSpan(milliTime) < TIMELOOP) { - ZSTD_compressBegin_advanced(refCtx, ZSTD_getParams(cLevel, dictBufferSize+blockSize)); + ZSTD_compressBegin_advanced(refCtx, ZSTD_getParams(cLevel, dictBufferSize+largestBlockSize)); ZSTD_compress_insertDictionary(refCtx, dictBuffer, dictBufferSize); for (blockNb=0; blockNb Date: Thu, 21 Jan 2016 02:21:17 +0100 Subject: [PATCH 05/12] bench : more accurate block nb in error report --- programs/bench.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/programs/bench.c b/programs/bench.c index 14b36b489..fcd674aac 100644 --- a/programs/bench.c +++ b/programs/bench.c @@ -351,14 +351,21 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize, crcCheck = XXH64(resultBuffer, srcSize, 0); if (crcOrig!=crcCheck) { - unsigned u; - unsigned eBlockSize = (unsigned)(MIN(65536*2, blockSize)); + size_t u; DISPLAY("\n!!! WARNING !!! %14s : Invalid Checksum : %x != %x\n", displayName, (unsigned)crcOrig, (unsigned)crcCheck); for (u=0; u u) break; + bacc += blockTable[bn].srcSize; + } + printf("(block %u, pos %u) \n", bn, (U32)(u - bacc)); break; } } From 7beaa05d81a4186f72f885efad97484662a831f2 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 21 Jan 2016 11:57:45 +0100 Subject: [PATCH 06/12] fixed bt bug --- lib/zstd_compress.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/zstd_compress.c b/lib/zstd_compress.c index 19c64c112..8487ec58f 100644 --- a/lib/zstd_compress.c +++ b/lib/zstd_compress.c @@ -1047,8 +1047,10 @@ static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, co U32 dummy32; /* to be nullified at the end */ const U32 windowLow = zc->lowLimit; U32 matchEndIdx = current+8; - U32 predictedSmall = *(bt + 2*((current-1)&btMask) + 0) + 1; - U32 predictedLarge = *(bt + 2*((current-1)&btMask) + 1) + 1; + U32 predictedSmall = *(bt + 2*((current-1)&btMask) + 0); + U32 predictedLarge = *(bt + 2*((current-1)&btMask) + 1); + predictedSmall += (predictedSmall>0); + predictedLarge += (predictedLarge>0); hashTable[h] = current; /* Update Hash Table */ @@ -1064,7 +1066,7 @@ static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, co if (matchIndex <= btLow) { smallerPtr=&dummy32; break; } /* beyond tree size, stop the search */ smallerPtr = nextPtr+1; /* new "smaller" => larger of match */ matchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */ - predictedSmall = predictPtr[1] + 1; + predictedSmall = predictPtr[1] + (predictPtr[1]>0); continue; } @@ -1074,7 +1076,7 @@ static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, co if (matchIndex <= btLow) { largerPtr=&dummy32; break; } /* beyond tree size, stop the search */ largerPtr = nextPtr; matchIndex = nextPtr[0]; - predictedLarge = predictPtr[0] + 1; + predictedLarge = predictPtr[0] + (predictPtr[0]>0); continue; } From 223f6337f8e64e69eecb55f4300d37a23ff7eda0 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 21 Jan 2016 13:33:05 +0100 Subject: [PATCH 07/12] updated NEWS --- NEWS | 5 +++++ images/CSpeed.png | Bin 36039 -> 35874 bytes images/DSpeed.png | Bin 9676 -> 9143 bytes 3 files changed, 5 insertions(+) diff --git a/NEWS b/NEWS index 9f3f8ce50..8aaf02d99 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,8 @@ +v0.4.7 +Improved : small compression speed improvement in HC mode +Changed : `zstd_decompress.c` has ZSTD_LEGACY_SUPPORT to 0 by default +fix : bt search bug + v0.4.6 fix : fast compression mode on Windows New : cmake configuration file, thanks to Artyom Dymchenko diff --git a/images/CSpeed.png b/images/CSpeed.png index fe54752ef422bc5d0c098e5382a612ca2d18b907..5ba0561e6d7d0d6334878df83dbb7cacc8f1bcd5 100644 GIT binary patch literal 35874 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 Q1W^0S)78&qol`;+07{-Wod5s; literal 36039 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 hZi_1B&YAbme!Ub6 Date: Thu, 21 Jan 2016 14:32:41 +0100 Subject: [PATCH 08/12] fixed VS 2015 'ERROR already defined', reported by Rich Geldreich --- lib/error.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/error.h b/lib/error.h index af3c1b569..2ec64d0c4 100644 --- a/lib/error.h +++ b/lib/error.h @@ -64,6 +64,9 @@ extern "C" { ******************************************/ #define PREFIX(name) ZSTD_error_##name +#ifdef ERROR +# undef ERROR /* reported already defined on VS 2015 by Rich Geldreich */ +#endif #define ERROR(name) (size_t)-PREFIX(name) #define ERROR_LIST(ITEM) \ From 977f1f3600faf02a1f16d733848a0e1f87aeea76 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 21 Jan 2016 15:38:47 +0100 Subject: [PATCH 09/12] modified error system, following suggestions by @nemequ --- lib/bitstream.h | 4 +- lib/{error.h => error_private.h} | 65 ++++++++++++++++-------------- lib/error_public.h | 69 ++++++++++++++++++++++++++++++++ lib/zstd_buffered.c | 5 ++- lib/zstd_internal.h | 2 +- lib/zstd_static.h | 2 +- programs/Makefile | 2 +- programs/fuzzer.c | 6 +-- 8 files changed, 117 insertions(+), 38 deletions(-) rename lib/{error.h => error_private.h} (58%) create mode 100644 lib/error_public.h diff --git a/lib/bitstream.h b/lib/bitstream.h index dcfe8b0a4..fbd0f3f37 100644 --- a/lib/bitstream.h +++ b/lib/bitstream.h @@ -50,8 +50,8 @@ extern "C" { /****************************************** * Includes ******************************************/ -#include "mem.h" /* unaligned access routines */ -#include "error.h" /* error codes and messages */ +#include "mem.h" /* unaligned access routines */ +#include "error_private.h" /* error codes and messages */ /******************************************** diff --git a/lib/error.h b/lib/error_private.h similarity index 58% rename from lib/error.h rename to lib/error_private.h index 2ec64d0c4..dbb202f45 100644 --- a/lib/error.h +++ b/lib/error_private.h @@ -1,6 +1,6 @@ /* ****************************************************************** Error codes and messages - Copyright (C) 2013-2015, Yann Collet + Copyright (C) 2013-2016, Yann Collet BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) @@ -28,9 +28,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. You can contact the author at : - - Source repository : https://github.com/Cyan4973/FiniteStateEntropy - - Public forum : https://groups.google.com/forum/#!forum/lz4c + - Source repository : https://github.com/Cyan4973/zstd ****************************************************************** */ +/* Note : this module is expected to remain private, do not expose it */ + #ifndef ERROR_H_MODULE #define ERROR_H_MODULE @@ -39,28 +40,29 @@ extern "C" { #endif -/****************************************** +/* ***************************************** * Includes ******************************************/ -#include /* size_t, ptrdiff_t */ +#include /* size_t, ptrdiff_t */ +#include "error_public.h" /* enum list */ -/****************************************** +/* ***************************************** * Compiler-specific ******************************************/ -#if defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +#if defined(__GNUC__) +# define ERR_STATIC static __attribute__((unused)) +#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) # define ERR_STATIC static inline #elif defined(_MSC_VER) # define ERR_STATIC static __inline -#elif defined(__GNUC__) -# define ERR_STATIC static __attribute__((unused)) #else # define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */ #endif -/****************************************** -* Error Management +/* ***************************************** +* Error Codes ******************************************/ #define PREFIX(name) ZSTD_error_##name @@ -69,29 +71,34 @@ extern "C" { #endif #define ERROR(name) (size_t)-PREFIX(name) -#define ERROR_LIST(ITEM) \ - ITEM(PREFIX(No_Error)) ITEM(PREFIX(GENERIC)) \ - ITEM(PREFIX(prefix_unknown)) ITEM(PREFIX(frameParameter_unsupported)) ITEM(PREFIX(frameParameter_unsupportedBy32bitsImplementation)) \ - ITEM(PREFIX(init_missing)) ITEM(PREFIX(memory_allocation)) ITEM(PREFIX(stage_wrong)) \ - ITEM(PREFIX(dstSize_tooSmall)) ITEM(PREFIX(srcSize_wrong)) \ - ITEM(PREFIX(corruption_detected)) \ - ITEM(PREFIX(tableLog_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooLarge)) ITEM(PREFIX(maxSymbolValue_tooSmall)) \ - ITEM(PREFIX(maxCode)) - -#define ERROR_GENERATE_ENUM(ENUM) ENUM, -typedef enum { ERROR_LIST(ERROR_GENERATE_ENUM) } ERR_codes; /* enum is exposed, to detect & handle specific errors; compare function result to -enum value */ - -#define ERROR_CONVERTTOSTRING(STRING) #STRING, -#define ERROR_GENERATE_STRING(EXPR) ERROR_CONVERTTOSTRING(EXPR) -static const char* ERR_strings[] = { ERROR_LIST(ERROR_GENERATE_STRING) }; - ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); } + +/* ***************************************** +* Error Strings +******************************************/ + ERR_STATIC const char* ERR_getErrorName(size_t code) { static const char* codeError = "Unspecified error code"; - if (ERR_isError(code)) return ERR_strings[-(int)(code)]; - return codeError; + switch( (size_t)-code ) + { + case ZSTD_error_No_Error: return "No error detected"; + case ZSTD_error_GENERIC: return "Error (generic)"; + case ZSTD_error_prefix_unknown: return "Unknown frame descriptor"; + case ZSTD_error_frameParameter_unsupported: return "Unsupported frame parameter"; + case ZSTD_error_frameParameter_unsupportedBy32bitsImplementation: return "Frame parameter unsupported in 32-bits mode"; + case ZSTD_error_init_missing: return "Context should be init first"; + case ZSTD_error_memory_allocation: return "Allocation error : not enough memory"; + case ZSTD_error_dstSize_tooSmall: return "Destination buffer is too small"; + case ZSTD_error_srcSize_wrong: return "Src size incorrect"; + case ZSTD_error_corruption_detected: return "Corrupted block detected"; + case ZSTD_error_tableLog_tooLarge: return "tableLog requires too much memory"; + case ZSTD_error_maxSymbolValue_tooLarge: return "Unsupported max possible Symbol Value : too large"; + case ZSTD_error_maxSymbolValue_tooSmall: return "Specified maxSymbolValue is too small"; + case ZSTD_error_maxCode: + default: return codeError; + } } diff --git a/lib/error_public.h b/lib/error_public.h new file mode 100644 index 000000000..a07d00ceb --- /dev/null +++ b/lib/error_public.h @@ -0,0 +1,69 @@ +/* ****************************************************************** + Error codes list + Copyright (C) 2016, Yann Collet + + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - Source repository : https://github.com/Cyan4973/zstd +****************************************************************** */ +#ifndef ERROR_PUBLIC_H_MODULE +#define ERROR_PUBLIC_H_MODULE + +#if defined (__cplusplus) +extern "C" { +#endif + + +/* **************************************** +* error list +******************************************/ +enum { + ZSTD_error_No_Error, + ZSTD_error_GENERIC, + ZSTD_error_prefix_unknown, + ZSTD_error_frameParameter_unsupported, + ZSTD_error_frameParameter_unsupportedBy32bitsImplementation, + ZSTD_error_init_missing, + ZSTD_error_memory_allocation, + ZSTD_error_stage_wrong, + ZSTD_error_dstSize_tooSmall, + ZSTD_error_srcSize_wrong, + ZSTD_error_corruption_detected, + ZSTD_error_tableLog_tooLarge, + ZSTD_error_maxSymbolValue_tooLarge, + ZSTD_error_maxSymbolValue_tooSmall, + ZSTD_error_maxCode +}; + +/* note : functions provide error codes are provided as (size_t)-enum */ + + +#if defined (__cplusplus) +} +#endif + +#endif /* ERROR_PUBLIC_H_MODULE */ diff --git a/lib/zstd_buffered.c b/lib/zstd_buffered.c index 8a7fa1d11..48721d628 100644 --- a/lib/zstd_buffered.c +++ b/lib/zstd_buffered.c @@ -39,7 +39,7 @@ * Includes ***************************************/ #include -#include "error.h" +#include "error_private.h" #include "zstd_static.h" #include "zstd_buffered_static.h" @@ -243,6 +243,8 @@ static size_t ZBUFF_compressContinue_generic(ZBUFF_CCtx* zbc, zbc->stage = ZBUFFcs_load; break; } + default: + return ERROR(GENERIC); /* impossible */ } } @@ -534,6 +536,7 @@ size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDstSizePt notDone = 0; break; } + default: return ERROR(GENERIC); /* impossible */ } } diff --git a/lib/zstd_internal.h b/lib/zstd_internal.h index bddfc9293..cae2cb8f8 100644 --- a/lib/zstd_internal.h +++ b/lib/zstd_internal.h @@ -41,7 +41,7 @@ extern "C" { * Includes ***************************************/ #include "mem.h" -#include "error.h" +#include "error_private.h" /* ************************************* diff --git a/lib/zstd_static.h b/lib/zstd_static.h index a98cfead9..c60fa65c2 100644 --- a/lib/zstd_static.h +++ b/lib/zstd_static.h @@ -334,7 +334,7 @@ static const ZSTD_parameters ZSTD_defaultParameters[4][ZSTD_MAX_CLEVEL+1] = { /* ************************************* * Error management ***************************************/ -#include "error.h" +#include "error_public.h" #if defined (__cplusplus) diff --git a/programs/Makefile b/programs/Makefile index 182f91a38..c64cbe6b9 100644 --- a/programs/Makefile +++ b/programs/Makefile @@ -45,7 +45,7 @@ DESTDIR?= PREFIX ?= /usr/local CPPFLAGS= -I../lib -DZSTD_VERSION=\"$(VERSION)\" CFLAGS ?= -O3 # -falign-loops=32 # not always beneficial -CFLAGS += -std=c99 -Wall -Wextra -Wundef -Wshadow -Wcast-qual -Wcast-align -Wstrict-prototypes -Wstrict-aliasing=1 +CFLAGS += -std=c99 -Wall -Wextra -Wcast-qual -Wcast-align -Wshadow -Wstrict-aliasing=1 -Wswitch-enum -Wstrict-prototypes -Wundef FLAGS = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(MOREFLAGS) BINDIR = $(PREFIX)/bin diff --git a/programs/fuzzer.c b/programs/fuzzer.c index 9c427c206..4058ef24d 100644 --- a/programs/fuzzer.c +++ b/programs/fuzzer.c @@ -185,13 +185,13 @@ static int basicUnitTests(U32 seed, double compressibility) DISPLAYLEVEL(4, "test%3i : decompress with 1 missing byte : ", testNb++); result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, compressedBuffer, cSize-1); if (!ZSTD_isError(result)) goto _output_error; - if (result != ERROR(srcSize_wrong)) goto _output_error; + if (result != (size_t)-ZSTD_error_srcSize_wrong) goto _output_error; DISPLAYLEVEL(4, "OK \n"); DISPLAYLEVEL(4, "test%3i : decompress with 1 too much byte : ", testNb++); result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, compressedBuffer, cSize+1); if (!ZSTD_isError(result)) goto _output_error; - if (result != ERROR(srcSize_wrong)) goto _output_error; + if (result != (size_t)-ZSTD_error_srcSize_wrong) goto _output_error; DISPLAYLEVEL(4, "OK \n"); /* Dictionary and Duplication tests */ @@ -259,7 +259,7 @@ static int basicUnitTests(U32 seed, double compressibility) DISPLAYLEVEL(4, "test%3i : Check input length for magic number : ", testNb++); result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, CNBuffer, 3); if (!ZSTD_isError(result)) goto _output_error; - if (result != ERROR(srcSize_wrong)) goto _output_error; + if (result != (size_t)-ZSTD_error_srcSize_wrong) goto _output_error; DISPLAYLEVEL(4, "OK \n"); DISPLAYLEVEL(4, "test%3i : Check magic Number : ", testNb++); From ffec740d37c696f76555f564bae130f9989175d1 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 21 Jan 2016 15:50:11 +0100 Subject: [PATCH 10/12] fixed visual and clang errors --- lib/legacy/zstd_legacy.h | 6 +++--- lib/legacy/zstd_v01.c | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/legacy/zstd_legacy.h b/lib/legacy/zstd_legacy.h index 308d1342f..b3e5eb204 100644 --- a/lib/legacy/zstd_legacy.h +++ b/lib/legacy/zstd_legacy.h @@ -40,8 +40,8 @@ extern "C" { /* ************************************* * Includes ***************************************/ -#include "mem.h" /* MEM_STATIC */ -#include "error.h" /* ERROR */ +#include "mem.h" /* MEM_STATIC */ +#include "error_private.h" /* ERROR */ #include "zstd_v01.h" #include "zstd_v02.h" #include "zstd_v03.h" @@ -51,7 +51,7 @@ MEM_STATIC unsigned ZSTD_isLegacy (U32 magicNumberLE) switch(magicNumberLE) { case ZSTDv01_magicNumberLE : - case ZSTDv02_magicNumber : + case ZSTDv02_magicNumber : case ZSTDv03_magicNumber : return 1; default : return 0; } diff --git a/lib/legacy/zstd_v01.c b/lib/legacy/zstd_v01.c index 7a8486b58..2fcf18885 100644 --- a/lib/legacy/zstd_v01.c +++ b/lib/legacy/zstd_v01.c @@ -1630,6 +1630,7 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx, ip += litcSize; break; } + case bt_end: default: return (size_t)-ZSTD_ERROR_GENERIC; } From a768a301ba23eea5c7389c0cddd4bc15645b1865 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 21 Jan 2016 16:04:35 +0100 Subject: [PATCH 11/12] fixed VS project --- lib/error_private.h | 2 +- lib/error_public.h | 3 +- lib/zstd_compress.c | 1 - lib/zstd_decompress.c | 2 +- visual/2013/zstdlib/zstdlib.vcxproj | 1 - visual/2013/zstdlib/zstdlib.vcxproj.filters | 155 ++++++++++---------- 6 files changed, 80 insertions(+), 84 deletions(-) diff --git a/lib/error_private.h b/lib/error_private.h index dbb202f45..e56753899 100644 --- a/lib/error_private.h +++ b/lib/error_private.h @@ -81,7 +81,7 @@ ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); } ERR_STATIC const char* ERR_getErrorName(size_t code) { static const char* codeError = "Unspecified error code"; - switch( (size_t)-code ) + switch( (size_t)(0-code) ) { case ZSTD_error_No_Error: return "No error detected"; case ZSTD_error_GENERIC: return "Error (generic)"; diff --git a/lib/error_public.h b/lib/error_public.h index a07d00ceb..78b0e80a9 100644 --- a/lib/error_public.h +++ b/lib/error_public.h @@ -59,7 +59,8 @@ enum { ZSTD_error_maxCode }; -/* note : functions provide error codes are provided as (size_t)-enum */ +/* note : functions provide error codes in reverse negative order, + so compare with (size_t)(0-enum) */ #if defined (__cplusplus) diff --git a/lib/zstd_compress.c b/lib/zstd_compress.c index 8487ec58f..d01807bd3 100644 --- a/lib/zstd_compress.c +++ b/lib/zstd_compress.c @@ -39,7 +39,6 @@ # define FORCE_INLINE static __forceinline # include /* For Visual 2005 */ # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */ -# pragma warning(disable : 4324) /* disable: C4324: padded structure */ #else # define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__) # ifdef __GNUC__ diff --git a/lib/zstd_decompress.c b/lib/zstd_decompress.c index cf68b1c13..4a026df33 100644 --- a/lib/zstd_decompress.c +++ b/lib/zstd_decompress.c @@ -799,7 +799,7 @@ size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, size_t src #else ZSTD_DCtx dctx; return ZSTD_decompressDCtx(&dctx, dst, maxDstSize, src, srcSize); -#endif // defined +#endif } diff --git a/visual/2013/zstdlib/zstdlib.vcxproj b/visual/2013/zstdlib/zstdlib.vcxproj index 124595556..a580048b6 100644 --- a/visual/2013/zstdlib/zstdlib.vcxproj +++ b/visual/2013/zstdlib/zstdlib.vcxproj @@ -27,7 +27,6 @@ - diff --git a/visual/2013/zstdlib/zstdlib.vcxproj.filters b/visual/2013/zstdlib/zstdlib.vcxproj.filters index 9e930d7b1..8600c5f4f 100644 --- a/visual/2013/zstdlib/zstdlib.vcxproj.filters +++ b/visual/2013/zstdlib/zstdlib.vcxproj.filters @@ -1,80 +1,77 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;hm;inl;inc;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - Resource Files - - + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + Source Files + + + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + Header Files + + + + + Resource Files + + \ No newline at end of file From dd283b1f4f71fb39df6588fd97ebb952241b4f49 Mon Sep 17 00:00:00 2001 From: Yann Collet Date: Thu, 21 Jan 2016 16:08:01 +0100 Subject: [PATCH 12/12] fixed cmake --- contrib/cmake/lib/CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/contrib/cmake/lib/CMakeLists.txt b/contrib/cmake/lib/CMakeLists.txt index f15244275..a8247ddca 100644 --- a/contrib/cmake/lib/CMakeLists.txt +++ b/contrib/cmake/lib/CMakeLists.txt @@ -66,7 +66,8 @@ SET(Sources SET(Headers ${LIBRARY_DIR}/bitstream.h - ${LIBRARY_DIR}/error.h + ${LIBRARY_DIR}/error_private.h + ${LIBRARY_DIR}/error_public.h ${LIBRARY_DIR}/fse.h ${LIBRARY_DIR}/fse_static.h ${LIBRARY_DIR}/huff0.h