2014-08-18 16:32:19 +00:00
/*
2014-08-19 15:09:07 +00:00
LZ4 auto - framing library
2014-08-18 16:32:19 +00:00
Header File
2014-12-01 21:00:07 +00:00
Copyright ( C ) 2011 - 2015 , Yann Collet .
2014-08-18 16:32:19 +00:00
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 : http : //code.google.com/p/lz4/
2014-12-01 21:00:07 +00:00
- LZ4 source mirror : https : //github.com/Cyan4973/lz4
2014-08-18 16:32:19 +00:00
- LZ4 public forum : https : //groups.google.com/forum/#!forum/lz4c
*/
2014-08-27 08:14:17 +00:00
/* LZ4F is a stand-alone API to create LZ4-compressed frames
* fully conformant to specification v1 .4 .1 .
* All related operations , including memory management , are handled by the library .
* You don ' t need lz4 . h when using lz4frame . h .
* */
2014-09-01 21:44:02 +00:00
2014-08-18 16:32:19 +00:00
# pragma once
# if defined (__cplusplus)
extern " C " {
# endif
2014-09-10 12:53:42 +00:00
/****************************************
Note : experimental API .
2014-12-01 21:00:07 +00:00
Not yet integrated within liblz4
2014-09-10 12:53:42 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-08-18 16:32:19 +00:00
2014-08-29 15:35:13 +00:00
/**************************************
Includes
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
# include <stddef.h> /* size_t */
2014-08-19 15:09:07 +00:00
/**************************************
2014-12-01 21:00:07 +00:00
* Error management
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-08-29 09:15:04 +00:00
typedef size_t LZ4F_errorCode_t ;
2014-09-21 08:56:21 +00:00
# define LZ4F_LIST_ERRORS(ITEM) \
ITEM ( OK_NoError ) ITEM ( ERROR_GENERIC ) \
ITEM ( ERROR_maxBlockSize_invalid ) ITEM ( ERROR_blockMode_invalid ) ITEM ( ERROR_contentChecksumFlag_invalid ) \
ITEM ( ERROR_compressionLevel_invalid ) \
ITEM ( ERROR_allocation_failed ) \
ITEM ( ERROR_srcSize_tooLarge ) ITEM ( ERROR_dstMaxSize_tooSmall ) \
ITEM ( ERROR_decompressionFailed ) \
ITEM ( ERROR_checksum_invalid ) \
ITEM ( ERROR_maxCode )
# define LZ4F_GENERATE_ENUM(ENUM) ENUM,
2014-10-27 23:39:06 +00:00
typedef enum { LZ4F_LIST_ERRORS ( LZ4F_GENERATE_ENUM ) } LZ4F_errorCodes ; /* enum is exposed, to detect & handle specific errors; compare function result to -enum value */
2014-08-29 09:15:04 +00:00
2014-12-01 21:00:07 +00:00
int LZ4F_isError ( LZ4F_errorCode_t code ) ; /* Basically : code > -ERROR_maxCode */
const char * LZ4F_getErrorName ( LZ4F_errorCode_t code ) ; /* return error code string; useful for debugging */
2014-08-19 15:09:07 +00:00
2014-08-18 16:32:19 +00:00
/**************************************
2014-12-01 21:00:07 +00:00
* Frame compression types
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-08-18 16:32:19 +00:00
2014-12-01 21:00:07 +00:00
typedef enum { LZ4F_default = 0 , max64KB = 4 , max256KB = 5 , max1MB = 6 , max4MB = 7 } blockSizeID_t ;
2014-09-03 18:49:59 +00:00
typedef enum { blockLinked = 0 , blockIndependent } blockMode_t ;
2014-09-04 21:56:51 +00:00
typedef enum { noContentChecksum = 0 , contentChecksumEnabled } contentChecksum_t ;
2014-08-18 16:32:19 +00:00
typedef struct {
2014-08-30 17:14:44 +00:00
blockSizeID_t blockSizeID ; /* max64KB, max256KB, max1MB, max4MB ; 0 == default */
blockMode_t blockMode ; /* blockLinked, blockIndependent ; 0 == default */
2014-09-10 12:53:42 +00:00
contentChecksum_t contentChecksumFlag ; /* noContentChecksum, contentChecksumEnabled ; 0 == default */
2014-09-13 09:08:55 +00:00
unsigned reserved [ 5 ] ;
2014-08-29 09:15:04 +00:00
} LZ4F_frameInfo_t ;
typedef struct {
2014-08-29 15:35:13 +00:00
LZ4F_frameInfo_t frameInfo ;
2014-12-01 21:00:07 +00:00
unsigned compressionLevel ; /* 0 == default (fast mode); values above 16 count as 16 */
unsigned autoFlush ; /* 1 == always flush : reduce need for tmp buffer */
2014-09-05 14:50:06 +00:00
unsigned reserved [ 4 ] ;
2014-08-18 16:32:19 +00:00
} LZ4F_preferences_t ;
2014-08-25 23:56:54 +00:00
2014-08-30 17:14:44 +00:00
/***********************************
2014-08-27 08:14:17 +00:00
* Simple compression function
2014-08-25 23:56:54 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-09-12 18:28:44 +00:00
size_t LZ4F_compressFrameBound ( size_t srcSize , const LZ4F_preferences_t * preferencesPtr ) ;
2014-08-25 23:56:54 +00:00
2014-08-29 15:35:13 +00:00
size_t LZ4F_compressFrame ( void * dstBuffer , size_t dstMaxSize , const void * srcBuffer , size_t srcSize , const LZ4F_preferences_t * preferencesPtr ) ;
2014-08-25 23:56:54 +00:00
/* LZ4F_compressFrame()
* Compress an entire srcBuffer into a valid LZ4 frame , as defined by specification v1 .4 .1 , in a single step .
* The most important rule is that dstBuffer MUST be large enough ( dstMaxSize ) to ensure compression completion even in worst case .
* You can get the minimum value of dstMaxSize by using LZ4F_compressFrameBound ( )
* If this condition is not respected , LZ4F_compressFrame ( ) will fail ( result is an errorCode )
* The LZ4F_preferences_t structure is optional : you can provide NULL as argument . All preferences will be set to default .
* The result of the function is the number of bytes written into dstBuffer .
* The function outputs an error code if it fails ( can be tested using LZ4F_isError ( ) )
*/
/**********************************
2014-09-01 21:44:02 +00:00
* Advanced compression functions
2014-12-01 21:00:07 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-08-25 23:56:54 +00:00
typedef void * LZ4F_compressionContext_t ;
2014-08-19 16:24:37 +00:00
typedef struct {
2014-09-13 09:08:55 +00:00
unsigned stableSrc ; /* 1 == src content will remain available on future calls to LZ4F_compress(); avoid saving src content within tmp buffer as future dictionary */
unsigned reserved [ 3 ] ;
2014-08-19 16:24:37 +00:00
} LZ4F_compressOptions_t ;
2014-08-18 16:32:19 +00:00
2014-08-23 13:06:56 +00:00
/* Resource Management */
# define LZ4F_VERSION 100
2014-09-07 11:57:09 +00:00
LZ4F_errorCode_t LZ4F_createCompressionContext ( LZ4F_compressionContext_t * LZ4F_compressionContextPtr , unsigned version ) ;
2014-08-25 23:56:54 +00:00
LZ4F_errorCode_t LZ4F_freeCompressionContext ( LZ4F_compressionContext_t LZ4F_compressionContext ) ;
2014-08-23 13:06:56 +00:00
/* LZ4F_createCompressionContext() :
* The first thing to do is to create a compressionContext object , which will be used in all compression operations .
* This is achieved using LZ4F_createCompressionContext ( ) , which takes as argument a version and an LZ4F_preferences_t structure .
2014-08-25 23:56:54 +00:00
* The version provided MUST be LZ4F_VERSION . It is intended to track potential version differences between different binaries .
* The function will provide a pointer to a fully allocated LZ4F_compressionContext_t object .
* If the result LZ4F_errorCode_t is not zero , there was an error during context creation .
2014-08-23 13:06:56 +00:00
* Object can release its memory using LZ4F_freeCompressionContext ( ) ;
*/
/* Compression */
2014-09-07 11:57:09 +00:00
size_t LZ4F_compressBegin ( LZ4F_compressionContext_t compressionContext , void * dstBuffer , size_t dstMaxSize , const LZ4F_preferences_t * preferencesPtr ) ;
2014-08-23 13:06:56 +00:00
/* LZ4F_compressBegin() :
* will write the frame header into dstBuffer .
2014-09-07 11:57:09 +00:00
* dstBuffer must be large enough to accommodate a header ( dstMaxSize ) . Maximum header size is 19 bytes .
* The LZ4F_preferences_t structure is optional : you can provide NULL as argument , all preferences will then be set to default .
2014-08-23 13:06:56 +00:00
* The result of the function is the number of bytes written into dstBuffer for the header
* or an error code ( can be tested using LZ4F_isError ( ) )
2014-08-19 16:24:37 +00:00
*/
2014-09-10 21:17:03 +00:00
size_t LZ4F_compressBound ( size_t srcSize , const LZ4F_preferences_t * preferencesPtr ) ;
/* LZ4F_compressBound() :
* Provides the minimum size of Dst buffer given srcSize to handle worst case situations .
* preferencesPtr is optional : you can provide NULL as argument , all preferences will then be set to default .
2014-12-01 21:00:07 +00:00
* Note that different preferences will produce in different results .
2014-08-28 09:14:33 +00:00
*/
2014-09-12 18:28:44 +00:00
size_t LZ4F_compressUpdate ( LZ4F_compressionContext_t compressionContext , void * dstBuffer , size_t dstMaxSize , const void * srcBuffer , size_t srcSize , const LZ4F_compressOptions_t * compressOptionsPtr ) ;
/* LZ4F_compressUpdate()
* LZ4F_compressUpdate ( ) can be called repetitively to compress as much data as necessary .
2014-08-23 13:06:56 +00:00
* The most important rule is that dstBuffer MUST be large enough ( dstMaxSize ) to ensure compression completion even in worst case .
2014-08-19 16:24:37 +00:00
* If this condition is not respected , LZ4F_compress ( ) will fail ( result is an errorCode )
2014-09-12 18:28:44 +00:00
* You can get the minimum value of dstMaxSize by using LZ4F_compressBound ( )
2014-08-19 16:24:37 +00:00
* The LZ4F_compressOptions_t structure is optional : you can provide NULL as argument .
2014-09-12 18:28:44 +00:00
* The result of the function is the number of bytes written into dstBuffer : it can be zero , meaning input data was just buffered .
2014-08-19 16:24:37 +00:00
* The function outputs an error code if it fails ( can be tested using LZ4F_isError ( ) )
*/
2014-09-01 21:44:02 +00:00
2014-08-29 15:35:13 +00:00
size_t LZ4F_flush ( LZ4F_compressionContext_t compressionContext , void * dstBuffer , size_t dstMaxSize , const LZ4F_compressOptions_t * compressOptionsPtr ) ;
2014-08-19 16:24:37 +00:00
/* LZ4F_flush()
* Should you need to create compressed data immediately , without waiting for a block to be filled ,
2014-09-12 18:28:44 +00:00
* you can call LZ4_flush ( ) , which will immediately compress any remaining data buffered within compressionContext .
2014-09-07 11:57:09 +00:00
* The LZ4F_compressOptions_t structure is optional : you can provide NULL as argument .
2014-09-01 21:44:02 +00:00
* The result of the function is the number of bytes written into dstBuffer
2014-08-23 13:06:56 +00:00
* ( it can be zero , this means there was no data left within compressionContext )
2014-08-19 16:24:37 +00:00
* The function outputs an error code if it fails ( can be tested using LZ4F_isError ( ) )
*/
2014-09-01 21:44:02 +00:00
2014-08-29 15:35:13 +00:00
size_t LZ4F_compressEnd ( LZ4F_compressionContext_t compressionContext , void * dstBuffer , size_t dstMaxSize , const LZ4F_compressOptions_t * compressOptionsPtr ) ;
2014-08-19 16:24:37 +00:00
/* LZ4F_compressEnd()
* When you want to properly finish the compressed frame , just call LZ4F_compressEnd ( ) .
* It will flush whatever data remained within compressionContext ( like LZ4_flush ( ) )
* but also properly finalize the frame , with an endMark and a checksum .
* The result of the function is the number of bytes written into dstBuffer ( necessarily > = 4 ( endMark size ) )
* The function outputs an error code if it fails ( can be tested using LZ4F_isError ( ) )
* The LZ4F_compressOptions_t structure is optional : you can provide NULL as argument .
2014-09-14 23:59:30 +00:00
* compressionContext can then be used again , starting with LZ4F_compressBegin ( ) .
2014-08-19 16:24:37 +00:00
*/
2014-08-18 16:32:19 +00:00
2014-09-01 21:44:02 +00:00
/***********************************
* Decompression functions
2014-08-26 09:27:45 +00:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
typedef void * LZ4F_decompressionContext_t ;
typedef struct {
2014-11-30 16:59:31 +00:00
unsigned stableDst ; /* guarantee that decompressed data will still be there on next function calls (avoid storage into tmp buffers) */
2014-09-13 09:08:55 +00:00
unsigned reserved [ 3 ] ;
2014-08-26 09:27:45 +00:00
} LZ4F_decompressOptions_t ;
2014-12-06 16:10:54 +00:00
2014-08-27 08:14:17 +00:00
/* Resource management */
2014-12-01 21:00:07 +00:00
LZ4F_errorCode_t LZ4F_createDecompressionContext ( LZ4F_decompressionContext_t * ctxPtr , unsigned version ) ;
LZ4F_errorCode_t LZ4F_freeDecompressionContext ( LZ4F_decompressionContext_t ctx ) ;
2014-08-27 08:14:17 +00:00
/* LZ4F_createDecompressionContext() :
* The first thing to do is to create a decompressionContext object , which will be used in all decompression operations .
* This is achieved using LZ4F_createDecompressionContext ( ) .
2014-12-01 21:00:07 +00:00
* The version provided MUST be LZ4F_VERSION . It is intended to track potential version differences between different binaries .
* The function will provide a pointer to a fully allocated and initialized LZ4F_decompressionContext_t object .
2014-09-13 11:15:54 +00:00
* If the result LZ4F_errorCode_t is not OK_NoError , there was an error during context creation .
2014-08-27 08:14:17 +00:00
* Object can release its memory using LZ4F_freeDecompressionContext ( ) ;
*/
2014-09-01 21:44:02 +00:00
2014-12-06 16:10:54 +00:00
2014-08-28 09:14:33 +00:00
/* Decompression */
2014-08-27 08:14:17 +00:00
2014-12-01 21:00:07 +00:00
size_t LZ4F_getFrameInfo ( LZ4F_decompressionContext_t ctx ,
LZ4F_frameInfo_t * frameInfoPtr ,
const void * srcBuffer , size_t * srcSizePtr ) ;
2014-08-29 09:15:04 +00:00
/* LZ4F_getFrameInfo()
* This function decodes frame header information , such as blockSize .
* It is optional : you could start by calling directly LZ4F_decompress ( ) instead .
2014-08-28 09:14:33 +00:00
* The objective is to extract header information without starting decompression , typically for allocation purposes .
2014-08-29 09:15:04 +00:00
* LZ4F_getFrameInfo ( ) can also be used * after * starting decompression , on a valid LZ4F_decompressionContext_t .
2014-09-12 18:28:44 +00:00
* The number of bytes read from srcBuffer will be provided within * srcSizePtr ( necessarily < = original value ) .
2014-09-13 13:40:35 +00:00
* You are expected to resume decompression from where it stopped ( srcBuffer + * srcSizePtr )
2014-12-06 16:10:54 +00:00
* The function result is an hint of how many srcSize bytes LZ4F_decompress ( ) expects for next call ,
2014-09-13 13:40:35 +00:00
* or an error code which can be tested using LZ4F_isError ( ) .
2014-08-27 08:14:17 +00:00
*/
2014-12-01 21:00:07 +00:00
size_t LZ4F_decompress ( LZ4F_decompressionContext_t ctx ,
void * dstBuffer , size_t * dstSizePtr ,
const void * srcBuffer , size_t * srcSizePtr ,
const LZ4F_decompressOptions_t * optionsPtr ) ;
2014-08-26 09:27:45 +00:00
/* LZ4F_decompress()
2014-08-28 09:14:33 +00:00
* Call this function repetitively to regenerate data compressed within srcBuffer .
2014-09-04 21:56:51 +00:00
* The function will attempt to decode * srcSizePtr bytes from srcBuffer , into dstBuffer of maximum size * dstSizePtr .
2014-08-26 09:27:45 +00:00
*
2014-09-13 11:15:54 +00:00
* The number of bytes regenerated into dstBuffer will be provided within * dstSizePtr ( necessarily < = original value ) .
2014-09-01 21:44:02 +00:00
*
2014-12-06 16:10:54 +00:00
* The number of bytes read from srcBuffer will be provided within * srcSizePtr ( necessarily < = original value ) .
* If number of bytes read is < number of bytes provided , then decompression operation is not completed .
* It typically happens when dstBuffer is not large enough to contain all decoded data .
* LZ4F_decompress ( ) must be called again , starting from where it stopped ( srcBuffer + * srcSizePtr )
2014-09-04 21:56:51 +00:00
* The function will check this condition , and refuse to continue if it is not respected .
2014-09-01 21:44:02 +00:00
*
2014-12-06 16:10:54 +00:00
* dstBuffer is supposed to be flushed between each call to the function , since its content will be overwritten .
* dst arguments can be changed at will with each consecutive call to the function .
*
* The function result is 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 boost to performance , since it does skip intermediate buffers .
2014-12-01 21:00:07 +00:00
* This is just a hint , you can always provide any srcSize you want .
2014-12-06 16:10:54 +00:00
* When a frame is fully decoded , the function result will be 0. ( no more data expected )
* If decompression failed , function result is an error code , which can be tested using LZ4F_isError ( ) .
2014-08-26 09:27:45 +00:00
*/
2014-08-18 16:32:19 +00:00
# if defined (__cplusplus)
}
# endif