extzstd 0.0.3.CONCEPT → 0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.ja +5 -0
- data/LICENSE +6 -6
- data/README.md +35 -22
- data/contrib/zstd/LICENSE +13 -9
- data/contrib/zstd/README.md +37 -44
- data/contrib/zstd/common/entropy_common.c +33 -39
- data/contrib/zstd/common/error_private.c +43 -0
- data/contrib/zstd/common/error_private.h +11 -60
- data/contrib/zstd/common/fse.h +11 -5
- data/contrib/zstd/common/fse_decompress.c +14 -16
- data/contrib/zstd/common/huf.h +1 -1
- data/contrib/zstd/common/mem.h +36 -43
- data/contrib/zstd/common/xxhash.c +31 -18
- data/contrib/zstd/common/xxhash.h +71 -35
- data/contrib/zstd/common/zbuff.h +29 -35
- data/contrib/zstd/common/zstd_common.c +24 -32
- data/contrib/zstd/common/zstd_errors.h +60 -0
- data/contrib/zstd/common/zstd_internal.h +109 -80
- data/contrib/zstd/compress/fse_compress.c +9 -6
- data/contrib/zstd/compress/huf_compress.c +30 -74
- data/contrib/zstd/compress/zbuff_compress.c +43 -51
- data/contrib/zstd/compress/zstd_compress.c +953 -763
- data/contrib/zstd/compress/zstd_opt.h +115 -261
- data/contrib/zstd/decompress/huf_decompress.c +29 -40
- data/contrib/zstd/decompress/zbuff_decompress.c +36 -78
- data/contrib/zstd/decompress/zstd_decompress.c +976 -496
- data/contrib/zstd/dictBuilder/divsufsort.h +5 -5
- data/contrib/zstd/dictBuilder/zdict.c +194 -229
- data/contrib/zstd/dictBuilder/zdict.h +66 -68
- data/contrib/zstd/legacy/zstd_legacy.h +168 -49
- data/contrib/zstd/legacy/zstd_v01.c +95 -178
- data/contrib/zstd/legacy/zstd_v01.h +12 -32
- data/contrib/zstd/legacy/zstd_v02.c +48 -274
- data/contrib/zstd/legacy/zstd_v02.h +12 -32
- data/contrib/zstd/legacy/zstd_v03.c +48 -274
- data/contrib/zstd/legacy/zstd_v03.h +12 -32
- data/contrib/zstd/legacy/zstd_v04.c +63 -320
- data/contrib/zstd/legacy/zstd_v04.h +13 -33
- data/contrib/zstd/legacy/zstd_v05.c +80 -345
- data/contrib/zstd/legacy/zstd_v05.h +9 -31
- data/contrib/zstd/legacy/zstd_v06.c +48 -458
- data/contrib/zstd/legacy/zstd_v06.h +41 -67
- data/contrib/zstd/legacy/zstd_v07.c +4544 -0
- data/contrib/zstd/legacy/zstd_v07.h +173 -0
- data/contrib/zstd/zstd.h +640 -0
- data/ext/extconf.rb +7 -3
- data/ext/extzstd.c +263 -106
- data/ext/extzstd.h +8 -6
- data/ext/extzstd_nogvls.h +0 -117
- data/ext/extzstd_stream.c +347 -0
- data/ext/zstd_common.c +8 -0
- data/ext/zstd_compress.c +6 -0
- data/ext/zstd_decompress.c +5 -0
- data/ext/zstd_dictbuilder.c +5 -0
- data/ext/zstd_legacy_v07.c +1 -0
- data/gemstub.rb +18 -16
- data/lib/extzstd/version.rb +1 -1
- data/lib/extzstd.rb +77 -43
- data/test/test_basic.rb +11 -6
- metadata +23 -10
- data/contrib/zstd/common/error_public.h +0 -77
- data/contrib/zstd/common/zstd.h +0 -475
- data/ext/extzstd_buffered.c +0 -265
- data/ext/zstd_amalgam.c +0 -18
@@ -42,12 +42,15 @@
|
|
42
42
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
43
43
|
# pragma warning(disable : 4214) /* disable: C4214: non-int bitfields */
|
44
44
|
#else
|
45
|
-
#
|
46
|
-
#
|
47
|
-
#
|
45
|
+
# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
46
|
+
# ifdef __GNUC__
|
47
|
+
# define FORCE_INLINE static inline __attribute__((always_inline))
|
48
|
+
# else
|
49
|
+
# define FORCE_INLINE static inline
|
50
|
+
# endif
|
48
51
|
# else
|
49
|
-
# define FORCE_INLINE static
|
50
|
-
# endif
|
52
|
+
# define FORCE_INLINE static
|
53
|
+
# endif /* __STDC_VERSION__ */
|
51
54
|
#endif
|
52
55
|
|
53
56
|
|
@@ -68,6 +71,9 @@
|
|
68
71
|
#define FSE_isError ERR_isError
|
69
72
|
#define FSE_STATIC_ASSERT(c) { enum { FSE_static_assert = 1/(int)(!!(c)) }; } /* use only *after* variable declarations */
|
70
73
|
|
74
|
+
/* check and forward error code */
|
75
|
+
#define CHECK_F(f) { size_t const e = f; if (FSE_isError(e)) return e; }
|
76
|
+
|
71
77
|
|
72
78
|
/* **************************************************************
|
73
79
|
* Complex types
|
@@ -152,7 +158,6 @@ size_t FSE_buildDTable(FSE_DTable* dt, const short* normalizedCounter, unsigned
|
|
152
158
|
position = (position + step) & tableMask;
|
153
159
|
while (position > highThreshold) position = (position + step) & tableMask; /* lowprob area */
|
154
160
|
} }
|
155
|
-
|
156
161
|
if (position!=0) return ERROR(GENERIC); /* position must reach all cells once, otherwise normalizedCounter is incorrect */
|
157
162
|
}
|
158
163
|
|
@@ -169,7 +174,6 @@ size_t FSE_buildDTable(FSE_DTable* dt, const short* normalizedCounter, unsigned
|
|
169
174
|
}
|
170
175
|
|
171
176
|
|
172
|
-
|
173
177
|
#ifndef FSE_COMMONDEFS_ONLY
|
174
178
|
|
175
179
|
/*-*******************************************************
|
@@ -234,8 +238,7 @@ FORCE_INLINE size_t FSE_decompress_usingDTable_generic(
|
|
234
238
|
FSE_DState_t state2;
|
235
239
|
|
236
240
|
/* Init */
|
237
|
-
|
238
|
-
if (FSE_isError(errorCode)) return errorCode; }
|
241
|
+
CHECK_F(BIT_initDStream(&bitD, cSrc, cSrcSize));
|
239
242
|
|
240
243
|
FSE_initDState(&state1, &bitD, dt);
|
241
244
|
FSE_initDState(&state2, &bitD, dt);
|
@@ -243,7 +246,7 @@ FORCE_INLINE size_t FSE_decompress_usingDTable_generic(
|
|
243
246
|
#define FSE_GETSYMBOL(statePtr) fast ? FSE_decodeSymbolFast(statePtr, &bitD) : FSE_decodeSymbol(statePtr, &bitD)
|
244
247
|
|
245
248
|
/* 4 symbols per loop */
|
246
|
-
for ( ; (BIT_reloadDStream(&bitD)==BIT_DStream_unfinished)
|
249
|
+
for ( ; (BIT_reloadDStream(&bitD)==BIT_DStream_unfinished) & (op<olimit) ; op+=4) {
|
247
250
|
op[0] = FSE_GETSYMBOL(&state1);
|
248
251
|
|
249
252
|
if (FSE_MAX_TABLELOG*2+7 > sizeof(bitD.bitContainer)*8) /* This test must be static */
|
@@ -266,18 +269,14 @@ FORCE_INLINE size_t FSE_decompress_usingDTable_generic(
|
|
266
269
|
/* note : BIT_reloadDStream(&bitD) >= FSE_DStream_partiallyFilled; Ends at exactly BIT_DStream_completed */
|
267
270
|
while (1) {
|
268
271
|
if (op>(omax-2)) return ERROR(dstSize_tooSmall);
|
269
|
-
|
270
272
|
*op++ = FSE_GETSYMBOL(&state1);
|
271
|
-
|
272
273
|
if (BIT_reloadDStream(&bitD)==BIT_DStream_overflow) {
|
273
274
|
*op++ = FSE_GETSYMBOL(&state2);
|
274
275
|
break;
|
275
276
|
}
|
276
277
|
|
277
278
|
if (op>(omax-2)) return ERROR(dstSize_tooSmall);
|
278
|
-
|
279
279
|
*op++ = FSE_GETSYMBOL(&state2);
|
280
|
-
|
281
280
|
if (BIT_reloadDStream(&bitD)==BIT_DStream_overflow) {
|
282
281
|
*op++ = FSE_GETSYMBOL(&state1);
|
283
282
|
break;
|
@@ -320,8 +319,7 @@ size_t FSE_decompress(void* dst, size_t maxDstSize, const void* cSrc, size_t cSr
|
|
320
319
|
cSrcSize -= NCountLength;
|
321
320
|
}
|
322
321
|
|
323
|
-
|
324
|
-
if (FSE_isError(errorCode)) return errorCode; }
|
322
|
+
CHECK_F( FSE_buildDTable (dt, counting, maxSymbolValue, tableLog) );
|
325
323
|
|
326
324
|
return FSE_decompress_usingDTable (dst, maxDstSize, ip, cSrcSize, dt); /* always return, even if it is an error code */
|
327
325
|
}
|
data/contrib/zstd/common/huf.h
CHANGED
@@ -100,7 +100,7 @@ size_t HUF_compress2 (void* dst, size_t dstSize, const void* src, size_t srcSize
|
|
100
100
|
/* *** Constants *** */
|
101
101
|
#define HUF_TABLELOG_ABSOLUTEMAX 16 /* absolute limit of HUF_MAX_TABLELOG. Beyond that value, code does not work */
|
102
102
|
#define HUF_TABLELOG_MAX 12 /* max configured tableLog (for static allocation); can be modified up to HUF_ABSOLUTEMAX_TABLELOG */
|
103
|
-
#define HUF_TABLELOG_DEFAULT
|
103
|
+
#define HUF_TABLELOG_DEFAULT 11 /* tableLog by default, when not specified */
|
104
104
|
#define HUF_SYMBOLVALUE_MAX 255
|
105
105
|
#if (HUF_TABLELOG_MAX > HUF_TABLELOG_ABSOLUTEMAX)
|
106
106
|
# error "HUF_TABLELOG_MAX is too large !"
|
data/contrib/zstd/common/mem.h
CHANGED
@@ -1,37 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
met:
|
11
|
-
|
12
|
-
* Redistributions of source code must retain the above copyright
|
13
|
-
notice, this list of conditions and the following disclaimer.
|
14
|
-
* Redistributions in binary form must reproduce the above
|
15
|
-
copyright notice, this list of conditions and the following disclaimer
|
16
|
-
in the documentation and/or other materials provided with the
|
17
|
-
distribution.
|
18
|
-
|
19
|
-
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
20
|
-
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
21
|
-
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
22
|
-
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
23
|
-
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
24
|
-
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
25
|
-
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
26
|
-
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
27
|
-
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
28
|
-
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
29
|
-
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
30
|
-
|
31
|
-
You can contact the author at :
|
32
|
-
- FSE source repository : https://github.com/Cyan4973/FiniteStateEntropy
|
33
|
-
- Public forum : https://groups.google.com/forum/#!forum/lz4c
|
34
|
-
****************************************************************** */
|
1
|
+
/**
|
2
|
+
* Copyright (c) 2016-present, Yann Collet, Facebook, Inc.
|
3
|
+
* All rights reserved.
|
4
|
+
*
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
6
|
+
* LICENSE file in the root directory of this source tree. An additional grant
|
7
|
+
* of patent rights can be found in the PATENTS file in the same directory.
|
8
|
+
*/
|
9
|
+
|
35
10
|
#ifndef MEM_H_MODULE
|
36
11
|
#define MEM_H_MODULE
|
37
12
|
|
@@ -44,19 +19,17 @@ extern "C" {
|
|
44
19
|
******************************************/
|
45
20
|
#include <stddef.h> /* size_t, ptrdiff_t */
|
46
21
|
#include <string.h> /* memcpy */
|
47
|
-
#if defined(_MSC_VER) /* Visual Studio */
|
48
|
-
# include <stdlib.h> /* _byteswap_ulong */
|
49
|
-
#endif
|
50
22
|
|
51
23
|
|
52
24
|
/*-****************************************
|
53
25
|
* Compiler specifics
|
54
26
|
******************************************/
|
55
|
-
#if defined(_MSC_VER)
|
56
|
-
# include <
|
27
|
+
#if defined(_MSC_VER) /* Visual Studio */
|
28
|
+
# include <stdlib.h> /* _byteswap_ulong */
|
29
|
+
# include <intrin.h> /* _byteswap_* */
|
57
30
|
#endif
|
58
31
|
#if defined(__GNUC__)
|
59
|
-
# define MEM_STATIC static __attribute__((unused))
|
32
|
+
# define MEM_STATIC static __inline __attribute__((unused))
|
60
33
|
#elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
61
34
|
# define MEM_STATIC static inline
|
62
35
|
#elif defined(_MSC_VER)
|
@@ -65,6 +38,10 @@ extern "C" {
|
|
65
38
|
# define MEM_STATIC static /* this version may generate warnings for unused static functions; disable the relevant warning */
|
66
39
|
#endif
|
67
40
|
|
41
|
+
/* code only tested on 32 and 64 bits systems */
|
42
|
+
#define MEM_STATIC_ASSERT(c) { enum { XXH_static_assert = 1/(int)(!!(c)) }; }
|
43
|
+
MEM_STATIC void MEM_check(void) { MEM_STATIC_ASSERT((sizeof(size_t)==4) || (sizeof(size_t)==8)); }
|
44
|
+
|
68
45
|
|
69
46
|
/*-**************************************************************
|
70
47
|
* Basic Types
|
@@ -108,7 +85,7 @@ extern "C" {
|
|
108
85
|
#ifndef MEM_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
|
109
86
|
# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )
|
110
87
|
# define MEM_FORCE_MEMORY_ACCESS 2
|
111
|
-
# elif defined(__INTEL_COMPILER) || \
|
88
|
+
# elif defined(__INTEL_COMPILER) /*|| defined(_MSC_VER)*/ || \
|
112
89
|
(defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
|
113
90
|
# define MEM_FORCE_MEMORY_ACCESS 1
|
114
91
|
# endif
|
@@ -140,7 +117,13 @@ MEM_STATIC void MEM_write64(void* memPtr, U64 value) { *(U64*)memPtr = value; }
|
|
140
117
|
|
141
118
|
/* __pack instructions are safer, but compiler specific, hence potentially problematic for some compilers */
|
142
119
|
/* currently only defined for gcc and icc */
|
143
|
-
|
120
|
+
#if defined(_MSC_VER) || (defined(__INTEL_COMPILER) && defined(WIN32))
|
121
|
+
__pragma( pack(push, 1) )
|
122
|
+
typedef union { U16 u16; U32 u32; U64 u64; size_t st; } unalign;
|
123
|
+
__pragma( pack(pop) )
|
124
|
+
#else
|
125
|
+
typedef union { U16 u16; U32 u32; U64 u64; size_t st; } __attribute__((packed)) unalign;
|
126
|
+
#endif
|
144
127
|
|
145
128
|
MEM_STATIC U16 MEM_read16(const void* ptr) { return ((const unalign*)ptr)->u16; }
|
146
129
|
MEM_STATIC U32 MEM_read32(const void* ptr) { return ((const unalign*)ptr)->u32; }
|
@@ -256,6 +239,17 @@ MEM_STATIC void MEM_writeLE16(void* memPtr, U16 val)
|
|
256
239
|
}
|
257
240
|
}
|
258
241
|
|
242
|
+
MEM_STATIC U32 MEM_readLE24(const void* memPtr)
|
243
|
+
{
|
244
|
+
return MEM_readLE16(memPtr) + (((const BYTE*)memPtr)[2] << 16);
|
245
|
+
}
|
246
|
+
|
247
|
+
MEM_STATIC void MEM_writeLE24(void* memPtr, U32 val)
|
248
|
+
{
|
249
|
+
MEM_writeLE16(memPtr, (U16)val);
|
250
|
+
((BYTE*)memPtr)[2] = (BYTE)(val>>16);
|
251
|
+
}
|
252
|
+
|
259
253
|
MEM_STATIC U32 MEM_readLE32(const void* memPtr)
|
260
254
|
{
|
261
255
|
if (MEM_isLittleEndian())
|
@@ -374,4 +368,3 @@ MEM_STATIC U32 MEM_readMINMATCH(const void* memPtr, U32 length)
|
|
374
368
|
#endif
|
375
369
|
|
376
370
|
#endif /* MEM_H_MODULE */
|
377
|
-
|
@@ -52,7 +52,7 @@
|
|
52
52
|
#ifndef XXH_FORCE_MEMORY_ACCESS /* can be defined externally, on command line for example */
|
53
53
|
# if defined(__GNUC__) && ( defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined(__ARM_ARCH_6ZK__) || defined(__ARM_ARCH_6T2__) )
|
54
54
|
# define XXH_FORCE_MEMORY_ACCESS 2
|
55
|
-
# elif defined(__INTEL_COMPILER) || \
|
55
|
+
# elif (defined(__INTEL_COMPILER) && !defined(WIN32)) || \
|
56
56
|
(defined(__GNUC__) && ( defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__) ))
|
57
57
|
# define XXH_FORCE_MEMORY_ACCESS 1
|
58
58
|
# endif
|
@@ -115,7 +115,7 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcp
|
|
115
115
|
# pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */
|
116
116
|
# define FORCE_INLINE static __forceinline
|
117
117
|
#else
|
118
|
-
# if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
118
|
+
# if defined (__cplusplus) || defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 */
|
119
119
|
# ifdef __GNUC__
|
120
120
|
# define FORCE_INLINE static inline __attribute__((always_inline))
|
121
121
|
# else
|
@@ -132,7 +132,7 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcp
|
|
132
132
|
***************************************/
|
133
133
|
#ifndef MEM_MODULE
|
134
134
|
# define MEM_MODULE
|
135
|
-
# if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
|
135
|
+
# if !defined (__VMS) && (defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )
|
136
136
|
# include <stdint.h>
|
137
137
|
typedef uint8_t BYTE;
|
138
138
|
typedef uint16_t U16;
|
@@ -144,7 +144,7 @@ static void* XXH_memcpy(void* dest, const void* src, size_t size) { return memcp
|
|
144
144
|
typedef unsigned short U16;
|
145
145
|
typedef unsigned int U32;
|
146
146
|
typedef signed int S32;
|
147
|
-
typedef unsigned long long U64;
|
147
|
+
typedef unsigned long long U64; /* if your compiler doesn't support unsigned long long, replace by another 64-bit type here. Note that xxhash.h will also need to be updated. */
|
148
148
|
# endif
|
149
149
|
#endif
|
150
150
|
|
@@ -307,6 +307,20 @@ static const U64 PRIME64_5 = 2870177450012600261ULL;
|
|
307
307
|
XXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; }
|
308
308
|
|
309
309
|
|
310
|
+
/* **************************
|
311
|
+
* Utils
|
312
|
+
****************************/
|
313
|
+
XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* restrict dstState, const XXH32_state_t* restrict srcState)
|
314
|
+
{
|
315
|
+
memcpy(dstState, srcState, sizeof(*dstState));
|
316
|
+
}
|
317
|
+
|
318
|
+
XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* restrict dstState, const XXH64_state_t* restrict srcState)
|
319
|
+
{
|
320
|
+
memcpy(dstState, srcState, sizeof(*dstState));
|
321
|
+
}
|
322
|
+
|
323
|
+
|
310
324
|
/* ***************************
|
311
325
|
* Simple Hash Functions
|
312
326
|
*****************************/
|
@@ -545,8 +559,7 @@ XXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr)
|
|
545
559
|
XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, unsigned int seed)
|
546
560
|
{
|
547
561
|
XXH32_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */
|
548
|
-
memset(&state, 0, sizeof(state));
|
549
|
-
state.seed = seed;
|
562
|
+
memset(&state, 0, sizeof(state)-4); /* do not write into reserved, for future removal */
|
550
563
|
state.v1 = seed + PRIME32_1 + PRIME32_2;
|
551
564
|
state.v2 = seed + PRIME32_2;
|
552
565
|
state.v3 = seed + 0;
|
@@ -559,8 +572,7 @@ XXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, unsigned int s
|
|
559
572
|
XXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH64_state_t* statePtr, unsigned long long seed)
|
560
573
|
{
|
561
574
|
XXH64_state_t state; /* using a local state to memcpy() in order to avoid strict-aliasing warnings */
|
562
|
-
memset(&state, 0, sizeof(state));
|
563
|
-
state.seed = seed;
|
575
|
+
memset(&state, 0, sizeof(state)-8); /* do not write into reserved, for future removal */
|
564
576
|
state.v1 = seed + PRIME64_1 + PRIME64_2;
|
565
577
|
state.v2 = seed + PRIME64_2;
|
566
578
|
state.v3 = seed + 0;
|
@@ -579,11 +591,12 @@ FORCE_INLINE XXH_errorcode XXH32_update_endian (XXH32_state_t* state, const void
|
|
579
591
|
if (input==NULL) return XXH_ERROR;
|
580
592
|
#endif
|
581
593
|
|
582
|
-
state->
|
594
|
+
state->total_len_32 += (unsigned)len;
|
595
|
+
state->large_len |= (len>=16) | (state->total_len_32>=16);
|
583
596
|
|
584
597
|
if (state->memsize + len < 16) { /* fill in tmp buffer */
|
585
598
|
XXH_memcpy((BYTE*)(state->mem32) + state->memsize, input, len);
|
586
|
-
state->memsize += (
|
599
|
+
state->memsize += (unsigned)len;
|
587
600
|
return XXH_OK;
|
588
601
|
}
|
589
602
|
|
@@ -620,8 +633,8 @@ FORCE_INLINE XXH_errorcode XXH32_update_endian (XXH32_state_t* state, const void
|
|
620
633
|
}
|
621
634
|
|
622
635
|
if (p < bEnd) {
|
623
|
-
XXH_memcpy(state->mem32, p, bEnd-p);
|
624
|
-
state->memsize = (
|
636
|
+
XXH_memcpy(state->mem32, p, (size_t)(bEnd-p));
|
637
|
+
state->memsize = (unsigned)(bEnd-p);
|
625
638
|
}
|
626
639
|
|
627
640
|
return XXH_OK;
|
@@ -645,13 +658,13 @@ FORCE_INLINE U32 XXH32_digest_endian (const XXH32_state_t* state, XXH_endianess
|
|
645
658
|
const BYTE* const bEnd = (const BYTE*)(state->mem32) + state->memsize;
|
646
659
|
U32 h32;
|
647
660
|
|
648
|
-
if (state->
|
661
|
+
if (state->large_len) {
|
649
662
|
h32 = XXH_rotl32(state->v1, 1) + XXH_rotl32(state->v2, 7) + XXH_rotl32(state->v3, 12) + XXH_rotl32(state->v4, 18);
|
650
663
|
} else {
|
651
|
-
h32 = state->seed + PRIME32_5;
|
664
|
+
h32 = state->v3 /* == seed */ + PRIME32_5;
|
652
665
|
}
|
653
666
|
|
654
|
-
h32 +=
|
667
|
+
h32 += state->total_len_32;
|
655
668
|
|
656
669
|
while (p+4<=bEnd) {
|
657
670
|
h32 += XXH_readLE32(p, endian) * PRIME32_3;
|
@@ -737,8 +750,8 @@ FORCE_INLINE XXH_errorcode XXH64_update_endian (XXH64_state_t* state, const void
|
|
737
750
|
}
|
738
751
|
|
739
752
|
if (p < bEnd) {
|
740
|
-
XXH_memcpy(state->mem64, p, bEnd-p);
|
741
|
-
state->memsize = (
|
753
|
+
XXH_memcpy(state->mem64, p, (size_t)(bEnd-p));
|
754
|
+
state->memsize = (unsigned)(bEnd-p);
|
742
755
|
}
|
743
756
|
|
744
757
|
return XXH_OK;
|
@@ -774,7 +787,7 @@ FORCE_INLINE U64 XXH64_digest_endian (const XXH64_state_t* state, XXH_endianess
|
|
774
787
|
h64 = XXH64_mergeRound(h64, v3);
|
775
788
|
h64 = XXH64_mergeRound(h64, v4);
|
776
789
|
} else {
|
777
|
-
h64 = state->
|
790
|
+
h64 = state->v3 + PRIME64_5;
|
778
791
|
}
|
779
792
|
|
780
793
|
h64 += (U64) state->total_len;
|
@@ -71,6 +71,10 @@ XXH32 6.8 GB/s 6.0 GB/s
|
|
71
71
|
extern "C" {
|
72
72
|
#endif
|
73
73
|
|
74
|
+
#ifndef XXH_NAMESPACE
|
75
|
+
# define XXH_NAMESPACE ZSTD_ /* Zstandard specific */
|
76
|
+
#endif
|
77
|
+
|
74
78
|
|
75
79
|
/* ****************************
|
76
80
|
* Definitions
|
@@ -82,18 +86,21 @@ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;
|
|
82
86
|
/* ****************************
|
83
87
|
* API modifier
|
84
88
|
******************************/
|
85
|
-
|
86
|
-
*
|
87
|
-
*
|
88
|
-
*
|
89
|
-
* do :
|
89
|
+
/** XXH_PRIVATE_API
|
90
|
+
* This is useful if you want to include xxhash functions in `static` mode
|
91
|
+
* in order to inline them, and remove their symbol from the public list.
|
92
|
+
* Methodology :
|
90
93
|
* #define XXH_PRIVATE_API
|
91
|
-
* #include "xxhash.
|
92
|
-
*
|
94
|
+
* #include "xxhash.h"
|
95
|
+
* `xxhash.c` is automatically included.
|
96
|
+
* It's not useful to compile and link it as a separate module anymore.
|
93
97
|
*/
|
94
98
|
#ifdef XXH_PRIVATE_API
|
99
|
+
# ifndef XXH_STATIC_LINKING_ONLY
|
100
|
+
# define XXH_STATIC_LINKING_ONLY
|
101
|
+
# endif
|
95
102
|
# if defined(__GNUC__)
|
96
|
-
# define XXH_PUBLIC_API static __attribute__((unused))
|
103
|
+
# define XXH_PUBLIC_API static __inline __attribute__((unused))
|
97
104
|
# elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)
|
98
105
|
# define XXH_PUBLIC_API static inline
|
99
106
|
# elif defined(_MSC_VER)
|
@@ -103,17 +110,17 @@ typedef enum { XXH_OK=0, XXH_ERROR } XXH_errorcode;
|
|
103
110
|
# endif
|
104
111
|
#else
|
105
112
|
# define XXH_PUBLIC_API /* do nothing */
|
106
|
-
#endif
|
113
|
+
#endif /* XXH_PRIVATE_API */
|
107
114
|
|
108
115
|
/*!XXH_NAMESPACE, aka Namespace Emulation :
|
109
116
|
|
110
117
|
If you want to include _and expose_ xxHash functions from within your own library,
|
111
118
|
but also want to avoid symbol collisions with another library which also includes xxHash,
|
112
119
|
|
113
|
-
you can use XXH_NAMESPACE, to automatically prefix any public symbol from
|
120
|
+
you can use XXH_NAMESPACE, to automatically prefix any public symbol from xxhash library
|
114
121
|
with the value of XXH_NAMESPACE (so avoid to keep it NULL and avoid numeric values).
|
115
122
|
|
116
|
-
Note that no change is required within the calling program as long as it
|
123
|
+
Note that no change is required within the calling program as long as it includes `xxhash.h` :
|
117
124
|
regular symbol name will be automatically translated by this header.
|
118
125
|
*/
|
119
126
|
#ifdef XXH_NAMESPACE
|
@@ -132,6 +139,12 @@ regular symbol name will be automatically translated by this header.
|
|
132
139
|
# define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update)
|
133
140
|
# define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest)
|
134
141
|
# define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest)
|
142
|
+
# define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState)
|
143
|
+
# define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState)
|
144
|
+
# define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash)
|
145
|
+
# define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash)
|
146
|
+
# define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical)
|
147
|
+
# define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical)
|
135
148
|
#endif
|
136
149
|
|
137
150
|
|
@@ -140,7 +153,7 @@ regular symbol name will be automatically translated by this header.
|
|
140
153
|
***************************************/
|
141
154
|
#define XXH_VERSION_MAJOR 0
|
142
155
|
#define XXH_VERSION_MINOR 6
|
143
|
-
#define XXH_VERSION_RELEASE
|
156
|
+
#define XXH_VERSION_RELEASE 2
|
144
157
|
#define XXH_VERSION_NUMBER (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)
|
145
158
|
XXH_PUBLIC_API unsigned XXH_versionNumber (void);
|
146
159
|
|
@@ -163,7 +176,7 @@ XXH32() :
|
|
163
176
|
XXH64() :
|
164
177
|
Calculate the 64-bits hash of sequence of length "len" stored at memory address "input".
|
165
178
|
"seed" can be used to alter the result predictably.
|
166
|
-
This function runs faster on 64-bits systems, but slower on 32-bits systems (see benchmark).
|
179
|
+
This function runs 2x faster on 64-bits systems, but slower on 32-bits systems (see benchmark).
|
167
180
|
*/
|
168
181
|
|
169
182
|
|
@@ -173,8 +186,7 @@ XXH64() :
|
|
173
186
|
typedef struct XXH32_state_s XXH32_state_t; /* incomplete type */
|
174
187
|
typedef struct XXH64_state_s XXH64_state_t; /* incomplete type */
|
175
188
|
|
176
|
-
/*!
|
177
|
-
Compatible with dynamic libraries */
|
189
|
+
/*! State allocation, compatible with dynamic libraries */
|
178
190
|
|
179
191
|
XXH_PUBLIC_API XXH32_state_t* XXH32_createState(void);
|
180
192
|
XXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr);
|
@@ -193,28 +205,40 @@ XXH_PUBLIC_API XXH_errorcode XXH64_reset (XXH64_state_t* statePtr, unsigned lon
|
|
193
205
|
XXH_PUBLIC_API XXH_errorcode XXH64_update (XXH64_state_t* statePtr, const void* input, size_t length);
|
194
206
|
XXH_PUBLIC_API XXH64_hash_t XXH64_digest (const XXH64_state_t* statePtr);
|
195
207
|
|
196
|
-
|
197
|
-
These functions generate the xxHash of an input provided in multiple segments
|
198
|
-
|
208
|
+
/*
|
209
|
+
These functions generate the xxHash of an input provided in multiple segments.
|
210
|
+
Note that, for small input, they are slower than single-call functions, due to state management.
|
211
|
+
For small input, prefer `XXH32()` and `XXH64()` .
|
199
212
|
|
200
|
-
XXH state must first be allocated, using
|
213
|
+
XXH state must first be allocated, using XXH*_createState() .
|
201
214
|
|
202
|
-
Start a new hash by initializing state with a seed, using
|
215
|
+
Start a new hash by initializing state with a seed, using XXH*_reset().
|
203
216
|
|
204
|
-
Then, feed the hash state by calling
|
205
|
-
Obviously, input must be
|
217
|
+
Then, feed the hash state by calling XXH*_update() as many times as necessary.
|
218
|
+
Obviously, input must be allocated and read accessible.
|
206
219
|
The function returns an error code, with 0 meaning OK, and any other value meaning there is an error.
|
207
220
|
|
208
|
-
Finally, a hash value can be produced anytime, by using
|
221
|
+
Finally, a hash value can be produced anytime, by using XXH*_digest().
|
209
222
|
This function returns the nn-bits hash as an int or long long.
|
210
223
|
|
211
224
|
It's still possible to continue inserting input into the hash state after a digest,
|
212
|
-
and
|
225
|
+
and generate some new hashes later on, by calling again XXH*_digest().
|
213
226
|
|
214
227
|
When done, free XXH state space if it was allocated dynamically.
|
215
228
|
*/
|
216
229
|
|
217
230
|
|
231
|
+
/* **************************
|
232
|
+
* Utils
|
233
|
+
****************************/
|
234
|
+
#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) /* ! C99 */
|
235
|
+
# define restrict /* disable restrict */
|
236
|
+
#endif
|
237
|
+
|
238
|
+
XXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* restrict dst_state, const XXH32_state_t* restrict src_state);
|
239
|
+
XXH_PUBLIC_API void XXH64_copyState(XXH64_state_t* restrict dst_state, const XXH64_state_t* restrict src_state);
|
240
|
+
|
241
|
+
|
218
242
|
/* **************************
|
219
243
|
* Canonical representation
|
220
244
|
****************************/
|
@@ -227,43 +251,55 @@ XXH_PUBLIC_API void XXH64_canonicalFromHash(XXH64_canonical_t* dst, XXH64_hash_t
|
|
227
251
|
XXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);
|
228
252
|
XXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(const XXH64_canonical_t* src);
|
229
253
|
|
230
|
-
|
231
|
-
*
|
232
|
-
*
|
233
|
-
*
|
254
|
+
/* Default result type for XXH functions are primitive unsigned 32 and 64 bits.
|
255
|
+
* The canonical representation uses human-readable write convention, aka big-endian (large digits first).
|
256
|
+
* These functions allow transformation of hash result into and from its canonical format.
|
257
|
+
* This way, hash values can be written into a file / memory, and remain comparable on different systems and programs.
|
234
258
|
*/
|
235
259
|
|
236
260
|
|
237
261
|
#ifdef XXH_STATIC_LINKING_ONLY
|
238
262
|
|
239
|
-
/*
|
240
|
-
|
241
|
-
They
|
263
|
+
/* ================================================================================================
|
264
|
+
This section contains definitions which are not guaranteed to remain stable.
|
265
|
+
They may change in future versions, becoming incompatible with a different version of the library.
|
266
|
+
They shall only be used with static linking.
|
267
|
+
Never use these definitions in association with dynamic linking !
|
268
|
+
=================================================================================================== */
|
269
|
+
|
270
|
+
/* These definitions are only meant to allow allocation of XXH state
|
271
|
+
statically, on stack, or in a struct for example.
|
272
|
+
Do not use members directly. */
|
242
273
|
|
243
274
|
struct XXH32_state_s {
|
244
|
-
unsigned
|
245
|
-
unsigned
|
275
|
+
unsigned total_len_32;
|
276
|
+
unsigned large_len;
|
246
277
|
unsigned v1;
|
247
278
|
unsigned v2;
|
248
279
|
unsigned v3;
|
249
280
|
unsigned v4;
|
250
281
|
unsigned mem32[4]; /* buffer defined as U32 for alignment */
|
251
282
|
unsigned memsize;
|
283
|
+
unsigned reserved; /* never read nor write, will be removed in a future version */
|
252
284
|
}; /* typedef'd to XXH32_state_t */
|
253
285
|
|
254
286
|
struct XXH64_state_s {
|
255
287
|
unsigned long long total_len;
|
256
|
-
unsigned long long seed;
|
257
288
|
unsigned long long v1;
|
258
289
|
unsigned long long v2;
|
259
290
|
unsigned long long v3;
|
260
291
|
unsigned long long v4;
|
261
292
|
unsigned long long mem64[4]; /* buffer defined as U64 for alignment */
|
262
293
|
unsigned memsize;
|
294
|
+
unsigned reserved[2]; /* never read nor write, will be removed in a future version */
|
263
295
|
}; /* typedef'd to XXH64_state_t */
|
264
296
|
|
265
297
|
|
266
|
-
#
|
298
|
+
# ifdef XXH_PRIVATE_API
|
299
|
+
# include "xxhash.c" /* include xxhash functions as `static`, for inlining */
|
300
|
+
# endif
|
301
|
+
|
302
|
+
#endif /* XXH_STATIC_LINKING_ONLY */
|
267
303
|
|
268
304
|
|
269
305
|
#if defined (__cplusplus)
|