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>