1*27162e4eSAndroid Build Coastguard Worker /* 2*27162e4eSAndroid Build Coastguard Worker LZ4F - LZ4-Frame library 3*27162e4eSAndroid Build Coastguard Worker Header File 4*27162e4eSAndroid Build Coastguard Worker Copyright (C) 2011-2020, Yann Collet. 5*27162e4eSAndroid Build Coastguard Worker BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php) 6*27162e4eSAndroid Build Coastguard Worker 7*27162e4eSAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without 8*27162e4eSAndroid Build Coastguard Worker modification, are permitted provided that the following conditions are 9*27162e4eSAndroid Build Coastguard Worker met: 10*27162e4eSAndroid Build Coastguard Worker 11*27162e4eSAndroid Build Coastguard Worker * Redistributions of source code must retain the above copyright 12*27162e4eSAndroid Build Coastguard Worker notice, this list of conditions and the following disclaimer. 13*27162e4eSAndroid Build Coastguard Worker * Redistributions in binary form must reproduce the above 14*27162e4eSAndroid Build Coastguard Worker copyright notice, this list of conditions and the following disclaimer 15*27162e4eSAndroid Build Coastguard Worker in the documentation and/or other materials provided with the 16*27162e4eSAndroid Build Coastguard Worker distribution. 17*27162e4eSAndroid Build Coastguard Worker 18*27162e4eSAndroid Build Coastguard Worker THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19*27162e4eSAndroid Build Coastguard Worker "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20*27162e4eSAndroid Build Coastguard Worker LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21*27162e4eSAndroid Build Coastguard Worker A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22*27162e4eSAndroid Build Coastguard Worker OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23*27162e4eSAndroid Build Coastguard Worker SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24*27162e4eSAndroid Build Coastguard Worker LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25*27162e4eSAndroid Build Coastguard Worker DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26*27162e4eSAndroid Build Coastguard Worker THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27*27162e4eSAndroid Build Coastguard Worker (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28*27162e4eSAndroid Build Coastguard Worker OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29*27162e4eSAndroid Build Coastguard Worker 30*27162e4eSAndroid Build Coastguard Worker You can contact the author at : 31*27162e4eSAndroid Build Coastguard Worker - LZ4 source repository : https://github.com/lz4/lz4 32*27162e4eSAndroid Build Coastguard Worker - LZ4 public forum : https://groups.google.com/forum/#!forum/lz4c 33*27162e4eSAndroid Build Coastguard Worker */ 34*27162e4eSAndroid Build Coastguard Worker 35*27162e4eSAndroid Build Coastguard Worker /* LZ4F is a stand-alone API able to create and decode LZ4 frames 36*27162e4eSAndroid Build Coastguard Worker * conformant with specification v1.6.1 in doc/lz4_Frame_format.md . 37*27162e4eSAndroid Build Coastguard Worker * Generated frames are compatible with `lz4` CLI. 38*27162e4eSAndroid Build Coastguard Worker * 39*27162e4eSAndroid Build Coastguard Worker * LZ4F also offers streaming capabilities. 40*27162e4eSAndroid Build Coastguard Worker * 41*27162e4eSAndroid Build Coastguard Worker * lz4.h is not required when using lz4frame.h, 42*27162e4eSAndroid Build Coastguard Worker * except to extract common constants such as LZ4_VERSION_NUMBER. 43*27162e4eSAndroid Build Coastguard Worker * */ 44*27162e4eSAndroid Build Coastguard Worker 45*27162e4eSAndroid Build Coastguard Worker #ifndef LZ4F_H_09782039843 46*27162e4eSAndroid Build Coastguard Worker #define LZ4F_H_09782039843 47*27162e4eSAndroid Build Coastguard Worker 48*27162e4eSAndroid Build Coastguard Worker #if defined (__cplusplus) 49*27162e4eSAndroid Build Coastguard Worker extern "C" { 50*27162e4eSAndroid Build Coastguard Worker #endif 51*27162e4eSAndroid Build Coastguard Worker 52*27162e4eSAndroid Build Coastguard Worker /* --- Dependency --- */ 53*27162e4eSAndroid Build Coastguard Worker #include <stddef.h> /* size_t */ 54*27162e4eSAndroid Build Coastguard Worker 55*27162e4eSAndroid Build Coastguard Worker 56*27162e4eSAndroid Build Coastguard Worker /** 57*27162e4eSAndroid Build Coastguard Worker * Introduction 58*27162e4eSAndroid Build Coastguard Worker * 59*27162e4eSAndroid Build Coastguard Worker * lz4frame.h implements LZ4 frame specification: see doc/lz4_Frame_format.md . 60*27162e4eSAndroid Build Coastguard Worker * LZ4 Frames are compatible with `lz4` CLI, 61*27162e4eSAndroid Build Coastguard Worker * and designed to be interoperable with any system. 62*27162e4eSAndroid Build Coastguard Worker **/ 63*27162e4eSAndroid Build Coastguard Worker 64*27162e4eSAndroid Build Coastguard Worker /*-*************************************************************** 65*27162e4eSAndroid Build Coastguard Worker * Compiler specifics 66*27162e4eSAndroid Build Coastguard Worker *****************************************************************/ 67*27162e4eSAndroid Build Coastguard Worker /* LZ4_DLL_EXPORT : 68*27162e4eSAndroid Build Coastguard Worker * Enable exporting of functions when building a Windows DLL 69*27162e4eSAndroid Build Coastguard Worker * LZ4FLIB_VISIBILITY : 70*27162e4eSAndroid Build Coastguard Worker * Control library symbols visibility. 71*27162e4eSAndroid Build Coastguard Worker */ 72*27162e4eSAndroid Build Coastguard Worker #ifndef LZ4FLIB_VISIBILITY 73*27162e4eSAndroid Build Coastguard Worker # if defined(__GNUC__) && (__GNUC__ >= 4) 74*27162e4eSAndroid Build Coastguard Worker # define LZ4FLIB_VISIBILITY __attribute__ ((visibility ("default"))) 75*27162e4eSAndroid Build Coastguard Worker # else 76*27162e4eSAndroid Build Coastguard Worker # define LZ4FLIB_VISIBILITY 77*27162e4eSAndroid Build Coastguard Worker # endif 78*27162e4eSAndroid Build Coastguard Worker #endif 79*27162e4eSAndroid Build Coastguard Worker #if defined(LZ4_DLL_EXPORT) && (LZ4_DLL_EXPORT==1) 80*27162e4eSAndroid Build Coastguard Worker # define LZ4FLIB_API __declspec(dllexport) LZ4FLIB_VISIBILITY 81*27162e4eSAndroid Build Coastguard Worker #elif defined(LZ4_DLL_IMPORT) && (LZ4_DLL_IMPORT==1) 82*27162e4eSAndroid Build Coastguard Worker # define LZ4FLIB_API __declspec(dllimport) LZ4FLIB_VISIBILITY 83*27162e4eSAndroid Build Coastguard Worker #else 84*27162e4eSAndroid Build Coastguard Worker # define LZ4FLIB_API LZ4FLIB_VISIBILITY 85*27162e4eSAndroid Build Coastguard Worker #endif 86*27162e4eSAndroid Build Coastguard Worker 87*27162e4eSAndroid Build Coastguard Worker #ifdef LZ4F_DISABLE_DEPRECATE_WARNINGS 88*27162e4eSAndroid Build Coastguard Worker # define LZ4F_DEPRECATE(x) x 89*27162e4eSAndroid Build Coastguard Worker #else 90*27162e4eSAndroid Build Coastguard Worker # if defined(_MSC_VER) 91*27162e4eSAndroid Build Coastguard Worker # define LZ4F_DEPRECATE(x) x /* __declspec(deprecated) x - only works with C++ */ 92*27162e4eSAndroid Build Coastguard Worker # elif defined(__clang__) || (defined(__GNUC__) && (__GNUC__ >= 6)) 93*27162e4eSAndroid Build Coastguard Worker # define LZ4F_DEPRECATE(x) x __attribute__((deprecated)) 94*27162e4eSAndroid Build Coastguard Worker # else 95*27162e4eSAndroid Build Coastguard Worker # define LZ4F_DEPRECATE(x) x /* no deprecation warning for this compiler */ 96*27162e4eSAndroid Build Coastguard Worker # endif 97*27162e4eSAndroid Build Coastguard Worker #endif 98*27162e4eSAndroid Build Coastguard Worker 99*27162e4eSAndroid Build Coastguard Worker 100*27162e4eSAndroid Build Coastguard Worker /*-************************************ 101*27162e4eSAndroid Build Coastguard Worker * Error management 102*27162e4eSAndroid Build Coastguard Worker **************************************/ 103*27162e4eSAndroid Build Coastguard Worker typedef size_t LZ4F_errorCode_t; 104*27162e4eSAndroid Build Coastguard Worker 105*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API unsigned LZ4F_isError(LZ4F_errorCode_t code); /**< tells when a function result is an error code */ 106*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API const char* LZ4F_getErrorName(LZ4F_errorCode_t code); /**< return error code string; for debugging */ 107*27162e4eSAndroid Build Coastguard Worker 108*27162e4eSAndroid Build Coastguard Worker 109*27162e4eSAndroid Build Coastguard Worker /*-************************************ 110*27162e4eSAndroid Build Coastguard Worker * Frame compression types 111*27162e4eSAndroid Build Coastguard Worker ************************************* */ 112*27162e4eSAndroid Build Coastguard Worker /* #define LZ4F_ENABLE_OBSOLETE_ENUMS // uncomment to enable obsolete enums */ 113*27162e4eSAndroid Build Coastguard Worker #ifdef LZ4F_ENABLE_OBSOLETE_ENUMS 114*27162e4eSAndroid Build Coastguard Worker # define LZ4F_OBSOLETE_ENUM(x) , LZ4F_DEPRECATE(x) = LZ4F_##x 115*27162e4eSAndroid Build Coastguard Worker #else 116*27162e4eSAndroid Build Coastguard Worker # define LZ4F_OBSOLETE_ENUM(x) 117*27162e4eSAndroid Build Coastguard Worker #endif 118*27162e4eSAndroid Build Coastguard Worker 119*27162e4eSAndroid Build Coastguard Worker /* The larger the block size, the (slightly) better the compression ratio, 120*27162e4eSAndroid Build Coastguard Worker * though there are diminishing returns. 121*27162e4eSAndroid Build Coastguard Worker * Larger blocks also increase memory usage on both compression and decompression sides. 122*27162e4eSAndroid Build Coastguard Worker */ 123*27162e4eSAndroid Build Coastguard Worker typedef enum { 124*27162e4eSAndroid Build Coastguard Worker LZ4F_default=0, 125*27162e4eSAndroid Build Coastguard Worker LZ4F_max64KB=4, 126*27162e4eSAndroid Build Coastguard Worker LZ4F_max256KB=5, 127*27162e4eSAndroid Build Coastguard Worker LZ4F_max1MB=6, 128*27162e4eSAndroid Build Coastguard Worker LZ4F_max4MB=7 129*27162e4eSAndroid Build Coastguard Worker LZ4F_OBSOLETE_ENUM(max64KB) 130*27162e4eSAndroid Build Coastguard Worker LZ4F_OBSOLETE_ENUM(max256KB) 131*27162e4eSAndroid Build Coastguard Worker LZ4F_OBSOLETE_ENUM(max1MB) 132*27162e4eSAndroid Build Coastguard Worker LZ4F_OBSOLETE_ENUM(max4MB) 133*27162e4eSAndroid Build Coastguard Worker } LZ4F_blockSizeID_t; 134*27162e4eSAndroid Build Coastguard Worker 135*27162e4eSAndroid Build Coastguard Worker /* Linked blocks sharply reduce inefficiencies when using small blocks, 136*27162e4eSAndroid Build Coastguard Worker * they compress better. 137*27162e4eSAndroid Build Coastguard Worker * However, some LZ4 decoders are only compatible with independent blocks */ 138*27162e4eSAndroid Build Coastguard Worker typedef enum { 139*27162e4eSAndroid Build Coastguard Worker LZ4F_blockLinked=0, 140*27162e4eSAndroid Build Coastguard Worker LZ4F_blockIndependent 141*27162e4eSAndroid Build Coastguard Worker LZ4F_OBSOLETE_ENUM(blockLinked) 142*27162e4eSAndroid Build Coastguard Worker LZ4F_OBSOLETE_ENUM(blockIndependent) 143*27162e4eSAndroid Build Coastguard Worker } LZ4F_blockMode_t; 144*27162e4eSAndroid Build Coastguard Worker 145*27162e4eSAndroid Build Coastguard Worker typedef enum { 146*27162e4eSAndroid Build Coastguard Worker LZ4F_noContentChecksum=0, 147*27162e4eSAndroid Build Coastguard Worker LZ4F_contentChecksumEnabled 148*27162e4eSAndroid Build Coastguard Worker LZ4F_OBSOLETE_ENUM(noContentChecksum) 149*27162e4eSAndroid Build Coastguard Worker LZ4F_OBSOLETE_ENUM(contentChecksumEnabled) 150*27162e4eSAndroid Build Coastguard Worker } LZ4F_contentChecksum_t; 151*27162e4eSAndroid Build Coastguard Worker 152*27162e4eSAndroid Build Coastguard Worker typedef enum { 153*27162e4eSAndroid Build Coastguard Worker LZ4F_noBlockChecksum=0, 154*27162e4eSAndroid Build Coastguard Worker LZ4F_blockChecksumEnabled 155*27162e4eSAndroid Build Coastguard Worker } LZ4F_blockChecksum_t; 156*27162e4eSAndroid Build Coastguard Worker 157*27162e4eSAndroid Build Coastguard Worker typedef enum { 158*27162e4eSAndroid Build Coastguard Worker LZ4F_frame=0, 159*27162e4eSAndroid Build Coastguard Worker LZ4F_skippableFrame 160*27162e4eSAndroid Build Coastguard Worker LZ4F_OBSOLETE_ENUM(skippableFrame) 161*27162e4eSAndroid Build Coastguard Worker } LZ4F_frameType_t; 162*27162e4eSAndroid Build Coastguard Worker 163*27162e4eSAndroid Build Coastguard Worker #ifdef LZ4F_ENABLE_OBSOLETE_ENUMS 164*27162e4eSAndroid Build Coastguard Worker typedef LZ4F_blockSizeID_t blockSizeID_t; 165*27162e4eSAndroid Build Coastguard Worker typedef LZ4F_blockMode_t blockMode_t; 166*27162e4eSAndroid Build Coastguard Worker typedef LZ4F_frameType_t frameType_t; 167*27162e4eSAndroid Build Coastguard Worker typedef LZ4F_contentChecksum_t contentChecksum_t; 168*27162e4eSAndroid Build Coastguard Worker #endif 169*27162e4eSAndroid Build Coastguard Worker 170*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_frameInfo_t : 171*27162e4eSAndroid Build Coastguard Worker * makes it possible to set or read frame parameters. 172*27162e4eSAndroid Build Coastguard Worker * Structure must be first init to 0, using memset() or LZ4F_INIT_FRAMEINFO, 173*27162e4eSAndroid Build Coastguard Worker * setting all parameters to default. 174*27162e4eSAndroid Build Coastguard Worker * It's then possible to update selectively some parameters */ 175*27162e4eSAndroid Build Coastguard Worker typedef struct { 176*27162e4eSAndroid Build Coastguard Worker LZ4F_blockSizeID_t blockSizeID; /* max64KB, max256KB, max1MB, max4MB; 0 == default (LZ4F_max64KB) */ 177*27162e4eSAndroid Build Coastguard Worker LZ4F_blockMode_t blockMode; /* LZ4F_blockLinked, LZ4F_blockIndependent; 0 == default (LZ4F_blockLinked) */ 178*27162e4eSAndroid Build Coastguard Worker LZ4F_contentChecksum_t contentChecksumFlag; /* 1: add a 32-bit checksum of frame's decompressed data; 0 == default (disabled) */ 179*27162e4eSAndroid Build Coastguard Worker LZ4F_frameType_t frameType; /* read-only field : LZ4F_frame or LZ4F_skippableFrame */ 180*27162e4eSAndroid Build Coastguard Worker unsigned long long contentSize; /* Size of uncompressed content ; 0 == unknown */ 181*27162e4eSAndroid Build Coastguard Worker unsigned dictID; /* Dictionary ID, sent by compressor to help decoder select correct dictionary; 0 == no dictID provided */ 182*27162e4eSAndroid Build Coastguard Worker LZ4F_blockChecksum_t blockChecksumFlag; /* 1: each block followed by a checksum of block's compressed data; 0 == default (disabled) */ 183*27162e4eSAndroid Build Coastguard Worker } LZ4F_frameInfo_t; 184*27162e4eSAndroid Build Coastguard Worker 185*27162e4eSAndroid Build Coastguard Worker #define LZ4F_INIT_FRAMEINFO { LZ4F_max64KB, LZ4F_blockLinked, LZ4F_noContentChecksum, LZ4F_frame, 0ULL, 0U, LZ4F_noBlockChecksum } /* v1.8.3+ */ 186*27162e4eSAndroid Build Coastguard Worker 187*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_preferences_t : 188*27162e4eSAndroid Build Coastguard Worker * makes it possible to supply advanced compression instructions to streaming interface. 189*27162e4eSAndroid Build Coastguard Worker * Structure must be first init to 0, using memset() or LZ4F_INIT_PREFERENCES, 190*27162e4eSAndroid Build Coastguard Worker * setting all parameters to default. 191*27162e4eSAndroid Build Coastguard Worker * All reserved fields must be set to zero. */ 192*27162e4eSAndroid Build Coastguard Worker typedef struct { 193*27162e4eSAndroid Build Coastguard Worker LZ4F_frameInfo_t frameInfo; 194*27162e4eSAndroid Build Coastguard Worker int compressionLevel; /* 0: default (fast mode); values > LZ4HC_CLEVEL_MAX count as LZ4HC_CLEVEL_MAX; values < 0 trigger "fast acceleration" */ 195*27162e4eSAndroid Build Coastguard Worker unsigned autoFlush; /* 1: always flush; reduces usage of internal buffers */ 196*27162e4eSAndroid Build Coastguard Worker unsigned favorDecSpeed; /* 1: parser favors decompression speed vs compression ratio. Only works for high compression modes (>= LZ4HC_CLEVEL_OPT_MIN) */ /* v1.8.2+ */ 197*27162e4eSAndroid Build Coastguard Worker unsigned reserved[3]; /* must be zero for forward compatibility */ 198*27162e4eSAndroid Build Coastguard Worker } LZ4F_preferences_t; 199*27162e4eSAndroid Build Coastguard Worker 200*27162e4eSAndroid Build Coastguard Worker #define LZ4F_INIT_PREFERENCES { LZ4F_INIT_FRAMEINFO, 0, 0u, 0u, { 0u, 0u, 0u } } /* v1.8.3+ */ 201*27162e4eSAndroid Build Coastguard Worker 202*27162e4eSAndroid Build Coastguard Worker 203*27162e4eSAndroid Build Coastguard Worker /*-********************************* 204*27162e4eSAndroid Build Coastguard Worker * Simple compression function 205*27162e4eSAndroid Build Coastguard Worker ***********************************/ 206*27162e4eSAndroid Build Coastguard Worker 207*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_compressFrame() : 208*27162e4eSAndroid Build Coastguard Worker * Compress srcBuffer content into an LZ4-compressed frame. 209*27162e4eSAndroid Build Coastguard Worker * It's a one shot operation, all input content is consumed, and all output is generated. 210*27162e4eSAndroid Build Coastguard Worker * 211*27162e4eSAndroid Build Coastguard Worker * Note : it's a stateless operation (no LZ4F_cctx state needed). 212*27162e4eSAndroid Build Coastguard Worker * In order to reduce load on the allocator, LZ4F_compressFrame(), by default, 213*27162e4eSAndroid Build Coastguard Worker * uses the stack to allocate space for the compression state and some table. 214*27162e4eSAndroid Build Coastguard Worker * If this usage of the stack is too much for your application, 215*27162e4eSAndroid Build Coastguard Worker * consider compiling `lz4frame.c` with compile-time macro LZ4F_HEAPMODE set to 1 instead. 216*27162e4eSAndroid Build Coastguard Worker * All state allocations will use the Heap. 217*27162e4eSAndroid Build Coastguard Worker * It also means each invocation of LZ4F_compressFrame() will trigger several internal alloc/free invocations. 218*27162e4eSAndroid Build Coastguard Worker * 219*27162e4eSAndroid Build Coastguard Worker * @dstCapacity MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr). 220*27162e4eSAndroid Build Coastguard Worker * @preferencesPtr is optional : one can provide NULL, in which case all preferences are set to default. 221*27162e4eSAndroid Build Coastguard Worker * @return : number of bytes written into dstBuffer. 222*27162e4eSAndroid Build Coastguard Worker * or an error code if it fails (can be tested using LZ4F_isError()) 223*27162e4eSAndroid Build Coastguard Worker */ 224*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t LZ4F_compressFrame(void* dstBuffer, size_t dstCapacity, 225*27162e4eSAndroid Build Coastguard Worker const void* srcBuffer, size_t srcSize, 226*27162e4eSAndroid Build Coastguard Worker const LZ4F_preferences_t* preferencesPtr); 227*27162e4eSAndroid Build Coastguard Worker 228*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_compressFrameBound() : 229*27162e4eSAndroid Build Coastguard Worker * Returns the maximum possible compressed size with LZ4F_compressFrame() given srcSize and preferences. 230*27162e4eSAndroid Build Coastguard Worker * `preferencesPtr` is optional. It can be replaced by NULL, in which case, the function will assume default preferences. 231*27162e4eSAndroid Build Coastguard Worker * Note : this result is only usable with LZ4F_compressFrame(). 232*27162e4eSAndroid Build Coastguard Worker * It may also be relevant to LZ4F_compressUpdate() _only if_ no flush() operation is ever performed. 233*27162e4eSAndroid Build Coastguard Worker */ 234*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t LZ4F_compressFrameBound(size_t srcSize, const LZ4F_preferences_t* preferencesPtr); 235*27162e4eSAndroid Build Coastguard Worker 236*27162e4eSAndroid Build Coastguard Worker 237*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_compressionLevel_max() : 238*27162e4eSAndroid Build Coastguard Worker * @return maximum allowed compression level (currently: 12) 239*27162e4eSAndroid Build Coastguard Worker */ 240*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API int LZ4F_compressionLevel_max(void); /* v1.8.0+ */ 241*27162e4eSAndroid Build Coastguard Worker 242*27162e4eSAndroid Build Coastguard Worker 243*27162e4eSAndroid Build Coastguard Worker /*-*********************************** 244*27162e4eSAndroid Build Coastguard Worker * Advanced compression functions 245*27162e4eSAndroid Build Coastguard Worker *************************************/ 246*27162e4eSAndroid Build Coastguard Worker typedef struct LZ4F_cctx_s LZ4F_cctx; /* incomplete type */ 247*27162e4eSAndroid Build Coastguard Worker typedef LZ4F_cctx* LZ4F_compressionContext_t; /* for compatibility with older APIs, prefer using LZ4F_cctx */ 248*27162e4eSAndroid Build Coastguard Worker 249*27162e4eSAndroid Build Coastguard Worker typedef struct { 250*27162e4eSAndroid Build Coastguard Worker unsigned stableSrc; /* 1 == src content will remain present on future calls to LZ4F_compress(); skip copying src content within tmp buffer */ 251*27162e4eSAndroid Build Coastguard Worker unsigned reserved[3]; 252*27162e4eSAndroid Build Coastguard Worker } LZ4F_compressOptions_t; 253*27162e4eSAndroid Build Coastguard Worker 254*27162e4eSAndroid Build Coastguard Worker /*--- Resource Management ---*/ 255*27162e4eSAndroid Build Coastguard Worker 256*27162e4eSAndroid Build Coastguard Worker #define LZ4F_VERSION 100 /* This number can be used to check for an incompatible API breaking change */ 257*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API unsigned LZ4F_getVersion(void); 258*27162e4eSAndroid Build Coastguard Worker 259*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_createCompressionContext() : 260*27162e4eSAndroid Build Coastguard Worker * The first thing to do is to create a compressionContext object, 261*27162e4eSAndroid Build Coastguard Worker * which will keep track of operation state during streaming compression. 262*27162e4eSAndroid Build Coastguard Worker * This is achieved using LZ4F_createCompressionContext(), which takes as argument a version, 263*27162e4eSAndroid Build Coastguard Worker * and a pointer to LZ4F_cctx*, to write the resulting pointer into. 264*27162e4eSAndroid Build Coastguard Worker * @version provided MUST be LZ4F_VERSION. It is intended to track potential version mismatch, notably when using DLL. 265*27162e4eSAndroid Build Coastguard Worker * The function provides a pointer to a fully allocated LZ4F_cctx object. 266*27162e4eSAndroid Build Coastguard Worker * @cctxPtr MUST be != NULL. 267*27162e4eSAndroid Build Coastguard Worker * If @return != zero, context creation failed. 268*27162e4eSAndroid Build Coastguard Worker * A created compression context can be employed multiple times for consecutive streaming operations. 269*27162e4eSAndroid Build Coastguard Worker * Once all streaming compression jobs are completed, 270*27162e4eSAndroid Build Coastguard Worker * the state object can be released using LZ4F_freeCompressionContext(). 271*27162e4eSAndroid Build Coastguard Worker * Note1 : LZ4F_freeCompressionContext() is always successful. Its return value can be ignored. 272*27162e4eSAndroid Build Coastguard Worker * Note2 : LZ4F_freeCompressionContext() works fine with NULL input pointers (do nothing). 273*27162e4eSAndroid Build Coastguard Worker **/ 274*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API LZ4F_errorCode_t LZ4F_createCompressionContext(LZ4F_cctx** cctxPtr, unsigned version); 275*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeCompressionContext(LZ4F_cctx* cctx); 276*27162e4eSAndroid Build Coastguard Worker 277*27162e4eSAndroid Build Coastguard Worker 278*27162e4eSAndroid Build Coastguard Worker /*---- Compression ----*/ 279*27162e4eSAndroid Build Coastguard Worker 280*27162e4eSAndroid Build Coastguard Worker #define LZ4F_HEADER_SIZE_MIN 7 /* LZ4 Frame header size can vary, depending on selected parameters */ 281*27162e4eSAndroid Build Coastguard Worker #define LZ4F_HEADER_SIZE_MAX 19 282*27162e4eSAndroid Build Coastguard Worker 283*27162e4eSAndroid Build Coastguard Worker /* Size in bytes of a block header in little-endian format. Highest bit indicates if block data is uncompressed */ 284*27162e4eSAndroid Build Coastguard Worker #define LZ4F_BLOCK_HEADER_SIZE 4 285*27162e4eSAndroid Build Coastguard Worker 286*27162e4eSAndroid Build Coastguard Worker /* Size in bytes of a block checksum footer in little-endian format. */ 287*27162e4eSAndroid Build Coastguard Worker #define LZ4F_BLOCK_CHECKSUM_SIZE 4 288*27162e4eSAndroid Build Coastguard Worker 289*27162e4eSAndroid Build Coastguard Worker /* Size in bytes of the content checksum. */ 290*27162e4eSAndroid Build Coastguard Worker #define LZ4F_CONTENT_CHECKSUM_SIZE 4 291*27162e4eSAndroid Build Coastguard Worker 292*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_compressBegin() : 293*27162e4eSAndroid Build Coastguard Worker * will write the frame header into dstBuffer. 294*27162e4eSAndroid Build Coastguard Worker * dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes. 295*27162e4eSAndroid Build Coastguard Worker * `prefsPtr` is optional : NULL can be provided to set all preferences to default. 296*27162e4eSAndroid Build Coastguard Worker * @return : number of bytes written into dstBuffer for the header 297*27162e4eSAndroid Build Coastguard Worker * or an error code (which can be tested using LZ4F_isError()) 298*27162e4eSAndroid Build Coastguard Worker */ 299*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t LZ4F_compressBegin(LZ4F_cctx* cctx, 300*27162e4eSAndroid Build Coastguard Worker void* dstBuffer, size_t dstCapacity, 301*27162e4eSAndroid Build Coastguard Worker const LZ4F_preferences_t* prefsPtr); 302*27162e4eSAndroid Build Coastguard Worker 303*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_compressBound() : 304*27162e4eSAndroid Build Coastguard Worker * Provides minimum dstCapacity required to guarantee success of 305*27162e4eSAndroid Build Coastguard Worker * LZ4F_compressUpdate(), given a srcSize and preferences, for a worst case scenario. 306*27162e4eSAndroid Build Coastguard Worker * When srcSize==0, LZ4F_compressBound() provides an upper bound for LZ4F_flush() and LZ4F_compressEnd() instead. 307*27162e4eSAndroid Build Coastguard Worker * Note that the result is only valid for a single invocation of LZ4F_compressUpdate(). 308*27162e4eSAndroid Build Coastguard Worker * When invoking LZ4F_compressUpdate() multiple times, 309*27162e4eSAndroid Build Coastguard Worker * if the output buffer is gradually filled up instead of emptied and re-used from its start, 310*27162e4eSAndroid Build Coastguard Worker * one must check if there is enough remaining capacity before each invocation, using LZ4F_compressBound(). 311*27162e4eSAndroid Build Coastguard Worker * @return is always the same for a srcSize and prefsPtr. 312*27162e4eSAndroid Build Coastguard Worker * prefsPtr is optional : when NULL is provided, preferences will be set to cover worst case scenario. 313*27162e4eSAndroid Build Coastguard Worker * tech details : 314*27162e4eSAndroid Build Coastguard Worker * @return if automatic flushing is not enabled, includes the possibility that internal buffer might already be filled by up to (blockSize-1) bytes. 315*27162e4eSAndroid Build Coastguard Worker * It also includes frame footer (ending + checksum), since it might be generated by LZ4F_compressEnd(). 316*27162e4eSAndroid Build Coastguard Worker * @return doesn't include frame header, as it was already generated by LZ4F_compressBegin(). 317*27162e4eSAndroid Build Coastguard Worker */ 318*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t LZ4F_compressBound(size_t srcSize, const LZ4F_preferences_t* prefsPtr); 319*27162e4eSAndroid Build Coastguard Worker 320*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_compressUpdate() : 321*27162e4eSAndroid Build Coastguard Worker * LZ4F_compressUpdate() can be called repetitively to compress as much data as necessary. 322*27162e4eSAndroid Build Coastguard Worker * Important rule: dstCapacity MUST be large enough to ensure operation success even in worst case situations. 323*27162e4eSAndroid Build Coastguard Worker * This value is provided by LZ4F_compressBound(). 324*27162e4eSAndroid Build Coastguard Worker * If this condition is not respected, LZ4F_compress() will fail (result is an errorCode). 325*27162e4eSAndroid Build Coastguard Worker * After an error, the state is left in a UB state, and must be re-initialized or freed. 326*27162e4eSAndroid Build Coastguard Worker * If previously an uncompressed block was written, buffered data is flushed 327*27162e4eSAndroid Build Coastguard Worker * before appending compressed data is continued. 328*27162e4eSAndroid Build Coastguard Worker * `cOptPtr` is optional : NULL can be provided, in which case all options are set to default. 329*27162e4eSAndroid Build Coastguard Worker * @return : number of bytes written into `dstBuffer` (it can be zero, meaning input data was just buffered). 330*27162e4eSAndroid Build Coastguard Worker * or an error code if it fails (which can be tested using LZ4F_isError()) 331*27162e4eSAndroid Build Coastguard Worker */ 332*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t LZ4F_compressUpdate(LZ4F_cctx* cctx, 333*27162e4eSAndroid Build Coastguard Worker void* dstBuffer, size_t dstCapacity, 334*27162e4eSAndroid Build Coastguard Worker const void* srcBuffer, size_t srcSize, 335*27162e4eSAndroid Build Coastguard Worker const LZ4F_compressOptions_t* cOptPtr); 336*27162e4eSAndroid Build Coastguard Worker 337*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_flush() : 338*27162e4eSAndroid Build Coastguard Worker * When data must be generated and sent immediately, without waiting for a block to be completely filled, 339*27162e4eSAndroid Build Coastguard Worker * it's possible to call LZ4_flush(). It will immediately compress any data buffered within cctx. 340*27162e4eSAndroid Build Coastguard Worker * `dstCapacity` must be large enough to ensure the operation will be successful. 341*27162e4eSAndroid Build Coastguard Worker * `cOptPtr` is optional : it's possible to provide NULL, all options will be set to default. 342*27162e4eSAndroid Build Coastguard Worker * @return : nb of bytes written into dstBuffer (can be zero, when there is no data stored within cctx) 343*27162e4eSAndroid Build Coastguard Worker * or an error code if it fails (which can be tested using LZ4F_isError()) 344*27162e4eSAndroid Build Coastguard Worker * Note : LZ4F_flush() is guaranteed to be successful when dstCapacity >= LZ4F_compressBound(0, prefsPtr). 345*27162e4eSAndroid Build Coastguard Worker */ 346*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t LZ4F_flush(LZ4F_cctx* cctx, 347*27162e4eSAndroid Build Coastguard Worker void* dstBuffer, size_t dstCapacity, 348*27162e4eSAndroid Build Coastguard Worker const LZ4F_compressOptions_t* cOptPtr); 349*27162e4eSAndroid Build Coastguard Worker 350*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_compressEnd() : 351*27162e4eSAndroid Build Coastguard Worker * To properly finish an LZ4 frame, invoke LZ4F_compressEnd(). 352*27162e4eSAndroid Build Coastguard Worker * It will flush whatever data remained within `cctx` (like LZ4_flush()) 353*27162e4eSAndroid Build Coastguard Worker * and properly finalize the frame, with an endMark and a checksum. 354*27162e4eSAndroid Build Coastguard Worker * `cOptPtr` is optional : NULL can be provided, in which case all options will be set to default. 355*27162e4eSAndroid Build Coastguard Worker * @return : nb of bytes written into dstBuffer, necessarily >= 4 (endMark), 356*27162e4eSAndroid Build Coastguard Worker * or an error code if it fails (which can be tested using LZ4F_isError()) 357*27162e4eSAndroid Build Coastguard Worker * Note : LZ4F_compressEnd() is guaranteed to be successful when dstCapacity >= LZ4F_compressBound(0, prefsPtr). 358*27162e4eSAndroid Build Coastguard Worker * A successful call to LZ4F_compressEnd() makes `cctx` available again for another compression task. 359*27162e4eSAndroid Build Coastguard Worker */ 360*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t LZ4F_compressEnd(LZ4F_cctx* cctx, 361*27162e4eSAndroid Build Coastguard Worker void* dstBuffer, size_t dstCapacity, 362*27162e4eSAndroid Build Coastguard Worker const LZ4F_compressOptions_t* cOptPtr); 363*27162e4eSAndroid Build Coastguard Worker 364*27162e4eSAndroid Build Coastguard Worker 365*27162e4eSAndroid Build Coastguard Worker /*-********************************* 366*27162e4eSAndroid Build Coastguard Worker * Decompression functions 367*27162e4eSAndroid Build Coastguard Worker ***********************************/ 368*27162e4eSAndroid Build Coastguard Worker typedef struct LZ4F_dctx_s LZ4F_dctx; /* incomplete type */ 369*27162e4eSAndroid Build Coastguard Worker typedef LZ4F_dctx* LZ4F_decompressionContext_t; /* compatibility with previous API versions */ 370*27162e4eSAndroid Build Coastguard Worker 371*27162e4eSAndroid Build Coastguard Worker typedef struct { 372*27162e4eSAndroid Build Coastguard Worker unsigned stableDst; /* pledges that last 64KB decompressed data is present right before @dstBuffer pointer. 373*27162e4eSAndroid Build Coastguard Worker * This optimization skips internal storage operations. 374*27162e4eSAndroid Build Coastguard Worker * Once set, this pledge must remain valid up to the end of current frame. */ 375*27162e4eSAndroid Build Coastguard Worker unsigned skipChecksums; /* disable checksum calculation and verification, even when one is present in frame, to save CPU time. 376*27162e4eSAndroid Build Coastguard Worker * Setting this option to 1 once disables all checksums for the rest of the frame. */ 377*27162e4eSAndroid Build Coastguard Worker unsigned reserved1; /* must be set to zero for forward compatibility */ 378*27162e4eSAndroid Build Coastguard Worker unsigned reserved0; /* idem */ 379*27162e4eSAndroid Build Coastguard Worker } LZ4F_decompressOptions_t; 380*27162e4eSAndroid Build Coastguard Worker 381*27162e4eSAndroid Build Coastguard Worker 382*27162e4eSAndroid Build Coastguard Worker /* Resource management */ 383*27162e4eSAndroid Build Coastguard Worker 384*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_createDecompressionContext() : 385*27162e4eSAndroid Build Coastguard Worker * Create an LZ4F_dctx object, to track all decompression operations. 386*27162e4eSAndroid Build Coastguard Worker * @version provided MUST be LZ4F_VERSION. 387*27162e4eSAndroid Build Coastguard Worker * @dctxPtr MUST be valid. 388*27162e4eSAndroid Build Coastguard Worker * The function fills @dctxPtr with the value of a pointer to an allocated and initialized LZ4F_dctx object. 389*27162e4eSAndroid Build Coastguard Worker * The @return is an errorCode, which can be tested using LZ4F_isError(). 390*27162e4eSAndroid Build Coastguard Worker * dctx memory can be released using LZ4F_freeDecompressionContext(); 391*27162e4eSAndroid Build Coastguard Worker * Result of LZ4F_freeDecompressionContext() indicates current state of decompressionContext when being released. 392*27162e4eSAndroid Build Coastguard Worker * That is, it should be == 0 if decompression has been completed fully and correctly. 393*27162e4eSAndroid Build Coastguard Worker */ 394*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API LZ4F_errorCode_t LZ4F_createDecompressionContext(LZ4F_dctx** dctxPtr, unsigned version); 395*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API LZ4F_errorCode_t LZ4F_freeDecompressionContext(LZ4F_dctx* dctx); 396*27162e4eSAndroid Build Coastguard Worker 397*27162e4eSAndroid Build Coastguard Worker 398*27162e4eSAndroid Build Coastguard Worker /*-*********************************** 399*27162e4eSAndroid Build Coastguard Worker * Streaming decompression functions 400*27162e4eSAndroid Build Coastguard Worker *************************************/ 401*27162e4eSAndroid Build Coastguard Worker 402*27162e4eSAndroid Build Coastguard Worker #define LZ4F_MAGICNUMBER 0x184D2204U 403*27162e4eSAndroid Build Coastguard Worker #define LZ4F_MAGIC_SKIPPABLE_START 0x184D2A50U 404*27162e4eSAndroid Build Coastguard Worker #define LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH 5 405*27162e4eSAndroid Build Coastguard Worker 406*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_headerSize() : v1.9.0+ 407*27162e4eSAndroid Build Coastguard Worker * Provide the header size of a frame starting at `src`. 408*27162e4eSAndroid Build Coastguard Worker * `srcSize` must be >= LZ4F_MIN_SIZE_TO_KNOW_HEADER_LENGTH, 409*27162e4eSAndroid Build Coastguard Worker * which is enough to decode the header length. 410*27162e4eSAndroid Build Coastguard Worker * @return : size of frame header 411*27162e4eSAndroid Build Coastguard Worker * or an error code, which can be tested using LZ4F_isError() 412*27162e4eSAndroid Build Coastguard Worker * note : Frame header size is variable, but is guaranteed to be 413*27162e4eSAndroid Build Coastguard Worker * >= LZ4F_HEADER_SIZE_MIN bytes, and <= LZ4F_HEADER_SIZE_MAX bytes. 414*27162e4eSAndroid Build Coastguard Worker */ 415*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t LZ4F_headerSize(const void* src, size_t srcSize); 416*27162e4eSAndroid Build Coastguard Worker 417*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_getFrameInfo() : 418*27162e4eSAndroid Build Coastguard Worker * This function extracts frame parameters (max blockSize, dictID, etc.). 419*27162e4eSAndroid Build Coastguard Worker * Its usage is optional: user can also invoke LZ4F_decompress() directly. 420*27162e4eSAndroid Build Coastguard Worker * 421*27162e4eSAndroid Build Coastguard Worker * Extracted information will fill an existing LZ4F_frameInfo_t structure. 422*27162e4eSAndroid Build Coastguard Worker * This can be useful for allocation and dictionary identification purposes. 423*27162e4eSAndroid Build Coastguard Worker * 424*27162e4eSAndroid Build Coastguard Worker * LZ4F_getFrameInfo() can work in the following situations : 425*27162e4eSAndroid Build Coastguard Worker * 426*27162e4eSAndroid Build Coastguard Worker * 1) At the beginning of a new frame, before any invocation of LZ4F_decompress(). 427*27162e4eSAndroid Build Coastguard Worker * It will decode header from `srcBuffer`, 428*27162e4eSAndroid Build Coastguard Worker * consuming the header and starting the decoding process. 429*27162e4eSAndroid Build Coastguard Worker * 430*27162e4eSAndroid Build Coastguard Worker * Input size must be large enough to contain the full frame header. 431*27162e4eSAndroid Build Coastguard Worker * Frame header size can be known beforehand by LZ4F_headerSize(). 432*27162e4eSAndroid Build Coastguard Worker * Frame header size is variable, but is guaranteed to be >= LZ4F_HEADER_SIZE_MIN bytes, 433*27162e4eSAndroid Build Coastguard Worker * and not more than <= LZ4F_HEADER_SIZE_MAX bytes. 434*27162e4eSAndroid Build Coastguard Worker * Hence, blindly providing LZ4F_HEADER_SIZE_MAX bytes or more will always work. 435*27162e4eSAndroid Build Coastguard Worker * It's allowed to provide more input data than the header size, 436*27162e4eSAndroid Build Coastguard Worker * LZ4F_getFrameInfo() will only consume the header. 437*27162e4eSAndroid Build Coastguard Worker * 438*27162e4eSAndroid Build Coastguard Worker * If input size is not large enough, 439*27162e4eSAndroid Build Coastguard Worker * aka if it's smaller than header size, 440*27162e4eSAndroid Build Coastguard Worker * function will fail and return an error code. 441*27162e4eSAndroid Build Coastguard Worker * 442*27162e4eSAndroid Build Coastguard Worker * 2) After decoding has been started, 443*27162e4eSAndroid Build Coastguard Worker * it's possible to invoke LZ4F_getFrameInfo() anytime 444*27162e4eSAndroid Build Coastguard Worker * to extract already decoded frame parameters stored within dctx. 445*27162e4eSAndroid Build Coastguard Worker * 446*27162e4eSAndroid Build Coastguard Worker * Note that, if decoding has barely started, 447*27162e4eSAndroid Build Coastguard Worker * and not yet read enough information to decode the header, 448*27162e4eSAndroid Build Coastguard Worker * LZ4F_getFrameInfo() will fail. 449*27162e4eSAndroid Build Coastguard Worker * 450*27162e4eSAndroid Build Coastguard Worker * The number of bytes consumed from srcBuffer will be updated in *srcSizePtr (necessarily <= original value). 451*27162e4eSAndroid Build Coastguard Worker * LZ4F_getFrameInfo() only consumes bytes when decoding has not yet started, 452*27162e4eSAndroid Build Coastguard Worker * and when decoding the header has been successful. 453*27162e4eSAndroid Build Coastguard Worker * Decompression must then resume from (srcBuffer + *srcSizePtr). 454*27162e4eSAndroid Build Coastguard Worker * 455*27162e4eSAndroid Build Coastguard Worker * @return : a hint about how many srcSize bytes LZ4F_decompress() expects for next call, 456*27162e4eSAndroid Build Coastguard Worker * or an error code which can be tested using LZ4F_isError(). 457*27162e4eSAndroid Build Coastguard Worker * note 1 : in case of error, dctx is not modified. Decoding operation can resume from beginning safely. 458*27162e4eSAndroid Build Coastguard Worker * note 2 : frame parameters are *copied into* an already allocated LZ4F_frameInfo_t structure. 459*27162e4eSAndroid Build Coastguard Worker */ 460*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t 461*27162e4eSAndroid Build Coastguard Worker LZ4F_getFrameInfo(LZ4F_dctx* dctx, 462*27162e4eSAndroid Build Coastguard Worker LZ4F_frameInfo_t* frameInfoPtr, 463*27162e4eSAndroid Build Coastguard Worker const void* srcBuffer, size_t* srcSizePtr); 464*27162e4eSAndroid Build Coastguard Worker 465*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_decompress() : 466*27162e4eSAndroid Build Coastguard Worker * Call this function repetitively to regenerate data compressed in `srcBuffer`. 467*27162e4eSAndroid Build Coastguard Worker * 468*27162e4eSAndroid Build Coastguard Worker * The function requires a valid dctx state. 469*27162e4eSAndroid Build Coastguard Worker * It will read up to *srcSizePtr bytes from srcBuffer, 470*27162e4eSAndroid Build Coastguard Worker * and decompress data into dstBuffer, of capacity *dstSizePtr. 471*27162e4eSAndroid Build Coastguard Worker * 472*27162e4eSAndroid Build Coastguard Worker * The nb of bytes consumed from srcBuffer will be written into *srcSizePtr (necessarily <= original value). 473*27162e4eSAndroid Build Coastguard Worker * The nb of bytes decompressed into dstBuffer will be written into *dstSizePtr (necessarily <= original value). 474*27162e4eSAndroid Build Coastguard Worker * 475*27162e4eSAndroid Build Coastguard Worker * The function does not necessarily read all input bytes, so always check value in *srcSizePtr. 476*27162e4eSAndroid Build Coastguard Worker * Unconsumed source data must be presented again in subsequent invocations. 477*27162e4eSAndroid Build Coastguard Worker * 478*27162e4eSAndroid Build Coastguard Worker * `dstBuffer` can freely change between each consecutive function invocation. 479*27162e4eSAndroid Build Coastguard Worker * `dstBuffer` content will be overwritten. 480*27162e4eSAndroid Build Coastguard Worker * 481*27162e4eSAndroid Build Coastguard Worker * Note: if `LZ4F_getFrameInfo()` is called before `LZ4F_decompress()`, srcBuffer must be updated to reflect 482*27162e4eSAndroid Build Coastguard Worker * the number of bytes consumed after reading the frame header. Failure to update srcBuffer before calling 483*27162e4eSAndroid Build Coastguard Worker * `LZ4F_decompress()` will cause decompression failure or, even worse, successful but incorrect decompression. 484*27162e4eSAndroid Build Coastguard Worker * See the `LZ4F_getFrameInfo()` docs for details. 485*27162e4eSAndroid Build Coastguard Worker * 486*27162e4eSAndroid Build Coastguard Worker * @return : an hint of how many `srcSize` bytes LZ4F_decompress() expects for next call. 487*27162e4eSAndroid Build Coastguard Worker * Schematically, it's the size of the current (or remaining) compressed block + header of next block. 488*27162e4eSAndroid Build Coastguard Worker * Respecting the hint provides some small speed benefit, because it skips intermediate buffers. 489*27162e4eSAndroid Build Coastguard Worker * This is just a hint though, it's always possible to provide any srcSize. 490*27162e4eSAndroid Build Coastguard Worker * 491*27162e4eSAndroid Build Coastguard Worker * When a frame is fully decoded, @return will be 0 (no more data expected). 492*27162e4eSAndroid Build Coastguard Worker * When provided with more bytes than necessary to decode a frame, 493*27162e4eSAndroid Build Coastguard Worker * LZ4F_decompress() will stop reading exactly at end of current frame, and @return 0. 494*27162e4eSAndroid Build Coastguard Worker * 495*27162e4eSAndroid Build Coastguard Worker * If decompression failed, @return is an error code, which can be tested using LZ4F_isError(). 496*27162e4eSAndroid Build Coastguard Worker * After a decompression error, the `dctx` context is not resumable. 497*27162e4eSAndroid Build Coastguard Worker * Use LZ4F_resetDecompressionContext() to return to clean state. 498*27162e4eSAndroid Build Coastguard Worker * 499*27162e4eSAndroid Build Coastguard Worker * After a frame is fully decoded, dctx can be used again to decompress another frame. 500*27162e4eSAndroid Build Coastguard Worker */ 501*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t 502*27162e4eSAndroid Build Coastguard Worker LZ4F_decompress(LZ4F_dctx* dctx, 503*27162e4eSAndroid Build Coastguard Worker void* dstBuffer, size_t* dstSizePtr, 504*27162e4eSAndroid Build Coastguard Worker const void* srcBuffer, size_t* srcSizePtr, 505*27162e4eSAndroid Build Coastguard Worker const LZ4F_decompressOptions_t* dOptPtr); 506*27162e4eSAndroid Build Coastguard Worker 507*27162e4eSAndroid Build Coastguard Worker 508*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_resetDecompressionContext() : added in v1.8.0 509*27162e4eSAndroid Build Coastguard Worker * In case of an error, the context is left in "undefined" state. 510*27162e4eSAndroid Build Coastguard Worker * In which case, it's necessary to reset it, before re-using it. 511*27162e4eSAndroid Build Coastguard Worker * This method can also be used to abruptly stop any unfinished decompression, 512*27162e4eSAndroid Build Coastguard Worker * and start a new one using same context resources. */ 513*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API void LZ4F_resetDecompressionContext(LZ4F_dctx* dctx); /* always successful */ 514*27162e4eSAndroid Build Coastguard Worker 515*27162e4eSAndroid Build Coastguard Worker 516*27162e4eSAndroid Build Coastguard Worker /********************************** 517*27162e4eSAndroid Build Coastguard Worker * Dictionary compression API 518*27162e4eSAndroid Build Coastguard Worker *********************************/ 519*27162e4eSAndroid Build Coastguard Worker 520*27162e4eSAndroid Build Coastguard Worker /* A Dictionary is useful for the compression of small messages (KB range). 521*27162e4eSAndroid Build Coastguard Worker * It dramatically improves compression efficiency. 522*27162e4eSAndroid Build Coastguard Worker * 523*27162e4eSAndroid Build Coastguard Worker * LZ4 can ingest any input as dictionary, though only the last 64 KB are useful. 524*27162e4eSAndroid Build Coastguard Worker * Better results are generally achieved by using Zstandard's Dictionary Builder 525*27162e4eSAndroid Build Coastguard Worker * to generate a high-quality dictionary from a set of samples. 526*27162e4eSAndroid Build Coastguard Worker * 527*27162e4eSAndroid Build Coastguard Worker * The same dictionary will have to be used on the decompression side 528*27162e4eSAndroid Build Coastguard Worker * for decoding to be successful. 529*27162e4eSAndroid Build Coastguard Worker * To help identify the correct dictionary at decoding stage, 530*27162e4eSAndroid Build Coastguard Worker * the frame header allows optional embedding of a dictID field. 531*27162e4eSAndroid Build Coastguard Worker */ 532*27162e4eSAndroid Build Coastguard Worker 533*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_compressBegin_usingDict() : stable since v1.10 534*27162e4eSAndroid Build Coastguard Worker * Inits dictionary compression streaming, and writes the frame header into dstBuffer. 535*27162e4eSAndroid Build Coastguard Worker * @dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes. 536*27162e4eSAndroid Build Coastguard Worker * @prefsPtr is optional : one may provide NULL as argument, 537*27162e4eSAndroid Build Coastguard Worker * however, it's the only way to provide dictID in the frame header. 538*27162e4eSAndroid Build Coastguard Worker * @dictBuffer must outlive the compression session. 539*27162e4eSAndroid Build Coastguard Worker * @return : number of bytes written into dstBuffer for the header, 540*27162e4eSAndroid Build Coastguard Worker * or an error code (which can be tested using LZ4F_isError()) 541*27162e4eSAndroid Build Coastguard Worker * NOTE: The LZ4Frame spec allows each independent block to be compressed with the dictionary, 542*27162e4eSAndroid Build Coastguard Worker * but this entry supports a more limited scenario, where only the first block uses the dictionary. 543*27162e4eSAndroid Build Coastguard Worker * This is still useful for small data, which only need one block anyway. 544*27162e4eSAndroid Build Coastguard Worker * For larger inputs, one may be more interested in LZ4F_compressFrame_usingCDict() below. 545*27162e4eSAndroid Build Coastguard Worker */ 546*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t 547*27162e4eSAndroid Build Coastguard Worker LZ4F_compressBegin_usingDict(LZ4F_cctx* cctx, 548*27162e4eSAndroid Build Coastguard Worker void* dstBuffer, size_t dstCapacity, 549*27162e4eSAndroid Build Coastguard Worker const void* dictBuffer, size_t dictSize, 550*27162e4eSAndroid Build Coastguard Worker const LZ4F_preferences_t* prefsPtr); 551*27162e4eSAndroid Build Coastguard Worker 552*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_decompress_usingDict() : stable since v1.10 553*27162e4eSAndroid Build Coastguard Worker * Same as LZ4F_decompress(), using a predefined dictionary. 554*27162e4eSAndroid Build Coastguard Worker * Dictionary is used "in place", without any preprocessing. 555*27162e4eSAndroid Build Coastguard Worker ** It must remain accessible throughout the entire frame decoding. */ 556*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t 557*27162e4eSAndroid Build Coastguard Worker LZ4F_decompress_usingDict(LZ4F_dctx* dctxPtr, 558*27162e4eSAndroid Build Coastguard Worker void* dstBuffer, size_t* dstSizePtr, 559*27162e4eSAndroid Build Coastguard Worker const void* srcBuffer, size_t* srcSizePtr, 560*27162e4eSAndroid Build Coastguard Worker const void* dict, size_t dictSize, 561*27162e4eSAndroid Build Coastguard Worker const LZ4F_decompressOptions_t* decompressOptionsPtr); 562*27162e4eSAndroid Build Coastguard Worker 563*27162e4eSAndroid Build Coastguard Worker /***************************************** 564*27162e4eSAndroid Build Coastguard Worker * Bulk processing dictionary compression 565*27162e4eSAndroid Build Coastguard Worker *****************************************/ 566*27162e4eSAndroid Build Coastguard Worker 567*27162e4eSAndroid Build Coastguard Worker /* Loading a dictionary has a cost, since it involves construction of tables. 568*27162e4eSAndroid Build Coastguard Worker * The Bulk processing dictionary API makes it possible to share this cost 569*27162e4eSAndroid Build Coastguard Worker * over an arbitrary number of compression jobs, even concurrently, 570*27162e4eSAndroid Build Coastguard Worker * markedly improving compression latency for these cases. 571*27162e4eSAndroid Build Coastguard Worker * 572*27162e4eSAndroid Build Coastguard Worker * Note that there is no corresponding bulk API for the decompression side, 573*27162e4eSAndroid Build Coastguard Worker * because dictionary does not carry any initialization cost for decompression. 574*27162e4eSAndroid Build Coastguard Worker * Use the regular LZ4F_decompress_usingDict() there. 575*27162e4eSAndroid Build Coastguard Worker */ 576*27162e4eSAndroid Build Coastguard Worker typedef struct LZ4F_CDict_s LZ4F_CDict; 577*27162e4eSAndroid Build Coastguard Worker 578*27162e4eSAndroid Build Coastguard Worker /*! LZ4_createCDict() : stable since v1.10 579*27162e4eSAndroid Build Coastguard Worker * When compressing multiple messages / blocks using the same dictionary, it's recommended to initialize it just once. 580*27162e4eSAndroid Build Coastguard Worker * LZ4_createCDict() will create a digested dictionary, ready to start future compression operations without startup delay. 581*27162e4eSAndroid Build Coastguard Worker * LZ4_CDict can be created once and shared by multiple threads concurrently, since its usage is read-only. 582*27162e4eSAndroid Build Coastguard Worker * @dictBuffer can be released after LZ4_CDict creation, since its content is copied within CDict. */ 583*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API LZ4F_CDict* LZ4F_createCDict(const void* dictBuffer, size_t dictSize); 584*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API void LZ4F_freeCDict(LZ4F_CDict* CDict); 585*27162e4eSAndroid Build Coastguard Worker 586*27162e4eSAndroid Build Coastguard Worker /*! LZ4_compressFrame_usingCDict() : stable since v1.10 587*27162e4eSAndroid Build Coastguard Worker * Compress an entire srcBuffer into a valid LZ4 frame using a digested Dictionary. 588*27162e4eSAndroid Build Coastguard Worker * @cctx must point to a context created by LZ4F_createCompressionContext(). 589*27162e4eSAndroid Build Coastguard Worker * If @cdict==NULL, compress without a dictionary. 590*27162e4eSAndroid Build Coastguard Worker * @dstBuffer MUST be >= LZ4F_compressFrameBound(srcSize, preferencesPtr). 591*27162e4eSAndroid Build Coastguard Worker * If this condition is not respected, function will fail (@return an errorCode). 592*27162e4eSAndroid Build Coastguard Worker * The LZ4F_preferences_t structure is optional : one may provide NULL as argument, 593*27162e4eSAndroid Build Coastguard Worker * but it's not recommended, as it's the only way to provide @dictID in the frame header. 594*27162e4eSAndroid Build Coastguard Worker * @return : number of bytes written into dstBuffer. 595*27162e4eSAndroid Build Coastguard Worker * or an error code if it fails (can be tested using LZ4F_isError()) 596*27162e4eSAndroid Build Coastguard Worker * Note: for larger inputs generating multiple independent blocks, 597*27162e4eSAndroid Build Coastguard Worker * this entry point uses the dictionary for each block. */ 598*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t 599*27162e4eSAndroid Build Coastguard Worker LZ4F_compressFrame_usingCDict(LZ4F_cctx* cctx, 600*27162e4eSAndroid Build Coastguard Worker void* dst, size_t dstCapacity, 601*27162e4eSAndroid Build Coastguard Worker const void* src, size_t srcSize, 602*27162e4eSAndroid Build Coastguard Worker const LZ4F_CDict* cdict, 603*27162e4eSAndroid Build Coastguard Worker const LZ4F_preferences_t* preferencesPtr); 604*27162e4eSAndroid Build Coastguard Worker 605*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_compressBegin_usingCDict() : stable since v1.10 606*27162e4eSAndroid Build Coastguard Worker * Inits streaming dictionary compression, and writes the frame header into dstBuffer. 607*27162e4eSAndroid Build Coastguard Worker * @dstCapacity must be >= LZ4F_HEADER_SIZE_MAX bytes. 608*27162e4eSAndroid Build Coastguard Worker * @prefsPtr is optional : one may provide NULL as argument, 609*27162e4eSAndroid Build Coastguard Worker * note however that it's the only way to insert a @dictID in the frame header. 610*27162e4eSAndroid Build Coastguard Worker * @cdict must outlive the compression session. 611*27162e4eSAndroid Build Coastguard Worker * @return : number of bytes written into dstBuffer for the header, 612*27162e4eSAndroid Build Coastguard Worker * or an error code, which can be tested using LZ4F_isError(). */ 613*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_API size_t 614*27162e4eSAndroid Build Coastguard Worker LZ4F_compressBegin_usingCDict(LZ4F_cctx* cctx, 615*27162e4eSAndroid Build Coastguard Worker void* dstBuffer, size_t dstCapacity, 616*27162e4eSAndroid Build Coastguard Worker const LZ4F_CDict* cdict, 617*27162e4eSAndroid Build Coastguard Worker const LZ4F_preferences_t* prefsPtr); 618*27162e4eSAndroid Build Coastguard Worker 619*27162e4eSAndroid Build Coastguard Worker 620*27162e4eSAndroid Build Coastguard Worker #if defined (__cplusplus) 621*27162e4eSAndroid Build Coastguard Worker } 622*27162e4eSAndroid Build Coastguard Worker #endif 623*27162e4eSAndroid Build Coastguard Worker 624*27162e4eSAndroid Build Coastguard Worker #endif /* LZ4F_H_09782039843 */ 625*27162e4eSAndroid Build Coastguard Worker 626*27162e4eSAndroid Build Coastguard Worker #if defined(LZ4F_STATIC_LINKING_ONLY) && !defined(LZ4F_H_STATIC_09782039843) 627*27162e4eSAndroid Build Coastguard Worker #define LZ4F_H_STATIC_09782039843 628*27162e4eSAndroid Build Coastguard Worker 629*27162e4eSAndroid Build Coastguard Worker /* Note : 630*27162e4eSAndroid Build Coastguard Worker * The below declarations are not stable and may change in the future. 631*27162e4eSAndroid Build Coastguard Worker * They are therefore only safe to depend on 632*27162e4eSAndroid Build Coastguard Worker * when the caller is statically linked against the library. 633*27162e4eSAndroid Build Coastguard Worker * To access their declarations, define LZ4F_STATIC_LINKING_ONLY. 634*27162e4eSAndroid Build Coastguard Worker * 635*27162e4eSAndroid Build Coastguard Worker * By default, these symbols aren't published into shared/dynamic libraries. 636*27162e4eSAndroid Build Coastguard Worker * You can override this behavior and force them to be published 637*27162e4eSAndroid Build Coastguard Worker * by defining LZ4F_PUBLISH_STATIC_FUNCTIONS. 638*27162e4eSAndroid Build Coastguard Worker * Use at your own risk. 639*27162e4eSAndroid Build Coastguard Worker */ 640*27162e4eSAndroid Build Coastguard Worker 641*27162e4eSAndroid Build Coastguard Worker #if defined (__cplusplus) 642*27162e4eSAndroid Build Coastguard Worker extern "C" { 643*27162e4eSAndroid Build Coastguard Worker #endif 644*27162e4eSAndroid Build Coastguard Worker 645*27162e4eSAndroid Build Coastguard Worker #ifdef LZ4F_PUBLISH_STATIC_FUNCTIONS 646*27162e4eSAndroid Build Coastguard Worker # define LZ4FLIB_STATIC_API LZ4FLIB_API 647*27162e4eSAndroid Build Coastguard Worker #else 648*27162e4eSAndroid Build Coastguard Worker # define LZ4FLIB_STATIC_API 649*27162e4eSAndroid Build Coastguard Worker #endif 650*27162e4eSAndroid Build Coastguard Worker 651*27162e4eSAndroid Build Coastguard Worker 652*27162e4eSAndroid Build Coastguard Worker /* --- Error List --- */ 653*27162e4eSAndroid Build Coastguard Worker #define LZ4F_LIST_ERRORS(ITEM) \ 654*27162e4eSAndroid Build Coastguard Worker ITEM(OK_NoError) \ 655*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_GENERIC) \ 656*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_maxBlockSize_invalid) \ 657*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_blockMode_invalid) \ 658*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_parameter_invalid) \ 659*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_compressionLevel_invalid) \ 660*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_headerVersion_wrong) \ 661*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_blockChecksum_invalid) \ 662*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_reservedFlag_set) \ 663*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_allocation_failed) \ 664*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_srcSize_tooLarge) \ 665*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_dstMaxSize_tooSmall) \ 666*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_frameHeader_incomplete) \ 667*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_frameType_unknown) \ 668*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_frameSize_wrong) \ 669*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_srcPtr_wrong) \ 670*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_decompressionFailed) \ 671*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_headerChecksum_invalid) \ 672*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_contentChecksum_invalid) \ 673*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_frameDecoding_alreadyStarted) \ 674*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_compressionState_uninitialized) \ 675*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_parameter_null) \ 676*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_io_write) \ 677*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_io_read) \ 678*27162e4eSAndroid Build Coastguard Worker ITEM(ERROR_maxCode) 679*27162e4eSAndroid Build Coastguard Worker 680*27162e4eSAndroid Build Coastguard Worker #define LZ4F_GENERATE_ENUM(ENUM) LZ4F_##ENUM, 681*27162e4eSAndroid Build Coastguard Worker 682*27162e4eSAndroid Build Coastguard Worker /* enum list is exposed, to handle specific errors */ 683*27162e4eSAndroid Build Coastguard Worker typedef enum { LZ4F_LIST_ERRORS(LZ4F_GENERATE_ENUM) 684*27162e4eSAndroid Build Coastguard Worker _LZ4F_dummy_error_enum_for_c89_never_used } LZ4F_errorCodes; 685*27162e4eSAndroid Build Coastguard Worker 686*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_STATIC_API LZ4F_errorCodes LZ4F_getErrorCode(size_t functionResult); 687*27162e4eSAndroid Build Coastguard Worker 688*27162e4eSAndroid Build Coastguard Worker /********************************** 689*27162e4eSAndroid Build Coastguard Worker * Advanced compression operations 690*27162e4eSAndroid Build Coastguard Worker *********************************/ 691*27162e4eSAndroid Build Coastguard Worker 692*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_getBlockSize() : 693*27162e4eSAndroid Build Coastguard Worker * @return, in scalar format (size_t), 694*27162e4eSAndroid Build Coastguard Worker * the maximum block size associated with @blockSizeID, 695*27162e4eSAndroid Build Coastguard Worker * or an error code (can be tested using LZ4F_isError()) if @blockSizeID is invalid. 696*27162e4eSAndroid Build Coastguard Worker **/ 697*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_STATIC_API size_t LZ4F_getBlockSize(LZ4F_blockSizeID_t blockSizeID); 698*27162e4eSAndroid Build Coastguard Worker 699*27162e4eSAndroid Build Coastguard Worker /*! LZ4F_uncompressedUpdate() : 700*27162e4eSAndroid Build Coastguard Worker * LZ4F_uncompressedUpdate() can be called repetitively to add data stored as uncompressed blocks. 701*27162e4eSAndroid Build Coastguard Worker * Important rule: dstCapacity MUST be large enough to store the entire source buffer as 702*27162e4eSAndroid Build Coastguard Worker * no compression is done for this operation 703*27162e4eSAndroid Build Coastguard Worker * If this condition is not respected, LZ4F_uncompressedUpdate() will fail (result is an errorCode). 704*27162e4eSAndroid Build Coastguard Worker * After an error, the state is left in a UB state, and must be re-initialized or freed. 705*27162e4eSAndroid Build Coastguard Worker * If previously a compressed block was written, buffered data is flushed first, 706*27162e4eSAndroid Build Coastguard Worker * before appending uncompressed data is continued. 707*27162e4eSAndroid Build Coastguard Worker * This operation is only supported when LZ4F_blockIndependent is used. 708*27162e4eSAndroid Build Coastguard Worker * `cOptPtr` is optional : NULL can be provided, in which case all options are set to default. 709*27162e4eSAndroid Build Coastguard Worker * @return : number of bytes written into `dstBuffer` (it can be zero, meaning input data was just buffered). 710*27162e4eSAndroid Build Coastguard Worker * or an error code if it fails (which can be tested using LZ4F_isError()) 711*27162e4eSAndroid Build Coastguard Worker */ 712*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_STATIC_API size_t 713*27162e4eSAndroid Build Coastguard Worker LZ4F_uncompressedUpdate(LZ4F_cctx* cctx, 714*27162e4eSAndroid Build Coastguard Worker void* dstBuffer, size_t dstCapacity, 715*27162e4eSAndroid Build Coastguard Worker const void* srcBuffer, size_t srcSize, 716*27162e4eSAndroid Build Coastguard Worker const LZ4F_compressOptions_t* cOptPtr); 717*27162e4eSAndroid Build Coastguard Worker 718*27162e4eSAndroid Build Coastguard Worker /********************************** 719*27162e4eSAndroid Build Coastguard Worker * Custom memory allocation 720*27162e4eSAndroid Build Coastguard Worker *********************************/ 721*27162e4eSAndroid Build Coastguard Worker 722*27162e4eSAndroid Build Coastguard Worker /*! Custom memory allocation : v1.9.4+ 723*27162e4eSAndroid Build Coastguard Worker * These prototypes make it possible to pass custom allocation/free functions. 724*27162e4eSAndroid Build Coastguard Worker * LZ4F_customMem is provided at state creation time, using LZ4F_create*_advanced() listed below. 725*27162e4eSAndroid Build Coastguard Worker * All allocation/free operations will be completed using these custom variants instead of regular <stdlib.h> ones. 726*27162e4eSAndroid Build Coastguard Worker */ 727*27162e4eSAndroid Build Coastguard Worker typedef void* (*LZ4F_AllocFunction) (void* opaqueState, size_t size); 728*27162e4eSAndroid Build Coastguard Worker typedef void* (*LZ4F_CallocFunction) (void* opaqueState, size_t size); 729*27162e4eSAndroid Build Coastguard Worker typedef void (*LZ4F_FreeFunction) (void* opaqueState, void* address); 730*27162e4eSAndroid Build Coastguard Worker typedef struct { 731*27162e4eSAndroid Build Coastguard Worker LZ4F_AllocFunction customAlloc; 732*27162e4eSAndroid Build Coastguard Worker LZ4F_CallocFunction customCalloc; /* optional; when not defined, uses customAlloc + memset */ 733*27162e4eSAndroid Build Coastguard Worker LZ4F_FreeFunction customFree; 734*27162e4eSAndroid Build Coastguard Worker void* opaqueState; 735*27162e4eSAndroid Build Coastguard Worker } LZ4F_CustomMem; 736*27162e4eSAndroid Build Coastguard Worker static 737*27162e4eSAndroid Build Coastguard Worker #ifdef __GNUC__ 738*27162e4eSAndroid Build Coastguard Worker __attribute__((__unused__)) 739*27162e4eSAndroid Build Coastguard Worker #endif 740*27162e4eSAndroid Build Coastguard Worker LZ4F_CustomMem const LZ4F_defaultCMem = { NULL, NULL, NULL, NULL }; /**< this constant defers to stdlib's functions */ 741*27162e4eSAndroid Build Coastguard Worker 742*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_STATIC_API LZ4F_cctx* LZ4F_createCompressionContext_advanced(LZ4F_CustomMem customMem, unsigned version); 743*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_STATIC_API LZ4F_dctx* LZ4F_createDecompressionContext_advanced(LZ4F_CustomMem customMem, unsigned version); 744*27162e4eSAndroid Build Coastguard Worker LZ4FLIB_STATIC_API LZ4F_CDict* LZ4F_createCDict_advanced(LZ4F_CustomMem customMem, const void* dictBuffer, size_t dictSize); 745*27162e4eSAndroid Build Coastguard Worker 746*27162e4eSAndroid Build Coastguard Worker 747*27162e4eSAndroid Build Coastguard Worker #if defined (__cplusplus) 748*27162e4eSAndroid Build Coastguard Worker } 749*27162e4eSAndroid Build Coastguard Worker #endif 750*27162e4eSAndroid Build Coastguard Worker 751*27162e4eSAndroid Build Coastguard Worker #endif /* defined(LZ4F_STATIC_LINKING_ONLY) && !defined(LZ4F_H_STATIC_09782039843) */ 752