⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lzinwindow.cpp

📁 sleuthit-2.09 一个磁盘的工具集
💻 CPP
字号:
// LZInWindow.cpp#include "StdAfx.h"#include "LZInWindow.h"#include "../../../Common/MyCom.h"#include "../../../Common/Alloc.h"void CLZInWindow::Free(){  ::BigFree(_bufferBase);  _bufferBase = 0;}bool CLZInWindow::Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter, UInt32 keepSizeReserv){  _keepSizeBefore = keepSizeBefore;  _keepSizeAfter = keepSizeAfter;  UInt32 blockSize = keepSizeBefore + keepSizeAfter + keepSizeReserv;  if (_bufferBase == 0 || _blockSize != blockSize)  {    Free();    _blockSize = blockSize;    if (_blockSize != 0)      _bufferBase = (Byte *)::BigAlloc(_blockSize);  }  _pointerToLastSafePosition = _bufferBase + _blockSize - keepSizeAfter;  if (_blockSize == 0)    return true;  return (_bufferBase != 0);}void CLZInWindow::SetStream(ISequentialInStream *stream){  _stream = stream;}HRESULT CLZInWindow::Init(){  _buffer = _bufferBase;  _pos = 0;  _streamPos = 0;  _streamEndWasReached = false;  return ReadBlock();}/*void CLZInWindow::ReleaseStream(){  _stream.Release();}*////////////////////////////////////////////// ReadBlock// In State://   (_buffer + _streamPos) <= (_bufferBase + _blockSize)// Out State://   _posLimit <= _blockSize - _keepSizeAfter;//   if(_streamEndWasReached == false)://     _streamPos >= _pos + _keepSizeAfter//     _posLimit = _streamPos - _keepSizeAfter;//   else//            HRESULT CLZInWindow::ReadBlock(){  if(_streamEndWasReached)    return S_OK;  while(true)  {    UInt32 size = (UInt32)(_bufferBase - _buffer) + _blockSize - _streamPos;    if(size == 0)      return S_OK;    UInt32 numReadBytes;    RINOK(_stream->Read(_buffer + _streamPos, size, &numReadBytes));    if(numReadBytes == 0)    {      _posLimit = _streamPos;      const Byte *pointerToPostion = _buffer + _posLimit;      if(pointerToPostion > _pointerToLastSafePosition)        _posLimit = (UInt32)(_pointerToLastSafePosition - _buffer);      _streamEndWasReached = true;      return S_OK;    }    _streamPos += numReadBytes;    if(_streamPos >= _pos + _keepSizeAfter)    {      _posLimit = _streamPos - _keepSizeAfter;      return S_OK;    }  }}void CLZInWindow::MoveBlock(){  UInt32 offset = (UInt32)(_buffer - _bufferBase) + _pos - _keepSizeBefore;  // we need one additional byte, since MovePos moves on 1 byte.  if (offset > 0)    offset--;   UInt32 numBytes = (UInt32)(_buffer - _bufferBase) + _streamPos -  offset;  memmove(_bufferBase, _bufferBase + offset, numBytes);  _buffer -= offset;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -