mirror of
https://github.com/facebook/zstd.git
synced 2025-10-22 00:06:12 -04:00
commit
f5d3c996cd
5
NEWS
5
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
|
v0.4.6
|
||||||
fix : fast compression mode on Windows
|
fix : fast compression mode on Windows
|
||||||
New : cmake configuration file, thanks to Artyom Dymchenko
|
New : cmake configuration file, thanks to Artyom Dymchenko
|
||||||
|
@ -66,7 +66,8 @@ SET(Sources
|
|||||||
|
|
||||||
SET(Headers
|
SET(Headers
|
||||||
${LIBRARY_DIR}/bitstream.h
|
${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.h
|
||||||
${LIBRARY_DIR}/fse_static.h
|
${LIBRARY_DIR}/fse_static.h
|
||||||
${LIBRARY_DIR}/huff0.h
|
${LIBRARY_DIR}/huff0.h
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
Binary file not shown.
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 8.9 KiB |
@ -51,7 +51,7 @@ extern "C" {
|
|||||||
* Includes
|
* Includes
|
||||||
******************************************/
|
******************************************/
|
||||||
#include "mem.h" /* unaligned access routines */
|
#include "mem.h" /* unaligned access routines */
|
||||||
#include "error.h" /* error codes and messages */
|
#include "error_private.h" /* error codes and messages */
|
||||||
|
|
||||||
|
|
||||||
/********************************************
|
/********************************************
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
/* ******************************************************************
|
/* ******************************************************************
|
||||||
Error codes and messages
|
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)
|
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.
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
You can contact the author at :
|
You can contact the author at :
|
||||||
- Source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
- Source repository : https://github.com/Cyan4973/zstd
|
||||||
- Public forum : https://groups.google.com/forum/#!forum/lz4c
|
|
||||||
****************************************************************** */
|
****************************************************************** */
|
||||||
|
/* Note : this module is expected to remain private, do not expose it */
|
||||||
|
|
||||||
#ifndef ERROR_H_MODULE
|
#ifndef ERROR_H_MODULE
|
||||||
#define ERROR_H_MODULE
|
#define ERROR_H_MODULE
|
||||||
|
|
||||||
@ -39,56 +40,65 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/******************************************
|
/* *****************************************
|
||||||
* Includes
|
* Includes
|
||||||
******************************************/
|
******************************************/
|
||||||
#include <stddef.h> /* size_t, ptrdiff_t */
|
#include <stddef.h> /* size_t, ptrdiff_t */
|
||||||
|
#include "error_public.h" /* enum list */
|
||||||
|
|
||||||
|
|
||||||
/******************************************
|
/* *****************************************
|
||||||
* Compiler-specific
|
* 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
|
# define ERR_STATIC static inline
|
||||||
#elif defined(_MSC_VER)
|
#elif defined(_MSC_VER)
|
||||||
# define ERR_STATIC static __inline
|
# define ERR_STATIC static __inline
|
||||||
#elif defined(__GNUC__)
|
|
||||||
# define ERR_STATIC static __attribute__((unused))
|
|
||||||
#else
|
#else
|
||||||
# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
# define ERR_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/******************************************
|
/* *****************************************
|
||||||
* Error Management
|
* Error Codes
|
||||||
******************************************/
|
******************************************/
|
||||||
#define PREFIX(name) ZSTD_error_##name
|
#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(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)); }
|
ERR_STATIC unsigned ERR_isError(size_t code) { return (code > ERROR(maxCode)); }
|
||||||
|
|
||||||
|
|
||||||
|
/* *****************************************
|
||||||
|
* Error Strings
|
||||||
|
******************************************/
|
||||||
|
|
||||||
ERR_STATIC const char* ERR_getErrorName(size_t code)
|
ERR_STATIC const char* ERR_getErrorName(size_t code)
|
||||||
{
|
{
|
||||||
static const char* codeError = "Unspecified error code";
|
static const char* codeError = "Unspecified error code";
|
||||||
if (ERR_isError(code)) return ERR_strings[-(int)(code)];
|
switch( (size_t)(0-code) )
|
||||||
return codeError;
|
{
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
70
lib/error_public.h
Normal file
70
lib/error_public.h
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/* ******************************************************************
|
||||||
|
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 in reverse negative order,
|
||||||
|
so compare with (size_t)(0-enum) */
|
||||||
|
|
||||||
|
|
||||||
|
#if defined (__cplusplus)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* ERROR_PUBLIC_H_MODULE */
|
@ -41,7 +41,7 @@ extern "C" {
|
|||||||
* Includes
|
* Includes
|
||||||
***************************************/
|
***************************************/
|
||||||
#include "mem.h" /* MEM_STATIC */
|
#include "mem.h" /* MEM_STATIC */
|
||||||
#include "error.h" /* ERROR */
|
#include "error_private.h" /* ERROR */
|
||||||
#include "zstd_v01.h"
|
#include "zstd_v01.h"
|
||||||
#include "zstd_v02.h"
|
#include "zstd_v02.h"
|
||||||
#include "zstd_v03.h"
|
#include "zstd_v03.h"
|
||||||
|
@ -1630,6 +1630,7 @@ static size_t ZSTD_decodeLiteralsBlock(void* ctx,
|
|||||||
ip += litcSize;
|
ip += litcSize;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case bt_end:
|
||||||
default:
|
default:
|
||||||
return (size_t)-ZSTD_ERROR_GENERIC;
|
return (size_t)-ZSTD_ERROR_GENERIC;
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ extern "C" {
|
|||||||
|
|
||||||
|
|
||||||
/* ***************************************************************
|
/* ***************************************************************
|
||||||
* Tuning parameters
|
* Export parameters
|
||||||
*****************************************************************/
|
*****************************************************************/
|
||||||
/*!
|
/*!
|
||||||
* ZSTD_DLL_EXPORT :
|
* ZSTD_DLL_EXPORT :
|
||||||
@ -62,7 +62,7 @@ extern "C" {
|
|||||||
***************************************/
|
***************************************/
|
||||||
#define ZSTD_VERSION_MAJOR 0 /* for breaking interface changes */
|
#define ZSTD_VERSION_MAJOR 0 /* for breaking interface changes */
|
||||||
#define ZSTD_VERSION_MINOR 4 /* for new (non-breaking) interface capabilities */
|
#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)
|
#define ZSTD_VERSION_NUMBER (ZSTD_VERSION_MAJOR *100*100 + ZSTD_VERSION_MINOR *100 + ZSTD_VERSION_RELEASE)
|
||||||
ZSTDLIB_API unsigned ZSTD_versionNumber (void);
|
ZSTDLIB_API unsigned ZSTD_versionNumber (void);
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@
|
|||||||
* Includes
|
* Includes
|
||||||
***************************************/
|
***************************************/
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "error.h"
|
#include "error_private.h"
|
||||||
#include "zstd_static.h"
|
#include "zstd_static.h"
|
||||||
#include "zstd_buffered_static.h"
|
#include "zstd_buffered_static.h"
|
||||||
|
|
||||||
@ -243,6 +243,8 @@ static size_t ZBUFF_compressContinue_generic(ZBUFF_CCtx* zbc,
|
|||||||
zbc->stage = ZBUFFcs_load;
|
zbc->stage = ZBUFFcs_load;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
return ERROR(GENERIC); /* impossible */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -534,6 +536,7 @@ size_t ZBUFF_decompressContinue(ZBUFF_DCtx* zbc, void* dst, size_t* maxDstSizePt
|
|||||||
notDone = 0;
|
notDone = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
default: return ERROR(GENERIC); /* impossible */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,7 +39,6 @@
|
|||||||
# define FORCE_INLINE static __forceinline
|
# define FORCE_INLINE static __forceinline
|
||||||
# include <intrin.h> /* For Visual 2005 */
|
# include <intrin.h> /* For Visual 2005 */
|
||||||
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
||||||
# pragma warning(disable : 4324) /* disable: C4324: padded structure */
|
|
||||||
#else
|
#else
|
||||||
# define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
# define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
|
||||||
# ifdef __GNUC__
|
# ifdef __GNUC__
|
||||||
@ -1043,18 +1042,43 @@ static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, co
|
|||||||
const U32 current = (U32)(ip-base);
|
const U32 current = (U32)(ip-base);
|
||||||
const U32 btLow = btMask >= current ? 0 : current - btMask;
|
const U32 btLow = btMask >= current ? 0 : current - btMask;
|
||||||
U32* smallerPtr = bt + 2*(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 */
|
U32 dummy32; /* to be nullified at the end */
|
||||||
const U32 windowLow = zc->lowLimit;
|
const U32 windowLow = zc->lowLimit;
|
||||||
U32 matchEndIdx = current+8;
|
U32 matchEndIdx = current+8;
|
||||||
|
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 */
|
hashTable[h] = current; /* Update Hash Table */
|
||||||
|
|
||||||
while (nbCompares-- && (matchIndex > windowLow))
|
while (nbCompares-- && (matchIndex > windowLow))
|
||||||
{
|
{
|
||||||
U32* nextPtr = bt + 2*(matchIndex & btMask);
|
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 */
|
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] + (predictPtr[1]>0);
|
||||||
|
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] + (predictPtr[0]>0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if ((!extDict) || (matchIndex+matchLength >= dictLimit))
|
if ((!extDict) || (matchIndex+matchLength >= dictLimit))
|
||||||
{
|
{
|
||||||
match = base + matchIndex;
|
match = base + matchIndex;
|
||||||
|
@ -44,10 +44,10 @@
|
|||||||
|
|
||||||
/*!
|
/*!
|
||||||
* LEGACY_SUPPORT :
|
* 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
|
#ifndef ZSTD_LEGACY_SUPPORT
|
||||||
# define ZSTD_LEGACY_SUPPORT 1
|
# define ZSTD_LEGACY_SUPPORT 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@ -799,7 +799,7 @@ size_t ZSTD_decompress(void* dst, size_t maxDstSize, const void* src, size_t src
|
|||||||
#else
|
#else
|
||||||
ZSTD_DCtx dctx;
|
ZSTD_DCtx dctx;
|
||||||
return ZSTD_decompressDCtx(&dctx, dst, maxDstSize, src, srcSize);
|
return ZSTD_decompressDCtx(&dctx, dst, maxDstSize, src, srcSize);
|
||||||
#endif // defined
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ extern "C" {
|
|||||||
* Includes
|
* Includes
|
||||||
***************************************/
|
***************************************/
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
#include "error.h"
|
#include "error_private.h"
|
||||||
|
|
||||||
|
|
||||||
/* *************************************
|
/* *************************************
|
||||||
|
@ -284,8 +284,8 @@ static const ZSTD_parameters ZSTD_defaultParameters[4][ZSTD_MAX_CLEVEL+1] = {
|
|||||||
/* W, C, H, S, L, strat */
|
/* W, C, H, S, L, strat */
|
||||||
{ 0, 17, 12, 12, 1, 4, ZSTD_fast }, /* level 0 - never used */
|
{ 0, 17, 12, 12, 1, 4, ZSTD_fast }, /* level 0 - never used */
|
||||||
{ 0, 17, 12, 13, 1, 6, ZSTD_fast }, /* level 1 */
|
{ 0, 17, 12, 13, 1, 6, ZSTD_fast }, /* level 1 */
|
||||||
{ 0, 17, 15, 16, 1, 5, ZSTD_fast }, /* level 2 */
|
{ 0, 17, 14, 16, 1, 5, ZSTD_fast }, /* level 2 */
|
||||||
{ 0, 17, 16, 17, 1, 5, ZSTD_fast }, /* level 3 */
|
{ 0, 17, 15, 17, 1, 5, ZSTD_fast }, /* level 3 */
|
||||||
{ 0, 17, 13, 15, 2, 4, ZSTD_greedy }, /* level 4 */
|
{ 0, 17, 13, 15, 2, 4, ZSTD_greedy }, /* level 4 */
|
||||||
{ 0, 17, 15, 17, 3, 4, ZSTD_greedy }, /* level 5 */
|
{ 0, 17, 15, 17, 3, 4, ZSTD_greedy }, /* level 5 */
|
||||||
{ 0, 17, 14, 17, 3, 4, ZSTD_lazy }, /* level 6 */
|
{ 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 */
|
/* W, C, H, S, L, strat */
|
||||||
{ 0, 0, 0, 0, 0, 0, ZSTD_fast }, /* level 0 - never used */
|
{ 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, 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, 5, 4, ZSTD_greedy }, /* level 3 */
|
||||||
{ 0, 14, 14, 14, 8, 4, ZSTD_greedy }, /* level 4 */
|
{ 0, 14, 14, 14, 8, 4, ZSTD_greedy }, /* level 4 */
|
||||||
{ 0, 14, 11, 14, 6, 4, ZSTD_lazy }, /* level 5 */
|
{ 0, 14, 11, 14, 6, 4, ZSTD_lazy }, /* level 5 */
|
||||||
@ -334,7 +334,7 @@ static const ZSTD_parameters ZSTD_defaultParameters[4][ZSTD_MAX_CLEVEL+1] = {
|
|||||||
/* *************************************
|
/* *************************************
|
||||||
* Error management
|
* Error management
|
||||||
***************************************/
|
***************************************/
|
||||||
#include "error.h"
|
#include "error_public.h"
|
||||||
|
|
||||||
|
|
||||||
#if defined (__cplusplus)
|
#if defined (__cplusplus)
|
||||||
|
@ -45,7 +45,7 @@ DESTDIR?=
|
|||||||
PREFIX ?= /usr/local
|
PREFIX ?= /usr/local
|
||||||
CPPFLAGS= -I../lib -DZSTD_VERSION=\"$(VERSION)\"
|
CPPFLAGS= -I../lib -DZSTD_VERSION=\"$(VERSION)\"
|
||||||
CFLAGS ?= -O3 # -falign-loops=32 # not always beneficial
|
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)
|
FLAGS = $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) $(MOREFLAGS)
|
||||||
|
|
||||||
BINDIR = $(PREFIX)/bin
|
BINDIR = $(PREFIX)/bin
|
||||||
|
@ -220,10 +220,12 @@ 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 size_t blockSize = (g_blockSize ? g_blockSize : srcSize) + (!srcSize); /* avoid div by 0 */
|
||||||
const U32 maxNbBlocks = (U32) ((srcSize + (blockSize-1)) / blockSize) + nbFiles;
|
const U32 maxNbBlocks = (U32) ((srcSize + (blockSize-1)) / blockSize) + nbFiles;
|
||||||
|
size_t largestBlockSize = 0;
|
||||||
blockParam_t* const blockTable = (blockParam_t*) malloc(maxNbBlocks * sizeof(blockParam_t));
|
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 */
|
const size_t maxCompressedSize = ZSTD_compressBound(srcSize) + (maxNbBlocks * 1024); /* add some room for safety */
|
||||||
void* const compressedBuffer = malloc(maxCompressedSize);
|
void* const compressedBuffer = malloc(maxCompressedSize);
|
||||||
void* const resultBuffer = malloc(srcSize);
|
void* const resultBuffer = malloc(srcSize);
|
||||||
|
ZSTD_CCtx* refCtx = ZSTD_createCCtx();
|
||||||
ZSTD_CCtx* ctx = ZSTD_createCCtx();
|
ZSTD_CCtx* ctx = ZSTD_createCCtx();
|
||||||
ZSTD_DCtx* dctx = ZSTD_createDCtx();
|
ZSTD_DCtx* dctx = ZSTD_createDCtx();
|
||||||
U64 crcOrig = XXH64(srcBuffer, srcSize, 0);
|
U64 crcOrig = XXH64(srcBuffer, srcSize, 0);
|
||||||
@ -233,7 +235,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize,
|
|||||||
if (strlen(displayName)>17) displayName += strlen(displayName)-17; /* can only display 17 characters */
|
if (strlen(displayName)>17) displayName += strlen(displayName)-17; /* can only display 17 characters */
|
||||||
|
|
||||||
/* Memory allocation & restrictions */
|
/* Memory allocation & restrictions */
|
||||||
if (!compressedBuffer || !resultBuffer || !blockTable || !ctx || !dctx)
|
if (!compressedBuffer || !resultBuffer || !blockTable || !refCtx || !ctx || !dctx)
|
||||||
EXM_THROW(31, "not enough memory");
|
EXM_THROW(31, "not enough memory");
|
||||||
|
|
||||||
/* Init blockTable data */
|
/* Init blockTable data */
|
||||||
@ -259,6 +261,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize,
|
|||||||
cPtr += blockTable[nbBlocks].cRoom;
|
cPtr += blockTable[nbBlocks].cRoom;
|
||||||
resPtr += thisBlockSize;
|
resPtr += thisBlockSize;
|
||||||
remaining -= thisBlockSize;
|
remaining -= thisBlockSize;
|
||||||
|
if (thisBlockSize > largestBlockSize) largestBlockSize = thisBlockSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -291,12 +294,27 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize,
|
|||||||
milliTime = BMK_GetMilliStart();
|
milliTime = BMK_GetMilliStart();
|
||||||
while (BMK_GetMilliSpan(milliTime) < TIMELOOP)
|
while (BMK_GetMilliSpan(milliTime) < TIMELOOP)
|
||||||
{
|
{
|
||||||
|
ZSTD_compressBegin_advanced(refCtx, ZSTD_getParams(cLevel, dictBufferSize+largestBlockSize));
|
||||||
|
ZSTD_compress_insertDictionary(refCtx, dictBuffer, dictBufferSize);
|
||||||
for (blockNb=0; blockNb<nbBlocks; blockNb++)
|
for (blockNb=0; blockNb<nbBlocks; blockNb++)
|
||||||
blockTable[blockNb].cSize = ZSTD_compress_usingDict(ctx,
|
{
|
||||||
|
ZSTD_duplicateCCtx(ctx, refCtx);
|
||||||
|
size_t rSize = ZSTD_compressContinue(ctx,
|
||||||
|
blockTable[blockNb].cPtr, blockTable[blockNb].cRoom,
|
||||||
|
blockTable[blockNb].srcPtr,blockTable[blockNb].srcSize);
|
||||||
|
if (ZSTD_isError(rSize)) EXM_THROW(1, "ZSTD_compressContinue() failed : %s", ZSTD_getErrorName(rSize));
|
||||||
|
blockTable[blockNb].cSize = rSize;
|
||||||
|
rSize = ZSTD_compressEnd(ctx,
|
||||||
|
blockTable[blockNb].cPtr + rSize,
|
||||||
|
blockTable[blockNb].cRoom - rSize);
|
||||||
|
if (ZSTD_isError(rSize)) EXM_THROW(2, "ZSTD_compressEnd() failed : %s", ZSTD_getErrorName(rSize));
|
||||||
|
blockTable[blockNb].cSize += rSize;
|
||||||
|
}
|
||||||
|
/*blockTable[blockNb].cSize = ZSTD_compress_usingDict(ctx,
|
||||||
blockTable[blockNb].cPtr, blockTable[blockNb].cRoom,
|
blockTable[blockNb].cPtr, blockTable[blockNb].cRoom,
|
||||||
blockTable[blockNb].srcPtr,blockTable[blockNb].srcSize,
|
blockTable[blockNb].srcPtr,blockTable[blockNb].srcSize,
|
||||||
dictBuffer, dictBufferSize,
|
dictBuffer, dictBufferSize,
|
||||||
cLevel);
|
cLevel);*/
|
||||||
nbLoops++;
|
nbLoops++;
|
||||||
}
|
}
|
||||||
milliTime = BMK_GetMilliSpan(milliTime);
|
milliTime = BMK_GetMilliSpan(milliTime);
|
||||||
@ -333,14 +351,21 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize,
|
|||||||
crcCheck = XXH64(resultBuffer, srcSize, 0);
|
crcCheck = XXH64(resultBuffer, srcSize, 0);
|
||||||
if (crcOrig!=crcCheck)
|
if (crcOrig!=crcCheck)
|
||||||
{
|
{
|
||||||
unsigned u;
|
size_t u;
|
||||||
unsigned eBlockSize = (unsigned)(MIN(65536*2, blockSize));
|
|
||||||
DISPLAY("\n!!! WARNING !!! %14s : Invalid Checksum : %x != %x\n", displayName, (unsigned)crcOrig, (unsigned)crcCheck);
|
DISPLAY("\n!!! WARNING !!! %14s : Invalid Checksum : %x != %x\n", displayName, (unsigned)crcOrig, (unsigned)crcCheck);
|
||||||
for (u=0; u<srcSize; u++)
|
for (u=0; u<srcSize; u++)
|
||||||
{
|
{
|
||||||
if (((const BYTE*)srcBuffer)[u] != ((const BYTE*)resultBuffer)[u])
|
if (((const BYTE*)srcBuffer)[u] != ((const BYTE*)resultBuffer)[u])
|
||||||
{
|
{
|
||||||
printf("Decoding error at pos %u (block %u, pos %u) \n", u, u / eBlockSize, u % eBlockSize);
|
U32 bn;
|
||||||
|
size_t bacc = 0;
|
||||||
|
printf("Decoding error at pos %u ", (U32)u);
|
||||||
|
for (bn = 0; bn < nbBlocks; bn++)
|
||||||
|
{
|
||||||
|
if (bacc + blockTable[bn].srcSize > u) break;
|
||||||
|
bacc += blockTable[bn].srcSize;
|
||||||
|
}
|
||||||
|
printf("(block %u, pos %u) \n", bn, (U32)(u - bacc));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -358,6 +383,7 @@ static int BMK_benchMem(const void* srcBuffer, size_t srcSize,
|
|||||||
/* clean up */
|
/* clean up */
|
||||||
free(compressedBuffer);
|
free(compressedBuffer);
|
||||||
free(resultBuffer);
|
free(resultBuffer);
|
||||||
|
ZSTD_freeCCtx(refCtx);
|
||||||
ZSTD_freeCCtx(ctx);
|
ZSTD_freeCCtx(ctx);
|
||||||
ZSTD_freeDCtx(dctx);
|
ZSTD_freeDCtx(dctx);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -185,13 +185,13 @@ static int basicUnitTests(U32 seed, double compressibility)
|
|||||||
DISPLAYLEVEL(4, "test%3i : decompress with 1 missing byte : ", testNb++);
|
DISPLAYLEVEL(4, "test%3i : decompress with 1 missing byte : ", testNb++);
|
||||||
result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, compressedBuffer, cSize-1);
|
result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, compressedBuffer, cSize-1);
|
||||||
if (!ZSTD_isError(result)) goto _output_error;
|
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, "OK \n");
|
||||||
|
|
||||||
DISPLAYLEVEL(4, "test%3i : decompress with 1 too much byte : ", testNb++);
|
DISPLAYLEVEL(4, "test%3i : decompress with 1 too much byte : ", testNb++);
|
||||||
result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, compressedBuffer, cSize+1);
|
result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, compressedBuffer, cSize+1);
|
||||||
if (!ZSTD_isError(result)) goto _output_error;
|
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, "OK \n");
|
||||||
|
|
||||||
/* Dictionary and Duplication tests */
|
/* 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++);
|
DISPLAYLEVEL(4, "test%3i : Check input length for magic number : ", testNb++);
|
||||||
result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, CNBuffer, 3);
|
result = ZSTD_decompress(decodedBuffer, COMPRESSIBLE_NOISE_LENGTH, CNBuffer, 3);
|
||||||
if (!ZSTD_isError(result)) goto _output_error;
|
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, "OK \n");
|
||||||
|
|
||||||
DISPLAYLEVEL(4, "test%3i : Check magic Number : ", testNb++);
|
DISPLAYLEVEL(4, "test%3i : Check magic Number : ", testNb++);
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ClInclude Include="..\..\..\lib\bitstream.h" />
|
<ClInclude Include="..\..\..\lib\bitstream.h" />
|
||||||
<ClInclude Include="..\..\..\lib\error.h" />
|
|
||||||
<ClInclude Include="..\..\..\lib\fse.h" />
|
<ClInclude Include="..\..\..\lib\fse.h" />
|
||||||
<ClInclude Include="..\..\..\lib\fse_static.h" />
|
<ClInclude Include="..\..\..\lib\fse_static.h" />
|
||||||
<ClInclude Include="..\..\..\lib\huff0.h" />
|
<ClInclude Include="..\..\..\lib\huff0.h" />
|
||||||
|
@ -53,9 +53,6 @@
|
|||||||
<ClInclude Include="resource.h">
|
<ClInclude Include="resource.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\..\..\lib\error.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\..\..\lib\bitstream.h">
|
<ClInclude Include="..\..\..\lib\bitstream.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user