ruby-lzma 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +6 -0
- data/README.markdown +15 -0
- data/Rakefile +53 -0
- data/VERSION +1 -0
- data/ext/Alloc.cpp +118 -0
- data/ext/Alloc.h +29 -0
- data/ext/BinTree.h +55 -0
- data/ext/BinTree2.h +12 -0
- data/ext/BinTree3.h +16 -0
- data/ext/BinTree3Z.h +16 -0
- data/ext/BinTree4.h +18 -0
- data/ext/BinTree4b.h +20 -0
- data/ext/BinTreeMain.h +444 -0
- data/ext/BranchX86.c +101 -0
- data/ext/BranchX86.h +19 -0
- data/ext/CRC.cpp +61 -0
- data/ext/CRC.h +36 -0
- data/ext/C_FileIO.h +45 -0
- data/ext/CommandLineParser.h +82 -0
- data/ext/Defs.h +20 -0
- data/ext/FileStreams.h +98 -0
- data/ext/HC.h +55 -0
- data/ext/HC2.h +13 -0
- data/ext/HC3.h +17 -0
- data/ext/HC4.h +19 -0
- data/ext/HC4b.h +21 -0
- data/ext/HCMain.h +350 -0
- data/ext/ICoder.h +156 -0
- data/ext/IMatchFinder.h +63 -0
- data/ext/IStream.h +62 -0
- data/ext/InBuffer.cpp +80 -0
- data/ext/InBuffer.h +76 -0
- data/ext/LZInWindow.cpp +102 -0
- data/ext/LZInWindow.h +84 -0
- data/ext/LZMA.h +82 -0
- data/ext/LZMADecoder.h +248 -0
- data/ext/LZMAEncoder.cpp +1504 -0
- data/ext/LZMAEncoder.h +416 -0
- data/ext/LZOutWindow.cpp +17 -0
- data/ext/LZOutWindow.h +66 -0
- data/ext/LzmaBench.h +11 -0
- data/ext/LzmaDecode.c +588 -0
- data/ext/LzmaDecode.h +131 -0
- data/ext/LzmaRam.cpp +228 -0
- data/ext/LzmaRam.h +46 -0
- data/ext/LzmaRamDecode.c +79 -0
- data/ext/LzmaRamDecode.h +55 -0
- data/ext/MyCom.h +203 -0
- data/ext/MyGuidDef.h +54 -0
- data/ext/MyInitGuid.h +13 -0
- data/ext/MyString.h +631 -0
- data/ext/MyUnknown.h +24 -0
- data/ext/MyWindows.h +183 -0
- data/ext/OutBuffer.cpp +117 -0
- data/ext/OutBuffer.h +64 -0
- data/ext/Pat.h +318 -0
- data/ext/Pat2.h +22 -0
- data/ext/Pat2H.h +24 -0
- data/ext/Pat2R.h +20 -0
- data/ext/Pat3H.h +24 -0
- data/ext/Pat4H.h +24 -0
- data/ext/PatMain.h +989 -0
- data/ext/RangeCoder.h +205 -0
- data/ext/RangeCoderBit.cpp +80 -0
- data/ext/RangeCoderBit.h +120 -0
- data/ext/RangeCoderBitTree.h +161 -0
- data/ext/RangeCoderOpt.h +31 -0
- data/ext/StdAfx.h +8 -0
- data/ext/StreamUtils.cpp +44 -0
- data/ext/StreamUtils.h +11 -0
- data/ext/StringConvert.h +71 -0
- data/ext/StringToInt.h +17 -0
- data/ext/Types.h +19 -0
- data/ext/Vector.h +211 -0
- data/ext/extconf.rb +7 -0
- data/ext/lzma_ruby.cpp +51 -0
- data/ext/lzmalib.h +64 -0
- data/ext/mylib.cpp +81 -0
- data/java/SevenZip/CRC.java +52 -0
- data/java/SevenZip/Compression/LZ/BinTree.java +382 -0
- data/java/SevenZip/Compression/LZ/InWindow.java +131 -0
- data/java/SevenZip/Compression/LZ/OutWindow.java +85 -0
- data/java/SevenZip/Compression/LZMA/Base.java +88 -0
- data/java/SevenZip/Compression/LZMA/Decoder.java +329 -0
- data/java/SevenZip/Compression/LZMA/Encoder.java +1415 -0
- data/java/SevenZip/Compression/RangeCoder/BitTreeDecoder.java +55 -0
- data/java/SevenZip/Compression/RangeCoder/BitTreeEncoder.java +99 -0
- data/java/SevenZip/Compression/RangeCoder/Decoder.java +88 -0
- data/java/SevenZip/Compression/RangeCoder/Encoder.java +151 -0
- data/java/SevenZip/ICodeProgress.java +6 -0
- data/java/SevenZip/LzmaAlone.java +253 -0
- data/java/SevenZip/LzmaBench.java +391 -0
- data/java/com/ephemeronindustries/lzma/LZMA.java +104 -0
- data/lib/lzma.rb +32 -0
- data/ruby-lzma.gemspec +136 -0
- data/test/test_lzma.rb +42 -0
- metadata +157 -0
data/ext/MyUnknown.h
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
// MyUnknown.h
|
2
|
+
|
3
|
+
#ifndef __MYUNKNOWN_H
|
4
|
+
#define __MYUNKNOWN_H
|
5
|
+
|
6
|
+
#ifdef _WIN32
|
7
|
+
|
8
|
+
#ifdef _WIN32_WCE
|
9
|
+
#if (_WIN32_WCE > 300)
|
10
|
+
#include <basetyps.h>
|
11
|
+
#else
|
12
|
+
#define MIDL_INTERFACE(x) struct
|
13
|
+
#endif
|
14
|
+
#else
|
15
|
+
#include <basetyps.h>
|
16
|
+
#endif
|
17
|
+
|
18
|
+
#include <unknwn.h>
|
19
|
+
|
20
|
+
#else
|
21
|
+
#include "MyWindows.h"
|
22
|
+
#endif
|
23
|
+
|
24
|
+
#endif
|
data/ext/MyWindows.h
ADDED
@@ -0,0 +1,183 @@
|
|
1
|
+
// MyWindows.h
|
2
|
+
|
3
|
+
#ifndef __MYWINDOWS_H
|
4
|
+
#define __MYWINDOWS_H
|
5
|
+
|
6
|
+
#ifdef _WIN32
|
7
|
+
|
8
|
+
#include <windows.h>
|
9
|
+
|
10
|
+
#else
|
11
|
+
|
12
|
+
#include <stddef.h> // for wchar_t
|
13
|
+
#include <string.h>
|
14
|
+
|
15
|
+
#include "MyGuidDef.h"
|
16
|
+
|
17
|
+
typedef char CHAR;
|
18
|
+
typedef unsigned char UCHAR;
|
19
|
+
typedef unsigned char BYTE;
|
20
|
+
|
21
|
+
typedef short SHORT;
|
22
|
+
typedef unsigned short USHORT;
|
23
|
+
typedef unsigned short WORD;
|
24
|
+
typedef short VARIANT_BOOL;
|
25
|
+
|
26
|
+
typedef int INT;
|
27
|
+
typedef Int32 INT32;
|
28
|
+
typedef unsigned int UINT;
|
29
|
+
typedef UInt32 UINT32;
|
30
|
+
typedef INT32 LONG; // LONG, ULONG and DWORD must be 32-bit
|
31
|
+
typedef UINT32 ULONG;
|
32
|
+
typedef UINT32 DWORD;
|
33
|
+
|
34
|
+
typedef Int64 LONGLONG;
|
35
|
+
typedef UInt64 ULONGLONG;
|
36
|
+
|
37
|
+
typedef struct LARGE_INTEGER { LONGLONG QuadPart; }LARGE_INTEGER;
|
38
|
+
typedef struct _ULARGE_INTEGER { ULONGLONG QuadPart;} ULARGE_INTEGER;
|
39
|
+
|
40
|
+
typedef const CHAR *LPCSTR;
|
41
|
+
typedef CHAR TCHAR;
|
42
|
+
typedef const TCHAR *LPCTSTR;
|
43
|
+
typedef wchar_t WCHAR;
|
44
|
+
typedef WCHAR OLECHAR;
|
45
|
+
typedef const WCHAR *LPCWSTR;
|
46
|
+
typedef OLECHAR *BSTR;
|
47
|
+
typedef const OLECHAR *LPCOLESTR;
|
48
|
+
typedef OLECHAR *LPOLESTR;
|
49
|
+
|
50
|
+
typedef struct _FILETIME
|
51
|
+
{
|
52
|
+
DWORD dwLowDateTime;
|
53
|
+
DWORD dwHighDateTime;
|
54
|
+
}FILETIME;
|
55
|
+
|
56
|
+
#define HRESULT LONG
|
57
|
+
#define FAILED(Status) ((HRESULT)(Status)<0)
|
58
|
+
typedef ULONG PROPID;
|
59
|
+
typedef LONG SCODE;
|
60
|
+
|
61
|
+
#define S_OK ((HRESULT)0x00000000L)
|
62
|
+
#define S_FALSE ((HRESULT)0x00000001L)
|
63
|
+
#define E_NOINTERFACE ((HRESULT)0x80004002L)
|
64
|
+
#define E_ABORT ((HRESULT)0x80004004L)
|
65
|
+
#define E_FAIL ((HRESULT)0x80004005L)
|
66
|
+
#define STG_E_INVALIDFUNCTION ((HRESULT)0x80030001L)
|
67
|
+
#define E_OUTOFMEMORY ((HRESULT)0x8007000EL)
|
68
|
+
#define E_INVALIDARG ((HRESULT)0x80070057L)
|
69
|
+
|
70
|
+
#ifdef _MSC_VER
|
71
|
+
#define STDMETHODCALLTYPE __stdcall
|
72
|
+
#else
|
73
|
+
#define STDMETHODCALLTYPE
|
74
|
+
#endif
|
75
|
+
|
76
|
+
#define STDMETHOD_(t, f) virtual t STDMETHODCALLTYPE f
|
77
|
+
#define STDMETHOD(f) STDMETHOD_(HRESULT, f)
|
78
|
+
#define STDMETHODIMP_(type) type STDMETHODCALLTYPE
|
79
|
+
#define STDMETHODIMP STDMETHODIMP_(HRESULT)
|
80
|
+
|
81
|
+
#define PURE = 0
|
82
|
+
|
83
|
+
#define MIDL_INTERFACE(x) struct
|
84
|
+
|
85
|
+
struct IUnknown
|
86
|
+
{
|
87
|
+
STDMETHOD(QueryInterface) (REFIID iid, void **outObject) PURE;
|
88
|
+
STDMETHOD_(ULONG, AddRef)() PURE;
|
89
|
+
STDMETHOD_(ULONG, Release)() PURE;
|
90
|
+
};
|
91
|
+
|
92
|
+
typedef IUnknown *LPUNKNOWN;
|
93
|
+
|
94
|
+
#define VARIANT_TRUE ((VARIANT_BOOL)-1)
|
95
|
+
#define VARIANT_FALSE ((VARIANT_BOOL)0)
|
96
|
+
|
97
|
+
enum VARENUM
|
98
|
+
{
|
99
|
+
VT_EMPTY = 0,
|
100
|
+
VT_NULL = 1,
|
101
|
+
VT_I2 = 2,
|
102
|
+
VT_I4 = 3,
|
103
|
+
VT_R4 = 4,
|
104
|
+
VT_R8 = 5,
|
105
|
+
VT_CY = 6,
|
106
|
+
VT_DATE = 7,
|
107
|
+
VT_BSTR = 8,
|
108
|
+
VT_DISPATCH = 9,
|
109
|
+
VT_ERROR = 10,
|
110
|
+
VT_BOOL = 11,
|
111
|
+
VT_VARIANT = 12,
|
112
|
+
VT_UNKNOWN = 13,
|
113
|
+
VT_DECIMAL = 14,
|
114
|
+
VT_I1 = 16,
|
115
|
+
VT_UI1 = 17,
|
116
|
+
VT_UI2 = 18,
|
117
|
+
VT_UI4 = 19,
|
118
|
+
VT_I8 = 20,
|
119
|
+
VT_UI8 = 21,
|
120
|
+
VT_INT = 22,
|
121
|
+
VT_UINT = 23,
|
122
|
+
VT_VOID = 24,
|
123
|
+
VT_HRESULT = 25,
|
124
|
+
VT_FILETIME = 64
|
125
|
+
};
|
126
|
+
|
127
|
+
typedef unsigned short VARTYPE;
|
128
|
+
typedef WORD PROPVAR_PAD1;
|
129
|
+
typedef WORD PROPVAR_PAD2;
|
130
|
+
typedef WORD PROPVAR_PAD3;
|
131
|
+
|
132
|
+
typedef struct tagPROPVARIANT
|
133
|
+
{
|
134
|
+
VARTYPE vt;
|
135
|
+
PROPVAR_PAD1 wReserved1;
|
136
|
+
PROPVAR_PAD2 wReserved2;
|
137
|
+
PROPVAR_PAD3 wReserved3;
|
138
|
+
union
|
139
|
+
{
|
140
|
+
CHAR cVal;
|
141
|
+
UCHAR bVal;
|
142
|
+
SHORT iVal;
|
143
|
+
USHORT uiVal;
|
144
|
+
LONG lVal;
|
145
|
+
ULONG ulVal;
|
146
|
+
INT intVal;
|
147
|
+
UINT uintVal;
|
148
|
+
LARGE_INTEGER hVal;
|
149
|
+
ULARGE_INTEGER uhVal;
|
150
|
+
VARIANT_BOOL boolVal;
|
151
|
+
SCODE scode;
|
152
|
+
FILETIME filetime;
|
153
|
+
BSTR bstrVal;
|
154
|
+
};
|
155
|
+
} PROPVARIANT;
|
156
|
+
|
157
|
+
typedef PROPVARIANT tagVARIANT;
|
158
|
+
typedef tagVARIANT VARIANT;
|
159
|
+
typedef VARIANT VARIANTARG;
|
160
|
+
|
161
|
+
MY_EXTERN_C BSTR SysAllocStringByteLen(LPCSTR psz, UINT len);
|
162
|
+
MY_EXTERN_C BSTR SysAllocString(const OLECHAR *sz);
|
163
|
+
MY_EXTERN_C void SysFreeString(BSTR bstr);
|
164
|
+
MY_EXTERN_C UINT SysStringByteLen(BSTR bstr);
|
165
|
+
MY_EXTERN_C UINT SysStringLen(BSTR bstr);
|
166
|
+
|
167
|
+
MY_EXTERN_C DWORD GetLastError();
|
168
|
+
MY_EXTERN_C HRESULT VariantClear(VARIANTARG *prop);
|
169
|
+
MY_EXTERN_C HRESULT VariantCopy(VARIANTARG *dest, VARIANTARG *src);
|
170
|
+
MY_EXTERN_C LONG CompareFileTime(const FILETIME* ft1, const FILETIME* ft2);
|
171
|
+
|
172
|
+
#define CP_ACP 0
|
173
|
+
#define CP_OEMCP 1
|
174
|
+
|
175
|
+
typedef enum tagSTREAM_SEEK
|
176
|
+
{
|
177
|
+
STREAM_SEEK_SET = 0,
|
178
|
+
STREAM_SEEK_CUR = 1,
|
179
|
+
STREAM_SEEK_END = 2
|
180
|
+
} STREAM_SEEK;
|
181
|
+
|
182
|
+
#endif
|
183
|
+
#endif
|
data/ext/OutBuffer.cpp
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
// OutByte.cpp
|
2
|
+
|
3
|
+
#include "StdAfx.h"
|
4
|
+
|
5
|
+
#include "OutBuffer.h"
|
6
|
+
|
7
|
+
#include "Alloc.h"
|
8
|
+
|
9
|
+
bool COutBuffer::Create(UInt32 bufferSize)
|
10
|
+
{
|
11
|
+
const UInt32 kMinBlockSize = 1;
|
12
|
+
if (bufferSize < kMinBlockSize)
|
13
|
+
bufferSize = kMinBlockSize;
|
14
|
+
if (_buffer != 0 && _bufferSize == bufferSize)
|
15
|
+
return true;
|
16
|
+
Free();
|
17
|
+
_bufferSize = bufferSize;
|
18
|
+
_buffer = (Byte *)::MidAlloc(bufferSize);
|
19
|
+
return (_buffer != 0);
|
20
|
+
}
|
21
|
+
|
22
|
+
void COutBuffer::Free()
|
23
|
+
{
|
24
|
+
::MidFree(_buffer);
|
25
|
+
_buffer = 0;
|
26
|
+
}
|
27
|
+
|
28
|
+
void COutBuffer::SetStream(ISequentialOutStream *stream)
|
29
|
+
{
|
30
|
+
_stream = stream;
|
31
|
+
}
|
32
|
+
|
33
|
+
void COutBuffer::Init()
|
34
|
+
{
|
35
|
+
_streamPos = 0;
|
36
|
+
_limitPos = _bufferSize;
|
37
|
+
_pos = 0;
|
38
|
+
_processedSize = 0;
|
39
|
+
_overDict = false;
|
40
|
+
#ifdef _NO_EXCEPTIONS
|
41
|
+
ErrorCode = S_OK;
|
42
|
+
#endif
|
43
|
+
}
|
44
|
+
|
45
|
+
UInt64 COutBuffer::GetProcessedSize() const
|
46
|
+
{
|
47
|
+
UInt64 res = _processedSize + _pos - _streamPos;
|
48
|
+
if (_streamPos > _pos)
|
49
|
+
res += _bufferSize;
|
50
|
+
return res;
|
51
|
+
}
|
52
|
+
|
53
|
+
|
54
|
+
HRESULT COutBuffer::FlushPart()
|
55
|
+
{
|
56
|
+
// _streamPos < _bufferSize
|
57
|
+
UInt32 size = (_streamPos >= _pos) ? (_bufferSize - _streamPos) : (_pos - _streamPos);
|
58
|
+
HRESULT result = S_OK;
|
59
|
+
#ifdef _NO_EXCEPTIONS
|
60
|
+
if (ErrorCode != S_OK)
|
61
|
+
result = ErrorCode;
|
62
|
+
#endif
|
63
|
+
if (_buffer2 != 0)
|
64
|
+
{
|
65
|
+
memmove(_buffer2, _buffer + _streamPos, size);
|
66
|
+
_buffer2 += size;
|
67
|
+
}
|
68
|
+
|
69
|
+
if (_stream != 0
|
70
|
+
#ifdef _NO_EXCEPTIONS
|
71
|
+
&& (ErrorCode != S_OK)
|
72
|
+
#endif
|
73
|
+
)
|
74
|
+
{
|
75
|
+
UInt32 processedSize = 0;
|
76
|
+
result = _stream->Write(_buffer + _streamPos, size, &processedSize);
|
77
|
+
size = processedSize;
|
78
|
+
}
|
79
|
+
_streamPos += size;
|
80
|
+
if (_streamPos == _bufferSize)
|
81
|
+
_streamPos = 0;
|
82
|
+
if (_pos == _bufferSize)
|
83
|
+
{
|
84
|
+
_overDict = true;
|
85
|
+
_pos = 0;
|
86
|
+
}
|
87
|
+
_limitPos = (_streamPos > _pos) ? _streamPos : _bufferSize;
|
88
|
+
_processedSize += size;
|
89
|
+
return result;
|
90
|
+
}
|
91
|
+
|
92
|
+
HRESULT COutBuffer::Flush()
|
93
|
+
{
|
94
|
+
#ifdef _NO_EXCEPTIONS
|
95
|
+
if (ErrorCode != S_OK)
|
96
|
+
return ErrorCode;
|
97
|
+
#endif
|
98
|
+
|
99
|
+
while(_streamPos != _pos)
|
100
|
+
{
|
101
|
+
HRESULT result = FlushPart();
|
102
|
+
if (result != S_OK)
|
103
|
+
return result;
|
104
|
+
}
|
105
|
+
return S_OK;
|
106
|
+
}
|
107
|
+
|
108
|
+
void COutBuffer::FlushWithCheck()
|
109
|
+
{
|
110
|
+
HRESULT result = FlushPart();
|
111
|
+
#ifdef _NO_EXCEPTIONS
|
112
|
+
ErrorCode = result;
|
113
|
+
#else
|
114
|
+
if (result != S_OK)
|
115
|
+
throw COutBufferException(result);
|
116
|
+
#endif
|
117
|
+
}
|
data/ext/OutBuffer.h
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
// OutBuffer.h
|
2
|
+
|
3
|
+
#ifndef __OUTBUFFER_H
|
4
|
+
#define __OUTBUFFER_H
|
5
|
+
|
6
|
+
#include "IStream.h"
|
7
|
+
#include "MyCom.h"
|
8
|
+
|
9
|
+
#ifndef _NO_EXCEPTIONS
|
10
|
+
struct COutBufferException
|
11
|
+
{
|
12
|
+
HRESULT ErrorCode;
|
13
|
+
COutBufferException(HRESULT errorCode): ErrorCode(errorCode) {}
|
14
|
+
};
|
15
|
+
#endif
|
16
|
+
|
17
|
+
class COutBuffer
|
18
|
+
{
|
19
|
+
protected:
|
20
|
+
Byte *_buffer;
|
21
|
+
UInt32 _pos;
|
22
|
+
UInt32 _limitPos;
|
23
|
+
UInt32 _streamPos;
|
24
|
+
UInt32 _bufferSize;
|
25
|
+
CMyComPtr<ISequentialOutStream> _stream;
|
26
|
+
UInt64 _processedSize;
|
27
|
+
Byte *_buffer2;
|
28
|
+
bool _overDict;
|
29
|
+
|
30
|
+
HRESULT FlushPart();
|
31
|
+
void FlushWithCheck();
|
32
|
+
public:
|
33
|
+
#ifdef _NO_EXCEPTIONS
|
34
|
+
HRESULT ErrorCode;
|
35
|
+
#endif
|
36
|
+
|
37
|
+
COutBuffer(): _buffer(0), _pos(0), _stream(0), _buffer2(0) {}
|
38
|
+
~COutBuffer() { Free(); }
|
39
|
+
|
40
|
+
bool Create(UInt32 bufferSize);
|
41
|
+
void Free();
|
42
|
+
|
43
|
+
void SetMemStream(Byte *buffer) { _buffer2 = buffer; }
|
44
|
+
void SetStream(ISequentialOutStream *stream);
|
45
|
+
void Init();
|
46
|
+
HRESULT Flush();
|
47
|
+
void ReleaseStream() { _stream.Release(); }
|
48
|
+
|
49
|
+
void WriteByte(Byte b)
|
50
|
+
{
|
51
|
+
_buffer[_pos++] = b;
|
52
|
+
if(_pos == _limitPos)
|
53
|
+
FlushWithCheck();
|
54
|
+
}
|
55
|
+
void WriteBytes(const void *data, size_t size)
|
56
|
+
{
|
57
|
+
for (size_t i = 0; i < size; i++)
|
58
|
+
WriteByte(((const Byte *)data)[i]);
|
59
|
+
}
|
60
|
+
|
61
|
+
UInt64 GetProcessedSize() const;
|
62
|
+
};
|
63
|
+
|
64
|
+
#endif
|
data/ext/Pat.h
ADDED
@@ -0,0 +1,318 @@
|
|
1
|
+
// Pat.h
|
2
|
+
|
3
|
+
// #ifndef __PATRICIA__H
|
4
|
+
// #define __PATRICIA__H
|
5
|
+
|
6
|
+
#include "MyCom.h"
|
7
|
+
#include "Types.h"
|
8
|
+
#include "LZInWindow.h"
|
9
|
+
|
10
|
+
namespace PAT_NAMESPACE {
|
11
|
+
|
12
|
+
struct CNode;
|
13
|
+
|
14
|
+
typedef CNode *CNodePointer;
|
15
|
+
|
16
|
+
// #define __AUTO_REMOVE
|
17
|
+
|
18
|
+
// #define __NODE_4_BITS
|
19
|
+
// #define __NODE_3_BITS
|
20
|
+
// #define __NODE_2_BITS
|
21
|
+
// #define __NODE_2_BITS_PADDING
|
22
|
+
|
23
|
+
// #define __HASH_3
|
24
|
+
|
25
|
+
|
26
|
+
typedef UInt32 CIndex;
|
27
|
+
|
28
|
+
#ifdef __NODE_4_BITS
|
29
|
+
typedef UInt32 CIndex2;
|
30
|
+
typedef UInt32 CSameBitsType;
|
31
|
+
#else
|
32
|
+
#ifdef __NODE_3_BITS
|
33
|
+
typedef UInt32 CIndex2;
|
34
|
+
typedef UInt32 CSameBitsType;
|
35
|
+
#else
|
36
|
+
|
37
|
+
typedef UInt32 CIndex;
|
38
|
+
typedef UInt32 CSameBitsType;
|
39
|
+
|
40
|
+
typedef CIndex CIndex2;
|
41
|
+
#endif
|
42
|
+
#endif
|
43
|
+
|
44
|
+
const UInt32 kNumBitsInIndex = sizeof(CIndex) * 8;
|
45
|
+
const UInt32 kMatchStartValue = UInt32(1) << (kNumBitsInIndex - 1);
|
46
|
+
// don't change kMatchStartValue definition, since it is used in
|
47
|
+
// PatMain.h:
|
48
|
+
|
49
|
+
typedef CIndex CMatchPointer;
|
50
|
+
|
51
|
+
const UInt32 kDescendantEmptyValue = kMatchStartValue - 1;
|
52
|
+
|
53
|
+
union CDescendant
|
54
|
+
{
|
55
|
+
CIndex NodePointer;
|
56
|
+
CMatchPointer MatchPointer;
|
57
|
+
bool IsEmpty() const { return NodePointer == kDescendantEmptyValue; }
|
58
|
+
bool IsNode() const { return NodePointer < kDescendantEmptyValue; }
|
59
|
+
bool IsMatch() const { return NodePointer > kDescendantEmptyValue; }
|
60
|
+
void MakeEmpty() { NodePointer = kDescendantEmptyValue; }
|
61
|
+
};
|
62
|
+
|
63
|
+
#undef MY_BYTE_SIZE
|
64
|
+
|
65
|
+
#ifdef __NODE_4_BITS
|
66
|
+
#define MY_BYTE_SIZE 8
|
67
|
+
const UInt32 kNumSubBits = 4;
|
68
|
+
#else
|
69
|
+
#ifdef __NODE_3_BITS
|
70
|
+
#define MY_BYTE_SIZE 9
|
71
|
+
const UInt32 kNumSubBits = 3;
|
72
|
+
#else
|
73
|
+
#define MY_BYTE_SIZE 8
|
74
|
+
#ifdef __NODE_2_BITS
|
75
|
+
const UInt32 kNumSubBits = 2;
|
76
|
+
#else
|
77
|
+
const UInt32 kNumSubBits = 1;
|
78
|
+
#endif
|
79
|
+
#endif
|
80
|
+
#endif
|
81
|
+
|
82
|
+
const UInt32 kNumSubNodes = 1 << kNumSubBits;
|
83
|
+
const UInt32 kSubNodesMask = kNumSubNodes - 1;
|
84
|
+
|
85
|
+
struct CNode
|
86
|
+
{
|
87
|
+
CIndex2 LastMatch;
|
88
|
+
CSameBitsType NumSameBits;
|
89
|
+
union
|
90
|
+
{
|
91
|
+
CDescendant Descendants[kNumSubNodes];
|
92
|
+
UInt32 NextFreeNode;
|
93
|
+
};
|
94
|
+
#ifdef __NODE_2_BITS
|
95
|
+
#ifdef __NODE_2_BITS_PADDING
|
96
|
+
UInt32 Padding[2];
|
97
|
+
#endif
|
98
|
+
#endif
|
99
|
+
};
|
100
|
+
|
101
|
+
#undef kIDNumBitsByte
|
102
|
+
#undef kIDNumBitsString
|
103
|
+
|
104
|
+
#ifdef __NODE_4_BITS
|
105
|
+
#define kIDNumBitsByte 0x30
|
106
|
+
#define kIDNumBitsString TEXT("4")
|
107
|
+
#else
|
108
|
+
#ifdef __NODE_3_BITS
|
109
|
+
#define kIDNumBitsByte 0x20
|
110
|
+
#define kIDNumBitsString TEXT("3")
|
111
|
+
#else
|
112
|
+
#ifdef __NODE_2_BITS
|
113
|
+
#define kIDNumBitsByte 0x10
|
114
|
+
#define kIDNumBitsString TEXT("2")
|
115
|
+
#else
|
116
|
+
#define kIDNumBitsByte 0x00
|
117
|
+
#define kIDNumBitsString TEXT("1")
|
118
|
+
#endif
|
119
|
+
#endif
|
120
|
+
#endif
|
121
|
+
|
122
|
+
#undef kIDManualRemoveByte
|
123
|
+
#undef kIDManualRemoveString
|
124
|
+
|
125
|
+
#ifdef __AUTO_REMOVE
|
126
|
+
#define kIDManualRemoveByte 0x00
|
127
|
+
#define kIDManualRemoveString TEXT("")
|
128
|
+
#else
|
129
|
+
#define kIDManualRemoveByte 0x08
|
130
|
+
#define kIDManualRemoveString TEXT("R")
|
131
|
+
#endif
|
132
|
+
|
133
|
+
#undef kIDHash3Byte
|
134
|
+
#undef kIDHash3String
|
135
|
+
|
136
|
+
#ifdef __HASH_3
|
137
|
+
#define kIDHash3Byte 0x04
|
138
|
+
#define kIDHash3String TEXT("H")
|
139
|
+
#else
|
140
|
+
#define kIDHash3Byte 0x00
|
141
|
+
#define kIDHash3String TEXT("")
|
142
|
+
#endif
|
143
|
+
|
144
|
+
#undef kIDUse3BytesByte
|
145
|
+
#undef kIDUse3BytesString
|
146
|
+
|
147
|
+
#define kIDUse3BytesByte 0x00
|
148
|
+
#define kIDUse3BytesString TEXT("")
|
149
|
+
|
150
|
+
#undef kIDPaddingByte
|
151
|
+
#undef kIDPaddingString
|
152
|
+
|
153
|
+
#ifdef __NODE_2_BITS_PADDING
|
154
|
+
#define kIDPaddingByte 0x01
|
155
|
+
#define kIDPaddingString TEXT("P")
|
156
|
+
#else
|
157
|
+
#define kIDPaddingByte 0x00
|
158
|
+
#define kIDPaddingString TEXT("")
|
159
|
+
#endif
|
160
|
+
|
161
|
+
|
162
|
+
// #undef kIDString
|
163
|
+
// #define kIDString TEXT("Compress.MatchFinderPat") kIDNumBitsString kIDManualRemoveString kIDUse3BytesString kIDPaddingString kIDHash3String
|
164
|
+
|
165
|
+
// {23170F69-40C1-278C-01XX-0000000000}
|
166
|
+
|
167
|
+
DEFINE_GUID(PAT_CLSID,
|
168
|
+
0x23170F69, 0x40C1, 0x278C, 0x01,
|
169
|
+
kIDNumBitsByte |
|
170
|
+
kIDManualRemoveByte | kIDHash3Byte | kIDUse3BytesByte | kIDPaddingByte,
|
171
|
+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00);
|
172
|
+
|
173
|
+
// III(PAT_NAMESPACE)
|
174
|
+
|
175
|
+
class CPatricia:
|
176
|
+
public IMatchFinder,
|
177
|
+
public IMatchFinderSetCallback,
|
178
|
+
public CMyUnknownImp,
|
179
|
+
CLZInWindow
|
180
|
+
{
|
181
|
+
MY_UNKNOWN_IMP1(IMatchFinderSetCallback)
|
182
|
+
|
183
|
+
STDMETHOD(Init)(ISequentialInStream *aStream);
|
184
|
+
STDMETHOD_(void, ReleaseStream)();
|
185
|
+
STDMETHOD(MovePos)();
|
186
|
+
STDMETHOD_(Byte, GetIndexByte)(Int32 index);
|
187
|
+
STDMETHOD_(UInt32, GetMatchLen)(Int32 index, UInt32 back, UInt32 limit);
|
188
|
+
STDMETHOD_(UInt32, GetNumAvailableBytes)();
|
189
|
+
STDMETHOD(Create)(UInt32 historySize,
|
190
|
+
UInt32 keepAddBufferBefore, UInt32 matchMaxLen,
|
191
|
+
UInt32 keepAddBufferAfter);
|
192
|
+
STDMETHOD_(UInt32, GetLongestMatch)(UInt32 *distances);
|
193
|
+
STDMETHOD_(void, DummyLongestMatch)();
|
194
|
+
STDMETHOD_(const Byte *, GetPointerToCurrentPos)();
|
195
|
+
|
196
|
+
void FreeMemory();
|
197
|
+
public:
|
198
|
+
CPatricia();
|
199
|
+
~CPatricia();
|
200
|
+
|
201
|
+
UInt32 _sizeHistory;
|
202
|
+
UInt32 _matchMaxLen;
|
203
|
+
|
204
|
+
CDescendant *m_HashDescendants;
|
205
|
+
#ifdef __HASH_3
|
206
|
+
CDescendant *m_Hash2Descendants;
|
207
|
+
#endif
|
208
|
+
|
209
|
+
CNode *m_Nodes;
|
210
|
+
|
211
|
+
UInt32 m_FreeNode;
|
212
|
+
UInt32 m_FreeNodeMax;
|
213
|
+
|
214
|
+
#ifdef __AUTO_REMOVE
|
215
|
+
UInt32 m_NumUsedNodes;
|
216
|
+
UInt32 m_NumNodes;
|
217
|
+
#else
|
218
|
+
bool m_SpecialRemoveMode;
|
219
|
+
#endif
|
220
|
+
|
221
|
+
bool m_SpecialMode;
|
222
|
+
UInt32 m_NumNotChangedCycles;
|
223
|
+
UInt32 *m_TmpBacks;
|
224
|
+
|
225
|
+
CMyComPtr<IMatchFinderCallback> m_Callback;
|
226
|
+
|
227
|
+
virtual void BeforeMoveBlock();
|
228
|
+
virtual void AfterMoveBlock();
|
229
|
+
|
230
|
+
// IMatchFinderSetCallback
|
231
|
+
STDMETHOD(SetCallback)(IMatchFinderCallback *callback);
|
232
|
+
|
233
|
+
void ChangeLastMatch(UInt32 hashValue);
|
234
|
+
|
235
|
+
#ifdef __AUTO_REMOVE
|
236
|
+
void TestRemoveDescendant(CDescendant &descendant, UInt32 limitPos);
|
237
|
+
void TestRemoveNodes();
|
238
|
+
void RemoveNode(UInt32 index);
|
239
|
+
void TestRemoveAndNormalizeDescendant(CDescendant &descendant,
|
240
|
+
UInt32 limitPos, UInt32 subValue);
|
241
|
+
void TestRemoveNodesAndNormalize();
|
242
|
+
#else
|
243
|
+
void NormalizeDescendant(CDescendant &descendant, UInt32 subValue);
|
244
|
+
void Normalize();
|
245
|
+
void RemoveMatch();
|
246
|
+
#endif
|
247
|
+
private:
|
248
|
+
void AddInternalNode(CNodePointer aNode, CIndex *aNodePointerPointer,
|
249
|
+
Byte aByte, Byte aByteXOR, UInt32 aNumSameBits, UInt32 aPos)
|
250
|
+
{
|
251
|
+
while((aByteXOR & kSubNodesMask) == 0)
|
252
|
+
{
|
253
|
+
aByteXOR >>= kNumSubBits;
|
254
|
+
aByte >>= kNumSubBits;
|
255
|
+
aNumSameBits -= kNumSubBits;
|
256
|
+
}
|
257
|
+
// Insert New Node
|
258
|
+
CNodePointer aNewNode = &m_Nodes[m_FreeNode];
|
259
|
+
UInt32 aNodeIndex = *aNodePointerPointer;
|
260
|
+
*aNodePointerPointer = m_FreeNode;
|
261
|
+
m_FreeNode = aNewNode->NextFreeNode;
|
262
|
+
#ifdef __AUTO_REMOVE
|
263
|
+
m_NumUsedNodes++;
|
264
|
+
#endif
|
265
|
+
if (m_FreeNode > m_FreeNodeMax)
|
266
|
+
{
|
267
|
+
m_FreeNodeMax = m_FreeNode;
|
268
|
+
m_Nodes[m_FreeNode].NextFreeNode = m_FreeNode + 1;
|
269
|
+
}
|
270
|
+
|
271
|
+
UInt32 aBitsNew = aByte & kSubNodesMask;
|
272
|
+
UInt32 aBitsOld = (aByte ^ aByteXOR) & kSubNodesMask;
|
273
|
+
for (UInt32 i = 0; i < kNumSubNodes; i++)
|
274
|
+
aNewNode->Descendants[i].NodePointer = kDescendantEmptyValue;
|
275
|
+
aNewNode->Descendants[aBitsNew].MatchPointer = aPos + kMatchStartValue;
|
276
|
+
aNewNode->Descendants[aBitsOld].NodePointer = aNodeIndex;
|
277
|
+
aNewNode->NumSameBits = CSameBitsType(aNode->NumSameBits - aNumSameBits);
|
278
|
+
aNewNode->LastMatch = aPos;
|
279
|
+
|
280
|
+
aNode->NumSameBits = CSameBitsType(aNumSameBits - kNumSubBits);
|
281
|
+
}
|
282
|
+
|
283
|
+
void AddLeafNode(CNodePointer aNode, Byte aByte, Byte aByteXOR,
|
284
|
+
UInt32 aNumSameBits, UInt32 aPos, UInt32 aDescendantIndex)
|
285
|
+
{
|
286
|
+
for(;(aByteXOR & kSubNodesMask) == 0; aNumSameBits += kNumSubBits)
|
287
|
+
{
|
288
|
+
aByte >>= kNumSubBits;
|
289
|
+
aByteXOR >>= kNumSubBits;
|
290
|
+
}
|
291
|
+
UInt32 aNewNodeIndex = m_FreeNode;
|
292
|
+
CNodePointer aNewNode = &m_Nodes[m_FreeNode];
|
293
|
+
m_FreeNode = aNewNode->NextFreeNode;
|
294
|
+
#ifdef __AUTO_REMOVE
|
295
|
+
m_NumUsedNodes++;
|
296
|
+
#endif
|
297
|
+
if (m_FreeNode > m_FreeNodeMax)
|
298
|
+
{
|
299
|
+
m_FreeNodeMax = m_FreeNode;
|
300
|
+
m_Nodes[m_FreeNode].NextFreeNode = m_FreeNode + 1;
|
301
|
+
}
|
302
|
+
|
303
|
+
UInt32 aBitsNew = (aByte & kSubNodesMask);
|
304
|
+
UInt32 aBitsOld = (aByte ^ aByteXOR) & kSubNodesMask;
|
305
|
+
for (UInt32 i = 0; i < kNumSubNodes; i++)
|
306
|
+
aNewNode->Descendants[i].NodePointer = kDescendantEmptyValue;
|
307
|
+
aNewNode->Descendants[aBitsNew].MatchPointer = aPos + kMatchStartValue;
|
308
|
+
aNewNode->Descendants[aBitsOld].MatchPointer =
|
309
|
+
aNode->Descendants[aDescendantIndex].MatchPointer;
|
310
|
+
aNewNode->NumSameBits = CSameBitsType(aNumSameBits);
|
311
|
+
aNewNode->LastMatch = aPos;
|
312
|
+
aNode->Descendants[aDescendantIndex].NodePointer = aNewNodeIndex;
|
313
|
+
}
|
314
|
+
};
|
315
|
+
|
316
|
+
}
|
317
|
+
|
318
|
+
// #endif
|