summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg/Library/LzmaCustomDecompressLib/Sdk/C/LzFind.h
blob: 923d3e3d95f231b20dfb11f4481b6029208bc7e2 (plain)
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