1a28cd43dSSascha Wildner /*
2a28cd43dSSascha Wildner * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
3a28cd43dSSascha Wildner * All rights reserved.
4a28cd43dSSascha Wildner *
5a28cd43dSSascha Wildner * This source code is licensed under both the BSD-style license (found in the
6a28cd43dSSascha Wildner * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7a28cd43dSSascha Wildner * in the COPYING file in the root directory of this source tree).
8a28cd43dSSascha Wildner * You may select, at your option, one of the above-listed licenses.
9a28cd43dSSascha Wildner */
10a28cd43dSSascha Wildner
11a28cd43dSSascha Wildner #ifndef ZSTD_CCOMMON_H_MODULE
12a28cd43dSSascha Wildner #define ZSTD_CCOMMON_H_MODULE
13a28cd43dSSascha Wildner
14a28cd43dSSascha Wildner /* this module contains definitions which must be identical
15a28cd43dSSascha Wildner * across compression, decompression and dictBuilder.
16a28cd43dSSascha Wildner * It also contains a few functions useful to at least 2 of them
17a28cd43dSSascha Wildner * and which benefit from being inlined */
18a28cd43dSSascha Wildner
19a28cd43dSSascha Wildner /*-*************************************
20a28cd43dSSascha Wildner * Dependencies
21a28cd43dSSascha Wildner ***************************************/
22a28cd43dSSascha Wildner #if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON)
23a28cd43dSSascha Wildner #include <arm_neon.h>
24a28cd43dSSascha Wildner #endif
25a28cd43dSSascha Wildner #include "compiler.h"
26a28cd43dSSascha Wildner #include "mem.h"
27a28cd43dSSascha Wildner #include "debug.h" /* assert, DEBUGLOG, RAWLOG, g_debuglevel */
28a28cd43dSSascha Wildner #include "error_private.h"
29a28cd43dSSascha Wildner #define ZSTD_STATIC_LINKING_ONLY
30a28cd43dSSascha Wildner #include "../zstd.h"
31a28cd43dSSascha Wildner #define FSE_STATIC_LINKING_ONLY
32a28cd43dSSascha Wildner #include "fse.h"
33a28cd43dSSascha Wildner #define HUF_STATIC_LINKING_ONLY
34a28cd43dSSascha Wildner #include "huf.h"
35a28cd43dSSascha Wildner #ifndef XXH_STATIC_LINKING_ONLY
36a28cd43dSSascha Wildner # define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
37a28cd43dSSascha Wildner #endif
38a28cd43dSSascha Wildner #include "xxhash.h" /* XXH_reset, update, digest */
39a28cd43dSSascha Wildner
40a28cd43dSSascha Wildner #if defined (__cplusplus)
41a28cd43dSSascha Wildner extern "C" {
42a28cd43dSSascha Wildner #endif
43a28cd43dSSascha Wildner
44a28cd43dSSascha Wildner /* ---- static assert (debug) --- */
45a28cd43dSSascha Wildner #define ZSTD_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c)
46a28cd43dSSascha Wildner #define ZSTD_isError ERR_isError /* for inlining */
47a28cd43dSSascha Wildner #define FSE_isError ERR_isError
48a28cd43dSSascha Wildner #define HUF_isError ERR_isError
49a28cd43dSSascha Wildner
50a28cd43dSSascha Wildner
51a28cd43dSSascha Wildner /*-*************************************
52a28cd43dSSascha Wildner * shared macros
53a28cd43dSSascha Wildner ***************************************/
54a28cd43dSSascha Wildner #undef MIN
55a28cd43dSSascha Wildner #undef MAX
56a28cd43dSSascha Wildner #define MIN(a,b) ((a)<(b) ? (a) : (b))
57a28cd43dSSascha Wildner #define MAX(a,b) ((a)>(b) ? (a) : (b))
58a28cd43dSSascha Wildner
59a28cd43dSSascha Wildner /**
60a28cd43dSSascha Wildner * Ignore: this is an internal helper.
61a28cd43dSSascha Wildner *
62a28cd43dSSascha Wildner * This is a helper function to help force C99-correctness during compilation.
63a28cd43dSSascha Wildner * Under strict compilation modes, variadic macro arguments can't be empty.
64a28cd43dSSascha Wildner * However, variadic function arguments can be. Using a function therefore lets
65a28cd43dSSascha Wildner * us statically check that at least one (string) argument was passed,
66a28cd43dSSascha Wildner * independent of the compilation flags.
67a28cd43dSSascha Wildner */
68a28cd43dSSascha Wildner static INLINE_KEYWORD UNUSED_ATTR
_force_has_format_string(const char * format,...)69a28cd43dSSascha Wildner void _force_has_format_string(const char *format, ...) {
70a28cd43dSSascha Wildner (void)format;
71a28cd43dSSascha Wildner }
72a28cd43dSSascha Wildner
73a28cd43dSSascha Wildner /**
74a28cd43dSSascha Wildner * Ignore: this is an internal helper.
75a28cd43dSSascha Wildner *
76a28cd43dSSascha Wildner * We want to force this function invocation to be syntactically correct, but
77a28cd43dSSascha Wildner * we don't want to force runtime evaluation of its arguments.
78a28cd43dSSascha Wildner */
79a28cd43dSSascha Wildner #define _FORCE_HAS_FORMAT_STRING(...) \
80a28cd43dSSascha Wildner if (0) { \
81a28cd43dSSascha Wildner _force_has_format_string(__VA_ARGS__); \
82a28cd43dSSascha Wildner }
83a28cd43dSSascha Wildner
84a28cd43dSSascha Wildner /**
85a28cd43dSSascha Wildner * Return the specified error if the condition evaluates to true.
86a28cd43dSSascha Wildner *
87a28cd43dSSascha Wildner * In debug modes, prints additional information.
88a28cd43dSSascha Wildner * In order to do that (particularly, printing the conditional that failed),
89a28cd43dSSascha Wildner * this can't just wrap RETURN_ERROR().
90a28cd43dSSascha Wildner */
91a28cd43dSSascha Wildner #define RETURN_ERROR_IF(cond, err, ...) \
92a28cd43dSSascha Wildner if (cond) { \
93a28cd43dSSascha Wildner RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \
94a28cd43dSSascha Wildner __FILE__, __LINE__, ZSTD_QUOTE(cond), ZSTD_QUOTE(ERROR(err))); \
95a28cd43dSSascha Wildner _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
96a28cd43dSSascha Wildner RAWLOG(3, ": " __VA_ARGS__); \
97a28cd43dSSascha Wildner RAWLOG(3, "\n"); \
98a28cd43dSSascha Wildner return ERROR(err); \
99a28cd43dSSascha Wildner }
100a28cd43dSSascha Wildner
101a28cd43dSSascha Wildner /**
102a28cd43dSSascha Wildner * Unconditionally return the specified error.
103a28cd43dSSascha Wildner *
104a28cd43dSSascha Wildner * In debug modes, prints additional information.
105a28cd43dSSascha Wildner */
106a28cd43dSSascha Wildner #define RETURN_ERROR(err, ...) \
107a28cd43dSSascha Wildner do { \
108a28cd43dSSascha Wildner RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \
109a28cd43dSSascha Wildner __FILE__, __LINE__, ZSTD_QUOTE(ERROR(err))); \
110a28cd43dSSascha Wildner _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
111a28cd43dSSascha Wildner RAWLOG(3, ": " __VA_ARGS__); \
112a28cd43dSSascha Wildner RAWLOG(3, "\n"); \
113a28cd43dSSascha Wildner return ERROR(err); \
114a28cd43dSSascha Wildner } while(0);
115a28cd43dSSascha Wildner
116a28cd43dSSascha Wildner /**
117a28cd43dSSascha Wildner * If the provided expression evaluates to an error code, returns that error code.
118a28cd43dSSascha Wildner *
119a28cd43dSSascha Wildner * In debug modes, prints additional information.
120a28cd43dSSascha Wildner */
121a28cd43dSSascha Wildner #define FORWARD_IF_ERROR(err, ...) \
122a28cd43dSSascha Wildner do { \
123a28cd43dSSascha Wildner size_t const err_code = (err); \
124a28cd43dSSascha Wildner if (ERR_isError(err_code)) { \
125a28cd43dSSascha Wildner RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \
126a28cd43dSSascha Wildner __FILE__, __LINE__, ZSTD_QUOTE(err), ERR_getErrorName(err_code)); \
127a28cd43dSSascha Wildner _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
128a28cd43dSSascha Wildner RAWLOG(3, ": " __VA_ARGS__); \
129a28cd43dSSascha Wildner RAWLOG(3, "\n"); \
130a28cd43dSSascha Wildner return err_code; \
131a28cd43dSSascha Wildner } \
132a28cd43dSSascha Wildner } while(0);
133a28cd43dSSascha Wildner
134a28cd43dSSascha Wildner
135a28cd43dSSascha Wildner /*-*************************************
136a28cd43dSSascha Wildner * Common constants
137a28cd43dSSascha Wildner ***************************************/
138a28cd43dSSascha Wildner #define ZSTD_OPT_NUM (1<<12)
139a28cd43dSSascha Wildner
140a28cd43dSSascha Wildner #define ZSTD_REP_NUM 3 /* number of repcodes */
141a28cd43dSSascha Wildner #define ZSTD_REP_MOVE (ZSTD_REP_NUM-1)
142a28cd43dSSascha Wildner static UNUSED_ATTR const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
143a28cd43dSSascha Wildner
144a28cd43dSSascha Wildner #define KB *(1 <<10)
145a28cd43dSSascha Wildner #define MB *(1 <<20)
146a28cd43dSSascha Wildner #define GB *(1U<<30)
147a28cd43dSSascha Wildner
148a28cd43dSSascha Wildner #define BIT7 128
149a28cd43dSSascha Wildner #define BIT6 64
150a28cd43dSSascha Wildner #define BIT5 32
151a28cd43dSSascha Wildner #define BIT4 16
152a28cd43dSSascha Wildner #define BIT1 2
153a28cd43dSSascha Wildner #define BIT0 1
154a28cd43dSSascha Wildner
155a28cd43dSSascha Wildner #define ZSTD_WINDOWLOG_ABSOLUTEMIN 10
156a28cd43dSSascha Wildner static UNUSED_ATTR const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 };
157a28cd43dSSascha Wildner static UNUSED_ATTR const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 };
158a28cd43dSSascha Wildner
159a28cd43dSSascha Wildner #define ZSTD_FRAMEIDSIZE 4 /* magic number size */
160a28cd43dSSascha Wildner
161a28cd43dSSascha Wildner #define ZSTD_BLOCKHEADERSIZE 3 /* C standard doesn't allow `static const` variable to be init using another `static const` variable */
162a28cd43dSSascha Wildner static UNUSED_ATTR const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE;
163a28cd43dSSascha Wildner typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e;
164a28cd43dSSascha Wildner
165a28cd43dSSascha Wildner #define ZSTD_FRAMECHECKSUMSIZE 4
166a28cd43dSSascha Wildner
167a28cd43dSSascha Wildner #define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */
168a28cd43dSSascha Wildner #define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */
169a28cd43dSSascha Wildner
170a28cd43dSSascha Wildner #define HufLog 12
171a28cd43dSSascha Wildner typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e;
172a28cd43dSSascha Wildner
173a28cd43dSSascha Wildner #define LONGNBSEQ 0x7F00
174a28cd43dSSascha Wildner
175a28cd43dSSascha Wildner #define MINMATCH 3
176a28cd43dSSascha Wildner
177a28cd43dSSascha Wildner #define Litbits 8
178a28cd43dSSascha Wildner #define MaxLit ((1<<Litbits) - 1)
179a28cd43dSSascha Wildner #define MaxML 52
180a28cd43dSSascha Wildner #define MaxLL 35
181a28cd43dSSascha Wildner #define DefaultMaxOff 28
182a28cd43dSSascha Wildner #define MaxOff 31
183a28cd43dSSascha Wildner #define MaxSeq MAX(MaxLL, MaxML) /* Assumption : MaxOff < MaxLL,MaxML */
184a28cd43dSSascha Wildner #define MLFSELog 9
185a28cd43dSSascha Wildner #define LLFSELog 9
186a28cd43dSSascha Wildner #define OffFSELog 8
187a28cd43dSSascha Wildner #define MaxFSELog MAX(MAX(MLFSELog, LLFSELog), OffFSELog)
188a28cd43dSSascha Wildner
189a28cd43dSSascha Wildner #define ZSTD_MAX_HUF_HEADER_SIZE 128 /* header + <= 127 byte tree description */
190a28cd43dSSascha Wildner /* Each table cannot take more than #symbols * FSELog bits */
191a28cd43dSSascha Wildner #define ZSTD_MAX_FSE_HEADERS_SIZE (((MaxML + 1) * MLFSELog + (MaxLL + 1) * LLFSELog + (MaxOff + 1) * OffFSELog + 7) / 8)
192a28cd43dSSascha Wildner
193a28cd43dSSascha Wildner static UNUSED_ATTR const U32 LL_bits[MaxLL+1] = {
194a28cd43dSSascha Wildner 0, 0, 0, 0, 0, 0, 0, 0,
195a28cd43dSSascha Wildner 0, 0, 0, 0, 0, 0, 0, 0,
196a28cd43dSSascha Wildner 1, 1, 1, 1, 2, 2, 3, 3,
197a28cd43dSSascha Wildner 4, 6, 7, 8, 9,10,11,12,
198a28cd43dSSascha Wildner 13,14,15,16
199a28cd43dSSascha Wildner };
200a28cd43dSSascha Wildner static UNUSED_ATTR const S16 LL_defaultNorm[MaxLL+1] = {
201a28cd43dSSascha Wildner 4, 3, 2, 2, 2, 2, 2, 2,
202a28cd43dSSascha Wildner 2, 2, 2, 2, 2, 1, 1, 1,
203a28cd43dSSascha Wildner 2, 2, 2, 2, 2, 2, 2, 2,
204a28cd43dSSascha Wildner 2, 3, 2, 1, 1, 1, 1, 1,
205a28cd43dSSascha Wildner -1,-1,-1,-1
206a28cd43dSSascha Wildner };
207a28cd43dSSascha Wildner #define LL_DEFAULTNORMLOG 6 /* for static allocation */
208a28cd43dSSascha Wildner static UNUSED_ATTR const U32 LL_defaultNormLog = LL_DEFAULTNORMLOG;
209a28cd43dSSascha Wildner
210a28cd43dSSascha Wildner static UNUSED_ATTR const U32 ML_bits[MaxML+1] = {
211a28cd43dSSascha Wildner 0, 0, 0, 0, 0, 0, 0, 0,
212a28cd43dSSascha Wildner 0, 0, 0, 0, 0, 0, 0, 0,
213a28cd43dSSascha Wildner 0, 0, 0, 0, 0, 0, 0, 0,
214a28cd43dSSascha Wildner 0, 0, 0, 0, 0, 0, 0, 0,
215a28cd43dSSascha Wildner 1, 1, 1, 1, 2, 2, 3, 3,
216a28cd43dSSascha Wildner 4, 4, 5, 7, 8, 9,10,11,
217a28cd43dSSascha Wildner 12,13,14,15,16
218a28cd43dSSascha Wildner };
219a28cd43dSSascha Wildner static UNUSED_ATTR const S16 ML_defaultNorm[MaxML+1] = {
220a28cd43dSSascha Wildner 1, 4, 3, 2, 2, 2, 2, 2,
221a28cd43dSSascha Wildner 2, 1, 1, 1, 1, 1, 1, 1,
222a28cd43dSSascha Wildner 1, 1, 1, 1, 1, 1, 1, 1,
223a28cd43dSSascha Wildner 1, 1, 1, 1, 1, 1, 1, 1,
224a28cd43dSSascha Wildner 1, 1, 1, 1, 1, 1, 1, 1,
225a28cd43dSSascha Wildner 1, 1, 1, 1, 1, 1,-1,-1,
226a28cd43dSSascha Wildner -1,-1,-1,-1,-1
227a28cd43dSSascha Wildner };
228a28cd43dSSascha Wildner #define ML_DEFAULTNORMLOG 6 /* for static allocation */
229a28cd43dSSascha Wildner static UNUSED_ATTR const U32 ML_defaultNormLog = ML_DEFAULTNORMLOG;
230a28cd43dSSascha Wildner
231a28cd43dSSascha Wildner static UNUSED_ATTR const S16 OF_defaultNorm[DefaultMaxOff+1] = {
232a28cd43dSSascha Wildner 1, 1, 1, 1, 1, 1, 2, 2,
233a28cd43dSSascha Wildner 2, 1, 1, 1, 1, 1, 1, 1,
234a28cd43dSSascha Wildner 1, 1, 1, 1, 1, 1, 1, 1,
235a28cd43dSSascha Wildner -1,-1,-1,-1,-1
236a28cd43dSSascha Wildner };
237a28cd43dSSascha Wildner #define OF_DEFAULTNORMLOG 5 /* for static allocation */
238a28cd43dSSascha Wildner static UNUSED_ATTR const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
239a28cd43dSSascha Wildner
240a28cd43dSSascha Wildner
241a28cd43dSSascha Wildner /*-*******************************************
242a28cd43dSSascha Wildner * Shared functions to include for inlining
243a28cd43dSSascha Wildner *********************************************/
ZSTD_copy8(void * dst,const void * src)244a28cd43dSSascha Wildner static void ZSTD_copy8(void* dst, const void* src) {
245a28cd43dSSascha Wildner #if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON)
246a28cd43dSSascha Wildner vst1_u8((uint8_t*)dst, vld1_u8((const uint8_t*)src));
247a28cd43dSSascha Wildner #else
248a28cd43dSSascha Wildner ZSTD_memcpy(dst, src, 8);
249a28cd43dSSascha Wildner #endif
250a28cd43dSSascha Wildner }
251a28cd43dSSascha Wildner
252a28cd43dSSascha Wildner #define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
ZSTD_copy16(void * dst,const void * src)253a28cd43dSSascha Wildner static void ZSTD_copy16(void* dst, const void* src) {
254a28cd43dSSascha Wildner #if !defined(ZSTD_NO_INTRINSICS) && defined(__ARM_NEON)
255a28cd43dSSascha Wildner vst1q_u8((uint8_t*)dst, vld1q_u8((const uint8_t*)src));
256a28cd43dSSascha Wildner #else
257a28cd43dSSascha Wildner ZSTD_memcpy(dst, src, 16);
258a28cd43dSSascha Wildner #endif
259a28cd43dSSascha Wildner }
260a28cd43dSSascha Wildner #define COPY16(d,s) { ZSTD_copy16(d,s); d+=16; s+=16; }
261a28cd43dSSascha Wildner
262a28cd43dSSascha Wildner #define WILDCOPY_OVERLENGTH 32
263a28cd43dSSascha Wildner #define WILDCOPY_VECLEN 16
264a28cd43dSSascha Wildner
265a28cd43dSSascha Wildner typedef enum {
266a28cd43dSSascha Wildner ZSTD_no_overlap,
267a28cd43dSSascha Wildner ZSTD_overlap_src_before_dst
268a28cd43dSSascha Wildner /* ZSTD_overlap_dst_before_src, */
269a28cd43dSSascha Wildner } ZSTD_overlap_e;
270a28cd43dSSascha Wildner
271a28cd43dSSascha Wildner /*! ZSTD_wildcopy() :
272a28cd43dSSascha Wildner * Custom version of ZSTD_memcpy(), can over read/write up to WILDCOPY_OVERLENGTH bytes (if length==0)
273a28cd43dSSascha Wildner * @param ovtype controls the overlap detection
274a28cd43dSSascha Wildner * - ZSTD_no_overlap: The source and destination are guaranteed to be at least WILDCOPY_VECLEN bytes apart.
275a28cd43dSSascha Wildner * - ZSTD_overlap_src_before_dst: The src and dst may overlap, but they MUST be at least 8 bytes apart.
276a28cd43dSSascha Wildner * The src buffer must be before the dst buffer.
277a28cd43dSSascha Wildner */
278a28cd43dSSascha Wildner MEM_STATIC FORCE_INLINE_ATTR
ZSTD_wildcopy(void * dst,const void * src,ptrdiff_t length,ZSTD_overlap_e const ovtype)279a28cd43dSSascha Wildner void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e const ovtype)
280a28cd43dSSascha Wildner {
281a28cd43dSSascha Wildner ptrdiff_t diff = (BYTE*)dst - (const BYTE*)src;
282a28cd43dSSascha Wildner const BYTE* ip = (const BYTE*)src;
283a28cd43dSSascha Wildner BYTE* op = (BYTE*)dst;
284a28cd43dSSascha Wildner BYTE* const oend = op + length;
285a28cd43dSSascha Wildner
286a28cd43dSSascha Wildner assert(diff >= 8 || (ovtype == ZSTD_no_overlap && diff <= -WILDCOPY_VECLEN));
287a28cd43dSSascha Wildner
288a28cd43dSSascha Wildner if (ovtype == ZSTD_overlap_src_before_dst && diff < WILDCOPY_VECLEN) {
289a28cd43dSSascha Wildner /* Handle short offset copies. */
290a28cd43dSSascha Wildner do {
291a28cd43dSSascha Wildner COPY8(op, ip)
292a28cd43dSSascha Wildner } while (op < oend);
293a28cd43dSSascha Wildner } else {
294a28cd43dSSascha Wildner assert(diff >= WILDCOPY_VECLEN || diff <= -WILDCOPY_VECLEN);
295a28cd43dSSascha Wildner /* Separate out the first COPY16() call because the copy length is
296a28cd43dSSascha Wildner * almost certain to be short, so the branches have different
297a28cd43dSSascha Wildner * probabilities. Since it is almost certain to be short, only do
298a28cd43dSSascha Wildner * one COPY16() in the first call. Then, do two calls per loop since
299a28cd43dSSascha Wildner * at that point it is more likely to have a high trip count.
300a28cd43dSSascha Wildner */
301a28cd43dSSascha Wildner #ifdef __aarch64__
302a28cd43dSSascha Wildner do {
303a28cd43dSSascha Wildner COPY16(op, ip);
304a28cd43dSSascha Wildner }
305a28cd43dSSascha Wildner while (op < oend);
306a28cd43dSSascha Wildner #else
307a28cd43dSSascha Wildner ZSTD_copy16(op, ip);
308a28cd43dSSascha Wildner if (16 >= length) return;
309a28cd43dSSascha Wildner op += 16;
310a28cd43dSSascha Wildner ip += 16;
311a28cd43dSSascha Wildner do {
312a28cd43dSSascha Wildner COPY16(op, ip);
313a28cd43dSSascha Wildner COPY16(op, ip);
314a28cd43dSSascha Wildner }
315a28cd43dSSascha Wildner while (op < oend);
316a28cd43dSSascha Wildner #endif
317a28cd43dSSascha Wildner }
318a28cd43dSSascha Wildner }
319a28cd43dSSascha Wildner
ZSTD_limitCopy(void * dst,size_t dstCapacity,const void * src,size_t srcSize)320a28cd43dSSascha Wildner MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
321a28cd43dSSascha Wildner {
322a28cd43dSSascha Wildner size_t const length = MIN(dstCapacity, srcSize);
323a28cd43dSSascha Wildner if (length > 0) {
324a28cd43dSSascha Wildner ZSTD_memcpy(dst, src, length);
325a28cd43dSSascha Wildner }
326a28cd43dSSascha Wildner return length;
327a28cd43dSSascha Wildner }
328a28cd43dSSascha Wildner
329a28cd43dSSascha Wildner /* define "workspace is too large" as this number of times larger than needed */
330a28cd43dSSascha Wildner #define ZSTD_WORKSPACETOOLARGE_FACTOR 3
331a28cd43dSSascha Wildner
332a28cd43dSSascha Wildner /* when workspace is continuously too large
333a28cd43dSSascha Wildner * during at least this number of times,
334a28cd43dSSascha Wildner * context's memory usage is considered wasteful,
335a28cd43dSSascha Wildner * because it's sized to handle a worst case scenario which rarely happens.
336a28cd43dSSascha Wildner * In which case, resize it down to free some memory */
337a28cd43dSSascha Wildner #define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128
338a28cd43dSSascha Wildner
339a28cd43dSSascha Wildner /* Controls whether the input/output buffer is buffered or stable. */
340a28cd43dSSascha Wildner typedef enum {
341a28cd43dSSascha Wildner ZSTD_bm_buffered = 0, /* Buffer the input/output */
342a28cd43dSSascha Wildner ZSTD_bm_stable = 1 /* ZSTD_inBuffer/ZSTD_outBuffer is stable */
343a28cd43dSSascha Wildner } ZSTD_bufferMode_e;
344a28cd43dSSascha Wildner
345a28cd43dSSascha Wildner
346a28cd43dSSascha Wildner /*-*******************************************
347a28cd43dSSascha Wildner * Private declarations
348a28cd43dSSascha Wildner *********************************************/
349a28cd43dSSascha Wildner typedef struct seqDef_s {
350a28cd43dSSascha Wildner U32 offset; /* Offset code of the sequence */
351a28cd43dSSascha Wildner U16 litLength;
352a28cd43dSSascha Wildner U16 matchLength;
353a28cd43dSSascha Wildner } seqDef;
354a28cd43dSSascha Wildner
355a28cd43dSSascha Wildner typedef struct {
356a28cd43dSSascha Wildner seqDef* sequencesStart;
357a28cd43dSSascha Wildner seqDef* sequences; /* ptr to end of sequences */
358a28cd43dSSascha Wildner BYTE* litStart;
359a28cd43dSSascha Wildner BYTE* lit; /* ptr to end of literals */
360a28cd43dSSascha Wildner BYTE* llCode;
361a28cd43dSSascha Wildner BYTE* mlCode;
362a28cd43dSSascha Wildner BYTE* ofCode;
363a28cd43dSSascha Wildner size_t maxNbSeq;
364a28cd43dSSascha Wildner size_t maxNbLit;
365a28cd43dSSascha Wildner
366a28cd43dSSascha Wildner /* longLengthPos and longLengthID to allow us to represent either a single litLength or matchLength
367a28cd43dSSascha Wildner * in the seqStore that has a value larger than U16 (if it exists). To do so, we increment
368a28cd43dSSascha Wildner * the existing value of the litLength or matchLength by 0x10000.
369a28cd43dSSascha Wildner */
370a28cd43dSSascha Wildner U32 longLengthID; /* 0 == no longLength; 1 == Represent the long literal; 2 == Represent the long match; */
371a28cd43dSSascha Wildner U32 longLengthPos; /* Index of the sequence to apply long length modification to */
372a28cd43dSSascha Wildner } seqStore_t;
373a28cd43dSSascha Wildner
374a28cd43dSSascha Wildner typedef struct {
375a28cd43dSSascha Wildner U32 litLength;
376a28cd43dSSascha Wildner U32 matchLength;
377a28cd43dSSascha Wildner } ZSTD_sequenceLength;
378a28cd43dSSascha Wildner
379a28cd43dSSascha Wildner /**
380a28cd43dSSascha Wildner * Returns the ZSTD_sequenceLength for the given sequences. It handles the decoding of long sequences
381a28cd43dSSascha Wildner * indicated by longLengthPos and longLengthID, and adds MINMATCH back to matchLength.
382a28cd43dSSascha Wildner */
ZSTD_getSequenceLength(seqStore_t const * seqStore,seqDef const * seq)383a28cd43dSSascha Wildner MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore, seqDef const* seq)
384a28cd43dSSascha Wildner {
385a28cd43dSSascha Wildner ZSTD_sequenceLength seqLen;
386a28cd43dSSascha Wildner seqLen.litLength = seq->litLength;
387a28cd43dSSascha Wildner seqLen.matchLength = seq->matchLength + MINMATCH;
388a28cd43dSSascha Wildner if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) {
389a28cd43dSSascha Wildner if (seqStore->longLengthID == 1) {
390a28cd43dSSascha Wildner seqLen.litLength += 0xFFFF;
391a28cd43dSSascha Wildner }
392a28cd43dSSascha Wildner if (seqStore->longLengthID == 2) {
393a28cd43dSSascha Wildner seqLen.matchLength += 0xFFFF;
394a28cd43dSSascha Wildner }
395a28cd43dSSascha Wildner }
396a28cd43dSSascha Wildner return seqLen;
397a28cd43dSSascha Wildner }
398a28cd43dSSascha Wildner
399a28cd43dSSascha Wildner /**
400a28cd43dSSascha Wildner * Contains the compressed frame size and an upper-bound for the decompressed frame size.
401a28cd43dSSascha Wildner * Note: before using `compressedSize`, check for errors using ZSTD_isError().
402a28cd43dSSascha Wildner * similarly, before using `decompressedBound`, check for errors using:
403a28cd43dSSascha Wildner * `decompressedBound != ZSTD_CONTENTSIZE_ERROR`
404a28cd43dSSascha Wildner */
405a28cd43dSSascha Wildner typedef struct {
406a28cd43dSSascha Wildner size_t compressedSize;
407a28cd43dSSascha Wildner unsigned long long decompressedBound;
408a28cd43dSSascha Wildner } ZSTD_frameSizeInfo; /* decompress & legacy */
409a28cd43dSSascha Wildner
410a28cd43dSSascha Wildner const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx); /* compress & dictBuilder */
411a28cd43dSSascha Wildner void ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */
412a28cd43dSSascha Wildner
413a28cd43dSSascha Wildner /* custom memory allocation functions */
414a28cd43dSSascha Wildner void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem);
415a28cd43dSSascha Wildner void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem);
416a28cd43dSSascha Wildner void ZSTD_customFree(void* ptr, ZSTD_customMem customMem);
417a28cd43dSSascha Wildner
418a28cd43dSSascha Wildner
ZSTD_highbit32(U32 val)419a28cd43dSSascha Wildner MEM_STATIC U32 ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */
420a28cd43dSSascha Wildner {
421a28cd43dSSascha Wildner assert(val != 0);
422a28cd43dSSascha Wildner {
423a28cd43dSSascha Wildner # if defined(_MSC_VER) /* Visual */
424a28cd43dSSascha Wildner # if STATIC_BMI2 == 1
425a28cd43dSSascha Wildner return _lzcnt_u32(val)^31;
426a28cd43dSSascha Wildner # else
427a28cd43dSSascha Wildner unsigned long r=0;
428a28cd43dSSascha Wildner return _BitScanReverse(&r, val) ? (unsigned)r : 0;
429a28cd43dSSascha Wildner # endif
430a28cd43dSSascha Wildner # elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
431a28cd43dSSascha Wildner return __builtin_clz (val) ^ 31;
432a28cd43dSSascha Wildner # elif defined(__ICCARM__) /* IAR Intrinsic */
433a28cd43dSSascha Wildner return 31 - __CLZ(val);
434a28cd43dSSascha Wildner # else /* Software version */
435a28cd43dSSascha Wildner static const U32 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 };
436a28cd43dSSascha Wildner U32 v = val;
437a28cd43dSSascha Wildner v |= v >> 1;
438a28cd43dSSascha Wildner v |= v >> 2;
439a28cd43dSSascha Wildner v |= v >> 4;
440a28cd43dSSascha Wildner v |= v >> 8;
441a28cd43dSSascha Wildner v |= v >> 16;
442a28cd43dSSascha Wildner return DeBruijnClz[(v * 0x07C4ACDDU) >> 27];
443a28cd43dSSascha Wildner # endif
444a28cd43dSSascha Wildner }
445a28cd43dSSascha Wildner }
446a28cd43dSSascha Wildner
447a28cd43dSSascha Wildner
448a28cd43dSSascha Wildner /* ZSTD_invalidateRepCodes() :
449a28cd43dSSascha Wildner * ensures next compression will not use repcodes from previous block.
450a28cd43dSSascha Wildner * Note : only works with regular variant;
451a28cd43dSSascha Wildner * do not use with extDict variant ! */
452a28cd43dSSascha Wildner void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx); /* zstdmt, adaptive_compression (shouldn't get this definition from here) */
453a28cd43dSSascha Wildner
454a28cd43dSSascha Wildner
455a28cd43dSSascha Wildner typedef struct {
456a28cd43dSSascha Wildner blockType_e blockType;
457a28cd43dSSascha Wildner U32 lastBlock;
458a28cd43dSSascha Wildner U32 origSize;
459a28cd43dSSascha Wildner } blockProperties_t; /* declared here for decompress and fullbench */
460a28cd43dSSascha Wildner
461a28cd43dSSascha Wildner /*! ZSTD_getcBlockSize() :
462a28cd43dSSascha Wildner * Provides the size of compressed block from block header `src` */
463a28cd43dSSascha Wildner /* Used by: decompress, fullbench (does not get its definition from here) */
464a28cd43dSSascha Wildner size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
465a28cd43dSSascha Wildner blockProperties_t* bpPtr);
466a28cd43dSSascha Wildner
467a28cd43dSSascha Wildner /*! ZSTD_decodeSeqHeaders() :
468a28cd43dSSascha Wildner * decode sequence header from src */
469a28cd43dSSascha Wildner /* Used by: decompress, fullbench (does not get its definition from here) */
470a28cd43dSSascha Wildner size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
471a28cd43dSSascha Wildner const void* src, size_t srcSize);
472a28cd43dSSascha Wildner
473a28cd43dSSascha Wildner
474a28cd43dSSascha Wildner #if defined (__cplusplus)
475a28cd43dSSascha Wildner }
476a28cd43dSSascha Wildner #endif
477a28cd43dSSascha Wildner
478a28cd43dSSascha Wildner #endif /* ZSTD_CCOMMON_H_MODULE */
479