1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
|
/* LzFind.h -- Match finder for LZ algorithms
2017-06-10 : Igor Pavlov : Public domain */
#ifndef __LZ_FIND_H
#define __LZ_FIND_H
#include "7zTypes.h"
EXTERN_C_BEGIN
typedef UInt32 CLzRef;
typedef struct _CMatchFinder {
Byte *buffer;
UInt32 pos;
UInt32 posLimit;
UInt32 streamPos;
UInt32 lenLimit;
UInt32 cyclicBufferPos;
UInt32 cyclicBufferSize; /* it must be = (historySize + 1) */
Byte streamEndWasReached;
Byte btMode;
Byte bigHash;
Byte directInput;
UInt32 matchMaxLen;
CLzRef *hash;
CLzRef *son;
UInt32 hashMask;
UInt32 cutValue;
Byte *bufferBase;
ISeqInStream *stream;
UInt32 blockSize;
UInt32 keepSizeBefore;
UInt32 keepSizeAfter;
UInt32 numHashBytes;
size_t directInputRem;
UInt32 historySize;
UInt32 fixedHashSize;
UInt32 hashSizeSum;
SRes result;
UInt32 crc[256];
size_t numRefs;
UInt64 expectedDataSize;
} CMatchFinder;
#define Inline_MatchFinder_GetPointerToCurrentPos(p) ((p)->buffer)
#define Inline_MatchFinder_GetNumAvailableBytes(p) ((p)->streamPos - (p)->pos)
#define Inline_MatchFinder_IsFinishedOK(p) \
((p)->streamEndWasReached \
&& (p)->streamPos == (p)->pos \
&& (!(p)->directInput || (p)->directInputRem == 0))
int
MatchFinder_NeedMove (
CMatchFinder *p
);
Byte *
MatchFinder_GetPointerToCurrentPos (
CMatchFinder *p
);
void
MatchFinder_MoveBlock (
CMatchFinder *p
);
void
MatchFinder_ReadIfRequired (
CMatchFinder *p
);
void
MatchFinder_Construct (
CMatchFinder *p
);
/* Conditions:
historySize <= 3 GB
keepAddBufferBefore + matchMaxLen + keepAddBufferAfter < 511MB
*/
int
MatchFinder_Create (
CMatchFinder *p,
UInt32 historySize,
UInt32 keepAddBufferBefore,
UInt32 matchMaxLen,
UInt32 keepAddBufferAfter,
ISzAllocPtr alloc
);
void
MatchFinder_Free (
CMatchFinder *p,
ISzAllocPtr alloc
);
void
MatchFinder_Normalize3 (
UInt32 subValue,
CLzRef *items,
size_t numItems
);
void
MatchFinder_ReduceOffsets (
CMatchFinder *p,
UInt32 subValue
);
UInt32 *
GetMatchesSpec1 (
UInt32 lenLimit,
UInt32 curMatch,
UInt32 pos,
const Byte *buffer,
CLzRef *son,
UInt32 _cyclicBufferPos,
UInt32 _cyclicBufferSize,
UInt32 _cutValue,
UInt32 *distances,
UInt32 maxLen
);
/*
Conditions:
Mf_GetNumAvailableBytes_Func must be called before each Mf_GetMatchLen_Func.
Mf_GetPointerToCurrentPos_Func's result must be used only before any other function
*/
typedef void (*Mf_Init_Func)(
void *object
);
typedef UInt32 (*Mf_GetNumAvailableBytes_Func)(
void *object
);
typedef const Byte * (*Mf_GetPointerToCurrentPos_Func)(
void *object
);
typedef UInt32 (*Mf_GetMatches_Func)(
void *object,
UInt32 *distances
);
typedef void (*Mf_Skip_Func)(
void *object,
UInt32
);
typedef struct _IMatchFinder {
Mf_Init_Func Init;
Mf_GetNumAvailableBytes_Func GetNumAvailableBytes;
Mf_GetPointerToCurrentPos_Func GetPointerToCurrentPos;
Mf_GetMatches_Func GetMatches;
Mf_Skip_Func Skip;
} IMatchFinder;
void
MatchFinder_CreateVTable (
CMatchFinder *p,
IMatchFinder *vTable
);
void
MatchFinder_Init_LowHash (
CMatchFinder *p
);
void
MatchFinder_Init_HighHash (
CMatchFinder *p
);
void
MatchFinder_Init_3 (
CMatchFinder *p,
int readData
);
void
MatchFinder_Init (
CMatchFinder *p
);
UInt32
Bt3Zip_MatchFinder_GetMatches (
CMatchFinder *p,
UInt32 *distances
);
UInt32
Hc3Zip_MatchFinder_GetMatches (
CMatchFinder *p,
UInt32 *distances
);
void
Bt3Zip_MatchFinder_Skip (
CMatchFinder *p,
UInt32 num
);
void
Hc3Zip_MatchFinder_Skip (
CMatchFinder *p,
UInt32 num
);
EXTERN_C_END
#endif
|