chd 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +30 -0
  3. data/chd.gemspec +29 -0
  4. data/ext/chd.c +1008 -0
  5. data/ext/extconf.rb +60 -0
  6. data/lib/chd/cd.rb +272 -0
  7. data/lib/chd/metadata.rb +196 -0
  8. data/lib/chd/version.rb +4 -0
  9. data/lib/chd.rb +21 -0
  10. data/libchdr/CMakeLists.txt +104 -0
  11. data/libchdr/LICENSE.txt +24 -0
  12. data/libchdr/README.md +7 -0
  13. data/libchdr/deps/lzma-19.00/CMakeLists.txt +33 -0
  14. data/libchdr/deps/lzma-19.00/LICENSE +3 -0
  15. data/libchdr/deps/lzma-19.00/include/7zTypes.h +375 -0
  16. data/libchdr/deps/lzma-19.00/include/Alloc.h +51 -0
  17. data/libchdr/deps/lzma-19.00/include/Bra.h +64 -0
  18. data/libchdr/deps/lzma-19.00/include/Compiler.h +33 -0
  19. data/libchdr/deps/lzma-19.00/include/CpuArch.h +336 -0
  20. data/libchdr/deps/lzma-19.00/include/Delta.h +19 -0
  21. data/libchdr/deps/lzma-19.00/include/LzFind.h +121 -0
  22. data/libchdr/deps/lzma-19.00/include/LzHash.h +57 -0
  23. data/libchdr/deps/lzma-19.00/include/Lzma86.h +111 -0
  24. data/libchdr/deps/lzma-19.00/include/LzmaDec.h +234 -0
  25. data/libchdr/deps/lzma-19.00/include/LzmaEnc.h +76 -0
  26. data/libchdr/deps/lzma-19.00/include/LzmaLib.h +131 -0
  27. data/libchdr/deps/lzma-19.00/include/Precomp.h +10 -0
  28. data/libchdr/deps/lzma-19.00/include/Sort.h +18 -0
  29. data/libchdr/deps/lzma-19.00/lzma-history.txt +446 -0
  30. data/libchdr/deps/lzma-19.00/lzma.txt +328 -0
  31. data/libchdr/deps/lzma-19.00/lzma.vcxproj +543 -0
  32. data/libchdr/deps/lzma-19.00/lzma.vcxproj.filters +17 -0
  33. data/libchdr/deps/lzma-19.00/src/Alloc.c +455 -0
  34. data/libchdr/deps/lzma-19.00/src/Bra86.c +82 -0
  35. data/libchdr/deps/lzma-19.00/src/BraIA64.c +53 -0
  36. data/libchdr/deps/lzma-19.00/src/CpuArch.c +218 -0
  37. data/libchdr/deps/lzma-19.00/src/Delta.c +64 -0
  38. data/libchdr/deps/lzma-19.00/src/LzFind.c +1127 -0
  39. data/libchdr/deps/lzma-19.00/src/Lzma86Dec.c +54 -0
  40. data/libchdr/deps/lzma-19.00/src/LzmaDec.c +1185 -0
  41. data/libchdr/deps/lzma-19.00/src/LzmaEnc.c +1330 -0
  42. data/libchdr/deps/lzma-19.00/src/Sort.c +141 -0
  43. data/libchdr/deps/zlib-1.2.11/CMakeLists.txt +29 -0
  44. data/libchdr/deps/zlib-1.2.11/ChangeLog +1515 -0
  45. data/libchdr/deps/zlib-1.2.11/FAQ +368 -0
  46. data/libchdr/deps/zlib-1.2.11/INDEX +68 -0
  47. data/libchdr/deps/zlib-1.2.11/Makefile +5 -0
  48. data/libchdr/deps/zlib-1.2.11/Makefile.in +410 -0
  49. data/libchdr/deps/zlib-1.2.11/README +115 -0
  50. data/libchdr/deps/zlib-1.2.11/adler32.c +186 -0
  51. data/libchdr/deps/zlib-1.2.11/compress.c +86 -0
  52. data/libchdr/deps/zlib-1.2.11/configure +921 -0
  53. data/libchdr/deps/zlib-1.2.11/crc32.c +442 -0
  54. data/libchdr/deps/zlib-1.2.11/crc32.h +441 -0
  55. data/libchdr/deps/zlib-1.2.11/deflate.c +2163 -0
  56. data/libchdr/deps/zlib-1.2.11/deflate.h +349 -0
  57. data/libchdr/deps/zlib-1.2.11/doc/algorithm.txt +209 -0
  58. data/libchdr/deps/zlib-1.2.11/doc/rfc1950.txt +619 -0
  59. data/libchdr/deps/zlib-1.2.11/doc/rfc1951.txt +955 -0
  60. data/libchdr/deps/zlib-1.2.11/doc/rfc1952.txt +675 -0
  61. data/libchdr/deps/zlib-1.2.11/doc/txtvsbin.txt +107 -0
  62. data/libchdr/deps/zlib-1.2.11/gzclose.c +25 -0
  63. data/libchdr/deps/zlib-1.2.11/gzguts.h +218 -0
  64. data/libchdr/deps/zlib-1.2.11/gzlib.c +637 -0
  65. data/libchdr/deps/zlib-1.2.11/gzread.c +654 -0
  66. data/libchdr/deps/zlib-1.2.11/gzwrite.c +665 -0
  67. data/libchdr/deps/zlib-1.2.11/infback.c +640 -0
  68. data/libchdr/deps/zlib-1.2.11/inffast.c +323 -0
  69. data/libchdr/deps/zlib-1.2.11/inffast.h +11 -0
  70. data/libchdr/deps/zlib-1.2.11/inffixed.h +94 -0
  71. data/libchdr/deps/zlib-1.2.11/inflate.c +1561 -0
  72. data/libchdr/deps/zlib-1.2.11/inflate.h +125 -0
  73. data/libchdr/deps/zlib-1.2.11/inftrees.c +304 -0
  74. data/libchdr/deps/zlib-1.2.11/inftrees.h +62 -0
  75. data/libchdr/deps/zlib-1.2.11/make_vms.com +867 -0
  76. data/libchdr/deps/zlib-1.2.11/treebuild.xml +116 -0
  77. data/libchdr/deps/zlib-1.2.11/trees.c +1203 -0
  78. data/libchdr/deps/zlib-1.2.11/trees.h +128 -0
  79. data/libchdr/deps/zlib-1.2.11/uncompr.c +93 -0
  80. data/libchdr/deps/zlib-1.2.11/zconf.h +534 -0
  81. data/libchdr/deps/zlib-1.2.11/zconf.h.cmakein +536 -0
  82. data/libchdr/deps/zlib-1.2.11/zconf.h.in +534 -0
  83. data/libchdr/deps/zlib-1.2.11/zlib.3 +149 -0
  84. data/libchdr/deps/zlib-1.2.11/zlib.3.pdf +0 -0
  85. data/libchdr/deps/zlib-1.2.11/zlib.h +1912 -0
  86. data/libchdr/deps/zlib-1.2.11/zlib.map +94 -0
  87. data/libchdr/deps/zlib-1.2.11/zlib.pc.cmakein +13 -0
  88. data/libchdr/deps/zlib-1.2.11/zlib.pc.in +13 -0
  89. data/libchdr/deps/zlib-1.2.11/zlib2ansi +152 -0
  90. data/libchdr/deps/zlib-1.2.11/zutil.c +325 -0
  91. data/libchdr/deps/zlib-1.2.11/zutil.h +271 -0
  92. data/libchdr/include/dr_libs/dr_flac.h +12280 -0
  93. data/libchdr/include/libchdr/bitstream.h +43 -0
  94. data/libchdr/include/libchdr/cdrom.h +110 -0
  95. data/libchdr/include/libchdr/chd.h +427 -0
  96. data/libchdr/include/libchdr/chdconfig.h +10 -0
  97. data/libchdr/include/libchdr/coretypes.h +60 -0
  98. data/libchdr/include/libchdr/flac.h +50 -0
  99. data/libchdr/include/libchdr/huffman.h +90 -0
  100. data/libchdr/pkg-config.pc.in +10 -0
  101. data/libchdr/src/libchdr_bitstream.c +125 -0
  102. data/libchdr/src/libchdr_cdrom.c +415 -0
  103. data/libchdr/src/libchdr_chd.c +2744 -0
  104. data/libchdr/src/libchdr_flac.c +302 -0
  105. data/libchdr/src/libchdr_huffman.c +545 -0
  106. data/libchdr/src/link.T +5 -0
  107. data/libchdr/tests/CMakeLists.txt +2 -0
  108. data/libchdr/tests/benchmark.c +52 -0
  109. metadata +183 -0
