97
97
# define LZ4LIB_API LZ4LIB_VISIBILITY
100
/*! LZ4_FREESTANDING :
101
* When this macro is set to 1, it enables "freestanding mode" that is
102
* suitable for typical freestanding environment which doesn't support
103
* standard C library.
105
* - LZ4_FREESTANDING is a compile-time switch.
106
* - It requires the following macros to be defined:
107
* LZ4_memcpy, LZ4_memmove, LZ4_memset.
108
* - It only enables LZ4/HC functions which don't use heap.
109
* All LZ4F_* functions are not supported.
110
* - See tests/freestanding.c to check its basic setup.
112
#if defined(LZ4_FREESTANDING) && (LZ4_FREESTANDING == 1)
113
# define LZ4_HEAPMODE 0
114
# define LZ4HC_HEAPMODE 0
115
# define LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION 1
116
# if !defined(LZ4_memcpy)
117
# error "LZ4_FREESTANDING requires macro 'LZ4_memcpy'."
119
# if !defined(LZ4_memset)
120
# error "LZ4_FREESTANDING requires macro 'LZ4_memset'."
122
# if !defined(LZ4_memmove)
123
# error "LZ4_FREESTANDING requires macro 'LZ4_memmove'."
125
#elif ! defined(LZ4_FREESTANDING)
126
# define LZ4_FREESTANDING 0
100
130
/*------ Version ------*/
101
131
#define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */
102
132
#define LZ4_VERSION_MINOR 9 /* for new (non-breaking) interface capabilities */
103
#define LZ4_VERSION_RELEASE 3 /* for tweaks, bug-fixes, or development */
133
#define LZ4_VERSION_RELEASE 4 /* for tweaks, bug-fixes, or development */
105
135
#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE)
107
137
#define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE
108
138
#define LZ4_QUOTE(str) #str
109
139
#define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str)
110
#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION)
140
#define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION) /* requires v1.7.3+ */
112
LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version */
113
LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version */
142
LZ4LIB_API int LZ4_versionNumber (void); /**< library version number; useful to check dll version; requires v1.3.0+ */
143
LZ4LIB_API const char* LZ4_versionString (void); /**< library version string; useful to check dll version; requires v1.7.5+ */
116
146
/*-************************************
117
147
* Tuning parameter
118
148
**************************************/
149
#define LZ4_MEMORY_USAGE_MIN 10
150
#define LZ4_MEMORY_USAGE_DEFAULT 14
151
#define LZ4_MEMORY_USAGE_MAX 20
120
154
* LZ4_MEMORY_USAGE :
121
* Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; etc.)
122
* Increasing memory usage improves compression ratio.
123
* Reduced memory usage may improve speed, thanks to better cache locality.
155
* Memory usage formula : N->2^N Bytes (examples : 10 -> 1KB; 12 -> 4KB ; 16 -> 64KB; 20 -> 1MB; )
156
* Increasing memory usage improves compression ratio, at the cost of speed.
157
* Reduced memory usage may improve speed at the cost of ratio, thanks to better cache locality.
124
158
* Default value is 14, for 16KB, which nicely fits into Intel x86 L1 cache
126
160
#ifndef LZ4_MEMORY_USAGE
127
# define LZ4_MEMORY_USAGE 14
161
# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT
164
#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN)
165
# error "LZ4_MEMORY_USAGE is too small !"
168
#if (LZ4_MEMORY_USAGE > LZ4_MEMORY_USAGE_MAX)
169
# error "LZ4_MEMORY_USAGE is too large !"
131
172
/*-************************************
132
173
* Simple Functions
270
311
***********************************************/
271
312
typedef union LZ4_stream_u LZ4_stream_t; /* incomplete type (defined later) */
315
Note about RC_INVOKED
317
- RC_INVOKED is predefined symbol of rc.exe (the resource compiler which is part of MSVC/Visual Studio).
318
https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros
320
- Since rc.exe is a legacy compiler, it truncates long symbol (> 30 chars)
321
and reports warning "RC4011: identifier truncated".
323
- To eliminate the warning, we surround long preprocessor symbol with
324
"#if !defined(RC_INVOKED) ... #endif" block that means
325
"skip this block when rc.exe is trying to read it".
327
#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */
328
#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
273
329
LZ4LIB_API LZ4_stream_t* LZ4_createStream(void);
274
330
LZ4LIB_API int LZ4_freeStream (LZ4_stream_t* streamPtr);
331
#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */
276
334
/*! LZ4_resetStream_fast() : v1.9.0+
277
335
* Use this to prepare an LZ4_stream_t for a new chain of dependent blocks
355
413
* creation / destruction of streaming decompression tracking context.
356
414
* A tracking context can be re-used multiple times.
416
#if !defined(RC_INVOKED) /* https://docs.microsoft.com/en-us/windows/win32/menurc/predefined-macros */
417
#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
358
418
LZ4LIB_API LZ4_streamDecode_t* LZ4_createStreamDecode(void);
359
419
LZ4LIB_API int LZ4_freeStreamDecode (LZ4_streamDecode_t* LZ4_stream);
420
#endif /* !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION) */
361
423
/*! LZ4_setStreamDecode() :
362
424
* An LZ4_streamDecode_t context can be allocated once and re-used multiple times.
406
468
* save the last 64KB of decoded data into a safe buffer where it can't be modified during decompression,
407
469
* then indicate where this data is saved using LZ4_setStreamDecode(), before decompressing next block.
409
LZ4LIB_API int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int srcSize, int dstCapacity);
472
LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode,
473
const char* src, char* dst,
474
int srcSize, int dstCapacity);
412
477
/*! LZ4_decompress_*_usingDict() :
417
482
* Performance tip : Decompression speed can be substantially increased
418
483
* when dst == dictStart + dictSize.
420
LZ4LIB_API int LZ4_decompress_safe_usingDict (const char* src, char* dst, int srcSize, int dstCapcity, const char* dictStart, int dictSize);
486
LZ4_decompress_safe_usingDict(const char* src, char* dst,
487
int srcSize, int dstCapacity,
488
const char* dictStart, int dictSize);
491
LZ4_decompress_safe_partial_usingDict(const char* src, char* dst,
493
int targetOutputSize, int maxOutputSize,
494
const char* dictStart, int dictSize);
422
496
#endif /* LZ4_H_2983827168210 */
496
570
* stream (and source buffer) must remain in-place / accessible / unchanged
497
571
* through the completion of the first compression call on the stream.
499
LZ4LIB_STATIC_API void LZ4_attach_dictionary(LZ4_stream_t* workingStream, const LZ4_stream_t* dictionaryStream);
573
LZ4LIB_STATIC_API void
574
LZ4_attach_dictionary(LZ4_stream_t* workingStream,
575
const LZ4_stream_t* dictionaryStream);
502
578
/*! In-place compression and decompression
504
580
* It's possible to have input and output sharing the same buffer,
505
* for highly contrained memory environments.
581
* for highly constrained memory environments.
506
582
* In both cases, it requires input to lay at the end of the buffer,
507
583
* and decompression to start at beginning of the buffer.
508
584
* Buffer size must feature some margin, hence be larger than final size.
592
668
typedef unsigned int LZ4_u32;
672
* Never ever use below internal definitions directly !
673
* These definitions are not API/ABI safe, and may change in future versions.
674
* If you need static allocation, declare or allocate an LZ4_stream_t object.
595
677
typedef struct LZ4_stream_t_internal LZ4_stream_t_internal;
596
678
struct LZ4_stream_t_internal {
597
679
LZ4_u32 hashTable[LZ4_HASH_SIZE_U32];
680
const LZ4_byte* dictionary;
681
const LZ4_stream_t_internal* dictCtx;
598
682
LZ4_u32 currentOffset;
599
683
LZ4_u32 tableType;
600
const LZ4_byte* dictionary;
601
const LZ4_stream_t_internal* dictCtx;
602
684
LZ4_u32 dictSize;
685
/* Implicit padding to ensure structure is aligned */
606
const LZ4_byte* externalDict;
608
const LZ4_byte* prefixEnd;
610
} LZ4_streamDecode_t_internal;
614
* Do not use below internal definitions directly !
615
* Declare or allocate an LZ4_stream_t instead.
616
* LZ4_stream_t can also be created using LZ4_createStream(), which is recommended.
617
* The structure definition can be convenient for static allocation
618
* (on stack, or as part of larger structure).
619
* Init this structure with LZ4_initStream() before first use.
620
* note : only use this definition in association with static linking !
621
* this definition is not API/ABI safe, and may change in future versions.
623
#define LZ4_STREAMSIZE 16416 /* static size, for inter-version compatibility */
624
#define LZ4_STREAMSIZE_VOIDP (LZ4_STREAMSIZE / sizeof(void*))
688
#define LZ4_STREAM_MINSIZE ((1UL << LZ4_MEMORY_USAGE) + 32) /* static size, for inter-version compatibility */
625
689
union LZ4_stream_u {
626
void* table[LZ4_STREAMSIZE_VOIDP];
690
char minStateSize[LZ4_STREAM_MINSIZE];
627
691
LZ4_stream_t_internal internal_donotuse;
628
692
}; /* previously typedef'd to LZ4_stream_t */
641
705
* In which case, the function will @return NULL.
642
706
* Note2: An LZ4_stream_t structure guarantees correct alignment and size.
643
707
* Note3: Before v1.9.0, use LZ4_resetStream() instead
645
709
LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size);
648
712
/*! LZ4_streamDecode_t :
649
* information structure to track an LZ4 stream during decompression.
650
* init this structure using LZ4_setStreamDecode() before first use.
651
* note : only use in association with static linking !
652
* this definition is not API/ABI safe,
653
* and may change in a future version !
655
#define LZ4_STREAMDECODESIZE_U64 (4 + ((sizeof(void*)==16) ? 2 : 0) /*AS-400*/ )
656
#define LZ4_STREAMDECODESIZE (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long))
713
* Never ever use below internal definitions directly !
714
* These definitions are not API/ABI safe, and may change in future versions.
715
* If you need static allocation, declare or allocate an LZ4_streamDecode_t object.
718
const LZ4_byte* externalDict;
719
const LZ4_byte* prefixEnd;
722
} LZ4_streamDecode_t_internal;
724
#define LZ4_STREAMDECODE_MINSIZE 32
657
725
union LZ4_streamDecode_u {
658
unsigned long long table[LZ4_STREAMDECODESIZE_U64];
726
char minStateSize[LZ4_STREAMDECODE_MINSIZE];
659
727
LZ4_streamDecode_t_internal internal_donotuse;
660
728
} ; /* previously typedef'd to LZ4_streamDecode_t */