Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZ/LZInWindow.cpp, revision 1.1
1.1 ! misho 1: // LZInWindow.cpp
! 2:
! 3: #include "StdAfx.h"
! 4:
! 5: #include "LZInWindow.h"
! 6: #include "../../../Common/MyCom.h"
! 7: #include "../../../Common/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: _bufferBase = (Byte *)::BigAlloc(_blockSize);
! 26: }
! 27: _pointerToLastSafePosition = _bufferBase + _blockSize - keepSizeAfter;
! 28: return (_bufferBase != 0);
! 29: }
! 30:
! 31:
! 32: HRESULT CLZInWindow::Init(ISequentialInStream *stream)
! 33: {
! 34: _stream = stream;
! 35: _buffer = _bufferBase;
! 36: _pos = 0;
! 37: _streamPos = 0;
! 38: _streamEndWasReached = false;
! 39: return ReadBlock();
! 40: }
! 41:
! 42: /*
! 43: void CLZInWindow::ReleaseStream()
! 44: {
! 45: _stream.Release();
! 46: }
! 47: */
! 48:
! 49: ///////////////////////////////////////////
! 50: // ReadBlock
! 51:
! 52: // In State:
! 53: // (_buffer + _streamPos) <= (_bufferBase + _blockSize)
! 54: // Out State:
! 55: // _posLimit <= _blockSize - _keepSizeAfter;
! 56: // if(_streamEndWasReached == false):
! 57: // _streamPos >= _pos + _keepSizeAfter
! 58: // _posLimit = _streamPos - _keepSizeAfter;
! 59: // else
! 60: //
! 61:
! 62: HRESULT CLZInWindow::ReadBlock()
! 63: {
! 64: if(_streamEndWasReached)
! 65: return S_OK;
! 66: while(true)
! 67: {
! 68: UInt32 size = UInt32(_bufferBase - _buffer) + _blockSize - _streamPos;
! 69: if(size == 0)
! 70: return S_OK;
! 71: UInt32 numReadBytes;
! 72: RINOK(_stream->ReadPart(_buffer + _streamPos, size, &numReadBytes));
! 73: if(numReadBytes == 0)
! 74: {
! 75: _posLimit = _streamPos;
! 76: const Byte *pointerToPostion = _buffer + _posLimit;
! 77: if(pointerToPostion > _pointerToLastSafePosition)
! 78: _posLimit = (UInt32)(_pointerToLastSafePosition - _buffer);
! 79: _streamEndWasReached = true;
! 80: return S_OK;
! 81: }
! 82: _streamPos += numReadBytes;
! 83: if(_streamPos >= _pos + _keepSizeAfter)
! 84: {
! 85: _posLimit = _streamPos - _keepSizeAfter;
! 86: return S_OK;
! 87: }
! 88: }
! 89: }
! 90:
! 91: void CLZInWindow::MoveBlock()
! 92: {
! 93: BeforeMoveBlock();
! 94: UInt32 offset = UInt32(_buffer - _bufferBase) + _pos - _keepSizeBefore;
! 95: UInt32 numBytes = UInt32(_buffer - _bufferBase) + _streamPos - offset;
! 96: memmove(_bufferBase, _bufferBase + offset, numBytes);
! 97: _buffer -= offset;
! 98: AfterMoveBlock();
! 99: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>