@@ -0,0 +1,1127 @@
1
+ /* LzFind.c -- Match finder for LZ algorithms
2
+ 2018-07-08 : Igor Pavlov : Public domain */
3
+
4
+ #include "Precomp.h"
5
+
6
+ #include <string.h>
7
+
8
+ #include "LzFind.h"
9
+ #include "LzHash.h"
10
+
11
+ #define kEmptyHashValue 0
12
+ #define kMaxValForNormalize ((UInt32)0xFFFFFFFF)
13
+ #define kNormalizeStepMin (1 << 10) /* it must be power of 2 */
14
+ #define kNormalizeMask (~(UInt32)(kNormalizeStepMin - 1))
15
+ #define kMaxHistorySize ((UInt32)7 << 29)
16
+
17
+ #define kStartMaxLen 3
18
+
19
+ static void LzInWindow_Free(CMatchFinder *p, ISzAllocPtr alloc)
20
+ {
21
+ if (!p->directInput)
22
+ {
23
+ ISzAlloc_Free(alloc, p->bufferBase);
24
+ p->bufferBase = NULL;
25
+ }
26
+ }
27
+
28
+ /* keepSizeBefore + keepSizeAfter + keepSizeReserv must be < 4G) */
29
+
30
+ static int LzInWindow_Create(CMatchFinder *p, UInt32 keepSizeReserv, ISzAllocPtr alloc)
31
+ {
32
+ UInt32 blockSize = p->keepSizeBefore + p->keepSizeAfter + keepSizeReserv;
33
+ if (p->directInput)
34
+ {
35
+ p->blockSize = blockSize;
36
+ return 1;
37
+ }
38
+ if (!p->bufferBase || p->blockSize != blockSize)
39
+ {
40
+ LzInWindow_Free(p, alloc);
41
+ p->blockSize = blockSize;
42
+ p->bufferBase = (Byte *)ISzAlloc_Alloc(alloc, (size_t)blockSize);
43
+ }
44
+ return (p->bufferBase != NULL);
45
+ }
46
+
47
+ Byte *MatchFinder_GetPointerToCurrentPos(CMatchFinder *p) { return p->buffer; }
48
+
49
+ UInt32 MatchFinder_GetNumAvailableBytes(CMatchFinder *p) { return p->streamPos - p->pos; }
50
+
51
+ void MatchFinder_ReduceOffsets(CMatchFinder *p, UInt32 subValue)
52
+ {
53
+ p->posLimit -= subValue;
54
+ p->pos -= subValue;
55
+ p->streamPos -= subValue;
56
+ }
57
+
58
+ static void MatchFinder_ReadBlock(CMatchFinder *p)
59
+ {
60
+ if (p->streamEndWasReached || p->result != SZ_OK)
61
+ return;
62
+
63
+ /* We use (p->streamPos - p->pos) value. (p->streamPos < p->pos) is allowed. */
64
+
65
+ if (p->directInput)
66
+ {
67
+ UInt32 curSize = 0xFFFFFFFF - (p->streamPos - p->pos);
68
+ if (curSize > p->directInputRem)
69
+ curSize = (UInt32)p->directInputRem;
70
+ p->directInputRem -= curSize;
71
+ p->streamPos += curSize;
72
+ if (p->directInputRem == 0)
73
+ p->streamEndWasReached = 1;
74
+ return;
75
+ }
76
+
77
+ for (;;)
78
+ {
79
+ Byte *dest = p->buffer + (p->streamPos - p->pos);
80
+ size_t size = (p->bufferBase + p->blockSize - dest);
81
+ if (size == 0)
82
+ return;
83
+
84
+ p->result = ISeqInStream_Read(p->stream, dest, &size);
85
+ if (p->result != SZ_OK)
86
+ return;
87
+ if (size == 0)
88
+ {
89
+ p->streamEndWasReached = 1;
90
+ return;
91
+ }
92
+ p->streamPos += (UInt32)size;
93
+ if (p->streamPos - p->pos > p->keepSizeAfter)
94
+ return;
95
+ }
96
+ }
97
+
98
+ void MatchFinder_MoveBlock(CMatchFinder *p)
99
+ {
100
+ memmove(p->bufferBase,
101
+ p->buffer - p->keepSizeBefore,
102
+ (size_t)(p->streamPos - p->pos) + p->keepSizeBefore);
103
+ p->buffer = p->bufferBase + p->keepSizeBefore;
104
+ }
105
+
106
+ int MatchFinder_NeedMove(CMatchFinder *p)
107
+ {
108
+ if (p->directInput)
109
+ return 0;
110
+ /* if (p->streamEndWasReached) return 0; */
111
+ return ((size_t)(p->bufferBase + p->blockSize - p->buffer) <= p->keepSizeAfter);
112
+ }
113
+
114
+ void MatchFinder_ReadIfRequired(CMatchFinder *p)
115
+ {
116
+ if (p->streamEndWasReached)
117
+ return;
118
+ if (p->keepSizeAfter >= p->streamPos - p->pos)
119
+ MatchFinder_ReadBlock(p);
120
+ }
121
+
122
+ static void MatchFinder_CheckAndMoveAndRead(CMatchFinder *p)
123
+ {
124
+ if (MatchFinder_NeedMove(p))
125
+ MatchFinder_MoveBlock(p);
126
+ MatchFinder_ReadBlock(p);
127
+ }
128
+
129
+ static void MatchFinder_SetDefaultSettings(CMatchFinder *p)
130
+ {
131
+ p->cutValue = 32;
132
+ p->btMode = 1;
133
+ p->numHashBytes = 4;
134
+ p->bigHash = 0;
135
+ }
136
+
137
+ #define kCrcPoly 0xEDB88320
138
+
139
+ void MatchFinder_Construct(CMatchFinder *p)
140
+ {
141
+ unsigned i;
142
+ p->bufferBase = NULL;
143
+ p->directInput = 0;
144
+ p->hash = NULL;
145
+ p->expectedDataSize = (UInt64)(Int64)-1;
146
+ MatchFinder_SetDefaultSettings(p);
147
+
148
+ for (i = 0; i < 256; i++)
149
+ {
150
+ UInt32 r = (UInt32)i;
151
+ unsigned j;
152
+ for (j = 0; j < 8; j++)
153
+ r = (r >> 1) ^ (kCrcPoly & ((UInt32)0 - (r & 1)));
154
+ p->crc[i] = r;
155
+ }
156
+ }
157
+
158
+ static void MatchFinder_FreeThisClassMemory(CMatchFinder *p, ISzAllocPtr alloc)
159
+ {
160
+ ISzAlloc_Free(alloc, p->hash);
161
+ p->hash = NULL;
162
+ }
163
+
164
+ void MatchFinder_Free(CMatchFinder *p, ISzAllocPtr alloc)
165
+ {
166
+ MatchFinder_FreeThisClassMemory(p, alloc);
167
+ LzInWindow_Free(p, alloc);
168
+ }
169
+
170
+ static CLzRef* AllocRefs(size_t num, ISzAllocPtr alloc)
171
+ {
172
+ size_t sizeInBytes = (size_t)num * sizeof(CLzRef);
173
+ if (sizeInBytes / sizeof(CLzRef) != num)
174
+ return NULL;
175
+ return (CLzRef *)ISzAlloc_Alloc(alloc, sizeInBytes);
176
+ }
177
+
178
+ int MatchFinder_Create(CMatchFinder *p, UInt32 historySize,
179
+ UInt32 keepAddBufferBefore, UInt32 matchMaxLen, UInt32 keepAddBufferAfter,
180
+ ISzAllocPtr alloc)
181
+ {
182
+ UInt32 sizeReserv;
183
+
184
+ if (historySize > kMaxHistorySize)
185
+ {
186
+ MatchFinder_Free(p, alloc);
187
+ return 0;
188
+ }
189
+
190
+ sizeReserv = historySize >> 1;
191
+ if (historySize >= ((UInt32)3 << 30)) sizeReserv = historySize >> 3;
192
+ else if (historySize >= ((UInt32)2 << 30)) sizeReserv = historySize >> 2;
193
+
194
+ sizeReserv += (keepAddBufferBefore + matchMaxLen + keepAddBufferAfter) / 2 + (1 << 19);
195
+
196
+ p->keepSizeBefore = historySize + keepAddBufferBefore + 1;
197
+ p->keepSizeAfter = matchMaxLen + keepAddBufferAfter;
198
+
199
+ /* we need one additional byte, since we use MoveBlock after pos++ and before dictionary using */
200
+
201
+ if (LzInWindow_Create(p, sizeReserv, alloc))
202
+ {
203
+ UInt32 newCyclicBufferSize = historySize + 1;
204
+ UInt32 hs;
205
+ p->matchMaxLen = matchMaxLen;
206
+ {
207
+ p->fixedHashSize = 0;
208
+ if (p->numHashBytes == 2)
209
+ hs = (1 << 16) - 1;
210
+ else
211
+ {
212
+ hs = historySize;
213
+ if (hs > p->expectedDataSize)
214
+ hs = (UInt32)p->expectedDataSize;
215
+ if (hs != 0)
216
+ hs--;
217
+ hs |= (hs >> 1);
218
+ hs |= (hs >> 2);
219
+ hs |= (hs >> 4);
220
+ hs |= (hs >> 8);
221
+ hs >>= 1;
222
+ hs |= 0xFFFF; /* don't change it! It's required for Deflate */
223
+ if (hs > (1 << 24))
224
+ {
225
+ if (p->numHashBytes == 3)
226
+ hs = (1 << 24) - 1;
227
+ else
228
+ hs >>= 1;
229
+ /* if (bigHash) mode, GetHeads4b() in LzFindMt.c needs (hs >= ((1 << 24) - 1))) */
230
+ }
231
+ }
232
+ p->hashMask = hs;
233
+ hs++;
234
+ if (p->numHashBytes > 2) p->fixedHashSize += kHash2Size;
235
+ if (p->numHashBytes > 3) p->fixedHashSize += kHash3Size;
236
+ if (p->numHashBytes > 4) p->fixedHashSize += kHash4Size;
237
+ hs += p->fixedHashSize;
238
+ }
239
+
240
+ {
241
+ size_t newSize;
242
+ size_t numSons;
243
+ p->historySize = historySize;
244
+ p->hashSizeSum = hs;
245
+ p->cyclicBufferSize = newCyclicBufferSize;
246
+
247
+ numSons = newCyclicBufferSize;
248
+ if (p->btMode)
249
+ numSons <<= 1;
250
+ newSize = hs + numSons;
251
+
252
+ if (p->hash && p->numRefs == newSize)
253
+ return 1;
254
+
255
+ MatchFinder_FreeThisClassMemory(p, alloc);
256
+ p->numRefs = newSize;
257
+ p->hash = AllocRefs(newSize, alloc);
258
+
259
+ if (p->hash)
260
+ {
261
+ p->son = p->hash + p->hashSizeSum;
262
+ return 1;
263
+ }
264
+ }
265
+ }
266
+
267
+ MatchFinder_Free(p, alloc);
268
+ return 0;
269
+ }
270
+
271
+ static void MatchFinder_SetLimits(CMatchFinder *p)
272
+ {
273
+ UInt32 limit = kMaxValForNormalize - p->pos;
274
+ UInt32 limit2 = p->cyclicBufferSize - p->cyclicBufferPos;
275
+
276
+ if (limit2 < limit)
277
+ limit = limit2;
278
+ limit2 = p->streamPos - p->pos;
279
+
280
+ if (limit2 <= p->keepSizeAfter)
281
+ {
282
+ if (limit2 > 0)
283
+ limit2 = 1;
284
+ }
285
+ else
286
+ limit2 -= p->keepSizeAfter;
287
+
288
+ if (limit2 < limit)
289
+ limit = limit2;
290
+
291
+ {
292
+ UInt32 lenLimit = p->streamPos - p->pos;
293
+ if (lenLimit > p->matchMaxLen)
294
+ lenLimit = p->matchMaxLen;
295
+ p->lenLimit = lenLimit;
296
+ }
297
+ p->posLimit = p->pos + limit;
298
+ }
299
+
300
+
301
+ void MatchFinder_Init_LowHash(CMatchFinder *p)
302
+ {
303
+ size_t i;
304
+ CLzRef *items = p->hash;
305
+ size_t numItems = p->fixedHashSize;
306
+ for (i = 0; i < numItems; i++)
307
+ items[i] = kEmptyHashValue;
308
+ }
309
+
310
+
311
+ void MatchFinder_Init_HighHash(CMatchFinder *p)
312
+ {
313
+ size_t i;
314
+ CLzRef *items = p->hash + p->fixedHashSize;
315
+ size_t numItems = (size_t)p->hashMask + 1;
316
+ for (i = 0; i < numItems; i++)
317
+ items[i] = kEmptyHashValue;
318
+ }
319
+
320
+
321
+ void MatchFinder_Init_3(CMatchFinder *p, int readData)
322
+ {
323
+ p->cyclicBufferPos = 0;
324
+ p->buffer = p->bufferBase;
325
+ p->pos =
326
+ p->streamPos = p->cyclicBufferSize;
327
+ p->result = SZ_OK;
328
+ p->streamEndWasReached = 0;
329
+
330
+ if (readData)
331
+ MatchFinder_ReadBlock(p);
332
+
333
+ MatchFinder_SetLimits(p);
334
+ }
335
+
336
+
337
+ void MatchFinder_Init(CMatchFinder *p)
338
+ {
339
+ MatchFinder_Init_HighHash(p);
340
+ MatchFinder_Init_LowHash(p);
341
+ MatchFinder_Init_3(p, True);
342
+ }
343
+
344
+
345
+ static UInt32 MatchFinder_GetSubValue(CMatchFinder *p)
346
+ {
347
+ return (p->pos - p->historySize - 1) & kNormalizeMask;
348
+ }
349
+
350
+ void MatchFinder_Normalize3(UInt32 subValue, CLzRef *items, size_t numItems)
351
+ {
352
+ size_t i;
353
+ for (i = 0; i < numItems; i++)
354
+ {
355
+ UInt32 value = items[i];
356
+ if (value <= subValue)
357
+ value = kEmptyHashValue;
358
+ else
359
+ value -= subValue;
360
+ items[i] = value;
361
+ }
362
+ }
363
+
364
+ static void MatchFinder_Normalize(CMatchFinder *p)
365
+ {
366
+ UInt32 subValue = MatchFinder_GetSubValue(p);
367
+ MatchFinder_Normalize3(subValue, p->hash, p->numRefs);
368
+ MatchFinder_ReduceOffsets(p, subValue);
369
+ }
370
+
371
+
372
+ MY_NO_INLINE
373
+ static void MatchFinder_CheckLimits(CMatchFinder *p)
374
+ {
375
+ if (p->pos == kMaxValForNormalize)
376
+ MatchFinder_Normalize(p);
377
+ if (!p->streamEndWasReached && p->keepSizeAfter == p->streamPos - p->pos)
378
+ MatchFinder_CheckAndMoveAndRead(p);
379
+ if (p->cyclicBufferPos == p->cyclicBufferSize)
380
+ p->cyclicBufferPos = 0;
381
+ MatchFinder_SetLimits(p);
382
+ }
383
+
384
+
385
+ /*
386
+ (lenLimit > maxLen)
387
+ */
388
+ MY_FORCE_INLINE
389
+ static UInt32 * Hc_GetMatchesSpec(unsigned lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
390
+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
391
+ UInt32 *distances, unsigned maxLen)
392
+ {
393
+ /*
394
+ son[_cyclicBufferPos] = curMatch;
395
+ for (;;)
396
+ {
397
+ UInt32 delta = pos - curMatch;
398
+ if (cutValue-- == 0 || delta >= _cyclicBufferSize)
399
+ return distances;
400
+ {
401
+ const Byte *pb = cur - delta;
402
+ curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
403
+ if (pb[maxLen] == cur[maxLen] && *pb == *cur)
404
+ {
405
+ UInt32 len = 0;
406
+ while (++len != lenLimit)
407
+ if (pb[len] != cur[len])
408
+ break;
409
+ if (maxLen < len)
410
+ {
411
+ maxLen = len;
412
+ *distances++ = len;
413
+ *distances++ = delta - 1;
414
+ if (len == lenLimit)
415
+ return distances;
416
+ }
417
+ }
418
+ }
419
+ }
420
+ */
421
+
422
+ const Byte *lim = cur + lenLimit;
423
+ son[_cyclicBufferPos] = curMatch;
424
+ do
425
+ {
426
+ UInt32 delta = pos - curMatch;
427
+ if (delta >= _cyclicBufferSize)
428
+ break;
429
+ {
430
+ ptrdiff_t diff;
431
+ curMatch = son[_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)];
432
+ diff = (ptrdiff_t)0 - delta;
433
+ if (cur[maxLen] == cur[maxLen + diff])
434
+ {
435
+ const Byte *c = cur;
436
+ while (*c == c[diff])
437
+ {
438
+ if (++c == lim)
439
+ {
440
+ distances[0] = (UInt32)(lim - cur);
441
+ distances[1] = delta - 1;
442
+ return distances + 2;
443
+ }
444
+ }
445
+ {
446
+ unsigned len = (unsigned)(c - cur);
447
+ if (maxLen < len)
448
+ {
449
+ maxLen = len;
450
+ distances[0] = (UInt32)len;
451
+ distances[1] = delta - 1;
452
+ distances += 2;
453
+ }
454
+ }
455
+ }
456
+ }
457
+ }
458
+ while (--cutValue);
459
+
460
+ return distances;
461
+ }
462
+
463
+
464
+ MY_FORCE_INLINE
465
+ UInt32 * GetMatchesSpec1(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
466
+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue,
467
+ UInt32 *distances, UInt32 maxLen)
468
+ {
469
+ CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1;
470
+ CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1);
471
+ unsigned len0 = 0, len1 = 0;
472
+ for (;;)
473
+ {
474
+ UInt32 delta = pos - curMatch;
475
+ if (cutValue-- == 0 || delta >= _cyclicBufferSize)
476
+ {
477
+ *ptr0 = *ptr1 = kEmptyHashValue;
478
+ return distances;
479
+ }
480
+ {
481
+ CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
482
+ const Byte *pb = cur - delta;
483
+ unsigned len = (len0 < len1 ? len0 : len1);
484
+ UInt32 pair0 = pair[0];
485
+ if (pb[len] == cur[len])
486
+ {
487
+ if (++len != lenLimit && pb[len] == cur[len])
488
+ while (++len != lenLimit)
489
+ if (pb[len] != cur[len])
490
+ break;
491
+ if (maxLen < len)
492
+ {
493
+ maxLen = (UInt32)len;
494
+ *distances++ = (UInt32)len;
495
+ *distances++ = delta - 1;
496
+ if (len == lenLimit)
497
+ {
498
+ *ptr1 = pair0;
499
+ *ptr0 = pair[1];
500
+ return distances;
501
+ }
502
+ }
503
+ }
504
+ if (pb[len] < cur[len])
505
+ {
506
+ *ptr1 = curMatch;
507
+ ptr1 = pair + 1;
508
+ curMatch = *ptr1;
509
+ len1 = len;
510
+ }
511
+ else
512
+ {
513
+ *ptr0 = curMatch;
514
+ ptr0 = pair;
515
+ curMatch = *ptr0;
516
+ len0 = len;
517
+ }
518
+ }
519
+ }
520
+ }
521
+
522
+ static void SkipMatchesSpec(UInt32 lenLimit, UInt32 curMatch, UInt32 pos, const Byte *cur, CLzRef *son,
523
+ UInt32 _cyclicBufferPos, UInt32 _cyclicBufferSize, UInt32 cutValue)
524
+ {
525
+ CLzRef *ptr0 = son + ((size_t)_cyclicBufferPos << 1) + 1;
526
+ CLzRef *ptr1 = son + ((size_t)_cyclicBufferPos << 1);
527
+ unsigned len0 = 0, len1 = 0;
528
+ for (;;)
529
+ {
530
+ UInt32 delta = pos - curMatch;
531
+ if (cutValue-- == 0 || delta >= _cyclicBufferSize)
532
+ {
533
+ *ptr0 = *ptr1 = kEmptyHashValue;
534
+ return;
535
+ }
536
+ {
537
+ CLzRef *pair = son + ((size_t)(_cyclicBufferPos - delta + ((delta > _cyclicBufferPos) ? _cyclicBufferSize : 0)) << 1);
538
+ const Byte *pb = cur - delta;
539
+ unsigned len = (len0 < len1 ? len0 : len1);
540
+ if (pb[len] == cur[len])
541
+ {
542
+ while (++len != lenLimit)
543
+ if (pb[len] != cur[len])
544
+ break;
545
+ {
546
+ if (len == lenLimit)
547
+ {
548
+ *ptr1 = pair[0];
549
+ *ptr0 = pair[1];
550
+ return;
551
+ }
552
+ }
553
+ }
554
+ if (pb[len] < cur[len])
555
+ {
556
+ *ptr1 = curMatch;
557
+ ptr1 = pair + 1;
558
+ curMatch = *ptr1;
559
+ len1 = len;
560
+ }
561
+ else
562
+ {
563
+ *ptr0 = curMatch;
564
+ ptr0 = pair;
565
+ curMatch = *ptr0;
566
+ len0 = len;
567
+ }
568
+ }
569
+ }
570
+ }
571
+
572
+ #define MOVE_POS \
573
+ ++p->cyclicBufferPos; \
574
+ p->buffer++; \
575
+ if (++p->pos == p->posLimit) MatchFinder_CheckLimits(p);
576
+
577
+ #define MOVE_POS_RET MOVE_POS return (UInt32)offset;
578
+
579
+ static void MatchFinder_MovePos(CMatchFinder *p) { MOVE_POS; }
580
+
581
+ #define GET_MATCHES_HEADER2(minLen, ret_op) \
582
+ unsigned lenLimit; UInt32 hv; const Byte *cur; UInt32 curMatch; \
583
+ lenLimit = (unsigned)p->lenLimit; { if (lenLimit < minLen) { MatchFinder_MovePos(p); ret_op; }} \
584
+ cur = p->buffer;
585
+
586
+ #define GET_MATCHES_HEADER(minLen) GET_MATCHES_HEADER2(minLen, return 0)
587
+ #define SKIP_HEADER(minLen) GET_MATCHES_HEADER2(minLen, continue)
588
+
589
+ #define MF_PARAMS(p) p->pos, p->buffer, p->son, p->cyclicBufferPos, p->cyclicBufferSize, p->cutValue
590
+
591
+ #define GET_MATCHES_FOOTER(offset, maxLen) \
592
+ offset = (unsigned)(GetMatchesSpec1((UInt32)lenLimit, curMatch, MF_PARAMS(p), \
593
+ distances + offset, (UInt32)maxLen) - distances); MOVE_POS_RET;
594
+
595
+ #define SKIP_FOOTER \
596
+ SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p)); MOVE_POS;
597
+
598
+ #define UPDATE_maxLen { \
599
+ ptrdiff_t diff = (ptrdiff_t)0 - d2; \
600
+ const Byte *c = cur + maxLen; \
601
+ const Byte *lim = cur + lenLimit; \
602
+ for (; c != lim; c++) if (*(c + diff) != *c) break; \
603
+ maxLen = (unsigned)(c - cur); }
604
+
605
+ static UInt32 Bt2_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
606
+ {
607
+ unsigned offset;
608
+ GET_MATCHES_HEADER(2)
609
+ HASH2_CALC;
610
+ curMatch = p->hash[hv];
611
+ p->hash[hv] = p->pos;
612
+ offset = 0;
613
+ GET_MATCHES_FOOTER(offset, 1)
614
+ }
615
+
616
+ UInt32 Bt3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
617
+ {
618
+ unsigned offset;
619
+ GET_MATCHES_HEADER(3)
620
+ HASH_ZIP_CALC;
621
+ curMatch = p->hash[hv];
622
+ p->hash[hv] = p->pos;
623
+ offset = 0;
624
+ GET_MATCHES_FOOTER(offset, 2)
625
+ }
626
+
627
+ static UInt32 Bt3_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
628
+ {
629
+ UInt32 h2, d2, pos;
630
+ unsigned maxLen, offset;
631
+ UInt32 *hash;
632
+ GET_MATCHES_HEADER(3)
633
+
634
+ HASH3_CALC;
635
+
636
+ hash = p->hash;
637
+ pos = p->pos;
638
+
639
+ d2 = pos - hash[h2];
640
+
641
+ curMatch = (hash + kFix3HashSize)[hv];
642
+
643
+ hash[h2] = pos;
644
+ (hash + kFix3HashSize)[hv] = pos;
645
+
646
+ maxLen = 2;
647
+ offset = 0;
648
+
649
+ if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur)
650
+ {
651
+ UPDATE_maxLen
652
+ distances[0] = (UInt32)maxLen;
653
+ distances[1] = d2 - 1;
654
+ offset = 2;
655
+ if (maxLen == lenLimit)
656
+ {
657
+ SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p));
658
+ MOVE_POS_RET;
659
+ }
660
+ }
661
+
662
+ GET_MATCHES_FOOTER(offset, maxLen)
663
+ }
664
+
665
+ static UInt32 Bt4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
666
+ {
667
+ UInt32 h2, h3, d2, d3, pos;
668
+ unsigned maxLen, offset;
669
+ UInt32 *hash;
670
+ GET_MATCHES_HEADER(4)
671
+
672
+ HASH4_CALC;
673
+
674
+ hash = p->hash;
675
+ pos = p->pos;
676
+
677
+ d2 = pos - hash [h2];
678
+ d3 = pos - (hash + kFix3HashSize)[h3];
679
+
680
+ curMatch = (hash + kFix4HashSize)[hv];
681
+
682
+ hash [h2] = pos;
683
+ (hash + kFix3HashSize)[h3] = pos;
684
+ (hash + kFix4HashSize)[hv] = pos;
685
+
686
+ maxLen = 0;
687
+ offset = 0;
688
+
689
+ if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur)
690
+ {
691
+ maxLen = 2;
692
+ distances[0] = 2;
693
+ distances[1] = d2 - 1;
694
+ offset = 2;
695
+ }
696
+
697
+ if (d2 != d3 && d3 < p->cyclicBufferSize && *(cur - d3) == *cur)
698
+ {
699
+ maxLen = 3;
700
+ distances[(size_t)offset + 1] = d3 - 1;
701
+ offset += 2;
702
+ d2 = d3;
703
+ }
704
+
705
+ if (offset != 0)
706
+ {
707
+ UPDATE_maxLen
708
+ distances[(size_t)offset - 2] = (UInt32)maxLen;
709
+ if (maxLen == lenLimit)
710
+ {
711
+ SkipMatchesSpec((UInt32)lenLimit, curMatch, MF_PARAMS(p));
712
+ MOVE_POS_RET;
713
+ }
714
+ }
715
+
716
+ if (maxLen < 3)
717
+ maxLen = 3;
718
+
719
+ GET_MATCHES_FOOTER(offset, maxLen)
720
+ }
721
+
722
+ /*
723
+ static UInt32 Bt5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
724
+ {
725
+ UInt32 h2, h3, h4, d2, d3, d4, maxLen, offset, pos;
726
+ UInt32 *hash;
727
+ GET_MATCHES_HEADER(5)
728
+
729
+ HASH5_CALC;
730
+
731
+ hash = p->hash;
732
+ pos = p->pos;
733
+
734
+ d2 = pos - hash [h2];
735
+ d3 = pos - (hash + kFix3HashSize)[h3];
736
+ d4 = pos - (hash + kFix4HashSize)[h4];
737
+
738
+ curMatch = (hash + kFix5HashSize)[hv];
739
+
740
+ hash [h2] = pos;
741
+ (hash + kFix3HashSize)[h3] = pos;
742
+ (hash + kFix4HashSize)[h4] = pos;
743
+ (hash + kFix5HashSize)[hv] = pos;
744
+
745
+ maxLen = 0;
746
+ offset = 0;
747
+
748
+ if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur)
749
+ {
750
+ distances[0] = maxLen = 2;
751
+ distances[1] = d2 - 1;
752
+ offset = 2;
753
+ if (*(cur - d2 + 2) == cur[2])
754
+ distances[0] = maxLen = 3;
755
+ else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur)
756
+ {
757
+ distances[2] = maxLen = 3;
758
+ distances[3] = d3 - 1;
759
+ offset = 4;
760
+ d2 = d3;
761
+ }
762
+ }
763
+ else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur)
764
+ {
765
+ distances[0] = maxLen = 3;
766
+ distances[1] = d3 - 1;
767
+ offset = 2;
768
+ d2 = d3;
769
+ }
770
+
771
+ if (d2 != d4 && d4 < p->cyclicBufferSize
772
+ && *(cur - d4) == *cur
773
+ && *(cur - d4 + 3) == *(cur + 3))
774
+ {
775
+ maxLen = 4;
776
+ distances[(size_t)offset + 1] = d4 - 1;
777
+ offset += 2;
778
+ d2 = d4;
779
+ }
780
+
781
+ if (offset != 0)
782
+ {
783
+ UPDATE_maxLen
784
+ distances[(size_t)offset - 2] = maxLen;
785
+ if (maxLen == lenLimit)
786
+ {
787
+ SkipMatchesSpec(lenLimit, curMatch, MF_PARAMS(p));
788
+ MOVE_POS_RET;
789
+ }
790
+ }
791
+
792
+ if (maxLen < 4)
793
+ maxLen = 4;
794
+
795
+ GET_MATCHES_FOOTER(offset, maxLen)
796
+ }
797
+ */
798
+
799
+ static UInt32 Hc4_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
800
+ {
801
+ UInt32 h2, h3, d2, d3, pos;
802
+ unsigned maxLen, offset;
803
+ UInt32 *hash;
804
+ GET_MATCHES_HEADER(4)
805
+
806
+ HASH4_CALC;
807
+
808
+ hash = p->hash;
809
+ pos = p->pos;
810
+
811
+ d2 = pos - hash [h2];
812
+ d3 = pos - (hash + kFix3HashSize)[h3];
813
+ curMatch = (hash + kFix4HashSize)[hv];
814
+
815
+ hash [h2] = pos;
816
+ (hash + kFix3HashSize)[h3] = pos;
817
+ (hash + kFix4HashSize)[hv] = pos;
818
+
819
+ maxLen = 0;
820
+ offset = 0;
821
+
822
+ if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur)
823
+ {
824
+ maxLen = 2;
825
+ distances[0] = 2;
826
+ distances[1] = d2 - 1;
827
+ offset = 2;
828
+ }
829
+
830
+ if (d2 != d3 && d3 < p->cyclicBufferSize && *(cur - d3) == *cur)
831
+ {
832
+ maxLen = 3;
833
+ distances[(size_t)offset + 1] = d3 - 1;
834
+ offset += 2;
835
+ d2 = d3;
836
+ }
837
+
838
+ if (offset != 0)
839
+ {
840
+ UPDATE_maxLen
841
+ distances[(size_t)offset - 2] = (UInt32)maxLen;
842
+ if (maxLen == lenLimit)
843
+ {
844
+ p->son[p->cyclicBufferPos] = curMatch;
845
+ MOVE_POS_RET;
846
+ }
847
+ }
848
+
849
+ if (maxLen < 3)
850
+ maxLen = 3;
851
+
852
+ offset = (unsigned)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
853
+ distances + offset, maxLen) - (distances));
854
+ MOVE_POS_RET
855
+ }
856
+
857
+ /*
858
+ static UInt32 Hc5_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
859
+ {
860
+ UInt32 h2, h3, h4, d2, d3, d4, maxLen, offset, pos
861
+ UInt32 *hash;
862
+ GET_MATCHES_HEADER(5)
863
+
864
+ HASH5_CALC;
865
+
866
+ hash = p->hash;
867
+ pos = p->pos;
868
+
869
+ d2 = pos - hash [h2];
870
+ d3 = pos - (hash + kFix3HashSize)[h3];
871
+ d4 = pos - (hash + kFix4HashSize)[h4];
872
+
873
+ curMatch = (hash + kFix5HashSize)[hv];
874
+
875
+ hash [h2] = pos;
876
+ (hash + kFix3HashSize)[h3] = pos;
877
+ (hash + kFix4HashSize)[h4] = pos;
878
+ (hash + kFix5HashSize)[hv] = pos;
879
+
880
+ maxLen = 0;
881
+ offset = 0;
882
+
883
+ if (d2 < p->cyclicBufferSize && *(cur - d2) == *cur)
884
+ {
885
+ distances[0] = maxLen = 2;
886
+ distances[1] = d2 - 1;
887
+ offset = 2;
888
+ if (*(cur - d2 + 2) == cur[2])
889
+ distances[0] = maxLen = 3;
890
+ else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur)
891
+ {
892
+ distances[2] = maxLen = 3;
893
+ distances[3] = d3 - 1;
894
+ offset = 4;
895
+ d2 = d3;
896
+ }
897
+ }
898
+ else if (d3 < p->cyclicBufferSize && *(cur - d3) == *cur)
899
+ {
900
+ distances[0] = maxLen = 3;
901
+ distances[1] = d3 - 1;
902
+ offset = 2;
903
+ d2 = d3;
904
+ }
905
+
906
+ if (d2 != d4 && d4 < p->cyclicBufferSize
907
+ && *(cur - d4) == *cur
908
+ && *(cur - d4 + 3) == *(cur + 3))
909
+ {
910
+ maxLen = 4;
911
+ distances[(size_t)offset + 1] = d4 - 1;
912
+ offset += 2;
913
+ d2 = d4;
914
+ }
915
+
916
+ if (offset != 0)
917
+ {
918
+ UPDATE_maxLen
919
+ distances[(size_t)offset - 2] = maxLen;
920
+ if (maxLen == lenLimit)
921
+ {
922
+ p->son[p->cyclicBufferPos] = curMatch;
923
+ MOVE_POS_RET;
924
+ }
925
+ }
926
+
927
+ if (maxLen < 4)
928
+ maxLen = 4;
929
+
930
+ offset = (UInt32)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
931
+ distances + offset, maxLen) - (distances));
932
+ MOVE_POS_RET
933
+ }
934
+ */
935
+
936
+ UInt32 Hc3Zip_MatchFinder_GetMatches(CMatchFinder *p, UInt32 *distances)
937
+ {
938
+ unsigned offset;
939
+ GET_MATCHES_HEADER(3)
940
+ HASH_ZIP_CALC;
941
+ curMatch = p->hash[hv];
942
+ p->hash[hv] = p->pos;
943
+ offset = (unsigned)(Hc_GetMatchesSpec(lenLimit, curMatch, MF_PARAMS(p),
944
+ distances, 2) - (distances));
945
+ MOVE_POS_RET
946
+ }
947
+
948
+ static void Bt2_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
949
+ {
950
+ do
951
+ {
952
+ SKIP_HEADER(2)
953
+ HASH2_CALC;
954
+ curMatch = p->hash[hv];
955
+ p->hash[hv] = p->pos;
956
+ SKIP_FOOTER
957
+ }
958
+ while (--num != 0);
959
+ }
960
+
961
+ void Bt3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
962
+ {
963
+ do
964
+ {
965
+ SKIP_HEADER(3)
966
+ HASH_ZIP_CALC;
967
+ curMatch = p->hash[hv];
968
+ p->hash[hv] = p->pos;
969
+ SKIP_FOOTER
970
+ }
971
+ while (--num != 0);
972
+ }
973
+
974
+ static void Bt3_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
975
+ {
976
+ do
977
+ {
978
+ UInt32 h2;
979
+ UInt32 *hash;
980
+ SKIP_HEADER(3)
981
+ HASH3_CALC;
982
+ hash = p->hash;
983
+ curMatch = (hash + kFix3HashSize)[hv];
984
+ hash[h2] =
985
+ (hash + kFix3HashSize)[hv] = p->pos;
986
+ SKIP_FOOTER
987
+ }
988
+ while (--num != 0);
989
+ }
990
+
991
+ static void Bt4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
992
+ {
993
+ do
994
+ {
995
+ UInt32 h2, h3;
996
+ UInt32 *hash;
997
+ SKIP_HEADER(4)
998
+ HASH4_CALC;
999
+ hash = p->hash;
1000
+ curMatch = (hash + kFix4HashSize)[hv];
1001
+ hash [h2] =
1002
+ (hash + kFix3HashSize)[h3] =
1003
+ (hash + kFix4HashSize)[hv] = p->pos;
1004
+ SKIP_FOOTER
1005
+ }
1006
+ while (--num != 0);
1007
+ }
1008
+
1009
+ /*
1010
+ static void Bt5_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
1011
+ {
1012
+ do
1013
+ {
1014
+ UInt32 h2, h3, h4;
1015
+ UInt32 *hash;
1016
+ SKIP_HEADER(5)
1017
+ HASH5_CALC;
1018
+ hash = p->hash;
1019
+ curMatch = (hash + kFix5HashSize)[hv];
1020
+ hash [h2] =
1021
+ (hash + kFix3HashSize)[h3] =
1022
+ (hash + kFix4HashSize)[h4] =
1023
+ (hash + kFix5HashSize)[hv] = p->pos;
1024
+ SKIP_FOOTER
1025
+ }
1026
+ while (--num != 0);
1027
+ }
1028
+ */
1029
+
1030
+ static void Hc4_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
1031
+ {
1032
+ do
1033
+ {
1034
+ UInt32 h2, h3;
1035
+ UInt32 *hash;
1036
+ SKIP_HEADER(4)
1037
+ HASH4_CALC;
1038
+ hash = p->hash;
1039
+ curMatch = (hash + kFix4HashSize)[hv];
1040
+ hash [h2] =
1041
+ (hash + kFix3HashSize)[h3] =
1042
+ (hash + kFix4HashSize)[hv] = p->pos;
1043
+ p->son[p->cyclicBufferPos] = curMatch;
1044
+ MOVE_POS
1045
+ }
1046
+ while (--num != 0);
1047
+ }
1048
+
1049
+ /*
1050
+ static void Hc5_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
1051
+ {
1052
+ do
1053
+ {
1054
+ UInt32 h2, h3, h4;
1055
+ UInt32 *hash;
1056
+ SKIP_HEADER(5)
1057
+ HASH5_CALC;
1058
+ hash = p->hash;
1059
+ curMatch = hash + kFix5HashSize)[hv];
1060
+ hash [h2] =
1061
+ (hash + kFix3HashSize)[h3] =
1062
+ (hash + kFix4HashSize)[h4] =
1063
+ (hash + kFix5HashSize)[hv] = p->pos;
1064
+ p->son[p->cyclicBufferPos] = curMatch;
1065
+ MOVE_POS
1066
+ }
1067
+ while (--num != 0);
1068
+ }
1069
+ */
1070
+
1071
+ void Hc3Zip_MatchFinder_Skip(CMatchFinder *p, UInt32 num)
1072
+ {
1073
+ do
1074
+ {
1075
+ SKIP_HEADER(3)
1076
+ HASH_ZIP_CALC;
1077
+ curMatch = p->hash[hv];
1078
+ p->hash[hv] = p->pos;
1079
+ p->son[p->cyclicBufferPos] = curMatch;
1080
+ MOVE_POS
1081
+ }
1082
+ while (--num != 0);
1083
+ }
1084
+
1085
+ void MatchFinder_CreateVTable(CMatchFinder *p, IMatchFinder *vTable)
1086
+ {
1087
+ vTable->Init = (Mf_Init_Func)MatchFinder_Init;
1088
+ vTable->GetNumAvailableBytes = (Mf_GetNumAvailableBytes_Func)MatchFinder_GetNumAvailableBytes;
1089
+ vTable->GetPointerToCurrentPos = (Mf_GetPointerToCurrentPos_Func)MatchFinder_GetPointerToCurrentPos;
1090
+ if (!p->btMode)
1091
+ {
1092
+ /* if (p->numHashBytes <= 4) */
1093
+ {
1094
+ vTable->GetMatches = (Mf_GetMatches_Func)Hc4_MatchFinder_GetMatches;
1095
+ vTable->Skip = (Mf_Skip_Func)Hc4_MatchFinder_Skip;
1096
+ }
1097
+ /*
1098
+ else
1099
+ {
1100
+ vTable->GetMatches = (Mf_GetMatches_Func)Hc5_MatchFinder_GetMatches;
1101
+ vTable->Skip = (Mf_Skip_Func)Hc5_MatchFinder_Skip;
1102
+ }
1103
+ */
1104
+ }
1105
+ else if (p->numHashBytes == 2)
1106
+ {
1107
+ vTable->GetMatches = (Mf_GetMatches_Func)Bt2_MatchFinder_GetMatches;
1108
+ vTable->Skip = (Mf_Skip_Func)Bt2_MatchFinder_Skip;
1109
+ }
1110
+ else if (p->numHashBytes == 3)
1111
+ {
1112
+ vTable->GetMatches = (Mf_GetMatches_Func)Bt3_MatchFinder_GetMatches;
1113
+ vTable->Skip = (Mf_Skip_Func)Bt3_MatchFinder_Skip;
1114
+ }
1115
+ else /* if (p->numHashBytes == 4) */
1116
+ {
1117
+ vTable->GetMatches = (Mf_GetMatches_Func)Bt4_MatchFinder_GetMatches;
1118
+ vTable->Skip = (Mf_Skip_Func)Bt4_MatchFinder_Skip;
1119
+ }
1120
+ /*
1121
+ else
1122
+ {
1123
+ vTable->GetMatches = (Mf_GetMatches_Func)Bt5_MatchFinder_GetMatches;
1124
+ vTable->Skip = (Mf_Skip_Func)Bt5_MatchFinder_Skip;
1125
+ }
1126
+ */
1127
+ }