Annotation of elwix/tools/oldlzma/SRC/7zip/Compress/LZ/LZInWindow.h, revision 1.1.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>