mirror of
https://github.com/wolfpld/tracy
synced 2025-04-29 12:23:53 +00:00
Update LZ4 to 1.9.1.
This commit is contained in:
parent
9ec8704dad
commit
98eaacec90
File diff suppressed because it is too large
Load Diff
@ -52,19 +52,23 @@ namespace tracy
|
|||||||
multiple GB/s per core, typically reaching RAM speed limits on multi-core systems.
|
multiple GB/s per core, typically reaching RAM speed limits on multi-core systems.
|
||||||
|
|
||||||
The LZ4 compression library provides in-memory compression and decompression functions.
|
The LZ4 compression library provides in-memory compression and decompression functions.
|
||||||
|
It gives full buffer control to user.
|
||||||
Compression can be done in:
|
Compression can be done in:
|
||||||
- a single step (described as Simple Functions)
|
- a single step (described as Simple Functions)
|
||||||
- a single step, reusing a context (described in Advanced Functions)
|
- a single step, reusing a context (described in Advanced Functions)
|
||||||
- unbounded multiple steps (described as Streaming compression)
|
- unbounded multiple steps (described as Streaming compression)
|
||||||
|
|
||||||
lz4.h provides block compression functions. It gives full buffer control to user.
|
lz4.h generates and decodes LZ4-compressed blocks (doc/lz4_Block_format.md).
|
||||||
Decompressing an lz4-compressed block also requires metadata (such as compressed size).
|
Decompressing a block requires additional metadata, such as its compressed size.
|
||||||
Each application is free to encode such metadata in whichever way it wants.
|
Each application is free to encode and pass such metadata in whichever way it wants.
|
||||||
|
|
||||||
An additional format, called LZ4 frame specification (doc/lz4_Frame_format.md),
|
lz4.h only handle blocks, it can not generate Frames.
|
||||||
take care of encoding standard metadata alongside LZ4-compressed blocks.
|
|
||||||
Frame format is required for interoperability.
|
Blocks are different from Frames (doc/lz4_Frame_format.md).
|
||||||
It is delivered through a companion API, declared in lz4frame.h.
|
Frames bundle both blocks and metadata in a specified manner.
|
||||||
|
This are required for compressed data to be self-contained and portable.
|
||||||
|
Frame format is delivered through a companion API, declared in lz4frame.h.
|
||||||
|
Note that the `lz4` CLI can only manage frames.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*^***************************************************************
|
/*^***************************************************************
|
||||||
@ -93,8 +97,8 @@ namespace tracy
|
|||||||
|
|
||||||
/*------ Version ------*/
|
/*------ Version ------*/
|
||||||
#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */
|
#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */
|
||||||
#define LZ4_VERSION_MINOR 8 /* for new (non-breaking) interface capabilities */
|
#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */
|
||||||
#define LZ4_VERSION_RELEASE 3 /* for tweaks, bug-fixes, or development */
|
#define LZ4_VERSION_RELEASE 1 /* for tweaks, bug-fixes, or development */
|
||||||
|
|
||||||
#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE)
|
#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE)
|
||||||
|
|
||||||
@ -104,7 +108,7 @@ namespace tracy
|
|||||||
#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION)
|
#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION)
|
||||||
|
|
||||||
LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version */
|
LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version */
|
||||||
LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; unseful to check dll version */
|
LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version */
|
||||||
|
|
||||||
|
|
||||||
/*-************************************
|
/*-************************************
|
||||||
@ -113,14 +117,15 @@ LZ4LIB_API const char* LZ4_versionString (void); /**< library version string;
|
|||||||
/*!
|
/*!
|
||||||
* LZ4_MEMORY_USAGE :
|
* LZ4_MEMORY_USAGE :
|
||||||
* Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
|
* Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
|
||||||
* Increasing memory usage improves compression ratio
|
* Increasing memory usage improves compression ratio.
|
||||||
* Reduced memory usage may improve speed, thanks to cache effect
|
* Reduced memory usage may improve speed, thanks to better cache locality.
|
||||||
* Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache
|
* Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache
|
||||||
*/
|
*/
|
||||||
#ifndef LZ4_MEMORY_USAGE
|
#ifndef LZ4_MEMORY_USAGE
|
||||||
# define LZ4_MEMORY_USAGE 12
|
# define LZ4_MEMORY_USAGE 12
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/*-************************************
|
/*-************************************
|
||||||
* Simple Functions
|
* Simple Functions
|
||||||
**************************************/
|
**************************************/
|
||||||
@ -131,21 +136,22 @@ LZ4LIB_API const char* LZ4_versionString (void); /**< library version string;
|
|||||||
It also runs faster, so it's a recommended setting.
|
It also runs faster, so it's a recommended setting.
|
||||||
If the function cannot compress 'src' into a more limited 'dst' budget,
|
If the function cannot compress 'src' into a more limited 'dst' budget,
|
||||||
compression stops *immediately*, and the function result is zero.
|
compression stops *immediately*, and the function result is zero.
|
||||||
Note : as a consequence, 'dst' content is not valid.
|
In which case, 'dst' content is undefined (invalid).
|
||||||
Note 2 : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer).
|
|
||||||
srcSize : max supported value is LZ4_MAX_INPUT_SIZE.
|
srcSize : max supported value is LZ4_MAX_INPUT_SIZE.
|
||||||
dstCapacity : size of buffer 'dst' (which must be already allocated)
|
dstCapacity : size of buffer 'dst' (which must be already allocated)
|
||||||
return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity)
|
@return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity)
|
||||||
or 0 if compression fails */
|
or 0 if compression fails
|
||||||
|
Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer).
|
||||||
|
*/
|
||||||
LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity);
|
LZ4LIB_API int LZ4_compress_default(const char* src, char* dst, int srcSize, int dstCapacity);
|
||||||
|
|
||||||
/*! LZ4_decompress_safe() :
|
/*! LZ4_decompress_safe() :
|
||||||
compressedSize : is the exact complete size of the compressed block.
|
compressedSize : is the exact complete size of the compressed block.
|
||||||
dstCapacity : is the size of destination buffer, which must be already allocated.
|
dstCapacity : is the size of destination buffer, which must be already allocated.
|
||||||
return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity)
|
@return : the number of bytes decompressed into destination buffer (necessarily <= dstCapacity)
|
||||||
If destination buffer is not large enough, decoding will stop and output an error code (negative value).
|
If destination buffer is not large enough, decoding will stop and output an error code (negative value).
|
||||||
If the source stream is detected malformed, the function will stop decoding and return a negative result.
|
If the source stream is detected malformed, the function will stop decoding and return a negative result.
|
||||||
This function is protected against malicious data packets.
|
Note : This function is protected against malicious data packets (never writes outside 'dst' buffer, nor read outside 'source' buffer).
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity);
|
LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity);
|
||||||
|
|
||||||
@ -156,8 +162,7 @@ LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSi
|
|||||||
#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */
|
#define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */
|
||||||
#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16)
|
#define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize)/255) + 16)
|
||||||
|
|
||||||
/*!
|
/*! LZ4_compressBound() :
|
||||||
LZ4_compressBound() :
|
|
||||||
Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible)
|
Provides the maximum size that LZ4 compression may output in a "worst case" scenario (input data not compressible)
|
||||||
This function is primarily useful for memory allocation purposes (destination buffer size).
|
This function is primarily useful for memory allocation purposes (destination buffer size).
|
||||||
Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example).
|
Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example).
|
||||||
@ -168,8 +173,7 @@ LZ4_compressBound() :
|
|||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_compressBound(int inputSize);
|
LZ4LIB_API int LZ4_compressBound(int inputSize);
|
||||||
|
|
||||||
/*!
|
/*! LZ4_compress_fast() :
|
||||||
LZ4_compress_fast() :
|
|
||||||
Same as LZ4_compress_default(), but allows selection of "acceleration" factor.
|
Same as LZ4_compress_default(), but allows selection of "acceleration" factor.
|
||||||
The larger the acceleration value, the faster the algorithm, but also the lesser the compression.
|
The larger the acceleration value, the faster the algorithm, but also the lesser the compression.
|
||||||
It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed.
|
It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed.
|
||||||
@ -179,13 +183,12 @@ LZ4_compress_fast() :
|
|||||||
LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*! LZ4_compress_fast_extState() :
|
||||||
LZ4_compress_fast_extState() :
|
* Same as LZ4_compress_fast(), using an externally allocated memory space for its state.
|
||||||
Same compression function, just using an externally allocated memory space to store compression state.
|
* Use LZ4_sizeofState() to know how much memory must be allocated,
|
||||||
Use LZ4_sizeofState() to know how much memory must be allocated,
|
* and allocate it on 8-bytes boundaries (using `malloc()` typically).
|
||||||
and allocate it on 8-bytes boundaries (using malloc() typically).
|
* Then, provide this buffer as `void* state` to compression function.
|
||||||
Then, provide this buffer as 'void* state' to compression function.
|
*/
|
||||||
*/
|
|
||||||
LZ4LIB_API int LZ4_sizeofState(void);
|
LZ4LIB_API int LZ4_sizeofState(void);
|
||||||
LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
||||||
|
|
||||||
@ -205,27 +208,6 @@ LZ4LIB_API int LZ4_compress_fast_extState (void* state, const char* src, char* d
|
|||||||
LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize);
|
LZ4LIB_API int LZ4_compress_destSize (const char* src, char* dst, int* srcSizePtr, int targetDstSize);
|
||||||
|
|
||||||
|
|
||||||
/*! LZ4_decompress_fast() : **unsafe!**
|
|
||||||
* This function used to be a bit faster than LZ4_decompress_safe(),
|
|
||||||
* though situation has changed in recent versions,
|
|
||||||
* and now `LZ4_decompress_safe()` can be as fast and sometimes faster than `LZ4_decompress_fast()`.
|
|
||||||
* Moreover, LZ4_decompress_fast() is not protected vs malformed input, as it doesn't perform full validation of compressed data.
|
|
||||||
* As a consequence, this function is no longer recommended, and may be deprecated in future versions.
|
|
||||||
* It's only remaining specificity is that it can decompress data without knowing its compressed size.
|
|
||||||
*
|
|
||||||
* originalSize : is the uncompressed size to regenerate.
|
|
||||||
* `dst` must be already allocated, its size must be >= 'originalSize' bytes.
|
|
||||||
* @return : number of bytes read from source buffer (== compressed size).
|
|
||||||
* If the source stream is detected malformed, the function stops decoding and returns a negative result.
|
|
||||||
* note : This function requires uncompressed originalSize to be known in advance.
|
|
||||||
* The function never writes past the output buffer.
|
|
||||||
* However, since it doesn't know its 'src' size, it may read past the intended input.
|
|
||||||
* Also, because match offsets are not validated during decoding,
|
|
||||||
* reads from 'src' may underflow.
|
|
||||||
* Use this function in trusted environment **only**.
|
|
||||||
*/
|
|
||||||
LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize);
|
|
||||||
|
|
||||||
/*! LZ4_decompress_safe_partial() :
|
/*! LZ4_decompress_safe_partial() :
|
||||||
* Decompress an LZ4 compressed block, of size 'srcSize' at position 'src',
|
* Decompress an LZ4 compressed block, of size 'srcSize' at position 'src',
|
||||||
* into destination buffer 'dst' of size 'dstCapacity'.
|
* into destination buffer 'dst' of size 'dstCapacity'.
|
||||||
@ -258,30 +240,49 @@ LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcS
|
|||||||
***********************************************/
|
***********************************************/
|
||||||
typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */
|
typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */
|
||||||
|
|
||||||
/*! LZ4_createStream() and LZ4_freeStream() :
|
|
||||||
* LZ4_createStream() will allocate and initialize an `LZ4_stream_t` structure.
|
|
||||||
* LZ4_freeStream() releases its memory.
|
|
||||||
*/
|
|
||||||
LZ4LIB_API LZ4_stream_t* LZ4_createStream(void);
|
LZ4LIB_API LZ4_stream_t* LZ4_createStream(void);
|
||||||
LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr);
|
LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
/*! LZ4_resetStream() :
|
/*! LZ4_resetStream_fast() : v1.9.0+
|
||||||
* An LZ4_stream_t structure can be allocated once and re-used multiple times.
|
* Use this to prepare an LZ4_stream_t for a new chain of dependent blocks
|
||||||
* Use this function to start compressing a new stream.
|
* (e.g., LZ4_compress_fast_continue()).
|
||||||
|
*
|
||||||
|
* An LZ4_stream_t must be initialized once before usage.
|
||||||
|
* This is automatically done when created by LZ4_createStream().
|
||||||
|
* However, should the LZ4_stream_t be simply declared on stack (for example),
|
||||||
|
* it's necessary to initialize it first, using LZ4_initStream().
|
||||||
|
*
|
||||||
|
* After init, start any new stream with LZ4_resetStream_fast().
|
||||||
|
* A same LZ4_stream_t can be re-used multiple times consecutively
|
||||||
|
* and compress multiple streams,
|
||||||
|
* provided that it starts each new stream with LZ4_resetStream_fast().
|
||||||
|
*
|
||||||
|
* LZ4_resetStream_fast() is much faster than LZ4_initStream(),
|
||||||
|
* but is not compatible with memory regions containing garbage data.
|
||||||
|
*
|
||||||
|
* Note: it's only useful to call LZ4_resetStream_fast()
|
||||||
|
* in the context of streaming compression.
|
||||||
|
* The *extState* functions perform their own resets.
|
||||||
|
* Invoking LZ4_resetStream_fast() before is redundant, and even counterproductive.
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr);
|
LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
/*! LZ4_loadDict() :
|
/*! LZ4_loadDict() :
|
||||||
* Use this function to load a static dictionary into LZ4_stream_t.
|
* Use this function to reference a static dictionary into LZ4_stream_t.
|
||||||
* Any previous data will be forgotten, only 'dictionary' will remain in memory.
|
* The dictionary must remain available during compression.
|
||||||
|
* LZ4_loadDict() triggers a reset, so any previous data will be forgotten.
|
||||||
|
* The same dictionary will have to be loaded on decompression side for successful decoding.
|
||||||
|
* Dictionary are useful for better compression of small data (KB range).
|
||||||
|
* While LZ4 accept any input as dictionary,
|
||||||
|
* results are generally better when using Zstandard's Dictionary Builder.
|
||||||
* Loading a size of 0 is allowed, and is the same as reset.
|
* Loading a size of 0 is allowed, and is the same as reset.
|
||||||
* @return : dictionary size, in bytes (necessarily <= 64 KB)
|
* @return : loaded dictionary size, in bytes (necessarily <= 64 KB)
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize);
|
LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize);
|
||||||
|
|
||||||
/*! LZ4_compress_fast_continue() :
|
/*! LZ4_compress_fast_continue() :
|
||||||
* Compress 'src' content using data from previously compressed blocks, for better compression ratio.
|
* Compress 'src' content using data from previously compressed blocks, for better compression ratio.
|
||||||
* 'dst' buffer must be already allocated.
|
* 'dst' buffer must be already allocated.
|
||||||
* If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster.
|
* If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster.
|
||||||
*
|
*
|
||||||
* @return : size of compressed block
|
* @return : size of compressed block
|
||||||
@ -289,10 +290,10 @@ LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, in
|
|||||||
*
|
*
|
||||||
* Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block.
|
* Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block.
|
||||||
* Each block has precise boundaries.
|
* Each block has precise boundaries.
|
||||||
|
* Each block must be decompressed separately, calling LZ4_decompress_*() with relevant metadata.
|
||||||
* It's not possible to append blocks together and expect a single invocation of LZ4_decompress_*() to decompress them together.
|
* It's not possible to append blocks together and expect a single invocation of LZ4_decompress_*() to decompress them together.
|
||||||
* Each block must be decompressed separately, calling LZ4_decompress_*() with associated metadata.
|
|
||||||
*
|
*
|
||||||
* Note 2 : The previous 64KB of source data is __assumed__ to remain present, unmodified, at same address in memory!
|
* Note 2 : The previous 64KB of source data is __assumed__ to remain present, unmodified, at same address in memory !
|
||||||
*
|
*
|
||||||
* Note 3 : When input is structured as a double-buffer, each buffer can have any size, including < 64 KB.
|
* Note 3 : When input is structured as a double-buffer, each buffer can have any size, including < 64 KB.
|
||||||
* Make sure that buffers are separated, by at least one byte.
|
* Make sure that buffers are separated, by at least one byte.
|
||||||
@ -300,7 +301,7 @@ LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, in
|
|||||||
*
|
*
|
||||||
* Note 4 : If input buffer is a ring-buffer, it can have any size, including < 64 KB.
|
* Note 4 : If input buffer is a ring-buffer, it can have any size, including < 64 KB.
|
||||||
*
|
*
|
||||||
* Note 5 : After an error, the stream status is invalid, it can only be reset or freed.
|
* Note 5 : After an error, the stream status is undefined (invalid), it can only be reset or freed.
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
LZ4LIB_API int LZ4_compress_fast_continue (LZ4_stream_t* streamPtr, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
||||||
|
|
||||||
@ -336,7 +337,7 @@ LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_str
|
|||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize);
|
LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize);
|
||||||
|
|
||||||
/*! LZ4_decoderRingBufferSize() : v1.8.2
|
/*! LZ4_decoderRingBufferSize() : v1.8.2+
|
||||||
* Note : in a ring buffer scenario (optional),
|
* Note : in a ring buffer scenario (optional),
|
||||||
* blocks are presumed decompressed next to each other
|
* blocks are presumed decompressed next to each other
|
||||||
* up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize),
|
* up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize),
|
||||||
@ -348,7 +349,7 @@ LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const
|
|||||||
* or 0 if there is an error (invalid maxBlockSize).
|
* or 0 if there is an error (invalid maxBlockSize).
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize);
|
LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize);
|
||||||
#define LZ4_DECODER_RING_BUFFER_SIZE(mbs) (65536 + 14 + (mbs)) /* for static allocation; mbs presumed valid */
|
#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */
|
||||||
|
|
||||||
/*! LZ4_decompress_*_continue() :
|
/*! LZ4_decompress_*_continue() :
|
||||||
* These decoding functions allow decompression of consecutive blocks in "streaming" mode.
|
* These decoding functions allow decompression of consecutive blocks in "streaming" mode.
|
||||||
@ -376,83 +377,67 @@ LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize);
|
|||||||
* then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block.
|
* then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block.
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int srcSize, int dstCapacity);
|
LZ4LIB_API int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int srcSize, int dstCapacity);
|
||||||
LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize);
|
|
||||||
|
|
||||||
|
|
||||||
/*! LZ4_decompress_*_usingDict() :
|
/*! LZ4_decompress_*_usingDict() :
|
||||||
* These decoding functions work the same as
|
* These decoding functions work the same as
|
||||||
* a combination of LZ4_setStreamDecode() followed by LZ4_decompress_*_continue()
|
* a combination of LZ4_setStreamDecode() followed by LZ4_decompress_*_continue()
|
||||||
* They are stand-alone, and don't need an LZ4_streamDecode_t structure.
|
* They are stand-alone, and don't need an LZ4_streamDecode_t structure.
|
||||||
* Dictionary is presumed stable : it must remain accessible and unmodified during next decompression.
|
* Dictionary is presumed stable : it must remain accessible and unmodified during decompression.
|
||||||
|
* Performance tip : Decompression speed can be substantially increased
|
||||||
|
* when dst == dictStart + dictSize.
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_decompress_safe_usingDict (const char* src, char* dst, int srcSize, int dstCapcity, const char* dictStart, int dictSize);
|
LZ4LIB_API int LZ4_decompress_safe_usingDict (const char* src, char* dst, int srcSize, int dstCapcity, const char* dictStart, int dictSize);
|
||||||
LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize);
|
|
||||||
|
|
||||||
|
|
||||||
/*^**********************************************
|
/*^*************************************
|
||||||
* !!!!!! STATIC LINKING ONLY !!!!!!
|
* !!!!!! STATIC LINKING ONLY !!!!!!
|
||||||
***********************************************/
|
***************************************/
|
||||||
|
|
||||||
/*-************************************
|
/*-****************************************************************************
|
||||||
* Unstable declarations
|
* Experimental section
|
||||||
**************************************
|
*
|
||||||
* Declarations in this section should be considered unstable.
|
* Symbols declared in this section must be considered unstable. Their
|
||||||
* Use at your own peril, etc., etc.
|
* signatures or semantics may change, or they may be removed altogether in the
|
||||||
* They may be removed in the future.
|
* future. They are therefore only safe to depend on when the caller is
|
||||||
* Their signatures may change.
|
* statically linked against the library.
|
||||||
**************************************/
|
*
|
||||||
|
* To protect against unsafe usage, not only are the declarations guarded,
|
||||||
|
* the definitions are hidden by default
|
||||||
|
* when building LZ4 as a shared/dynamic library.
|
||||||
|
*
|
||||||
|
* In order to access these declarations,
|
||||||
|
* define LZ4_STATIC_LINKING_ONLY in your application
|
||||||
|
* before including LZ4's headers.
|
||||||
|
*
|
||||||
|
* In order to make their implementations accessible dynamically, you must
|
||||||
|
* define LZ4_PUBLISH_STATIC_FUNCTIONS when building the LZ4 library.
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS
|
||||||
|
#define LZ4LIB_STATIC_API LZ4LIB_API
|
||||||
|
#else
|
||||||
|
#define LZ4LIB_STATIC_API
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef LZ4_STATIC_LINKING_ONLY
|
#ifdef LZ4_STATIC_LINKING_ONLY
|
||||||
|
|
||||||
/*! LZ4_resetStream_fast() :
|
|
||||||
* Use this, like LZ4_resetStream(), to prepare a context for a new chain of
|
|
||||||
* calls to a streaming API (e.g., LZ4_compress_fast_continue()).
|
|
||||||
*
|
|
||||||
* Note:
|
|
||||||
* Using this in advance of a non- streaming-compression function is redundant,
|
|
||||||
* and potentially bad for performance, since they all perform their own custom
|
|
||||||
* reset internally.
|
|
||||||
*
|
|
||||||
* Differences from LZ4_resetStream():
|
|
||||||
* When an LZ4_stream_t is known to be in a internally coherent state,
|
|
||||||
* it can often be prepared for a new compression with almost no work, only
|
|
||||||
* sometimes falling back to the full, expensive reset that is always required
|
|
||||||
* when the stream is in an indeterminate state (i.e., the reset performed by
|
|
||||||
* LZ4_resetStream()).
|
|
||||||
*
|
|
||||||
* LZ4_streams are guaranteed to be in a valid state when:
|
|
||||||
* - returned from LZ4_createStream()
|
|
||||||
* - reset by LZ4_resetStream()
|
|
||||||
* - memset(stream, 0, sizeof(LZ4_stream_t)), though this is discouraged
|
|
||||||
* - the stream was in a valid state and was reset by LZ4_resetStream_fast()
|
|
||||||
* - the stream was in a valid state and was then used in any compression call
|
|
||||||
* that returned success
|
|
||||||
* - the stream was in an indeterminate state and was used in a compression
|
|
||||||
* call that fully reset the state (e.g., LZ4_compress_fast_extState()) and
|
|
||||||
* that returned success
|
|
||||||
*
|
|
||||||
* When a stream isn't known to be in a valid state, it is not safe to pass to
|
|
||||||
* any fastReset or streaming function. It must first be cleansed by the full
|
|
||||||
* LZ4_resetStream().
|
|
||||||
*/
|
|
||||||
LZ4LIB_API void LZ4_resetStream_fast (LZ4_stream_t* streamPtr);
|
|
||||||
|
|
||||||
/*! LZ4_compress_fast_extState_fastReset() :
|
/*! LZ4_compress_fast_extState_fastReset() :
|
||||||
* A variant of LZ4_compress_fast_extState().
|
* A variant of LZ4_compress_fast_extState().
|
||||||
*
|
*
|
||||||
* Using this variant avoids an expensive initialization step. It is only safe
|
* Using this variant avoids an expensive initialization step.
|
||||||
* to call if the state buffer is known to be correctly initialized already
|
* It is only safe to call if the state buffer is known to be correctly initialized already
|
||||||
* (see above comment on LZ4_resetStream_fast() for a definition of "correctly
|
* (see above comment on LZ4_resetStream_fast() for a definition of "correctly initialized").
|
||||||
* initialized"). From a high level, the difference is that this function
|
* From a high level, the difference is that
|
||||||
* initializes the provided state with a call to something like
|
* this function initializes the provided state with a call to something like LZ4_resetStream_fast()
|
||||||
* LZ4_resetStream_fast() while LZ4_compress_fast_extState() starts with a
|
* while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream().
|
||||||
* call to LZ4_resetStream().
|
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration);
|
||||||
|
|
||||||
/*! LZ4_attach_dictionary() :
|
/*! LZ4_attach_dictionary() :
|
||||||
* This is an experimental API that allows for the efficient use of a
|
* This is an experimental API that allows
|
||||||
* static dictionary many times.
|
* efficient use of a static dictionary many times.
|
||||||
*
|
*
|
||||||
* Rather than re-loading the dictionary buffer into a working context before
|
* Rather than re-loading the dictionary buffer into a working context before
|
||||||
* each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a
|
* each compression, or copying a pre-loaded dictionary's LZ4_stream_t into a
|
||||||
@ -463,8 +448,8 @@ LZ4LIB_API int LZ4_compress_fast_extState_fastReset (void* state, const char* sr
|
|||||||
* Currently, only streams which have been prepared by LZ4_loadDict() should
|
* Currently, only streams which have been prepared by LZ4_loadDict() should
|
||||||
* be expected to work.
|
* be expected to work.
|
||||||
*
|
*
|
||||||
* Alternatively, the provided dictionary stream pointer may be NULL, in which
|
* Alternatively, the provided dictionaryStream may be NULL,
|
||||||
* case any existing dictionary stream is unset.
|
* in which case any existing dictionary stream is unset.
|
||||||
*
|
*
|
||||||
* If a dictionary is provided, it replaces any pre-existing stream history.
|
* If a dictionary is provided, it replaces any pre-existing stream history.
|
||||||
* The dictionary contents are the only history that can be referenced and
|
* The dictionary contents are the only history that can be referenced and
|
||||||
@ -476,17 +461,18 @@ LZ4LIB_API int LZ4_compress_fast_extState_fastReset (void* state, const char* sr
|
|||||||
* stream (and source buffer) must remain in-place / accessible / unchanged
|
* stream (and source buffer) must remain in-place / accessible / unchanged
|
||||||
* through the completion of the first compression call on the stream.
|
* through the completion of the first compression call on the stream.
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API void LZ4_attach_dictionary(LZ4_stream_t *working_stream, const LZ4_stream_t *dictionary_stream);
|
LZ4LIB_STATIC_API void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*-************************************
|
|
||||||
* Private definitions
|
/*-************************************************************
|
||||||
**************************************
|
* PRIVATE DEFINITIONS
|
||||||
* Do not use these definitions.
|
**************************************************************
|
||||||
* They are exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`.
|
* Do not use these definitions directly.
|
||||||
* Using these definitions will expose code to API and/or ABI break in future versions of the library.
|
* They are only exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`.
|
||||||
**************************************/
|
* Accessing members will expose code to API and/or ABI break in future versions of the library.
|
||||||
|
**************************************************************/
|
||||||
#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2)
|
#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2)
|
||||||
#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE)
|
#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE)
|
||||||
#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */
|
#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */
|
||||||
@ -498,7 +484,7 @@ typedef struct LZ4_stream_t_internal LZ4_stream_t_internal;
|
|||||||
struct LZ4_stream_t_internal {
|
struct LZ4_stream_t_internal {
|
||||||
uint32_t hashTable[LZ4_HASH_SIZE_U32];
|
uint32_t hashTable[LZ4_HASH_SIZE_U32];
|
||||||
uint32_t currentOffset;
|
uint32_t currentOffset;
|
||||||
uint16_t initCheck;
|
uint16_t dirty;
|
||||||
uint16_t tableType;
|
uint16_t tableType;
|
||||||
const uint8_t* dictionary;
|
const uint8_t* dictionary;
|
||||||
const LZ4_stream_t_internal* dictCtx;
|
const LZ4_stream_t_internal* dictCtx;
|
||||||
@ -518,7 +504,7 @@ typedef struct LZ4_stream_t_internal LZ4_stream_t_internal;
|
|||||||
struct LZ4_stream_t_internal {
|
struct LZ4_stream_t_internal {
|
||||||
unsigned int hashTable[LZ4_HASH_SIZE_U32];
|
unsigned int hashTable[LZ4_HASH_SIZE_U32];
|
||||||
unsigned int currentOffset;
|
unsigned int currentOffset;
|
||||||
unsigned short initCheck;
|
unsigned short dirty;
|
||||||
unsigned short tableType;
|
unsigned short tableType;
|
||||||
const unsigned char* dictionary;
|
const unsigned char* dictionary;
|
||||||
const LZ4_stream_t_internal* dictCtx;
|
const LZ4_stream_t_internal* dictCtx;
|
||||||
@ -527,38 +513,54 @@ struct LZ4_stream_t_internal {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const unsigned char* externalDict;
|
const unsigned char* externalDict;
|
||||||
size_t extDictSize;
|
|
||||||
const unsigned char* prefixEnd;
|
const unsigned char* prefixEnd;
|
||||||
|
size_t extDictSize;
|
||||||
size_t prefixSize;
|
size_t prefixSize;
|
||||||
} LZ4_streamDecode_t_internal;
|
} LZ4_streamDecode_t_internal;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*!
|
/*! LZ4_stream_t :
|
||||||
* LZ4_stream_t :
|
* information structure to track an LZ4 stream.
|
||||||
* information structure to track an LZ4 stream.
|
* LZ4_stream_t can also be created using LZ4_createStream(), which is recommended.
|
||||||
* init this structure before first use.
|
* The structure definition can be convenient for static allocation
|
||||||
* note : only use in association with static linking !
|
* (on stack, or as part of larger structure).
|
||||||
* this definition is not API/ABI safe,
|
* Init this structure with LZ4_initStream() before first use.
|
||||||
* it may change in a future version !
|
* note : only use this definition in association with static linking !
|
||||||
|
* this definition is not API/ABI safe, and may change in a future version.
|
||||||
*/
|
*/
|
||||||
#define LZ4_STREAMSIZE_U64 ((1 << (LZ4_MEMORY_USAGE-3)) + 4)
|
#define LZ4_STREAMSIZE_U64 ((1 << (LZ4_MEMORY_USAGE-3)) + 4 + ((sizeof(void*)==16) ? 4 : 0) /*AS-400*/ )
|
||||||
#define LZ4_STREAMSIZE (LZ4_STREAMSIZE_U64 * sizeof(unsigned long long))
|
#define LZ4_STREAMSIZE (LZ4_STREAMSIZE_U64 * sizeof(unsigned long long))
|
||||||
union LZ4_stream_u {
|
union LZ4_stream_u {
|
||||||
unsigned long long table[LZ4_STREAMSIZE_U64];
|
unsigned long long table[LZ4_STREAMSIZE_U64];
|
||||||
LZ4_stream_t_internal internal_donotuse;
|
LZ4_stream_t_internal internal_donotuse;
|
||||||
} ; /* previously typedef'd to LZ4_stream_t */
|
} ; /* previously typedef'd to LZ4_stream_t */
|
||||||
|
|
||||||
|
/*! LZ4_initStream() : v1.9.0+
|
||||||
/*!
|
* An LZ4_stream_t structure must be initialized at least once.
|
||||||
* LZ4_streamDecode_t :
|
* This is automatically done when invoking LZ4_createStream(),
|
||||||
* information structure to track an LZ4 stream during decompression.
|
* but it's not when the structure is simply declared on stack (for example).
|
||||||
* init this structure using LZ4_setStreamDecode (or memset()) before first use
|
*
|
||||||
* note : only use in association with static linking !
|
* Use LZ4_initStream() to properly initialize a newly declared LZ4_stream_t.
|
||||||
* this definition is not API/ABI safe,
|
* It can also initialize any arbitrary buffer of sufficient size,
|
||||||
* and may change in a future version !
|
* and will @return a pointer of proper type upon initialization.
|
||||||
|
*
|
||||||
|
* Note : initialization fails if size and alignment conditions are not respected.
|
||||||
|
* In which case, the function will @return NULL.
|
||||||
|
* Note2: An LZ4_stream_t structure guarantees correct alignment and size.
|
||||||
|
* Note3: Before v1.9.0, use LZ4_resetStream() instead
|
||||||
*/
|
*/
|
||||||
#define LZ4_STREAMDECODESIZE_U64 4
|
LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_streamDecode_t :
|
||||||
|
* information structure to track an LZ4 stream during decompression.
|
||||||
|
* init this structure using LZ4_setStreamDecode() before first use.
|
||||||
|
* note : only use in association with static linking !
|
||||||
|
* this definition is not API/ABI safe,
|
||||||
|
* and may change in a future version !
|
||||||
|
*/
|
||||||
|
#define LZ4_STREAMDECODESIZE_U64 (4 + ((sizeof(void*)==16) ? 2 : 0) /*AS-400*/ )
|
||||||
#define LZ4_STREAMDECODESIZE (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long))
|
#define LZ4_STREAMDECODESIZE (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long))
|
||||||
union LZ4_streamDecode_u {
|
union LZ4_streamDecode_u {
|
||||||
unsigned long long table[LZ4_STREAMDECODESIZE_U64];
|
unsigned long long table[LZ4_STREAMDECODESIZE_U64];
|
||||||
@ -571,11 +573,16 @@ union LZ4_streamDecode_u {
|
|||||||
**************************************/
|
**************************************/
|
||||||
|
|
||||||
/*! Deprecation warnings
|
/*! Deprecation warnings
|
||||||
Should deprecation warnings be a problem,
|
*
|
||||||
it is generally possible to disable them,
|
* Deprecated functions make the compiler generate a warning when invoked.
|
||||||
typically with -Wno-deprecated-declarations for gcc
|
* This is meant to invite users to update their source code.
|
||||||
or _CRT_SECURE_NO_WARNINGS in Visual.
|
* Should deprecation warnings be a problem, it is generally possible to disable them,
|
||||||
Otherwise, it's also possible to define LZ4_DISABLE_DEPRECATE_WARNINGS */
|
* typically with -Wno-deprecated-declarations for gcc
|
||||||
|
* or _CRT_SECURE_NO_WARNINGS in Visual.
|
||||||
|
*
|
||||||
|
* Another method is to define LZ4_DISABLE_DEPRECATE_WARNINGS
|
||||||
|
* before including the header file.
|
||||||
|
*/
|
||||||
#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS
|
#ifdef LZ4_DISABLE_DEPRECATE_WARNINGS
|
||||||
# define LZ4_DEPRECATED(message) /* disable deprecation warnings */
|
# define LZ4_DEPRECATED(message) /* disable deprecation warnings */
|
||||||
#else
|
#else
|
||||||
@ -595,8 +602,8 @@ union LZ4_streamDecode_u {
|
|||||||
#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */
|
#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */
|
||||||
|
|
||||||
/* Obsolete compression functions */
|
/* Obsolete compression functions */
|
||||||
LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* source, char* dest, int sourceSize);
|
LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* source, char* dest, int sourceSize);
|
||||||
LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* source, char* dest, int sourceSize, int maxOutputSize);
|
LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* source, char* dest, int sourceSize, int maxOutputSize);
|
||||||
LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize);
|
LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_withState (void* state, const char* source, char* dest, int inputSize);
|
||||||
LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize);
|
LZ4_DEPRECATED("use LZ4_compress_fast_extState() instead") LZ4LIB_API int LZ4_compress_limitedOutput_withState (void* state, const char* source, char* dest, int inputSize, int maxOutputSize);
|
||||||
LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize);
|
LZ4_DEPRECATED("use LZ4_compress_fast_continue() instead") LZ4LIB_API int LZ4_compress_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize);
|
||||||
@ -617,13 +624,56 @@ LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompres
|
|||||||
*/
|
*/
|
||||||
LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer);
|
LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API void* LZ4_create (char* inputBuffer);
|
||||||
LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void);
|
LZ4_DEPRECATED("Use LZ4_createStream() instead") LZ4LIB_API int LZ4_sizeofStreamState(void);
|
||||||
LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer);
|
LZ4_DEPRECATED("Use LZ4_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer);
|
||||||
LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state);
|
LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state);
|
||||||
|
|
||||||
/* Obsolete streaming decoding functions */
|
/* Obsolete streaming decoding functions */
|
||||||
LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize);
|
LZ4_DEPRECATED("use LZ4_decompress_safe_usingDict() instead") LZ4LIB_API int LZ4_decompress_safe_withPrefix64k (const char* src, char* dst, int compressedSize, int maxDstSize);
|
||||||
LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize);
|
LZ4_DEPRECATED("use LZ4_decompress_fast_usingDict() instead") LZ4LIB_API int LZ4_decompress_fast_withPrefix64k (const char* src, char* dst, int originalSize);
|
||||||
|
|
||||||
|
/*! LZ4_decompress_fast() : **unsafe!**
|
||||||
|
* These functions used to be faster than LZ4_decompress_safe(),
|
||||||
|
* but it has changed, and they are now slower than LZ4_decompress_safe().
|
||||||
|
* This is because LZ4_decompress_fast() doesn't know the input size,
|
||||||
|
* and therefore must progress more cautiously in the input buffer to not read beyond the end of block.
|
||||||
|
* On top of that `LZ4_decompress_fast()` is not protected vs malformed or malicious inputs, making it a security liability.
|
||||||
|
* As a consequence, LZ4_decompress_fast() is strongly discouraged, and deprecated.
|
||||||
|
*
|
||||||
|
* The last remaining LZ4_decompress_fast() specificity is that
|
||||||
|
* it can decompress a block without knowing its compressed size.
|
||||||
|
* Such functionality could be achieved in a more secure manner,
|
||||||
|
* by also providing the maximum size of input buffer,
|
||||||
|
* but it would require new prototypes, and adaptation of the implementation to this new use case.
|
||||||
|
*
|
||||||
|
* Parameters:
|
||||||
|
* originalSize : is the uncompressed size to regenerate.
|
||||||
|
* `dst` must be already allocated, its size must be >= 'originalSize' bytes.
|
||||||
|
* @return : number of bytes read from source buffer (== compressed size).
|
||||||
|
* The function expects to finish at block's end exactly.
|
||||||
|
* If the source stream is detected malformed, the function stops decoding and returns a negative result.
|
||||||
|
* note : LZ4_decompress_fast*() requires originalSize. Thanks to this information, it never writes past the output buffer.
|
||||||
|
* However, since it doesn't know its 'src' size, it may read an unknown amount of input, past input buffer bounds.
|
||||||
|
* Also, since match offsets are not validated, match reads from 'src' may underflow too.
|
||||||
|
* These issues never happen if input (compressed) data is correct.
|
||||||
|
* But they may happen if input data is invalid (error or intentional tampering).
|
||||||
|
* As a consequence, use these functions in trusted environments with trusted data **only**.
|
||||||
|
*/
|
||||||
|
|
||||||
|
LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe() instead")
|
||||||
|
LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize);
|
||||||
|
LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_continue() instead")
|
||||||
|
LZ4LIB_API int LZ4_decompress_fast_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int originalSize);
|
||||||
|
LZ4_DEPRECATED("This function is deprecated and unsafe. Consider using LZ4_decompress_safe_usingDict() instead")
|
||||||
|
LZ4LIB_API int LZ4_decompress_fast_usingDict (const char* src, char* dst, int originalSize, const char* dictStart, int dictSize);
|
||||||
|
|
||||||
|
/*! LZ4_resetStream() :
|
||||||
|
* An LZ4_stream_t structure must be initialized at least once.
|
||||||
|
* This is done with LZ4_initStream(), or LZ4_resetStream().
|
||||||
|
* Consider switching to LZ4_initStream(),
|
||||||
|
* invoking LZ4_resetStream() will trigger deprecation warnings in the future.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API void LZ4_resetStream (LZ4_stream_t* streamPtr);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* LZ4_H_2983827168210 */
|
#endif /* LZ4_H_2983827168210 */
|
||||||
|
@ -61,8 +61,18 @@
|
|||||||
# pragma clang diagnostic ignored "-Wunused-function"
|
# pragma clang diagnostic ignored "-Wunused-function"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace tracy
|
||||||
|
{
|
||||||
|
|
||||||
|
/*=== Enums ===*/
|
||||||
|
typedef enum { noDictCtx, usingDictCtxHc } dictCtx_directive;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
#define LZ4_COMMONDEFS_ONLY
|
#define LZ4_COMMONDEFS_ONLY
|
||||||
|
#ifndef LZ4_SRC_INCLUDED
|
||||||
#include "tracy_lz4.cpp" /* LZ4_count, constants, mem */
|
#include "tracy_lz4.cpp" /* LZ4_count, constants, mem */
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace tracy
|
namespace tracy
|
||||||
{
|
{
|
||||||
@ -78,12 +88,11 @@ namespace tracy
|
|||||||
#define HASH_FUNCTION(i) (((i) * 2654435761U) >> ((MINMATCH*8)-LZ4HC_HASH_LOG))
|
#define HASH_FUNCTION(i) (((i) * 2654435761U) >> ((MINMATCH*8)-LZ4HC_HASH_LOG))
|
||||||
#define DELTANEXTMAXD(p) chainTable[(p) & LZ4HC_MAXD_MASK] /* flexible, LZ4HC_MAXD dependent */
|
#define DELTANEXTMAXD(p) chainTable[(p) & LZ4HC_MAXD_MASK] /* flexible, LZ4HC_MAXD dependent */
|
||||||
#define DELTANEXTU16(table, pos) table[(U16)(pos)] /* faster */
|
#define DELTANEXTU16(table, pos) table[(U16)(pos)] /* faster */
|
||||||
|
/* Make fields passed to, and updated by LZ4HC_encodeSequence explicit */
|
||||||
|
#define UPDATABLE(ip, op, anchor) &ip, &op, &anchor
|
||||||
|
|
||||||
static U32 LZ4HC_hashPtr(const void* ptr) { return HASH_FUNCTION(LZ4_read32(ptr)); }
|
static U32 LZ4HC_hashPtr(const void* ptr) { return HASH_FUNCTION(LZ4_read32(ptr)); }
|
||||||
|
|
||||||
/*=== Enums ===*/
|
|
||||||
typedef enum { noDictCtx, usingDictCtx } dictCtx_directive;
|
|
||||||
|
|
||||||
|
|
||||||
/**************************************
|
/**************************************
|
||||||
* HC Compression
|
* HC Compression
|
||||||
@ -94,9 +103,9 @@ static void LZ4HC_clearTables (LZ4HC_CCtx_internal* hc4)
|
|||||||
MEM_INIT(hc4->chainTable, 0xFF, sizeof(hc4->chainTable));
|
MEM_INIT(hc4->chainTable, 0xFF, sizeof(hc4->chainTable));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void LZ4HC_init (LZ4HC_CCtx_internal* hc4, const BYTE* start)
|
static void LZ4HC_init_internal (LZ4HC_CCtx_internal* hc4, const BYTE* start)
|
||||||
{
|
{
|
||||||
uptrval startingOffset = hc4->end - hc4->base;
|
uptrval startingOffset = (uptrval)(hc4->end - hc4->base);
|
||||||
if (startingOffset > 1 GB) {
|
if (startingOffset > 1 GB) {
|
||||||
LZ4HC_clearTables(hc4);
|
LZ4HC_clearTables(hc4);
|
||||||
startingOffset = 0;
|
startingOffset = 0;
|
||||||
@ -123,7 +132,7 @@ LZ4_FORCE_INLINE void LZ4HC_Insert (LZ4HC_CCtx_internal* hc4, const BYTE* ip)
|
|||||||
while (idx < target) {
|
while (idx < target) {
|
||||||
U32 const h = LZ4HC_hashPtr(base+idx);
|
U32 const h = LZ4HC_hashPtr(base+idx);
|
||||||
size_t delta = idx - hashTable[h];
|
size_t delta = idx - hashTable[h];
|
||||||
if (delta>MAX_DISTANCE) delta = MAX_DISTANCE;
|
if (delta>LZ4_DISTANCE_MAX) delta = LZ4_DISTANCE_MAX;
|
||||||
DELTANEXTU16(chainTable, idx) = (U16)delta;
|
DELTANEXTU16(chainTable, idx) = (U16)delta;
|
||||||
hashTable[h] = idx;
|
hashTable[h] = idx;
|
||||||
idx++;
|
idx++;
|
||||||
@ -226,14 +235,13 @@ LZ4HC_InsertAndGetWiderMatch (
|
|||||||
const U32 dictLimit = hc4->dictLimit;
|
const U32 dictLimit = hc4->dictLimit;
|
||||||
const BYTE* const lowPrefixPtr = base + dictLimit;
|
const BYTE* const lowPrefixPtr = base + dictLimit;
|
||||||
const U32 ipIndex = (U32)(ip - base);
|
const U32 ipIndex = (U32)(ip - base);
|
||||||
const U32 lowestMatchIndex = (hc4->lowLimit + 64 KB > ipIndex) ? hc4->lowLimit : ipIndex - MAX_DISTANCE;
|
const U32 lowestMatchIndex = (hc4->lowLimit + 64 KB > ipIndex) ? hc4->lowLimit : ipIndex - LZ4_DISTANCE_MAX;
|
||||||
const BYTE* const dictBase = hc4->dictBase;
|
const BYTE* const dictBase = hc4->dictBase;
|
||||||
int const lookBackLength = (int)(ip-iLowLimit);
|
int const lookBackLength = (int)(ip-iLowLimit);
|
||||||
int nbAttempts = maxNbAttempts;
|
int nbAttempts = maxNbAttempts;
|
||||||
int matchChainPos = 0;
|
U32 matchChainPos = 0;
|
||||||
U32 const pattern = LZ4_read32(ip);
|
U32 const pattern = LZ4_read32(ip);
|
||||||
U32 matchIndex;
|
U32 matchIndex;
|
||||||
U32 dictMatchIndex;
|
|
||||||
repeat_state_e repeat = rep_untested;
|
repeat_state_e repeat = rep_untested;
|
||||||
size_t srcPatternLength = 0;
|
size_t srcPatternLength = 0;
|
||||||
|
|
||||||
@ -258,7 +266,7 @@ LZ4HC_InsertAndGetWiderMatch (
|
|||||||
if (LZ4_read16(iLowLimit + longest - 1) == LZ4_read16(matchPtr - lookBackLength + longest - 1)) {
|
if (LZ4_read16(iLowLimit + longest - 1) == LZ4_read16(matchPtr - lookBackLength + longest - 1)) {
|
||||||
if (LZ4_read32(matchPtr) == pattern) {
|
if (LZ4_read32(matchPtr) == pattern) {
|
||||||
int const back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, lowPrefixPtr) : 0;
|
int const back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, lowPrefixPtr) : 0;
|
||||||
matchLength = MINMATCH + LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, iHighLimit);
|
matchLength = MINMATCH + (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, iHighLimit);
|
||||||
matchLength -= back;
|
matchLength -= back;
|
||||||
if (matchLength > longest) {
|
if (matchLength > longest) {
|
||||||
longest = matchLength;
|
longest = matchLength;
|
||||||
@ -272,7 +280,7 @@ LZ4HC_InsertAndGetWiderMatch (
|
|||||||
int back = 0;
|
int back = 0;
|
||||||
const BYTE* vLimit = ip + (dictLimit - matchIndex);
|
const BYTE* vLimit = ip + (dictLimit - matchIndex);
|
||||||
if (vLimit > iHighLimit) vLimit = iHighLimit;
|
if (vLimit > iHighLimit) vLimit = iHighLimit;
|
||||||
matchLength = LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH;
|
matchLength = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH;
|
||||||
if ((ip+matchLength == vLimit) && (vLimit < iHighLimit))
|
if ((ip+matchLength == vLimit) && (vLimit < iHighLimit))
|
||||||
matchLength += LZ4_count(ip+matchLength, lowPrefixPtr, iHighLimit);
|
matchLength += LZ4_count(ip+matchLength, lowPrefixPtr, iHighLimit);
|
||||||
back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictStart) : 0;
|
back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictStart) : 0;
|
||||||
@ -285,14 +293,14 @@ LZ4HC_InsertAndGetWiderMatch (
|
|||||||
|
|
||||||
if (chainSwap && matchLength==longest) { /* better match => select a better chain */
|
if (chainSwap && matchLength==longest) { /* better match => select a better chain */
|
||||||
assert(lookBackLength==0); /* search forward only */
|
assert(lookBackLength==0); /* search forward only */
|
||||||
if (matchIndex + longest <= ipIndex) {
|
if (matchIndex + (U32)longest <= ipIndex) {
|
||||||
U32 distanceToNextMatch = 1;
|
U32 distanceToNextMatch = 1;
|
||||||
int pos;
|
int pos;
|
||||||
for (pos = 0; pos <= longest - MINMATCH; pos++) {
|
for (pos = 0; pos <= longest - MINMATCH; pos++) {
|
||||||
U32 const candidateDist = DELTANEXTU16(chainTable, matchIndex + pos);
|
U32 const candidateDist = DELTANEXTU16(chainTable, matchIndex + (U32)pos);
|
||||||
if (candidateDist > distanceToNextMatch) {
|
if (candidateDist > distanceToNextMatch) {
|
||||||
distanceToNextMatch = candidateDist;
|
distanceToNextMatch = candidateDist;
|
||||||
matchChainPos = pos;
|
matchChainPos = (U32)pos;
|
||||||
} }
|
} }
|
||||||
if (distanceToNextMatch > 1) {
|
if (distanceToNextMatch > 1) {
|
||||||
if (distanceToNextMatch > matchIndex) break; /* avoid overflow */
|
if (distanceToNextMatch > matchIndex) break; /* avoid overflow */
|
||||||
@ -317,7 +325,7 @@ LZ4HC_InsertAndGetWiderMatch (
|
|||||||
const BYTE* const matchPtr = base + matchCandidateIdx;
|
const BYTE* const matchPtr = base + matchCandidateIdx;
|
||||||
if (LZ4_read32(matchPtr) == pattern) { /* good candidate */
|
if (LZ4_read32(matchPtr) == pattern) { /* good candidate */
|
||||||
size_t const forwardPatternLength = LZ4HC_countPattern(matchPtr+sizeof(pattern), iHighLimit, pattern) + sizeof(pattern);
|
size_t const forwardPatternLength = LZ4HC_countPattern(matchPtr+sizeof(pattern), iHighLimit, pattern) + sizeof(pattern);
|
||||||
const BYTE* const lowestMatchPtr = (lowPrefixPtr + MAX_DISTANCE >= ip) ? lowPrefixPtr : ip - MAX_DISTANCE;
|
const BYTE* const lowestMatchPtr = (lowPrefixPtr + LZ4_DISTANCE_MAX >= ip) ? lowPrefixPtr : ip - LZ4_DISTANCE_MAX;
|
||||||
size_t const backLength = LZ4HC_reverseCountPattern(matchPtr, lowestMatchPtr, pattern);
|
size_t const backLength = LZ4HC_reverseCountPattern(matchPtr, lowestMatchPtr, pattern);
|
||||||
size_t const currentSegmentLength = backLength + forwardPatternLength;
|
size_t const currentSegmentLength = backLength + forwardPatternLength;
|
||||||
|
|
||||||
@ -330,7 +338,7 @@ LZ4HC_InsertAndGetWiderMatch (
|
|||||||
size_t const maxML = MIN(currentSegmentLength, srcPatternLength);
|
size_t const maxML = MIN(currentSegmentLength, srcPatternLength);
|
||||||
if ((size_t)longest < maxML) {
|
if ((size_t)longest < maxML) {
|
||||||
assert(base + matchIndex < ip);
|
assert(base + matchIndex < ip);
|
||||||
if (ip - (base+matchIndex) > MAX_DISTANCE) break;
|
if (ip - (base+matchIndex) > LZ4_DISTANCE_MAX) break;
|
||||||
assert(maxML < 2 GB);
|
assert(maxML < 2 GB);
|
||||||
longest = (int)maxML;
|
longest = (int)maxML;
|
||||||
*matchpos = base + matchIndex; /* virtual pos, relative to ip, to retrieve offset */
|
*matchpos = base + matchIndex; /* virtual pos, relative to ip, to retrieve offset */
|
||||||
@ -345,16 +353,18 @@ LZ4HC_InsertAndGetWiderMatch (
|
|||||||
} } /* PA optimization */
|
} } /* PA optimization */
|
||||||
|
|
||||||
/* follow current chain */
|
/* follow current chain */
|
||||||
matchIndex -= DELTANEXTU16(chainTable, matchIndex+matchChainPos);
|
matchIndex -= DELTANEXTU16(chainTable, matchIndex + matchChainPos);
|
||||||
|
|
||||||
} /* while ((matchIndex>=lowestMatchIndex) && (nbAttempts)) */
|
} /* while ((matchIndex>=lowestMatchIndex) && (nbAttempts)) */
|
||||||
|
|
||||||
if (dict == usingDictCtx && nbAttempts && ipIndex - lowestMatchIndex < MAX_DISTANCE) {
|
if ( dict == usingDictCtxHc
|
||||||
size_t const dictEndOffset = dictCtx->end - dictCtx->base;
|
&& nbAttempts
|
||||||
|
&& ipIndex - lowestMatchIndex < LZ4_DISTANCE_MAX) {
|
||||||
|
size_t const dictEndOffset = (size_t)(dictCtx->end - dictCtx->base);
|
||||||
|
U32 dictMatchIndex = dictCtx->hashTable[LZ4HC_hashPtr(ip)];
|
||||||
assert(dictEndOffset <= 1 GB);
|
assert(dictEndOffset <= 1 GB);
|
||||||
dictMatchIndex = dictCtx->hashTable[LZ4HC_hashPtr(ip)];
|
|
||||||
matchIndex = dictMatchIndex + lowestMatchIndex - (U32)dictEndOffset;
|
matchIndex = dictMatchIndex + lowestMatchIndex - (U32)dictEndOffset;
|
||||||
while (ipIndex - matchIndex <= MAX_DISTANCE && nbAttempts--) {
|
while (ipIndex - matchIndex <= LZ4_DISTANCE_MAX && nbAttempts--) {
|
||||||
const BYTE* const matchPtr = dictCtx->base + dictMatchIndex;
|
const BYTE* const matchPtr = dictCtx->base + dictMatchIndex;
|
||||||
|
|
||||||
if (LZ4_read32(matchPtr) == pattern) {
|
if (LZ4_read32(matchPtr) == pattern) {
|
||||||
@ -362,22 +372,19 @@ LZ4HC_InsertAndGetWiderMatch (
|
|||||||
int back = 0;
|
int back = 0;
|
||||||
const BYTE* vLimit = ip + (dictEndOffset - dictMatchIndex);
|
const BYTE* vLimit = ip + (dictEndOffset - dictMatchIndex);
|
||||||
if (vLimit > iHighLimit) vLimit = iHighLimit;
|
if (vLimit > iHighLimit) vLimit = iHighLimit;
|
||||||
mlt = LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH;
|
mlt = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH;
|
||||||
back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictCtx->base + dictCtx->dictLimit) : 0;
|
back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictCtx->base + dictCtx->dictLimit) : 0;
|
||||||
mlt -= back;
|
mlt -= back;
|
||||||
if (mlt > longest) {
|
if (mlt > longest) {
|
||||||
longest = mlt;
|
longest = mlt;
|
||||||
*matchpos = base + matchIndex + back;
|
*matchpos = base + matchIndex + back;
|
||||||
*startpos = ip + back;
|
*startpos = ip + back;
|
||||||
}
|
} }
|
||||||
}
|
|
||||||
|
|
||||||
{ U32 const nextOffset = DELTANEXTU16(dictCtx->chainTable, dictMatchIndex);
|
{ U32 const nextOffset = DELTANEXTU16(dictCtx->chainTable, dictMatchIndex);
|
||||||
dictMatchIndex -= nextOffset;
|
dictMatchIndex -= nextOffset;
|
||||||
matchIndex -= nextOffset;
|
matchIndex -= nextOffset;
|
||||||
}
|
} } }
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return longest;
|
return longest;
|
||||||
}
|
}
|
||||||
@ -397,14 +404,6 @@ int LZ4HC_InsertAndFindBestMatch(LZ4HC_CCtx_internal* const hc4, /* Index tabl
|
|||||||
return LZ4HC_InsertAndGetWiderMatch(hc4, ip, ip, iLimit, MINMATCH-1, matchpos, &uselessPtr, maxNbAttempts, patternAnalysis, 0 /*chainSwap*/, dict, favorCompressionRatio);
|
return LZ4HC_InsertAndGetWiderMatch(hc4, ip, ip, iLimit, MINMATCH-1, matchpos, &uselessPtr, maxNbAttempts, patternAnalysis, 0 /*chainSwap*/, dict, favorCompressionRatio);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
noLimit = 0,
|
|
||||||
limitedOutput = 1,
|
|
||||||
limitedDestSize = 2,
|
|
||||||
} limitedOutput_directive;
|
|
||||||
|
|
||||||
/* LZ4HC_encodeSequence() :
|
/* LZ4HC_encodeSequence() :
|
||||||
* @return : 0 if ok,
|
* @return : 0 if ok,
|
||||||
* 1 if buffer issue detected */
|
* 1 if buffer issue detected */
|
||||||
@ -439,7 +438,7 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence (
|
|||||||
|
|
||||||
/* Encode Literal length */
|
/* Encode Literal length */
|
||||||
length = (size_t)(*ip - *anchor);
|
length = (size_t)(*ip - *anchor);
|
||||||
if ((limit) && ((*op + (length >> 8) + length + (2 + 1 + LASTLITERALS)) > oend)) return 1; /* Check output limit */
|
if ((limit) && ((*op + (length / 255) + length + (2 + 1 + LASTLITERALS)) > oend)) return 1; /* Check output limit */
|
||||||
if (length >= RUN_MASK) {
|
if (length >= RUN_MASK) {
|
||||||
size_t len = length - RUN_MASK;
|
size_t len = length - RUN_MASK;
|
||||||
*token = (RUN_MASK << ML_BITS);
|
*token = (RUN_MASK << ML_BITS);
|
||||||
@ -450,17 +449,17 @@ LZ4_FORCE_INLINE int LZ4HC_encodeSequence (
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Copy Literals */
|
/* Copy Literals */
|
||||||
LZ4_wildCopy(*op, *anchor, (*op) + length);
|
LZ4_wildCopy8(*op, *anchor, (*op) + length);
|
||||||
*op += length;
|
*op += length;
|
||||||
|
|
||||||
/* Encode Offset */
|
/* Encode Offset */
|
||||||
assert( (*ip - match) <= MAX_DISTANCE ); /* note : consider providing offset as a value, rather than as a pointer difference */
|
assert( (*ip - match) <= LZ4_DISTANCE_MAX ); /* note : consider providing offset as a value, rather than as a pointer difference */
|
||||||
LZ4_writeLE16(*op, (U16)(*ip-match)); *op += 2;
|
LZ4_writeLE16(*op, (U16)(*ip-match)); *op += 2;
|
||||||
|
|
||||||
/* Encode MatchLength */
|
/* Encode MatchLength */
|
||||||
assert(matchLength >= MINMATCH);
|
assert(matchLength >= MINMATCH);
|
||||||
length = (size_t)(matchLength - MINMATCH);
|
length = (size_t)matchLength - MINMATCH;
|
||||||
if ((limit) && (*op + (length >> 8) + (1 + LASTLITERALS) > oend)) return 1; /* Check output limit */
|
if ((limit) && (*op + (length / 255) + (1 + LASTLITERALS) > oend)) return 1; /* Check output limit */
|
||||||
if (length >= ML_MASK) {
|
if (length >= ML_MASK) {
|
||||||
*token += ML_MASK;
|
*token += ML_MASK;
|
||||||
length -= ML_MASK;
|
length -= ML_MASK;
|
||||||
@ -513,12 +512,12 @@ LZ4_FORCE_INLINE int LZ4HC_compress_hashChain (
|
|||||||
|
|
||||||
/* init */
|
/* init */
|
||||||
*srcSizePtr = 0;
|
*srcSizePtr = 0;
|
||||||
if (limit == limitedDestSize) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */
|
if (limit == fillOutput) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */
|
||||||
if (inputSize < LZ4_minLength) goto _last_literals; /* Input too small, no compression (all literals) */
|
if (inputSize < LZ4_minLength) goto _last_literals; /* Input too small, no compression (all literals) */
|
||||||
|
|
||||||
/* Main Loop */
|
/* Main Loop */
|
||||||
while (ip <= mflimit) {
|
while (ip <= mflimit) {
|
||||||
ml = LZ4HC_InsertAndFindBestMatch (ctx, ip, matchlimit, &ref, maxNbAttempts, patternAnalysis, dict);
|
ml = LZ4HC_InsertAndFindBestMatch(ctx, ip, matchlimit, &ref, maxNbAttempts, patternAnalysis, dict);
|
||||||
if (ml<MINMATCH) { ip++; continue; }
|
if (ml<MINMATCH) { ip++; continue; }
|
||||||
|
|
||||||
/* saved, in case we would skip too much */
|
/* saved, in case we would skip too much */
|
||||||
@ -535,7 +534,7 @@ _Search2:
|
|||||||
|
|
||||||
if (ml2 == ml) { /* No better match => encode ML1 */
|
if (ml2 == ml) { /* No better match => encode ML1 */
|
||||||
optr = op;
|
optr = op;
|
||||||
if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) goto _dest_overflow;
|
if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -583,10 +582,10 @@ _Search3:
|
|||||||
if (start2 < ip+ml) ml = (int)(start2 - ip);
|
if (start2 < ip+ml) ml = (int)(start2 - ip);
|
||||||
/* Now, encode 2 sequences */
|
/* Now, encode 2 sequences */
|
||||||
optr = op;
|
optr = op;
|
||||||
if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) goto _dest_overflow;
|
if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow;
|
||||||
ip = start2;
|
ip = start2;
|
||||||
optr = op;
|
optr = op;
|
||||||
if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml2, ref2, limit, oend)) goto _dest_overflow;
|
if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml2, ref2, limit, oend)) goto _dest_overflow;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -605,7 +604,7 @@ _Search3:
|
|||||||
}
|
}
|
||||||
|
|
||||||
optr = op;
|
optr = op;
|
||||||
if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) goto _dest_overflow;
|
if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow;
|
||||||
ip = start3;
|
ip = start3;
|
||||||
ref = ref3;
|
ref = ref3;
|
||||||
ml = ml3;
|
ml = ml3;
|
||||||
@ -643,7 +642,7 @@ _Search3:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
optr = op;
|
optr = op;
|
||||||
if (LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ref, limit, oend)) goto _dest_overflow;
|
if (LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ref, limit, oend)) goto _dest_overflow;
|
||||||
|
|
||||||
/* ML2 becomes ML1 */
|
/* ML2 becomes ML1 */
|
||||||
ip = start2; ref = ref2; ml = ml2;
|
ip = start2; ref = ref2; ml = ml2;
|
||||||
@ -660,7 +659,7 @@ _last_literals:
|
|||||||
{ size_t lastRunSize = (size_t)(iend - anchor); /* literals */
|
{ size_t lastRunSize = (size_t)(iend - anchor); /* literals */
|
||||||
size_t litLength = (lastRunSize + 255 - RUN_MASK) / 255;
|
size_t litLength = (lastRunSize + 255 - RUN_MASK) / 255;
|
||||||
size_t const totalSize = 1 + litLength + lastRunSize;
|
size_t const totalSize = 1 + litLength + lastRunSize;
|
||||||
if (limit == limitedDestSize) oend += LASTLITERALS; /* restore correct value */
|
if (limit == fillOutput) oend += LASTLITERALS; /* restore correct value */
|
||||||
if (limit && (op + totalSize > oend)) {
|
if (limit && (op + totalSize > oend)) {
|
||||||
if (limit == limitedOutput) return 0; /* Check output limit */
|
if (limit == limitedOutput) return 0; /* Check output limit */
|
||||||
/* adapt lastRunSize to fill 'dest' */
|
/* adapt lastRunSize to fill 'dest' */
|
||||||
@ -687,7 +686,7 @@ _last_literals:
|
|||||||
return (int) (((char*)op)-dest);
|
return (int) (((char*)op)-dest);
|
||||||
|
|
||||||
_dest_overflow:
|
_dest_overflow:
|
||||||
if (limit == limitedDestSize) {
|
if (limit == fillOutput) {
|
||||||
op = optr; /* restore correct out pointer */
|
op = optr; /* restore correct out pointer */
|
||||||
goto _last_literals;
|
goto _last_literals;
|
||||||
}
|
}
|
||||||
@ -737,56 +736,64 @@ LZ4_FORCE_INLINE int LZ4HC_compress_generic_internal (
|
|||||||
{ lz4opt,16384,LZ4_OPT_NUM }, /* 12==LZ4HC_CLEVEL_MAX */
|
{ lz4opt,16384,LZ4_OPT_NUM }, /* 12==LZ4HC_CLEVEL_MAX */
|
||||||
};
|
};
|
||||||
|
|
||||||
DEBUGLOG(4, "LZ4HC_compress_generic(%p, %p, %d)", ctx, src, *srcSizePtr);
|
DEBUGLOG(4, "LZ4HC_compress_generic(ctx=%p, src=%p, srcSize=%d)", ctx, src, *srcSizePtr);
|
||||||
|
|
||||||
if (limit == limitedDestSize && dstCapacity < 1) return 0; /* Impossible to store anything */
|
if (limit == fillOutput && dstCapacity < 1) return 0; /* Impossible to store anything */
|
||||||
if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size (too large or negative) */
|
if ((U32)*srcSizePtr > (U32)LZ4_MAX_INPUT_SIZE) return 0; /* Unsupported input size (too large or negative) */
|
||||||
|
|
||||||
ctx->end += *srcSizePtr;
|
ctx->end += *srcSizePtr;
|
||||||
if (cLevel < 1) cLevel = LZ4HC_CLEVEL_DEFAULT; /* note : convention is different from lz4frame, maybe something to review */
|
if (cLevel < 1) cLevel = LZ4HC_CLEVEL_DEFAULT; /* note : convention is different from lz4frame, maybe something to review */
|
||||||
cLevel = MIN(LZ4HC_CLEVEL_MAX, cLevel);
|
cLevel = MIN(LZ4HC_CLEVEL_MAX, cLevel);
|
||||||
{ cParams_t const cParam = clTable[cLevel];
|
{ cParams_t const cParam = clTable[cLevel];
|
||||||
HCfavor_e const favor = ctx->favorDecSpeed ? favorDecompressionSpeed : favorCompressionRatio;
|
HCfavor_e const favor = ctx->favorDecSpeed ? favorDecompressionSpeed : favorCompressionRatio;
|
||||||
if (cParam.strat == lz4hc)
|
int result;
|
||||||
return LZ4HC_compress_hashChain(ctx,
|
|
||||||
|
if (cParam.strat == lz4hc) {
|
||||||
|
result = LZ4HC_compress_hashChain(ctx,
|
||||||
src, dst, srcSizePtr, dstCapacity,
|
src, dst, srcSizePtr, dstCapacity,
|
||||||
cParam.nbSearches, limit, dict);
|
cParam.nbSearches, limit, dict);
|
||||||
assert(cParam.strat == lz4opt);
|
} else {
|
||||||
return LZ4HC_compress_optimal(ctx,
|
assert(cParam.strat == lz4opt);
|
||||||
src, dst, srcSizePtr, dstCapacity,
|
result = LZ4HC_compress_optimal(ctx,
|
||||||
cParam.nbSearches, cParam.targetLength, limit,
|
src, dst, srcSizePtr, dstCapacity,
|
||||||
cLevel == LZ4HC_CLEVEL_MAX, /* ultra mode */
|
(int)cParam.nbSearches, cParam.targetLength, limit,
|
||||||
dict, favor);
|
cLevel == LZ4HC_CLEVEL_MAX, /* ultra mode */
|
||||||
|
dict, favor);
|
||||||
|
}
|
||||||
|
if (result <= 0) ctx->dirty = 1;
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock);
|
static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock);
|
||||||
|
|
||||||
static int LZ4HC_compress_generic_noDictCtx (
|
static int
|
||||||
LZ4HC_CCtx_internal* const ctx,
|
LZ4HC_compress_generic_noDictCtx (
|
||||||
const char* const src,
|
LZ4HC_CCtx_internal* const ctx,
|
||||||
char* const dst,
|
const char* const src,
|
||||||
int* const srcSizePtr,
|
char* const dst,
|
||||||
int const dstCapacity,
|
int* const srcSizePtr,
|
||||||
int cLevel,
|
int const dstCapacity,
|
||||||
limitedOutput_directive limit
|
int cLevel,
|
||||||
)
|
limitedOutput_directive limit
|
||||||
|
)
|
||||||
{
|
{
|
||||||
assert(ctx->dictCtx == NULL);
|
assert(ctx->dictCtx == NULL);
|
||||||
return LZ4HC_compress_generic_internal(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit, noDictCtx);
|
return LZ4HC_compress_generic_internal(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit, noDictCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int LZ4HC_compress_generic_dictCtx (
|
static int
|
||||||
LZ4HC_CCtx_internal* const ctx,
|
LZ4HC_compress_generic_dictCtx (
|
||||||
const char* const src,
|
LZ4HC_CCtx_internal* const ctx,
|
||||||
char* const dst,
|
const char* const src,
|
||||||
int* const srcSizePtr,
|
char* const dst,
|
||||||
int const dstCapacity,
|
int* const srcSizePtr,
|
||||||
int cLevel,
|
int const dstCapacity,
|
||||||
limitedOutput_directive limit
|
int cLevel,
|
||||||
)
|
limitedOutput_directive limit
|
||||||
|
)
|
||||||
{
|
{
|
||||||
const size_t position = ctx->end - ctx->base - ctx->lowLimit;
|
const size_t position = (size_t)(ctx->end - ctx->base) - ctx->lowLimit;
|
||||||
assert(ctx->dictCtx != NULL);
|
assert(ctx->dictCtx != NULL);
|
||||||
if (position >= 64 KB) {
|
if (position >= 64 KB) {
|
||||||
ctx->dictCtx = NULL;
|
ctx->dictCtx = NULL;
|
||||||
@ -797,19 +804,20 @@ static int LZ4HC_compress_generic_dictCtx (
|
|||||||
ctx->compressionLevel = (short)cLevel;
|
ctx->compressionLevel = (short)cLevel;
|
||||||
return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit);
|
return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit);
|
||||||
} else {
|
} else {
|
||||||
return LZ4HC_compress_generic_internal(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit, usingDictCtx);
|
return LZ4HC_compress_generic_internal(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit, usingDictCtxHc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int LZ4HC_compress_generic (
|
static int
|
||||||
LZ4HC_CCtx_internal* const ctx,
|
LZ4HC_compress_generic (
|
||||||
const char* const src,
|
LZ4HC_CCtx_internal* const ctx,
|
||||||
char* const dst,
|
const char* const src,
|
||||||
int* const srcSizePtr,
|
char* const dst,
|
||||||
int const dstCapacity,
|
int* const srcSizePtr,
|
||||||
int cLevel,
|
int const dstCapacity,
|
||||||
limitedOutput_directive limit
|
int cLevel,
|
||||||
)
|
limitedOutput_directive limit
|
||||||
|
)
|
||||||
{
|
{
|
||||||
if (ctx->dictCtx == NULL) {
|
if (ctx->dictCtx == NULL) {
|
||||||
return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit);
|
return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit);
|
||||||
@ -819,24 +827,41 @@ static int LZ4HC_compress_generic (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int LZ4_sizeofStateHC(void) { return sizeof(LZ4_streamHC_t); }
|
int LZ4_sizeofStateHC(void) { return (int)sizeof(LZ4_streamHC_t); }
|
||||||
|
|
||||||
|
#ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 :
|
||||||
|
* it reports an aligment of 8-bytes,
|
||||||
|
* while actually aligning LZ4_streamHC_t on 4 bytes. */
|
||||||
|
static size_t LZ4_streamHC_t_alignment(void)
|
||||||
|
{
|
||||||
|
struct { char c; LZ4_streamHC_t t; } t_a;
|
||||||
|
return sizeof(t_a) - sizeof(t_a.t);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* state is presumed correctly initialized,
|
||||||
|
* in which case its size and alignment have already been validate */
|
||||||
int LZ4_compress_HC_extStateHC_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel)
|
int LZ4_compress_HC_extStateHC_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel)
|
||||||
{
|
{
|
||||||
LZ4HC_CCtx_internal* const ctx = &((LZ4_streamHC_t*)state)->internal_donotuse;
|
LZ4HC_CCtx_internal* const ctx = &((LZ4_streamHC_t*)state)->internal_donotuse;
|
||||||
|
#ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 :
|
||||||
|
* it reports an aligment of 8-bytes,
|
||||||
|
* while actually aligning LZ4_streamHC_t on 4 bytes. */
|
||||||
|
assert(((size_t)state & (LZ4_streamHC_t_alignment() - 1)) == 0); /* check alignment */
|
||||||
|
#endif
|
||||||
if (((size_t)(state)&(sizeof(void*)-1)) != 0) return 0; /* Error : state is not aligned for pointers (32 or 64 bits) */
|
if (((size_t)(state)&(sizeof(void*)-1)) != 0) return 0; /* Error : state is not aligned for pointers (32 or 64 bits) */
|
||||||
LZ4_resetStreamHC_fast((LZ4_streamHC_t*)state, compressionLevel);
|
LZ4_resetStreamHC_fast((LZ4_streamHC_t*)state, compressionLevel);
|
||||||
LZ4HC_init (ctx, (const BYTE*)src);
|
LZ4HC_init_internal (ctx, (const BYTE*)src);
|
||||||
if (dstCapacity < LZ4_compressBound(srcSize))
|
if (dstCapacity < LZ4_compressBound(srcSize))
|
||||||
return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, limitedOutput);
|
return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, limitedOutput);
|
||||||
else
|
else
|
||||||
return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, noLimit);
|
return LZ4HC_compress_generic (ctx, src, dst, &srcSize, dstCapacity, compressionLevel, notLimited);
|
||||||
}
|
}
|
||||||
|
|
||||||
int LZ4_compress_HC_extStateHC (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel)
|
int LZ4_compress_HC_extStateHC (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel)
|
||||||
{
|
{
|
||||||
if (((size_t)(state)&(sizeof(void*)-1)) != 0) return 0; /* Error : state is not aligned for pointers (32 or 64 bits) */
|
LZ4_streamHC_t* const ctx = LZ4_initStreamHC(state, sizeof(*ctx));
|
||||||
LZ4_resetStreamHC ((LZ4_streamHC_t*)state, compressionLevel);
|
if (ctx==NULL) return 0; /* init failure */
|
||||||
return LZ4_compress_HC_extStateHC_fastReset(state, src, dst, srcSize, dstCapacity, compressionLevel);
|
return LZ4_compress_HC_extStateHC_fastReset(state, src, dst, srcSize, dstCapacity, compressionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -850,19 +875,19 @@ int LZ4_compress_HC(const char* src, char* dst, int srcSize, int dstCapacity, in
|
|||||||
#endif
|
#endif
|
||||||
int const cSize = LZ4_compress_HC_extStateHC(statePtr, src, dst, srcSize, dstCapacity, compressionLevel);
|
int const cSize = LZ4_compress_HC_extStateHC(statePtr, src, dst, srcSize, dstCapacity, compressionLevel);
|
||||||
#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1
|
#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1
|
||||||
free(statePtr);
|
FREEMEM(statePtr);
|
||||||
#endif
|
#endif
|
||||||
return cSize;
|
return cSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* LZ4_compress_HC_destSize() :
|
/* state is presumed sized correctly (>= sizeof(LZ4_streamHC_t)) */
|
||||||
* only compatible with regular HC parser */
|
int LZ4_compress_HC_destSize(void* state, const char* source, char* dest, int* sourceSizePtr, int targetDestSize, int cLevel)
|
||||||
int LZ4_compress_HC_destSize(void* LZ4HC_Data, const char* source, char* dest, int* sourceSizePtr, int targetDestSize, int cLevel)
|
|
||||||
{
|
{
|
||||||
LZ4HC_CCtx_internal* const ctx = &((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse;
|
LZ4_streamHC_t* const ctx = LZ4_initStreamHC(state, sizeof(*ctx));
|
||||||
LZ4_resetStreamHC((LZ4_streamHC_t*)LZ4HC_Data, cLevel);
|
if (ctx==NULL) return 0; /* init failure */
|
||||||
LZ4HC_init(ctx, (const BYTE*) source);
|
LZ4HC_init_internal(&ctx->internal_donotuse, (const BYTE*) source);
|
||||||
return LZ4HC_compress_generic(ctx, source, dest, sourceSizePtr, targetDestSize, cLevel, limitedDestSize);
|
LZ4_setCompressionLevel(ctx, cLevel);
|
||||||
|
return LZ4HC_compress_generic(&ctx->internal_donotuse, source, dest, sourceSizePtr, targetDestSize, cLevel, fillOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -871,44 +896,70 @@ int LZ4_compress_HC_destSize(void* LZ4HC_Data, const char* source, char* dest, i
|
|||||||
* Streaming Functions
|
* Streaming Functions
|
||||||
**************************************/
|
**************************************/
|
||||||
/* allocation */
|
/* allocation */
|
||||||
LZ4_streamHC_t* LZ4_createStreamHC(void) {
|
LZ4_streamHC_t* LZ4_createStreamHC(void)
|
||||||
|
{
|
||||||
LZ4_streamHC_t* const LZ4_streamHCPtr = (LZ4_streamHC_t*)ALLOC(sizeof(LZ4_streamHC_t));
|
LZ4_streamHC_t* const LZ4_streamHCPtr = (LZ4_streamHC_t*)ALLOC(sizeof(LZ4_streamHC_t));
|
||||||
if (LZ4_streamHCPtr==NULL) return NULL;
|
if (LZ4_streamHCPtr==NULL) return NULL;
|
||||||
LZ4_resetStreamHC(LZ4_streamHCPtr, LZ4HC_CLEVEL_DEFAULT);
|
LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr)); /* full initialization, malloc'ed buffer can be full of garbage */
|
||||||
return LZ4_streamHCPtr;
|
return LZ4_streamHCPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
int LZ4_freeStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr) {
|
int LZ4_freeStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr)
|
||||||
|
{
|
||||||
DEBUGLOG(4, "LZ4_freeStreamHC(%p)", LZ4_streamHCPtr);
|
DEBUGLOG(4, "LZ4_freeStreamHC(%p)", LZ4_streamHCPtr);
|
||||||
if (!LZ4_streamHCPtr) return 0; /* support free on NULL */
|
if (!LZ4_streamHCPtr) return 0; /* support free on NULL */
|
||||||
free(LZ4_streamHCPtr);
|
FREEMEM(LZ4_streamHCPtr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* initialization */
|
LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size)
|
||||||
void LZ4_resetStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel)
|
|
||||||
{
|
{
|
||||||
LZ4_STATIC_ASSERT(sizeof(LZ4HC_CCtx_internal) <= sizeof(size_t) * LZ4_STREAMHCSIZE_SIZET); /* if compilation fails here, LZ4_STREAMHCSIZE must be increased */
|
LZ4_streamHC_t* const LZ4_streamHCPtr = (LZ4_streamHC_t*)buffer;
|
||||||
DEBUGLOG(4, "LZ4_resetStreamHC(%p, %d)", LZ4_streamHCPtr, compressionLevel);
|
if (buffer == NULL) return NULL;
|
||||||
|
if (size < sizeof(LZ4_streamHC_t)) return NULL;
|
||||||
|
#ifndef _MSC_VER /* for some reason, Visual fails the aligment test on 32-bit x86 :
|
||||||
|
* it reports an aligment of 8-bytes,
|
||||||
|
* while actually aligning LZ4_streamHC_t on 4 bytes. */
|
||||||
|
if (((size_t)buffer) & (LZ4_streamHC_t_alignment() - 1)) return NULL; /* alignment check */
|
||||||
|
#endif
|
||||||
|
/* if compilation fails here, LZ4_STREAMHCSIZE must be increased */
|
||||||
|
LZ4_STATIC_ASSERT(sizeof(LZ4HC_CCtx_internal) <= LZ4_STREAMHCSIZE);
|
||||||
|
DEBUGLOG(4, "LZ4_initStreamHC(%p, %u)", LZ4_streamHCPtr, (unsigned)size);
|
||||||
|
/* end-base will trigger a clearTable on starting compression */
|
||||||
LZ4_streamHCPtr->internal_donotuse.end = (const BYTE *)(ptrdiff_t)-1;
|
LZ4_streamHCPtr->internal_donotuse.end = (const BYTE *)(ptrdiff_t)-1;
|
||||||
LZ4_streamHCPtr->internal_donotuse.base = NULL;
|
LZ4_streamHCPtr->internal_donotuse.base = NULL;
|
||||||
LZ4_streamHCPtr->internal_donotuse.dictCtx = NULL;
|
LZ4_streamHCPtr->internal_donotuse.dictCtx = NULL;
|
||||||
LZ4_streamHCPtr->internal_donotuse.favorDecSpeed = 0;
|
LZ4_streamHCPtr->internal_donotuse.favorDecSpeed = 0;
|
||||||
|
LZ4_streamHCPtr->internal_donotuse.dirty = 0;
|
||||||
|
LZ4_setCompressionLevel(LZ4_streamHCPtr, LZ4HC_CLEVEL_DEFAULT);
|
||||||
|
return LZ4_streamHCPtr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* just a stub */
|
||||||
|
void LZ4_resetStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel)
|
||||||
|
{
|
||||||
|
LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr));
|
||||||
LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel);
|
LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LZ4_resetStreamHC_fast (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel)
|
void LZ4_resetStreamHC_fast (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel)
|
||||||
{
|
{
|
||||||
DEBUGLOG(4, "LZ4_resetStreamHC_fast(%p, %d)", LZ4_streamHCPtr, compressionLevel);
|
DEBUGLOG(4, "LZ4_resetStreamHC_fast(%p, %d)", LZ4_streamHCPtr, compressionLevel);
|
||||||
LZ4_streamHCPtr->internal_donotuse.end -= (uptrval)LZ4_streamHCPtr->internal_donotuse.base;
|
if (LZ4_streamHCPtr->internal_donotuse.dirty) {
|
||||||
LZ4_streamHCPtr->internal_donotuse.base = NULL;
|
LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr));
|
||||||
LZ4_streamHCPtr->internal_donotuse.dictCtx = NULL;
|
} else {
|
||||||
|
/* preserve end - base : can trigger clearTable's threshold */
|
||||||
|
LZ4_streamHCPtr->internal_donotuse.end -= (uptrval)LZ4_streamHCPtr->internal_donotuse.base;
|
||||||
|
LZ4_streamHCPtr->internal_donotuse.base = NULL;
|
||||||
|
LZ4_streamHCPtr->internal_donotuse.dictCtx = NULL;
|
||||||
|
}
|
||||||
LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel);
|
LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LZ4_setCompressionLevel(LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel)
|
void LZ4_setCompressionLevel(LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel)
|
||||||
{
|
{
|
||||||
|
DEBUGLOG(5, "LZ4_setCompressionLevel(%p, %d)", LZ4_streamHCPtr, compressionLevel);
|
||||||
if (compressionLevel < 1) compressionLevel = LZ4HC_CLEVEL_DEFAULT;
|
if (compressionLevel < 1) compressionLevel = LZ4HC_CLEVEL_DEFAULT;
|
||||||
if (compressionLevel > LZ4HC_CLEVEL_MAX) compressionLevel = LZ4HC_CLEVEL_MAX;
|
if (compressionLevel > LZ4HC_CLEVEL_MAX) compressionLevel = LZ4HC_CLEVEL_MAX;
|
||||||
LZ4_streamHCPtr->internal_donotuse.compressionLevel = (short)compressionLevel;
|
LZ4_streamHCPtr->internal_donotuse.compressionLevel = (short)compressionLevel;
|
||||||
@ -919,16 +970,24 @@ void LZ4_favorDecompressionSpeed(LZ4_streamHC_t* LZ4_streamHCPtr, int favor)
|
|||||||
LZ4_streamHCPtr->internal_donotuse.favorDecSpeed = (favor!=0);
|
LZ4_streamHCPtr->internal_donotuse.favorDecSpeed = (favor!=0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, const char* dictionary, int dictSize)
|
/* LZ4_loadDictHC() :
|
||||||
|
* LZ4_streamHCPtr is presumed properly initialized */
|
||||||
|
int LZ4_loadDictHC (LZ4_streamHC_t* LZ4_streamHCPtr,
|
||||||
|
const char* dictionary, int dictSize)
|
||||||
{
|
{
|
||||||
LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse;
|
LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse;
|
||||||
DEBUGLOG(4, "LZ4_loadDictHC(%p, %p, %d)", LZ4_streamHCPtr, dictionary, dictSize);
|
DEBUGLOG(4, "LZ4_loadDictHC(%p, %p, %d)", LZ4_streamHCPtr, dictionary, dictSize);
|
||||||
|
assert(LZ4_streamHCPtr != NULL);
|
||||||
if (dictSize > 64 KB) {
|
if (dictSize > 64 KB) {
|
||||||
dictionary += dictSize - 64 KB;
|
dictionary += (size_t)dictSize - 64 KB;
|
||||||
dictSize = 64 KB;
|
dictSize = 64 KB;
|
||||||
}
|
}
|
||||||
LZ4_resetStreamHC(LZ4_streamHCPtr, ctxPtr->compressionLevel);
|
/* need a full initialization, there are bad side-effects when using resetFast() */
|
||||||
LZ4HC_init (ctxPtr, (const BYTE*)dictionary);
|
{ int const cLevel = ctxPtr->compressionLevel;
|
||||||
|
LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr));
|
||||||
|
LZ4_setCompressionLevel(LZ4_streamHCPtr, cLevel);
|
||||||
|
}
|
||||||
|
LZ4HC_init_internal (ctxPtr, (const BYTE*)dictionary);
|
||||||
ctxPtr->end = (const BYTE*)dictionary + dictSize;
|
ctxPtr->end = (const BYTE*)dictionary + dictSize;
|
||||||
if (dictSize >= 4) LZ4HC_Insert (ctxPtr, ctxPtr->end-3);
|
if (dictSize >= 4) LZ4HC_Insert (ctxPtr, ctxPtr->end-3);
|
||||||
return dictSize;
|
return dictSize;
|
||||||
@ -961,9 +1020,11 @@ static int LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr,
|
|||||||
limitedOutput_directive limit)
|
limitedOutput_directive limit)
|
||||||
{
|
{
|
||||||
LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse;
|
LZ4HC_CCtx_internal* const ctxPtr = &LZ4_streamHCPtr->internal_donotuse;
|
||||||
DEBUGLOG(4, "LZ4_compressHC_continue_generic(%p, %p, %d)", LZ4_streamHCPtr, src, *srcSizePtr);
|
DEBUGLOG(4, "LZ4_compressHC_continue_generic(ctx=%p, src=%p, srcSize=%d)",
|
||||||
|
LZ4_streamHCPtr, src, *srcSizePtr);
|
||||||
|
assert(ctxPtr != NULL);
|
||||||
/* auto-init if forgotten */
|
/* auto-init if forgotten */
|
||||||
if (ctxPtr->base == NULL) LZ4HC_init (ctxPtr, (const BYTE*) src);
|
if (ctxPtr->base == NULL) LZ4HC_init_internal (ctxPtr, (const BYTE*) src);
|
||||||
|
|
||||||
/* Check overflow */
|
/* Check overflow */
|
||||||
if ((size_t)(ctxPtr->end - ctxPtr->base) > 2 GB) {
|
if ((size_t)(ctxPtr->end - ctxPtr->base) > 2 GB) {
|
||||||
@ -973,7 +1034,8 @@ static int LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Check if blocks follow each other */
|
/* Check if blocks follow each other */
|
||||||
if ((const BYTE*)src != ctxPtr->end) LZ4HC_setExternalDict(ctxPtr, (const BYTE*)src);
|
if ((const BYTE*)src != ctxPtr->end)
|
||||||
|
LZ4HC_setExternalDict(ctxPtr, (const BYTE*)src);
|
||||||
|
|
||||||
/* Check overlapping input/dictionary space */
|
/* Check overlapping input/dictionary space */
|
||||||
{ const BYTE* sourceEnd = (const BYTE*) src + *srcSizePtr;
|
{ const BYTE* sourceEnd = (const BYTE*) src + *srcSizePtr;
|
||||||
@ -994,12 +1056,12 @@ int LZ4_compress_HC_continue (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src,
|
|||||||
if (dstCapacity < LZ4_compressBound(srcSize))
|
if (dstCapacity < LZ4_compressBound(srcSize))
|
||||||
return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, limitedOutput);
|
return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, limitedOutput);
|
||||||
else
|
else
|
||||||
return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, noLimit);
|
return LZ4_compressHC_continue_generic (LZ4_streamHCPtr, src, dst, &srcSize, dstCapacity, notLimited);
|
||||||
}
|
}
|
||||||
|
|
||||||
int LZ4_compress_HC_continue_destSize (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int* srcSizePtr, int targetDestSize)
|
int LZ4_compress_HC_continue_destSize (LZ4_streamHC_t* LZ4_streamHCPtr, const char* src, char* dst, int* srcSizePtr, int targetDestSize)
|
||||||
{
|
{
|
||||||
return LZ4_compressHC_continue_generic(LZ4_streamHCPtr, src, dst, srcSizePtr, targetDestSize, limitedDestSize);
|
return LZ4_compressHC_continue_generic(LZ4_streamHCPtr, src, dst, srcSizePtr, targetDestSize, fillOutput);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1018,19 +1080,21 @@ int LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictS
|
|||||||
{ U32 const endIndex = (U32)(streamPtr->end - streamPtr->base);
|
{ U32 const endIndex = (U32)(streamPtr->end - streamPtr->base);
|
||||||
streamPtr->end = (const BYTE*)safeBuffer + dictSize;
|
streamPtr->end = (const BYTE*)safeBuffer + dictSize;
|
||||||
streamPtr->base = streamPtr->end - endIndex;
|
streamPtr->base = streamPtr->end - endIndex;
|
||||||
streamPtr->dictLimit = endIndex - dictSize;
|
streamPtr->dictLimit = endIndex - (U32)dictSize;
|
||||||
streamPtr->lowLimit = endIndex - dictSize;
|
streamPtr->lowLimit = endIndex - (U32)dictSize;
|
||||||
if (streamPtr->nextToUpdate < streamPtr->dictLimit) streamPtr->nextToUpdate = streamPtr->dictLimit;
|
if (streamPtr->nextToUpdate < streamPtr->dictLimit) streamPtr->nextToUpdate = streamPtr->dictLimit;
|
||||||
}
|
}
|
||||||
return dictSize;
|
return dictSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************
|
/***************************************************
|
||||||
* Deprecated Functions
|
* Deprecated Functions
|
||||||
***********************************/
|
***************************************************/
|
||||||
|
|
||||||
/* These functions currently generate deprecation warnings */
|
/* These functions currently generate deprecation warnings */
|
||||||
/* Deprecated compression functions */
|
|
||||||
|
/* Wrappers for deprecated compression functions */
|
||||||
int LZ4_compressHC(const char* src, char* dst, int srcSize) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), 0); }
|
int LZ4_compressHC(const char* src, char* dst, int srcSize) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), 0); }
|
||||||
int LZ4_compressHC_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, 0); }
|
int LZ4_compressHC_limitedOutput(const char* src, char* dst, int srcSize, int maxDstSize) { return LZ4_compress_HC(src, dst, srcSize, maxDstSize, 0); }
|
||||||
int LZ4_compressHC2(const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); }
|
int LZ4_compressHC2(const char* src, char* dst, int srcSize, int cLevel) { return LZ4_compress_HC (src, dst, srcSize, LZ4_compressBound(srcSize), cLevel); }
|
||||||
@ -1046,25 +1110,26 @@ int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* ctx, const char* src,
|
|||||||
/* Deprecated streaming functions */
|
/* Deprecated streaming functions */
|
||||||
int LZ4_sizeofStreamStateHC(void) { return LZ4_STREAMHCSIZE; }
|
int LZ4_sizeofStreamStateHC(void) { return LZ4_STREAMHCSIZE; }
|
||||||
|
|
||||||
|
/* state is presumed correctly sized, aka >= sizeof(LZ4_streamHC_t)
|
||||||
|
* @return : 0 on success, !=0 if error */
|
||||||
int LZ4_resetStreamStateHC(void* state, char* inputBuffer)
|
int LZ4_resetStreamStateHC(void* state, char* inputBuffer)
|
||||||
{
|
{
|
||||||
LZ4HC_CCtx_internal *ctx = &((LZ4_streamHC_t*)state)->internal_donotuse;
|
LZ4_streamHC_t* const hc4 = LZ4_initStreamHC(state, sizeof(*hc4));
|
||||||
if ((((size_t)state) & (sizeof(void*)-1)) != 0) return 1; /* Error : pointer is not aligned for pointer (32 or 64 bits) */
|
if (hc4 == NULL) return 1; /* init failed */
|
||||||
LZ4_resetStreamHC((LZ4_streamHC_t*)state, ((LZ4_streamHC_t*)state)->internal_donotuse.compressionLevel);
|
LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer);
|
||||||
LZ4HC_init(ctx, (const BYTE*)inputBuffer);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* LZ4_createHC (const char* inputBuffer)
|
void* LZ4_createHC (const char* inputBuffer)
|
||||||
{
|
{
|
||||||
LZ4_streamHC_t* hc4 = (LZ4_streamHC_t*)ALLOC(sizeof(LZ4_streamHC_t));
|
LZ4_streamHC_t* const hc4 = LZ4_createStreamHC();
|
||||||
if (hc4 == NULL) return NULL; /* not enough memory */
|
if (hc4 == NULL) return NULL; /* not enough memory */
|
||||||
LZ4_resetStreamHC(hc4, 0 /* compressionLevel */);
|
LZ4HC_init_internal (&hc4->internal_donotuse, (const BYTE*)inputBuffer);
|
||||||
LZ4HC_init (&hc4->internal_donotuse, (const BYTE*)inputBuffer);
|
|
||||||
return hc4;
|
return hc4;
|
||||||
}
|
}
|
||||||
|
|
||||||
int LZ4_freeHC (void* LZ4HC_Data) {
|
int LZ4_freeHC (void* LZ4HC_Data)
|
||||||
|
{
|
||||||
if (!LZ4HC_Data) return 0; /* support free on NULL */
|
if (!LZ4HC_Data) return 0; /* support free on NULL */
|
||||||
FREEMEM(LZ4HC_Data);
|
FREEMEM(LZ4HC_Data);
|
||||||
return 0;
|
return 0;
|
||||||
@ -1072,7 +1137,7 @@ int LZ4_freeHC (void* LZ4HC_Data) {
|
|||||||
|
|
||||||
int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int cLevel)
|
int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int cLevel)
|
||||||
{
|
{
|
||||||
return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, 0, cLevel, noLimit);
|
return LZ4HC_compress_generic (&((LZ4_streamHC_t*)LZ4HC_Data)->internal_donotuse, src, dst, &srcSize, 0, cLevel, notLimited);
|
||||||
}
|
}
|
||||||
|
|
||||||
int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int dstCapacity, int cLevel)
|
int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int dstCapacity, int cLevel)
|
||||||
@ -1091,7 +1156,7 @@ char* LZ4_slideInputBufferHC(void* LZ4HC_Data)
|
|||||||
|
|
||||||
|
|
||||||
/* ================================================
|
/* ================================================
|
||||||
* LZ4 Optimal parser (levels 10-12)
|
* LZ4 Optimal parser (levels [LZ4HC_CLEVEL_OPT_MIN - LZ4HC_CLEVEL_MAX])
|
||||||
* ===============================================*/
|
* ===============================================*/
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int price;
|
int price;
|
||||||
@ -1104,8 +1169,9 @@ typedef struct {
|
|||||||
LZ4_FORCE_INLINE int LZ4HC_literalsPrice(int const litlen)
|
LZ4_FORCE_INLINE int LZ4HC_literalsPrice(int const litlen)
|
||||||
{
|
{
|
||||||
int price = litlen;
|
int price = litlen;
|
||||||
|
assert(litlen >= 0);
|
||||||
if (litlen >= (int)RUN_MASK)
|
if (litlen >= (int)RUN_MASK)
|
||||||
price += 1 + (litlen-RUN_MASK)/255;
|
price += 1 + ((litlen-(int)RUN_MASK) / 255);
|
||||||
return price;
|
return price;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1114,11 +1180,13 @@ LZ4_FORCE_INLINE int LZ4HC_literalsPrice(int const litlen)
|
|||||||
LZ4_FORCE_INLINE int LZ4HC_sequencePrice(int litlen, int mlen)
|
LZ4_FORCE_INLINE int LZ4HC_sequencePrice(int litlen, int mlen)
|
||||||
{
|
{
|
||||||
int price = 1 + 2 ; /* token + 16-bit offset */
|
int price = 1 + 2 ; /* token + 16-bit offset */
|
||||||
|
assert(litlen >= 0);
|
||||||
|
assert(mlen >= MINMATCH);
|
||||||
|
|
||||||
price += LZ4HC_literalsPrice(litlen);
|
price += LZ4HC_literalsPrice(litlen);
|
||||||
|
|
||||||
if (mlen >= (int)(ML_MASK+MINMATCH))
|
if (mlen >= (int)(ML_MASK+MINMATCH))
|
||||||
price += 1 + (mlen-(ML_MASK+MINMATCH))/255;
|
price += 1 + ((mlen-(int)(ML_MASK+MINMATCH)) / 255);
|
||||||
|
|
||||||
return price;
|
return price;
|
||||||
}
|
}
|
||||||
@ -1177,9 +1245,9 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
|
|||||||
BYTE* oend = op + dstCapacity;
|
BYTE* oend = op + dstCapacity;
|
||||||
|
|
||||||
/* init */
|
/* init */
|
||||||
DEBUGLOG(5, "LZ4HC_compress_optimal");
|
DEBUGLOG(5, "LZ4HC_compress_optimal(dst=%p, dstCapa=%u)", dst, (unsigned)dstCapacity);
|
||||||
*srcSizePtr = 0;
|
*srcSizePtr = 0;
|
||||||
if (limit == limitedDestSize) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */
|
if (limit == fillOutput) oend -= LASTLITERALS; /* Hack for support LZ4 format restriction */
|
||||||
if (sufficient_len >= LZ4_OPT_NUM) sufficient_len = LZ4_OPT_NUM-1;
|
if (sufficient_len >= LZ4_OPT_NUM) sufficient_len = LZ4_OPT_NUM-1;
|
||||||
|
|
||||||
/* Main Loop */
|
/* Main Loop */
|
||||||
@ -1197,7 +1265,7 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
|
|||||||
int const firstML = firstMatch.len;
|
int const firstML = firstMatch.len;
|
||||||
const BYTE* const matchPos = ip - firstMatch.off;
|
const BYTE* const matchPos = ip - firstMatch.off;
|
||||||
opSaved = op;
|
opSaved = op;
|
||||||
if ( LZ4HC_encodeSequence(&ip, &op, &anchor, firstML, matchPos, limit, oend) ) /* updates ip, op and anchor */
|
if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), firstML, matchPos, limit, oend) ) /* updates ip, op and anchor */
|
||||||
goto _dest_overflow;
|
goto _dest_overflow;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1335,6 +1403,7 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
|
|||||||
} }
|
} }
|
||||||
} /* for (cur = 1; cur <= last_match_pos; cur++) */
|
} /* for (cur = 1; cur <= last_match_pos; cur++) */
|
||||||
|
|
||||||
|
assert(last_match_pos < LZ4_OPT_NUM + TRAILING_LITERALS);
|
||||||
best_mlen = opt[last_match_pos].mlen;
|
best_mlen = opt[last_match_pos].mlen;
|
||||||
best_off = opt[last_match_pos].off;
|
best_off = opt[last_match_pos].off;
|
||||||
cur = last_match_pos - best_mlen;
|
cur = last_match_pos - best_mlen;
|
||||||
@ -1367,9 +1436,9 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
|
|||||||
if (ml == 1) { ip++; rPos++; continue; } /* literal; note: can end up with several literals, in which case, skip them */
|
if (ml == 1) { ip++; rPos++; continue; } /* literal; note: can end up with several literals, in which case, skip them */
|
||||||
rPos += ml;
|
rPos += ml;
|
||||||
assert(ml >= MINMATCH);
|
assert(ml >= MINMATCH);
|
||||||
assert((offset >= 1) && (offset <= MAX_DISTANCE));
|
assert((offset >= 1) && (offset <= LZ4_DISTANCE_MAX));
|
||||||
opSaved = op;
|
opSaved = op;
|
||||||
if ( LZ4HC_encodeSequence(&ip, &op, &anchor, ml, ip - offset, limit, oend) ) /* updates ip, op and anchor */
|
if ( LZ4HC_encodeSequence(UPDATABLE(ip, op, anchor), ml, ip - offset, limit, oend) ) /* updates ip, op and anchor */
|
||||||
goto _dest_overflow;
|
goto _dest_overflow;
|
||||||
} }
|
} }
|
||||||
} /* while (ip <= mflimit) */
|
} /* while (ip <= mflimit) */
|
||||||
@ -1379,7 +1448,7 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
|
|||||||
{ size_t lastRunSize = (size_t)(iend - anchor); /* literals */
|
{ size_t lastRunSize = (size_t)(iend - anchor); /* literals */
|
||||||
size_t litLength = (lastRunSize + 255 - RUN_MASK) / 255;
|
size_t litLength = (lastRunSize + 255 - RUN_MASK) / 255;
|
||||||
size_t const totalSize = 1 + litLength + lastRunSize;
|
size_t const totalSize = 1 + litLength + lastRunSize;
|
||||||
if (limit == limitedDestSize) oend += LASTLITERALS; /* restore correct value */
|
if (limit == fillOutput) oend += LASTLITERALS; /* restore correct value */
|
||||||
if (limit && (op + totalSize > oend)) {
|
if (limit && (op + totalSize > oend)) {
|
||||||
if (limit == limitedOutput) return 0; /* Check output limit */
|
if (limit == limitedOutput) return 0; /* Check output limit */
|
||||||
/* adapt lastRunSize to fill 'dst' */
|
/* adapt lastRunSize to fill 'dst' */
|
||||||
@ -1406,7 +1475,7 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
|
|||||||
return (int) ((char*)op-dst);
|
return (int) ((char*)op-dst);
|
||||||
|
|
||||||
_dest_overflow:
|
_dest_overflow:
|
||||||
if (limit == limitedDestSize) {
|
if (limit == fillOutput) {
|
||||||
op = opSaved; /* restore correct out pointer */
|
op = opSaved; /* restore correct out pointer */
|
||||||
goto _last_literals;
|
goto _last_literals;
|
||||||
}
|
}
|
||||||
|
@ -31,8 +31,8 @@
|
|||||||
- LZ4 source repository : https://github.com/lz4/lz4
|
- LZ4 source repository : https://github.com/lz4/lz4
|
||||||
- LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
|
- LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c
|
||||||
*/
|
*/
|
||||||
#ifndef LZ4_HC_H_19834876238432
|
#ifndef TRACY_LZ4_HC_H_19834876238432
|
||||||
#define LZ4_HC_H_19834876238432
|
#define TRACY_LZ4_HC_H_19834876238432
|
||||||
|
|
||||||
/* --- Dependency --- */
|
/* --- Dependency --- */
|
||||||
/* note : lz4hc requires lz4.h/lz4.c for compilation */
|
/* note : lz4hc requires lz4.h/lz4.c for compilation */
|
||||||
@ -52,7 +52,7 @@ namespace tracy
|
|||||||
* Block Compression
|
* Block Compression
|
||||||
**************************************/
|
**************************************/
|
||||||
/*! LZ4_compress_HC() :
|
/*! LZ4_compress_HC() :
|
||||||
* Compress data from `src` into `dst`, using the more powerful but slower "HC" algorithm.
|
* Compress data from `src` into `dst`, using the powerful but slower "HC" algorithm.
|
||||||
* `dst` must be already allocated.
|
* `dst` must be already allocated.
|
||||||
* Compression is guaranteed to succeed if `dstCapacity >= LZ4_compressBound(srcSize)` (see "lz4.h")
|
* Compression is guaranteed to succeed if `dstCapacity >= LZ4_compressBound(srcSize)` (see "lz4.h")
|
||||||
* Max supported `srcSize` value is LZ4_MAX_INPUT_SIZE (see "lz4.h")
|
* Max supported `srcSize` value is LZ4_MAX_INPUT_SIZE (see "lz4.h")
|
||||||
@ -75,7 +75,21 @@ LZ4LIB_API int LZ4_compress_HC (const char* src, char* dst, int srcSize, int dst
|
|||||||
* Memory segment must be aligned on 8-bytes boundaries (which a normal malloc() should do properly).
|
* Memory segment must be aligned on 8-bytes boundaries (which a normal malloc() should do properly).
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API int LZ4_sizeofStateHC(void);
|
LZ4LIB_API int LZ4_sizeofStateHC(void);
|
||||||
LZ4LIB_API int LZ4_compress_HC_extStateHC(void* state, const char* src, char* dst, int srcSize, int maxDstSize, int compressionLevel);
|
LZ4LIB_API int LZ4_compress_HC_extStateHC(void* stateHC, const char* src, char* dst, int srcSize, int maxDstSize, int compressionLevel);
|
||||||
|
|
||||||
|
|
||||||
|
/*! LZ4_compress_HC_destSize() : v1.9.0+
|
||||||
|
* Will compress as much data as possible from `src`
|
||||||
|
* to fit into `targetDstSize` budget.
|
||||||
|
* Result is provided in 2 parts :
|
||||||
|
* @return : the number of bytes written into 'dst' (necessarily <= targetDstSize)
|
||||||
|
* or 0 if compression fails.
|
||||||
|
* `srcSizePtr` : on success, *srcSizePtr is updated to indicate how much bytes were read from `src`
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_compress_HC_destSize(void* stateHC,
|
||||||
|
const char* src, char* dst,
|
||||||
|
int* srcSizePtr, int targetDstSize,
|
||||||
|
int compressionLevel);
|
||||||
|
|
||||||
|
|
||||||
/*-************************************
|
/*-************************************
|
||||||
@ -87,46 +101,92 @@ LZ4LIB_API int LZ4_compress_HC_extStateHC(void* state, const char* src, char* ds
|
|||||||
/*! LZ4_createStreamHC() and LZ4_freeStreamHC() :
|
/*! LZ4_createStreamHC() and LZ4_freeStreamHC() :
|
||||||
* These functions create and release memory for LZ4 HC streaming state.
|
* These functions create and release memory for LZ4 HC streaming state.
|
||||||
* Newly created states are automatically initialized.
|
* Newly created states are automatically initialized.
|
||||||
* Existing states can be re-used several times, using LZ4_resetStreamHC().
|
* A same state can be used multiple times consecutively,
|
||||||
* These methods are API and ABI stable, they can be used in combination with a DLL.
|
* starting with LZ4_resetStreamHC_fast() to start a new stream of blocks.
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API LZ4_streamHC_t* LZ4_createStreamHC(void);
|
LZ4LIB_API LZ4_streamHC_t* LZ4_createStreamHC(void);
|
||||||
LZ4LIB_API int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr);
|
LZ4LIB_API int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr);
|
||||||
|
|
||||||
LZ4LIB_API void LZ4_resetStreamHC (LZ4_streamHC_t* streamHCPtr, int compressionLevel);
|
/*
|
||||||
|
These functions compress data in successive blocks of any size,
|
||||||
|
using previous blocks as dictionary, to improve compression ratio.
|
||||||
|
One key assumption is that previous blocks (up to 64 KB) remain read-accessible while compressing next blocks.
|
||||||
|
There is an exception for ring buffers, which can be smaller than 64 KB.
|
||||||
|
Ring-buffer scenario is automatically detected and handled within LZ4_compress_HC_continue().
|
||||||
|
|
||||||
|
Before starting compression, state must be allocated and properly initialized.
|
||||||
|
LZ4_createStreamHC() does both, though compression level is set to LZ4HC_CLEVEL_DEFAULT.
|
||||||
|
|
||||||
|
Selecting the compression level can be done with LZ4_resetStreamHC_fast() (starts a new stream)
|
||||||
|
or LZ4_setCompressionLevel() (anytime, between blocks in the same stream) (experimental).
|
||||||
|
LZ4_resetStreamHC_fast() only works on states which have been properly initialized at least once,
|
||||||
|
which is automatically the case when state is created using LZ4_createStreamHC().
|
||||||
|
|
||||||
|
After reset, a first "fictional block" can be designated as initial dictionary,
|
||||||
|
using LZ4_loadDictHC() (Optional).
|
||||||
|
|
||||||
|
Invoke LZ4_compress_HC_continue() to compress each successive block.
|
||||||
|
The number of blocks is unlimited.
|
||||||
|
Previous input blocks, including initial dictionary when present,
|
||||||
|
must remain accessible and unmodified during compression.
|
||||||
|
|
||||||
|
It's allowed to update compression level anytime between blocks,
|
||||||
|
using LZ4_setCompressionLevel() (experimental).
|
||||||
|
|
||||||
|
'dst' buffer should be sized to handle worst case scenarios
|
||||||
|
(see LZ4_compressBound(), it ensures compression success).
|
||||||
|
In case of failure, the API does not guarantee recovery,
|
||||||
|
so the state _must_ be reset.
|
||||||
|
To ensure compression success
|
||||||
|
whenever `dst` buffer size cannot be made >= LZ4_compressBound(),
|
||||||
|
consider using LZ4_compress_HC_continue_destSize().
|
||||||
|
|
||||||
|
Whenever previous input blocks can't be preserved unmodified in-place during compression of next blocks,
|
||||||
|
it's possible to copy the last blocks into a more stable memory space, using LZ4_saveDictHC().
|
||||||
|
Return value of LZ4_saveDictHC() is the size of dictionary effectively saved into 'safeBuffer' (<= 64 KB)
|
||||||
|
|
||||||
|
After completing a streaming compression,
|
||||||
|
it's possible to start a new stream of blocks, using the same LZ4_streamHC_t state,
|
||||||
|
just by resetting it, using LZ4_resetStreamHC_fast().
|
||||||
|
*/
|
||||||
|
|
||||||
|
LZ4LIB_API void LZ4_resetStreamHC_fast(LZ4_streamHC_t* streamHCPtr, int compressionLevel); /* v1.9.0+ */
|
||||||
LZ4LIB_API int LZ4_loadDictHC (LZ4_streamHC_t* streamHCPtr, const char* dictionary, int dictSize);
|
LZ4LIB_API int LZ4_loadDictHC (LZ4_streamHC_t* streamHCPtr, const char* dictionary, int dictSize);
|
||||||
|
|
||||||
LZ4LIB_API int LZ4_compress_HC_continue (LZ4_streamHC_t* streamHCPtr, const char* src, char* dst, int srcSize, int maxDstSize);
|
LZ4LIB_API int LZ4_compress_HC_continue (LZ4_streamHC_t* streamHCPtr,
|
||||||
|
const char* src, char* dst,
|
||||||
|
int srcSize, int maxDstSize);
|
||||||
|
|
||||||
|
/*! LZ4_compress_HC_continue_destSize() : v1.9.0+
|
||||||
|
* Similar to LZ4_compress_HC_continue(),
|
||||||
|
* but will read as much data as possible from `src`
|
||||||
|
* to fit into `targetDstSize` budget.
|
||||||
|
* Result is provided into 2 parts :
|
||||||
|
* @return : the number of bytes written into 'dst' (necessarily <= targetDstSize)
|
||||||
|
* or 0 if compression fails.
|
||||||
|
* `srcSizePtr` : on success, *srcSizePtr will be updated to indicate how much bytes were read from `src`.
|
||||||
|
* Note that this function may not consume the entire input.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API int LZ4_compress_HC_continue_destSize(LZ4_streamHC_t* LZ4_streamHCPtr,
|
||||||
|
const char* src, char* dst,
|
||||||
|
int* srcSizePtr, int targetDstSize);
|
||||||
|
|
||||||
LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, int maxDictSize);
|
LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, int maxDictSize);
|
||||||
|
|
||||||
/*
|
|
||||||
These functions compress data in successive blocks of any size, using previous blocks as dictionary.
|
|
||||||
One key assumption is that previous blocks (up to 64 KB) remain read-accessible while compressing next blocks.
|
|
||||||
There is an exception for ring buffers, which can be smaller than 64 KB.
|
|
||||||
Ring buffers scenario is automatically detected and handled by LZ4_compress_HC_continue().
|
|
||||||
|
|
||||||
Before starting compression, state must be properly initialized, using LZ4_resetStreamHC().
|
|
||||||
A first "fictional block" can then be designated as initial dictionary, using LZ4_loadDictHC() (Optional).
|
|
||||||
|
|
||||||
Then, use LZ4_compress_HC_continue() to compress each successive block.
|
|
||||||
Previous memory blocks (including initial dictionary when present) must remain accessible and unmodified during compression.
|
|
||||||
'dst' buffer should be sized to handle worst case scenarios (see LZ4_compressBound()), to ensure operation success.
|
|
||||||
Because in case of failure, the API does not guarantee context recovery, and context will have to be reset.
|
|
||||||
If `dst` buffer budget cannot be >= LZ4_compressBound(), consider using LZ4_compress_HC_continue_destSize() instead.
|
|
||||||
|
|
||||||
If, for any reason, previous data block can't be preserved unmodified in memory for next compression block,
|
|
||||||
you can save it to a more stable memory space, using LZ4_saveDictHC().
|
|
||||||
Return value of LZ4_saveDictHC() is the size of dictionary effectively saved into 'safeBuffer'.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/*-**************************************************************
|
/*^**********************************************
|
||||||
|
* !!!!!! STATIC LINKING ONLY !!!!!!
|
||||||
|
***********************************************/
|
||||||
|
|
||||||
|
/*-******************************************************************
|
||||||
* PRIVATE DEFINITIONS :
|
* PRIVATE DEFINITIONS :
|
||||||
* Do not use these definitions.
|
* Do not use these definitions directly.
|
||||||
* They are exposed to allow static allocation of `LZ4_streamHC_t`.
|
* They are merely exposed to allow static allocation of `LZ4_streamHC_t`.
|
||||||
* Using these definitions makes the code vulnerable to potential API break when upgrading LZ4
|
* Declare an `LZ4_streamHC_t` directly, rather than any type below.
|
||||||
****************************************************************/
|
* Even then, only do so in the context of static linking, as definitions may change between versions.
|
||||||
|
********************************************************************/
|
||||||
|
|
||||||
#define LZ4HC_DICTIONARY_LOGSIZE 16
|
#define LZ4HC_DICTIONARY_LOGSIZE 16
|
||||||
#define LZ4HC_MAXD (1<<LZ4HC_DICTIONARY_LOGSIZE)
|
#define LZ4HC_MAXD (1<<LZ4HC_DICTIONARY_LOGSIZE)
|
||||||
#define LZ4HC_MAXD_MASK (LZ4HC_MAXD - 1)
|
#define LZ4HC_MAXD_MASK (LZ4HC_MAXD - 1)
|
||||||
@ -151,7 +211,9 @@ struct LZ4HC_CCtx_internal
|
|||||||
uint32_t lowLimit; /* below that point, no more dict */
|
uint32_t lowLimit; /* below that point, no more dict */
|
||||||
uint32_t nextToUpdate; /* index from which to continue dictionary update */
|
uint32_t nextToUpdate; /* index from which to continue dictionary update */
|
||||||
short compressionLevel;
|
short compressionLevel;
|
||||||
short favorDecSpeed;
|
int8_t favorDecSpeed; /* favor decompression speed if this flag set,
|
||||||
|
otherwise, favor compression ratio */
|
||||||
|
int8_t dirty; /* stream has to be fully reset if this flag is set */
|
||||||
const LZ4HC_CCtx_internal* dictCtx;
|
const LZ4HC_CCtx_internal* dictCtx;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -169,26 +231,43 @@ struct LZ4HC_CCtx_internal
|
|||||||
unsigned int lowLimit; /* below that point, no more dict */
|
unsigned int lowLimit; /* below that point, no more dict */
|
||||||
unsigned int nextToUpdate; /* index from which to continue dictionary update */
|
unsigned int nextToUpdate; /* index from which to continue dictionary update */
|
||||||
short compressionLevel;
|
short compressionLevel;
|
||||||
short favorDecSpeed;
|
char favorDecSpeed; /* favor decompression speed if this flag set,
|
||||||
|
otherwise, favor compression ratio */
|
||||||
|
char dirty; /* stream has to be fully reset if this flag is set */
|
||||||
const LZ4HC_CCtx_internal* dictCtx;
|
const LZ4HC_CCtx_internal* dictCtx;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LZ4_STREAMHCSIZE (4*LZ4HC_HASHTABLESIZE + 2*LZ4HC_MAXD + 56) /* 262200 */
|
|
||||||
|
/* Do not use these definitions directly !
|
||||||
|
* Declare or allocate an LZ4_streamHC_t instead.
|
||||||
|
*/
|
||||||
|
#define LZ4_STREAMHCSIZE (4*LZ4HC_HASHTABLESIZE + 2*LZ4HC_MAXD + 56 + ((sizeof(void*)==16) ? 56 : 0) /* AS400*/ ) /* 262200 or 262256*/
|
||||||
#define LZ4_STREAMHCSIZE_SIZET (LZ4_STREAMHCSIZE / sizeof(size_t))
|
#define LZ4_STREAMHCSIZE_SIZET (LZ4_STREAMHCSIZE / sizeof(size_t))
|
||||||
union LZ4_streamHC_u {
|
union LZ4_streamHC_u {
|
||||||
size_t table[LZ4_STREAMHCSIZE_SIZET];
|
size_t table[LZ4_STREAMHCSIZE_SIZET];
|
||||||
LZ4HC_CCtx_internal internal_donotuse;
|
LZ4HC_CCtx_internal internal_donotuse;
|
||||||
}; /* previously typedef'd to LZ4_streamHC_t */
|
}; /* previously typedef'd to LZ4_streamHC_t */
|
||||||
/*
|
|
||||||
LZ4_streamHC_t :
|
|
||||||
This structure allows static allocation of LZ4 HC streaming state.
|
|
||||||
State must be initialized using LZ4_resetStreamHC() before first use.
|
|
||||||
|
|
||||||
Static allocation shall only be used in combination with static linking.
|
/* LZ4_streamHC_t :
|
||||||
When invoking LZ4 from a DLL, use create/free functions instead, which are API and ABI stable.
|
* This structure allows static allocation of LZ4 HC streaming state.
|
||||||
*/
|
* This can be used to allocate statically, on state, or as part of a larger structure.
|
||||||
|
*
|
||||||
|
* Such state **must** be initialized using LZ4_initStreamHC() before first use.
|
||||||
|
*
|
||||||
|
* Note that invoking LZ4_initStreamHC() is not required when
|
||||||
|
* the state was created using LZ4_createStreamHC() (which is recommended).
|
||||||
|
* Using the normal builder, a newly created state is automatically initialized.
|
||||||
|
*
|
||||||
|
* Static allocation shall only be used in combination with static linking.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* LZ4_initStreamHC() : v1.9.0+
|
||||||
|
* Required before first use of a statically allocated LZ4_streamHC_t.
|
||||||
|
* Before v1.9.0 : use LZ4_resetStreamHC() instead
|
||||||
|
*/
|
||||||
|
LZ4LIB_API LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size);
|
||||||
|
|
||||||
|
|
||||||
/*-************************************
|
/*-************************************
|
||||||
@ -199,11 +278,11 @@ union LZ4_streamHC_u {
|
|||||||
/* deprecated compression functions */
|
/* deprecated compression functions */
|
||||||
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC (const char* source, char* dest, int inputSize);
|
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC (const char* source, char* dest, int inputSize);
|
||||||
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize);
|
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize);
|
||||||
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2 (const char* source, char* dest, int inputSize, int compressionLevel);
|
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2 (const char* source, char* dest, int inputSize, int compressionLevel);
|
||||||
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput (const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
|
LZ4_DEPRECATED("use LZ4_compress_HC() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput(const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
|
||||||
LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_withStateHC (void* state, const char* source, char* dest, int inputSize);
|
LZ4_DEPRECATED("use LZ4_compress_HC_extStateHC() instead") LZ4LIB_API int LZ4_compressHC_withStateHC (void* state, const char* source, char* dest, int inputSize);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
@ -219,10 +298,22 @@ LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_comp
|
|||||||
LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API void* LZ4_createHC (const char* inputBuffer);
|
LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API void* LZ4_createHC (const char* inputBuffer);
|
||||||
LZ4_DEPRECATED("use LZ4_saveDictHC() instead") LZ4LIB_API char* LZ4_slideInputBufferHC (void* LZ4HC_Data);
|
LZ4_DEPRECATED("use LZ4_saveDictHC() instead") LZ4LIB_API char* LZ4_slideInputBufferHC (void* LZ4HC_Data);
|
||||||
LZ4_DEPRECATED("use LZ4_freeStreamHC() instead") LZ4LIB_API int LZ4_freeHC (void* LZ4HC_Data);
|
LZ4_DEPRECATED("use LZ4_freeStreamHC() instead") LZ4LIB_API int LZ4_freeHC (void* LZ4HC_Data);
|
||||||
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);
|
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);
|
||||||
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);
|
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);
|
||||||
LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API int LZ4_sizeofStreamStateHC(void);
|
LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API int LZ4_sizeofStreamStateHC(void);
|
||||||
LZ4_DEPRECATED("use LZ4_resetStreamHC() instead") LZ4LIB_API int LZ4_resetStreamStateHC(void* state, char* inputBuffer);
|
LZ4_DEPRECATED("use LZ4_initStreamHC() instead") LZ4LIB_API int LZ4_resetStreamStateHC(void* state, char* inputBuffer);
|
||||||
|
|
||||||
|
|
||||||
|
/* LZ4_resetStreamHC() is now replaced by LZ4_initStreamHC().
|
||||||
|
* The intention is to emphasize the difference with LZ4_resetStreamHC_fast(),
|
||||||
|
* which is now the recommended function to start a new stream of blocks,
|
||||||
|
* but cannot be used to initialize a memory segment containing arbitrary garbage data.
|
||||||
|
*
|
||||||
|
* It is recommended to switch to LZ4_initStreamHC().
|
||||||
|
* LZ4_resetStreamHC() will generate deprecation warnings in a future version.
|
||||||
|
*/
|
||||||
|
LZ4LIB_API void LZ4_resetStreamHC (LZ4_streamHC_t* streamHCPtr, int compressionLevel);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,44 +335,22 @@ LZ4_DEPRECATED("use LZ4_resetStreamHC() instead") LZ4LIB_API int LZ4_resetStr
|
|||||||
namespace tracy
|
namespace tracy
|
||||||
{
|
{
|
||||||
|
|
||||||
/*! LZ4_compress_HC_destSize() : v1.8.0 (experimental)
|
/*! LZ4_setCompressionLevel() : v1.8.0+ (experimental)
|
||||||
* Will try to compress as much data from `src` as possible
|
* It's possible to change compression level
|
||||||
* that can fit into `targetDstSize` budget.
|
* between successive invocations of LZ4_compress_HC_continue*()
|
||||||
* Result is provided in 2 parts :
|
* for dynamic adaptation.
|
||||||
* @return : the number of bytes written into 'dst'
|
|
||||||
* or 0 if compression fails.
|
|
||||||
* `srcSizePtr` : value will be updated to indicate how much bytes were read from `src`
|
|
||||||
*/
|
*/
|
||||||
int LZ4_compress_HC_destSize(void* LZ4HC_Data,
|
LZ4LIB_STATIC_API void LZ4_setCompressionLevel(
|
||||||
const char* src, char* dst,
|
LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);
|
||||||
int* srcSizePtr, int targetDstSize,
|
|
||||||
int compressionLevel);
|
|
||||||
|
|
||||||
/*! LZ4_compress_HC_continue_destSize() : v1.8.0 (experimental)
|
/*! LZ4_favorDecompressionSpeed() : v1.8.2+ (experimental)
|
||||||
* Similar as LZ4_compress_HC_continue(),
|
* Opt. Parser will favor decompression speed over compression ratio.
|
||||||
* but will read a variable nb of bytes from `src`
|
* Only applicable to levels >= LZ4HC_CLEVEL_OPT_MIN.
|
||||||
* to fit into `targetDstSize` budget.
|
|
||||||
* Result is provided in 2 parts :
|
|
||||||
* @return : the number of bytes written into 'dst'
|
|
||||||
* or 0 if compression fails.
|
|
||||||
* `srcSizePtr` : value will be updated to indicate how much bytes were read from `src`.
|
|
||||||
*/
|
*/
|
||||||
int LZ4_compress_HC_continue_destSize(LZ4_streamHC_t* LZ4_streamHCPtr,
|
LZ4LIB_STATIC_API void LZ4_favorDecompressionSpeed(
|
||||||
const char* src, char* dst,
|
LZ4_streamHC_t* LZ4_streamHCPtr, int favor);
|
||||||
int* srcSizePtr, int targetDstSize);
|
|
||||||
|
|
||||||
/*! LZ4_setCompressionLevel() : v1.8.0 (experimental)
|
/*! LZ4_resetStreamHC_fast() : v1.9.0+
|
||||||
* It's possible to change compression level between 2 invocations of LZ4_compress_HC_continue*()
|
|
||||||
*/
|
|
||||||
void LZ4_setCompressionLevel(LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);
|
|
||||||
|
|
||||||
/*! LZ4_favorDecompressionSpeed() : v1.8.2 (experimental)
|
|
||||||
* Parser will select decisions favoring decompression over compression ratio.
|
|
||||||
* Only work at highest compression settings (level >= LZ4HC_CLEVEL_OPT_MIN)
|
|
||||||
*/
|
|
||||||
void LZ4_favorDecompressionSpeed(LZ4_streamHC_t* LZ4_streamHCPtr, int favor);
|
|
||||||
|
|
||||||
/*! LZ4_resetStreamHC_fast() :
|
|
||||||
* When an LZ4_streamHC_t is known to be in a internally coherent state,
|
* When an LZ4_streamHC_t is known to be in a internally coherent state,
|
||||||
* it can often be prepared for a new compression with almost no work, only
|
* it can often be prepared for a new compression with almost no work, only
|
||||||
* sometimes falling back to the full, expensive reset that is always required
|
* sometimes falling back to the full, expensive reset that is always required
|
||||||
@ -298,8 +367,14 @@ void LZ4_favorDecompressionSpeed(LZ4_streamHC_t* LZ4_streamHCPtr, int favor);
|
|||||||
* - the stream was in an indeterminate state and was used in a compression
|
* - the stream was in an indeterminate state and was used in a compression
|
||||||
* call that fully reset the state (LZ4_compress_HC_extStateHC()) and that
|
* call that fully reset the state (LZ4_compress_HC_extStateHC()) and that
|
||||||
* returned success
|
* returned success
|
||||||
|
*
|
||||||
|
* Note:
|
||||||
|
* A stream that was last used in a compression call that returned an error
|
||||||
|
* may be passed to this function. However, it will be fully reset, which will
|
||||||
|
* clear any existing history and settings from the context.
|
||||||
*/
|
*/
|
||||||
void LZ4_resetStreamHC_fast(LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);
|
LZ4LIB_STATIC_API void LZ4_resetStreamHC_fast(
|
||||||
|
LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel);
|
||||||
|
|
||||||
/*! LZ4_compress_HC_extStateHC_fastReset() :
|
/*! LZ4_compress_HC_extStateHC_fastReset() :
|
||||||
* A variant of LZ4_compress_HC_extStateHC().
|
* A variant of LZ4_compress_HC_extStateHC().
|
||||||
@ -312,7 +387,11 @@ void LZ4_resetStreamHC_fast(LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLeve
|
|||||||
* LZ4_resetStreamHC_fast() while LZ4_compress_HC_extStateHC() starts with a
|
* LZ4_resetStreamHC_fast() while LZ4_compress_HC_extStateHC() starts with a
|
||||||
* call to LZ4_resetStreamHC().
|
* call to LZ4_resetStreamHC().
|
||||||
*/
|
*/
|
||||||
int LZ4_compress_HC_extStateHC_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel);
|
LZ4LIB_STATIC_API int LZ4_compress_HC_extStateHC_fastReset (
|
||||||
|
void* state,
|
||||||
|
const char* src, char* dst,
|
||||||
|
int srcSize, int dstCapacity,
|
||||||
|
int compressionLevel);
|
||||||
|
|
||||||
/*! LZ4_attach_HC_dictionary() :
|
/*! LZ4_attach_HC_dictionary() :
|
||||||
* This is an experimental API that allows for the efficient use of a
|
* This is an experimental API that allows for the efficient use of a
|
||||||
@ -339,7 +418,9 @@ int LZ4_compress_HC_extStateHC_fastReset (void* state, const char* src, char* ds
|
|||||||
* stream (and source buffer) must remain in-place / accessible / unchanged
|
* stream (and source buffer) must remain in-place / accessible / unchanged
|
||||||
* through the lifetime of the stream session.
|
* through the lifetime of the stream session.
|
||||||
*/
|
*/
|
||||||
LZ4LIB_API void LZ4_attach_HC_dictionary(LZ4_streamHC_t *working_stream, const LZ4_streamHC_t *dictionary_stream);
|
LZ4LIB_STATIC_API void LZ4_attach_HC_dictionary(
|
||||||
|
LZ4_streamHC_t *working_stream,
|
||||||
|
const LZ4_streamHC_t *dictionary_stream);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user