isomorfeus-ferret 0.17.2 → 0.17.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/isomorfeus_ferret_ext/benchmark.c +9 -20
- data/ext/isomorfeus_ferret_ext/benchmarks_all.h +1 -2
- data/ext/isomorfeus_ferret_ext/bm_hash.c +1 -2
- data/ext/isomorfeus_ferret_ext/brotli_dec_decode.c +4 -2
- data/ext/isomorfeus_ferret_ext/brotli_enc_encode.c +3 -2
- data/ext/isomorfeus_ferret_ext/frb_analysis.c +4 -5
- data/ext/isomorfeus_ferret_ext/frb_field_info.c +3 -4
- data/ext/isomorfeus_ferret_ext/frb_index.c +118 -125
- data/ext/isomorfeus_ferret_ext/frb_lazy_doc.c +14 -16
- data/ext/isomorfeus_ferret_ext/frb_search.c +31 -23
- data/ext/isomorfeus_ferret_ext/frb_store.c +27 -13
- data/ext/isomorfeus_ferret_ext/frb_utils.c +3 -6
- data/ext/isomorfeus_ferret_ext/frt_analysis.c +39 -46
- data/ext/isomorfeus_ferret_ext/frt_analysis.h +9 -9
- data/ext/isomorfeus_ferret_ext/frt_array.c +11 -22
- data/ext/isomorfeus_ferret_ext/frt_bitvector.h +3 -6
- data/ext/isomorfeus_ferret_ext/frt_doc_field.c +87 -0
- data/ext/isomorfeus_ferret_ext/frt_doc_field.h +26 -0
- data/ext/isomorfeus_ferret_ext/frt_document.c +4 -97
- data/ext/isomorfeus_ferret_ext/frt_document.h +2 -27
- data/ext/isomorfeus_ferret_ext/frt_except.c +8 -6
- data/ext/isomorfeus_ferret_ext/frt_except.h +1 -2
- data/ext/isomorfeus_ferret_ext/frt_field_index.c +13 -32
- data/ext/isomorfeus_ferret_ext/frt_field_index.h +0 -6
- data/ext/isomorfeus_ferret_ext/frt_field_info.c +69 -0
- data/ext/isomorfeus_ferret_ext/frt_field_info.h +49 -0
- data/ext/isomorfeus_ferret_ext/frt_field_infos.c +196 -0
- data/ext/isomorfeus_ferret_ext/frt_field_infos.h +35 -0
- data/ext/isomorfeus_ferret_ext/frt_global.c +10 -4
- data/ext/isomorfeus_ferret_ext/frt_global.h +11 -15
- data/ext/isomorfeus_ferret_ext/frt_hash.c +8 -8
- data/ext/isomorfeus_ferret_ext/frt_hash.h +1 -2
- data/ext/isomorfeus_ferret_ext/frt_hashset.c +20 -40
- data/ext/isomorfeus_ferret_ext/frt_hashset.h +1 -2
- data/ext/isomorfeus_ferret_ext/frt_helper.c +7 -15
- data/ext/isomorfeus_ferret_ext/frt_in_stream.c +35 -45
- data/ext/isomorfeus_ferret_ext/frt_in_stream.h +3 -2
- data/ext/isomorfeus_ferret_ext/frt_ind.c +20 -38
- data/ext/isomorfeus_ferret_ext/frt_index.c +292 -790
- data/ext/isomorfeus_ferret_ext/frt_index.h +1 -102
- data/ext/isomorfeus_ferret_ext/frt_lang.c +5 -10
- data/ext/isomorfeus_ferret_ext/frt_lazy_doc.c +3 -3
- data/ext/isomorfeus_ferret_ext/frt_lazy_doc.h +1 -1
- data/ext/isomorfeus_ferret_ext/frt_lazy_doc_field.c +18 -25
- data/ext/isomorfeus_ferret_ext/frt_lazy_doc_field.h +5 -5
- data/ext/isomorfeus_ferret_ext/frt_mdbx_store.c +102 -70
- data/ext/isomorfeus_ferret_ext/frt_mempool.c +8 -16
- data/ext/isomorfeus_ferret_ext/frt_multimapper.c +23 -46
- data/ext/isomorfeus_ferret_ext/frt_multimapper.h +4 -8
- data/ext/isomorfeus_ferret_ext/frt_out_stream.c +31 -43
- data/ext/isomorfeus_ferret_ext/frt_out_stream.h +2 -2
- data/ext/isomorfeus_ferret_ext/frt_posh.c +6 -819
- data/ext/isomorfeus_ferret_ext/frt_posh.h +0 -57
- data/ext/isomorfeus_ferret_ext/frt_priorityqueue.c +11 -22
- data/ext/isomorfeus_ferret_ext/frt_priorityqueue.h +1 -2
- data/ext/isomorfeus_ferret_ext/frt_q_boolean.c +85 -171
- data/ext/isomorfeus_ferret_ext/frt_q_match_all.c +8 -16
- data/ext/isomorfeus_ferret_ext/frt_q_multi_term.c +1 -2
- data/ext/isomorfeus_ferret_ext/frt_q_parser.c +49 -98
- data/ext/isomorfeus_ferret_ext/frt_q_phrase.c +52 -104
- data/ext/isomorfeus_ferret_ext/frt_q_range.c +6 -12
- data/ext/isomorfeus_ferret_ext/frt_q_span.c +113 -226
- data/ext/isomorfeus_ferret_ext/frt_q_wildcard.c +1 -2
- data/ext/isomorfeus_ferret_ext/frt_ram_store.c +134 -85
- data/ext/isomorfeus_ferret_ext/frt_search.c +82 -164
- data/ext/isomorfeus_ferret_ext/frt_similarity.c +11 -22
- data/ext/isomorfeus_ferret_ext/frt_similarity.h +1 -2
- data/ext/isomorfeus_ferret_ext/frt_store.c +13 -25
- data/ext/isomorfeus_ferret_ext/frt_store.h +86 -52
- data/ext/isomorfeus_ferret_ext/frt_term_vectors.c +8 -16
- data/ext/isomorfeus_ferret_ext/frt_win32.h +5 -10
- data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.c +12 -11
- data/ext/isomorfeus_ferret_ext/isomorfeus_ferret.h +11 -13
- data/ext/isomorfeus_ferret_ext/lz4.c +422 -195
- data/ext/isomorfeus_ferret_ext/lz4.h +114 -46
- data/ext/isomorfeus_ferret_ext/lz4frame.c +421 -242
- data/ext/isomorfeus_ferret_ext/lz4frame.h +122 -53
- data/ext/isomorfeus_ferret_ext/lz4hc.c +127 -111
- data/ext/isomorfeus_ferret_ext/lz4hc.h +14 -14
- data/ext/isomorfeus_ferret_ext/lz4xxhash.h +1 -1
- data/ext/isomorfeus_ferret_ext/mdbx.c +3762 -2526
- data/ext/isomorfeus_ferret_ext/mdbx.h +115 -70
- data/ext/isomorfeus_ferret_ext/test.c +40 -87
- data/ext/isomorfeus_ferret_ext/test.h +3 -6
- data/ext/isomorfeus_ferret_ext/test_1710.c +11 -13
- data/ext/isomorfeus_ferret_ext/test_analysis.c +32 -64
- data/ext/isomorfeus_ferret_ext/test_array.c +6 -12
- data/ext/isomorfeus_ferret_ext/test_bitvector.c +12 -24
- data/ext/isomorfeus_ferret_ext/test_document.c +23 -33
- data/ext/isomorfeus_ferret_ext/test_except.c +10 -21
- data/ext/isomorfeus_ferret_ext/test_fields.c +62 -68
- data/ext/isomorfeus_ferret_ext/test_file_deleter.c +15 -23
- data/ext/isomorfeus_ferret_ext/test_filter.c +17 -27
- data/ext/isomorfeus_ferret_ext/test_global.c +14 -29
- data/ext/isomorfeus_ferret_ext/test_hash.c +19 -38
- data/ext/isomorfeus_ferret_ext/test_hashset.c +8 -16
- data/ext/isomorfeus_ferret_ext/test_helper.c +4 -8
- data/ext/isomorfeus_ferret_ext/test_highlighter.c +16 -28
- data/ext/isomorfeus_ferret_ext/test_index.c +277 -487
- data/ext/isomorfeus_ferret_ext/test_lang.c +7 -14
- data/ext/isomorfeus_ferret_ext/test_mdbx_store.c +2 -5
- data/ext/isomorfeus_ferret_ext/test_mempool.c +5 -10
- data/ext/isomorfeus_ferret_ext/test_multimapper.c +3 -6
- data/ext/isomorfeus_ferret_ext/test_priorityqueue.c +9 -18
- data/ext/isomorfeus_ferret_ext/test_q_const_score.c +4 -6
- data/ext/isomorfeus_ferret_ext/test_q_filtered.c +3 -4
- data/ext/isomorfeus_ferret_ext/test_q_fuzzy.c +9 -15
- data/ext/isomorfeus_ferret_ext/test_q_parser.c +8 -16
- data/ext/isomorfeus_ferret_ext/test_q_span.c +19 -35
- data/ext/isomorfeus_ferret_ext/test_ram_store.c +14 -13
- data/ext/isomorfeus_ferret_ext/test_search.c +60 -109
- data/ext/isomorfeus_ferret_ext/test_segments.c +8 -13
- data/ext/isomorfeus_ferret_ext/test_similarity.c +2 -4
- data/ext/isomorfeus_ferret_ext/test_sort.c +14 -24
- data/ext/isomorfeus_ferret_ext/test_store.c +96 -115
- data/ext/isomorfeus_ferret_ext/test_term.c +9 -15
- data/ext/isomorfeus_ferret_ext/test_term_vectors.c +9 -14
- data/ext/isomorfeus_ferret_ext/test_test.c +4 -8
- data/ext/isomorfeus_ferret_ext/test_threading.c +14 -20
- data/ext/isomorfeus_ferret_ext/testhelper.c +11 -21
- data/ext/isomorfeus_ferret_ext/testhelper.h +1 -1
- data/ext/isomorfeus_ferret_ext/tests_all.h +1 -2
- data/lib/isomorfeus/ferret/index/index.rb +1 -1
- data/lib/isomorfeus/ferret/version.rb +1 -1
- metadata +24 -4
@@ -1,6 +1,6 @@
|
|
1
1
|
/*
|
2
2
|
LZ4 HC - High Compression Mode of LZ4
|
3
|
-
Copyright (C) 2011-
|
3
|
+
Copyright (C) 2011-2020, Yann Collet.
|
4
4
|
|
5
5
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
6
6
|
|
@@ -42,7 +42,7 @@
|
|
42
42
|
* Select how default compression function will allocate workplace memory,
|
43
43
|
* in stack (0:fastest), or in heap (1:requires malloc()).
|
44
44
|
* Since workplace is rather large, heap mode is recommended.
|
45
|
-
|
45
|
+
**/
|
46
46
|
#ifndef LZ4HC_HEAPMODE
|
47
47
|
# define LZ4HC_HEAPMODE 1
|
48
48
|
#endif
|
@@ -99,18 +99,20 @@ static void LZ4HC_clearTables (LZ4HC_CCtx_internal* hc4)
|
|
99
99
|
|
100
100
|
static void LZ4HC_init_internal (LZ4HC_CCtx_internal* hc4, const BYTE* start)
|
101
101
|
{
|
102
|
-
|
103
|
-
|
102
|
+
size_t const bufferSize = (size_t)(hc4->end - hc4->prefixStart);
|
103
|
+
size_t newStartingOffset = bufferSize + hc4->dictLimit;
|
104
|
+
assert(newStartingOffset >= bufferSize); /* check overflow */
|
105
|
+
if (newStartingOffset > 1 GB) {
|
104
106
|
LZ4HC_clearTables(hc4);
|
105
|
-
|
107
|
+
newStartingOffset = 0;
|
106
108
|
}
|
107
|
-
|
108
|
-
hc4->nextToUpdate = (U32)
|
109
|
-
hc4->
|
109
|
+
newStartingOffset += 64 KB;
|
110
|
+
hc4->nextToUpdate = (U32)newStartingOffset;
|
111
|
+
hc4->prefixStart = start;
|
110
112
|
hc4->end = start;
|
111
|
-
hc4->
|
112
|
-
hc4->dictLimit = (U32)
|
113
|
-
hc4->lowLimit = (U32)
|
113
|
+
hc4->dictStart = start;
|
114
|
+
hc4->dictLimit = (U32)newStartingOffset;
|
115
|
+
hc4->lowLimit = (U32)newStartingOffset;
|
114
116
|
}
|
115
117
|
|
116
118
|
|
@@ -119,12 +121,15 @@ LZ4_FORCE_INLINE void LZ4HC_Insert (LZ4HC_CCtx_internal* hc4, const BYTE* ip)
|
|
119
121
|
{
|
120
122
|
U16* const chainTable = hc4->chainTable;
|
121
123
|
U32* const hashTable = hc4->hashTable;
|
122
|
-
const BYTE* const
|
123
|
-
U32 const
|
124
|
+
const BYTE* const prefixPtr = hc4->prefixStart;
|
125
|
+
U32 const prefixIdx = hc4->dictLimit;
|
126
|
+
U32 const target = (U32)(ip - prefixPtr) + prefixIdx;
|
124
127
|
U32 idx = hc4->nextToUpdate;
|
128
|
+
assert(ip >= prefixPtr);
|
129
|
+
assert(target >= prefixIdx);
|
125
130
|
|
126
131
|
while (idx < target) {
|
127
|
-
U32 const h = LZ4HC_hashPtr(
|
132
|
+
U32 const h = LZ4HC_hashPtr(prefixPtr+idx-prefixIdx);
|
128
133
|
size_t delta = idx - hashTable[h];
|
129
134
|
if (delta>LZ4_DISTANCE_MAX) delta = LZ4_DISTANCE_MAX;
|
130
135
|
DELTANEXTU16(chainTable, idx) = (U16)delta;
|
@@ -193,15 +198,14 @@ LZ4HC_countPattern(const BYTE* ip, const BYTE* const iEnd, U32 const pattern32)
|
|
193
198
|
BYTE const byte = (BYTE)(pattern >> bitOffset);
|
194
199
|
if (*ip != byte) break;
|
195
200
|
ip ++; bitOffset -= 8;
|
196
|
-
|
197
|
-
}
|
201
|
+
} }
|
198
202
|
|
199
203
|
return (unsigned)(ip - iStart);
|
200
204
|
}
|
201
205
|
|
202
206
|
/* LZ4HC_reverseCountPattern() :
|
203
207
|
* pattern must be a sample of repetitive pattern of length 1, 2 or 4 (but not 3!)
|
204
|
-
* read using natural platform
|
208
|
+
* read using natural platform endianness */
|
205
209
|
static unsigned
|
206
210
|
LZ4HC_reverseCountPattern(const BYTE* ip, const BYTE* const iLow, U32 pattern)
|
207
211
|
{
|
@@ -211,7 +215,7 @@ LZ4HC_reverseCountPattern(const BYTE* ip, const BYTE* const iLow, U32 pattern)
|
|
211
215
|
if (LZ4_read32(ip-4) != pattern) break;
|
212
216
|
ip -= 4;
|
213
217
|
}
|
214
|
-
{ const BYTE* bytePtr = (const BYTE*)(&pattern) + 3; /* works for any
|
218
|
+
{ const BYTE* bytePtr = (const BYTE*)(&pattern) + 3; /* works for any endianness */
|
215
219
|
while (likely(ip>iLow)) {
|
216
220
|
if (ip[-1] != *bytePtr) break;
|
217
221
|
ip--; bytePtr--;
|
@@ -234,28 +238,28 @@ typedef enum { favorCompressionRatio=0, favorDecompressionSpeed } HCfavor_e;
|
|
234
238
|
|
235
239
|
LZ4_FORCE_INLINE int
|
236
240
|
LZ4HC_InsertAndGetWiderMatch (
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
const dictCtx_directive dict,
|
248
|
-
const HCfavor_e favorDecSpeed)
|
241
|
+
LZ4HC_CCtx_internal* const hc4,
|
242
|
+
const BYTE* const ip,
|
243
|
+
const BYTE* const iLowLimit, const BYTE* const iHighLimit,
|
244
|
+
int longest,
|
245
|
+
const BYTE** matchpos,
|
246
|
+
const BYTE** startpos,
|
247
|
+
const int maxNbAttempts,
|
248
|
+
const int patternAnalysis, const int chainSwap,
|
249
|
+
const dictCtx_directive dict,
|
250
|
+
const HCfavor_e favorDecSpeed)
|
249
251
|
{
|
250
252
|
U16* const chainTable = hc4->chainTable;
|
251
253
|
U32* const HashTable = hc4->hashTable;
|
252
254
|
const LZ4HC_CCtx_internal * const dictCtx = hc4->dictCtx;
|
253
|
-
const BYTE* const
|
254
|
-
const U32
|
255
|
-
const
|
256
|
-
const
|
257
|
-
const U32 lowestMatchIndex = (
|
258
|
-
const BYTE* const
|
255
|
+
const BYTE* const prefixPtr = hc4->prefixStart;
|
256
|
+
const U32 prefixIdx = hc4->dictLimit;
|
257
|
+
const U32 ipIndex = (U32)(ip - prefixPtr) + prefixIdx;
|
258
|
+
const int withinStartDistance = (hc4->lowLimit + (LZ4_DISTANCE_MAX + 1) > ipIndex);
|
259
|
+
const U32 lowestMatchIndex = (withinStartDistance) ? hc4->lowLimit : ipIndex - LZ4_DISTANCE_MAX;
|
260
|
+
const BYTE* const dictStart = hc4->dictStart;
|
261
|
+
const U32 dictIdx = hc4->lowLimit;
|
262
|
+
const BYTE* const dictEnd = dictStart + prefixIdx - dictIdx;
|
259
263
|
int const lookBackLength = (int)(ip-iLowLimit);
|
260
264
|
int nbAttempts = maxNbAttempts;
|
261
265
|
U32 matchChainPos = 0;
|
@@ -277,14 +281,13 @@ LZ4HC_InsertAndGetWiderMatch (
|
|
277
281
|
assert(matchIndex < ipIndex);
|
278
282
|
if (favorDecSpeed && (ipIndex - matchIndex < 8)) {
|
279
283
|
/* do nothing */
|
280
|
-
} else if (matchIndex >=
|
281
|
-
const BYTE* const matchPtr =
|
282
|
-
assert(matchPtr >= lowPrefixPtr);
|
284
|
+
} else if (matchIndex >= prefixIdx) { /* within current Prefix */
|
285
|
+
const BYTE* const matchPtr = prefixPtr + matchIndex - prefixIdx;
|
283
286
|
assert(matchPtr < ip);
|
284
287
|
assert(longest >= 1);
|
285
288
|
if (LZ4_read16(iLowLimit + longest - 1) == LZ4_read16(matchPtr - lookBackLength + longest - 1)) {
|
286
289
|
if (LZ4_read32(matchPtr) == pattern) {
|
287
|
-
int const back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit,
|
290
|
+
int const back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, prefixPtr) : 0;
|
288
291
|
matchLength = MINMATCH + (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, iHighLimit);
|
289
292
|
matchLength -= back;
|
290
293
|
if (matchLength > longest) {
|
@@ -293,24 +296,25 @@ LZ4HC_InsertAndGetWiderMatch (
|
|
293
296
|
*startpos = ip + back;
|
294
297
|
} } }
|
295
298
|
} else { /* lowestMatchIndex <= matchIndex < dictLimit */
|
296
|
-
const BYTE* const matchPtr =
|
297
|
-
|
298
|
-
|
299
|
+
const BYTE* const matchPtr = dictStart + (matchIndex - dictIdx);
|
300
|
+
assert(matchIndex >= dictIdx);
|
301
|
+
if ( likely(matchIndex <= prefixIdx - 4)
|
302
|
+
&& (LZ4_read32(matchPtr) == pattern) ) {
|
299
303
|
int back = 0;
|
300
|
-
const BYTE* vLimit = ip + (
|
304
|
+
const BYTE* vLimit = ip + (prefixIdx - matchIndex);
|
301
305
|
if (vLimit > iHighLimit) vLimit = iHighLimit;
|
302
306
|
matchLength = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH;
|
303
307
|
if ((ip+matchLength == vLimit) && (vLimit < iHighLimit))
|
304
|
-
matchLength += LZ4_count(ip+matchLength,
|
308
|
+
matchLength += LZ4_count(ip+matchLength, prefixPtr, iHighLimit);
|
305
309
|
back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictStart) : 0;
|
306
310
|
matchLength -= back;
|
307
311
|
if (matchLength > longest) {
|
308
312
|
longest = matchLength;
|
309
|
-
*matchpos =
|
313
|
+
*matchpos = prefixPtr - prefixIdx + matchIndex + back; /* virtual pos, relative to ip, to retrieve offset */
|
310
314
|
*startpos = ip + back;
|
311
315
|
} } }
|
312
316
|
|
313
|
-
if (chainSwap && matchLength==longest) {
|
317
|
+
if (chainSwap && matchLength==longest) { /* better match => select a better chain */
|
314
318
|
assert(lookBackLength==0); /* search forward only */
|
315
319
|
if (matchIndex + (U32)longest <= ipIndex) {
|
316
320
|
int const kTrigger = 4;
|
@@ -326,8 +330,7 @@ LZ4HC_InsertAndGetWiderMatch (
|
|
326
330
|
distanceToNextMatch = candidateDist;
|
327
331
|
matchChainPos = (U32)pos;
|
328
332
|
accel = 1 << kTrigger;
|
329
|
-
|
330
|
-
}
|
333
|
+
} }
|
331
334
|
if (distanceToNextMatch > 1) {
|
332
335
|
if (distanceToNextMatch > matchIndex) break; /* avoid overflow */
|
333
336
|
matchIndex -= distanceToNextMatch;
|
@@ -347,23 +350,24 @@ LZ4HC_InsertAndGetWiderMatch (
|
|
347
350
|
repeat = rep_not;
|
348
351
|
} }
|
349
352
|
if ( (repeat == rep_confirmed) && (matchCandidateIdx >= lowestMatchIndex)
|
350
|
-
&& LZ4HC_protectDictEnd(
|
351
|
-
const int extDict = matchCandidateIdx <
|
352
|
-
const BYTE* const matchPtr = (extDict ?
|
353
|
+
&& LZ4HC_protectDictEnd(prefixIdx, matchCandidateIdx) ) {
|
354
|
+
const int extDict = matchCandidateIdx < prefixIdx;
|
355
|
+
const BYTE* const matchPtr = (extDict ? dictStart - dictIdx : prefixPtr - prefixIdx) + matchCandidateIdx;
|
353
356
|
if (LZ4_read32(matchPtr) == pattern) { /* good candidate */
|
354
|
-
const BYTE* const
|
355
|
-
const BYTE* const iLimit = extDict ? dictBase + dictLimit : iHighLimit;
|
357
|
+
const BYTE* const iLimit = extDict ? dictEnd : iHighLimit;
|
356
358
|
size_t forwardPatternLength = LZ4HC_countPattern(matchPtr+sizeof(pattern), iLimit, pattern) + sizeof(pattern);
|
357
359
|
if (extDict && matchPtr + forwardPatternLength == iLimit) {
|
358
360
|
U32 const rotatedPattern = LZ4HC_rotatePattern(forwardPatternLength, pattern);
|
359
|
-
forwardPatternLength += LZ4HC_countPattern(
|
361
|
+
forwardPatternLength += LZ4HC_countPattern(prefixPtr, iHighLimit, rotatedPattern);
|
360
362
|
}
|
361
|
-
{ const BYTE* const lowestMatchPtr = extDict ? dictStart :
|
363
|
+
{ const BYTE* const lowestMatchPtr = extDict ? dictStart : prefixPtr;
|
362
364
|
size_t backLength = LZ4HC_reverseCountPattern(matchPtr, lowestMatchPtr, pattern);
|
363
365
|
size_t currentSegmentLength;
|
364
|
-
if (!extDict
|
366
|
+
if (!extDict
|
367
|
+
&& matchPtr - backLength == prefixPtr
|
368
|
+
&& dictIdx < prefixIdx) {
|
365
369
|
U32 const rotatedPattern = LZ4HC_rotatePattern((U32)(-(int)backLength), pattern);
|
366
|
-
backLength += LZ4HC_reverseCountPattern(
|
370
|
+
backLength += LZ4HC_reverseCountPattern(dictEnd, dictStart, rotatedPattern);
|
367
371
|
}
|
368
372
|
/* Limit backLength not go further than lowestMatchIndex */
|
369
373
|
backLength = matchCandidateIdx - MAX(matchCandidateIdx - (U32)backLength, lowestMatchIndex);
|
@@ -373,28 +377,28 @@ LZ4HC_InsertAndGetWiderMatch (
|
|
373
377
|
if ( (currentSegmentLength >= srcPatternLength) /* current pattern segment large enough to contain full srcPatternLength */
|
374
378
|
&& (forwardPatternLength <= srcPatternLength) ) { /* haven't reached this position yet */
|
375
379
|
U32 const newMatchIndex = matchCandidateIdx + (U32)forwardPatternLength - (U32)srcPatternLength; /* best position, full pattern, might be followed by more match */
|
376
|
-
if (LZ4HC_protectDictEnd(
|
380
|
+
if (LZ4HC_protectDictEnd(prefixIdx, newMatchIndex))
|
377
381
|
matchIndex = newMatchIndex;
|
378
382
|
else {
|
379
383
|
/* Can only happen if started in the prefix */
|
380
|
-
assert(newMatchIndex >=
|
381
|
-
matchIndex =
|
384
|
+
assert(newMatchIndex >= prefixIdx - 3 && newMatchIndex < prefixIdx && !extDict);
|
385
|
+
matchIndex = prefixIdx;
|
382
386
|
}
|
383
387
|
} else {
|
384
388
|
U32 const newMatchIndex = matchCandidateIdx - (U32)backLength; /* farthest position in current segment, will find a match of length currentSegmentLength + maybe some back */
|
385
|
-
if (!LZ4HC_protectDictEnd(
|
386
|
-
assert(newMatchIndex >=
|
387
|
-
matchIndex =
|
389
|
+
if (!LZ4HC_protectDictEnd(prefixIdx, newMatchIndex)) {
|
390
|
+
assert(newMatchIndex >= prefixIdx - 3 && newMatchIndex < prefixIdx && !extDict);
|
391
|
+
matchIndex = prefixIdx;
|
388
392
|
} else {
|
389
393
|
matchIndex = newMatchIndex;
|
390
394
|
if (lookBackLength==0) { /* no back possible */
|
391
395
|
size_t const maxML = MIN(currentSegmentLength, srcPatternLength);
|
392
396
|
if ((size_t)longest < maxML) {
|
393
|
-
assert(
|
394
|
-
if ((size_t)(ip -
|
397
|
+
assert(prefixPtr - prefixIdx + matchIndex != ip);
|
398
|
+
if ((size_t)(ip - prefixPtr) + prefixIdx - matchIndex > LZ4_DISTANCE_MAX) break;
|
395
399
|
assert(maxML < 2 GB);
|
396
400
|
longest = (int)maxML;
|
397
|
-
*matchpos =
|
401
|
+
*matchpos = prefixPtr - prefixIdx + matchIndex; /* virtual pos, relative to ip, to retrieve offset */
|
398
402
|
*startpos = ip;
|
399
403
|
}
|
400
404
|
{ U32 const distToNextPattern = DELTANEXTU16(chainTable, matchIndex);
|
@@ -413,12 +417,12 @@ LZ4HC_InsertAndGetWiderMatch (
|
|
413
417
|
if ( dict == usingDictCtxHc
|
414
418
|
&& nbAttempts > 0
|
415
419
|
&& ipIndex - lowestMatchIndex < LZ4_DISTANCE_MAX) {
|
416
|
-
size_t const dictEndOffset = (size_t)(dictCtx->end - dictCtx->
|
420
|
+
size_t const dictEndOffset = (size_t)(dictCtx->end - dictCtx->prefixStart) + dictCtx->dictLimit;
|
417
421
|
U32 dictMatchIndex = dictCtx->hashTable[LZ4HC_hashPtr(ip)];
|
418
422
|
assert(dictEndOffset <= 1 GB);
|
419
423
|
matchIndex = dictMatchIndex + lowestMatchIndex - (U32)dictEndOffset;
|
420
424
|
while (ipIndex - matchIndex <= LZ4_DISTANCE_MAX && nbAttempts--) {
|
421
|
-
const BYTE* const matchPtr = dictCtx->
|
425
|
+
const BYTE* const matchPtr = dictCtx->prefixStart - dictCtx->dictLimit + dictMatchIndex;
|
422
426
|
|
423
427
|
if (LZ4_read32(matchPtr) == pattern) {
|
424
428
|
int mlt;
|
@@ -426,11 +430,11 @@ LZ4HC_InsertAndGetWiderMatch (
|
|
426
430
|
const BYTE* vLimit = ip + (dictEndOffset - dictMatchIndex);
|
427
431
|
if (vLimit > iHighLimit) vLimit = iHighLimit;
|
428
432
|
mlt = (int)LZ4_count(ip+MINMATCH, matchPtr+MINMATCH, vLimit) + MINMATCH;
|
429
|
-
back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictCtx->
|
433
|
+
back = lookBackLength ? LZ4HC_countBack(ip, matchPtr, iLowLimit, dictCtx->prefixStart) : 0;
|
430
434
|
mlt -= back;
|
431
435
|
if (mlt > longest) {
|
432
436
|
longest = mlt;
|
433
|
-
*matchpos =
|
437
|
+
*matchpos = prefixPtr - prefixIdx + matchIndex + back;
|
434
438
|
*startpos = ip + back;
|
435
439
|
} }
|
436
440
|
|
@@ -442,13 +446,13 @@ LZ4HC_InsertAndGetWiderMatch (
|
|
442
446
|
return longest;
|
443
447
|
}
|
444
448
|
|
445
|
-
LZ4_FORCE_INLINE
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
449
|
+
LZ4_FORCE_INLINE int
|
450
|
+
LZ4HC_InsertAndFindBestMatch(LZ4HC_CCtx_internal* const hc4, /* Index table will be updated */
|
451
|
+
const BYTE* const ip, const BYTE* const iLimit,
|
452
|
+
const BYTE** matchpos,
|
453
|
+
const int maxNbAttempts,
|
454
|
+
const int patternAnalysis,
|
455
|
+
const dictCtx_directive dict)
|
452
456
|
{
|
453
457
|
const BYTE* uselessPtr = ip;
|
454
458
|
/* note : LZ4HC_InsertAndGetWiderMatch() is able to modify the starting position of a match (*startpos),
|
@@ -751,7 +755,7 @@ _last_literals:
|
|
751
755
|
} else {
|
752
756
|
*op++ = (BYTE)(lastRunSize << ML_BITS);
|
753
757
|
}
|
754
|
-
|
758
|
+
LZ4_memcpy(op, anchor, lastRunSize);
|
755
759
|
op += lastRunSize;
|
756
760
|
}
|
757
761
|
|
@@ -884,13 +888,13 @@ LZ4HC_compress_generic_dictCtx (
|
|
884
888
|
limitedOutput_directive limit
|
885
889
|
)
|
886
890
|
{
|
887
|
-
const size_t position = (size_t)(ctx->end - ctx->
|
891
|
+
const size_t position = (size_t)(ctx->end - ctx->prefixStart) + (ctx->dictLimit - ctx->lowLimit);
|
888
892
|
assert(ctx->dictCtx != NULL);
|
889
893
|
if (position >= 64 KB) {
|
890
894
|
ctx->dictCtx = NULL;
|
891
895
|
return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit);
|
892
896
|
} else if (position == 0 && *srcSizePtr > 4 KB) {
|
893
|
-
|
897
|
+
LZ4_memcpy(ctx, ctx->dictCtx, sizeof(LZ4HC_CCtx_internal));
|
894
898
|
LZ4HC_setExternalDict(ctx, (const BYTE *)src);
|
895
899
|
ctx->compressionLevel = (short)cLevel;
|
896
900
|
return LZ4HC_compress_generic_noDictCtx(ctx, src, dst, srcSizePtr, dstCapacity, cLevel, limit);
|
@@ -953,13 +957,15 @@ int LZ4_compress_HC_extStateHC (void* state, const char* src, char* dst, int src
|
|
953
957
|
|
954
958
|
int LZ4_compress_HC(const char* src, char* dst, int srcSize, int dstCapacity, int compressionLevel)
|
955
959
|
{
|
960
|
+
int cSize;
|
956
961
|
#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1
|
957
962
|
LZ4_streamHC_t* const statePtr = (LZ4_streamHC_t*)ALLOC(sizeof(LZ4_streamHC_t));
|
963
|
+
if (statePtr==NULL) return 0;
|
958
964
|
#else
|
959
965
|
LZ4_streamHC_t state;
|
960
966
|
LZ4_streamHC_t* const statePtr = &state;
|
961
967
|
#endif
|
962
|
-
|
968
|
+
cSize = LZ4_compress_HC_extStateHC(statePtr, src, dst, srcSize, dstCapacity, compressionLevel);
|
963
969
|
#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1
|
964
970
|
FREEMEM(statePtr);
|
965
971
|
#endif
|
@@ -982,6 +988,7 @@ int LZ4_compress_HC_destSize(void* state, const char* source, char* dest, int* s
|
|
982
988
|
* Streaming Functions
|
983
989
|
**************************************/
|
984
990
|
/* allocation */
|
991
|
+
#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
|
985
992
|
LZ4_streamHC_t* LZ4_createStreamHC(void)
|
986
993
|
{
|
987
994
|
LZ4_streamHC_t* const state =
|
@@ -998,13 +1005,12 @@ int LZ4_freeStreamHC (LZ4_streamHC_t* LZ4_streamHCPtr)
|
|
998
1005
|
FREEMEM(LZ4_streamHCPtr);
|
999
1006
|
return 0;
|
1000
1007
|
}
|
1008
|
+
#endif
|
1001
1009
|
|
1002
1010
|
|
1003
1011
|
LZ4_streamHC_t* LZ4_initStreamHC (void* buffer, size_t size)
|
1004
1012
|
{
|
1005
1013
|
LZ4_streamHC_t* const LZ4_streamHCPtr = (LZ4_streamHC_t*)buffer;
|
1006
|
-
/* if compilation fails here, LZ4_STREAMHCSIZE must be increased */
|
1007
|
-
LZ4_STATIC_ASSERT(sizeof(LZ4HC_CCtx_internal) <= LZ4_STREAMHCSIZE);
|
1008
1014
|
DEBUGLOG(4, "LZ4_initStreamHC(%p, %u)", buffer, (unsigned)size);
|
1009
1015
|
/* check conditions */
|
1010
1016
|
if (buffer == NULL) return NULL;
|
@@ -1030,9 +1036,13 @@ void LZ4_resetStreamHC_fast (LZ4_streamHC_t* LZ4_streamHCPtr, int compressionLev
|
|
1030
1036
|
if (LZ4_streamHCPtr->internal_donotuse.dirty) {
|
1031
1037
|
LZ4_initStreamHC(LZ4_streamHCPtr, sizeof(*LZ4_streamHCPtr));
|
1032
1038
|
} else {
|
1033
|
-
/* preserve end -
|
1034
|
-
LZ4_streamHCPtr->internal_donotuse.end
|
1035
|
-
|
1039
|
+
/* preserve end - prefixStart : can trigger clearTable's threshold */
|
1040
|
+
if (LZ4_streamHCPtr->internal_donotuse.end != NULL) {
|
1041
|
+
LZ4_streamHCPtr->internal_donotuse.end -= (uptrval)LZ4_streamHCPtr->internal_donotuse.prefixStart;
|
1042
|
+
} else {
|
1043
|
+
assert(LZ4_streamHCPtr->internal_donotuse.prefixStart == NULL);
|
1044
|
+
}
|
1045
|
+
LZ4_streamHCPtr->internal_donotuse.prefixStart = NULL;
|
1036
1046
|
LZ4_streamHCPtr->internal_donotuse.dictCtx = NULL;
|
1037
1047
|
}
|
1038
1048
|
LZ4_setCompressionLevel(LZ4_streamHCPtr, compressionLevel);
|
@@ -1083,14 +1093,14 @@ void LZ4_attach_HC_dictionary(LZ4_streamHC_t *working_stream, const LZ4_streamHC
|
|
1083
1093
|
static void LZ4HC_setExternalDict(LZ4HC_CCtx_internal* ctxPtr, const BYTE* newBlock)
|
1084
1094
|
{
|
1085
1095
|
DEBUGLOG(4, "LZ4HC_setExternalDict(%p, %p)", ctxPtr, newBlock);
|
1086
|
-
if (ctxPtr->end >= ctxPtr->
|
1096
|
+
if (ctxPtr->end >= ctxPtr->prefixStart + 4)
|
1087
1097
|
LZ4HC_Insert (ctxPtr, ctxPtr->end-3); /* Referencing remaining dictionary content */
|
1088
1098
|
|
1089
1099
|
/* Only one memory segment for extDict, so any previous extDict is lost at this stage */
|
1090
1100
|
ctxPtr->lowLimit = ctxPtr->dictLimit;
|
1091
|
-
ctxPtr->
|
1092
|
-
ctxPtr->
|
1093
|
-
ctxPtr->
|
1101
|
+
ctxPtr->dictStart = ctxPtr->prefixStart;
|
1102
|
+
ctxPtr->dictLimit += (U32)(ctxPtr->end - ctxPtr->prefixStart);
|
1103
|
+
ctxPtr->prefixStart = newBlock;
|
1094
1104
|
ctxPtr->end = newBlock;
|
1095
1105
|
ctxPtr->nextToUpdate = ctxPtr->dictLimit; /* match referencing will resume from there */
|
1096
1106
|
|
@@ -1109,11 +1119,11 @@ LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr,
|
|
1109
1119
|
LZ4_streamHCPtr, src, *srcSizePtr, limit);
|
1110
1120
|
assert(ctxPtr != NULL);
|
1111
1121
|
/* auto-init if forgotten */
|
1112
|
-
if (ctxPtr->
|
1122
|
+
if (ctxPtr->prefixStart == NULL) LZ4HC_init_internal (ctxPtr, (const BYTE*) src);
|
1113
1123
|
|
1114
1124
|
/* Check overflow */
|
1115
|
-
if ((size_t)(ctxPtr->end - ctxPtr->
|
1116
|
-
size_t dictSize = (size_t)(ctxPtr->end - ctxPtr->
|
1125
|
+
if ((size_t)(ctxPtr->end - ctxPtr->prefixStart) + ctxPtr->dictLimit > 2 GB) {
|
1126
|
+
size_t dictSize = (size_t)(ctxPtr->end - ctxPtr->prefixStart);
|
1117
1127
|
if (dictSize > 64 KB) dictSize = 64 KB;
|
1118
1128
|
LZ4_loadDictHC(LZ4_streamHCPtr, (const char*)(ctxPtr->end) - dictSize, (int)dictSize);
|
1119
1129
|
}
|
@@ -1124,13 +1134,16 @@ LZ4_compressHC_continue_generic (LZ4_streamHC_t* LZ4_streamHCPtr,
|
|
1124
1134
|
|
1125
1135
|
/* Check overlapping input/dictionary space */
|
1126
1136
|
{ const BYTE* sourceEnd = (const BYTE*) src + *srcSizePtr;
|
1127
|
-
const BYTE* const dictBegin = ctxPtr->
|
1128
|
-
const BYTE* const dictEnd = ctxPtr->
|
1137
|
+
const BYTE* const dictBegin = ctxPtr->dictStart;
|
1138
|
+
const BYTE* const dictEnd = ctxPtr->dictStart + (ctxPtr->dictLimit - ctxPtr->lowLimit);
|
1129
1139
|
if ((sourceEnd > dictBegin) && ((const BYTE*)src < dictEnd)) {
|
1130
1140
|
if (sourceEnd > dictEnd) sourceEnd = dictEnd;
|
1131
|
-
ctxPtr->lowLimit
|
1132
|
-
|
1133
|
-
|
1141
|
+
ctxPtr->lowLimit += (U32)(sourceEnd - ctxPtr->dictStart);
|
1142
|
+
ctxPtr->dictStart += (U32)(sourceEnd - ctxPtr->dictStart);
|
1143
|
+
if (ctxPtr->dictLimit - ctxPtr->lowLimit < 4) {
|
1144
|
+
ctxPtr->lowLimit = ctxPtr->dictLimit;
|
1145
|
+
ctxPtr->dictStart = ctxPtr->prefixStart;
|
1146
|
+
} } }
|
1134
1147
|
|
1135
1148
|
return LZ4HC_compress_generic (ctxPtr, src, dst, srcSizePtr, dstCapacity, ctxPtr->compressionLevel, limit);
|
1136
1149
|
}
|
@@ -1158,7 +1171,7 @@ int LZ4_compress_HC_continue_destSize (LZ4_streamHC_t* LZ4_streamHCPtr, const ch
|
|
1158
1171
|
int LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictSize)
|
1159
1172
|
{
|
1160
1173
|
LZ4HC_CCtx_internal* const streamPtr = &LZ4_streamHCPtr->internal_donotuse;
|
1161
|
-
int const prefixSize = (int)(streamPtr->end -
|
1174
|
+
int const prefixSize = (int)(streamPtr->end - streamPtr->prefixStart);
|
1162
1175
|
DEBUGLOG(5, "LZ4_saveDictHC(%p, %p, %d)", LZ4_streamHCPtr, safeBuffer, dictSize);
|
1163
1176
|
assert(prefixSize >= 0);
|
1164
1177
|
if (dictSize > 64 KB) dictSize = 64 KB;
|
@@ -1166,12 +1179,13 @@ int LZ4_saveDictHC (LZ4_streamHC_t* LZ4_streamHCPtr, char* safeBuffer, int dictS
|
|
1166
1179
|
if (dictSize > prefixSize) dictSize = prefixSize;
|
1167
1180
|
if (safeBuffer == NULL) assert(dictSize == 0);
|
1168
1181
|
if (dictSize > 0)
|
1169
|
-
|
1170
|
-
{ U32 const endIndex = (U32)(streamPtr->end - streamPtr->
|
1182
|
+
LZ4_memmove(safeBuffer, streamPtr->end - dictSize, dictSize);
|
1183
|
+
{ U32 const endIndex = (U32)(streamPtr->end - streamPtr->prefixStart) + streamPtr->dictLimit;
|
1171
1184
|
streamPtr->end = (const BYTE*)safeBuffer + dictSize;
|
1172
|
-
streamPtr->
|
1185
|
+
streamPtr->prefixStart = streamPtr->end - dictSize;
|
1173
1186
|
streamPtr->dictLimit = endIndex - (U32)dictSize;
|
1174
1187
|
streamPtr->lowLimit = endIndex - (U32)dictSize;
|
1188
|
+
streamPtr->dictStart = streamPtr->prefixStart;
|
1175
1189
|
if (streamPtr->nextToUpdate < streamPtr->dictLimit)
|
1176
1190
|
streamPtr->nextToUpdate = streamPtr->dictLimit;
|
1177
1191
|
}
|
@@ -1199,7 +1213,7 @@ int LZ4_compressHC_limitedOutput_continue (LZ4_streamHC_t* ctx, const char* src,
|
|
1199
1213
|
|
1200
1214
|
|
1201
1215
|
/* Deprecated streaming functions */
|
1202
|
-
int LZ4_sizeofStreamStateHC(void) { return
|
1216
|
+
int LZ4_sizeofStreamStateHC(void) { return sizeof(LZ4_streamHC_t); }
|
1203
1217
|
|
1204
1218
|
/* state is presumed correctly sized, aka >= sizeof(LZ4_streamHC_t)
|
1205
1219
|
* @return : 0 on success, !=0 if error */
|
@@ -1211,6 +1225,7 @@ int LZ4_resetStreamStateHC(void* state, char* inputBuffer)
|
|
1211
1225
|
return 0;
|
1212
1226
|
}
|
1213
1227
|
|
1228
|
+
#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
|
1214
1229
|
void* LZ4_createHC (const char* inputBuffer)
|
1215
1230
|
{
|
1216
1231
|
LZ4_streamHC_t* const hc4 = LZ4_createStreamHC();
|
@@ -1225,6 +1240,7 @@ int LZ4_freeHC (void* LZ4HC_Data)
|
|
1225
1240
|
FREEMEM(LZ4HC_Data);
|
1226
1241
|
return 0;
|
1227
1242
|
}
|
1243
|
+
#endif
|
1228
1244
|
|
1229
1245
|
int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* src, char* dst, int srcSize, int cLevel)
|
1230
1246
|
{
|
@@ -1238,11 +1254,11 @@ int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* src, c
|
|
1238
1254
|
|
1239
1255
|
char* LZ4_slideInputBufferHC(void* LZ4HC_Data)
|
1240
1256
|
{
|
1241
|
-
LZ4_streamHC_t
|
1242
|
-
const BYTE
|
1257
|
+
LZ4_streamHC_t* const ctx = (LZ4_streamHC_t*)LZ4HC_Data;
|
1258
|
+
const BYTE* bufferStart = ctx->internal_donotuse.prefixStart - ctx->internal_donotuse.dictLimit + ctx->internal_donotuse.lowLimit;
|
1243
1259
|
LZ4_resetStreamHC_fast(ctx, ctx->internal_donotuse.compressionLevel);
|
1244
1260
|
/* avoid const char * -> char * conversion warning :( */
|
1245
|
-
return (char
|
1261
|
+
return (char*)(uptrval)bufferStart;
|
1246
1262
|
}
|
1247
1263
|
|
1248
1264
|
|
@@ -1325,7 +1341,7 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
|
|
1325
1341
|
{
|
1326
1342
|
int retval = 0;
|
1327
1343
|
#define TRAILING_LITERALS 3
|
1328
|
-
#
|
1344
|
+
#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1
|
1329
1345
|
LZ4HC_optimal_t* const opt = (LZ4HC_optimal_t*)ALLOC(sizeof(LZ4HC_optimal_t) * (LZ4_OPT_NUM + TRAILING_LITERALS));
|
1330
1346
|
#else
|
1331
1347
|
LZ4HC_optimal_t opt[LZ4_OPT_NUM + TRAILING_LITERALS]; /* ~64 KB, which is a bit large for stack... */
|
@@ -1343,7 +1359,7 @@ static int LZ4HC_compress_optimal ( LZ4HC_CCtx_internal* ctx,
|
|
1343
1359
|
const BYTE* ovref = NULL;
|
1344
1360
|
|
1345
1361
|
/* init */
|
1346
|
-
#
|
1362
|
+
#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1
|
1347
1363
|
if (opt == NULL) goto _return_label;
|
1348
1364
|
#endif
|
1349
1365
|
DEBUGLOG(5, "LZ4HC_compress_optimal(dst=%p, dstCapa=%u)", dst, (unsigned)dstCapacity);
|
@@ -1575,7 +1591,7 @@ _last_literals:
|
|
1575
1591
|
} else {
|
1576
1592
|
*op++ = (BYTE)(lastRunSize << ML_BITS);
|
1577
1593
|
}
|
1578
|
-
|
1594
|
+
LZ4_memcpy(op, anchor, lastRunSize);
|
1579
1595
|
op += lastRunSize;
|
1580
1596
|
}
|
1581
1597
|
|
@@ -1608,7 +1624,7 @@ if (limit == fillOutput) {
|
|
1608
1624
|
goto _last_literals;
|
1609
1625
|
}
|
1610
1626
|
_return_label:
|
1611
|
-
#
|
1627
|
+
#if defined(LZ4HC_HEAPMODE) && LZ4HC_HEAPMODE==1
|
1612
1628
|
FREEMEM(opt);
|
1613
1629
|
#endif
|
1614
1630
|
return retval;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
/*
|
2
2
|
LZ4 HC - High Compression Mode of LZ4
|
3
3
|
Header File
|
4
|
-
Copyright (C) 2011-
|
4
|
+
Copyright (C) 2011-2020, Yann Collet.
|
5
5
|
BSD 2-Clause License (http://www.opensource.org/licenses/bsd-license.php)
|
6
6
|
|
7
7
|
Redistribution and use in source and binary forms, with or without
|
@@ -198,14 +198,17 @@ LZ4LIB_API int LZ4_saveDictHC (LZ4_streamHC_t* streamHCPtr, char* safeBuffer, in
|
|
198
198
|
#define LZ4HC_HASH_MASK (LZ4HC_HASHTABLESIZE - 1)
|
199
199
|
|
200
200
|
|
201
|
+
/* Never ever use these definitions directly !
|
202
|
+
* Declare or allocate an LZ4_streamHC_t instead.
|
203
|
+
**/
|
201
204
|
typedef struct LZ4HC_CCtx_internal LZ4HC_CCtx_internal;
|
202
205
|
struct LZ4HC_CCtx_internal
|
203
206
|
{
|
204
207
|
LZ4_u32 hashTable[LZ4HC_HASHTABLESIZE];
|
205
208
|
LZ4_u16 chainTable[LZ4HC_MAXD];
|
206
209
|
const LZ4_byte* end; /* next block here to continue on current prefix */
|
207
|
-
const LZ4_byte*
|
208
|
-
const LZ4_byte*
|
210
|
+
const LZ4_byte* prefixStart; /* Indexes relative to this position */
|
211
|
+
const LZ4_byte* dictStart; /* alternate reference for extDict */
|
209
212
|
LZ4_u32 dictLimit; /* below that point, need extDict */
|
210
213
|
LZ4_u32 lowLimit; /* below that point, no more dict */
|
211
214
|
LZ4_u32 nextToUpdate; /* index from which to continue dictionary update */
|
@@ -216,20 +219,15 @@ struct LZ4HC_CCtx_internal
|
|
216
219
|
const LZ4HC_CCtx_internal* dictCtx;
|
217
220
|
};
|
218
221
|
|
219
|
-
|
220
|
-
/* Do not use these definitions directly !
|
221
|
-
* Declare or allocate an LZ4_streamHC_t instead.
|
222
|
-
*/
|
223
|
-
#define LZ4_STREAMHCSIZE 262200 /* static size, for inter-version compatibility */
|
224
|
-
#define LZ4_STREAMHCSIZE_VOIDP (LZ4_STREAMHCSIZE / sizeof(void*))
|
222
|
+
#define LZ4_STREAMHC_MINSIZE 262200 /* static size, for inter-version compatibility */
|
225
223
|
union LZ4_streamHC_u {
|
226
|
-
|
224
|
+
char minStateSize[LZ4_STREAMHC_MINSIZE];
|
227
225
|
LZ4HC_CCtx_internal internal_donotuse;
|
228
226
|
}; /* previously typedef'd to LZ4_streamHC_t */
|
229
227
|
|
230
228
|
/* LZ4_streamHC_t :
|
231
229
|
* This structure allows static allocation of LZ4 HC streaming state.
|
232
|
-
* This can be used to allocate statically
|
230
|
+
* This can be used to allocate statically on stack, or as part of a larger structure.
|
233
231
|
*
|
234
232
|
* Such state **must** be initialized using LZ4_initStreamHC() before first use.
|
235
233
|
*
|
@@ -244,7 +242,7 @@ union LZ4_streamHC_u {
|
|
244
242
|
* Required before first use of a statically allocated LZ4_streamHC_t.
|
245
243
|
* Before v1.9.0 : use LZ4_resetStreamHC() instead
|
246
244
|
*/
|
247
|
-
LZ4LIB_API LZ4_streamHC_t* LZ4_initStreamHC
|
245
|
+
LZ4LIB_API LZ4_streamHC_t* LZ4_initStreamHC(void* buffer, size_t size);
|
248
246
|
|
249
247
|
|
250
248
|
/*-************************************
|
@@ -272,9 +270,11 @@ LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_comp
|
|
272
270
|
* LZ4_slideInputBufferHC() will truncate the history of the stream, rather
|
273
271
|
* than preserve a window-sized chunk of history.
|
274
272
|
*/
|
273
|
+
#if !defined(LZ4_STATIC_LINKING_ONLY_DISABLE_MEMORY_ALLOCATION)
|
275
274
|
LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API void* LZ4_createHC (const char* inputBuffer);
|
276
|
-
LZ4_DEPRECATED("use LZ4_saveDictHC() instead") LZ4LIB_API char* LZ4_slideInputBufferHC (void* LZ4HC_Data);
|
277
275
|
LZ4_DEPRECATED("use LZ4_freeStreamHC() instead") LZ4LIB_API int LZ4_freeHC (void* LZ4HC_Data);
|
276
|
+
#endif
|
277
|
+
LZ4_DEPRECATED("use LZ4_saveDictHC() instead") LZ4LIB_API char* LZ4_slideInputBufferHC (void* LZ4HC_Data);
|
278
278
|
LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int compressionLevel);
|
279
279
|
LZ4_DEPRECATED("use LZ4_compress_HC_continue() instead") LZ4LIB_API int LZ4_compressHC2_limitedOutput_continue (void* LZ4HC_Data, const char* source, char* dest, int inputSize, int maxOutputSize, int compressionLevel);
|
280
280
|
LZ4_DEPRECATED("use LZ4_createStreamHC() instead") LZ4LIB_API int LZ4_sizeofStreamStateHC(void);
|
@@ -305,7 +305,7 @@ LZ4LIB_API void LZ4_resetStreamHC (LZ4_streamHC_t* streamHCPtr, int compressionL
|
|
305
305
|
* They should not be linked from DLL,
|
306
306
|
* as there is no guarantee of API stability yet.
|
307
307
|
* Prototypes will be promoted to "stable" status
|
308
|
-
* after
|
308
|
+
* after successful usage in real-life scenarios.
|
309
309
|
***************************************************/
|
310
310
|
#ifdef LZ4_HC_STATIC_LINKING_ONLY /* protection macro */
|
311
311
|
#ifndef LZ4_HC_SLO_098092834
|
@@ -315,7 +315,7 @@ struct XXH64_state_s {
|
|
315
315
|
|
316
316
|
|
317
317
|
#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)
|
318
|
-
# include "
|
318
|
+
# include "lz4xxhash.c" /* include xxhash function bodies as `static`, for inlining */
|
319
319
|
#endif
|
320
320
|
|
321
321
|
#endif /* XXH_STATIC_LINKING_ONLY */
|