ruby-lzma 0.4.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.
- 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/ICoder.h
ADDED
@@ -0,0 +1,156 @@
|
|
1
|
+
// ICoder.h
|
2
|
+
|
3
|
+
#ifndef __ICODER_H
|
4
|
+
#define __ICODER_H
|
5
|
+
|
6
|
+
#include "IStream.h"
|
7
|
+
|
8
|
+
// "23170F69-40C1-278A-0000-000400xx0000"
|
9
|
+
#define CODER_INTERFACE(i, x) \
|
10
|
+
DEFINE_GUID(IID_ ## i, \
|
11
|
+
0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x04, 0x00, x, 0x00, 0x00); \
|
12
|
+
struct i: public IUnknown
|
13
|
+
|
14
|
+
CODER_INTERFACE(ICompressProgressInfo, 0x04)
|
15
|
+
{
|
16
|
+
STDMETHOD(SetRatioInfo)(const UInt64 *inSize, const UInt64 *outSize) PURE;
|
17
|
+
};
|
18
|
+
|
19
|
+
CODER_INTERFACE(ICompressCoder, 0x05)
|
20
|
+
{
|
21
|
+
STDMETHOD(Code)(ISequentialInStream *inStream,
|
22
|
+
ISequentialOutStream *outStream,
|
23
|
+
const UInt64 *inSize,
|
24
|
+
const UInt64 *outSize,
|
25
|
+
ICompressProgressInfo *progress) PURE;
|
26
|
+
};
|
27
|
+
|
28
|
+
CODER_INTERFACE(ICompressCoder2, 0x18)
|
29
|
+
{
|
30
|
+
STDMETHOD(Code)(ISequentialInStream **inStreams,
|
31
|
+
const UInt64 **inSizes,
|
32
|
+
UInt32 numInStreams,
|
33
|
+
ISequentialOutStream **outStreams,
|
34
|
+
const UInt64 **outSizes,
|
35
|
+
UInt32 numOutStreams,
|
36
|
+
ICompressProgressInfo *progress) PURE;
|
37
|
+
};
|
38
|
+
|
39
|
+
namespace NCoderPropID
|
40
|
+
{
|
41
|
+
enum EEnum
|
42
|
+
{
|
43
|
+
kDictionarySize = 0x400,
|
44
|
+
kUsedMemorySize,
|
45
|
+
kOrder,
|
46
|
+
kPosStateBits = 0x440,
|
47
|
+
kLitContextBits,
|
48
|
+
kLitPosBits,
|
49
|
+
kNumFastBytes = 0x450,
|
50
|
+
kMatchFinder,
|
51
|
+
kNumPasses = 0x460,
|
52
|
+
kAlgorithm = 0x470,
|
53
|
+
kMultiThread = 0x480,
|
54
|
+
kEndMarker = 0x490
|
55
|
+
};
|
56
|
+
}
|
57
|
+
|
58
|
+
CODER_INTERFACE(ICompressSetCoderProperties, 0x20)
|
59
|
+
{
|
60
|
+
STDMETHOD(SetCoderProperties)(const PROPID *propIDs,
|
61
|
+
const PROPVARIANT *properties, UInt32 numProperties) PURE;
|
62
|
+
};
|
63
|
+
|
64
|
+
/*
|
65
|
+
CODER_INTERFACE(ICompressSetCoderProperties, 0x21)
|
66
|
+
{
|
67
|
+
STDMETHOD(SetDecoderProperties)(ISequentialInStream *inStream) PURE;
|
68
|
+
};
|
69
|
+
*/
|
70
|
+
|
71
|
+
CODER_INTERFACE(ICompressSetDecoderProperties2, 0x22)
|
72
|
+
{
|
73
|
+
STDMETHOD(SetDecoderProperties2)(const Byte *data, UInt32 size) PURE;
|
74
|
+
};
|
75
|
+
|
76
|
+
CODER_INTERFACE(ICompressWriteCoderProperties, 0x23)
|
77
|
+
{
|
78
|
+
STDMETHOD(WriteCoderProperties)(ISequentialOutStream *outStreams) PURE;
|
79
|
+
};
|
80
|
+
|
81
|
+
CODER_INTERFACE(ICompressGetInStreamProcessedSize, 0x24)
|
82
|
+
{
|
83
|
+
STDMETHOD(GetInStreamProcessedSize)(UInt64 *value) PURE;
|
84
|
+
};
|
85
|
+
|
86
|
+
CODER_INTERFACE(ICompressGetSubStreamSize, 0x30)
|
87
|
+
{
|
88
|
+
STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value) PURE;
|
89
|
+
};
|
90
|
+
|
91
|
+
CODER_INTERFACE(ICompressSetInStream, 0x31)
|
92
|
+
{
|
93
|
+
STDMETHOD(SetInStream)(ISequentialInStream *inStream) PURE;
|
94
|
+
STDMETHOD(ReleaseInStream)() PURE;
|
95
|
+
};
|
96
|
+
|
97
|
+
CODER_INTERFACE(ICompressSetOutStream, 0x32)
|
98
|
+
{
|
99
|
+
STDMETHOD(SetOutStream)(ISequentialOutStream *outStream) PURE;
|
100
|
+
STDMETHOD(ReleaseOutStream)() PURE;
|
101
|
+
};
|
102
|
+
|
103
|
+
CODER_INTERFACE(ICompressSetInStreamSize, 0x33)
|
104
|
+
{
|
105
|
+
STDMETHOD(SetInStreamSize)(const UInt64 *inSize) PURE;
|
106
|
+
};
|
107
|
+
|
108
|
+
CODER_INTERFACE(ICompressSetOutStreamSize, 0x34)
|
109
|
+
{
|
110
|
+
STDMETHOD(SetOutStreamSize)(const UInt64 *outSize) PURE;
|
111
|
+
};
|
112
|
+
|
113
|
+
CODER_INTERFACE(ICompressFilter, 0x40)
|
114
|
+
{
|
115
|
+
STDMETHOD(Init)() PURE;
|
116
|
+
STDMETHOD_(UInt32, Filter)(Byte *data, UInt32 size) PURE;
|
117
|
+
// Filter return outSize (UInt32)
|
118
|
+
// if (outSize <= size): Filter have converted outSize bytes
|
119
|
+
// if (outSize > size): Filter have not converted anything.
|
120
|
+
// and it needs at least outSize bytes to convert one block
|
121
|
+
// (it's for crypto block algorithms).
|
122
|
+
};
|
123
|
+
|
124
|
+
CODER_INTERFACE(ICryptoProperties, 0x80)
|
125
|
+
{
|
126
|
+
STDMETHOD(SetKey)(const Byte *data, UInt32 size) PURE;
|
127
|
+
STDMETHOD(SetInitVector)(const Byte *data, UInt32 size) PURE;
|
128
|
+
};
|
129
|
+
|
130
|
+
CODER_INTERFACE(ICryptoSetPassword, 0x90)
|
131
|
+
{
|
132
|
+
STDMETHOD(CryptoSetPassword)(const Byte *data, UInt32 size) PURE;
|
133
|
+
};
|
134
|
+
|
135
|
+
CODER_INTERFACE(ICryptoSetCRC, 0xA0)
|
136
|
+
{
|
137
|
+
STDMETHOD(CryptoSetCRC)(UInt32 crc) PURE;
|
138
|
+
};
|
139
|
+
|
140
|
+
//////////////////////
|
141
|
+
// It's for DLL file
|
142
|
+
namespace NMethodPropID
|
143
|
+
{
|
144
|
+
enum EEnum
|
145
|
+
{
|
146
|
+
kID,
|
147
|
+
kName,
|
148
|
+
kDecoder,
|
149
|
+
kEncoder,
|
150
|
+
kInStreams,
|
151
|
+
kOutStreams,
|
152
|
+
kDescription
|
153
|
+
};
|
154
|
+
}
|
155
|
+
|
156
|
+
#endif
|
data/ext/IMatchFinder.h
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
// MatchFinders/IMatchFinder.h
|
2
|
+
|
3
|
+
#ifndef __IMATCHFINDER_H
|
4
|
+
#define __IMATCHFINDER_H
|
5
|
+
|
6
|
+
// {23170F69-40C1-278A-0000-000200010000}
|
7
|
+
DEFINE_GUID(IID_IInWindowStream,
|
8
|
+
0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00);
|
9
|
+
MIDL_INTERFACE("23170F69-40C1-278A-0000-000200010000")
|
10
|
+
IInWindowStream: public IUnknown
|
11
|
+
{
|
12
|
+
STDMETHOD(Init)(ISequentialInStream *inStream) PURE;
|
13
|
+
STDMETHOD_(void, ReleaseStream)() PURE;
|
14
|
+
STDMETHOD(MovePos)() PURE;
|
15
|
+
STDMETHOD_(Byte, GetIndexByte)(Int32 index) PURE;
|
16
|
+
STDMETHOD_(UInt32, GetMatchLen)(Int32 index, UInt32 distance, UInt32 limit) PURE;
|
17
|
+
STDMETHOD_(UInt32, GetNumAvailableBytes)() PURE;
|
18
|
+
STDMETHOD_(const Byte *, GetPointerToCurrentPos)() PURE;
|
19
|
+
};
|
20
|
+
|
21
|
+
// {23170F69-40C1-278A-0000-000200020000}
|
22
|
+
DEFINE_GUID(IID_IMatchFinder,
|
23
|
+
0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00);
|
24
|
+
MIDL_INTERFACE("23170F69-40C1-278A-0000-000200020000")
|
25
|
+
IMatchFinder: public IInWindowStream
|
26
|
+
{
|
27
|
+
STDMETHOD(Create)(UInt32 historySize, UInt32 keepAddBufferBefore,
|
28
|
+
UInt32 matchMaxLen, UInt32 keepAddBufferAfter) PURE;
|
29
|
+
STDMETHOD_(UInt32, GetLongestMatch)(UInt32 *distances) PURE;
|
30
|
+
STDMETHOD_(void, DummyLongestMatch)() PURE;
|
31
|
+
};
|
32
|
+
|
33
|
+
// {23170F69-40C1-278A-0000-000200020100}
|
34
|
+
DEFINE_GUID(IID_IMatchFinderCallback,
|
35
|
+
0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x01, 0x00);
|
36
|
+
MIDL_INTERFACE("23170F69-40C1-278A-0000-000200020100")
|
37
|
+
IMatchFinderCallback: public IUnknown
|
38
|
+
{
|
39
|
+
STDMETHOD(BeforeChangingBufferPos)() PURE;
|
40
|
+
STDMETHOD(AfterChangingBufferPos)() PURE;
|
41
|
+
};
|
42
|
+
|
43
|
+
// {23170F69-40C1-278A-0000-000200020200}
|
44
|
+
DEFINE_GUID(IID_IMatchFinderSetCallback,
|
45
|
+
0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00);
|
46
|
+
MIDL_INTERFACE("23170F69-40C1-278A-0000-000200020200")
|
47
|
+
IMatchFinderSetCallback: public IUnknown
|
48
|
+
{
|
49
|
+
STDMETHOD(SetCallback)(IMatchFinderCallback *callback) PURE;
|
50
|
+
};
|
51
|
+
|
52
|
+
/*
|
53
|
+
// {23170F69-40C1-278A-0000-000200030000}
|
54
|
+
DEFINE_GUID(IID_IInitMatchFinder,
|
55
|
+
0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00);
|
56
|
+
MIDL_INTERFACE("23170F69-40C1-278A-0000-000200030000")
|
57
|
+
IMatchFinderInit: public IUnknown
|
58
|
+
{
|
59
|
+
STDMETHOD(InitMatchFinder)(IMatchFinder *matchFinder) PURE;
|
60
|
+
};
|
61
|
+
*/
|
62
|
+
|
63
|
+
#endif
|
data/ext/IStream.h
ADDED
@@ -0,0 +1,62 @@
|
|
1
|
+
// IStream.h
|
2
|
+
|
3
|
+
#ifndef __ISTREAM_H
|
4
|
+
#define __ISTREAM_H
|
5
|
+
|
6
|
+
#include "MyUnknown.h"
|
7
|
+
#include "Types.h"
|
8
|
+
|
9
|
+
// "23170F69-40C1-278A-0000-000300xx0000"
|
10
|
+
|
11
|
+
#define STREAM_INTERFACE_SUB(i, b, x) \
|
12
|
+
DEFINE_GUID(IID_ ## i, \
|
13
|
+
0x23170F69, 0x40C1, 0x278A, 0x00, 0x00, 0x00, 0x03, 0x00, x, 0x00, 0x00); \
|
14
|
+
struct i: public b
|
15
|
+
|
16
|
+
#define STREAM_INTERFACE(i, x) STREAM_INTERFACE_SUB(i, IUnknown, x)
|
17
|
+
|
18
|
+
STREAM_INTERFACE(ISequentialInStream, 0x01)
|
19
|
+
{
|
20
|
+
STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize) PURE;
|
21
|
+
/*
|
22
|
+
Out: if size != 0, return_value = S_OK and (*processedSize == 0),
|
23
|
+
then there are no more bytes in stream.
|
24
|
+
if (size > 0) && there are bytes in stream,
|
25
|
+
this function must read at least 1 byte.
|
26
|
+
This function is allowed to read less than number of remaining bytes in stream.
|
27
|
+
You must call Read function in loop, if you need exact amount of data
|
28
|
+
*/
|
29
|
+
};
|
30
|
+
|
31
|
+
STREAM_INTERFACE(ISequentialOutStream, 0x02)
|
32
|
+
{
|
33
|
+
STDMETHOD(Write)(const void *data, UInt32 size, UInt32 *processedSize) PURE;
|
34
|
+
/*
|
35
|
+
if (size > 0) this function must write at least 1 byte.
|
36
|
+
This function is allowed to write less than "size".
|
37
|
+
You must call Write function in loop, if you need to write exact amount of data
|
38
|
+
*/
|
39
|
+
};
|
40
|
+
|
41
|
+
STREAM_INTERFACE_SUB(IInStream, ISequentialInStream, 0x03)
|
42
|
+
{
|
43
|
+
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;
|
44
|
+
};
|
45
|
+
|
46
|
+
STREAM_INTERFACE_SUB(IOutStream, ISequentialOutStream, 0x04)
|
47
|
+
{
|
48
|
+
STDMETHOD(Seek)(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition) PURE;
|
49
|
+
STDMETHOD(SetSize)(Int64 newSize) PURE;
|
50
|
+
};
|
51
|
+
|
52
|
+
STREAM_INTERFACE(IStreamGetSize, 0x06)
|
53
|
+
{
|
54
|
+
STDMETHOD(GetSize)(UInt64 *size) PURE;
|
55
|
+
};
|
56
|
+
|
57
|
+
STREAM_INTERFACE(IOutStreamFlush, 0x07)
|
58
|
+
{
|
59
|
+
STDMETHOD(Flush)() PURE;
|
60
|
+
};
|
61
|
+
|
62
|
+
#endif
|
data/ext/InBuffer.cpp
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
// InBuffer.cpp
|
2
|
+
|
3
|
+
#include "StdAfx.h"
|
4
|
+
|
5
|
+
#include "InBuffer.h"
|
6
|
+
|
7
|
+
#include "Alloc.h"
|
8
|
+
|
9
|
+
CInBuffer::CInBuffer():
|
10
|
+
_buffer(0),
|
11
|
+
_bufferLimit(0),
|
12
|
+
_bufferBase(0),
|
13
|
+
_stream(0),
|
14
|
+
_bufferSize(0)
|
15
|
+
{}
|
16
|
+
|
17
|
+
bool CInBuffer::Create(UInt32 bufferSize)
|
18
|
+
{
|
19
|
+
const UInt32 kMinBlockSize = 1;
|
20
|
+
if (bufferSize < kMinBlockSize)
|
21
|
+
bufferSize = kMinBlockSize;
|
22
|
+
if (_bufferBase != 0 && _bufferSize == bufferSize)
|
23
|
+
return true;
|
24
|
+
Free();
|
25
|
+
_bufferSize = bufferSize;
|
26
|
+
_bufferBase = (Byte *)::MidAlloc(bufferSize);
|
27
|
+
return (_bufferBase != 0);
|
28
|
+
}
|
29
|
+
|
30
|
+
void CInBuffer::Free()
|
31
|
+
{
|
32
|
+
::MidFree(_bufferBase);
|
33
|
+
_bufferBase = 0;
|
34
|
+
}
|
35
|
+
|
36
|
+
void CInBuffer::SetStream(ISequentialInStream *stream)
|
37
|
+
{
|
38
|
+
_stream = stream;
|
39
|
+
}
|
40
|
+
|
41
|
+
void CInBuffer::Init()
|
42
|
+
{
|
43
|
+
_processedSize = 0;
|
44
|
+
_buffer = _bufferBase;
|
45
|
+
_bufferLimit = _buffer;
|
46
|
+
_wasFinished = false;
|
47
|
+
#ifdef _NO_EXCEPTIONS
|
48
|
+
ErrorCode = S_OK;
|
49
|
+
#endif
|
50
|
+
}
|
51
|
+
|
52
|
+
bool CInBuffer::ReadBlock()
|
53
|
+
{
|
54
|
+
#ifdef _NO_EXCEPTIONS
|
55
|
+
if (ErrorCode != S_OK)
|
56
|
+
return false;
|
57
|
+
#endif
|
58
|
+
if (_wasFinished)
|
59
|
+
return false;
|
60
|
+
_processedSize += (_buffer - _bufferBase);
|
61
|
+
UInt32 numProcessedBytes;
|
62
|
+
HRESULT result = _stream->Read(_bufferBase, _bufferSize, &numProcessedBytes);
|
63
|
+
#ifdef _NO_EXCEPTIONS
|
64
|
+
ErrorCode = result;
|
65
|
+
#else
|
66
|
+
if (result != S_OK)
|
67
|
+
throw CInBufferException(result);
|
68
|
+
#endif
|
69
|
+
_buffer = _bufferBase;
|
70
|
+
_bufferLimit = _buffer + numProcessedBytes;
|
71
|
+
_wasFinished = (numProcessedBytes == 0);
|
72
|
+
return (!_wasFinished);
|
73
|
+
}
|
74
|
+
|
75
|
+
Byte CInBuffer::ReadBlock2()
|
76
|
+
{
|
77
|
+
if(!ReadBlock())
|
78
|
+
return 0xFF;
|
79
|
+
return *_buffer++;
|
80
|
+
}
|
data/ext/InBuffer.h
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
// InBuffer.h
|
2
|
+
|
3
|
+
#ifndef __INBUFFER_H
|
4
|
+
#define __INBUFFER_H
|
5
|
+
|
6
|
+
#include "IStream.h"
|
7
|
+
#include "MyCom.h"
|
8
|
+
|
9
|
+
#ifndef _NO_EXCEPTIONS
|
10
|
+
class CInBufferException
|
11
|
+
{
|
12
|
+
public:
|
13
|
+
HRESULT ErrorCode;
|
14
|
+
CInBufferException(HRESULT errorCode): ErrorCode(errorCode) {}
|
15
|
+
};
|
16
|
+
#endif
|
17
|
+
|
18
|
+
class CInBuffer
|
19
|
+
{
|
20
|
+
Byte *_buffer;
|
21
|
+
Byte *_bufferLimit;
|
22
|
+
Byte *_bufferBase;
|
23
|
+
CMyComPtr<ISequentialInStream> _stream;
|
24
|
+
UInt64 _processedSize;
|
25
|
+
UInt32 _bufferSize;
|
26
|
+
bool _wasFinished;
|
27
|
+
|
28
|
+
bool ReadBlock();
|
29
|
+
Byte ReadBlock2();
|
30
|
+
|
31
|
+
public:
|
32
|
+
#ifdef _NO_EXCEPTIONS
|
33
|
+
HRESULT ErrorCode;
|
34
|
+
#endif
|
35
|
+
|
36
|
+
CInBuffer();
|
37
|
+
~CInBuffer() { Free(); }
|
38
|
+
|
39
|
+
bool Create(UInt32 bufferSize);
|
40
|
+
void Free();
|
41
|
+
|
42
|
+
void SetStream(ISequentialInStream *stream);
|
43
|
+
void Init();
|
44
|
+
void ReleaseStream() { _stream.Release(); }
|
45
|
+
|
46
|
+
bool ReadByte(Byte &b)
|
47
|
+
{
|
48
|
+
if(_buffer >= _bufferLimit)
|
49
|
+
if(!ReadBlock())
|
50
|
+
return false;
|
51
|
+
b = *_buffer++;
|
52
|
+
return true;
|
53
|
+
}
|
54
|
+
Byte ReadByte()
|
55
|
+
{
|
56
|
+
if(_buffer >= _bufferLimit)
|
57
|
+
return ReadBlock2();
|
58
|
+
return *_buffer++;
|
59
|
+
}
|
60
|
+
void ReadBytes(void *data, UInt32 size, UInt32 &processedSize)
|
61
|
+
{
|
62
|
+
for(processedSize = 0; processedSize < size; processedSize++)
|
63
|
+
if (!ReadByte(((Byte *)data)[processedSize]))
|
64
|
+
return;
|
65
|
+
}
|
66
|
+
bool ReadBytes(void *data, UInt32 size)
|
67
|
+
{
|
68
|
+
UInt32 processedSize;
|
69
|
+
ReadBytes(data, size, processedSize);
|
70
|
+
return (processedSize == size);
|
71
|
+
}
|
72
|
+
UInt64 GetProcessedSize() const { return _processedSize + (_buffer - _bufferBase); }
|
73
|
+
bool WasFinished() const { return _wasFinished; }
|
74
|
+
};
|
75
|
+
|
76
|
+
#endif
|
data/ext/LZInWindow.cpp
ADDED
@@ -0,0 +1,102 @@
|
|
1
|
+
// LZInWindow.cpp
|
2
|
+
|
3
|
+
#include "StdAfx.h"
|
4
|
+
|
5
|
+
#include "LZInWindow.h"
|
6
|
+
#include "MyCom.h"
|
7
|
+
#include "Alloc.h"
|
8
|
+
|
9
|
+
void CLZInWindow::Free()
|
10
|
+
{
|
11
|
+
::BigFree(_bufferBase);
|
12
|
+
_bufferBase = 0;
|
13
|
+
}
|
14
|
+
|
15
|
+
bool CLZInWindow::Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv)
|
16
|
+
{
|
17
|
+
_keepSizeBefore = keepSizeBefore;
|
18
|
+
_keepSizeAfter = keepSizeAfter;
|
19
|
+
_keepSizeReserv = keepSizeReserv;
|
20
|
+
UInt32 blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv;
|
21
|
+
if (_bufferBase == 0 || _blockSize != blockSize)
|
22
|
+
{
|
23
|
+
Free();
|
24
|
+
_blockSize = blockSize;
|
25
|
+
if (_blockSize != 0)
|
26
|
+
_bufferBase = (Byte *)::BigAlloc(_blockSize);
|
27
|
+
}
|
28
|
+
_pointerToLastSafePosition = _bufferBase + _blockSize - keepSizeAfter;
|
29
|
+
if (_blockSize == 0)
|
30
|
+
return true;
|
31
|
+
return (_bufferBase != 0);
|
32
|
+
}
|
33
|
+
|
34
|
+
|
35
|
+
HRESULT CLZInWindow::Init(ISequentialInStream *stream)
|
36
|
+
{
|
37
|
+
_stream = stream;
|
38
|
+
_buffer = _bufferBase;
|
39
|
+
_pos = 0;
|
40
|
+
_streamPos = 0;
|
41
|
+
_streamEndWasReached = false;
|
42
|
+
return ReadBlock();
|
43
|
+
}
|
44
|
+
|
45
|
+
/*
|
46
|
+
void CLZInWindow::ReleaseStream()
|
47
|
+
{
|
48
|
+
_stream.Release();
|
49
|
+
}
|
50
|
+
*/
|
51
|
+
|
52
|
+
///////////////////////////////////////////
|
53
|
+
// ReadBlock
|
54
|
+
|
55
|
+
// In State:
|
56
|
+
// (_buffer + _streamPos) <= (_bufferBase + _blockSize)
|
57
|
+
// Out State:
|
58
|
+
// _posLimit <= _blockSize - _keepSizeAfter;
|
59
|
+
// if(_streamEndWasReached == false):
|
60
|
+
// _streamPos >= _pos + _keepSizeAfter
|
61
|
+
// _posLimit = _streamPos - _keepSizeAfter;
|
62
|
+
// else
|
63
|
+
//
|
64
|
+
|
65
|
+
HRESULT CLZInWindow::ReadBlock()
|
66
|
+
{
|
67
|
+
if(_streamEndWasReached)
|
68
|
+
return S_OK;
|
69
|
+
while(true)
|
70
|
+
{
|
71
|
+
UInt32 size = UInt32(_bufferBase - _buffer) + _blockSize - _streamPos;
|
72
|
+
if(size == 0)
|
73
|
+
return S_OK;
|
74
|
+
UInt32 numReadBytes;
|
75
|
+
RINOK(_stream->Read(_buffer + _streamPos, size, &numReadBytes));
|
76
|
+
if(numReadBytes == 0)
|
77
|
+
{
|
78
|
+
_posLimit = _streamPos;
|
79
|
+
const Byte *pointerToPostion = _buffer + _posLimit;
|
80
|
+
if(pointerToPostion > _pointerToLastSafePosition)
|
81
|
+
_posLimit = (UInt32)(_pointerToLastSafePosition - _buffer);
|
82
|
+
_streamEndWasReached = true;
|
83
|
+
return S_OK;
|
84
|
+
}
|
85
|
+
_streamPos += numReadBytes;
|
86
|
+
if(_streamPos >= _pos + _keepSizeAfter)
|
87
|
+
{
|
88
|
+
_posLimit = _streamPos - _keepSizeAfter;
|
89
|
+
return S_OK;
|
90
|
+
}
|
91
|
+
}
|
92
|
+
}
|
93
|
+
|
94
|
+
void CLZInWindow::MoveBlock()
|
95
|
+
{
|
96
|
+
BeforeMoveBlock();
|
97
|
+
UInt32 offset = UInt32(_buffer - _bufferBase) + _pos - _keepSizeBefore;
|
98
|
+
UInt32 numBytes = UInt32(_buffer - _bufferBase) + _streamPos - offset;
|
99
|
+
memmove(_bufferBase, _bufferBase + offset, numBytes);
|
100
|
+
_buffer -= offset;
|
101
|
+
AfterMoveBlock();
|
102
|
+
}
|