rlm@1: // LzOutWindow.h rlm@1: rlm@1: #ifndef __LZ_OUT_WINDOW_H rlm@1: #define __LZ_OUT_WINDOW_H rlm@1: rlm@1: #include "../IStream.h" rlm@1: rlm@1: #include "../Common/OutBuffer.h" rlm@1: rlm@1: #ifndef _NO_EXCEPTIONS rlm@1: typedef COutBufferException CLzOutWindowException; rlm@1: #endif rlm@1: rlm@1: class CLzOutWindow: public COutBuffer rlm@1: { rlm@1: public: rlm@1: void Init(bool solid = false); rlm@1: rlm@1: // distance >= 0, len > 0, rlm@1: bool CopyBlock(UInt32 distance, UInt32 len) rlm@1: { rlm@1: UInt32 pos = _pos - distance - 1; rlm@1: if (distance >= _pos) rlm@1: { rlm@1: if (!_overDict || distance >= _bufferSize) rlm@1: return false; rlm@1: pos += _bufferSize; rlm@1: } rlm@1: if (_limitPos - _pos > len && _bufferSize - pos > len) rlm@1: { rlm@1: const Byte *src = _buffer + pos; rlm@1: Byte *dest = _buffer + _pos; rlm@1: _pos += len; rlm@1: do rlm@1: *dest++ = *src++; rlm@1: while(--len != 0); rlm@1: } rlm@1: else do rlm@1: { rlm@1: if (pos == _bufferSize) rlm@1: pos = 0; rlm@1: _buffer[_pos++] = _buffer[pos++]; rlm@1: if (_pos == _limitPos) rlm@1: FlushWithCheck(); rlm@1: } rlm@1: while(--len != 0); rlm@1: return true; rlm@1: } rlm@1: rlm@1: void PutByte(Byte b) rlm@1: { rlm@1: _buffer[_pos++] = b; rlm@1: if (_pos == _limitPos) rlm@1: FlushWithCheck(); rlm@1: } rlm@1: rlm@1: Byte GetByte(UInt32 distance) const rlm@1: { rlm@1: UInt32 pos = _pos - distance - 1; rlm@1: if (pos >= _bufferSize) rlm@1: pos += _bufferSize; rlm@1: return _buffer[pos]; rlm@1: } rlm@1: }; rlm@1: rlm@1: #endif