From 12b971746cd18a55e637b63d02ccf23e85c86e40 Mon Sep 17 00:00:00 2001 From: gingerBill Date: Mon, 22 Jul 2024 22:42:29 +0100 Subject: [PATCH] `vendor:compress/lz4` Bindings to lz4 library --- vendor/compress/lz4/lib/liblz4_static.lib | Bin 0 -> 239998 bytes vendor/compress/lz4/lz4.odin | 541 +++++++++++++ vendor/compress/lz4/src/lz4.h | 884 ++++++++++++++++++++++ vendor/compress/lz4/src/lz4frame.h | 751 ++++++++++++++++++ vendor/compress/lz4/src/lz4hc.h | 414 ++++++++++ 5 files changed, 2590 insertions(+) create mode 100644 vendor/compress/lz4/lib/liblz4_static.lib create mode 100644 vendor/compress/lz4/lz4.odin create mode 100644 vendor/compress/lz4/src/lz4.h create mode 100644 vendor/compress/lz4/src/lz4frame.h create mode 100644 vendor/compress/lz4/src/lz4hc.h diff --git a/vendor/compress/lz4/lib/liblz4_static.lib b/vendor/compress/lz4/lib/liblz4_static.lib new file mode 100644 index 0000000000000000000000000000000000000000..dc7610303da2eedc8bb0df37b3686d479b097ed6 GIT binary patch literal 239998 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 literal 0 HcmV?d00001 diff --git a/vendor/compress/lz4/lz4.odin b/vendor/compress/lz4/lz4.odin new file mode 100644 index 000000000..62027d9d9 --- /dev/null +++ b/vendor/compress/lz4/lz4.odin @@ -0,0 +1,541 @@ +package vendor_compress_lz4 + +when ODIN_OS == .Windows { + foreign import lib "lib/libz4_static.lib" +} + +import "core:c" + +VERSION_MAJOR :: 1 /* for breaking interface changes */ +VERSION_MINOR :: 10 /* for new (non-breaking) interface capabilities */ +VERSION_RELEASE :: 0 /* for tweaks, bug-fixes, or development */ + +VERSION_NUMBER :: VERSION_MAJOR *100*100 + VERSION_MINOR *100 + VERSION_RELEASE + +MEMORY_USAGE_MIN :: 10 +MEMORY_USAGE_DEFAULT :: 14 +MEMORY_USAGE_MAX :: 20 + +MEMORY_USAGE :: MEMORY_USAGE_DEFAULT + +MAX_INPUT_SIZE :: 0x7E000000 /* 2_113_929_216 bytes */ + + +COMPRESSBOUND :: #force_inline proc "c" (isize: c.int) -> c.int { + return u32(isize) > MAX_INPUT_SIZE ? 0 : isize + (isize/255) + 16 +} + + +DECODER_RING_BUFFER_SIZE :: #force_inline proc "c" (maxBlockSize: c.int) -> c.int { + return 65536 + 14 + maxBlockSize /* for static allocation; maxBlockSize presumed valid */ +} + +@(default_calling_convention="c", link_prefix="LZ4_") +foreign lib { + versionNumber :: proc() -> c.int --- /**< library version number; useful to check dll version; requires v1.3.0+ */ + versionString :: proc() -> cstring --- /**< library version string; useful to check dll version; requires v1.7.5+ */ + + /*! LZ4_compress_default() : + * Compresses 'srcSize' bytes from buffer 'src' + * into already allocated 'dst' buffer of size 'dstCapacity'. + * Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize). + * It also runs faster, so it's a recommended setting. + * If the function cannot compress 'src' into a more limited 'dst' budget, + * compression stops *immediately*, and the function result is zero. + * In which case, 'dst' content is undefined (invalid). + * srcSize : max supported value is LZ4_MAX_INPUT_SIZE. + * dstCapacity : size of buffer 'dst' (which must be already allocated) + * @return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity) + * or 0 if compression fails + * Note : This function is protected against buffer overflow scenarios (never writes outside 'dst' buffer, nor read outside 'source' buffer). + */ + compress_default :: proc(src, dst: [^]byte, srcSize, dstCapacity: c.int) -> c.int --- + + /*! LZ4_decompress_safe() : + * @compressedSize : is the exact complete size of the compressed block. + * @dstCapacity : is the size of destination buffer (which must be already allocated), + * presumed an upper bound of decompressed size. + * @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 the source stream is detected malformed, the function will stop decoding and return a negative result. + * Note 1 : This function is protected against malicious data packets : + * it will never writes outside 'dst' buffer, nor read outside 'source' buffer, + * even if the compressed block is maliciously modified to order the decoder to do these actions. + * In such case, the decoder stops immediately, and considers the compressed block malformed. + * Note 2 : compressedSize and dstCapacity must be provided to the function, the compressed block does not contain them. + * The implementation is free to send / store / derive this information in whichever way is most beneficial. + * If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead. + */ + decompress_safe :: proc(src, dst: [^]byte, compressedSize, dstCapacity: c.int) -> c.int --- + + + /*! LZ4_compressBound() : + 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). + Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). + Note that LZ4_compress_default() compresses faster when dstCapacity is >= LZ4_compressBound(srcSize) + inputSize : max supported value is LZ4_MAX_INPUT_SIZE + return : maximum output size in a "worst case" scenario + or 0, if input size is incorrect (too large or negative) + */ + compressBound :: proc(inputSize: c.int) -> c.int --- + + /*! LZ4_compress_fast() : + 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. + It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. + An acceleration value of "1" is the same as regular LZ4_compress_default() + Values <= 0 will be replaced by LZ4_ACCELERATION_DEFAULT (currently == 1, see lz4.c). + Values > LZ4_ACCELERATION_MAX will be replaced by LZ4_ACCELERATION_MAX (currently == 65537, see lz4.c). + */ + compress_fast :: proc(src, dst: [^]byte, srcSize, dstCapacity: c.int, acceleration: c.int) -> c.int --- + + + /*! LZ4_compress_fast_extState() : + * Same as LZ4_compress_fast(), using an externally allocated memory space for its state. + * Use LZ4_sizeofState() to know how much memory must be allocated, + * and allocate it on 8-bytes boundaries (using `malloc()` typically). + * Then, provide this buffer as `void* state` to compression function. + */ + sizeofState :: proc() -> c.int --- + compress_fast_extState :: proc (state: rawptr, src, dst: [^]byte, srcSize, dstCapacity: c.int, acceleration: c.int) -> c.int --- + + + /*! LZ4_compress_destSize() : + * Reverse the logic : compresses as much data as possible from 'src' buffer + * into already allocated buffer 'dst', of size >= 'dstCapacity'. + * This function either compresses the entire 'src' content into 'dst' if it's large enough, + * or fill 'dst' buffer completely with as much data as possible from 'src'. + * note: acceleration parameter is fixed to "default". + * + * *srcSizePtr : in+out parameter. Initially contains size of input. + * Will be modified to indicate how many bytes where read from 'src' to fill 'dst'. + * New value is necessarily <= input value. + * @return : Nb bytes written into 'dst' (necessarily <= dstCapacity) + * or 0 if compression fails. + * + * Note : from v1.8.2 to v1.9.1, this function had a bug (fixed in v1.9.2+): + * the produced compressed content could, in specific circumstances, + * require to be decompressed into a destination buffer larger + * by at least 1 byte than the content to decompress. + * If an application uses `LZ4_compress_destSize()`, + * it's highly recommended to update liblz4 to v1.9.2 or better. + * If this can't be done or ensured, + * the receiving decompression function should provide + * a dstCapacity which is > decompressedSize, by at least 1 byte. + * See https://github.com/lz4/lz4/issues/859 for details + */ + compress_destSize :: proc(src, dst: [^]byte, srcSizePtr: ^c.int, targetDstSize: c.int) -> c.int --- + + + /*! LZ4_decompress_safe_partial() : + * Decompress an LZ4 compressed block, of size 'srcSize' at position 'src', + * into destination buffer 'dst' of size 'dstCapacity'. + * Up to 'targetOutputSize' bytes will be decoded. + * The function stops decoding on reaching this objective. + * This can be useful to boost performance + * whenever only the beginning of a block is required. + * + * @return : the number of bytes decoded in `dst` (necessarily <= targetOutputSize) + * If source stream is detected malformed, function returns a negative result. + * + * Note 1 : @return can be < targetOutputSize, if compressed block contains less data. + * + * Note 2 : targetOutputSize must be <= dstCapacity + * + * Note 3 : this function effectively stops decoding on reaching targetOutputSize, + * so dstCapacity is kind of redundant. + * This is because in older versions of this function, + * decoding operation would still write complete sequences. + * Therefore, there was no guarantee that it would stop writing at exactly targetOutputSize, + * it could write more bytes, though only up to dstCapacity. + * Some "margin" used to be required for this operation to work properly. + * Thankfully, this is no longer necessary. + * The function nonetheless keeps the same signature, in an effort to preserve API compatibility. + * + * Note 4 : If srcSize is the exact size of the block, + * then targetOutputSize can be any value, + * including larger than the block's decompressed size. + * The function will, at most, generate block's decompressed size. + * + * Note 5 : If srcSize is _larger_ than block's compressed size, + * then targetOutputSize **MUST** be <= block's decompressed size. + * Otherwise, *silent corruption will occur*. + */ + decompress_safe_partial :: proc (src, dst: [^]byte, srcSize, targetOutputSize, dstCapacity: c.int) -> c.int --- + + + createStream :: proc() -> ^stream_t --- + freeStream :: proc(streamPtr: ^stream_t) -> c.int --- + + /*! LZ4_resetStream_fast() : v1.9.0+ + * Use this to prepare an LZ4_stream_t for a new chain of dependent blocks + * (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. + */ + resetStream_fast :: proc(streamPtr: ^stream_t) --- + + + /*! LZ4_loadDict() : + * Use this function to reference a static dictionary into LZ4_stream_t. + * 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 itself accepts any input as dictionary, dictionary efficiency is also a topic. + * When in doubt, employ the Zstandard's Dictionary Builder. + * Loading a size of 0 is allowed, and is the same as reset. + * @return : loaded dictionary size, in bytes (note: only the last 64 KB are loaded) + */ + loadDict :: proc(streamPtr: ^stream_t, dictionary: [^]byte, dictSize: c.int) -> c.int --- + + /*! LZ4_loadDictSlow() : v1.10.0+ + * Same as LZ4_loadDict(), + * but uses a bit more cpu to reference the dictionary content more thoroughly. + * This is expected to slightly improve compression ratio. + * The extra-cpu cost is likely worth it if the dictionary is re-used across multiple sessions. + * @return : loaded dictionary size, in bytes (note: only the last 64 KB are loaded) + */ + loadDictSlow :: proc(streamPtr: ^stream_t, dictionary: [^]byte, dictSize: c.int) -> c.int --- + + /*! LZ4_attach_dictionary() : stable since v1.10.0 + * + * This allows efficient re-use of a static dictionary multiple times. + * + * 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 + * working LZ4_stream_t, this function introduces a no-copy setup mechanism, + * in which the working stream references @dictionaryStream in-place. + * + * Several assumptions are made about the state of @dictionaryStream. + * Currently, only states which have been prepared by LZ4_loadDict() or + * LZ4_loadDictSlow() should be expected to work. + * + * Alternatively, the provided @dictionaryStream may be NULL, + * in which case any existing dictionary stream is unset. + * + * If a dictionary is provided, it replaces any pre-existing stream history. + * The dictionary contents are the only history that can be referenced and + * logically immediately precede the data compressed in the first subsequent + * compression call. + * + * The dictionary will only remain attached to the working stream through the + * first compression call, at the end of which it is cleared. + * @dictionaryStream stream (and source buffer) must remain in-place / accessible / unchanged + * through the completion of the compression session. + * + * Note: there is no equivalent LZ4_attach_*() method on the decompression side + * because there is no initialization cost, hence no need to share the cost across multiple sessions. + * To decompress LZ4 blocks using dictionary, attached or not, + * just employ the regular LZ4_setStreamDecode() for streaming, + * or the stateless LZ4_decompress_safe_usingDict() for one-shot decompression. + */ + attach_dictionary :: proc(workingStream, dictionaryStream: ^stream_t) --- + + /*! LZ4_compress_fast_continue() : + * Compress 'src' content using data from previously compressed blocks, for better compression ratio. + * 'dst' buffer must be already allocated. + * If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. + * + * @return : size of compressed block + * or 0 if there is an error (typically, cannot fit into 'dst'). + * + * Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block. + * 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. + * + * 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. + * Make sure that buffers are separated, by at least one byte. + * This construction ensures that each block only depends on previous block. + * + * 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 undefined (invalid), it can only be reset or freed. + */ + compress_fast_continue :: proc(streamPtr: ^stream_t, src, dst: [^]byte, srcSize, dstCapacity: c.int, acceleration: c.int) -> c.int --- + + /*! LZ4_saveDict() : + * If last 64KB data cannot be guaranteed to remain available at its current memory location, + * save it into a safer place (char* safeBuffer). + * This is schematically equivalent to a memcpy() followed by LZ4_loadDict(), + * but is much faster, because LZ4_saveDict() doesn't need to rebuild tables. + * @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error. + */ + saveDict :: proc(streamPtr: ^stream_t, safeBuffer: [^]byte, maxDictSize: c.int) -> c.int --- + + + createStreamDecode :: proc() -> ^streamDecode_t --- + freeStreamDecode :: proc(LZ4_stream: ^streamDecode_t) -> c.int --- + + /*! LZ4_setStreamDecode() : + * An LZ4_streamDecode_t context can be allocated once and re-used multiple times. + * Use this function to start decompression of a new stream of blocks. + * A dictionary can optionally be set. Use NULL or size 0 for a reset order. + * Dictionary is presumed stable : it must remain accessible and unmodified during next decompression. + * @return : 1 if OK, 0 if error + */ + setStreamDecode :: proc(LZ4_streamDecode: ^streamDecode_t, dictionary: [^]byte, dictSize: c.int) -> c.int --- + + /*! LZ4_decoderRingBufferSize() : v1.8.2+ + * Note : in a ring buffer scenario (optional), + * blocks are presumed decompressed next to each other + * up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize), + * at which stage it resumes from beginning of ring buffer. + * When setting such a ring buffer for streaming decompression, + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ + decoderRingBufferSize :: proc(maxBlockSize: c.int) -> c.int --- + + /*! LZ4_decompress_safe_continue() : + * This decoding function allows decompression of consecutive blocks in "streaming" mode. + * The difference with the usual independent blocks is that + * new blocks are allowed to find references into former blocks. + * A block is an unsplittable entity, and must be presented entirely to the decompression function. + * LZ4_decompress_safe_continue() only accepts one block at a time. + * It's modeled after `LZ4_decompress_safe()` and behaves similarly. + * + * @LZ4_streamDecode : decompression state, tracking the position in memory of past data + * @compressedSize : exact complete size of one compressed block. + * @dstCapacity : size of destination buffer (which must be already allocated), + * must be an upper bound of decompressed size. + * @return : 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 the source stream is detected malformed, the function will stop decoding and return a negative result. + * + * The last 64KB of previously decoded data *must* remain available and unmodified + * at the memory position where they were previously decoded. + * If less than 64KB of data has been decoded, all the data must be present. + * + * Special : if decompression side sets a ring buffer, it must respect one of the following conditions : + * - Decompression buffer size is _at least_ LZ4_decoderRingBufferSize(maxBlockSize). + * maxBlockSize is the maximum size of any single block. It can have any value > 16 bytes. + * In which case, encoding and decoding buffers do not need to be synchronized. + * Actually, data can be produced by any source compliant with LZ4 format specification, and respecting maxBlockSize. + * - Synchronized mode : + * Decompression buffer size is _exactly_ the same as compression buffer size, + * and follows exactly same update rule (block boundaries at same positions), + * and decoding function is provided with exact decompressed size of each block (exception for last block of the stream), + * _then_ decoding & encoding ring buffer can have any size, including small ones ( < 64 KB). + * - Decompression buffer is larger than encoding buffer, by a minimum of maxBlockSize more bytes. + * In which case, encoding and decoding buffers do not need to be synchronized, + * and encoding ring buffer can have any size, including small ones ( < 64 KB). + * + * Whenever these conditions are not possible, + * save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression, + * then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block. + */ + decompress_safe_continue :: proc(LZ4_streamDecode: ^streamDecode_t, src, dst: [^]byte, srcSize, dstCapacity: c.int) -> c.int --- + + + /*! LZ4_decompress_safe_usingDict() : + * Works the same as + * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_safe_continue() + * However, it's stateless: it doesn't need any LZ4_streamDecode_t state. + * Dictionary is presumed stable : it must remain accessible and unmodified during decompression. + * Performance tip : Decompression speed can be substantially increased + * when dst == dictStart + dictSize. + */ + decompress_safe_usingDict :: proc(src, dst: [^]byte, srcSize, dstCapacity: c.int, dictStart: [^]byte, dictSize: c.int) -> c.int --- + + /*! LZ4_decompress_safe_partial_usingDict() : + * Behaves the same as LZ4_decompress_safe_partial() + * with the added ability to specify a memory segment for past data. + * Performance tip : Decompression speed can be substantially increased + * when dst == dictStart + dictSize. + */ + decompress_safe_partial_usingDict :: proc(src, dst: [^]byte, compressedSize, targetOutputSize, maxOutputSize: c.int, dictStart: [^]byte, dictSize: c.int) -> c.int --- + +} + + +STREAM_MINSIZE :: (1 << MEMORY_USAGE) + 32 /* static size, for inter-version compatibility */ + +stream_t :: struct #raw_union { + minStateSize: [STREAM_MINSIZE]byte, + internal_donotuse: stream_t_internal, +} + + +HASHLOG :: MEMORY_USAGE-2 +HASHTABLESIZE :: 1 << MEMORY_USAGE +HASH_SIZE_U32 :: 1 << HASHLOG /* required as macro for static allocation */ + +stream_t_internal :: struct { + hashTable: [HASH_SIZE_U32]u32, + dictionary: [^]byte, + dictCtx: ^stream_t_internal, + currentOffset: u32, + tableType: u32, + dictSize: u32, + /* Implicit padding to ensure structure is aligned */ +} + + +STREAMDECODE_MINSIZE :: 32 +streamDecode_t :: struct #raw_union { + minStateSize: [STREAMDECODE_MINSIZE]byte, + internal_donotuse: streamDecode_t_internal, +} + +streamDecode_t_internal :: struct { + externalDict: [^]byte, + prefixEnd: [^]byte, + extDictSize: c.size_t, + prefixSize: c.size_t, +} + + + +/////////////////// +// lz4hc + +CLEVEL_MIN :: 2 +CLEVEL_DEFAULT :: 9 +CLEVEL_OPT_MIN :: 10 +CLEVEL_MAX :: 12 + + +@(default_calling_convention="c", link_prefix="LZ4_") +foreign lib { + /*! LZ4_compress_HC() : + * Compress data from `src` into `dst`, using the powerful but slower "HC" algorithm. + * `dst` must be already allocated. + * 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") + * `compressionLevel` : any value between 1 and LZ4HC_CLEVEL_MAX will work. + * Values > LZ4HC_CLEVEL_MAX behave the same as LZ4HC_CLEVEL_MAX. + * @return : the number of bytes written into 'dst' + * or 0 if compression fails. + */ + compress_HC :: proc(src, dst: [^]byte, srcSize, dstCapacity, compressionLevel: c.int) -> c.int --- + + + /*! LZ4_compress_HC_extStateHC() : + * Same as LZ4_compress_HC(), but using an externally allocated memory segment for `state`. + * `state` size is provided by LZ4_sizeofStateHC(). + * Memory segment must be aligned on 8-bytes boundaries (which a normal malloc() should do properly). + */ + sizeofStateHC :: proc() -> c.int --- + compress_HC_extStateHC :: proc(stateHC: rawptr, src, dst: [^]byte, srcSize, maxDstSize: c.int, compressionLevel: c.int) -> c.int --- + + + /*! 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` + */ + compress_HC_destSize :: proc(stateHC: rawptr, src, dst: [^]byte, srcSizePtr: ^c.int, targetDstSize: c.int, compressionLevel: c.int) -> c.int --- + + /*! LZ4_createStreamHC() and LZ4_freeStreamHC() : + * These functions create and release memory for LZ4 HC streaming state. + * Newly created states are automatically initialized. + * A same state can be used multiple times consecutively, + * starting with LZ4_resetStreamHC_fast() to start a new stream of blocks. + */ + createStreamHC :: proc() -> ^streamHC_t --- + freeStreamHC :: proc(streamHCPtr: ^streamHC_t) -> c.int --- + + resetStreamHC_fast :: proc(streamHCPtr: ^streamHC_t, compressionLevel: c.int) --- /* v1.9.0+ */ + loadDictHC :: proc(streamHCPtr: ^streamHC_t, dictionary: [^]byte, dictSize: c.int) -> c.int --- + + compress_HC_continue :: proc(streamHCPtr: ^streamHC_t, src, dst: [^]byte, srcSize, maxDstSize: c.int) -> c.int --- + + /*! 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. + */ + compress_HC_continue_destSize:: proc(LZ4_streamHCPtr: ^streamHC_t, src, dst: [^]byte, srcSizePtr: ^c.int, targetDstSize: c.int) -> c.int --- + + saveDictHC :: proc(streamHCPtr: ^streamHC_t, safeBuffer: [^]byte, maxDictSize: c.int) -> c.int --- + + /*! LZ4_attach_HC_dictionary() : stable since v1.10.0 + * This API allows for the efficient re-use of a static dictionary many times. + * + * Rather than re-loading the dictionary buffer into a working context before + * each compression, or copying a pre-loaded dictionary's LZ4_streamHC_t into a + * working LZ4_streamHC_t, this function introduces a no-copy setup mechanism, + * in which the working stream references the dictionary stream in-place. + * + * Several assumptions are made about the state of the dictionary stream. + * Currently, only streams which have been prepared by LZ4_loadDictHC() should + * be expected to work. + * + * Alternatively, the provided dictionary stream pointer may be NULL, in which + * case any existing dictionary stream is unset. + * + * A dictionary should only be attached to a stream without any history (i.e., + * a stream that has just been reset). + * + * The dictionary will remain attached to the working stream only for the + * current stream session. Calls to LZ4_resetStreamHC(_fast) will remove the + * dictionary context association from the working stream. The dictionary + * stream (and source buffer) must remain in-place / accessible / unchanged + * through the lifetime of the stream session. + */ + attach_HC_dictionary :: proc(working_stream, dictionary_stream: ^streamHC_t) --- +} + + +HC_DICTIONARY_LOGSIZE :: 16 +HC_MAXD :: 1< /* size_t */ + + +/** + Introduction + + LZ4 is lossless compression algorithm, providing compression speed >500 MB/s per core, + scalable with multi-cores CPU. It features an extremely fast decoder, with speed in + 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. + It gives full buffer control to user. + Compression can be done in: + - a single step (described as Simple Functions) + - a single step, reusing a context (described in Advanced Functions) + - unbounded multiple steps (described as Streaming compression) + + lz4.h generates and decodes LZ4-compressed blocks (doc/lz4_Block_format.md). + Decompressing such a compressed block requires additional metadata. + Exact metadata depends on exact decompression function. + For the typical case of LZ4_decompress_safe(), + metadata includes block's compressed size, and maximum bound of decompressed size. + Each application is free to encode and pass such metadata in whichever way it wants. + + lz4.h only handle blocks, it can not generate Frames. + + Blocks are different from Frames (doc/lz4_Frame_format.md). + Frames bundle both blocks and metadata in a specified manner. + Embedding metadata is required for compressed data to be self-contained and portable. + Frame format is delivered through a companion API, declared in lz4frame.h. + The `lz4` CLI can only manage frames. +*/ + +/*^*************************************************************** +* Export parameters +*****************************************************************/ +/* +* LZ4_DLL_EXPORT : +* Enable exporting of functions when building a Windows DLL +* LZ4LIB_VISIBILITY : +* Control library symbols visibility. +*/ +#ifndef LZ4LIB_VISIBILITY +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4LIB_VISIBILITY __attribute__ ((visibility ("default"))) +# else +# define LZ4LIB_VISIBILITY +# endif +#endif +#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) +# define LZ4LIB_API __declspec(dllexport) LZ4LIB_VISIBILITY +#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) +# define LZ4LIB_API __declspec(dllimport) LZ4LIB_VISIBILITY /* It isn't required but allows to generate better code, saving a function pointer load from the IAT and an indirect jump.*/ +#else +# define LZ4LIB_API LZ4LIB_VISIBILITY +#endif + +/*! LZ4_FREESTANDING : + * When this macro is set to 1, it enables "freestanding mode" that is + * suitable for typical freestanding environment which doesn't support + * standard C library. + * + * - LZ4_FREESTANDING is a compile-time switch. + * - It requires the following macros to be defined: + * LZ4_memcpy, LZ4_memmove, LZ4_memset. + * - It only enables LZ4/HC functions which don't use heap. + * All LZ4F_* functions are not supported. + * - See tests/freestanding.c to check its basic setup. + */ +#if defined(LZ4_FREESTANDING) && (LZ4_FREESTANDING == 1) +# define LZ4_HEAPMODE 0 +# define LZ4HC_HEAPMODE 0 +# define LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION 1 +# if !defined(LZ4_memcpy) +# error "LZ4_FREESTANDING requires macro 'LZ4_memcpy'." +# endif +# if !defined(LZ4_memset) +# error "LZ4_FREESTANDING requires macro 'LZ4_memset'." +# endif +# if !defined(LZ4_memmove) +# error "LZ4_FREESTANDING requires macro 'LZ4_memmove'." +# endif +#elif ! defined(LZ4_FREESTANDING) +# define LZ4_FREESTANDING 0 +#endif + + +/*------ Version ------*/ +#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */ +#define LZ4_VERSION_MINOR 10 /* for new (non-breaking) interface capabilities */ +#define LZ4_VERSION_RELEASE 0 /* for tweaks, bug-fixes, or development */ + +#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE) + +#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE +#define LZ4_QUOTE(str) #str +#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str) +#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) /* requires v1.7.3+ */ + +LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version; requires v1.3.0+ */ +LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version; requires v1.7.5+ */ + + +/*-************************************ +* Tuning memory usage +**************************************/ +/*! + * LZ4_MEMORY_USAGE : + * Can be selected at compile time, by setting LZ4_MEMORY_USAGE. + * Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB) + * Increasing memory usage improves compression ratio, generally at the cost of speed. + * Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality. + * Default value is 14, for 16KB, which nicely fits into most L1 caches. + */ +#ifndef LZ4_MEMORY_USAGE +# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT +#endif + +/* These are absolute limits, they should not be changed by users */ +#define LZ4_MEMORY_USAGE_MIN 10 +#define LZ4_MEMORY_USAGE_DEFAULT 14 +#define LZ4_MEMORY_USAGE_MAX 20 + +#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN) +# error "LZ4_MEMORY_USAGE is too small !" +#endif + +#if (LZ4_MEMORY_USAGE > LZ4_MEMORY_USAGE_MAX) +# error "LZ4_MEMORY_USAGE is too large !" +#endif + +/*-************************************ +* Simple Functions +**************************************/ +/*! LZ4_compress_default() : + * Compresses 'srcSize' bytes from buffer 'src' + * into already allocated 'dst' buffer of size 'dstCapacity'. + * Compression is guaranteed to succeed if 'dstCapacity' >= LZ4_compressBound(srcSize). + * It also runs faster, so it's a recommended setting. + * If the function cannot compress 'src' into a more limited 'dst' budget, + * compression stops *immediately*, and the function result is zero. + * In which case, 'dst' content is undefined (invalid). + * srcSize : max supported value is LZ4_MAX_INPUT_SIZE. + * dstCapacity : size of buffer 'dst' (which must be already allocated) + * @return : the number of bytes written into buffer 'dst' (necessarily <= dstCapacity) + * 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); + +/*! LZ4_decompress_safe() : + * @compressedSize : is the exact complete size of the compressed block. + * @dstCapacity : is the size of destination buffer (which must be already allocated), + * presumed an upper bound of decompressed size. + * @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 the source stream is detected malformed, the function will stop decoding and return a negative result. + * Note 1 : This function is protected against malicious data packets : + * it will never writes outside 'dst' buffer, nor read outside 'source' buffer, + * even if the compressed block is maliciously modified to order the decoder to do these actions. + * In such case, the decoder stops immediately, and considers the compressed block malformed. + * Note 2 : compressedSize and dstCapacity must be provided to the function, the compressed block does not contain them. + * The implementation is free to send / store / derive this information in whichever way is most beneficial. + * If there is a need for a different format which bundles together both compressed data and its metadata, consider looking at lz4frame.h instead. + */ +LZ4LIB_API int LZ4_decompress_safe (const char* src, char* dst, int compressedSize, int dstCapacity); + + +/*-************************************ +* Advanced Functions +**************************************/ +#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) + +/*! LZ4_compressBound() : + 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). + Macro LZ4_COMPRESSBOUND() is also provided for compilation-time evaluation (stack memory allocation for example). + Note that LZ4_compress_default() compresses faster when dstCapacity is >= LZ4_compressBound(srcSize) + inputSize : max supported value is LZ4_MAX_INPUT_SIZE + return : maximum output size in a "worst case" scenario + or 0, if input size is incorrect (too large or negative) +*/ +LZ4LIB_API int LZ4_compressBound(int inputSize); + +/*! LZ4_compress_fast() : + 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. + It's a trade-off. It can be fine tuned, with each successive value providing roughly +~3% to speed. + An acceleration value of "1" is the same as regular LZ4_compress_default() + Values <= 0 will be replaced by LZ4_ACCELERATION_DEFAULT (currently == 1, see lz4.c). + Values > LZ4_ACCELERATION_MAX will be replaced by LZ4_ACCELERATION_MAX (currently == 65537, see lz4.c). +*/ +LZ4LIB_API int LZ4_compress_fast (const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + + +/*! LZ4_compress_fast_extState() : + * Same as LZ4_compress_fast(), using an externally allocated memory space for its state. + * Use LZ4_sizeofState() to know how much memory must be allocated, + * and allocate it on 8-bytes boundaries (using `malloc()` typically). + * Then, provide this buffer as `void* state` to compression function. + */ +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); + +/*! LZ4_compress_destSize() : + * Reverse the logic : compresses as much data as possible from 'src' buffer + * into already allocated buffer 'dst', of size >= 'dstCapacity'. + * This function either compresses the entire 'src' content into 'dst' if it's large enough, + * or fill 'dst' buffer completely with as much data as possible from 'src'. + * note: acceleration parameter is fixed to "default". + * + * *srcSizePtr : in+out parameter. Initially contains size of input. + * Will be modified to indicate how many bytes where read from 'src' to fill 'dst'. + * New value is necessarily <= input value. + * @return : Nb bytes written into 'dst' (necessarily <= dstCapacity) + * or 0 if compression fails. + * + * Note : from v1.8.2 to v1.9.1, this function had a bug (fixed in v1.9.2+): + * the produced compressed content could, in specific circumstances, + * require to be decompressed into a destination buffer larger + * by at least 1 byte than the content to decompress. + * If an application uses `LZ4_compress_destSize()`, + * it's highly recommended to update liblz4 to v1.9.2 or better. + * If this can't be done or ensured, + * the receiving decompression function should provide + * a dstCapacity which is > decompressedSize, by at least 1 byte. + * See https://github.com/lz4/lz4/issues/859 for details + */ +LZ4LIB_API int LZ4_compress_destSize(const char* src, char* dst, int* srcSizePtr, int targetDstSize); + +/*! LZ4_decompress_safe_partial() : + * Decompress an LZ4 compressed block, of size 'srcSize' at position 'src', + * into destination buffer 'dst' of size 'dstCapacity'. + * Up to 'targetOutputSize' bytes will be decoded. + * The function stops decoding on reaching this objective. + * This can be useful to boost performance + * whenever only the beginning of a block is required. + * + * @return : the number of bytes decoded in `dst` (necessarily <= targetOutputSize) + * If source stream is detected malformed, function returns a negative result. + * + * Note 1 : @return can be < targetOutputSize, if compressed block contains less data. + * + * Note 2 : targetOutputSize must be <= dstCapacity + * + * Note 3 : this function effectively stops decoding on reaching targetOutputSize, + * so dstCapacity is kind of redundant. + * This is because in older versions of this function, + * decoding operation would still write complete sequences. + * Therefore, there was no guarantee that it would stop writing at exactly targetOutputSize, + * it could write more bytes, though only up to dstCapacity. + * Some "margin" used to be required for this operation to work properly. + * Thankfully, this is no longer necessary. + * The function nonetheless keeps the same signature, in an effort to preserve API compatibility. + * + * Note 4 : If srcSize is the exact size of the block, + * then targetOutputSize can be any value, + * including larger than the block's decompressed size. + * The function will, at most, generate block's decompressed size. + * + * Note 5 : If srcSize is _larger_ than block's compressed size, + * then targetOutputSize **MUST** be <= block's decompressed size. + * Otherwise, *silent corruption will occur*. + */ +LZ4LIB_API int LZ4_decompress_safe_partial (const char* src, char* dst, int srcSize, int targetOutputSize, int dstCapacity); + + +/*-********************************************* +* Streaming Compression Functions +***********************************************/ +typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */ + +/*! + Note about RC_INVOKED + + - RC_INVOKED is predefined symbol of rc.exe (the resource compiler which is part of MSVC/Visual Studio). + https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros + + - Since rc.exe is a legacy compiler, it truncates long symbol (> 30 chars) + and reports warning "RC4011: identifier truncated". + + - To eliminate the warning, we surround long preprocessor symbol with + "#if !defined(RC_INVOKED) ... #endif" block that means + "skip this block when rc.exe is trying to read it". +*/ +#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4LIB_API LZ4_stream_t* LZ4_createStream(void); +LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr); +#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ +#endif + +/*! LZ4_resetStream_fast() : v1.9.0+ + * Use this to prepare an LZ4_stream_t for a new chain of dependent blocks + * (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_fast (LZ4_stream_t* streamPtr); + +/*! LZ4_loadDict() : + * Use this function to reference a static dictionary into LZ4_stream_t. + * 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 itself accepts any input as dictionary, dictionary efficiency is also a topic. + * When in doubt, employ the Zstandard's Dictionary Builder. + * Loading a size of 0 is allowed, and is the same as reset. + * @return : loaded dictionary size, in bytes (note: only the last 64 KB are loaded) + */ +LZ4LIB_API int LZ4_loadDict (LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/*! LZ4_loadDictSlow() : v1.10.0+ + * Same as LZ4_loadDict(), + * but uses a bit more cpu to reference the dictionary content more thoroughly. + * This is expected to slightly improve compression ratio. + * The extra-cpu cost is likely worth it if the dictionary is re-used across multiple sessions. + * @return : loaded dictionary size, in bytes (note: only the last 64 KB are loaded) + */ +LZ4LIB_API int LZ4_loadDictSlow(LZ4_stream_t* streamPtr, const char* dictionary, int dictSize); + +/*! LZ4_attach_dictionary() : stable since v1.10.0 + * + * This allows efficient re-use of a static dictionary multiple times. + * + * 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 + * working LZ4_stream_t, this function introduces a no-copy setup mechanism, + * in which the working stream references @dictionaryStream in-place. + * + * Several assumptions are made about the state of @dictionaryStream. + * Currently, only states which have been prepared by LZ4_loadDict() or + * LZ4_loadDictSlow() should be expected to work. + * + * Alternatively, the provided @dictionaryStream may be NULL, + * in which case any existing dictionary stream is unset. + * + * If a dictionary is provided, it replaces any pre-existing stream history. + * The dictionary contents are the only history that can be referenced and + * logically immediately precede the data compressed in the first subsequent + * compression call. + * + * The dictionary will only remain attached to the working stream through the + * first compression call, at the end of which it is cleared. + * @dictionaryStream stream (and source buffer) must remain in-place / accessible / unchanged + * through the completion of the compression session. + * + * Note: there is no equivalent LZ4_attach_*() method on the decompression side + * because there is no initialization cost, hence no need to share the cost across multiple sessions. + * To decompress LZ4 blocks using dictionary, attached or not, + * just employ the regular LZ4_setStreamDecode() for streaming, + * or the stateless LZ4_decompress_safe_usingDict() for one-shot decompression. + */ +LZ4LIB_API void +LZ4_attach_dictionary(LZ4_stream_t* workingStream, + const LZ4_stream_t* dictionaryStream); + +/*! LZ4_compress_fast_continue() : + * Compress 'src' content using data from previously compressed blocks, for better compression ratio. + * 'dst' buffer must be already allocated. + * If dstCapacity >= LZ4_compressBound(srcSize), compression is guaranteed to succeed, and runs faster. + * + * @return : size of compressed block + * or 0 if there is an error (typically, cannot fit into 'dst'). + * + * Note 1 : Each invocation to LZ4_compress_fast_continue() generates a new block. + * 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. + * + * 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. + * Make sure that buffers are separated, by at least one byte. + * This construction ensures that each block only depends on previous block. + * + * 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 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); + +/*! LZ4_saveDict() : + * If last 64KB data cannot be guaranteed to remain available at its current memory location, + * save it into a safer place (char* safeBuffer). + * This is schematically equivalent to a memcpy() followed by LZ4_loadDict(), + * but is much faster, because LZ4_saveDict() doesn't need to rebuild tables. + * @return : saved dictionary size in bytes (necessarily <= maxDictSize), or 0 if error. + */ +LZ4LIB_API int LZ4_saveDict (LZ4_stream_t* streamPtr, char* safeBuffer, int maxDictSize); + + +/*-********************************************** +* Streaming Decompression Functions +* Bufferless synchronous API +************************************************/ +typedef union LZ4_streamDecode_u LZ4_streamDecode_t; /* tracking context */ + +/*! LZ4_createStreamDecode() and LZ4_freeStreamDecode() : + * creation / destruction of streaming decompression tracking context. + * A tracking context can be re-used multiple times. + */ +#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */ +#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) +LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void); +LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream); +#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */ +#endif + +/*! LZ4_setStreamDecode() : + * An LZ4_streamDecode_t context can be allocated once and re-used multiple times. + * Use this function to start decompression of a new stream of blocks. + * A dictionary can optionally be set. Use NULL or size 0 for a reset order. + * Dictionary is presumed stable : it must remain accessible and unmodified during next decompression. + * @return : 1 if OK, 0 if error + */ +LZ4LIB_API int LZ4_setStreamDecode (LZ4_streamDecode_t* LZ4_streamDecode, const char* dictionary, int dictSize); + +/*! LZ4_decoderRingBufferSize() : v1.8.2+ + * Note : in a ring buffer scenario (optional), + * blocks are presumed decompressed next to each other + * up to the moment there is not enough remaining space for next block (remainingSize < maxBlockSize), + * at which stage it resumes from beginning of ring buffer. + * When setting such a ring buffer for streaming decompression, + * provides the minimum size of this ring buffer + * to be compatible with any source respecting maxBlockSize condition. + * @return : minimum ring buffer size, + * or 0 if there is an error (invalid maxBlockSize). + */ +LZ4LIB_API int LZ4_decoderRingBufferSize(int maxBlockSize); +#define LZ4_DECODER_RING_BUFFER_SIZE(maxBlockSize) (65536 + 14 + (maxBlockSize)) /* for static allocation; maxBlockSize presumed valid */ + +/*! LZ4_decompress_safe_continue() : + * This decoding function allows decompression of consecutive blocks in "streaming" mode. + * The difference with the usual independent blocks is that + * new blocks are allowed to find references into former blocks. + * A block is an unsplittable entity, and must be presented entirely to the decompression function. + * LZ4_decompress_safe_continue() only accepts one block at a time. + * It's modeled after `LZ4_decompress_safe()` and behaves similarly. + * + * @LZ4_streamDecode : decompression state, tracking the position in memory of past data + * @compressedSize : exact complete size of one compressed block. + * @dstCapacity : size of destination buffer (which must be already allocated), + * must be an upper bound of decompressed size. + * @return : 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 the source stream is detected malformed, the function will stop decoding and return a negative result. + * + * The last 64KB of previously decoded data *must* remain available and unmodified + * at the memory position where they were previously decoded. + * If less than 64KB of data has been decoded, all the data must be present. + * + * Special : if decompression side sets a ring buffer, it must respect one of the following conditions : + * - Decompression buffer size is _at least_ LZ4_decoderRingBufferSize(maxBlockSize). + * maxBlockSize is the maximum size of any single block. It can have any value > 16 bytes. + * In which case, encoding and decoding buffers do not need to be synchronized. + * Actually, data can be produced by any source compliant with LZ4 format specification, and respecting maxBlockSize. + * - Synchronized mode : + * Decompression buffer size is _exactly_ the same as compression buffer size, + * and follows exactly same update rule (block boundaries at same positions), + * and decoding function is provided with exact decompressed size of each block (exception for last block of the stream), + * _then_ decoding & encoding ring buffer can have any size, including small ones ( < 64 KB). + * - Decompression buffer is larger than encoding buffer, by a minimum of maxBlockSize more bytes. + * In which case, encoding and decoding buffers do not need to be synchronized, + * and encoding ring buffer can have any size, including small ones ( < 64 KB). + * + * Whenever these conditions are not possible, + * save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression, + * 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); + + +/*! LZ4_decompress_safe_usingDict() : + * Works the same as + * a combination of LZ4_setStreamDecode() followed by LZ4_decompress_safe_continue() + * However, it's stateless: it doesn't need any LZ4_streamDecode_t state. + * 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 dstCapacity, + const char* dictStart, int dictSize); + +/*! LZ4_decompress_safe_partial_usingDict() : + * Behaves the same as LZ4_decompress_safe_partial() + * with the added ability to specify a memory segment for past data. + * Performance tip : Decompression speed can be substantially increased + * when dst == dictStart + dictSize. + */ +LZ4LIB_API int +LZ4_decompress_safe_partial_usingDict(const char* src, char* dst, + int compressedSize, + int targetOutputSize, int maxOutputSize, + const char* dictStart, int dictSize); + +#endif /* LZ4_H_2983827168210 */ + + +/*^************************************* + * !!!!!! STATIC LINKING ONLY !!!!!! + ***************************************/ + +/*-**************************************************************************** + * Experimental section + * + * Symbols declared in this section must be considered unstable. Their + * signatures or semantics may change, or they may be removed altogether in the + * future. They are therefore only safe to depend on when the caller is + * 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_STATIC_LINKING_ONLY + +#ifndef LZ4_STATIC_3504398509 +#define LZ4_STATIC_3504398509 + +#ifdef LZ4_PUBLISH_STATIC_FUNCTIONS +# define LZ4LIB_STATIC_API LZ4LIB_API +#else +# define LZ4LIB_STATIC_API +#endif + + +/*! LZ4_compress_fast_extState_fastReset() : + * A variant of LZ4_compress_fast_extState(). + * + * Using this variant avoids an expensive initialization step. + * 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 initialized"). + * From a high level, the difference is that + * this function initializes the provided state with a call to something like LZ4_resetStream_fast() + * while LZ4_compress_fast_extState() starts with a call to LZ4_resetStream(). + */ +LZ4LIB_STATIC_API int LZ4_compress_fast_extState_fastReset (void* state, const char* src, char* dst, int srcSize, int dstCapacity, int acceleration); + +/*! LZ4_compress_destSize_extState() : introduced in v1.10.0 + * Same as LZ4_compress_destSize(), but using an externally allocated state. + * Also: exposes @acceleration + */ +int LZ4_compress_destSize_extState(void* state, const char* src, char* dst, int* srcSizePtr, int targetDstSize, int acceleration); + +/*! In-place compression and decompression + * + * It's possible to have input and output sharing the same buffer, + * for highly constrained memory environments. + * In both cases, it requires input to lay at the end of the buffer, + * and decompression to start at beginning of the buffer. + * Buffer size must feature some margin, hence be larger than final size. + * + * |<------------------------buffer--------------------------------->| + * |<-----------compressed data--------->| + * |<-----------decompressed size------------------>| + * |<----margin---->| + * + * This technique is more useful for decompression, + * since decompressed size is typically larger, + * and margin is short. + * + * In-place decompression will work inside any buffer + * which size is >= LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize). + * This presumes that decompressedSize > compressedSize. + * Otherwise, it means compression actually expanded data, + * and it would be more efficient to store such data with a flag indicating it's not compressed. + * This can happen when data is not compressible (already compressed, or encrypted). + * + * For in-place compression, margin is larger, as it must be able to cope with both + * history preservation, requiring input data to remain unmodified up to LZ4_DISTANCE_MAX, + * and data expansion, which can happen when input is not compressible. + * As a consequence, buffer size requirements are much higher, + * and memory savings offered by in-place compression are more limited. + * + * There are ways to limit this cost for compression : + * - Reduce history size, by modifying LZ4_DISTANCE_MAX. + * Note that it is a compile-time constant, so all compressions will apply this limit. + * Lower values will reduce compression ratio, except when input_size < LZ4_DISTANCE_MAX, + * so it's a reasonable trick when inputs are known to be small. + * - Require the compressor to deliver a "maximum compressed size". + * This is the `dstCapacity` parameter in `LZ4_compress*()`. + * When this size is < LZ4_COMPRESSBOUND(inputSize), then compression can fail, + * in which case, the return code will be 0 (zero). + * The caller must be ready for these cases to happen, + * and typically design a backup scheme to send data uncompressed. + * The combination of both techniques can significantly reduce + * the amount of margin required for in-place compression. + * + * In-place compression can work in any buffer + * which size is >= (maxCompressedSize) + * with maxCompressedSize == LZ4_COMPRESSBOUND(srcSize) for guaranteed compression success. + * LZ4_COMPRESS_INPLACE_BUFFER_SIZE() depends on both maxCompressedSize and LZ4_DISTANCE_MAX, + * so it's possible to reduce memory requirements by playing with them. + */ + +#define LZ4_DECOMPRESS_INPLACE_MARGIN(compressedSize) (((compressedSize) >> 8) + 32) +#define LZ4_DECOMPRESS_INPLACE_BUFFER_SIZE(decompressedSize) ((decompressedSize) + LZ4_DECOMPRESS_INPLACE_MARGIN(decompressedSize)) /**< note: presumes that compressedSize < decompressedSize. note2: margin is overestimated a bit, since it could use compressedSize instead */ + +#ifndef LZ4_DISTANCE_MAX /* history window size; can be user-defined at compile time */ +# define LZ4_DISTANCE_MAX 65535 /* set to maximum value by default */ +#endif + +#define LZ4_COMPRESS_INPLACE_MARGIN (LZ4_DISTANCE_MAX + 32) /* LZ4_DISTANCE_MAX can be safely replaced by srcSize when it's smaller */ +#define LZ4_COMPRESS_INPLACE_BUFFER_SIZE(maxCompressedSize) ((maxCompressedSize) + LZ4_COMPRESS_INPLACE_MARGIN) /**< maxCompressedSize is generally LZ4_COMPRESSBOUND(inputSize), but can be set to any lower value, with the risk that compression can fail (return code 0(zero)) */ + +#endif /* LZ4_STATIC_3504398509 */ +#endif /* LZ4_STATIC_LINKING_ONLY */ + + + +#ifndef LZ4_H_98237428734687 +#define LZ4_H_98237428734687 + +/*-************************************************************ + * Private Definitions + ************************************************************** + * Do not use these definitions directly. + * They are only exposed to allow static allocation of `LZ4_stream_t` and `LZ4_streamDecode_t`. + * Accessing members will expose user code to API and/or ABI break in future versions of the library. + **************************************************************/ +#define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2) +#define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE) +#define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */ + +#if defined(__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) +# include + typedef int8_t LZ4_i8; + typedef uint8_t LZ4_byte; + typedef uint16_t LZ4_u16; + typedef uint32_t LZ4_u32; +#else + typedef signed char LZ4_i8; + typedef unsigned char LZ4_byte; + typedef unsigned short LZ4_u16; + typedef unsigned int LZ4_u32; +#endif + +/*! LZ4_stream_t : + * Never ever use below internal definitions directly ! + * These definitions are not API/ABI safe, and may change in future versions. + * If you need static allocation, declare or allocate an LZ4_stream_t object. +**/ + +typedef struct LZ4_stream_t_internal LZ4_stream_t_internal; +struct LZ4_stream_t_internal { + LZ4_u32 hashTable[LZ4_HASH_SIZE_U32]; + const LZ4_byte* dictionary; + const LZ4_stream_t_internal* dictCtx; + LZ4_u32 currentOffset; + LZ4_u32 tableType; + LZ4_u32 dictSize; + /* Implicit padding to ensure structure is aligned */ +}; + +#define LZ4_STREAM_MINSIZE ((1UL << (LZ4_MEMORY_USAGE)) + 32) /* static size, for inter-version compatibility */ +union LZ4_stream_u { + char minStateSize[LZ4_STREAM_MINSIZE]; + LZ4_stream_t_internal internal_donotuse; +}; /* previously typedef'd to LZ4_stream_t */ + + +/*! LZ4_initStream() : v1.9.0+ + * An LZ4_stream_t structure must be initialized at least once. + * This is automatically done when invoking LZ4_createStream(), + * but it's not when the structure is simply declared on stack (for example). + * + * Use LZ4_initStream() to properly initialize a newly declared LZ4_stream_t. + * It can also initialize any arbitrary buffer of sufficient size, + * 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 +**/ +LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* stateBuffer, size_t size); + + +/*! LZ4_streamDecode_t : + * Never ever use below internal definitions directly ! + * These definitions are not API/ABI safe, and may change in future versions. + * If you need static allocation, declare or allocate an LZ4_streamDecode_t object. +**/ +typedef struct { + const LZ4_byte* externalDict; + const LZ4_byte* prefixEnd; + size_t extDictSize; + size_t prefixSize; +} LZ4_streamDecode_t_internal; + +#define LZ4_STREAMDECODE_MINSIZE 32 +union LZ4_streamDecode_u { + char minStateSize[LZ4_STREAMDECODE_MINSIZE]; + LZ4_streamDecode_t_internal internal_donotuse; +} ; /* previously typedef'd to LZ4_streamDecode_t */ + + + +/*-************************************ +* Obsolete Functions +**************************************/ + +/*! Deprecation warnings + * + * Deprecated functions make the compiler generate a warning when invoked. + * This is meant to invite users to update their source code. + * Should deprecation warnings be a problem, it is generally possible to disable them, + * 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 +# define LZ4_DEPRECATED(message) /* disable deprecation warnings */ +#else +# if defined (__cplusplus) && (__cplusplus >= 201402) /* C++14 or greater */ +# define LZ4_DEPRECATED(message) [[deprecated(message)]] +# elif defined(_MSC_VER) +# define LZ4_DEPRECATED(message) __declspec(deprecated(message)) +# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 45)) +# define LZ4_DEPRECATED(message) __attribute__((deprecated(message))) +# elif defined(__GNUC__) && (__GNUC__ * 10 + __GNUC_MINOR__ >= 31) +# define LZ4_DEPRECATED(message) __attribute__((deprecated)) +# else +# pragma message("WARNING: LZ4_DEPRECATED needs custom implementation for this compiler") +# define LZ4_DEPRECATED(message) /* disabled */ +# endif +#endif /* LZ4_DISABLE_DEPRECATE_WARNINGS */ + +/*! Obsolete compression functions (since v1.7.3) */ +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress (const char* src, char* dest, int srcSize); +LZ4_DEPRECATED("use LZ4_compress_default() instead") LZ4LIB_API int LZ4_compress_limitedOutput (const char* src, char* dest, int srcSize, 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_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_limitedOutput_continue (LZ4_stream_t* LZ4_streamPtr, const char* source, char* dest, int inputSize, int maxOutputSize); + +/*! Obsolete decompression functions (since v1.8.0) */ +LZ4_DEPRECATED("use LZ4_decompress_fast() instead") LZ4LIB_API int LZ4_uncompress (const char* source, char* dest, int outputSize); +LZ4_DEPRECATED("use LZ4_decompress_safe() instead") LZ4LIB_API int LZ4_uncompress_unknownOutputSize (const char* source, char* dest, int isize, int maxOutputSize); + +/* Obsolete streaming functions (since v1.7.0) + * degraded functionality; do not use! + * + * In order to perform streaming compression, these functions depended on data + * that is no longer tracked in the state. They have been preserved as well as + * possible: using them will still produce a correct output. However, they don't + * actually retain any history between compression calls. The compression ratio + * achieved will therefore be no better than compressing each chunk + * independently. + */ +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_resetStream() instead") LZ4LIB_API int LZ4_resetStreamState(void* state, char* inputBuffer); +LZ4_DEPRECATED("Use LZ4_saveDict() instead") LZ4LIB_API char* LZ4_slideInputBuffer (void* state); + +/*! Obsolete streaming decoding functions (since v1.7.0) */ +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); + +/*! Obsolete LZ4_decompress_fast variants (since v1.9.0) : + * These functions used to be faster than LZ4_decompress_safe(), + * but this is no longer the case. They are now slower. + * This is because LZ4_decompress_fast() doesn't know the input size, + * and therefore must progress more cautiously into 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 can be achieved in a more secure manner + * by employing LZ4_decompress_safe_partial(). + * + * 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_partial() instead") +LZ4LIB_API int LZ4_decompress_fast (const char* src, char* dst, int originalSize); +LZ4_DEPRECATED("This function is deprecated and unsafe. Consider migrating towards LZ4_decompress_safe_continue() instead. " + "Note that the contract will change (requires block's compressed size, instead of decompressed size)") +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_partial_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_98237428734687 */ + + +#if defined (__cplusplus) +} +#endif diff --git a/vendor/compress/lz4/src/lz4frame.h b/vendor/compress/lz4/src/lz4frame.h new file mode 100644 index 000000000..b8ae32276 --- /dev/null +++ b/vendor/compress/lz4/src/lz4frame.h @@ -0,0 +1,751 @@ +/* + LZ4F - LZ4-Frame library + Header File + Copyright (C) 2011-2020, Yann Collet. + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 source repository : https://github.com/lz4/lz4 + - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c +*/ + +/* LZ4F is a stand-alone API able to create and decode LZ4 frames + * conformant with specification v1.6.1 in doc/lz4_Frame_format.md . + * Generated frames are compatible with `lz4` CLI. + * + * LZ4F also offers streaming capabilities. + * + * lz4.h is not required when using lz4frame.h, + * except to extract common constants such as LZ4_VERSION_NUMBER. + * */ + +#ifndef LZ4F_H_09782039843 +#define LZ4F_H_09782039843 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* --- Dependency --- */ +#include /* size_t */ + + +/** + * Introduction + * + * lz4frame.h implements LZ4 frame specification: see doc/lz4_Frame_format.md . + * LZ4 Frames are compatible with `lz4` CLI, + * and designed to be interoperable with any system. +**/ + +/*-*************************************************************** + * Compiler specifics + *****************************************************************/ +/* LZ4_DLL_EXPORT : + * Enable exporting of functions when building a Windows DLL + * LZ4FLIB_VISIBILITY : + * Control library symbols visibility. + */ +#ifndef LZ4FLIB_VISIBILITY +# if defined(__GNUC__) && (__GNUC__ >= 4) +# define LZ4FLIB_VISIBILITY __attribute__ ((visibility ("default"))) +# else +# define LZ4FLIB_VISIBILITY +# endif +#endif +#if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) +# define LZ4FLIB_API __declspec(dllexport) LZ4FLIB_VISIBILITY +#elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) +# define LZ4FLIB_API __declspec(dllimport) LZ4FLIB_VISIBILITY +#else +# define LZ4FLIB_API LZ4FLIB_VISIBILITY +#endif + +#ifdef LZ4F_DISABLE_DEPRECATE_WARNINGS +# define LZ4F_DEPRECATE(x) x +#else +# if defined(_MSC_VER) +# define LZ4F_DEPRECATE(x) x /* __declspec(deprecated) x - only works with C++ */ +# elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6)) +# define LZ4F_DEPRECATE(x) x __attribute__((deprecated)) +# else +# define LZ4F_DEPRECATE(x) x /* no deprecation warning for this compiler */ +# endif +#endif + + +/*-************************************ + * Error management + **************************************/ +typedef size_t LZ4F_errorCode_t; + +LZ4FLIB_API unsigned LZ4F_isError(LZ4F_errorCode_t code); /**< tells when a function result is an error code */ +LZ4FLIB_API const char* LZ4F_getErrorName(LZ4F_errorCode_t code); /**< return error code string; for debugging */ + + +/*-************************************ + * Frame compression types + ************************************* */ +/* #define LZ4F_ENABLE_OBSOLETE_ENUMS // uncomment to enable obsolete enums */ +#ifdef LZ4F_ENABLE_OBSOLETE_ENUMS +# define LZ4F_OBSOLETE_ENUM(x) , LZ4F_DEPRECATE(x) = LZ4F_##x +#else +# define LZ4F_OBSOLETE_ENUM(x) +#endif + +/* The larger the block size, the (slightly) better the compression ratio, + * though there are diminishing returns. + * Larger blocks also increase memory usage on both compression and decompression sides. + */ +typedef enum { + LZ4F_default=0, + LZ4F_max64KB=4, + LZ4F_max256KB=5, + LZ4F_max1MB=6, + LZ4F_max4MB=7 + LZ4F_OBSOLETE_ENUM(max64KB) + LZ4F_OBSOLETE_ENUM(max256KB) + LZ4F_OBSOLETE_ENUM(max1MB) + LZ4F_OBSOLETE_ENUM(max4MB) +} LZ4F_blockSizeID_t; + +/* Linked blocks sharply reduce inefficiencies when using small blocks, + * they compress better. + * However, some LZ4 decoders are only compatible with independent blocks */ +typedef enum { + LZ4F_blockLinked=0, + LZ4F_blockIndependent + LZ4F_OBSOLETE_ENUM(blockLinked) + LZ4F_OBSOLETE_ENUM(blockIndependent) +} LZ4F_blockMode_t; + +typedef enum { + LZ4F_noContentChecksum=0, + LZ4F_contentChecksumEnabled + LZ4F_OBSOLETE_ENUM(noContentChecksum) + LZ4F_OBSOLETE_ENUM(contentChecksumEnabled) +} LZ4F_contentChecksum_t; + +typedef enum { + LZ4F_noBlockChecksum=0, + LZ4F_blockChecksumEnabled +} LZ4F_blockChecksum_t; + +typedef enum { + LZ4F_frame=0, + LZ4F_skippableFrame + LZ4F_OBSOLETE_ENUM(skippableFrame) +} LZ4F_frameType_t; + +#ifdef LZ4F_ENABLE_OBSOLETE_ENUMS +typedef LZ4F_blockSizeID_t blockSizeID_t; +typedef LZ4F_blockMode_t blockMode_t; +typedef LZ4F_frameType_t frameType_t; +typedef LZ4F_contentChecksum_t contentChecksum_t; +#endif + +/*! LZ4F_frameInfo_t : + * makes it possible to set or read frame parameters. + * Structure must be first init to 0, using memset() or LZ4F_INIT_FRAMEINFO, + * setting all parameters to default. + * It's then possible to update selectively some parameters */ +typedef struct { + LZ4F_blockSizeID_t blockSizeID; /* max64KB, max256KB, max1MB, max4MB; 0 == default (LZ4F_max64KB) */ + LZ4F_blockMode_t blockMode; /* LZ4F_blockLinked, LZ4F_blockIndependent; 0 == default (LZ4F_blockLinked) */ + LZ4F_contentChecksum_t contentChecksumFlag; /* 1: add a 32-bit checksum of frame's decompressed data; 0 == default (disabled) */ + LZ4F_frameType_t frameType; /* read-only field : LZ4F_frame or LZ4F_skippableFrame */ + unsigned long long contentSize; /* Size of uncompressed content ; 0 == unknown */ + unsigned dictID; /* Dictionary ID, sent by compressor to help decoder select correct dictionary; 0 == no dictID provided */ + LZ4F_blockChecksum_t blockChecksumFlag; /* 1: each block followed by a checksum of block's compressed data; 0 == default (disabled) */ +} LZ4F_frameInfo_t; + +#define LZ4F_INIT_FRAMEINFO { LZ4F_max64KB, LZ4F_blockLinked, LZ4F_noContentChecksum, LZ4F_frame, 0ULL, 0U, LZ4F_noBlockChecksum } /* v1.8.3+ */ + +/*! LZ4F_preferences_t : + * makes it possible to supply advanced compression instructions to streaming interface. + * Structure must be first init to 0, using memset() or LZ4F_INIT_PREFERENCES, + * setting all parameters to default. + * All reserved fields must be set to zero. */ +typedef struct { + LZ4F_frameInfo_t frameInfo; + int compressionLevel; /* 0: default (fast mode); values > LZ4HC_CLEVEL_MAX count as LZ4HC_CLEVEL_MAX; values < 0 trigger "fast acceleration" */ + unsigned autoFlush; /* 1: always flush; reduces usage of internal buffers */ + unsigned favorDecSpeed; /* 1: parser favors decompression speed vs compression ratio. Only works for high compression modes (>= LZ4HC_CLEVEL_OPT_MIN) */ /* v1.8.2+ */ + unsigned reserved[3]; /* must be zero for forward compatibility */ +} LZ4F_preferences_t; + +#define LZ4F_INIT_PREFERENCES { LZ4F_INIT_FRAMEINFO, 0, 0u, 0u, { 0u, 0u, 0u } } /* v1.8.3+ */ + + +/*-********************************* +* Simple compression function +***********************************/ + +/*! LZ4F_compressFrame() : + * Compress srcBuffer content into an LZ4-compressed frame. + * It's a one shot operation, all input content is consumed, and all output is generated. + * + * Note : it's a stateless operation (no LZ4F_cctx state needed). + * In order to reduce load on the allocator, LZ4F_compressFrame(), by default, + * uses the stack to allocate space for the compression state and some table. + * If this usage of the stack is too much for your application, + * consider compiling `lz4frame.c` with compile-time macro LZ4F_HEAPMODE set to 1 instead. + * All state allocations will use the Heap. + * It also means each invocation of LZ4F_compressFrame() will trigger several internal alloc/free invocations. + * + * @dstCapacity MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr). + * @preferencesPtr is optional : one can provide NULL, in which case all preferences are set to default. + * @return : number of bytes written into dstBuffer. + * or an error code if it fails (can be tested using LZ4F_isError()) + */ +LZ4FLIB_API size_t LZ4F_compressFrame(void* dstBuffer, size_t dstCapacity, + const void* srcBuffer, size_t srcSize, + const LZ4F_preferences_t* preferencesPtr); + +/*! LZ4F_compressFrameBound() : + * Returns the maximum possible compressed size with LZ4F_compressFrame() given srcSize and preferences. + * `preferencesPtr` is optional. It can be replaced by NULL, in which case, the function will assume default preferences. + * Note : this result is only usable with LZ4F_compressFrame(). + * It may also be relevant to LZ4F_compressUpdate() _only if_ no flush() operation is ever performed. + */ +LZ4FLIB_API size_t LZ4F_compressFrameBound(size_t srcSize, const LZ4F_preferences_t* preferencesPtr); + + +/*! LZ4F_compressionLevel_max() : + * @return maximum allowed compression level (currently: 12) + */ +LZ4FLIB_API int LZ4F_compressionLevel_max(void); /* v1.8.0+ */ + + +/*-*********************************** +* Advanced compression functions +*************************************/ +typedef struct LZ4F_cctx_s LZ4F_cctx; /* incomplete type */ +typedef LZ4F_cctx* LZ4F_compressionContext_t; /* for compatibility with older APIs, prefer using LZ4F_cctx */ + +typedef struct { + unsigned stableSrc; /* 1 == src content will remain present on future calls to LZ4F_compress(); skip copying src content within tmp buffer */ + unsigned reserved[3]; +} LZ4F_compressOptions_t; + +/*--- Resource Management ---*/ + +#define LZ4F_VERSION 100 /* This number can be used to check for an incompatible API breaking change */ +LZ4FLIB_API unsigned LZ4F_getVersion(void); + +/*! LZ4F_createCompressionContext() : + * The first thing to do is to create a compressionContext object, + * which will keep track of operation state during streaming compression. + * This is achieved using LZ4F_createCompressionContext(), which takes as argument a version, + * and a pointer to LZ4F_cctx*, to write the resulting pointer into. + * @version provided MUST be LZ4F_VERSION. It is intended to track potential version mismatch, notably when using DLL. + * The function provides a pointer to a fully allocated LZ4F_cctx object. + * @cctxPtr MUST be != NULL. + * If @return != zero, context creation failed. + * A created compression context can be employed multiple times for consecutive streaming operations. + * Once all streaming compression jobs are completed, + * the state object can be released using LZ4F_freeCompressionContext(). + * Note1 : LZ4F_freeCompressionContext() is always successful. Its return value can be ignored. + * Note2 : LZ4F_freeCompressionContext() works fine with NULL input pointers (do nothing). +**/ +LZ4FLIB_API LZ4F_errorCode_t LZ4F_createCompressionContext(LZ4F_cctx** cctxPtr, unsigned version); +LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeCompressionContext(LZ4F_cctx* cctx); + + +/*---- Compression ----*/ + +#define LZ4F_HEADER_SIZE_MIN 7 /* LZ4 Frame header size can vary, depending on selected parameters */ +#define LZ4F_HEADER_SIZE_MAX 19 + +/* Size in bytes of a block header in little-endian format. Highest bit indicates if block data is uncompressed */ +#define LZ4F_BLOCK_HEADER_SIZE 4 + +/* Size in bytes of a block checksum footer in little-endian format. */ +#define LZ4F_BLOCK_CHECKSUM_SIZE 4 + +/* Size in bytes of the content checksum. */ +#define LZ4F_CONTENT_CHECKSUM_SIZE 4 + +/*! LZ4F_compressBegin() : + * will write the frame header into dstBuffer. + * dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes. + * `prefsPtr` is optional : NULL can be provided to set all preferences to default. + * @return : number of bytes written into dstBuffer for the header + * or an error code (which can be tested using LZ4F_isError()) + */ +LZ4FLIB_API size_t LZ4F_compressBegin(LZ4F_cctx* cctx, + void* dstBuffer, size_t dstCapacity, + const LZ4F_preferences_t* prefsPtr); + +/*! LZ4F_compressBound() : + * Provides minimum dstCapacity required to guarantee success of + * LZ4F_compressUpdate(), given a srcSize and preferences, for a worst case scenario. + * When srcSize==0, LZ4F_compressBound() provides an upper bound for LZ4F_flush() and LZ4F_compressEnd() instead. + * Note that the result is only valid for a single invocation of LZ4F_compressUpdate(). + * When invoking LZ4F_compressUpdate() multiple times, + * if the output buffer is gradually filled up instead of emptied and re-used from its start, + * one must check if there is enough remaining capacity before each invocation, using LZ4F_compressBound(). + * @return is always the same for a srcSize and prefsPtr. + * prefsPtr is optional : when NULL is provided, preferences will be set to cover worst case scenario. + * tech details : + * @return if automatic flushing is not enabled, includes the possibility that internal buffer might already be filled by up to (blockSize-1) bytes. + * It also includes frame footer (ending + checksum), since it might be generated by LZ4F_compressEnd(). + * @return doesn't include frame header, as it was already generated by LZ4F_compressBegin(). + */ +LZ4FLIB_API size_t LZ4F_compressBound(size_t srcSize, const LZ4F_preferences_t* prefsPtr); + +/*! LZ4F_compressUpdate() : + * LZ4F_compressUpdate() can be called repetitively to compress as much data as necessary. + * Important rule: dstCapacity MUST be large enough to ensure operation success even in worst case situations. + * This value is provided by LZ4F_compressBound(). + * If this condition is not respected, LZ4F_compress() will fail (result is an errorCode). + * After an error, the state is left in a UB state, and must be re-initialized or freed. + * If previously an uncompressed block was written, buffered data is flushed + * before appending compressed data is continued. + * `cOptPtr` is optional : NULL can be provided, in which case all options are set to default. + * @return : number of bytes written into `dstBuffer` (it can be zero, meaning input data was just buffered). + * or an error code if it fails (which can be tested using LZ4F_isError()) + */ +LZ4FLIB_API size_t LZ4F_compressUpdate(LZ4F_cctx* cctx, + void* dstBuffer, size_t dstCapacity, + const void* srcBuffer, size_t srcSize, + const LZ4F_compressOptions_t* cOptPtr); + +/*! LZ4F_flush() : + * When data must be generated and sent immediately, without waiting for a block to be completely filled, + * it's possible to call LZ4_flush(). It will immediately compress any data buffered within cctx. + * `dstCapacity` must be large enough to ensure the operation will be successful. + * `cOptPtr` is optional : it's possible to provide NULL, all options will be set to default. + * @return : nb of bytes written into dstBuffer (can be zero, when there is no data stored within cctx) + * or an error code if it fails (which can be tested using LZ4F_isError()) + * Note : LZ4F_flush() is guaranteed to be successful when dstCapacity >= LZ4F_compressBound(0, prefsPtr). + */ +LZ4FLIB_API size_t LZ4F_flush(LZ4F_cctx* cctx, + void* dstBuffer, size_t dstCapacity, + const LZ4F_compressOptions_t* cOptPtr); + +/*! LZ4F_compressEnd() : + * To properly finish an LZ4 frame, invoke LZ4F_compressEnd(). + * It will flush whatever data remained within `cctx` (like LZ4_flush()) + * and properly finalize the frame, with an endMark and a checksum. + * `cOptPtr` is optional : NULL can be provided, in which case all options will be set to default. + * @return : nb of bytes written into dstBuffer, necessarily >= 4 (endMark), + * or an error code if it fails (which can be tested using LZ4F_isError()) + * Note : LZ4F_compressEnd() is guaranteed to be successful when dstCapacity >= LZ4F_compressBound(0, prefsPtr). + * A successful call to LZ4F_compressEnd() makes `cctx` available again for another compression task. + */ +LZ4FLIB_API size_t LZ4F_compressEnd(LZ4F_cctx* cctx, + void* dstBuffer, size_t dstCapacity, + const LZ4F_compressOptions_t* cOptPtr); + + +/*-********************************* +* Decompression functions +***********************************/ +typedef struct LZ4F_dctx_s LZ4F_dctx; /* incomplete type */ +typedef LZ4F_dctx* LZ4F_decompressionContext_t; /* compatibility with previous API versions */ + +typedef struct { + unsigned stableDst; /* pledges that last 64KB decompressed data is present right before @dstBuffer pointer. + * This optimization skips internal storage operations. + * Once set, this pledge must remain valid up to the end of current frame. */ + unsigned skipChecksums; /* disable checksum calculation and verification, even when one is present in frame, to save CPU time. + * Setting this option to 1 once disables all checksums for the rest of the frame. */ + unsigned reserved1; /* must be set to zero for forward compatibility */ + unsigned reserved0; /* idem */ +} LZ4F_decompressOptions_t; + + +/* Resource management */ + +/*! LZ4F_createDecompressionContext() : + * Create an LZ4F_dctx object, to track all decompression operations. + * @version provided MUST be LZ4F_VERSION. + * @dctxPtr MUST be valid. + * The function fills @dctxPtr with the value of a pointer to an allocated and initialized LZ4F_dctx object. + * The @return is an errorCode, which can be tested using LZ4F_isError(). + * dctx memory can be released using LZ4F_freeDecompressionContext(); + * Result of LZ4F_freeDecompressionContext() indicates current state of decompressionContext when being released. + * That is, it should be == 0 if decompression has been completed fully and correctly. + */ +LZ4FLIB_API LZ4F_errorCode_t LZ4F_createDecompressionContext(LZ4F_dctx** dctxPtr, unsigned version); +LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* dctx); + + +/*-*********************************** +* Streaming decompression functions +*************************************/ + +#define LZ4F_MAGICNUMBER 0x184D2204U +#define LZ4F_MAGIC_SKIPPABLE_START 0x184D2A50U +#define LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH 5 + +/*! LZ4F_headerSize() : v1.9.0+ + * Provide the header size of a frame starting at `src`. + * `srcSize` must be >= LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH, + * which is enough to decode the header length. + * @return : size of frame header + * or an error code, which can be tested using LZ4F_isError() + * note : Frame header size is variable, but is guaranteed to be + * >= LZ4F_HEADER_SIZE_MIN bytes, and <= LZ4F_HEADER_SIZE_MAX bytes. + */ +LZ4FLIB_API size_t LZ4F_headerSize(const void* src, size_t srcSize); + +/*! LZ4F_getFrameInfo() : + * This function extracts frame parameters (max blockSize, dictID, etc.). + * Its usage is optional: user can also invoke LZ4F_decompress() directly. + * + * Extracted information will fill an existing LZ4F_frameInfo_t structure. + * This can be useful for allocation and dictionary identification purposes. + * + * LZ4F_getFrameInfo() can work in the following situations : + * + * 1) At the beginning of a new frame, before any invocation of LZ4F_decompress(). + * It will decode header from `srcBuffer`, + * consuming the header and starting the decoding process. + * + * Input size must be large enough to contain the full frame header. + * Frame header size can be known beforehand by LZ4F_headerSize(). + * Frame header size is variable, but is guaranteed to be >= LZ4F_HEADER_SIZE_MIN bytes, + * and not more than <= LZ4F_HEADER_SIZE_MAX bytes. + * Hence, blindly providing LZ4F_HEADER_SIZE_MAX bytes or more will always work. + * It's allowed to provide more input data than the header size, + * LZ4F_getFrameInfo() will only consume the header. + * + * If input size is not large enough, + * aka if it's smaller than header size, + * function will fail and return an error code. + * + * 2) After decoding has been started, + * it's possible to invoke LZ4F_getFrameInfo() anytime + * to extract already decoded frame parameters stored within dctx. + * + * Note that, if decoding has barely started, + * and not yet read enough information to decode the header, + * LZ4F_getFrameInfo() will fail. + * + * The number of bytes consumed from srcBuffer will be updated in *srcSizePtr (necessarily <= original value). + * LZ4F_getFrameInfo() only consumes bytes when decoding has not yet started, + * and when decoding the header has been successful. + * Decompression must then resume from (srcBuffer + *srcSizePtr). + * + * @return : a hint about how many srcSize bytes LZ4F_decompress() expects for next call, + * or an error code which can be tested using LZ4F_isError(). + * note 1 : in case of error, dctx is not modified. Decoding operation can resume from beginning safely. + * note 2 : frame parameters are *copied into* an already allocated LZ4F_frameInfo_t structure. + */ +LZ4FLIB_API size_t +LZ4F_getFrameInfo(LZ4F_dctx* dctx, + LZ4F_frameInfo_t* frameInfoPtr, + const void* srcBuffer, size_t* srcSizePtr); + +/*! LZ4F_decompress() : + * Call this function repetitively to regenerate data compressed in `srcBuffer`. + * + * The function requires a valid dctx state. + * It will read up to *srcSizePtr bytes from srcBuffer, + * and decompress data into dstBuffer, of capacity *dstSizePtr. + * + * The nb of bytes consumed from srcBuffer will be written into *srcSizePtr (necessarily <= original value). + * The nb of bytes decompressed into dstBuffer will be written into *dstSizePtr (necessarily <= original value). + * + * The function does not necessarily read all input bytes, so always check value in *srcSizePtr. + * Unconsumed source data must be presented again in subsequent invocations. + * + * `dstBuffer` can freely change between each consecutive function invocation. + * `dstBuffer` content will be overwritten. + * + * Note: if `LZ4F_getFrameInfo()` is called before `LZ4F_decompress()`, srcBuffer must be updated to reflect + * the number of bytes consumed after reading the frame header. Failure to update srcBuffer before calling + * `LZ4F_decompress()` will cause decompression failure or, even worse, successful but incorrect decompression. + * See the `LZ4F_getFrameInfo()` docs for details. + * + * @return : an hint of how many `srcSize` bytes LZ4F_decompress() expects for next call. + * Schematically, it's the size of the current (or remaining) compressed block + header of next block. + * Respecting the hint provides some small speed benefit, because it skips intermediate buffers. + * This is just a hint though, it's always possible to provide any srcSize. + * + * When a frame is fully decoded, @return will be 0 (no more data expected). + * When provided with more bytes than necessary to decode a frame, + * LZ4F_decompress() will stop reading exactly at end of current frame, and @return 0. + * + * If decompression failed, @return is an error code, which can be tested using LZ4F_isError(). + * After a decompression error, the `dctx` context is not resumable. + * Use LZ4F_resetDecompressionContext() to return to clean state. + * + * After a frame is fully decoded, dctx can be used again to decompress another frame. + */ +LZ4FLIB_API size_t +LZ4F_decompress(LZ4F_dctx* dctx, + void* dstBuffer, size_t* dstSizePtr, + const void* srcBuffer, size_t* srcSizePtr, + const LZ4F_decompressOptions_t* dOptPtr); + + +/*! LZ4F_resetDecompressionContext() : added in v1.8.0 + * In case of an error, the context is left in "undefined" state. + * In which case, it's necessary to reset it, before re-using it. + * This method can also be used to abruptly stop any unfinished decompression, + * and start a new one using same context resources. */ +LZ4FLIB_API void LZ4F_resetDecompressionContext(LZ4F_dctx* dctx); /* always successful */ + + +/********************************** + * Dictionary compression API + *********************************/ + +/* A Dictionary is useful for the compression of small messages (KB range). + * It dramatically improves compression efficiency. + * + * LZ4 can ingest any input as dictionary, though only the last 64 KB are useful. + * Better results are generally achieved by using Zstandard's Dictionary Builder + * to generate a high-quality dictionary from a set of samples. + * + * The same dictionary will have to be used on the decompression side + * for decoding to be successful. + * To help identify the correct dictionary at decoding stage, + * the frame header allows optional embedding of a dictID field. + */ + +/*! LZ4F_compressBegin_usingDict() : stable since v1.10 + * Inits dictionary compression streaming, and writes the frame header into dstBuffer. + * @dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes. + * @prefsPtr is optional : one may provide NULL as argument, + * however, it's the only way to provide dictID in the frame header. + * @dictBuffer must outlive the compression session. + * @return : number of bytes written into dstBuffer for the header, + * or an error code (which can be tested using LZ4F_isError()) + * NOTE: The LZ4Frame spec allows each independent block to be compressed with the dictionary, + * but this entry supports a more limited scenario, where only the first block uses the dictionary. + * This is still useful for small data, which only need one block anyway. + * For larger inputs, one may be more interested in LZ4F_compressFrame_usingCDict() below. + */ +LZ4FLIB_API size_t +LZ4F_compressBegin_usingDict(LZ4F_cctx* cctx, + void* dstBuffer, size_t dstCapacity, + const void* dictBuffer, size_t dictSize, + const LZ4F_preferences_t* prefsPtr); + +/*! LZ4F_decompress_usingDict() : stable since v1.10 + * Same as LZ4F_decompress(), using a predefined dictionary. + * Dictionary is used "in place", without any preprocessing. +** It must remain accessible throughout the entire frame decoding. */ +LZ4FLIB_API size_t +LZ4F_decompress_usingDict(LZ4F_dctx* dctxPtr, + void* dstBuffer, size_t* dstSizePtr, + const void* srcBuffer, size_t* srcSizePtr, + const void* dict, size_t dictSize, + const LZ4F_decompressOptions_t* decompressOptionsPtr); + +/***************************************** + * Bulk processing dictionary compression + *****************************************/ + +/* Loading a dictionary has a cost, since it involves construction of tables. + * The Bulk processing dictionary API makes it possible to share this cost + * over an arbitrary number of compression jobs, even concurrently, + * markedly improving compression latency for these cases. + * + * Note that there is no corresponding bulk API for the decompression side, + * because dictionary does not carry any initialization cost for decompression. + * Use the regular LZ4F_decompress_usingDict() there. + */ +typedef struct LZ4F_CDict_s LZ4F_CDict; + +/*! LZ4_createCDict() : stable since v1.10 + * When compressing multiple messages / blocks using the same dictionary, it's recommended to initialize it just once. + * LZ4_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay. + * LZ4_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. + * @dictBuffer can be released after LZ4_CDict creation, since its content is copied within CDict. */ +LZ4FLIB_API LZ4F_CDict* LZ4F_createCDict(const void* dictBuffer, size_t dictSize); +LZ4FLIB_API void LZ4F_freeCDict(LZ4F_CDict* CDict); + +/*! LZ4_compressFrame_usingCDict() : stable since v1.10 + * Compress an entire srcBuffer into a valid LZ4 frame using a digested Dictionary. + * @cctx must point to a context created by LZ4F_createCompressionContext(). + * If @cdict==NULL, compress without a dictionary. + * @dstBuffer MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr). + * If this condition is not respected, function will fail (@return an errorCode). + * The LZ4F_preferences_t structure is optional : one may provide NULL as argument, + * but it's not recommended, as it's the only way to provide @dictID in the frame header. + * @return : number of bytes written into dstBuffer. + * or an error code if it fails (can be tested using LZ4F_isError()) + * Note: for larger inputs generating multiple independent blocks, + * this entry point uses the dictionary for each block. */ +LZ4FLIB_API size_t +LZ4F_compressFrame_usingCDict(LZ4F_cctx* cctx, + void* dst, size_t dstCapacity, + const void* src, size_t srcSize, + const LZ4F_CDict* cdict, + const LZ4F_preferences_t* preferencesPtr); + +/*! LZ4F_compressBegin_usingCDict() : stable since v1.10 + * Inits streaming dictionary compression, and writes the frame header into dstBuffer. + * @dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes. + * @prefsPtr is optional : one may provide NULL as argument, + * note however that it's the only way to insert a @dictID in the frame header. + * @cdict must outlive the compression session. + * @return : number of bytes written into dstBuffer for the header, + * or an error code, which can be tested using LZ4F_isError(). */ +LZ4FLIB_API size_t +LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctx, + void* dstBuffer, size_t dstCapacity, + const LZ4F_CDict* cdict, + const LZ4F_preferences_t* prefsPtr); + + +#if defined (__cplusplus) +} +#endif + +#endif /* LZ4F_H_09782039843 */ + +#if defined(LZ4F_STATIC_LINKING_ONLY) && !defined(LZ4F_H_STATIC_09782039843) +#define LZ4F_H_STATIC_09782039843 + +/* Note : + * The below declarations are not stable and may change in the future. + * They are therefore only safe to depend on + * when the caller is statically linked against the library. + * To access their declarations, define LZ4F_STATIC_LINKING_ONLY. + * + * By default, these symbols aren't published into shared/dynamic libraries. + * You can override this behavior and force them to be published + * by defining LZ4F_PUBLISH_STATIC_FUNCTIONS. + * Use at your own risk. + */ + +#if defined (__cplusplus) +extern "C" { +#endif + +#ifdef LZ4F_PUBLISH_STATIC_FUNCTIONS +# define LZ4FLIB_STATIC_API LZ4FLIB_API +#else +# define LZ4FLIB_STATIC_API +#endif + + +/* --- Error List --- */ +#define LZ4F_LIST_ERRORS(ITEM) \ + ITEM(OK_NoError) \ + ITEM(ERROR_GENERIC) \ + ITEM(ERROR_maxBlockSize_invalid) \ + ITEM(ERROR_blockMode_invalid) \ + ITEM(ERROR_parameter_invalid) \ + ITEM(ERROR_compressionLevel_invalid) \ + ITEM(ERROR_headerVersion_wrong) \ + ITEM(ERROR_blockChecksum_invalid) \ + ITEM(ERROR_reservedFlag_set) \ + ITEM(ERROR_allocation_failed) \ + ITEM(ERROR_srcSize_tooLarge) \ + ITEM(ERROR_dstMaxSize_tooSmall) \ + ITEM(ERROR_frameHeader_incomplete) \ + ITEM(ERROR_frameType_unknown) \ + ITEM(ERROR_frameSize_wrong) \ + ITEM(ERROR_srcPtr_wrong) \ + ITEM(ERROR_decompressionFailed) \ + ITEM(ERROR_headerChecksum_invalid) \ + ITEM(ERROR_contentChecksum_invalid) \ + ITEM(ERROR_frameDecoding_alreadyStarted) \ + ITEM(ERROR_compressionState_uninitialized) \ + ITEM(ERROR_parameter_null) \ + ITEM(ERROR_io_write) \ + ITEM(ERROR_io_read) \ + ITEM(ERROR_maxCode) + +#define LZ4F_GENERATE_ENUM(ENUM) LZ4F_##ENUM, + +/* enum list is exposed, to handle specific errors */ +typedef enum { LZ4F_LIST_ERRORS(LZ4F_GENERATE_ENUM) + _LZ4F_dummy_error_enum_for_c89_never_used } LZ4F_errorCodes; + +LZ4FLIB_STATIC_API LZ4F_errorCodes LZ4F_getErrorCode(size_t functionResult); + +/********************************** + * Advanced compression operations + *********************************/ + +/*! LZ4F_getBlockSize() : + * @return, in scalar format (size_t), + * the maximum block size associated with @blockSizeID, + * or an error code (can be tested using LZ4F_isError()) if @blockSizeID is invalid. +**/ +LZ4FLIB_STATIC_API size_t LZ4F_getBlockSize(LZ4F_blockSizeID_t blockSizeID); + +/*! LZ4F_uncompressedUpdate() : + * LZ4F_uncompressedUpdate() can be called repetitively to add data stored as uncompressed blocks. + * Important rule: dstCapacity MUST be large enough to store the entire source buffer as + * no compression is done for this operation + * If this condition is not respected, LZ4F_uncompressedUpdate() will fail (result is an errorCode). + * After an error, the state is left in a UB state, and must be re-initialized or freed. + * If previously a compressed block was written, buffered data is flushed first, + * before appending uncompressed data is continued. + * This operation is only supported when LZ4F_blockIndependent is used. + * `cOptPtr` is optional : NULL can be provided, in which case all options are set to default. + * @return : number of bytes written into `dstBuffer` (it can be zero, meaning input data was just buffered). + * or an error code if it fails (which can be tested using LZ4F_isError()) + */ +LZ4FLIB_STATIC_API size_t +LZ4F_uncompressedUpdate(LZ4F_cctx* cctx, + void* dstBuffer, size_t dstCapacity, + const void* srcBuffer, size_t srcSize, + const LZ4F_compressOptions_t* cOptPtr); + +/********************************** + * Custom memory allocation + *********************************/ + +/*! Custom memory allocation : v1.9.4+ + * These prototypes make it possible to pass custom allocation/free functions. + * LZ4F_customMem is provided at state creation time, using LZ4F_create*_advanced() listed below. + * All allocation/free operations will be completed using these custom variants instead of regular ones. + */ +typedef void* (*LZ4F_AllocFunction) (void* opaqueState, size_t size); +typedef void* (*LZ4F_CallocFunction) (void* opaqueState, size_t size); +typedef void (*LZ4F_FreeFunction) (void* opaqueState, void* address); +typedef struct { + LZ4F_AllocFunction customAlloc; + LZ4F_CallocFunction customCalloc; /* optional; when not defined, uses customAlloc + memset */ + LZ4F_FreeFunction customFree; + void* opaqueState; +} LZ4F_CustomMem; +static +#ifdef __GNUC__ +__attribute__((__unused__)) +#endif +LZ4F_CustomMem const LZ4F_defaultCMem = { NULL, NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ + +LZ4FLIB_STATIC_API LZ4F_cctx* LZ4F_createCompressionContext_advanced(LZ4F_CustomMem customMem, unsigned version); +LZ4FLIB_STATIC_API LZ4F_dctx* LZ4F_createDecompressionContext_advanced(LZ4F_CustomMem customMem, unsigned version); +LZ4FLIB_STATIC_API LZ4F_CDict* LZ4F_createCDict_advanced(LZ4F_CustomMem customMem, const void* dictBuffer, size_t dictSize); + + +#if defined (__cplusplus) +} +#endif + +#endif /* defined(LZ4F_STATIC_LINKING_ONLY) && !defined(LZ4F_H_STATIC_09782039843) */ diff --git a/vendor/compress/lz4/src/lz4hc.h b/vendor/compress/lz4/src/lz4hc.h new file mode 100644 index 000000000..992bc8cdd --- /dev/null +++ b/vendor/compress/lz4/src/lz4hc.h @@ -0,0 +1,414 @@ +/* + LZ4 HC - High Compression Mode of LZ4 + Header File + Copyright (C) 2011-2020, Yann Collet. + BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + You can contact the author at : + - LZ4 source repository : https://github.com/lz4/lz4 + - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c +*/ +#ifndef LZ4_HC_H_19834876238432 +#define LZ4_HC_H_19834876238432 + +#if defined (__cplusplus) +extern "C" { +#endif + +/* --- Dependency --- */ +/* note : lz4hc requires lz4.h/lz4.c for compilation */ +#include "lz4.h" /* stddef, LZ4LIB_API, LZ4_DEPRECATED */ + + +/* --- Useful constants --- */ +#define LZ4HC_CLEVEL_MIN 2 +#define LZ4HC_CLEVEL_DEFAULT 9 +#define LZ4HC_CLEVEL_OPT_MIN 10 +#define LZ4HC_CLEVEL_MAX 12 + + +/*-************************************ + * Block Compression + **************************************/ +/*! LZ4_compress_HC() : + * Compress data from `src` into `dst`, using the powerful but slower "HC" algorithm. + * `dst` must be already allocated. + * 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") + * `compressionLevel` : any value between 1 and LZ4HC_CLEVEL_MAX will work. + * Values > LZ4HC_CLEVEL_MAX behave the same as LZ4HC_CLEVEL_MAX. + * @return : the number of bytes written into 'dst' + * or 0 if compression fails. + */ +LZ4LIB_API int LZ4_compress_HC (const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel); + + +/* Note : + * Decompression functions are provided within "lz4.h" (BSD license) + */ + + +/*! LZ4_compress_HC_extStateHC() : + * Same as LZ4_compress_HC(), but using an externally allocated memory segment for `state`. + * `state` size is provided by LZ4_sizeofStateHC(). + * 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_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); + + +/*-************************************ + * Streaming Compression + * Bufferless synchronous API + **************************************/ + typedef union LZ4_streamHC_u LZ4_streamHC_t; /* incomplete type (defined later) */ + +/*! LZ4_createStreamHC() and LZ4_freeStreamHC() : + * These functions create and release memory for LZ4 HC streaming state. + * Newly created states are automatically initialized. + * A same state can be used multiple times consecutively, + * starting with LZ4_resetStreamHC_fast() to start a new stream of blocks. + */ +LZ4LIB_API LZ4_streamHC_t* LZ4_createStreamHC(void); +LZ4LIB_API int LZ4_freeStreamHC (LZ4_streamHC_t* streamHCPtr); + +/* + 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). + Note: In order for LZ4_loadDictHC() to create the correct data structure, + it is essential to set the compression level _before_ loading the dictionary. + + 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_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); + + +/*! LZ4_attach_HC_dictionary() : stable since v1.10.0 + * This API allows for the efficient re-use of a static dictionary many times. + * + * Rather than re-loading the dictionary buffer into a working context before + * each compression, or copying a pre-loaded dictionary's LZ4_streamHC_t into a + * working LZ4_streamHC_t, this function introduces a no-copy setup mechanism, + * in which the working stream references the dictionary stream in-place. + * + * Several assumptions are made about the state of the dictionary stream. + * Currently, only streams which have been prepared by LZ4_loadDictHC() should + * be expected to work. + * + * Alternatively, the provided dictionary stream pointer may be NULL, in which + * case any existing dictionary stream is unset. + * + * A dictionary should only be attached to a stream without any history (i.e., + * a stream that has just been reset). + * + * The dictionary will remain attached to the working stream only for the + * current stream session. Calls to LZ4_resetStreamHC(_fast) will remove the + * dictionary context association from the working stream. The dictionary + * stream (and source buffer) must remain in-place / accessible / unchanged + * 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); + + +/*^********************************************** + * !!!!!! STATIC LINKING ONLY !!!!!! + ***********************************************/ + +/*-****************************************************************** + * PRIVATE DEFINITIONS : + * Do not use these definitions directly. + * They are merely exposed to allow static allocation of `LZ4_streamHC_t`. + * 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_MAXD (1<= LZ4HC_CLEVEL_OPT_MIN. + */ +LZ4LIB_STATIC_API void LZ4_favorDecompressionSpeed( + LZ4_streamHC_t* LZ4_streamHCPtr, int favor); + +/*! LZ4_resetStreamHC_fast() : v1.9.0+ + * 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 + * 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_resetStreamHC()). + * + * LZ4_streamHCs are guaranteed to be in a valid state when: + * - returned from LZ4_createStreamHC() + * - reset by LZ4_resetStreamHC() + * - memset(stream, 0, sizeof(LZ4_streamHC_t)) + * - the stream was in a valid state and was reset by LZ4_resetStreamHC_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 (LZ4_compress_HC_extStateHC()) and that + * 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. + */ +LZ4LIB_STATIC_API void LZ4_resetStreamHC_fast( + LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLevel); + +/*! LZ4_compress_HC_extStateHC_fastReset() : + * A variant of LZ4_compress_HC_extStateHC(). + * + * Using this variant avoids an expensive initialization step. It is only safe + * to call if the state buffer is known to be correctly initialized already + * (see above comment on LZ4_resetStreamHC_fast() for a definition of + * "correctly initialized"). From a high level, the difference is that this + * function initializes the provided state with a call to + * LZ4_resetStreamHC_fast() while LZ4_compress_HC_extStateHC() starts with a + * call to LZ4_resetStreamHC(). + */ +LZ4LIB_STATIC_API int LZ4_compress_HC_extStateHC_fastReset ( + void* state, + const char* src, char* dst, + int srcSize, int dstCapacity, + int compressionLevel); + +#if defined (__cplusplus) +} +#endif + +#endif /* LZ4_HC_SLO_098092834 */ +#endif /* LZ4_HC_STATIC_LINKING_ONLY */