mirror of
https://github.com/lz4/lz4.git
synced 2024-11-27 03:48:08 +08:00
Merge pull request #1253 from ltrk2/bugfix/hashing-on-big-endian
Make hashes identical between LE and BE platforms
This commit is contained in:
commit
26b3b238fe
1
.gitignore
vendored
1
.gitignore
vendored
@ -21,6 +21,7 @@ lz4
|
||||
|
||||
# IDE / editors files
|
||||
.clang_complete
|
||||
.vscode
|
||||
_codelite/
|
||||
_codelite_lz4/
|
||||
bin/
|
||||
|
@ -81,6 +81,15 @@ if get_option('memory-usage') > 0
|
||||
compile_args += '-DLZ4_MEMORY_USAGE=@0@'.format(get_option('memory-usage'))
|
||||
endif
|
||||
|
||||
if get_option('endianness-independent-output')
|
||||
if get_option('default_library') != 'static'
|
||||
error('Endianness-independent output can only be enabled in static builds')
|
||||
endif
|
||||
|
||||
add_project_arguments('-DLZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT')
|
||||
compile_args += '-DLZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT'
|
||||
endif
|
||||
|
||||
if get_option('unstable')
|
||||
add_project_arguments('-DLZ4_STATIC_LINKING_ONLY', language: 'c')
|
||||
compile_args += '-DLZ4_STATIC_LINKING_ONLY'
|
||||
|
@ -18,6 +18,8 @@ option('disable-memory-allocation', type: 'boolean', value: false,
|
||||
description: 'See LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION. Static builds only')
|
||||
option('distance-max', type: 'integer', min: 0, max: 65535, value: 65535,
|
||||
description: 'See LZ4_DISTANCE_MAX')
|
||||
option('endianness-independent-output', type: 'boolean', value: false,
|
||||
description: 'See LZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT. Static builds only')
|
||||
option('examples', type: 'boolean', value: false,
|
||||
description: 'Enable examples')
|
||||
option('fast-dec-loop', type: 'feature', value: 'auto',
|
||||
|
@ -108,6 +108,12 @@ The following build macro can be selected to adjust source code behavior at comp
|
||||
Remove support of dynamic memory allocation.
|
||||
For more details, see description of this macro in `lib/lz4.c`.
|
||||
|
||||
- `LZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT` : experimental feature aimed at producing the same
|
||||
compressed output on platforms of different endianness (i.e. little-endian and big-endian).
|
||||
Output on little-endian platforms shall remain unchanged, while big-endian platforms will start producing
|
||||
the same output as little-endian ones. This isn't expected to impact backward- and forward-compatibility
|
||||
in any way.
|
||||
|
||||
- `LZ4_FREESTANDING` : by setting this build macro to 1,
|
||||
LZ4/HC removes dependencies on the C standard library,
|
||||
including allocation functions and `memmove()`, `memcpy()`, and `memset()`.
|
||||
|
17
lib/lz4.c
17
lib/lz4.c
@ -434,6 +434,18 @@ static U16 LZ4_readLE16(const void* memPtr)
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef LZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT
|
||||
static U32 LZ4_readLE32(const void* memPtr)
|
||||
{
|
||||
if (LZ4_isLittleEndian()) {
|
||||
return LZ4_read32(memPtr);
|
||||
} else {
|
||||
const BYTE* p = (const BYTE*)memPtr;
|
||||
return (U32)p[0] + (p[1]<<8) + (p[2]<<16) + (p[3]<<24);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
static void LZ4_writeLE16(void* memPtr, U16 value)
|
||||
{
|
||||
if (LZ4_isLittleEndian()) {
|
||||
@ -782,7 +794,12 @@ LZ4_FORCE_INLINE U32 LZ4_hash5(U64 sequence, tableType_t const tableType)
|
||||
LZ4_FORCE_INLINE U32 LZ4_hashPosition(const void* const p, tableType_t const tableType)
|
||||
{
|
||||
if ((sizeof(reg_t)==8) && (tableType != byU16)) return LZ4_hash5(LZ4_read_ARCH(p), tableType);
|
||||
|
||||
#ifdef LZ4_STATIC_LINKING_ONLY_ENDIANNESS_INDEPENDENT_OUTPUT
|
||||
return LZ4_hash4(LZ4_readLE32(p), tableType);
|
||||
#else
|
||||
return LZ4_hash4(LZ4_read32(p), tableType);
|
||||
#endif
|
||||
}
|
||||
|
||||
LZ4_FORCE_INLINE void LZ4_clearHash(U32 h, void* tableBase, tableType_t const tableType)
|
||||
|
Loading…
Reference in New Issue
Block a user