1b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet./*
2b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   LZ4 HC - High Compression Mode of LZ4
3b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   Header File
456609a3adb3ec509edf2a37c4923f736f8a6e756Yann Collet   Copyright (C) 2011-2014, Yann Collet.
5b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
6b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
7b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   Redistribution and use in source and binary forms, with or without
8b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   modification, are permitted provided that the following conditions are
9b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   met:
10b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
11b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.       * Redistributions of source code must retain the above copyright
12b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   notice, this list of conditions and the following disclaimer.
13b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.       * Redistributions in binary form must reproduce the above
14b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   copyright notice, this list of conditions and the following disclaimer
15b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   in the documentation and/or other materials provided with the
16b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   distribution.
17b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
18b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
30b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   You can contact the author at :
31b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   - LZ4 homepage : http://fastcompression.blogspot.com/p/lz4.html
32b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   - LZ4 source repository : http://code.google.com/p/lz4/
33b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.*/
34b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.#pragma once
35b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
36b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
37b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.#if defined (__cplusplus)
38b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.extern "C" {
39b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.#endif
40b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
41b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
42b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int LZ4_compressHC (const char* source, char* dest, int inputSize);
43b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet./*
44b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.LZ4_compressHC :
45b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    return : the number of bytes in compressed buffer dest
46b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.             or 0 if compression fails.
47b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    note : destination buffer must be already allocated.
48b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.        To avoid any problem, size it to handle worst cases situations (input data not compressible)
49b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.        Worst case size evaluation is provided by function LZ4_compressBound() (see "lz4.h")
50b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.*/
51b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
52b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int LZ4_compressHC_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize);
53b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet./*
54b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.LZ4_compress_limitedOutput() :
55b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    Compress 'inputSize' bytes from 'source' into an output buffer 'dest' of maximum size 'maxOutputSize'.
56b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    If it cannot achieve it, compression will stop, and result of the function will be zero.
57b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    This function never writes outside of provided output buffer.
58b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
59b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    inputSize  : Max supported value is 1 GB
60b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    maxOutputSize : is maximum allowed size into the destination buffer (which must be already allocated)
61b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    return : the number of output bytes written in buffer 'dest'
62b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.             or 0 if compression fails.
63b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.*/
64b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
65b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
66b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int LZ4_compressHC2 (const char* source, char* dest, int inputSize, int compressionLevel);
67b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int LZ4_compressHC2_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
68b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet./*
69b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    Same functions as above, but with programmable 'compressionLevel'.
70b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    Recommended values are between 4 and 9, although any value between 0 and 16 will work.
71b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    'compressionLevel'==0 means use default 'compressionLevel' value.
72b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    Values above 16 behave the same as 16.
73b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.    Equivalent variants exist for all other compression functions below.
74b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.*/
75b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
76b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet./* Note :
779b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet   Decompression functions are provided within LZ4 source code (see "lz4.h") (BSD license)
78b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.*/
79b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
80b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
81b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet./**************************************
82b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.   Using an external allocation
83b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.**************************************/
84b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int LZ4_sizeofStateHC(void);
85b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int LZ4_compressHC_withStateHC               (void* state, const char* source, char* dest, int inputSize);
86b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int LZ4_compressHC_limitedOutput_withStateHC (void* state, const char* source, char* dest, int inputSize, int maxOutputSize);
87b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
88b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int LZ4_compressHC2_withStateHC              (void* state, const char* source, char* dest, int inputSize, int compressionLevel);
89b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int LZ4_compressHC2_limitedOutput_withStateHC(void* state, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
90b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
91b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet./*
92b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.These functions are provided should you prefer to allocate memory for compression tables with your own allocation methods.
93b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.To know how much memory must be allocated for the compression tables, use :
94b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int LZ4_sizeofStateHC();
95b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
96b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.Note that tables must be aligned for pointer (32 or 64 bits), otherwise compression will fail (return code 0).
97b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
98a0182a202a24ff3cb1ed17e6cff5465dc458adfeYann ColletThe allocated memory can be provided to the compression functions using 'void* state' parameter.
99b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.LZ4_compress_withStateHC() and LZ4_compress_limitedOutput_withStateHC() are equivalent to previously described functions.
100a0182a202a24ff3cb1ed17e6cff5465dc458adfeYann ColletThey just use the externally allocated memory for state instead of allocating their own (on stack, or on heap).
101b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.*/
102b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
103b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
1049b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
1059b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet/**************************************
1069b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet   Experimental Streaming Functions
1079b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet**************************************/
1088907f6c7a55a26d51700166a9496f504296ee126Yann Collet#define LZ4_STREAMHCSIZE_U64 32774
1098907f6c7a55a26d51700166a9496f504296ee126Yann Collet#define LZ4_STREAMHCSIZE     (LZ4_STREAMHCSIZE_U64 * sizeof(unsigned long long))
1108907f6c7a55a26d51700166a9496f504296ee126Yann Collettypedef struct { unsigned long long table[LZ4_STREAMHCSIZE_U64]; } LZ4_streamHC_t;
1119b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet/*
112a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann ColletLZ4_streamHC_t
1139b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletThis structure allows static allocation of LZ4 HC streaming state.
1149b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletState must then be initialized using LZ4_resetStreamHC() before first use.
1159b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
116a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann ColletStatic allocation should only be used with statically linked library.
117a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann ColletIf you want to use LZ4 as a DLL, please use construction functions below, which are more future-proof.
1189b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet*/
1199b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
120a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann Collet
1219b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletLZ4_streamHC_t* LZ4_createStreamHC(void);
1229b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Colletint             LZ4_freeStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr);
1239b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet/*
1249b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletThese functions create and release memory for LZ4 HC streaming state.
1259b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletNewly created states are already initialized.
1269b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletExisting state space can be re-used anytime using LZ4_resetStreamHC().
127a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann ColletIf you use LZ4 as a DLL, please use these functions instead of direct struct allocation,
128a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann Colletto avoid size mismatch between different versions.
1299b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet*/
1309b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
1319b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Colletvoid LZ4_resetStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);
1329b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Colletint  LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, const char* dictionary, int dictSize);
1339b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
1349b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Colletint LZ4_compressHC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize);
1359b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Colletint LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* source, char* dest, int inputSize, int maxOutputSize);
1369b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
1379b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Colletint LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int maxDictSize);
1389b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
1399b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet/*
1409b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletThese functions compress data in successive blocks of any size, using previous blocks as dictionary.
1410ec5a9e45892bf3ce92f11c4305644966abbb796Yann ColletOne key assumption is that each previous block will remain read-accessible while compressing next block.
1429b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
1439b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletBefore starting compression, state must be properly initialized, using LZ4_resetStreamHC().
1449b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletA first "fictional block" can then be designated as initial dictionary, using LZ4_loadDictHC() (Optional).
1459b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
1469b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletThen, use LZ4_compressHC_continue() or LZ4_compressHC_limitedOutput_continue() to compress each successive block.
1479b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletThey work like usual LZ4_compressHC() or LZ4_compressHC_limitedOutput(), but use previous memory blocks to improve compression.
1489b59fdbbcdb1c3d402816f29e2242a3643792f1bYann ColletPrevious memory blocks (including initial dictionary when present) must remain accessible and unmodified during compression.
1499b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
1500ec5a9e45892bf3ce92f11c4305644966abbb796Yann ColletIf, for any reason, previous data block can't be preserved in memory during next compression block,
15197a32a310e5e52c5a81087585e9e7c6d18176080Yann Colletyou must save it to a safer memory space,
1529b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Colletusing LZ4_saveDictHC().
1539b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet*/
1549b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
1559b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
1569b59fdbbcdb1c3d402816f29e2242a3643792f1bYann Collet
15790b6b9e6788452973e1828eb1758e24fa2f7ccb1Yann Collet/**************************************
158a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann Collet * Deprecated Streaming Functions
159a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann Collet * ************************************/
160a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann Collet/* Note : these streaming functions follows the older model, and should no longer be used */
161b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.void* LZ4_createHC (const char* inputBuffer);
162b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.char* LZ4_slideInputBufferHC (void* LZ4HC_Data);
163b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int   LZ4_freeHC (void* LZ4HC_Data);
164b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
165b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int   LZ4_compressHC2_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel);
166b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.int   LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
167b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
168a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann Colletint   LZ4_sizeofStreamStateHC(void);
169a18d8b1e2cc3e3b72d62237d334bd0d3c28a891bYann Colletint   LZ4_resetStreamStateHC(void* state, const char* inputBuffer);
170b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
171b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.
172b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.#if defined (__cplusplus)
173b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.}
174b996d28d5863199d4b041e3c8aca9e2a8d05c287yann.collet.#endif
175