diff options
| author | Baptiste Daroussin <bapt@FreeBSD.org> | 2017-05-06 10:17:59 +0000 | 
|---|---|---|
| committer | Baptiste Daroussin <bapt@FreeBSD.org> | 2017-05-06 10:17:59 +0000 | 
| commit | ffcbc2d7ba03067492045e4cbead519a3b3c27ef (patch) | |
| tree | df436f4253158a7d5a4875e54cd7d273dd5334a6 /lib/common | |
| parent | ab984b3e51d32af796fe89e130f57bf58b8a14b2 (diff) | |
Notes
Diffstat (limited to 'lib/common')
| -rw-r--r-- | lib/common/bitstream.h | 83 | ||||
| -rw-r--r-- | lib/common/error_private.c | 3 | ||||
| -rw-r--r-- | lib/common/fse.h | 10 | ||||
| -rw-r--r-- | lib/common/huf.h | 61 | ||||
| -rw-r--r-- | lib/common/mem.h | 5 | ||||
| -rw-r--r-- | lib/common/zstd_errors.h | 1 | ||||
| -rw-r--r-- | lib/common/zstd_internal.h | 5 | 
7 files changed, 113 insertions, 55 deletions
| diff --git a/lib/common/bitstream.h b/lib/common/bitstream.h index d3873002ebd1..ca42850df324 100644 --- a/lib/common/bitstream.h +++ b/lib/common/bitstream.h @@ -2,7 +2,7 @@     bitstream     Part of FSE library     header file (to include) -   Copyright (C) 2013-2016, Yann Collet. +   Copyright (C) 2013-2017, Yann Collet.     BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) @@ -53,6 +53,16 @@ extern "C" {  #include "error_private.h"  /* error codes and messages */ +/*-************************************* +*  Debug +***************************************/ +#if defined(BIT_DEBUG) && (BIT_DEBUG>=1) +#  include <assert.h> +#else +#  define assert(condition) ((void)0) +#endif + +  /*=========================================  *  Target specific  =========================================*/ @@ -74,7 +84,7 @@ extern "C" {  typedef struct  {      size_t bitContainer; -    int    bitPos; +    unsigned bitPos;      char*  startPtr;      char*  ptr;      char*  endPtr; @@ -112,6 +122,7 @@ typedef struct      unsigned bitsConsumed;      const char* ptr;      const char* start; +    const char* limitPtr;  } BIT_DStream_t;  typedef enum { BIT_DStream_unfinished = 0, @@ -163,7 +174,10 @@ MEM_STATIC unsigned BIT_highbit32 (register U32 val)  #   elif defined(__GNUC__) && (__GNUC__ >= 3)   /* Use GCC Intrinsic */      return 31 - __builtin_clz (val);  #   else   /* Software version */ -    static const unsigned DeBruijnClz[32] = { 0, 9, 1, 10, 13, 21, 2, 29, 11, 14, 16, 18, 22, 25, 3, 30, 8, 12, 20, 28, 15, 17, 24, 7, 19, 27, 23, 6, 26, 5, 4, 31 }; +    static const unsigned DeBruijnClz[32] = { 0,  9,  1, 10, 13, 21,  2, 29, +                                             11, 14, 16, 18, 22, 25,  3, 30, +                                              8, 12, 20, 28, 15, 17, 24,  7, +                                             19, 27, 23,  6, 26,  5,  4, 31 };      U32 v = val;      v |= v >> 1;      v |= v >> 2; @@ -175,31 +189,36 @@ MEM_STATIC unsigned BIT_highbit32 (register U32 val)  }  /*=====    Local Constants   =====*/ -static const unsigned BIT_mask[] = { 0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF,  0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF };   /* up to 26 bits */ +static const unsigned BIT_mask[] = { 0, 1, 3, 7, 0xF, 0x1F, 0x3F, 0x7F, +                                    0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF, 0x1FFF, 0x3FFF, 0x7FFF, +                                    0xFFFF, 0x1FFFF, 0x3FFFF, 0x7FFFF, 0xFFFFF, 0x1FFFFF, 0x3FFFFF, 0x7FFFFF, +                                    0xFFFFFF, 0x1FFFFFF, 0x3FFFFFF };   /* up to 26 bits */  /*-**************************************************************  *  bitStream encoding  ****************************************************************/  /*! BIT_initCStream() : - *  `dstCapacity` must be > sizeof(void*) + *  `dstCapacity` must be > sizeof(size_t)   *  @return : 0 if success,                otherwise an error code (can be tested using ERR_isError() ) */ -MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, void* startPtr, size_t dstCapacity) +MEM_STATIC size_t BIT_initCStream(BIT_CStream_t* bitC, +                                  void* startPtr, size_t dstCapacity)  {      bitC->bitContainer = 0;      bitC->bitPos = 0;      bitC->startPtr = (char*)startPtr;      bitC->ptr = bitC->startPtr; -    bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->ptr); -    if (dstCapacity <= sizeof(bitC->ptr)) return ERROR(dstSize_tooSmall); +    bitC->endPtr = bitC->startPtr + dstCapacity - sizeof(bitC->bitContainer); +    if (dstCapacity <= sizeof(bitC->bitContainer)) return ERROR(dstSize_tooSmall);      return 0;  }  /*! BIT_addBits() :      can add up to 26 bits into `bitC`.      Does not check for register overflow ! */ -MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, size_t value, unsigned nbBits) +MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, +                            size_t value, unsigned nbBits)  {      bitC->bitContainer |= (value & BIT_mask[nbBits]) << bitC->bitPos;      bitC->bitPos += nbBits; @@ -207,34 +226,42 @@ MEM_STATIC void BIT_addBits(BIT_CStream_t* bitC, size_t value, unsigned nbBits)  /*! BIT_addBitsFast() :   *  works only if `value` is _clean_, meaning all high bits above nbBits are 0 */ -MEM_STATIC void BIT_addBitsFast(BIT_CStream_t* bitC, size_t value, unsigned nbBits) +MEM_STATIC void BIT_addBitsFast(BIT_CStream_t* bitC, +                                size_t value, unsigned nbBits)  { +    assert((value>>nbBits) == 0);      bitC->bitContainer |= value << bitC->bitPos;      bitC->bitPos += nbBits;  }  /*! BIT_flushBitsFast() : + *  assumption : bitContainer has not overflowed   *  unsafe version; does not check buffer overflow */  MEM_STATIC void BIT_flushBitsFast(BIT_CStream_t* bitC)  {      size_t const nbBytes = bitC->bitPos >> 3; +    assert( bitC->bitPos <= (sizeof(bitC->bitContainer)*8) );      MEM_writeLEST(bitC->ptr, bitC->bitContainer);      bitC->ptr += nbBytes; +    assert(bitC->ptr <= bitC->endPtr);      bitC->bitPos &= 7; -    bitC->bitContainer >>= nbBytes*8;   /* if bitPos >= sizeof(bitContainer)*8 --> undefined behavior */ +    bitC->bitContainer >>= nbBytes*8;  }  /*! BIT_flushBits() : + *  assumption : bitContainer has not overflowed   *  safe version; check for buffer overflow, and prevents it. - *  note : does not signal buffer overflow. This will be revealed later on using BIT_closeCStream() */ + *  note : does not signal buffer overflow. + *  overflow will be revealed later on using BIT_closeCStream() */  MEM_STATIC void BIT_flushBits(BIT_CStream_t* bitC)  {      size_t const nbBytes = bitC->bitPos >> 3; +    assert( bitC->bitPos <= (sizeof(bitC->bitContainer)*8) );      MEM_writeLEST(bitC->ptr, bitC->bitContainer);      bitC->ptr += nbBytes;      if (bitC->ptr > bitC->endPtr) bitC->ptr = bitC->endPtr;      bitC->bitPos &= 7; -    bitC->bitContainer >>= nbBytes*8;   /* if bitPos >= sizeof(bitContainer)*8 --> undefined behavior */ +    bitC->bitContainer >>= nbBytes*8;  }  /*! BIT_closeCStream() : @@ -244,9 +271,7 @@ MEM_STATIC size_t BIT_closeCStream(BIT_CStream_t* bitC)  {      BIT_addBitsFast(bitC, 1, 1);   /* endMark */      BIT_flushBits(bitC); - -    if (bitC->ptr >= bitC->endPtr) return 0; /* doesn't fit within authorized budget : cancel */ - +    if (bitC->ptr >= bitC->endPtr) return 0; /* overflow detected */      return (bitC->ptr - bitC->startPtr) + (bitC->bitPos > 0);  } @@ -264,15 +289,16 @@ MEM_STATIC size_t BIT_initDStream(BIT_DStream_t* bitD, const void* srcBuffer, si  {      if (srcSize < 1) { memset(bitD, 0, sizeof(*bitD)); return ERROR(srcSize_wrong); } +    bitD->start = (const char*)srcBuffer; +    bitD->limitPtr = bitD->start + sizeof(bitD->bitContainer); +      if (srcSize >=  sizeof(bitD->bitContainer)) {  /* normal case */ -        bitD->start = (const char*)srcBuffer;          bitD->ptr   = (const char*)srcBuffer + srcSize - sizeof(bitD->bitContainer);          bitD->bitContainer = MEM_readLEST(bitD->ptr);          { BYTE const lastByte = ((const BYTE*)srcBuffer)[srcSize-1];            bitD->bitsConsumed = lastByte ? 8 - BIT_highbit32(lastByte) : 0;  /* ensures bitsConsumed is always set */            if (lastByte == 0) return ERROR(GENERIC); /* endMark not present */ }      } else { -        bitD->start = (const char*)srcBuffer;          bitD->ptr   = bitD->start;          bitD->bitContainer = *(const BYTE*)(bitD->start);          switch(srcSize) @@ -330,17 +356,18 @@ MEM_STATIC size_t BIT_getLowerBits(size_t bitContainer, U32 const nbBits)  #if defined(__BMI__) && defined(__GNUC__)   /* experimental; fails if bitD->bitsConsumed + nbBits > sizeof(bitD->bitContainer)*8 */      return BIT_getMiddleBits(bitD->bitContainer, (sizeof(bitD->bitContainer)*8) - bitD->bitsConsumed - nbBits, nbBits);  #else -    U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1; -    return ((bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> 1) >> ((bitMask-nbBits) & bitMask); +    U32 const regMask = sizeof(bitD->bitContainer)*8 - 1; +    return ((bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> 1) >> ((regMask-nbBits) & regMask);  #endif  }  /*! BIT_lookBitsFast() : -*   unsafe version; only works only if nbBits >= 1 */ + *  unsafe version; only works if nbBits >= 1 */  MEM_STATIC size_t BIT_lookBitsFast(const BIT_DStream_t* bitD, U32 nbBits)  { -    U32 const bitMask = sizeof(bitD->bitContainer)*8 - 1; -    return (bitD->bitContainer << (bitD->bitsConsumed & bitMask)) >> (((bitMask+1)-nbBits) & bitMask); +    U32 const regMask = sizeof(bitD->bitContainer)*8 - 1; +    assert(nbBits >= 1); +    return (bitD->bitContainer << (bitD->bitsConsumed & regMask)) >> (((regMask+1)-nbBits) & regMask);  }  MEM_STATIC void BIT_skipBits(BIT_DStream_t* bitD, U32 nbBits) @@ -365,6 +392,7 @@ MEM_STATIC size_t BIT_readBits(BIT_DStream_t* bitD, U32 nbBits)  MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)  {      size_t const value = BIT_lookBitsFast(bitD, nbBits); +    assert(nbBits >= 1);      BIT_skipBits(bitD, nbBits);      return value;  } @@ -376,10 +404,10 @@ MEM_STATIC size_t BIT_readBitsFast(BIT_DStream_t* bitD, U32 nbBits)                if status == BIT_DStream_unfinished, internal register is filled with >= (sizeof(bitD->bitContainer)*8 - 7) bits */  MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)  { -	if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8))  /* should not happen => corruption detected */ -		return BIT_DStream_overflow; +    if (bitD->bitsConsumed > (sizeof(bitD->bitContainer)*8))  /* overflow detected, like end of stream */ +        return BIT_DStream_overflow; -    if (bitD->ptr >= bitD->start + sizeof(bitD->bitContainer)) { +    if (bitD->ptr >= bitD->limitPtr) {          bitD->ptr -= bitD->bitsConsumed >> 3;          bitD->bitsConsumed &= 7;          bitD->bitContainer = MEM_readLEST(bitD->ptr); @@ -389,6 +417,7 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)          if (bitD->bitsConsumed < sizeof(bitD->bitContainer)*8) return BIT_DStream_endOfBuffer;          return BIT_DStream_completed;      } +    /* start < ptr < limitPtr */      {   U32 nbBytes = bitD->bitsConsumed >> 3;          BIT_DStream_status result = BIT_DStream_unfinished;          if (bitD->ptr - nbBytes < bitD->start) { @@ -397,7 +426,7 @@ MEM_STATIC BIT_DStream_status BIT_reloadDStream(BIT_DStream_t* bitD)          }          bitD->ptr -= nbBytes;          bitD->bitsConsumed -= nbBytes*8; -        bitD->bitContainer = MEM_readLEST(bitD->ptr);   /* reminder : srcSize > sizeof(bitD) */ +        bitD->bitContainer = MEM_readLEST(bitD->ptr);   /* reminder : srcSize > sizeof(bitD->bitContainer), otherwise bitD->ptr == bitD->start */          return result;      }  } diff --git a/lib/common/error_private.c b/lib/common/error_private.c index a0fa1724aee8..b3287245f1ee 100644 --- a/lib/common/error_private.c +++ b/lib/common/error_private.c @@ -29,7 +29,7 @@ const char* ERR_getErrorString(ERR_enum code)      case PREFIX(memory_allocation): return "Allocation error : not enough memory";      case PREFIX(stage_wrong): return "Operation not authorized at current processing stage";      case PREFIX(dstSize_tooSmall): return "Destination buffer is too small"; -    case PREFIX(srcSize_wrong): return "Src size incorrect"; +    case PREFIX(srcSize_wrong): return "Src size is incorrect";      case PREFIX(corruption_detected): return "Corrupted block detected";      case PREFIX(checksum_wrong): return "Restored data doesn't match checksum";      case PREFIX(tableLog_tooLarge): return "tableLog requires too much memory : unsupported"; @@ -37,6 +37,7 @@ const char* ERR_getErrorString(ERR_enum code)      case PREFIX(maxSymbolValue_tooSmall): return "Specified maxSymbolValue is too small";      case PREFIX(dictionary_corrupted): return "Dictionary is corrupted";      case PREFIX(dictionary_wrong): return "Dictionary mismatch"; +    case PREFIX(dictionaryCreation_failed): return "Cannot create Dictionary from provided samples";      case PREFIX(maxCode):      default: return notErrorCode;      } diff --git a/lib/common/fse.h b/lib/common/fse.h index baac39032675..6d5d41def19b 100644 --- a/lib/common/fse.h +++ b/lib/common/fse.h @@ -316,6 +316,10 @@ If there is an error, the function will return an error code, which can be teste  #define FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue)   (1 + (1<<(maxTableLog-1)) + ((maxSymbolValue+1)*2))  #define FSE_DTABLE_SIZE_U32(maxTableLog)                   (1 + (1<<maxTableLog)) +/* or use the size to malloc() space directly. Pay attention to alignment restrictions though */ +#define FSE_CTABLE_SIZE(maxTableLog, maxSymbolValue)   (FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) * sizeof(FSE_CTable)) +#define FSE_DTABLE_SIZE(maxTableLog)                   (FSE_DTABLE_SIZE_U32(maxTableLog) * sizeof(FSE_DTable)) +  /* *****************************************  *  FSE advanced API @@ -353,7 +357,7 @@ unsigned FSE_optimalTableLog_internal(unsigned maxTableLog, size_t srcSize, unsi   * Same as FSE_compress2(), but using an externally allocated scratch buffer (`workSpace`).   * FSE_WKSP_SIZE_U32() provides the minimum size required for `workSpace` as a table of FSE_CTable.   */ -#define FSE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue)   ( FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) + (1<<((maxTableLog>2)?(maxTableLog-2):0)) ) +#define FSE_WKSP_SIZE_U32(maxTableLog, maxSymbolValue)   ( FSE_CTABLE_SIZE_U32(maxTableLog, maxSymbolValue) + ((maxTableLog > 12) ? (1 << (maxTableLog - 2)) : 1024) )  size_t FSE_compress_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);  size_t FSE_buildCTable_raw (FSE_CTable* ct, unsigned nbBits); @@ -550,9 +554,9 @@ MEM_STATIC void FSE_initCState2(FSE_CState_t* statePtr, const FSE_CTable* ct, U3  MEM_STATIC void FSE_encodeSymbol(BIT_CStream_t* bitC, FSE_CState_t* statePtr, U32 symbol)  { -    const FSE_symbolCompressionTransform symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol]; +    FSE_symbolCompressionTransform const symbolTT = ((const FSE_symbolCompressionTransform*)(statePtr->symbolTT))[symbol];      const U16* const stateTable = (const U16*)(statePtr->stateTable); -    U32 nbBitsOut  = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16); +    U32 const nbBitsOut  = (U32)((statePtr->value + symbolTT.deltaNbBits) >> 16);      BIT_addBits(bitC, statePtr->value, nbBitsOut);      statePtr->value = stateTable[ (statePtr->value >> nbBitsOut) + symbolTT.deltaFindState];  } diff --git a/lib/common/huf.h b/lib/common/huf.h index e5572760a548..7873ca3d42a5 100644 --- a/lib/common/huf.h +++ b/lib/common/huf.h @@ -43,6 +43,21 @@ extern "C" {  #include <stddef.h>    /* size_t */ +/* *** library symbols visibility *** */ +/* Note : when linking with -fvisibility=hidden on gcc, or by default on Visual, + *        HUF symbols remain "private" (internal symbols for library only). + *        Set macro FSE_DLL_EXPORT to 1 if you want HUF symbols visible on DLL interface */ +#if defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1) && defined(__GNUC__) && (__GNUC__ >= 4) +#  define HUF_PUBLIC_API __attribute__ ((visibility ("default"))) +#elif defined(FSE_DLL_EXPORT) && (FSE_DLL_EXPORT==1)   /* Visual expected */ +#  define HUF_PUBLIC_API __declspec(dllexport) +#elif defined(FSE_DLL_IMPORT) && (FSE_DLL_IMPORT==1) +#  define HUF_PUBLIC_API __declspec(dllimport)  /* not required, just to generate faster code (saves a function pointer load from IAT and an indirect jump) */ +#else +#  define HUF_PUBLIC_API +#endif + +  /* *** simple functions *** */  /**  HUF_compress() : @@ -55,8 +70,8 @@ HUF_compress() :                       if return == 1, srcData is a single repeated byte symbol (RLE compression).                       if HUF_isError(return), compression failed (more details using HUF_getErrorName())  */ -size_t HUF_compress(void* dst, size_t dstCapacity, -              const void* src, size_t srcSize); +HUF_PUBLIC_API size_t HUF_compress(void* dst, size_t dstCapacity, +                             const void* src, size_t srcSize);  /**  HUF_decompress() : @@ -69,32 +84,42 @@ HUF_decompress() :      @return : size of regenerated data (== originalSize),                or an error code, which can be tested using HUF_isError()  */ -size_t HUF_decompress(void* dst,  size_t originalSize, -                const void* cSrc, size_t cSrcSize); +HUF_PUBLIC_API size_t HUF_decompress(void* dst,  size_t originalSize, +                               const void* cSrc, size_t cSrcSize);  /* ***   Tool functions *** */ -#define HUF_BLOCKSIZE_MAX (128 * 1024)       /**< maximum input size for a single block compressed with HUF_compress */ -size_t HUF_compressBound(size_t size);       /**< maximum compressed size (worst case) */ +#define HUF_BLOCKSIZE_MAX (128 * 1024)                  /**< maximum input size for a single block compressed with HUF_compress */ +HUF_PUBLIC_API size_t HUF_compressBound(size_t size);   /**< maximum compressed size (worst case) */  /* Error Management */ -unsigned    HUF_isError(size_t code);        /**< tells if a return value is an error code */ -const char* HUF_getErrorName(size_t code);   /**< provides error code string (useful for debugging) */ +HUF_PUBLIC_API unsigned    HUF_isError(size_t code);       /**< tells if a return value is an error code */ +HUF_PUBLIC_API const char* HUF_getErrorName(size_t code);  /**< provides error code string (useful for debugging) */  /* ***   Advanced function   *** */  /** HUF_compress2() : - *   Same as HUF_compress(), but offers direct control over `maxSymbolValue` and `tableLog` . - *   `tableLog` must be `<= HUF_TABLELOG_MAX` . */ -size_t HUF_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog); + *  Same as HUF_compress(), but offers direct control over `maxSymbolValue` and `tableLog`. + *  `tableLog` must be `<= HUF_TABLELOG_MAX` . */ +HUF_PUBLIC_API size_t HUF_compress2 (void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog);  /** HUF_compress4X_wksp() : -*   Same as HUF_compress2(), but uses externally allocated `workSpace`, which must be a table of >= 1024 unsigned */ -size_t HUF_compress4X_wksp (void* dst, size_t dstSize, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize);  /**< `workSpace` must be a table of at least HUF_WORKSPACE_SIZE_U32 unsigned */ + *  Same as HUF_compress2(), but uses externally allocated `workSpace`. + *  `workspace` must have minimum alignment of 4, and be at least as large as following macro */ +#define HUF_WORKSPACE_SIZE (6 << 10) +#define HUF_WORKSPACE_SIZE_U32 (HUF_WORKSPACE_SIZE / sizeof(U32)) +HUF_PUBLIC_API size_t HUF_compress4X_wksp (void* dst, size_t dstCapacity, const void* src, size_t srcSize, unsigned maxSymbolValue, unsigned tableLog, void* workSpace, size_t wkspSize); +/* ****************************************************************** + *  WARNING !! + *  The following section contains advanced and experimental definitions + *  which shall never be used in the context of dll + *  because they are not guaranteed to remain stable in the future. + *  Only consider them in association with static linking. + *******************************************************************/  #ifdef HUF_STATIC_LINKING_ONLY  /* *** Dependencies *** */ @@ -117,12 +142,14 @@ size_t HUF_compress4X_wksp (void* dst, size_t dstSize, const void* src, size_t s  ******************************************/  /* HUF buffer bounds */  #define HUF_CTABLEBOUND 129 -#define HUF_BLOCKBOUND(size) (size + (size>>8) + 8)   /* only true if incompressible pre-filtered with fast heuristic */ +#define HUF_BLOCKBOUND(size) (size + (size>>8) + 8)   /* only true when incompressible is pre-filtered with fast heuristic */  #define HUF_COMPRESSBOUND(size) (HUF_CTABLEBOUND + HUF_BLOCKBOUND(size))   /* Macro version, useful for static allocation */  /* static allocation of HUF's Compression Table */ +#define HUF_CTABLE_SIZE_U32(maxSymbolValue)   ((maxSymbolValue)+1)   /* Use tables of U32, for proper alignment */ +#define HUF_CTABLE_SIZE(maxSymbolValue)       (HUF_CTABLE_SIZE_U32(maxSymbolValue) * sizeof(U32))  #define HUF_CREATE_STATIC_CTABLE(name, maxSymbolValue) \ -    U32 name##hb[maxSymbolValue+1]; \ +    U32 name##hb[HUF_CTABLE_SIZE_U32(maxSymbolValue)]; \      void* name##hv = &(name##hb); \      HUF_CElt* name = (HUF_CElt*)(name##hv)   /* no final ; */ @@ -134,10 +161,6 @@ typedef U32 HUF_DTable;  #define HUF_CREATE_STATIC_DTABLEX4(DTable, maxTableLog) \          HUF_DTable DTable[HUF_DTABLE_SIZE(maxTableLog)] = { ((U32)(maxTableLog) * 0x01000001) } -/* The workspace must have alignment at least 4 and be at least this large */ -#define HUF_WORKSPACE_SIZE (6 << 10) -#define HUF_WORKSPACE_SIZE_U32 (HUF_WORKSPACE_SIZE / sizeof(U32)) -  /* ****************************************  *  Advanced decompression functions diff --git a/lib/common/mem.h b/lib/common/mem.h index 3cacd216aa02..4773a8b9309e 100644 --- a/lib/common/mem.h +++ b/lib/common/mem.h @@ -89,8 +89,7 @@ MEM_STATIC void MEM_check(void) { MEM_STATIC_ASSERT((sizeof(size_t)==4) || (size  #ifndef MEM_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */  #  if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )  #    define MEM_FORCE_MEMORY_ACCESS 2 -#  elif defined(__INTEL_COMPILER) /*|| defined(_MSC_VER)*/ || \ -  (defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) )) +#  elif defined(__INTEL_COMPILER) || defined(__GNUC__)  #    define MEM_FORCE_MEMORY_ACCESS 1  #  endif  #endif @@ -122,7 +121,7 @@ MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; }  /* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */  /* currently only defined for gcc and icc */  #if defined(_MSC_VER) || (defined(__INTEL_COMPILER) && defined(WIN32)) -	__pragma( pack(push, 1) ) +    __pragma( pack(push, 1) )      typedef union { U16 u16; U32 u32; U64 u64; size_t st; } unalign;      __pragma( pack(pop) )  #else diff --git a/lib/common/zstd_errors.h b/lib/common/zstd_errors.h index 949dbd0fffac..3d579d969363 100644 --- a/lib/common/zstd_errors.h +++ b/lib/common/zstd_errors.h @@ -57,6 +57,7 @@ typedef enum {    ZSTD_error_maxSymbolValue_tooSmall,    ZSTD_error_dictionary_corrupted,    ZSTD_error_dictionary_wrong, +  ZSTD_error_dictionaryCreation_failed,    ZSTD_error_maxCode  } ZSTD_ErrorCode; diff --git a/lib/common/zstd_internal.h b/lib/common/zstd_internal.h index 5c5b28732975..2533333ba83c 100644 --- a/lib/common/zstd_internal.h +++ b/lib/common/zstd_internal.h @@ -16,9 +16,9 @@  #ifdef _MSC_VER    /* Visual Studio */  #  define FORCE_INLINE static __forceinline  #  include <intrin.h>                    /* For Visual 2005 */ +#  pragma warning(disable : 4100)        /* disable: C4100: unreferenced formal parameter */  #  pragma warning(disable : 4127)        /* disable: C4127: conditional expression is constant */  #  pragma warning(disable : 4324)        /* disable: C4324: padded structure */ -#  pragma warning(disable : 4100)        /* disable: C4100: unreferenced formal parameter */  #else  #  if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* C99 */  #    ifdef __GNUC__ @@ -58,6 +58,8 @@  /*-*************************************  *  shared macros  ***************************************/ +#undef MIN +#undef MAX  #define MIN(a,b) ((a)<(b) ? (a) : (b))  #define MAX(a,b) ((a)>(b) ? (a) : (b))  #define CHECK_F(f) { size_t const errcod = f; if (ERR_isError(errcod)) return errcod; }  /* check and Forward error code */ @@ -104,7 +106,6 @@ typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingTy  #define LONGNBSEQ 0x7F00  #define MINMATCH 3 -#define EQUAL_READ32 4  #define Litbits  8  #define MaxLit ((1<<Litbits) - 1) | 
