2 * Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
5 * This source code is licensed under the BSD-style license found in the
6 * LICENSE file in the root directory of this source tree. An additional grant
7 * of patent rights can be found in the PATENTS file in the same directory.
10 #ifndef ZSTD_CCOMMON_H_MODULE
11 #define ZSTD_CCOMMON_H_MODULE
13 /*-*******************************************************
15 *********************************************************/
16 #ifdef _MSC_VER /* Visual Studio */
17 # define FORCE_INLINE static __forceinline
18 # include <intrin.h> /* For Visual 2005 */
19 # pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
20 # pragma warning(disable : 4324) /* disable: C4324: padded structure */
21 # pragma warning(disable : 4100) /* disable: C4100: unreferenced formal parameter */
23 # if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
25 # define FORCE_INLINE static inline __attribute__((always_inline))
27 # define FORCE_INLINE static inline
30 # define FORCE_INLINE static
31 # endif /* __STDC_VERSION__ */
35 # define FORCE_NOINLINE static __declspec(noinline)
38 # define FORCE_NOINLINE static __attribute__((__noinline__))
40 # define FORCE_NOINLINE static
45 /*-*************************************
47 ***************************************/
49 #include "error_private.h"
50 #define ZSTD_STATIC_LINKING_ONLY
52 #ifndef XXH_STATIC_LINKING_ONLY
53 # define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
55 #include "xxhash.h" /* XXH_reset, update, digest */
58 /*-*************************************
60 ***************************************/
61 #define MIN(a,b) ((a)<(b) ? (a) : (b))
62 #define MAX(a,b) ((a)>(b) ? (a) : (b))
63 #define CHECK_F(f) { size_t const errcod = f; if (ERR_isError(errcod)) return errcod; } /* check and Forward error code */
64 #define CHECK_E(f, e) { size_t const errcod = f; if (ERR_isError(errcod)) return ERROR(e); } /* check and send Error code */
67 /*-*************************************
69 ***************************************/
70 #define ZSTD_OPT_NUM (1<<12)
71 #define ZSTD_DICT_MAGIC 0xEC30A437 /* v0.7+ */
73 #define ZSTD_REP_NUM 3 /* number of repcodes */
74 #define ZSTD_REP_CHECK (ZSTD_REP_NUM) /* number of repcodes to check by the optimal parser */
75 #define ZSTD_REP_MOVE (ZSTD_REP_NUM-1)
76 #define ZSTD_REP_MOVE_OPT (ZSTD_REP_NUM)
77 static const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
90 #define ZSTD_WINDOWLOG_ABSOLUTEMIN 10
91 static const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 };
92 static const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 };
94 #define ZSTD_BLOCKHEADERSIZE 3 /* C standard doesn't allow `static const` variable to be init using another `static const` variable */
95 static const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE;
96 typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e;
98 #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */
99 #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */
102 typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e;
104 #define LONGNBSEQ 0x7F00
107 #define EQUAL_READ32 4
110 #define MaxLit ((1<<Litbits) - 1)
114 #define MaxSeq MAX(MaxLL, MaxML) /* Assumption : MaxOff < MaxLL,MaxML */
119 static const U32 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
120 1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9,10,11,12,
122 static const S16 LL_defaultNorm[MaxLL+1] = { 4, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1,
123 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 1, 1, 1, 1, 1,
125 #define LL_DEFAULTNORMLOG 6 /* for static allocation */
126 static const U32 LL_defaultNormLog = LL_DEFAULTNORMLOG;
128 static const U32 ML_bits[MaxML+1] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
129 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
130 1, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 7, 8, 9,10,11,
132 static const S16 ML_defaultNorm[MaxML+1] = { 1, 4, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
133 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
134 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,-1,-1,
136 #define ML_DEFAULTNORMLOG 6 /* for static allocation */
137 static const U32 ML_defaultNormLog = ML_DEFAULTNORMLOG;
139 static const S16 OF_defaultNorm[MaxOff+1] = { 1, 1, 1, 1, 1, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1,
140 1, 1, 1, 1, 1, 1, 1, 1,-1,-1,-1,-1,-1 };
141 #define OF_DEFAULTNORMLOG 5 /* for static allocation */
142 static const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
145 /*-*******************************************
146 * Shared functions to include for inlining
147 *********************************************/
148 static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
149 #define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
151 /*! ZSTD_wildcopy() :
152 * custom version of memcpy(), can copy up to 7 bytes too many (8 bytes if length==0) */
153 #define WILDCOPY_OVERLENGTH 8
154 MEM_STATIC void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length)
156 const BYTE* ip = (const BYTE*)src;
157 BYTE* op = (BYTE*)dst;
158 BYTE* const oend = op + length;
164 MEM_STATIC void ZSTD_wildcopy_e(void* dst, const void* src, void* dstEnd) /* should be faster for decoding, but strangely, not verified on all platform */
166 const BYTE* ip = (const BYTE*)src;
167 BYTE* op = (BYTE*)dst;
168 BYTE* const oend = (BYTE*)dstEnd;
175 /*-*******************************************
177 *********************************************/
178 typedef struct ZSTD_stats_s ZSTD_stats_t;
190 U32 rep[ZSTD_REP_NUM];
194 typedef struct seqDef_s {
202 seqDef* sequencesStart;
209 U32 longLengthID; /* 0 == no longLength; 1 == Lit.longLength; 2 == Match.longLength; */
212 ZSTD_optimal_t* priceTable;
213 ZSTD_match_t* matchTable;
214 U32* matchLengthFreq;
223 U32 log2matchLengthSum;
225 U32 log2litLengthSum;
232 const BYTE* cachedLiterals;
235 const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx);
236 void ZSTD_seqToCodes(const seqStore_t* seqStorePtr);
237 int ZSTD_isSkipFrame(ZSTD_DCtx* dctx);
239 /* custom memory allocation functions */
240 void* ZSTD_defaultAllocFunction(void* opaque, size_t size);
241 void ZSTD_defaultFreeFunction(void* opaque, void* address);
242 #ifndef ZSTD_DLL_IMPORT
243 static const ZSTD_customMem defaultCustomMem = { ZSTD_defaultAllocFunction, ZSTD_defaultFreeFunction, NULL };
245 void* ZSTD_malloc(size_t size, ZSTD_customMem customMem);
246 void ZSTD_free(void* ptr, ZSTD_customMem customMem);
249 /*====== common function ======*/
251 MEM_STATIC U32 ZSTD_highbit32(U32 val)
253 # if defined(_MSC_VER) /* Visual */
255 _BitScanReverse(&r, val);
257 # elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
258 return 31 - __builtin_clz(val);
259 # else /* Software version */
260 static const int 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 };
268 r = DeBruijnClz[(U32)(v * 0x07C4ACDDU) >> 27];
274 /* hidden functions */
276 /* ZSTD_invalidateRepCodes() :
277 * ensures next compression will not use repcodes from previous block.
278 * Note : only works with regular variant;
279 * do not use with extDict variant ! */
280 void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx);
283 #endif /* ZSTD_CCOMMON_H_MODULE */