5 #include "LZInWindow.h"
6 #include "../../../Common/MyCom.h"
7 #include "../../../Common/Alloc.h"
9 void CLZInWindow::Free()
11 ::BigFree(_bufferBase
);
15 bool CLZInWindow::Create(UInt32 keepSizeBefore
, UInt32 keepSizeAfter
, UInt32 keepSizeReserv
)
17 _keepSizeBefore
= keepSizeBefore
;
18 _keepSizeAfter
= keepSizeAfter
;
19 _keepSizeReserv
= keepSizeReserv
;
20 UInt32 blockSize
= keepSizeBefore
+ keepSizeAfter
+ keepSizeReserv
;
21 if (_bufferBase
== 0 || _blockSize
!= blockSize
)
24 _blockSize
= blockSize
;
26 _bufferBase
= (Byte
*)::BigAlloc(_blockSize
);
28 _pointerToLastSafePosition
= _bufferBase
+ _blockSize
- keepSizeAfter
;
31 return (_bufferBase
!= 0);
35 HRESULT
CLZInWindow::Init(ISequentialInStream
*stream
)
38 _buffer
= _bufferBase
;
41 _streamEndWasReached
= false;
46 void CLZInWindow::ReleaseStream()
52 ///////////////////////////////////////////
56 // (_buffer + _streamPos) <= (_bufferBase + _blockSize)
58 // _posLimit <= _blockSize - _keepSizeAfter;
59 // if(_streamEndWasReached == false):
60 // _streamPos >= _pos + _keepSizeAfter
61 // _posLimit = _streamPos - _keepSizeAfter;
65 HRESULT
CLZInWindow::ReadBlock()
67 if(_streamEndWasReached
)
71 UInt32 size
= UInt32(_bufferBase
- _buffer
) + _blockSize
- _streamPos
;
75 RINOK(_stream
->Read(_buffer
+ _streamPos
, size
, &numReadBytes
));
78 _posLimit
= _streamPos
;
79 const Byte
*pointerToPostion
= _buffer
+ _posLimit
;
80 if(pointerToPostion
> _pointerToLastSafePosition
)
81 _posLimit
= (UInt32
)(_pointerToLastSafePosition
- _buffer
);
82 _streamEndWasReached
= true;
85 _streamPos
+= numReadBytes
;
86 if(_streamPos
>= _pos
+ _keepSizeAfter
)
88 _posLimit
= _streamPos
- _keepSizeAfter
;
94 void CLZInWindow::MoveBlock()
97 UInt32 offset
= UInt32(_buffer
- _bufferBase
) + _pos
- _keepSizeBefore
;
98 UInt32 numBytes
= UInt32(_buffer
- _bufferBase
) + _streamPos
- offset
;
99 memmove(_bufferBase
, _bufferBase
+ offset
, numBytes
);