@ -42,8 +42,8 @@
# ifdef _MSC_VER
# define FORCE_INLINE static __forceinline
# include <intrin.h>
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
# pragma warning(disable : 4293) /* disable: C4293: too large shift (32-bits) */
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
# pragma warning(disable : 4293) /* disable: C4293: too large shift (32-bits) */
# else
# define FORCE_INLINE static inline
# endif
@ -155,16 +155,16 @@ namespace {
A library is provided to take care of it , see lz4frame . h .
*/
# define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */
# define LZ4_VERSION_MINOR 7 /* for new (non-breaking) interface capabilities */
# define LZ4_VERSION_RELEASE 5 /* for tweaks, bug-fixes, or development */
# define LZ4_VERSION_MAJOR 1 /* for breaking interface changes */
# define LZ4_VERSION_MINOR 7 /* for new (non-breaking) interface capabilities */
# define LZ4_VERSION_RELEASE 5 /* for tweaks, bug-fixes, or development */
# define LZ4_VERSION_NUMBER (LZ4_VERSION_MAJOR *100*100 + LZ4_VERSION_MINOR *100 + LZ4_VERSION_RELEASE)
# define LZ4_LIB_VERSION LZ4_VERSION_MAJOR.LZ4_VERSION_MINOR.LZ4_VERSION_RELEASE
# define LZ4_QUOTE(str) #str
# define LZ4_EXPAND_AND_QUOTE(str) LZ4_QUOTE(str)
# define LZ4_VERSION_STRING LZ4_EXPAND_AND_QUOTE(LZ4_LIB_VERSION)
# define LZ4_MEMORY_USAGE 14
# define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */
# define LZ4_MAX_INPUT_SIZE 0x7E000000 /* 2 113 929 216 bytes */
# define LZ4_COMPRESSBOUND(isize) ((unsigned)(isize) > (unsigned)LZ4_MAX_INPUT_SIZE ? 0 : (isize) + ((isize) / 255) + 16)
typedef union LZ4_stream_u LZ4_stream_t ; /* incomplete type (defined later) */
@ -173,7 +173,7 @@ static inline void LZ4_resetStream (LZ4_stream_t* streamPtr);
# define LZ4_HASHLOG (LZ4_MEMORY_USAGE-2)
# define LZ4_HASHTABLESIZE (1 << LZ4_MEMORY_USAGE)
# define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */
# define LZ4_HASH_SIZE_U32 (1 << LZ4_HASHLOG) /* required as macro for static allocation */
typedef struct {
uint32_t hashTable [ LZ4_HASH_SIZE_U32 ] ;
@ -192,14 +192,14 @@ typedef struct {
} LZ4_streamDecode_t_internal ;
# define LZ4_STREAMSIZE_U64 ((1 << (LZ4_MEMORY_USAGE-3)) + 4)
# define LZ4_STREAMSIZE (LZ4_STREAMSIZE_U64 * sizeof(unsigned long long))
# define LZ4_STREAMSIZE (LZ4_STREAMSIZE_U64 * sizeof(unsigned long long))
union LZ4_stream_u {
unsigned long long table [ LZ4_STREAMSIZE_U64 ] ;
LZ4_stream_t_internal internal_donotuse ;
} ; /* previously typedef'd to LZ4_stream_t */
# define LZ4_STREAMDECODESIZE_U64 4
# define LZ4_STREAMDECODESIZE (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long))
# define LZ4_STREAMDECODESIZE (LZ4_STREAMDECODESIZE_U64 * sizeof(unsigned long long))
union LZ4_streamDecode_u {
unsigned long long table [ LZ4_STREAMDECODESIZE_U64 ] ;
LZ4_streamDecode_t_internal internal_donotuse ;
@ -224,8 +224,8 @@ union LZ4_streamDecode_u {
# endif
# define ALLOCATOR(n,s) calloc(n,s)
# define FREEMEM free
# define MEM_INIT memset
# define FREEMEM free
# define MEM_INIT memset
typedef uint8_t BYTE ;
typedef uint16_t U16 ;
@ -280,21 +280,21 @@ static inline void LZ4_write32(void* memPtr, U32 value)
static inline U16 LZ4_readLE16 ( const void * memPtr )
{
if ( LZ4_isLittleEndian ( ) ) {
return LZ4_read16 ( memPtr ) ;
return LZ4_read16 ( memPtr ) ;
} else {
const BYTE * p = ( const BYTE * ) memPtr ;
return ( U16 ) ( ( U16 ) p [ 0 ] + ( p [ 1 ] < < 8 ) ) ;
const BYTE * p = ( const BYTE * ) memPtr ;
return ( U16 ) ( ( U16 ) p [ 0 ] + ( p [ 1 ] < < 8 ) ) ;
}
}
static inline void LZ4_writeLE16 ( void * memPtr , U16 value )
{
if ( LZ4_isLittleEndian ( ) ) {
LZ4_write16 ( memPtr , value ) ;
LZ4_write16 ( memPtr , value ) ;
} else {
BYTE * p = ( BYTE * ) memPtr ;
p [ 0 ] = ( BYTE ) value ;
p [ 1 ] = ( BYTE ) ( value > > 8 ) ;
BYTE * p = ( BYTE * ) memPtr ;
p [ 0 ] = ( BYTE ) value ;
p [ 1 ] = ( BYTE ) ( value > > 8 ) ;
}
}
@ -330,63 +330,63 @@ static const int LZ4_minLength = (MFLIMIT+1);
# define RUN_BITS (8-ML_BITS)
# define RUN_MASK ((1U<<RUN_BITS)-1)
# define LZ4_STATIC_ASSERT(c) { enum { LZ4_static_assert = 1 / (int)(!!(c)) }; } /* use only *after* variable declarations */
# define LZ4_STATIC_ASSERT(c) { enum { LZ4_static_assert = 1 / (int)(!!(c)) }; } /* use only *after* variable declarations */
static inline unsigned LZ4_NbCommonBytes ( reg_t val )
{
if ( LZ4_isLittleEndian ( ) ) {
if ( sizeof ( val ) = = 8 ) {
# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT)
unsigned long r = 0 ;
_BitScanForward64 ( & r , ( U64 ) val ) ;
return ( int ) ( r > > 3 ) ;
# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)
return ( __builtin_ctzll ( ( U64 ) val ) > > 3 ) ;
# else
static const int DeBruijnBytePos [ 64 ] = { 0 , 0 , 0 , 0 , 0 , 1 , 1 , 2 , 0 , 3 , 1 , 3 , 1 , 4 , 2 , 7 , 0 , 2 , 3 , 6 , 1 , 5 , 3 , 5 , 1 , 3 , 4 , 4 , 2 , 5 , 6 , 7 , 7 , 0 , 1 , 2 , 3 , 3 , 4 , 6 , 2 , 6 , 5 , 5 , 3 , 4 , 5 , 6 , 7 , 1 , 2 , 4 , 6 , 4 , 4 , 5 , 7 , 2 , 6 , 5 , 7 , 6 , 7 , 7 } ;
return DeBruijnBytePos [ ( ( U64 ) ( ( val & - ( long long ) val ) * 0x0218A392CDABBD3FULL ) ) > > 58 ] ;
# endif
} else /* 32 bits */ {
# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT)
unsigned long r ;
_BitScanForward ( & r , ( U32 ) val ) ;
return ( int ) ( r > > 3 ) ;
# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)
return ( __builtin_ctz ( ( U32 ) val ) > > 3 ) ;
# else
static const int DeBruijnBytePos [ 32 ] = { 0 , 0 , 3 , 0 , 3 , 1 , 3 , 0 , 3 , 2 , 2 , 1 , 3 , 2 , 0 , 1 , 3 , 3 , 1 , 2 , 2 , 2 , 2 , 0 , 3 , 1 , 2 , 0 , 1 , 0 , 1 , 1 } ;
return DeBruijnBytePos [ ( ( U32 ) ( ( val & - ( S32 ) val ) * 0x077CB531U ) ) > > 27 ] ;
# endif
}
if ( sizeof ( val ) = = 8 ) {
# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT)
unsigned long r = 0 ;
_BitScanForward64 ( & r , ( U64 ) val ) ;
return ( int ) ( r > > 3 ) ;
# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)
return ( __builtin_ctzll ( ( U64 ) val ) > > 3 ) ;
# else
static const int DeBruijnBytePos [ 64 ] = { 0 , 0 , 0 , 0 , 0 , 1 , 1 , 2 , 0 , 3 , 1 , 3 , 1 , 4 , 2 , 7 , 0 , 2 , 3 , 6 , 1 , 5 , 3 , 5 , 1 , 3 , 4 , 4 , 2 , 5 , 6 , 7 , 7 , 0 , 1 , 2 , 3 , 3 , 4 , 6 , 2 , 6 , 5 , 5 , 3 , 4 , 5 , 6 , 7 , 1 , 2 , 4 , 6 , 4 , 4 , 5 , 7 , 2 , 6 , 5 , 7 , 6 , 7 , 7 } ;
return DeBruijnBytePos [ ( ( U64 ) ( ( val & - ( long long ) val ) * 0x0218A392CDABBD3FULL ) ) > > 58 ] ;
# endif
} else /* 32 bits */ {
# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT)
unsigned long r ;
_BitScanForward ( & r , ( U32 ) val ) ;
return ( int ) ( r > > 3 ) ;
# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)
return ( __builtin_ctz ( ( U32 ) val ) > > 3 ) ;
# else
static const int DeBruijnBytePos [ 32 ] = { 0 , 0 , 3 , 0 , 3 , 1 , 3 , 0 , 3 , 2 , 2 , 1 , 3 , 2 , 0 , 1 , 3 , 3 , 1 , 2 , 2 , 2 , 2 , 0 , 3 , 1 , 2 , 0 , 1 , 0 , 1 , 1 } ;
return DeBruijnBytePos [ ( ( U32 ) ( ( val & - ( S32 ) val ) * 0x077CB531U ) ) > > 27 ] ;
# endif
}
} else /* Big Endian CPU */ {
if ( sizeof ( val ) = = 8 ) {
# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT)
unsigned long r = 0 ;
_BitScanReverse64 ( & r , val ) ;
return ( unsigned ) ( r > > 3 ) ;
# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)
return ( __builtin_clzll ( ( U64 ) val ) > > 3 ) ;
# else
unsigned r ;
if ( ! ( val > > 32 ) ) { r = 4 ; } else { r = 0 ; val > > = 32 ; }
if ( ! ( val > > 16 ) ) { r + = 2 ; val > > = 8 ; } else { val > > = 24 ; }
r + = ( ! val ) ;
return r ;
# endif
} else /* 32 bits */ {
# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT)
unsigned long r = 0 ;
_BitScanReverse ( & r , ( unsigned long ) val ) ;
return ( unsigned ) ( r > > 3 ) ;
# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)
return ( __builtin_clz ( ( U32 ) val ) > > 3 ) ;
# else
unsigned r ;
if ( ! ( val > > 16 ) ) { r = 2 ; val > > = 8 ; } else { r = 0 ; val > > = 24 ; }
r + = ( ! val ) ;
return r ;
# endif
}
if ( sizeof ( val ) = = 8 ) {
# if defined(_MSC_VER) && defined(_WIN64) && !defined(LZ4_FORCE_SW_BITCOUNT)
unsigned long r = 0 ;
_BitScanReverse64 ( & r , val ) ;
return ( unsigned ) ( r > > 3 ) ;
# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)
return ( __builtin_clzll ( ( U64 ) val ) > > 3 ) ;
# else
unsigned r ;
if ( ! ( val > > 32 ) ) { r = 4 ; } else { r = 0 ; val > > = 32 ; }
if ( ! ( val > > 16 ) ) { r + = 2 ; val > > = 8 ; } else { val > > = 24 ; }
r + = ( ! val ) ;
return r ;
# endif
} else /* 32 bits */ {
# if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT)
unsigned long r = 0 ;
_BitScanReverse ( & r , ( unsigned long ) val ) ;
return ( unsigned ) ( r > > 3 ) ;
# elif (defined(__clang__) || (defined(__GNUC__) && (__GNUC__>=3))) && !defined(LZ4_FORCE_SW_BITCOUNT)
return ( __builtin_clz ( ( U32 ) val ) > > 3 ) ;
# else
unsigned r ;
if ( ! ( val > > 16 ) ) { r = 2 ; val > > = 8 ; } else { r = 0 ; val > > = 24 ; }
r + = ( ! val ) ;
return r ;
# endif
}
}
}
@ -396,10 +396,10 @@ static inline unsigned LZ4_count(const BYTE* pIn, const BYTE* pMatch, const BYTE
const BYTE * const pStart = pIn ;
while ( likely ( pIn < pInLimit - ( STEPSIZE - 1 ) ) ) {
reg_t const diff = LZ4_read_ARCH ( pMatch ) ^ LZ4_read_ARCH ( pIn ) ;
if ( ! diff ) { pIn + = STEPSIZE ; pMatch + = STEPSIZE ; continue ; }
pIn + = LZ4_NbCommonBytes ( diff ) ;
return ( unsigned ) ( pIn - pStart ) ;
reg_t const diff = LZ4_read_ARCH ( pMatch ) ^ LZ4_read_ARCH ( pIn ) ;
if ( ! diff ) { pIn + = STEPSIZE ; pMatch + = STEPSIZE ; continue ; }
pIn + = LZ4_NbCommonBytes ( diff ) ;
return ( unsigned ) ( pIn - pStart ) ;
}
if ( ( STEPSIZE = = 8 ) & & ( pIn < ( pInLimit - 3 ) ) & & ( LZ4_read32 ( pMatch ) = = LZ4_read32 ( pIn ) ) ) { pIn + = 4 ; pMatch + = 4 ; }
@ -425,9 +425,9 @@ static inline int LZ4_compressBound(int isize) { return LZ4_COMPRESSBOUND(isize
static inline U32 LZ4_hash4 ( U32 sequence , tableType_t const tableType )
{
if ( tableType = = byU16 )
return ( ( sequence * 2654435761U ) > > ( ( MINMATCH * 8 ) - ( LZ4_HASHLOG + 1 ) ) ) ;
return ( ( sequence * 2654435761U ) > > ( ( MINMATCH * 8 ) - ( LZ4_HASHLOG + 1 ) ) ) ;
else
return ( ( sequence * 2654435761U ) > > ( ( MINMATCH * 8 ) - LZ4_HASHLOG ) ) ;
return ( ( sequence * 2654435761U ) > > ( ( MINMATCH * 8 ) - LZ4_HASHLOG ) ) ;
}
static inline U32 LZ4_hash5 ( U64 sequence , tableType_t const tableType )
@ -436,9 +436,9 @@ static inline U32 LZ4_hash5(U64 sequence, tableType_t const tableType)
static const U64 prime8bytes = 11400714785074694791ULL ;
const U32 hashLog = ( tableType = = byU16 ) ? LZ4_HASHLOG + 1 : LZ4_HASHLOG ;
if ( LZ4_isLittleEndian ( ) )
return ( U32 ) ( ( ( sequence < < 24 ) * prime5bytes ) > > ( 64 - hashLog ) ) ;
return ( U32 ) ( ( ( sequence < < 24 ) * prime5bytes ) > > ( 64 - hashLog ) ) ;
else
return ( U32 ) ( ( ( sequence > > 24 ) * prime8bytes ) > > ( 64 - hashLog ) ) ;
return ( U32 ) ( ( ( sequence > > 24 ) * prime8bytes ) > > ( 64 - hashLog ) ) ;
}
FORCE_INLINE U32 LZ4_hashPosition ( const void * const p , tableType_t const tableType )
@ -477,16 +477,16 @@ FORCE_INLINE const BYTE* LZ4_getPosition(const BYTE* p, void* tableBase, tableTy
}
FORCE_INLINE int LZ4_compress_generic (
LZ4_stream_t_internal * const cctx ,
const char * const source ,
char * const dest ,
const int inputSize ,
const int maxOutputSize ,
const limitedOutput_directive outputLimited ,
const tableType_t tableType ,
const dict_directive dict ,
const dictIssue_directive dictIssue ,
const U32 acceleration )
LZ4_stream_t_internal * const cctx ,
const char * const source ,
char * const dest ,
const int inputSize ,
const int maxOutputSize ,
const limitedOutput_directive outputLimited ,
const tableType_t tableType ,
const dict_directive dict ,
const dictIssue_directive dictIssue ,
const U32 acceleration )
{
const BYTE * ip = ( const BYTE * ) source ;
const BYTE * base ;
@ -511,20 +511,20 @@ FORCE_INLINE int LZ4_compress_generic(
{
case noDict :
default :
base = ( const BYTE * ) source ;
lowLimit = ( const BYTE * ) source ;
break ;
base = ( const BYTE * ) source ;
lowLimit = ( const BYTE * ) source ;
break ;
case withPrefix64k :
base = ( const BYTE * ) source - cctx - > currentOffset ;
lowLimit = ( const BYTE * ) source - cctx - > dictSize ;
break ;
base = ( const BYTE * ) source - cctx - > currentOffset ;
lowLimit = ( const BYTE * ) source - cctx - > dictSize ;
break ;
case usingExtDict :
base = ( const BYTE * ) source - cctx - > currentOffset ;
lowLimit = ( const BYTE * ) source ;
break ;
base = ( const BYTE * ) source - cctx - > currentOffset ;
lowLimit = ( const BYTE * ) source ;
break ;
}
if ( ( tableType = = byU16 ) & & ( inputSize > = LZ4_64Klimit ) ) return 0 ; /* Size too large (not within 64K limit) */
if ( inputSize < LZ4_minLength ) goto _last_literals ; /* Input too small, no compression (all literals) */
if ( inputSize < LZ4_minLength ) goto _last_literals ; /* Input too small, no compression (all literals) */
/* First Byte */
LZ4_putPosition ( ip , cctx - > hashTable , tableType , base ) ;
@ -532,143 +532,143 @@ FORCE_INLINE int LZ4_compress_generic(
/* Main Loop */
for ( ; ; ) {
ptrdiff_t refDelta = 0 ;
const BYTE * match ;
BYTE * token ;
/* Find a match */
{ const BYTE * forwardIp = ip ;
unsigned step = 1 ;
unsigned searchMatchNb = acceleration < < LZ4_skipTrigger ;
do {
U32 const h = forwardH ;
ip = forwardIp ;
forwardIp + = step ;
step = ( searchMatchNb + + > > LZ4_skipTrigger ) ;
if ( unlikely ( forwardIp > mflimit ) ) goto _last_literals ;
match = LZ4_getPositionOnHash ( h , cctx - > hashTable , tableType , base ) ;
if ( dict = = usingExtDict ) {
if ( match < ( const BYTE * ) source ) {
refDelta = dictDelta ;
lowLimit = dictionary ;
} else {
refDelta = 0 ;
lowLimit = ( const BYTE * ) source ;
} }
forwardH = LZ4_hashPosition ( forwardIp , tableType ) ;
LZ4_putPositionOnHash ( ip , h , cctx - > hashTable , tableType , base ) ;
} while ( ( ( dictIssue = = dictSmall ) ? ( match < lowRefLimit ) : 0 )
| | ( ( tableType = = byU16 ) ? 0 : ( match + MAX_DISTANCE < ip ) )
| | ( LZ4_read32 ( match + refDelta ) ! = LZ4_read32 ( ip ) ) ) ;
}
/* Catch up */
while ( ( ( ip > anchor ) & ( match + refDelta > lowLimit ) ) & & ( unlikely ( ip [ - 1 ] = = match [ refDelta - 1 ] ) ) ) { ip - - ; match - - ; }
/* Encode Literals */
{ unsigned const litLength = ( unsigned ) ( ip - anchor ) ;
token = op + + ;
if ( ( outputLimited ) & & /* Check output buffer overflow */
( unlikely ( op + litLength + ( 2 + 1 + LASTLITERALS ) + ( litLength / 255 ) > olimit ) ) )
return 0 ;
if ( litLength > = RUN_MASK ) {
int len = ( int ) litLength - RUN_MASK ;
* token = ( RUN_MASK < < ML_BITS ) ;
for ( ; len > = 255 ; len - = 255 ) * op + + = 255 ;
* op + + = ( BYTE ) len ;
}
else * token = ( BYTE ) ( litLength < < ML_BITS ) ;
/* Copy Literals */
LZ4_wildCopy ( op , anchor , op + litLength ) ;
op + = litLength ;
}
ptrdiff_t refDelta = 0 ;
const BYTE * match ;
BYTE * token ;
/* Find a match */
{ const BYTE * forwardIp = ip ;
unsigned step = 1 ;
unsigned searchMatchNb = acceleration < < LZ4_skipTrigger ;
do {
U32 const h = forwardH ;
ip = forwardIp ;
forwardIp + = step ;
step = ( searchMatchNb + + > > LZ4_skipTrigger ) ;
if ( unlikely ( forwardIp > mflimit ) ) goto _last_literals ;
match = LZ4_getPositionOnHash ( h , cctx - > hashTable , tableType , base ) ;
if ( dict = = usingExtDict ) {
if ( match < ( const BYTE * ) source ) {
refDelta = dictDelta ;
lowLimit = dictionary ;
} else {
refDelta = 0 ;
lowLimit = ( const BYTE * ) source ;
} }
forwardH = LZ4_hashPosition ( forwardIp , tableType ) ;
LZ4_putPositionOnHash ( ip , h , cctx - > hashTable , tableType , base ) ;
} while ( ( ( dictIssue = = dictSmall ) ? ( match < lowRefLimit ) : 0 )
| | ( ( tableType = = byU16 ) ? 0 : ( match + MAX_DISTANCE < ip ) )
| | ( LZ4_read32 ( match + refDelta ) ! = LZ4_read32 ( ip ) ) ) ;
}
/* Catch up */
while ( ( ( ip > anchor ) & ( match + refDelta > lowLimit ) ) & & ( unlikely ( ip [ - 1 ] = = match [ refDelta - 1 ] ) ) ) { ip - - ; match - - ; }
/* Encode Literals */
{ unsigned const litLength = ( unsigned ) ( ip - anchor ) ;
token = op + + ;
if ( ( outputLimited ) & & /* Check output buffer overflow */
( unlikely ( op + litLength + ( 2 + 1 + LASTLITERALS ) + ( litLength / 255 ) > olimit ) ) )
return 0 ;
if ( litLength > = RUN_MASK ) {
int len = ( int ) litLength - RUN_MASK ;
* token = ( RUN_MASK < < ML_BITS ) ;
for ( ; len > = 255 ; len - = 255 ) * op + + = 255 ;
* op + + = ( BYTE ) len ;
}
else * token = ( BYTE ) ( litLength < < ML_BITS ) ;
/* Copy Literals */
LZ4_wildCopy ( op , anchor , op + litLength ) ;
op + = litLength ;
}
_next_match :
/* Encode Offset */
LZ4_writeLE16 ( op , ( U16 ) ( ip - match ) ) ; op + = 2 ;
/* Encode MatchLength */
{ unsigned matchCode ;
if ( ( dict = = usingExtDict ) & & ( lowLimit = = dictionary ) ) {
const BYTE * limit ;
match + = refDelta ;
limit = ip + ( dictEnd - match ) ;
if ( limit > matchlimit ) limit = matchlimit ;
matchCode = LZ4_count ( ip + MINMATCH , match + MINMATCH , limit ) ;
ip + = MINMATCH + matchCode ;
if ( ip = = limit ) {
unsigned const more = LZ4_count ( ip , ( const BYTE * ) source , matchlimit ) ;
matchCode + = more ;
ip + = more ;
}
} else {
matchCode = LZ4_count ( ip + MINMATCH , match + MINMATCH , matchlimit ) ;
ip + = MINMATCH + matchCode ;
}
if ( outputLimited & & /* Check output buffer overflow */
( unlikely ( op + ( 1 + LASTLITERALS ) + ( matchCode > > 8 ) > olimit ) ) )
return 0 ;
if ( matchCode > = ML_MASK ) {
* token + = ML_MASK ;
matchCode - = ML_MASK ;
LZ4_write32 ( op , 0xFFFFFFFF ) ;
while ( matchCode > = 4 * 255 ) op + = 4 , LZ4_write32 ( op , 0xFFFFFFFF ) , matchCode - = 4 * 255 ;
op + = matchCode / 255 ;
* op + + = ( BYTE ) ( matchCode % 255 ) ;
} else
* token + = ( BYTE ) ( matchCode ) ;
}
anchor = ip ;
/* Test end of chunk */
if ( ip > mflimit ) break ;
/* Fill table */
LZ4_putPosition ( ip - 2 , cctx - > hashTable , tableType , base ) ;
/* Test next position */
match = LZ4_getPosition ( ip , cctx - > hashTable , tableType , base ) ;
if ( dict = = usingExtDict ) {
if ( match < ( const BYTE * ) source ) {
refDelta = dictDelta ;
lowLimit = dictionary ;
} else {
refDelta = 0 ;
lowLimit = ( const BYTE * ) source ;
} }
LZ4_putPosition ( ip , cctx - > hashTable , tableType , base ) ;
if ( ( ( dictIssue = = dictSmall ) ? ( match > = lowRefLimit ) : 1 )
& & ( match + MAX_DISTANCE > = ip )
& & ( LZ4_read32 ( match + refDelta ) = = LZ4_read32 ( ip ) ) )
{ token = op + + ; * token = 0 ; goto _next_match ; }
/* Prepare next loop */
forwardH = LZ4_hashPosition ( + + ip , tableType ) ;
/* Encode Offset */
LZ4_writeLE16 ( op , ( U16 ) ( ip - match ) ) ; op + = 2 ;
/* Encode MatchLength */
{ unsigned matchCode ;
if ( ( dict = = usingExtDict ) & & ( lowLimit = = dictionary ) ) {
const BYTE * limit ;
match + = refDelta ;
limit = ip + ( dictEnd - match ) ;
if ( limit > matchlimit ) limit = matchlimit ;
matchCode = LZ4_count ( ip + MINMATCH , match + MINMATCH , limit ) ;
ip + = MINMATCH + matchCode ;
if ( ip = = limit ) {
unsigned const more = LZ4_count ( ip , ( const BYTE * ) source , matchlimit ) ;
matchCode + = more ;
ip + = more ;
}
} else {
matchCode = LZ4_count ( ip + MINMATCH , match + MINMATCH , matchlimit ) ;
ip + = MINMATCH + matchCode ;
}
if ( outputLimited & & /* Check output buffer overflow */
( unlikely ( op + ( 1 + LASTLITERALS ) + ( matchCode > > 8 ) > olimit ) ) )
return 0 ;
if ( matchCode > = ML_MASK ) {
* token + = ML_MASK ;
matchCode - = ML_MASK ;
LZ4_write32 ( op , 0xFFFFFFFF ) ;
while ( matchCode > = 4 * 255 ) op + = 4 , LZ4_write32 ( op , 0xFFFFFFFF ) , matchCode - = 4 * 255 ;
op + = matchCode / 255 ;
* op + + = ( BYTE ) ( matchCode % 255 ) ;
} else
* token + = ( BYTE ) ( matchCode ) ;
}
anchor = ip ;
/* Test end of chunk */
if ( ip > mflimit ) break ;
/* Fill table */
LZ4_putPosition ( ip - 2 , cctx - > hashTable , tableType , base ) ;
/* Test next position */
match = LZ4_getPosition ( ip , cctx - > hashTable , tableType , base ) ;
if ( dict = = usingExtDict ) {
if ( match < ( const BYTE * ) source ) {
refDelta = dictDelta ;
lowLimit = dictionary ;
} else {
refDelta = 0 ;
lowLimit = ( const BYTE * ) source ;
} }
LZ4_putPosition ( ip , cctx - > hashTable , tableType , base ) ;
if ( ( ( dictIssue = = dictSmall ) ? ( match > = lowRefLimit ) : 1 )
& & ( match + MAX_DISTANCE > = ip )
& & ( LZ4_read32 ( match + refDelta ) = = LZ4_read32 ( ip ) ) )
{ token = op + + ; * token = 0 ; goto _next_match ; }
/* Prepare next loop */
forwardH = LZ4_hashPosition ( + + ip , tableType ) ;
}
_last_literals :
/* Encode Last Literals */
{ size_t const lastRun = ( size_t ) ( iend - anchor ) ;
if ( ( outputLimited ) & & /* Check output buffer overflow */
( ( op - ( BYTE * ) dest ) + lastRun + 1 + ( ( lastRun + 255 - RUN_MASK ) / 255 ) > ( U32 ) maxOutputSize ) )
return 0 ;
if ( lastRun > = RUN_MASK ) {
size_t accumulator = lastRun - RUN_MASK ;
* op + + = RUN_MASK < < ML_BITS ;
for ( ; accumulator > = 255 ; accumulator - = 255 ) * op + + = 255 ;
* op + + = ( BYTE ) accumulator ;
} else {
* op + + = ( BYTE ) ( lastRun < < ML_BITS ) ;
}
ZT_FAST_MEMCPY ( op , anchor , lastRun ) ;
op + = lastRun ;
if ( ( outputLimited ) & & /* Check output buffer overflow */
( ( op - ( BYTE * ) dest ) + lastRun + 1 + ( ( lastRun + 255 - RUN_MASK ) / 255 ) > ( U32 ) maxOutputSize ) )
return 0 ;
if ( lastRun > = RUN_MASK ) {
size_t accumulator = lastRun - RUN_MASK ;
* op + + = RUN_MASK < < ML_BITS ;
for ( ; accumulator > = 255 ; accumulator - = 255 ) * op + + = 255 ;
* op + + = ( BYTE ) accumulator ;
} else {
* op + + = ( BYTE ) ( lastRun < < ML_BITS ) ;
}
ZT_FAST_MEMCPY ( op , anchor , lastRun ) ;
op + = lastRun ;
}
/* End */
@ -682,15 +682,15 @@ static inline int LZ4_compress_fast_extState(void* state, const char* source, ch
//if (acceleration < 1) acceleration = ACCELERATION_DEFAULT;
if ( maxOutputSize > = LZ4_compressBound ( inputSize ) ) {
if ( inputSize < LZ4_64Klimit )
return LZ4_compress_generic ( ctx , source , dest , inputSize , 0 , notLimited , byU16 , noDict , noDictIssue , acceleration ) ;
else
return LZ4_compress_generic ( ctx , source , dest , inputSize , 0 , notLimited , ( sizeof ( void * ) = = 8 ) ? byU32 : byPtr , noDict , noDictIssue , acceleration ) ;
if ( inputSize < LZ4_64Klimit )
return LZ4_compress_generic ( ctx , source , dest , inputSize , 0 , notLimited , byU16 , noDict , noDictIssue , acceleration ) ;
else
return LZ4_compress_generic ( ctx , source , dest , inputSize , 0 , notLimited , ( sizeof ( void * ) = = 8 ) ? byU32 : byPtr , noDict , noDictIssue , acceleration ) ;
} else {
if ( inputSize < LZ4_64Klimit )
return LZ4_compress_generic ( ctx , source , dest , inputSize , maxOutputSize , limitedOutput , byU16 , noDict , noDictIssue , acceleration ) ;
else
return LZ4_compress_generic ( ctx , source , dest , inputSize , maxOutputSize , limitedOutput , ( sizeof ( void * ) = = 8 ) ? byU32 : byPtr , noDict , noDictIssue , acceleration ) ;
if ( inputSize < LZ4_64Klimit )
return LZ4_compress_generic ( ctx , source , dest , inputSize , maxOutputSize , limitedOutput , byU16 , noDict , noDictIssue , acceleration ) ;
else
return LZ4_compress_generic ( ctx , source , dest , inputSize , maxOutputSize , limitedOutput , ( sizeof ( void * ) = = 8 ) ? byU32 : byPtr , noDict , noDictIssue , acceleration ) ;
}
}
@ -717,19 +717,19 @@ static inline void LZ4_resetStream (LZ4_stream_t* LZ4_stream)
}
FORCE_INLINE int LZ4_decompress_generic (
const char * const source ,
char * const dest ,
int inputSize ,
int outputSize , /* If endOnInput==endOnInputSize, this value is the max size of Output Buffer. */
int endOnInput , /* endOnOutputSize, endOnInputSize */
int partialDecoding , /* full, partial */
int targetOutputSize , /* only used if partialDecoding==partial */
int dict , /* noDict, withPrefix64k, usingExtDict */
const BYTE * const lowPrefix , /* == dest when no prefix */
const BYTE * const dictStart , /* only if dict==usingExtDict */
const size_t dictSize /* note : = 0 if noDict */
)
const char * const source ,
char * const dest ,
int inputSize ,
int outputSize , /* If endOnInput==endOnInputSize, this value is the max size of Output Buffer. */
int endOnInput , /* endOnOutputSize, endOnInputSize */
int partialDecoding , /* full, partial */
int targetOutputSize , /* only used if partialDecoding==partial */
int dict , /* noDict, withPrefix64k, usingExtDict */
const BYTE * const lowPrefix , /* == dest when no prefix */
const BYTE * const dictStart , /* only if dict==usingExtDict */
const size_t dictSize /* note : = 0 if noDict */
)
{
/* Local Variables */
const BYTE * ip = ( const BYTE * ) source ;
@ -750,125 +750,125 @@ FORCE_INLINE int LZ4_decompress_generic(
/* Special cases */
if ( ( partialDecoding ) & & ( oexit > oend - MFLIMIT ) ) oexit = oend - MFLIMIT ; /* targetOutputSize too high => decode everything */
if ( ( partialDecoding ) & & ( oexit > oend - MFLIMIT ) ) oexit = oend - MFLIMIT ; /* targetOutputSize too high => decode everything */
if ( ( endOnInput ) & & ( unlikely ( outputSize = = 0 ) ) ) return ( ( inputSize = = 1 ) & & ( * ip = = 0 ) ) ? 0 : - 1 ; /* Empty output buffer */
if ( ( ! endOnInput ) & & ( unlikely ( outputSize = = 0 ) ) ) return ( * ip = = 0 ? 1 : - 1 ) ;
/* Main Loop : decode sequences */
while ( 1 ) {
size_t length ;
const BYTE * match ;
size_t offset ;
/* get literal length */
unsigned const token = * ip + + ;
if ( ( length = ( token > > ML_BITS ) ) = = RUN_MASK ) {
unsigned s ;
do {
s = * ip + + ;
length + = s ;
} while ( likely ( endOnInput ? ip < iend - RUN_MASK : 1 ) & ( s = = 255 ) ) ;
if ( ( safeDecode ) & & unlikely ( ( uptrval ) ( op ) + length < ( uptrval ) ( op ) ) ) goto _output_error ; /* overflow detection */
if ( ( safeDecode ) & & unlikely ( ( uptrval ) ( ip ) + length < ( uptrval ) ( ip ) ) ) goto _output_error ; /* overflow detection */
}
/* copy literals */
cpy = op + length ;
if ( ( ( endOnInput ) & & ( ( cpy > ( partialDecoding ? oexit : oend - MFLIMIT ) ) | | ( ip + length > iend - ( 2 + 1 + LASTLITERALS ) ) ) )
| | ( ( ! endOnInput ) & & ( cpy > oend - WILDCOPYLENGTH ) ) )
{
if ( partialDecoding ) {
if ( cpy > oend ) goto _output_error ; /* Error : write attempt beyond end of output buffer */
if ( ( endOnInput ) & & ( ip + length > iend ) ) goto _output_error ; /* Error : read attempt beyond end of input buffer */
} else {
if ( ( ! endOnInput ) & & ( cpy ! = oend ) ) goto _output_error ; /* Error : block decoding must stop exactly there */
if ( ( endOnInput ) & & ( ( ip + length ! = iend ) | | ( cpy > oend ) ) ) goto _output_error ; /* Error : input must be consumed */
}
ZT_FAST_MEMCPY ( op , ip , length ) ;
ip + = length ;
op + = length ;
break ; /* Necessarily EOF, due to parsing restrictions */
}
LZ4_wildCopy ( op , ip , cpy ) ;
ip + = length ; op = cpy ;
/* get offset */
offset = LZ4_readLE16 ( ip ) ; ip + = 2 ;
match = op - offset ;
if ( ( checkOffset ) & & ( unlikely ( match < lowLimit ) ) ) goto _output_error ; /* Error : offset outside buffers */
LZ4_write32 ( op , ( U32 ) offset ) ; /* costs ~1%; silence an msan warning when offset==0 */
/* get matchlength */
length = token & ML_MASK ;
if ( length = = ML_MASK ) {
unsigned s ;
do {
s = * ip + + ;
if ( ( endOnInput ) & & ( ip > iend - LASTLITERALS ) ) goto _output_error ;
length + = s ;
} while ( s = = 255 ) ;
if ( ( safeDecode ) & & unlikely ( ( uptrval ) ( op ) + length < ( uptrval ) op ) ) goto _output_error ; /* overflow detection */
}
length + = MINMATCH ;
/* check external dictionary */
if ( ( dict = = usingExtDict ) & & ( match < lowPrefix ) ) {
if ( unlikely ( op + length > oend - LASTLITERALS ) ) goto _output_error ; /* doesn't respect parsing restriction */
if ( length < = ( size_t ) ( lowPrefix - match ) ) {
/* match can be copied as a single segment from external dictionary */
memmove ( op , dictEnd - ( lowPrefix - match ) , length ) ;
op + = length ;
} else {
/* match encompass external dictionary and current block */
size_t const copySize = ( size_t ) ( lowPrefix - match ) ;
size_t const restSize = length - copySize ;
ZT_FAST_MEMCPY ( op , dictEnd - copySize , copySize ) ;
op + = copySize ;
if ( restSize > ( size_t ) ( op - lowPrefix ) ) { /* overlap copy */
BYTE * const endOfMatch = op + restSize ;
const BYTE * copyFrom = lowPrefix ;
while ( op < endOfMatch ) * op + + = * copyFrom + + ;
} else {
ZT_FAST_MEMCPY ( op , lowPrefix , restSize ) ;
op + = restSize ;
} }
continue ;
}
/* copy match within block */
cpy = op + length ;
if ( unlikely ( offset < 8 ) ) {
const int dec64 = dec64table [ offset ] ;
op [ 0 ] = match [ 0 ] ;
op [ 1 ] = match [ 1 ] ;
op [ 2 ] = match [ 2 ] ;
op [ 3 ] = match [ 3 ] ;
match + = dec32table [ offset ] ;
ZT_FAST_MEMCPY ( op + 4 , match , 4 ) ;
match - = dec64 ;
} else { LZ4_copy8 ( op , match ) ; match + = 8 ; }
op + = 8 ;
if ( unlikely ( cpy > oend - 12 ) ) {
BYTE * const oCopyLimit = oend - ( WILDCOPYLENGTH - 1 ) ;
if ( cpy > oend - LASTLITERALS ) goto _output_error ; /* Error : last LASTLITERALS bytes must be literals (uncompressed) */
if ( op < oCopyLimit ) {
LZ4_wildCopy ( op , match , oCopyLimit ) ;
match + = oCopyLimit - op ;
op = oCopyLimit ;
}
while ( op < cpy ) * op + + = * match + + ;
} else {
LZ4_copy8 ( op , match ) ;
if ( length > 16 ) LZ4_wildCopy ( op + 8 , match + 8 , cpy ) ;
}
op = cpy ; /* correction */
size_t length ;
const BYTE * match ;
size_t offset ;
/* get literal length */
unsigned const token = * ip + + ;
if ( ( length = ( token > > ML_BITS ) ) = = RUN_MASK ) {
unsigned s ;
do {
s = * ip + + ;
length + = s ;
} while ( likely ( endOnInput ? ip < iend - RUN_MASK : 1 ) & ( s = = 255 ) ) ;
if ( ( safeDecode ) & & unlikely ( ( uptrval ) ( op ) + length < ( uptrval ) ( op ) ) ) goto _output_error ; /* overflow detection */
if ( ( safeDecode ) & & unlikely ( ( uptrval ) ( ip ) + length < ( uptrval ) ( ip ) ) ) goto _output_error ; /* overflow detection */
}
/* copy literals */
cpy = op + length ;
if ( ( ( endOnInput ) & & ( ( cpy > ( partialDecoding ? oexit : oend - MFLIMIT ) ) | | ( ip + length > iend - ( 2 + 1 + LASTLITERALS ) ) ) )
| | ( ( ! endOnInput ) & & ( cpy > oend - WILDCOPYLENGTH ) ) )
{
if ( partialDecoding ) {
if ( cpy > oend ) goto _output_error ; /* Error : write attempt beyond end of output buffer */
if ( ( endOnInput ) & & ( ip + length > iend ) ) goto _output_error ; /* Error : read attempt beyond end of input buffer */
} else {
if ( ( ! endOnInput ) & & ( cpy ! = oend ) ) goto _output_error ; /* Error : block decoding must stop exactly there */
if ( ( endOnInput ) & & ( ( ip + length ! = iend ) | | ( cpy > oend ) ) ) goto _output_error ; /* Error : input must be consumed */
}
ZT_FAST_MEMCPY ( op , ip , length ) ;
ip + = length ;
op + = length ;
break ; /* Necessarily EOF, due to parsing restrictions */
}
LZ4_wildCopy ( op , ip , cpy ) ;
ip + = length ; op = cpy ;
/* get offset */
offset = LZ4_readLE16 ( ip ) ; ip + = 2 ;
match = op - offset ;
if ( ( checkOffset ) & & ( unlikely ( match < lowLimit ) ) ) goto _output_error ; /* Error : offset outside buffers */
LZ4_write32 ( op , ( U32 ) offset ) ; /* costs ~1%; silence an msan warning when offset==0 */
/* get matchlength */
length = token & ML_MASK ;
if ( length = = ML_MASK ) {
unsigned s ;
do {
s = * ip + + ;
if ( ( endOnInput ) & & ( ip > iend - LASTLITERALS ) ) goto _output_error ;
length + = s ;
} while ( s = = 255 ) ;
if ( ( safeDecode ) & & unlikely ( ( uptrval ) ( op ) + length < ( uptrval ) op ) ) goto _output_error ; /* overflow detection */
}
length + = MINMATCH ;
/* check external dictionary */
if ( ( dict = = usingExtDict ) & & ( match < lowPrefix ) ) {
if ( unlikely ( op + length > oend - LASTLITERALS ) ) goto _output_error ; /* doesn't respect parsing restriction */
if ( length < = ( size_t ) ( lowPrefix - match ) ) {
/* match can be copied as a single segment from external dictionary */
memmove ( op , dictEnd - ( lowPrefix - match ) , length ) ;
op + = length ;
} else {
/* match encompass external dictionary and current block */
size_t const copySize = ( size_t ) ( lowPrefix - match ) ;
size_t const restSize = length - copySize ;
ZT_FAST_MEMCPY ( op , dictEnd - copySize , copySize ) ;
op + = copySize ;
if ( restSize > ( size_t ) ( op - lowPrefix ) ) { /* overlap copy */
BYTE * const endOfMatch = op + restSize ;
const BYTE * copyFrom = lowPrefix ;
while ( op < endOfMatch ) * op + + = * copyFrom + + ;
} else {
ZT_FAST_MEMCPY ( op , lowPrefix , restSize ) ;
op + = restSize ;
} }
continue ;
}
/* copy match within block */
cpy = op + length ;
if ( unlikely ( offset < 8 ) ) {
const int dec64 = dec64table [ offset ] ;
op [ 0 ] = match [ 0 ] ;
op [ 1 ] = match [ 1 ] ;
op [ 2 ] = match [ 2 ] ;
op [ 3 ] = match [ 3 ] ;
match + = dec32table [ offset ] ;
ZT_FAST_MEMCPY ( op + 4 , match , 4 ) ;
match - = dec64 ;
} else { LZ4_copy8 ( op , match ) ; match + = 8 ; }
op + = 8 ;
if ( unlikely ( cpy > oend - 12 ) ) {
BYTE * const oCopyLimit = oend - ( WILDCOPYLENGTH - 1 ) ;
if ( cpy > oend - LASTLITERALS ) goto _output_error ; /* Error : last LASTLITERALS bytes must be literals (uncompressed) */
if ( op < oCopyLimit ) {
LZ4_wildCopy ( op , match , oCopyLimit ) ;
match + = oCopyLimit - op ;
op = oCopyLimit ;
}
while ( op < cpy ) * op + + = * match + + ;
} else {
LZ4_copy8 ( op , match ) ;
if ( length > 16 ) LZ4_wildCopy ( op + 8 , match + 8 , cpy ) ;
}
op = cpy ; /* correction */
}
/* end of decoding */
if ( endOnInput )
return ( int ) ( ( ( char * ) op ) - dest ) ; /* Nb of output bytes decoded */
return ( int ) ( ( ( char * ) op ) - dest ) ; /* Nb of output bytes decoded */
else
return ( int ) ( ( ( const char * ) ip ) - source ) ; /* Nb of input bytes read */
@ -989,7 +989,7 @@ bool Packet::compress()
if ( ( ! compressed ( ) ) & & ( size ( ) > ( ZT_PACKET_IDX_PAYLOAD + 64 ) ) ) { // don't bother compressing tiny packets
int pl = ( int ) ( size ( ) - ZT_PACKET_IDX_PAYLOAD ) ;
int cl = LZ4_compress_fast ( data + ZT_PACKET_IDX_PAYLOAD , buf , pl , ZT_PROTO_MAX_PACKET_LENGTH * 2 , 2 ) ;
int cl = LZ4_compress_fast ( data + ZT_PACKET_IDX_PAYLOAD , buf , pl , ZT_PROTO_MAX_PACKET_LENGTH * 2 , 1 ) ;
if ( ( cl > 0 ) & & ( cl < pl ) ) {
data [ ZT_PACKET_IDX_VERB ] | = ( char ) ZT_PROTO_VERB_FLAG_COMPRESSED ;
setSize ( ( unsigned int ) cl + ZT_PACKET_IDX_PAYLOAD ) ;