tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

lz4hc.h (20308B)


      1 /*
      2   LZ4 HC - High Compression Mode of LZ4
      3   Header File
      4   Copyright (C) 2011-2020, Yann Collet.
      5   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
      6 
      7   Redistribution and use in source and binary forms, with or without
      8   modification, are permitted provided that the following conditions are
      9   met:
     10 
     11       * Redistributions of source code must retain the above copyright
     12   notice, this list of conditions and the following disclaimer.
     13       * Redistributions in binary form must reproduce the above
     14   copyright notice, this list of conditions and the following disclaimer
     15   in the documentation and/or other materials provided with the
     16   distribution.
     17 
     18   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 
     30   You can contact the author at :
     31   - LZ4 source repository : https://github.com/lz4/lz4
     32   - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
     33 */
     34 #ifndef LZ4_HC_H_19834876238432
     35 #define LZ4_HC_H_19834876238432
     36 
     37 #if defined (__cplusplus)
     38 extern "C" {
     39 #endif
     40 
     41 /* --- Dependency --- */
     42 /* note : lz4hc requires lz4.h/lz4.c for compilation */
     43 #include "lz4.h"   /* stddef, LZ4LIB_API, LZ4_DEPRECATED */
     44 
     45 
     46 /* --- Useful constants --- */
     47 #define LZ4HC_CLEVEL_MIN         2
     48 #define LZ4HC_CLEVEL_DEFAULT     9
     49 #define LZ4HC_CLEVEL_OPT_MIN    10
     50 #define LZ4HC_CLEVEL_MAX        12
     51 
     52 
     53 /*-************************************
     54 *  Block Compression
     55 **************************************/
     56 /*! LZ4_compress_HC() :
     57 *  Compress data from `src` into `dst`, using the powerful but slower "HC" algorithm.
     58 * `dst` must be already allocated.
     59 *  Compression is guaranteed to succeed if `dstCapacity >= LZ4_compressBound(srcSize)` (see "lz4.h")
     60 *  Max supported `srcSize` value is LZ4_MAX_INPUT_SIZE (see "lz4.h")
     61 * `compressionLevel` : any value between 1 and LZ4HC_CLEVEL_MAX will work.
     62 *                      Values > LZ4HC_CLEVEL_MAX behave the same as LZ4HC_CLEVEL_MAX.
     63 * @return : the number of bytes written into 'dst'
     64 *           or 0 if compression fails.
     65 */
     66 LZ4LIB_API int LZ4_compress_HC (const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel);
     67 
     68 
     69 /* Note :
     70 *   Decompression functions are provided within "lz4.h" (BSD license)
     71 */
     72 
     73 
     74 /*! LZ4_compress_HC_extStateHC() :
     75 *  Same as LZ4_compress_HC(), but using an externally allocated memory segment for `state`.
     76 * `state` size is provided by LZ4_sizeofStateHC().
     77 *  Memory segment must be aligned on 8-bytes boundaries (which a normal malloc() should do properly).
     78 */
     79 LZ4LIB_API int LZ4_sizeofStateHC(void);
     80 LZ4LIB_API int LZ4_compress_HC_extStateHC(void* stateHC, const char* src, char* dst, int srcSize, int maxDstSize, int compressionLevel);
     81 
     82 
     83 /*! LZ4_compress_HC_destSize() : v1.9.0+
     84 *  Will compress as much data as possible from `src`
     85 *  to fit into `targetDstSize` budget.
     86 *  Result is provided in 2 parts :
     87 * @return : the number of bytes written into 'dst' (necessarily <= targetDstSize)
     88 *           or 0 if compression fails.
     89 * `srcSizePtr` : on success, *srcSizePtr is updated to indicate how much bytes were read from `src`
     90 */
     91 LZ4LIB_API int LZ4_compress_HC_destSize(void* stateHC,
     92                                  const char* src, char* dst,
     93                                        int* srcSizePtr, int targetDstSize,
     94                                        int compressionLevel);
     95 
     96 
     97 /*-************************************
     98 *  Streaming Compression
     99 *  Bufferless synchronous API
    100 **************************************/
    101 typedef union LZ4_streamHC_u LZ4_streamHC_t;   /* incomplete type (defined later) */
    102 
    103 /*! LZ4_createStreamHC() and LZ4_freeStreamHC() :
    104 *  These functions create and release memory for LZ4 HC streaming state.
    105 *  Newly created states are automatically initialized.
    106 *  A same state can be used multiple times consecutively,
    107 *  starting with LZ4_resetStreamHC_fast() to start a new stream of blocks.
    108 */
    109 LZ4LIB_API LZ4_streamHC_t* LZ4_createStreamHC(void);
    110 LZ4LIB_API int             LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr);
    111 
    112 /*
    113  These functions compress data in successive blocks of any size,
    114  using previous blocks as dictionary, to improve compression ratio.
    115  One key assumption is that previous blocks (up to 64 KB) remain read-accessible while compressing next blocks.
    116  There is an exception for ring buffers, which can be smaller than 64 KB.
    117  Ring-buffer scenario is automatically detected and handled within LZ4_compress_HC_continue().
    118 
    119  Before starting compression, state must be allocated and properly initialized.
    120  LZ4_createStreamHC() does both, though compression level is set to LZ4HC_CLEVEL_DEFAULT.
    121 
    122  Selecting the compression level can be done with LZ4_resetStreamHC_fast() (starts a new stream)
    123  or LZ4_setCompressionLevel() (anytime, between blocks in the same stream) (experimental).
    124  LZ4_resetStreamHC_fast() only works on states which have been properly initialized at least once,
    125  which is automatically the case when state is created using LZ4_createStreamHC().
    126 
    127  After reset, a first "fictional block" can be designated as initial dictionary,
    128  using LZ4_loadDictHC() (Optional).
    129  Note: In order for LZ4_loadDictHC() to create the correct data structure,
    130  it is essential to set the compression level _before_ loading the dictionary.
    131 
    132  Invoke LZ4_compress_HC_continue() to compress each successive block.
    133  The number of blocks is unlimited.
    134  Previous input blocks, including initial dictionary when present,
    135  must remain accessible and unmodified during compression.
    136 
    137  It's allowed to update compression level anytime between blocks,
    138  using LZ4_setCompressionLevel() (experimental).
    139 
    140 @dst buffer should be sized to handle worst case scenarios
    141  (see LZ4_compressBound(), it ensures compression success).
    142  In case of failure, the API does not guarantee recovery,
    143  so the state _must_ be reset.
    144  To ensure compression success
    145  whenever @dst buffer size cannot be made >= LZ4_compressBound(),
    146  consider using LZ4_compress_HC_continue_destSize().
    147 
    148  Whenever previous input blocks can't be preserved unmodified in-place during compression of next blocks,
    149  it's possible to copy the last blocks into a more stable memory space, using LZ4_saveDictHC().
    150  Return value of LZ4_saveDictHC() is the size of dictionary effectively saved into 'safeBuffer' (<= 64 KB)
    151 
    152  After completing a streaming compression,
    153  it's possible to start a new stream of blocks, using the same LZ4_streamHC_t state,
    154  just by resetting it, using LZ4_resetStreamHC_fast().
    155 */
    156 
    157 LZ4LIB_API void LZ4_resetStreamHC_fast(LZ4_streamHC_t* streamHCPtr, int compressionLevel);   /* v1.9.0+ */
    158 LZ4LIB_API int  LZ4_loadDictHC (LZ4_streamHC_t* streamHCPtr, const char* dictionary, int dictSize);
    159 
    160 LZ4LIB_API int LZ4_compress_HC_continue (LZ4_streamHC_t* streamHCPtr,
    161                                   const char* src, char* dst,
    162                                         int srcSize, int maxDstSize);
    163 
    164 /*! LZ4_compress_HC_continue_destSize() : v1.9.0+
    165 *  Similar to LZ4_compress_HC_continue(),
    166 *  but will read as much data as possible from `src`
    167 *  to fit into `targetDstSize` budget.
    168 *  Result is provided into 2 parts :
    169 * @return : the number of bytes written into 'dst' (necessarily <= targetDstSize)
    170 *           or 0 if compression fails.
    171 * `srcSizePtr` : on success, *srcSizePtr will be updated to indicate how much bytes were read from `src`.
    172 *           Note that this function may not consume the entire input.
    173 */
    174 LZ4LIB_API int LZ4_compress_HC_continue_destSize(LZ4_streamHC_t* LZ4_streamHCPtr,
    175                                           const char* src, char* dst,
    176                                                 int* srcSizePtr, int targetDstSize);
    177 
    178 LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, int maxDictSize);
    179 
    180 
    181 /*! LZ4_attach_HC_dictionary() : stable since v1.10.0
    182 *  This API allows for the efficient re-use of a static dictionary many times.
    183 *
    184 *  Rather than re-loading the dictionary buffer into a working context before
    185 *  each compression, or copying a pre-loaded dictionary's LZ4_streamHC_t into a
    186 *  working LZ4_streamHC_t, this function introduces a no-copy setup mechanism,
    187 *  in which the working stream references the dictionary stream in-place.
    188 *
    189 *  Several assumptions are made about the state of the dictionary stream.
    190 *  Currently, only streams which have been prepared by LZ4_loadDictHC() should
    191 *  be expected to work.
    192 *
    193 *  Alternatively, the provided dictionary stream pointer may be NULL, in which
    194 *  case any existing dictionary stream is unset.
    195 *
    196 *  A dictionary should only be attached to a stream without any history (i.e.,
    197 *  a stream that has just been reset).
    198 *
    199 *  The dictionary will remain attached to the working stream only for the
    200 *  current stream session. Calls to LZ4_resetStreamHC(_fast) will remove the
    201 *  dictionary context association from the working stream. The dictionary
    202 *  stream (and source buffer) must remain in-place / accessible / unchanged
    203 *  through the lifetime of the stream session.
    204 */
    205 LZ4LIB_API void
    206 LZ4_attach_HC_dictionary(LZ4_streamHC_t* working_stream,
    207                   const LZ4_streamHC_t* dictionary_stream);
    208 
    209 
    210 /*^**********************************************
    211 * !!!!!!   STATIC LINKING ONLY   !!!!!!
    212 ***********************************************/
    213 
    214 /*-******************************************************************
    215 * PRIVATE DEFINITIONS :
    216 * Do not use these definitions directly.
    217 * They are merely exposed to allow static allocation of `LZ4_streamHC_t`.
    218 * Declare an `LZ4_streamHC_t` directly, rather than any type below.
    219 * Even then, only do so in the context of static linking, as definitions may change between versions.
    220 ********************************************************************/
    221 
    222 #define LZ4HC_DICTIONARY_LOGSIZE 16
    223 #define LZ4HC_MAXD (1<<LZ4HC_DICTIONARY_LOGSIZE)
    224 #define LZ4HC_MAXD_MASK (LZ4HC_MAXD - 1)
    225 
    226 #define LZ4HC_HASH_LOG 15
    227 #define LZ4HC_HASHTABLESIZE (1 << LZ4HC_HASH_LOG)
    228 #define LZ4HC_HASH_MASK (LZ4HC_HASHTABLESIZE - 1)
    229 
    230 
    231 /* Never ever use these definitions directly !
    232 * Declare or allocate an LZ4_streamHC_t instead.
    233 **/
    234 typedef struct LZ4HC_CCtx_internal LZ4HC_CCtx_internal;
    235 struct LZ4HC_CCtx_internal
    236 {
    237    LZ4_u32 hashTable[LZ4HC_HASHTABLESIZE];
    238    LZ4_u16 chainTable[LZ4HC_MAXD];
    239    const LZ4_byte* end;     /* next block here to continue on current prefix */
    240    const LZ4_byte* prefixStart;  /* Indexes relative to this position */
    241    const LZ4_byte* dictStart; /* alternate reference for extDict */
    242    LZ4_u32 dictLimit;       /* below that point, need extDict */
    243    LZ4_u32 lowLimit;        /* below that point, no more history */
    244    LZ4_u32 nextToUpdate;    /* index from which to continue dictionary update */
    245    short   compressionLevel;
    246    LZ4_i8  favorDecSpeed;   /* favor decompression speed if this flag set,
    247                                otherwise, favor compression ratio */
    248    LZ4_i8  dirty;           /* stream has to be fully reset if this flag is set */
    249    const LZ4HC_CCtx_internal* dictCtx;
    250 };
    251 
    252 #define LZ4_STREAMHC_MINSIZE  262200  /* static size, for inter-version compatibility */
    253 union LZ4_streamHC_u {
    254    char minStateSize[LZ4_STREAMHC_MINSIZE];
    255    LZ4HC_CCtx_internal internal_donotuse;
    256 }; /* previously typedef'd to LZ4_streamHC_t */
    257 
    258 /* LZ4_streamHC_t :
    259 * This structure allows static allocation of LZ4 HC streaming state.
    260 * This can be used to allocate statically on stack, or as part of a larger structure.
    261 *
    262 * Such state **must** be initialized using LZ4_initStreamHC() before first use.
    263 *
    264 * Note that invoking LZ4_initStreamHC() is not required when
    265 * the state was created using LZ4_createStreamHC() (which is recommended).
    266 * Using the normal builder, a newly created state is automatically initialized.
    267 *
    268 * Static allocation shall only be used in combination with static linking.
    269 */
    270 
    271 /* LZ4_initStreamHC() : v1.9.0+
    272 * Required before first use of a statically allocated LZ4_streamHC_t.
    273 * Before v1.9.0 : use LZ4_resetStreamHC() instead
    274 */
    275 LZ4LIB_API LZ4_streamHC_t* LZ4_initStreamHC(void* buffer, size_t size);
    276 
    277 
    278 /*-************************************
    279 *  Deprecated Functions
    280 **************************************/
    281 /* see lz4.h LZ4_DISABLE_DEPRECATE_WARNINGS to turn off deprecation warnings */
    282 
    283 /* deprecated compression functions */
    284 LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC               (const char* source, char* dest, int inputSize);
    285 LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize);
    286 LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2              (const char* source, char* dest, int inputSize, int compressionLevel);
    287 LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
    288 LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_withStateHC               (void* state, const char* source, char* dest, int inputSize);
    289 LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* source, char* dest, int inputSize, int maxOutputSize);
    290 LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC2_withStateHC              (void* state, const char* source, char* dest, int inputSize, int compressionLevel);
    291 LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_withStateHC(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
    292 LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC_continue               (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize);
    293 LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize, int maxOutputSize);
    294 
    295 /* Obsolete streaming functions; degraded functionality; do not use!
    296 *
    297 * In order to perform streaming compression, these functions depended on data
    298 * that is no longer tracked in the state. They have been preserved as well as
    299 * possible: using them will still produce a correct output. However, use of
    300 * LZ4_slideInputBufferHC() will truncate the history of the stream, rather
    301 * than preserve a window-sized chunk of history.
    302 */
    303 #if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
    304 LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API void* LZ4_createHC (const char* inputBuffer);
    305 LZ4_DEPRECATED("use LZ4_freeStreamHC() instead") LZ4LIB_API   int   LZ4_freeHC (void* LZ4HC_Data);
    306 #endif
    307 LZ4_DEPRECATED("use LZ4_saveDictHC() instead") LZ4LIB_API     char* LZ4_slideInputBufferHC (void* LZ4HC_Data);
    308 LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_continue               (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel);
    309 LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
    310 LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API int   LZ4_sizeofStreamStateHC(void);
    311 LZ4_DEPRECATED("use LZ4_initStreamHC() instead") LZ4LIB_API  int   LZ4_resetStreamStateHC(void* state, char* inputBuffer);
    312 
    313 
    314 /* LZ4_resetStreamHC() is now replaced by LZ4_initStreamHC().
    315 * The intention is to emphasize the difference with LZ4_resetStreamHC_fast(),
    316 * which is now the recommended function to start a new stream of blocks,
    317 * but cannot be used to initialize a memory segment containing arbitrary garbage data.
    318 *
    319 * It is recommended to switch to LZ4_initStreamHC().
    320 * LZ4_resetStreamHC() will generate deprecation warnings in a future version.
    321 */
    322 LZ4LIB_API void LZ4_resetStreamHC (LZ4_streamHC_t* streamHCPtr, int compressionLevel);
    323 
    324 
    325 #if defined (__cplusplus)
    326 }
    327 #endif
    328 
    329 #endif /* LZ4_HC_H_19834876238432 */
    330 
    331 
    332 /*-**************************************************
    333 * !!!!!     STATIC LINKING ONLY     !!!!!
    334 * Following definitions are considered experimental.
    335 * They should not be linked from DLL,
    336 * as there is no guarantee of API stability yet.
    337 * Prototypes will be promoted to "stable" status
    338 * after successful usage in real-life scenarios.
    339 ***************************************************/
    340 #ifdef LZ4_HC_STATIC_LINKING_ONLY   /* protection macro */
    341 #ifndef LZ4_HC_SLO_098092834
    342 #define LZ4_HC_SLO_098092834
    343 
    344 #define LZ4_STATIC_LINKING_ONLY   /* LZ4LIB_STATIC_API */
    345 #include "lz4.h"
    346 
    347 #if defined (__cplusplus)
    348 extern "C" {
    349 #endif
    350 
    351 /*! LZ4_setCompressionLevel() : v1.8.0+ (experimental)
    352 *  It's possible to change compression level
    353 *  between successive invocations of LZ4_compress_HC_continue*()
    354 *  for dynamic adaptation.
    355 */
    356 LZ4LIB_STATIC_API void LZ4_setCompressionLevel(
    357    LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);
    358 
    359 /*! LZ4_favorDecompressionSpeed() : v1.8.2+ (experimental)
    360 *  Opt. Parser will favor decompression speed over compression ratio.
    361 *  Only applicable to levels >= LZ4HC_CLEVEL_OPT_MIN.
    362 */
    363 LZ4LIB_STATIC_API void LZ4_favorDecompressionSpeed(
    364    LZ4_streamHC_t* LZ4_streamHCPtr, int favor);
    365 
    366 /*! LZ4_resetStreamHC_fast() : v1.9.0+
    367 *  When an LZ4_streamHC_t is known to be in a internally coherent state,
    368 *  it can often be prepared for a new compression with almost no work, only
    369 *  sometimes falling back to the full, expensive reset that is always required
    370 *  when the stream is in an indeterminate state (i.e., the reset performed by
    371 *  LZ4_resetStreamHC()).
    372 *
    373 *  LZ4_streamHCs are guaranteed to be in a valid state when:
    374 *  - returned from LZ4_createStreamHC()
    375 *  - reset by LZ4_resetStreamHC()
    376 *  - memset(stream, 0, sizeof(LZ4_streamHC_t))
    377 *  - the stream was in a valid state and was reset by LZ4_resetStreamHC_fast()
    378 *  - the stream was in a valid state and was then used in any compression call
    379 *    that returned success
    380 *  - the stream was in an indeterminate state and was used in a compression
    381 *    call that fully reset the state (LZ4_compress_HC_extStateHC()) and that
    382 *    returned success
    383 *
    384 *  Note:
    385 *  A stream that was last used in a compression call that returned an error
    386 *  may be passed to this function. However, it will be fully reset, which will
    387 *  clear any existing history and settings from the context.
    388 */
    389 LZ4LIB_STATIC_API void LZ4_resetStreamHC_fast(
    390    LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);
    391 
    392 /*! LZ4_compress_HC_extStateHC_fastReset() :
    393 *  A variant of LZ4_compress_HC_extStateHC().
    394 *
    395 *  Using this variant avoids an expensive initialization step. It is only safe
    396 *  to call if the state buffer is known to be correctly initialized already
    397 *  (see above comment on LZ4_resetStreamHC_fast() for a definition of
    398 *  "correctly initialized"). From a high level, the difference is that this
    399 *  function initializes the provided state with a call to
    400 *  LZ4_resetStreamHC_fast() while LZ4_compress_HC_extStateHC() starts with a
    401 *  call to LZ4_resetStreamHC().
    402 */
    403 LZ4LIB_STATIC_API int LZ4_compress_HC_extStateHC_fastReset (
    404    void* state,
    405    const char* src, char* dst,
    406    int srcSize, int dstCapacity,
    407    int compressionLevel);
    408 
    409 #if defined (__cplusplus)
    410 }
    411 #endif
    412 
    413 #endif   /* LZ4_HC_SLO_098092834 */
    414 #endif   /* LZ4_HC_STATIC_LINKING_ONLY */