blob: bd08de821202576f57f01e4c719fd706ea020a24 [file] [log] [blame]
Yann Collet32fb4072017-08-18 16:52:05 -07001/*
Nick Terrellac58c8d2020-03-26 15:19:05 -07002 * Copyright (c) 2016-2020, Yann Collet, Facebook, Inc.
Yann Collet4ded9e52016-08-30 10:04:33 -07003 * All rights reserved.
4 *
Yann Collet32fb4072017-08-18 16:52:05 -07005 * This source code is licensed under both the BSD-style license (found in the
6 * LICENSE file in the root directory of this source tree) and the GPLv2 (found
7 * in the COPYING file in the root directory of this source tree).
Yann Collet3128e032017-09-08 00:09:23 -07008 * You may select, at your option, one of the above-listed licenses.
Yann Collet4ded9e52016-08-30 10:04:33 -07009 */
Yann Collet2acb5d32015-10-29 16:49:43 +010010
Yann Collet2acb5d32015-10-29 16:49:43 +010011#ifndef ZSTD_CCOMMON_H_MODULE
12#define ZSTD_CCOMMON_H_MODULE
13
Yann Collet8b6aecf2017-11-07 15:27:06 -080014/* this module contains definitions which must be identical
15 * across compression, decompression and dictBuilder.
16 * It also contains a few functions useful to at least 2 of them
17 * and which benefit from being inlined */
Yann Collet5c956d52016-09-06 15:05:19 +020018
Yann Collet7d360282016-02-12 00:07:30 +010019/*-*************************************
Yann Collet953ce722016-02-04 15:28:14 +010020* Dependencies
Yann Collet2acb5d32015-10-29 16:49:43 +010021***************************************/
Nick Terrell565e9252017-08-14 17:20:50 -070022#include "compiler.h"
Yann Collet2acb5d32015-10-29 16:49:43 +010023#include "mem.h"
Yann Colletfa41bcc2018-06-13 14:59:26 -040024#include "debug.h" /* assert, DEBUGLOG, RAWLOG, g_debuglevel */
Yann Collet977f1f32016-01-21 15:38:47 +010025#include "error_private.h"
Yann Colletd3b7f8d2016-06-04 19:47:02 +020026#define ZSTD_STATIC_LINKING_ONLY
W. Felix Handte60288272020-05-01 16:07:57 -040027#include "../zstd.h"
Nick Terrellde0414b2017-07-12 19:08:24 -070028#define FSE_STATIC_LINKING_ONLY
29#include "fse.h"
30#define HUF_STATIC_LINKING_ONLY
31#include "huf.h"
Yann Collet4bcc69b2017-03-01 11:33:25 -080032#ifndef XXH_STATIC_LINKING_ONLY
Yann Collet58e8d792017-06-02 18:20:48 -070033# define XXH_STATIC_LINKING_ONLY /* XXH64_state_t */
Yann Collet4bcc69b2017-03-01 11:33:25 -080034#endif
Yann Collet58e8d792017-06-02 18:20:48 -070035#include "xxhash.h" /* XXH_reset, update, digest */
36
Nick Terrellde6c6bc2017-08-24 18:09:50 -070037#if defined (__cplusplus)
38extern "C" {
39#endif
40
Yann Colletfa41bcc2018-06-13 14:59:26 -040041/* ---- static assert (debug) --- */
42#define ZSTD_STATIC_ASSERT(c) DEBUG_STATIC_ASSERT(c)
Yann Colletccd2d422018-10-23 17:25:49 -070043#define ZSTD_isError ERR_isError /* for inlining */
44#define FSE_isError ERR_isError
45#define HUF_isError ERR_isError
Yann Collet2acb5d32015-10-29 16:49:43 +010046
47
Yann Collet7d360282016-02-12 00:07:30 +010048/*-*************************************
Yann Collet3e21ec52016-09-06 15:36:19 +020049* shared macros
Yann Collet14983e72015-11-11 21:38:21 +010050***************************************/
Yann Collet4f818182017-04-17 17:57:35 -070051#undef MIN
52#undef MAX
Yann Colletbe2010e2015-10-31 12:57:14 +010053#define MIN(a,b) ((a)<(b) ? (a) : (b))
Yann Collet14983e72015-11-11 21:38:21 +010054#define MAX(a,b) ((a)>(b) ? (a) : (b))
W. Felix Handte7ebd8972019-01-28 17:16:32 -050055
W. Felix Handtebaa4e2e2020-04-30 17:07:49 -040056/**
57 * Ignore: this is an internal helper.
58 *
59 * This is a helper function to help force C99-correctness during compilation.
60 * Under strict compilation modes, variadic macro arguments can't be empty.
61 * However, variadic function arguments can be. Using a function therefore lets
62 * us statically check that at least one (string) argument was passed,
63 * independent of the compilation flags.
64 */
W. Felix Handte37648592020-04-30 17:43:20 -040065static INLINE_KEYWORD UNUSED_ATTR
66void _force_has_format_string(const char *format, ...) {
W. Felix Handte450542d2020-04-30 13:09:14 -040067 (void)format;
68}
69
W. Felix Handtea3538bb2019-01-28 12:34:08 -050070/**
W. Felix Handtebaa4e2e2020-04-30 17:07:49 -040071 * Ignore: this is an internal helper.
72 *
73 * We want to force this function invocation to be syntactically correct, but
74 * we don't want to force runtime evaluation of its arguments.
75 */
76#define _FORCE_HAS_FORMAT_STRING(...) \
77 if (0) { \
78 _force_has_format_string(__VA_ARGS__); \
79 }
80
81/**
W. Felix Handtea3538bb2019-01-28 12:34:08 -050082 * Return the specified error if the condition evaluates to true.
83 *
Yann Collet0b0b83e2019-08-03 16:43:34 +020084 * In debug modes, prints additional information.
85 * In order to do that (particularly, printing the conditional that failed),
86 * this can't just wrap RETURN_ERROR().
W. Felix Handtea3538bb2019-01-28 12:34:08 -050087 */
W. Felix Handte54fa31f2018-12-05 16:23:18 -080088#define RETURN_ERROR_IF(cond, err, ...) \
89 if (cond) { \
W. Felix Handte450542d2020-04-30 13:09:14 -040090 RAWLOG(3, "%s:%d: ERROR!: check %s failed, returning %s", \
91 __FILE__, __LINE__, ZSTD_QUOTE(cond), ZSTD_QUOTE(ERROR(err))); \
W. Felix Handtebaa4e2e2020-04-30 17:07:49 -040092 _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
W. Felix Handte450542d2020-04-30 13:09:14 -040093 RAWLOG(3, ": " __VA_ARGS__); \
W. Felix Handte54fa31f2018-12-05 16:23:18 -080094 RAWLOG(3, "\n"); \
95 return ERROR(err); \
96 }
97
W. Felix Handtea3538bb2019-01-28 12:34:08 -050098/**
99 * Unconditionally return the specified error.
100 *
101 * In debug modes, prints additional information.
102 */
103#define RETURN_ERROR(err, ...) \
104 do { \
W. Felix Handte450542d2020-04-30 13:09:14 -0400105 RAWLOG(3, "%s:%d: ERROR!: unconditional check failed, returning %s", \
106 __FILE__, __LINE__, ZSTD_QUOTE(ERROR(err))); \
W. Felix Handtebaa4e2e2020-04-30 17:07:49 -0400107 _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
W. Felix Handte450542d2020-04-30 13:09:14 -0400108 RAWLOG(3, ": " __VA_ARGS__); \
W. Felix Handtea3538bb2019-01-28 12:34:08 -0500109 RAWLOG(3, "\n"); \
110 return ERROR(err); \
111 } while(0);
112
113/**
114 * If the provided expression evaluates to an error code, returns that error code.
115 *
116 * In debug modes, prints additional information.
117 */
W. Felix Handte501eb252019-01-29 12:56:07 -0500118#define FORWARD_IF_ERROR(err, ...) \
W. Felix Handtea3538bb2019-01-28 12:34:08 -0500119 do { \
120 size_t const err_code = (err); \
121 if (ERR_isError(err_code)) { \
W. Felix Handte450542d2020-04-30 13:09:14 -0400122 RAWLOG(3, "%s:%d: ERROR!: forwarding error in %s: %s", \
123 __FILE__, __LINE__, ZSTD_QUOTE(err), ERR_getErrorName(err_code)); \
W. Felix Handtebaa4e2e2020-04-30 17:07:49 -0400124 _FORCE_HAS_FORMAT_STRING(__VA_ARGS__); \
W. Felix Handte450542d2020-04-30 13:09:14 -0400125 RAWLOG(3, ": " __VA_ARGS__); \
W. Felix Handtea3538bb2019-01-28 12:34:08 -0500126 RAWLOG(3, "\n"); \
127 return err_code; \
128 } \
129 } while(0);
130
Yann Collet2acb5d32015-10-29 16:49:43 +0100131
Yann Collet7d360282016-02-12 00:07:30 +0100132/*-*************************************
Yann Collet14983e72015-11-11 21:38:21 +0100133* Common constants
134***************************************/
inikep87d4f3d2016-03-02 15:56:24 +0100135#define ZSTD_OPT_NUM (1<<12)
Yann Collet88fcd292015-11-25 14:42:45 +0100136
inikep5f49eba2016-08-10 15:01:53 +0200137#define ZSTD_REP_NUM 3 /* number of repcodes */
inikep5f49eba2016-08-10 15:01:53 +0200138#define ZSTD_REP_MOVE (ZSTD_REP_NUM-1)
Yann Collet4266c0a2016-06-14 01:49:25 +0200139static const U32 repStartValue[ZSTD_REP_NUM] = { 1, 4, 8 };
Yann Collet14983e72015-11-11 21:38:21 +0100140
141#define KB *(1 <<10)
142#define MB *(1 <<20)
143#define GB *(1U<<30)
Yann Collet2acb5d32015-10-29 16:49:43 +0100144
Yann Collet14983e72015-11-11 21:38:21 +0100145#define BIT7 128
146#define BIT6 64
147#define BIT5 32
148#define BIT4 16
149#define BIT1 2
150#define BIT0 1
151
Yann Collet673f0d72016-06-06 00:26:38 +0200152#define ZSTD_WINDOWLOG_ABSOLUTEMIN 10
153static const size_t ZSTD_fcs_fieldSize[4] = { 0, 2, 4, 8 };
Yann Colletc46fb922016-05-29 05:01:04 +0200154static const size_t ZSTD_did_fieldSize[4] = { 0, 1, 2, 4 };
Yann Collet37f3d1b2016-03-19 15:11:42 +0100155
Yann Collet6e66bbf2018-08-14 12:56:21 -0700156#define ZSTD_FRAMEIDSIZE 4 /* magic number size */
Yann Colletb8d4a382017-09-25 15:25:07 -0700157
Yann Collet49bb0042016-06-04 20:17:38 +0200158#define ZSTD_BLOCKHEADERSIZE 3 /* C standard doesn't allow `static const` variable to be init using another `static const` variable */
Yann Collet37f3d1b2016-03-19 15:11:42 +0100159static const size_t ZSTD_blockHeaderSize = ZSTD_BLOCKHEADERSIZE;
Yann Colletc991cc12016-07-28 00:55:43 +0200160typedef enum { bt_raw, bt_rle, bt_compressed, bt_reserved } blockType_e;
Yann Collet37f3d1b2016-03-19 15:11:42 +0100161
Bimba Shresthab1f53b12020-01-03 16:53:51 -0800162#define ZSTD_FRAMECHECKSUMSIZE 4
163
Yann Collet37f3d1b2016-03-19 15:11:42 +0100164#define MIN_SEQUENCES_SIZE 1 /* nbSeq==0 */
165#define MIN_CBLOCK_SIZE (1 /*litCSize*/ + 1 /* RLE or RAW */ + MIN_SEQUENCES_SIZE /* nbSeq==0 */) /* for a non-null block */
166
167#define HufLog 12
Yann Colletf8e7b532016-07-23 16:31:49 +0200168typedef enum { set_basic, set_rle, set_compressed, set_repeat } symbolEncodingType_e;
Yann Collet14983e72015-11-11 21:38:21 +0100169
Yann Collet37f3d1b2016-03-19 15:11:42 +0100170#define LONGNBSEQ 0x7F00
171
inikep7bc19b62016-04-06 09:46:01 +0200172#define MINMATCH 3
Yann Collet14983e72015-11-11 21:38:21 +0100173
inikep3bfcfc72016-02-03 18:47:30 +0100174#define Litbits 8
inikep70b05452016-02-03 22:56:55 +0100175#define MaxLit ((1<<Litbits) - 1)
Yann Collet95424402018-02-09 04:25:15 -0800176#define MaxML 52
177#define MaxLL 35
Nick Terrellbbe77212017-09-18 16:54:53 -0700178#define DefaultMaxOff 28
Yann Collet95424402018-02-09 04:25:15 -0800179#define MaxOff 31
Yann Collet4db09ef2016-03-18 22:23:49 +0100180#define MaxSeq MAX(MaxLL, MaxML) /* Assumption : MaxOff < MaxLL,MaxML */
Yann Colletbe391432016-03-22 23:19:28 +0100181#define MLFSELog 9
Yann Colletd64f4352016-03-21 00:07:42 +0100182#define LLFSELog 9
Yann Collet646693e2016-03-24 02:31:27 +0100183#define OffFSELog 8
Yann Collet95424402018-02-09 04:25:15 -0800184#define MaxFSELog MAX(MAX(MLFSELog, LLFSELog), OffFSELog)
inikepf3c65032016-03-04 20:04:25 +0100185
Yann Collet4191efa2017-11-08 11:05:32 -0800186static const U32 LL_bits[MaxLL+1] = { 0, 0, 0, 0, 0, 0, 0, 0,
187 0, 0, 0, 0, 0, 0, 0, 0,
188 1, 1, 1, 1, 2, 2, 3, 3,
189 4, 6, 7, 8, 9,10,11,12,
Yann Colletb0aec172016-03-21 13:24:16 +0100190 13,14,15,16 };
Yann Collet4191efa2017-11-08 11:05:32 -0800191static const S16 LL_defaultNorm[MaxLL+1] = { 4, 3, 2, 2, 2, 2, 2, 2,
192 2, 2, 2, 2, 2, 1, 1, 1,
193 2, 2, 2, 2, 2, 2, 2, 2,
194 2, 3, 2, 1, 1, 1, 1, 1,
Yann Collet48537162016-04-07 15:24:29 +0200195 -1,-1,-1,-1 };
Yann Collet51f4d562016-09-22 15:57:28 +0200196#define LL_DEFAULTNORMLOG 6 /* for static allocation */
197static const U32 LL_defaultNormLog = LL_DEFAULTNORMLOG;
Yann Colletb0aec172016-03-21 13:24:16 +0100198
Yann Collet4191efa2017-11-08 11:05:32 -0800199static const U32 ML_bits[MaxML+1] = { 0, 0, 0, 0, 0, 0, 0, 0,
200 0, 0, 0, 0, 0, 0, 0, 0,
201 0, 0, 0, 0, 0, 0, 0, 0,
202 0, 0, 0, 0, 0, 0, 0, 0,
203 1, 1, 1, 1, 2, 2, 3, 3,
204 4, 4, 5, 7, 8, 9,10,11,
Yann Collet48537162016-04-07 15:24:29 +0200205 12,13,14,15,16 };
Yann Collet4191efa2017-11-08 11:05:32 -0800206static const S16 ML_defaultNorm[MaxML+1] = { 1, 4, 3, 2, 2, 2, 2, 2,
207 2, 1, 1, 1, 1, 1, 1, 1,
208 1, 1, 1, 1, 1, 1, 1, 1,
209 1, 1, 1, 1, 1, 1, 1, 1,
210 1, 1, 1, 1, 1, 1, 1, 1,
211 1, 1, 1, 1, 1, 1,-1,-1,
Yann Collet48537162016-04-07 15:24:29 +0200212 -1,-1,-1,-1,-1 };
Yann Collet51f4d562016-09-22 15:57:28 +0200213#define ML_DEFAULTNORMLOG 6 /* for static allocation */
214static const U32 ML_defaultNormLog = ML_DEFAULTNORMLOG;
Yann Colletfadda6c2016-03-22 12:14:26 +0100215
Yann Collet4191efa2017-11-08 11:05:32 -0800216static const S16 OF_defaultNorm[DefaultMaxOff+1] = { 1, 1, 1, 1, 1, 1, 2, 2,
217 2, 1, 1, 1, 1, 1, 1, 1,
218 1, 1, 1, 1, 1, 1, 1, 1,
219 -1,-1,-1,-1,-1 };
Yann Collet51f4d562016-09-22 15:57:28 +0200220#define OF_DEFAULTNORMLOG 5 /* for static allocation */
221static const U32 OF_defaultNormLog = OF_DEFAULTNORMLOG;
Yann Collet48537162016-04-07 15:24:29 +0200222
Yann Collet2acb5d32015-10-29 16:49:43 +0100223
Yann Colletfb810d62016-01-28 00:18:06 +0100224/*-*******************************************
Yann Collet14983e72015-11-11 21:38:21 +0100225* Shared functions to include for inlining
Yann Colletfb810d62016-01-28 00:18:06 +0100226*********************************************/
Yann Collet2acb5d32015-10-29 16:49:43 +0100227static void ZSTD_copy8(void* dst, const void* src) { memcpy(dst, src, 8); }
mgrice812e8f22019-07-11 15:31:07 -0700228
Yann Collet2acb5d32015-10-29 16:49:43 +0100229#define COPY8(d,s) { ZSTD_copy8(d,s); d+=8; s+=8; }
mgrice812e8f22019-07-11 15:31:07 -0700230static void ZSTD_copy16(void* dst, const void* src) { memcpy(dst, src, 16); }
231#define COPY16(d,s) { ZSTD_copy16(d,s); d+=16; s+=16; }
232
Nick Terrellcdad7fa2019-09-20 00:52:15 -0700233#define WILDCOPY_OVERLENGTH 32
Nick Terrellefd37a62019-09-19 13:25:03 -0700234#define WILDCOPY_VECLEN 16
mgrice812e8f22019-07-11 15:31:07 -0700235
236typedef enum {
237 ZSTD_no_overlap,
Yann Colletcb18fff2019-09-24 17:50:58 -0700238 ZSTD_overlap_src_before_dst
mgrice812e8f22019-07-11 15:31:07 -0700239 /* ZSTD_overlap_dst_before_src, */
240} ZSTD_overlap_e;
Yann Collet2acb5d32015-10-29 16:49:43 +0100241
Yann Collet953ce722016-02-04 15:28:14 +0100242/*! ZSTD_wildcopy() :
Nick Terrellefd37a62019-09-19 13:25:03 -0700243 * Custom version of memcpy(), can over read/write up to WILDCOPY_OVERLENGTH bytes (if length==0)
244 * @param ovtype controls the overlap detection
245 * - ZSTD_no_overlap: The source and destination are guaranteed to be at least WILDCOPY_VECLEN bytes apart.
246 * - ZSTD_overlap_src_before_dst: The src and dst may overlap, but they MUST be at least 8 bytes apart.
247 * The src buffer must be before the dst buffer.
248 */
Nick Terrelle32e3e82020-01-28 20:37:04 -0800249MEM_STATIC FORCE_INLINE_ATTR
Nick Terrell44c65da2019-09-20 12:23:25 -0700250void ZSTD_wildcopy(void* dst, const void* src, ptrdiff_t length, ZSTD_overlap_e const ovtype)
Yann Collet2acb5d32015-10-29 16:49:43 +0100251{
mgrice812e8f22019-07-11 15:31:07 -0700252 ptrdiff_t diff = (BYTE*)dst - (const BYTE*)src;
Yann Collet2acb5d32015-10-29 16:49:43 +0100253 const BYTE* ip = (const BYTE*)src;
254 BYTE* op = (BYTE*)dst;
255 BYTE* const oend = op + length;
mgrice812e8f22019-07-11 15:31:07 -0700256
Nick Terrellefd37a62019-09-19 13:25:03 -0700257 assert(diff >= 8 || (ovtype == ZSTD_no_overlap && diff <= -WILDCOPY_VECLEN));
mgriceb8305992019-08-27 14:49:23 -0700258
Nick Terrellefd37a62019-09-19 13:25:03 -0700259 if (ovtype == ZSTD_overlap_src_before_dst && diff < WILDCOPY_VECLEN) {
260 /* Handle short offset copies. */
mgriceb8305992019-08-27 14:49:23 -0700261 do {
Nick Terrellefd37a62019-09-19 13:25:03 -0700262 COPY8(op, ip)
263 } while (op < oend);
264 } else {
265 assert(diff >= WILDCOPY_VECLEN || diff <= -WILDCOPY_VECLEN);
Nick Terrelle32e3e82020-01-28 20:37:04 -0800266 /* Separate out the first COPY16() call because the copy length is
Nick Terrellefd37a62019-09-19 13:25:03 -0700267 * almost certain to be short, so the branches have different
Nick Terrelle32e3e82020-01-28 20:37:04 -0800268 * probabilities. Since it is almost certain to be short, only do
269 * one COPY16() in the first call. Then, do two calls per loop since
270 * at that point it is more likely to have a high trip count.
Nick Terrellefd37a62019-09-19 13:25:03 -0700271 */
272 COPY16(op, ip);
Nick Terrellefd37a62019-09-19 13:25:03 -0700273 if (op >= oend) return;
274 do {
275 COPY16(op, ip);
Nick Terrellcdad7fa2019-09-20 00:52:15 -0700276 COPY16(op, ip);
mgriceb8305992019-08-27 14:49:23 -0700277 }
278 while (op < oend);
mgrice812e8f22019-07-11 15:31:07 -0700279 }
280}
281
Carl Woffendenedd9a072020-04-07 11:02:06 +0200282MEM_STATIC size_t ZSTD_limitCopy(void* dst, size_t dstCapacity, const void* src, size_t srcSize)
283{
284 size_t const length = MIN(dstCapacity, srcSize);
285 if (length > 0) {
286 memcpy(dst, src, length);
287 }
288 return length;
289}
Yann Collet7d360282016-02-12 00:07:30 +0100290
Bimba Shrestha01548662020-04-03 14:26:15 -0700291/* define "workspace is too large" as this number of times larger than needed */
292#define ZSTD_WORKSPACETOOLARGE_FACTOR 3
293
294/* when workspace is continuously too large
295 * during at least this number of times,
296 * context's memory usage is considered wasteful,
297 * because it's sized to handle a worst case scenario which rarely happens.
298 * In which case, resize it down to free some memory */
299#define ZSTD_WORKSPACETOOLARGE_MAXDURATION 128
300
Yann Collet7d360282016-02-12 00:07:30 +0100301
302/*-*******************************************
Yann Collet8b6aecf2017-11-07 15:27:06 -0800303* Private declarations
Yann Collet7d360282016-02-12 00:07:30 +0100304*********************************************/
Yann Colleted57d852016-07-29 21:22:17 +0200305typedef struct seqDef_s {
306 U32 offset;
307 U16 litLength;
308 U16 matchLength;
309} seqDef;
310
inikep87d4f3d2016-03-02 15:56:24 +0100311typedef struct {
Yann Colletc0ce4f12016-07-30 00:55:13 +0200312 seqDef* sequencesStart;
Yann Colleted57d852016-07-29 21:22:17 +0200313 seqDef* sequences;
Yann Collet7d360282016-02-12 00:07:30 +0100314 BYTE* litStart;
315 BYTE* lit;
Yann Colleted57d852016-07-29 21:22:17 +0200316 BYTE* llCode;
317 BYTE* mlCode;
318 BYTE* ofCode;
Nick Terrell924944e2018-08-21 14:20:02 -0700319 size_t maxNbSeq;
Nick Terrell5e580de2018-08-28 13:24:44 -0700320 size_t maxNbLit;
Yann Collet5d393572016-04-07 17:19:00 +0200321 U32 longLengthID; /* 0 == no longLength; 1 == Lit.longLength; 2 == Match.longLength; */
322 U32 longLengthPos;
Nick Terrell7a28b9e2017-07-17 15:29:11 -0700323} seqStore_t;
324
Nick Terrelle103d7b2020-05-01 16:11:47 -0700325typedef struct {
326 U32 litLength;
327 U32 matchLength;
328} ZSTD_sequenceLength;
329
330/**
331 * Returns the ZSTD_sequenceLength for the given sequences. It handles the decoding of long sequences
332 * indicated by longLengthPos and longLengthID, and adds MINMATCH back to matchLength.
333 */
334MEM_STATIC ZSTD_sequenceLength ZSTD_getSequenceLength(seqStore_t const* seqStore, seqDef const* seq)
335{
336 ZSTD_sequenceLength seqLen;
337 seqLen.litLength = seq->litLength;
338 seqLen.matchLength = seq->matchLength + MINMATCH;
339 if (seqStore->longLengthPos == (U32)(seq - seqStore->sequencesStart)) {
340 if (seqStore->longLengthID == 1) {
341 seqLen.litLength += 0xFFFF;
342 }
343 if (seqStore->longLengthID == 2) {
344 seqLen.matchLength += 0xFFFF;
345 }
346 }
347 return seqLen;
348}
349
shakeelrao19b75b62019-03-15 18:04:19 -0700350/**
351 * Contains the compressed frame size and an upper-bound for the decompressed frame size.
shakeelrao0033bb42019-03-17 17:41:27 -0700352 * Note: before using `compressedSize`, check for errors using ZSTD_isError().
353 * similarly, before using `decompressedBound`, check for errors using:
354 * `decompressedBound != ZSTD_CONTENTSIZE_ERROR`
shakeelrao19b75b62019-03-15 18:04:19 -0700355 */
356typedef struct {
357 size_t compressedSize;
358 unsigned long long decompressedBound;
shakeelrao0033bb42019-03-17 17:41:27 -0700359} ZSTD_frameSizeInfo; /* decompress & legacy */
shakeelrao19b75b62019-03-15 18:04:19 -0700360
Yann Collet8b6aecf2017-11-07 15:27:06 -0800361const seqStore_t* ZSTD_getSeqStore(const ZSTD_CCtx* ctx); /* compress & dictBuilder */
362void ZSTD_seqToCodes(const seqStore_t* seqStorePtr); /* compress, dictBuilder, decodeCorpus (shouldn't get its definition from here) */
Yann Collet2acb5d32015-10-29 16:49:43 +0100363
inikepc4807f42016-06-02 15:11:39 +0200364/* custom memory allocation functions */
Yann Collet23b6e052016-08-28 21:05:43 -0700365void* ZSTD_malloc(size_t size, ZSTD_customMem customMem);
Yann Collet44e45e82017-05-30 16:12:06 -0700366void* ZSTD_calloc(size_t size, ZSTD_customMem customMem);
Yann Collet23b6e052016-08-28 21:05:43 -0700367void ZSTD_free(void* ptr, ZSTD_customMem customMem);
368
inikep2a746092016-06-03 14:53:51 +0200369
Yann Collet8b6aecf2017-11-07 15:27:06 -0800370MEM_STATIC U32 ZSTD_highbit32(U32 val) /* compress, dictBuilder, decodeCorpus */
Yann Colletc154d9d2016-07-27 14:37:00 +0200371{
Stella Laue50ed1f2017-08-22 11:55:42 -0700372 assert(val != 0);
373 {
Yann Colletc154d9d2016-07-27 14:37:00 +0200374# if defined(_MSC_VER) /* Visual */
Stella Laue50ed1f2017-08-22 11:55:42 -0700375 unsigned long r=0;
Bimba Shresthadba3abc2020-03-05 12:20:59 -0800376 return _BitScanReverse(&r, val) ? (unsigned)r : 0;
Yann Colletc154d9d2016-07-27 14:37:00 +0200377# elif defined(__GNUC__) && (__GNUC__ >= 3) /* GCC Intrinsic */
Dávid Bolvanský1ab1a402019-09-23 21:32:56 +0200378 return __builtin_clz (val) ^ 31;
Joseph Chen3855bc42019-07-29 15:20:37 +0800379# elif defined(__ICCARM__) /* IAR Intrinsic */
380 return 31 - __CLZ(val);
Yann Colletc154d9d2016-07-27 14:37:00 +0200381# else /* Software version */
Yann Collet0a0a2122017-11-28 14:07:03 -0800382 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 };
Stella Laue50ed1f2017-08-22 11:55:42 -0700383 U32 v = val;
Stella Laue50ed1f2017-08-22 11:55:42 -0700384 v |= v >> 1;
385 v |= v >> 2;
386 v |= v >> 4;
387 v |= v >> 8;
388 v |= v >> 16;
Yann Collet0a0a2122017-11-28 14:07:03 -0800389 return DeBruijnClz[(v * 0x07C4ACDDU) >> 27];
Yann Colletc154d9d2016-07-27 14:37:00 +0200390# endif
Stella Laue50ed1f2017-08-22 11:55:42 -0700391 }
Yann Colletc154d9d2016-07-27 14:37:00 +0200392}
393
394
Yann Collet32dfae62017-01-19 10:32:55 -0800395/* ZSTD_invalidateRepCodes() :
396 * ensures next compression will not use repcodes from previous block.
397 * Note : only works with regular variant;
398 * do not use with extDict variant ! */
Yann Collet8b6aecf2017-11-07 15:27:06 -0800399void ZSTD_invalidateRepCodes(ZSTD_CCtx* cctx); /* zstdmt, adaptive_compression (shouldn't get this definition from here) */
Yann Collet32dfae62017-01-19 10:32:55 -0800400
401
Yann Colletf04deff2017-07-06 01:42:46 -0700402typedef struct {
403 blockType_e blockType;
404 U32 lastBlock;
405 U32 origSize;
Yann Collet2b491402018-10-25 16:28:41 -0700406} blockProperties_t; /* declared here for decompress and fullbench */
Yann Colletf04deff2017-07-06 01:42:46 -0700407
408/*! ZSTD_getcBlockSize() :
Yann Collet4191efa2017-11-08 11:05:32 -0800409 * Provides the size of compressed block from block header `src` */
410/* Used by: decompress, fullbench (does not get its definition from here) */
Yann Colletf04deff2017-07-06 01:42:46 -0700411size_t ZSTD_getcBlockSize(const void* src, size_t srcSize,
412 blockProperties_t* bpPtr);
413
Yann Collet2b491402018-10-25 16:28:41 -0700414/*! ZSTD_decodeSeqHeaders() :
415 * decode sequence header from src */
416/* Used by: decompress, fullbench (does not get its definition from here) */
417size_t ZSTD_decodeSeqHeaders(ZSTD_DCtx* dctx, int* nbSeqPtr,
418 const void* src, size_t srcSize);
419
420
Nick Terrellde6c6bc2017-08-24 18:09:50 -0700421#if defined (__cplusplus)
422}
423#endif
Yann Colletf04deff2017-07-06 01:42:46 -0700424
Yann Collet2acb5d32015-10-29 16:49:43 +0100425#endif /* ZSTD_CCOMMON_H_MODULE */