xref: /freebsd/sys/contrib/zstd/lib/compress/zstd_ldm.h (revision 5ff13fbc199bdf5f0572845351c68ee5ca828e71)
10c16b537SWarner Losh /*
2*5ff13fbcSAllan Jude  * Copyright (c) Yann Collet, Facebook, Inc.
30c16b537SWarner Losh  * All rights reserved.
40c16b537SWarner Losh  *
50c16b537SWarner Losh  * This source code is licensed under both the BSD-style license (found in the
60c16b537SWarner Losh  * LICENSE file in the root directory of this source tree) and the GPLv2 (found
70c16b537SWarner Losh  * in the COPYING file in the root directory of this source tree).
837f1f268SConrad Meyer  * You may select, at your option, one of the above-listed licenses.
90c16b537SWarner Losh  */
100c16b537SWarner Losh 
110c16b537SWarner Losh #ifndef ZSTD_LDM_H
120c16b537SWarner Losh #define ZSTD_LDM_H
130c16b537SWarner Losh 
140c16b537SWarner Losh #if defined (__cplusplus)
150c16b537SWarner Losh extern "C" {
160c16b537SWarner Losh #endif
170c16b537SWarner Losh 
18052d3c12SConrad Meyer #include "zstd_compress_internal.h"   /* ldmParams_t, U32 */
1937f1f268SConrad Meyer #include "../zstd.h"   /* ZSTD_CCtx, size_t */
20052d3c12SConrad Meyer 
210c16b537SWarner Losh /*-*************************************
220c16b537SWarner Losh *  Long distance matching
230c16b537SWarner Losh ***************************************/
240c16b537SWarner Losh 
25a0483764SConrad Meyer #define ZSTD_LDM_DEFAULT_WINDOW_LOG ZSTD_WINDOWLOG_LIMIT_DEFAULT
260c16b537SWarner Losh 
2737f1f268SConrad Meyer void ZSTD_ldm_fillHashTable(
2837f1f268SConrad Meyer             ldmState_t* state, const BYTE* ip,
2937f1f268SConrad Meyer             const BYTE* iend, ldmParams_t const* params);
3037f1f268SConrad Meyer 
3119fcbaf1SConrad Meyer /**
3219fcbaf1SConrad Meyer  * ZSTD_ldm_generateSequences():
330c16b537SWarner Losh  *
3419fcbaf1SConrad Meyer  * Generates the sequences using the long distance match finder.
3519fcbaf1SConrad Meyer  * Generates long range matching sequences in `sequences`, which parse a prefix
3619fcbaf1SConrad Meyer  * of the source. `sequences` must be large enough to store every sequence,
3719fcbaf1SConrad Meyer  * which can be checked with `ZSTD_ldm_getMaxNbSeq()`.
3819fcbaf1SConrad Meyer  * @returns 0 or an error code.
390c16b537SWarner Losh  *
4019fcbaf1SConrad Meyer  * NOTE: The user must have called ZSTD_window_update() for all of the input
4119fcbaf1SConrad Meyer  * they have, even if they pass it to ZSTD_ldm_generateSequences() in chunks.
4219fcbaf1SConrad Meyer  * NOTE: This function returns an error if it runs out of space to store
4319fcbaf1SConrad Meyer  *       sequences.
4419fcbaf1SConrad Meyer  */
4519fcbaf1SConrad Meyer size_t ZSTD_ldm_generateSequences(
4619fcbaf1SConrad Meyer             ldmState_t* ldms, rawSeqStore_t* sequences,
4719fcbaf1SConrad Meyer             ldmParams_t const* params, void const* src, size_t srcSize);
480c16b537SWarner Losh 
4919fcbaf1SConrad Meyer /**
5019fcbaf1SConrad Meyer  * ZSTD_ldm_blockCompress():
5119fcbaf1SConrad Meyer  *
5219fcbaf1SConrad Meyer  * Compresses a block using the predefined sequences, along with a secondary
5319fcbaf1SConrad Meyer  * block compressor. The literals section of every sequence is passed to the
5419fcbaf1SConrad Meyer  * secondary block compressor, and those sequences are interspersed with the
5519fcbaf1SConrad Meyer  * predefined sequences. Returns the length of the last literals.
5619fcbaf1SConrad Meyer  * Updates `rawSeqStore.pos` to indicate how many sequences have been consumed.
5719fcbaf1SConrad Meyer  * `rawSeqStore.seq` may also be updated to split the last sequence between two
5819fcbaf1SConrad Meyer  * blocks.
5919fcbaf1SConrad Meyer  * @return The length of the last literals.
6019fcbaf1SConrad Meyer  *
6119fcbaf1SConrad Meyer  * NOTE: The source must be at most the maximum block size, but the predefined
6219fcbaf1SConrad Meyer  * sequences can be any size, and may be longer than the block. In the case that
6319fcbaf1SConrad Meyer  * they are longer than the block, the last sequences may need to be split into
6419fcbaf1SConrad Meyer  * two. We handle that case correctly, and update `rawSeqStore` appropriately.
6519fcbaf1SConrad Meyer  * NOTE: This function does not return any errors.
6619fcbaf1SConrad Meyer  */
6719fcbaf1SConrad Meyer size_t ZSTD_ldm_blockCompress(rawSeqStore_t* rawSeqStore,
6819fcbaf1SConrad Meyer             ZSTD_matchState_t* ms, seqStore_t* seqStore, U32 rep[ZSTD_REP_NUM],
69*5ff13fbcSAllan Jude             ZSTD_paramSwitch_e useRowMatchFinder,
700f743729SConrad Meyer             void const* src, size_t srcSize);
7119fcbaf1SConrad Meyer 
7219fcbaf1SConrad Meyer /**
7319fcbaf1SConrad Meyer  * ZSTD_ldm_skipSequences():
7419fcbaf1SConrad Meyer  *
7519fcbaf1SConrad Meyer  * Skip past `srcSize` bytes worth of sequences in `rawSeqStore`.
7619fcbaf1SConrad Meyer  * Avoids emitting matches less than `minMatch` bytes.
77*5ff13fbcSAllan Jude  * Must be called for data that is not passed to ZSTD_ldm_blockCompress().
7819fcbaf1SConrad Meyer  */
7919fcbaf1SConrad Meyer void ZSTD_ldm_skipSequences(rawSeqStore_t* rawSeqStore, size_t srcSize,
8019fcbaf1SConrad Meyer     U32 const minMatch);
8119fcbaf1SConrad Meyer 
82f7cd7fe5SConrad Meyer /* ZSTD_ldm_skipRawSeqStoreBytes():
83f7cd7fe5SConrad Meyer  * Moves forward in rawSeqStore by nbBytes, updating fields 'pos' and 'posInSequence'.
84f7cd7fe5SConrad Meyer  * Not to be used in conjunction with ZSTD_ldm_skipSequences().
85f7cd7fe5SConrad Meyer  * Must be called for data with is not passed to ZSTD_ldm_blockCompress().
86f7cd7fe5SConrad Meyer  */
87f7cd7fe5SConrad Meyer void ZSTD_ldm_skipRawSeqStoreBytes(rawSeqStore_t* rawSeqStore, size_t nbBytes);
880c16b537SWarner Losh 
890c16b537SWarner Losh /** ZSTD_ldm_getTableSize() :
9019fcbaf1SConrad Meyer  *  Estimate the space needed for long distance matching tables or 0 if LDM is
9119fcbaf1SConrad Meyer  *  disabled.
9219fcbaf1SConrad Meyer  */
9319fcbaf1SConrad Meyer size_t ZSTD_ldm_getTableSize(ldmParams_t params);
9419fcbaf1SConrad Meyer 
9519fcbaf1SConrad Meyer /** ZSTD_ldm_getSeqSpace() :
9619fcbaf1SConrad Meyer  *  Return an upper bound on the number of sequences that can be produced by
9719fcbaf1SConrad Meyer  *  the long distance matcher, or 0 if LDM is disabled.
9819fcbaf1SConrad Meyer  */
9919fcbaf1SConrad Meyer size_t ZSTD_ldm_getMaxNbSeq(ldmParams_t params, size_t maxChunkSize);
1000c16b537SWarner Losh 
1010c16b537SWarner Losh /** ZSTD_ldm_adjustParameters() :
102a0483764SConrad Meyer  *  If the params->hashRateLog is not set, set it to its default value based on
1030c16b537SWarner Losh  *  windowLog and params->hashLog.
1040c16b537SWarner Losh  *
1050c16b537SWarner Losh  *  Ensures that params->bucketSizeLog is <= params->hashLog (setting it to
10619fcbaf1SConrad Meyer  *  params->hashLog if it is not).
10719fcbaf1SConrad Meyer  *
10819fcbaf1SConrad Meyer  *  Ensures that the minMatchLength >= targetLength during optimal parsing.
10919fcbaf1SConrad Meyer  */
11019fcbaf1SConrad Meyer void ZSTD_ldm_adjustParameters(ldmParams_t* params,
11119fcbaf1SConrad Meyer                                ZSTD_compressionParameters const* cParams);
1120c16b537SWarner Losh 
1130c16b537SWarner Losh #if defined (__cplusplus)
1140c16b537SWarner Losh }
1150c16b537SWarner Losh #endif
1160c16b537SWarner Losh 
1170c16b537SWarner Losh #endif /* ZSTD_FAST_H */
118