~mmach/netext73/lz4

« back to all changes in this revision

Viewing changes to lib/lz4.h

  • Committer: mmach
  • Date: 2022-11-09 18:52:10 UTC
  • Revision ID: netbit73@gmail.com-20221109185210-w358idlhh0phq688
1.9.4

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
/*
2
2
 *  LZ4 - Fast LZ compression algorithm
3
3
 *  Header File
4
 
 *  Copyright (C) 2011-present, Yann Collet.
 
4
 *  Copyright (C) 2011-2020, Yann Collet.
5
5
 
6
6
   BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
7
7
 
97
97
#  define LZ4LIB_API LZ4LIB_VISIBILITY
98
98
#endif
99
99
 
 
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.
 
104
 *
 
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.
 
111
 */
 
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'."
 
118
#  endif
 
119
#  if !defined(LZ4_memset)
 
120
#    error "LZ4_FREESTANDING requires macro 'LZ4_memset'."
 
121
#  endif
 
122
#  if !defined(LZ4_memmove)
 
123
#    error "LZ4_FREESTANDING requires macro 'LZ4_memmove'."
 
124
#  endif
 
125
#elif ! defined(LZ4_FREESTANDING)
 
126
#  define LZ4_FREESTANDING 0
 
127
#endif
 
128
 
 
129
 
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 */
104
134
 
105
135
#define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE)
106
136
 
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+ */
111
141
 
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+ */
114
144
 
115
145
 
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
 
152
 
119
153
/*!
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
125
159
 */
126
160
#ifndef LZ4_MEMORY_USAGE
127
 
# define LZ4_MEMORY_USAGE 14
128
 
#endif
129
 
 
 
161
# define LZ4_MEMORY_USAGE LZ4_MEMORY_USAGE_DEFAULT
 
162
#endif
 
163
 
 
164
#if (LZ4_MEMORY_USAGE < LZ4_MEMORY_USAGE_MIN)
 
165
#  error "LZ4_MEMORY_USAGE is too small !"
 
166
#endif
 
167
 
 
168
#if (LZ4_MEMORY_USAGE > LZ4_MEMORY_USAGE_MAX)
 
169
#  error "LZ4_MEMORY_USAGE is too large !"
 
170
#endif
130
171
 
131
172
/*-************************************
132
173
*  Simple Functions
270
311
***********************************************/
271
312
typedef union LZ4_stream_u LZ4_stream_t;  /* incomplete type (defined later) */
272
313
 
 
314
/**
 
315
 Note about RC_INVOKED
 
316
 
 
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
 
319
 
 
320
 - Since rc.exe is a legacy compiler, it truncates long symbol (> 30 chars)
 
321
   and reports warning "RC4011: identifier truncated".
 
322
 
 
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".
 
326
*/
 
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) */
 
332
#endif
275
333
 
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.
357
415
 */
 
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) */
 
421
#endif
360
422
 
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.
408
470
*/
409
 
LZ4LIB_API int LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode, const char* src, char* dst, int srcSize, int dstCapacity);
 
471
LZ4LIB_API int
 
472
LZ4_decompress_safe_continue (LZ4_streamDecode_t* LZ4_streamDecode,
 
473
                        const char* src, char* dst,
 
474
                        int srcSize, int dstCapacity);
410
475
 
411
476
 
412
477
/*! LZ4_decompress_*_usingDict() :
417
482
 *  Performance tip : Decompression speed can be substantially increased
418
483
 *                    when dst == dictStart + dictSize.
419
484
 */
420
 
LZ4LIB_API int LZ4_decompress_safe_usingDict (const char* src, char* dst, int srcSize, int dstCapcity, const char* dictStart, int dictSize);
 
485
LZ4LIB_API int
 
486
LZ4_decompress_safe_usingDict(const char* src, char* dst,
 
487
                              int srcSize, int dstCapacity,
 
488
                              const char* dictStart, int dictSize);
 
489
 
 
490
LZ4LIB_API int
 
491
LZ4_decompress_safe_partial_usingDict(const char* src, char* dst,
 
492
                                      int compressedSize,
 
493
                                      int targetOutputSize, int maxOutputSize,
 
494
                                      const char* dictStart, int dictSize);
421
495
 
422
496
#endif /* LZ4_H_2983827168210 */
423
497
 
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.
498
572
 */
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);
500
576
 
501
577
 
502
578
/*! In-place compression and decompression
503
579
 *
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;
593
669
#endif
594
670
 
 
671
/*! LZ4_stream_t :
 
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.
 
675
**/
 
676
 
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 */
603
686
};
604
687
 
605
 
typedef struct {
606
 
    const LZ4_byte* externalDict;
607
 
    size_t extDictSize;
608
 
    const LZ4_byte* prefixEnd;
609
 
    size_t prefixSize;
610
 
} LZ4_streamDecode_t_internal;
611
 
 
612
 
 
613
 
/*! LZ4_stream_t :
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.
622
 
 */
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 */
629
693
 
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
644
 
 */
 
708
**/
645
709
LZ4LIB_API LZ4_stream_t* LZ4_initStream (void* buffer, size_t size);
646
710
 
647
711
 
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 !
654
 
 */
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.
 
716
**/
 
717
typedef struct {
 
718
    const LZ4_byte* externalDict;
 
719
    const LZ4_byte* prefixEnd;
 
720
    size_t extDictSize;
 
721
    size_t prefixSize;
 
722
} LZ4_streamDecode_t_internal;
 
723
 
 
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 */
661
729