Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZ/LZInWindow.h, revision 1.1
1.1 ! misho 1: // LZInWindow.h
! 2:
! 3: #ifndef __LZ_IN_WINDOW_H
! 4: #define __LZ_IN_WINDOW_H
! 5:
! 6: #include "../../IStream.h"
! 7:
! 8: class CLZInWindow
! 9: {
! 10: Byte *_bufferBase; // pointer to buffer with data
! 11: ISequentialInStream *_stream;
! 12: UInt32 _posLimit; // offset (from _buffer) of first byte when new block reading must be done
! 13: bool _streamEndWasReached; // if (true) then _streamPos shows real end of stream
! 14: const Byte *_pointerToLastSafePosition;
! 15: protected:
! 16: Byte *_buffer; // Pointer to virtual Buffer begin
! 17: UInt32 _blockSize; // Size of Allocated memory block
! 18: UInt32 _pos; // offset (from _buffer) of curent byte
! 19: UInt32 _keepSizeBefore; // how many BYTEs must be kept in buffer before _pos
! 20: UInt32 _keepSizeAfter; // how many BYTEs must be kept buffer after _pos
! 21: UInt32 _keepSizeReserv; // how many BYTEs must be kept as reserv
! 22: UInt32 _streamPos; // offset (from _buffer) of first not read byte from Stream
! 23:
! 24: virtual void BeforeMoveBlock() {};
! 25: virtual void AfterMoveBlock() {};
! 26: void MoveBlock();
! 27: virtual HRESULT ReadBlock();
! 28: void Free();
! 29: public:
! 30: CLZInWindow(): _bufferBase(0) {}
! 31: virtual ~CLZInWindow() { Free(); }
! 32:
! 33: bool Create(UInt32 keepSizeBefore, UInt32 keepSizeAfter,
! 34: UInt32 keepSizeReserv = (1<<17));
! 35:
! 36: HRESULT Init(ISequentialInStream *stream);
! 37: // void ReleaseStream();
! 38:
! 39: Byte *GetBuffer() const { return _buffer; }
! 40:
! 41: const Byte *GetPointerToCurrentPos() const { return _buffer + _pos; }
! 42:
! 43: HRESULT MovePos()
! 44: {
! 45: _pos++;
! 46: if (_pos > _posLimit)
! 47: {
! 48: const Byte *pointerToPostion = _buffer + _pos;
! 49: if(pointerToPostion > _pointerToLastSafePosition)
! 50: MoveBlock();
! 51: return ReadBlock();
! 52: }
! 53: else
! 54: return S_OK;
! 55: }
! 56: Byte GetIndexByte(Int32 index)const
! 57: { return _buffer[(size_t)_pos + index]; }
! 58:
! 59: // index + limit have not to exceed _keepSizeAfter;
! 60: UInt32 GetMatchLen(Int32 index, UInt32 distance, UInt32 limit) const
! 61: {
! 62: if(_streamEndWasReached)
! 63: if ((_pos + index) + limit > _streamPos)
! 64: limit = _streamPos - (_pos + index);
! 65: distance++;
! 66: Byte *pby = _buffer + (size_t)_pos + index;
! 67: UInt32 i;
! 68: for(i = 0; i < limit && pby[i] == pby[(size_t)i - distance]; i++);
! 69: return i;
! 70: }
! 71:
! 72: UInt32 GetNumAvailableBytes() const { return _streamPos - _pos; }
! 73:
! 74: void ReduceOffsets(Int32 subValue)
! 75: {
! 76: _buffer += subValue;
! 77: _posLimit -= subValue;
! 78: _pos -= subValue;
! 79: _streamPos -= subValue;
! 80: }
! 81:
! 82: };
! 83:
! 84: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>