35 #ifndef LZ4_CS_ADAPTER
42 #if (defined(__x86_64__) || defined(__x86_64) || defined(__amd64__) || defined(__amd64) || defined(__ppc64__) || defined(_WIN64) || defined(__LP64__) || defined(_LP64) ) // Detects 64 bits mode
52 #if defined (__GLIBC__)
54 # if (__BYTE_ORDER == __BIG_ENDIAN)
55 # define LZ4_BIG_ENDIAN 1
57 #elif (defined(__BIG_ENDIAN__) || defined(__BIG_ENDIAN) || defined(_BIG_ENDIAN)) && !(defined(__LITTLE_ENDIAN__) || defined(__LITTLE_ENDIAN) || defined(_LITTLE_ENDIAN))
58 # define LZ4_BIG_ENDIAN 1
59 #elif defined(__sparc) || defined(__sparc__) \
60 || defined(__ppc__) || defined(_POWER) || defined(__powerpc__) || defined(_ARCH_PPC) || defined(__PPC__) || defined(__PPC) || defined(PPC) || defined(__powerpc__) || defined(__powerpc) || defined(powerpc) \
61 || defined(__hpux) || defined(__hppa) \
62 || defined(_MIPSEB) || defined(__s390__)
63 #define LZ4_BIG_ENDIAN 1
71 #if defined(__ARM_FEATURE_UNALIGNED)
72 #define LZ4_FORCE_UNALIGNED_ACCESS 1
76 #if defined(_MSC_VER) && defined(_WIN32_WCE) // Visual Studio for Windows CE does not support Hardware bit count
77 # define LZ4_FORCE_SW_BITCOUNT
84 #if __STDC_VERSION__ >= 199901L // C99
87 #define restrict // Disable restrict
91 #define inline __inline // Visual is not C99, but supports some kind of inline
92 #define forceinline __forceinline
95 # define forceinline inline __attribute__((always_inline))
97 # define forceinline inline
101 #if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) // Visual Studio
103 # if LZ4_ARCH64 && defined(_M_X64) // 64-bit
104 # pragma intrinsic(_BitScanForward64) // For Visual 2005
105 # pragma intrinsic(_BitScanReverse64) // For Visual 2005
107 # pragma intrinsic(_BitScanForward) // For Visual 2005
108 # pragma intrinsic(_BitScanReverse) // For Visual 2005
110 # pragma warning(disable : 4127) // disable: C4127: conditional expression is constant
111 # pragma warning(disable : 4701) // disable: C4701: potentially uninitialized local variable used
114 #ifdef _MSC_VER // Visual Studio
115 #define lz4_bswap16(x) _byteswap_ushort(x)
117 #define lz4_bswap16(x) ((unsigned short int) ((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8)))
128 #define ALLOCATOR(s) calloc(1,s)
130 #define MEM_INIT memset
136 #if defined(_MSC_VER) // Visual Studio does not support 'stdint' natively
137 #define BYTE unsigned __int8
138 #define U16 unsigned __int16
139 #define U32 unsigned __int32
141 #define U64 unsigned __int64
153 #ifndef LZ4_FORCE_UNALIGNED_ACCESS
154 #pragma pack(push, 1)
161 #ifndef LZ4_FORCE_UNALIGNED_ACCESS
165 #define A64(x) (((U64_S *)(x))->v)
166 #define A32(x) (((U32_S *)(x))->v)
167 #define A16(x) (((U16_S *)(x))->v)
175 #define DICTIONARY_LOGSIZE 16
176 #define MAXD (1<<DICTIONARY_LOGSIZE)
177 #define MAXD_MASK ((U32)(MAXD - 1))
178 #define MAX_DISTANCE (MAXD - 1)
180 #define HASH_LOG (DICTIONARY_LOGSIZE-1)
181 #define HASHTABLESIZE (1 << HASH_LOG)
182 #define HASH_MASK (HASHTABLESIZE - 1)
184 #define MAX_NB_ATTEMPTS 256
187 #define ML_MASK (size_t)((1U<<ML_BITS)-1)
188 #define RUN_BITS (8-ML_BITS)
189 #define RUN_MASK ((1U<<RUN_BITS)-1)
192 #define LASTLITERALS 5
193 #define MFLIMIT (COPYLENGTH+MINMATCH)
194 #define MINLENGTH (MFLIMIT+1)
195 #define OPTIMAL_ML (int)((ML_MASK-1)+MINMATCH)
201 #if LZ4_ARCH64 // 64-bit
203 #define LZ4_COPYSTEP(s,d) A64(d) = A64(s); d+=8; s+=8;
204 #define LZ4_COPYPACKET(s,d) LZ4_COPYSTEP(s,d)
208 #define INITBASE(b,s) const BYTE* const b = s
211 #define LZ4_COPYSTEP(s,d) A32(d) = A32(s); d+=4; s+=4;
212 #define LZ4_COPYPACKET(s,d) LZ4_COPYSTEP(s,d); LZ4_COPYSTEP(s,d);
215 #define HTYPE const BYTE*
216 #define INITBASE(b,s) const int b = 0
219 #if defined(LZ4_BIG_ENDIAN)
220 #define LZ4_READ_LITTLEENDIAN_16(d,s,p) { U16 v = A16(p); v = lz4_bswap16(v); d = (s) - v; }
221 #define LZ4_WRITE_LITTLEENDIAN_16(p,i) { U16 v = (U16)(i); v = lz4_bswap16(v); A16(p) = v; p+=2; }
222 #else // Little Endian
223 #define LZ4_READ_LITTLEENDIAN_16(d,s,p) { d = (s) - A16(p); }
224 #define LZ4_WRITE_LITTLEENDIAN_16(p,v) { A16(p) = v; p+=2; }
243 #define LZ4_WILDCOPY(s,d,e) do { LZ4_COPYPACKET(s,d) } while (d<e);
244 #define LZ4_BLINDCOPY(s,d,l) { BYTE* e=d+l; LZ4_WILDCOPY(s,d,e); d=e; }
245 #define HASH_FUNCTION(i) (((i) * 2654435761U) >> ((MINMATCH*8)-HASH_LOG))
246 #define HASH_VALUE(p) HASH_FUNCTION(A32(p))
247 #define HASH_POINTER(p) (HashTable[HASH_VALUE(p)] + base)
248 #define DELTANEXT(p) chainTable[(size_t)(p) & MAXD_MASK]
249 #define GETNEXT(p) ((p) - (size_t)DELTANEXT(p))
259 #if defined(LZ4_BIG_ENDIAN)
260 #if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) && defined(_M_X64)
262 _BitScanReverse64( &r, val );
264 #elif defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) && !defined(LZ4_FORCE_SW_BITCOUNT)
265 return (__builtin_clzll(val) >> 3);
268 if (!(val>>32)) { r=4; }
else { r=0; val>>=32; }
269 if (!(val>>16)) { r+=2; val>>=8; }
else { val>>=24; }
274 #if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT) && defined(_M_X64)
276 _BitScanForward64( &r, val );
278 #elif defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) && !defined(LZ4_FORCE_SW_BITCOUNT)
279 return (__builtin_ctzll(val) >> 3);
281 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 };
283 return DeBruijnBytePos[((
U64)((
U64)((
S64)val & -(
S64)val) * 0x0218A392CDABBD3F)) >> 58];
285 return DeBruijnBytePos[((
U64)((val & -val) * 0x0218A392CDABBD3F)) >> 58];
295 #if defined(LZ4_BIG_ENDIAN)
296 #if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT)
298 _BitScanReverse( &r, val );
300 #elif defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) && !defined(LZ4_FORCE_SW_BITCOUNT)
301 return (__builtin_clz(val) >> 3);
304 if (!(val>>16)) { r=2; val>>=8; }
else { r=0; val>>=24; }
309 #if defined(_MSC_VER) && !defined(LZ4_FORCE_SW_BITCOUNT)
311 _BitScanForward( &r, val );
313 #elif defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 304) && !defined(LZ4_FORCE_SW_BITCOUNT)
314 return (__builtin_ctz(val) >> 3);
316 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 };
318 return DeBruijnBytePos[((
U32)((
U32)((
S32)val & -(
S32)val) * 0x077CB531U)) >> 27];
320 return DeBruijnBytePos[((
U32)((val & -(
S32)val) * 0x077CB531U)) >> 27];
328 #endif // LZ4_CS_ADAPTER
378 const BYTE* p1t = p1;
387 if (
LZ4_ARCH64)
if ((p1t<(matchlimit-3)) && (
A32(p2) ==
A32(p1t))) { p1t+=4; p2+=4; }
388 if ((p1t<(matchlimit-1)) && (
A16(p2) ==
A16(p1t))) { p1t+=2; p2+=2; }
389 if ((p1t<matchlimit) && (*p2 == *p1t)) p1t++;
408 #define REPEAT_OPTIMIZATION
409 #ifdef REPEAT_OPTIMIZATION
415 delta = (
U16)(ip-ref);
426 if (*(ref+ml) == *(ip+ml))
430 if (mlt > ml) { ml = mlt; *matchpos = ref; }
435 #ifdef REPEAT_OPTIMIZATION
439 const BYTE* ptr = ip;
443 while(ptr < end-delta)
469 int delta = (int)(ip-startLimit);
478 if (*(startLimit + longest) == *(ref - delta + longest))
484 const BYTE* startt = ip;
493 if (
LZ4_ARCH64)
if ((ipt<(matchlimit-3)) && (
A32(reft) ==
A32(ipt))) { ipt+=4; reft+=4; }
494 if ((ipt<(matchlimit-1)) && (
A16(reft) ==
A16(ipt))) { ipt+=2; reft+=2; }
495 if ((ipt<matchlimit) && (*reft == *ipt)) ipt++;
500 const BYTE* startt = ip;
501 const BYTE* reft = ref;
505 while ((startt>startLimit) && (reft > hc4->
base) && (startt[-1] == reft[-1])) {startt--; reft--;}
507 if ((ipt-startt) > longest)
509 longest = (int)(ipt-startt);
527 length = (int)(*ip - *anchor);
529 if ((*op + length + (2 + 1 +
LASTLITERALS) + (length>>8)) > oend)
return 1;
541 if (*op + (1 +
LASTLITERALS) + (length>>8) > oend)
return 1;
542 if (len>=(
int)
ML_MASK) { *token+=
ML_MASK; len-=
ML_MASK;
for(; len > 509 ; len-=510) { *(*op)++ = 255; *(*op)++ = 255; }
if (len > 254) { len-=255; *(*op)++ = 255; } *(*op)++ = (
BYTE)len; }
543 else *token += (
BYTE)len;
563 const BYTE* ip = (
const BYTE*) source;
564 const BYTE* anchor = ip;
572 int ml, ml2, ml3, ml0;
573 const BYTE* ref=NULL;
574 const BYTE* start2=NULL;
575 const BYTE* ref2=NULL;
576 const BYTE* start3=NULL;
577 const BYTE* ref3=NULL;
587 if (!ml) { ip++;
continue; }
607 if (start2 < ip + ml0)
616 if ((start2 - ip) < 3)
633 if (ip+new_ml > start2 + ml2 -
MINMATCH) new_ml = (int)(start2 - ip) + ml2 -
MINMATCH;
634 correction = new_ml - (int)(start2 - ip);
637 start2 += correction;
644 if (start2 + ml2 < mflimit)
651 if (start2 < ip+ml) ml = (int)(start2 - ip);
659 if (start3 < ip+ml+3)
661 if (start3 >= (ip+ml))
665 int correction = (int)(ip+ml - start2);
666 start2 += correction;
698 if ((start2 - ip) < (int)
ML_MASK)
702 if (ip + ml > start2 + ml2 -
MINMATCH) ml = (int)(start2 - ip) + ml2 -
MINMATCH;
703 correction = ml - (int)(start2 - ip);
706 start2 += correction;
713 ml = (int)(start2 - ip);
732 int lastRun = (int)(iend - anchor);
736 memcpy(op, anchor, iend - anchor);
741 return (
int) (((
char*)op)-
dest);
745 CORE_EXPORT(
int ) LZ4_compressHC_limitedOutput(const
char* source,
758 CORE_EXPORT(
int ) LZ4_compressHC(const
char* source,
762 return LZ4_compressHC_limitedOutput(source, dest, inputSize,
LZ4_compressBound(inputSize)+1);
HTYPE hashTable[HASHTABLESIZE]
static void * LZ4HC_Create(const BYTE *base)
static forceinline int LZ4HC_InsertAndFindBestMatch(LZ4HC_Data_Structure *hc4, const BYTE *ip, const BYTE *const matchlimit, const BYTE **matchpos)
static int LZ4HC_Free(void **LZ4HC_Data)
char int int maxOutputSize
static forceinline int LZ4_encodeSequence(const BYTE **ip, BYTE **op, const BYTE **anchor, int matchLength, const BYTE *ref, BYTE *oend)
static forceinline void LZ4HC_Insert(LZ4HC_Data_Structure *hc4, const BYTE *ip)
static forceinline int LZ4HC_InsertAndGetWiderMatch(LZ4HC_Data_Structure *hc4, const BYTE *ip, const BYTE *startLimit, const BYTE *matchlimit, int longest, const BYTE **matchpos, const BYTE **startpos)
static int LZ4HC_Init(LZ4HC_Data_Structure *hc4, const BYTE *base)
const BYTE * nextToUpdate
static int LZ4_compressBound(int isize)
static forceinline size_t LZ4HC_CommonLength(const BYTE *p1, const BYTE *p2, const BYTE *const matchlimit)
#define LZ4_WRITE_LITTLEENDIAN_16(p, v)
#define LZ4_BLINDCOPY(s, d, l)
static int LZ4_NbCommonBytes(register U32 val)
int LZ4_compressHCCtx(LZ4HC_Data_Structure *ctx, const char *source, char *dest, int inputSize, int maxOutputSize)