Mercurial > vba-linux
annotate src/win32/7zip/7z/CPP/7zip/Compress/LzOutWindow.h @ 1:f9f4f1b99eed
importing src directory
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 03 Mar 2012 10:31:27 -0600 |
parents | |
children |
rev | line source |
---|---|
rlm@1 | 1 // LzOutWindow.h |
rlm@1 | 2 |
rlm@1 | 3 #ifndef __LZ_OUT_WINDOW_H |
rlm@1 | 4 #define __LZ_OUT_WINDOW_H |
rlm@1 | 5 |
rlm@1 | 6 #include "../IStream.h" |
rlm@1 | 7 |
rlm@1 | 8 #include "../Common/OutBuffer.h" |
rlm@1 | 9 |
rlm@1 | 10 #ifndef _NO_EXCEPTIONS |
rlm@1 | 11 typedef COutBufferException CLzOutWindowException; |
rlm@1 | 12 #endif |
rlm@1 | 13 |
rlm@1 | 14 class CLzOutWindow: public COutBuffer |
rlm@1 | 15 { |
rlm@1 | 16 public: |
rlm@1 | 17 void Init(bool solid = false); |
rlm@1 | 18 |
rlm@1 | 19 // distance >= 0, len > 0, |
rlm@1 | 20 bool CopyBlock(UInt32 distance, UInt32 len) |
rlm@1 | 21 { |
rlm@1 | 22 UInt32 pos = _pos - distance - 1; |
rlm@1 | 23 if (distance >= _pos) |
rlm@1 | 24 { |
rlm@1 | 25 if (!_overDict || distance >= _bufferSize) |
rlm@1 | 26 return false; |
rlm@1 | 27 pos += _bufferSize; |
rlm@1 | 28 } |
rlm@1 | 29 if (_limitPos - _pos > len && _bufferSize - pos > len) |
rlm@1 | 30 { |
rlm@1 | 31 const Byte *src = _buffer + pos; |
rlm@1 | 32 Byte *dest = _buffer + _pos; |
rlm@1 | 33 _pos += len; |
rlm@1 | 34 do |
rlm@1 | 35 *dest++ = *src++; |
rlm@1 | 36 while(--len != 0); |
rlm@1 | 37 } |
rlm@1 | 38 else do |
rlm@1 | 39 { |
rlm@1 | 40 if (pos == _bufferSize) |
rlm@1 | 41 pos = 0; |
rlm@1 | 42 _buffer[_pos++] = _buffer[pos++]; |
rlm@1 | 43 if (_pos == _limitPos) |
rlm@1 | 44 FlushWithCheck(); |
rlm@1 | 45 } |
rlm@1 | 46 while(--len != 0); |
rlm@1 | 47 return true; |
rlm@1 | 48 } |
rlm@1 | 49 |
rlm@1 | 50 void PutByte(Byte b) |
rlm@1 | 51 { |
rlm@1 | 52 _buffer[_pos++] = b; |
rlm@1 | 53 if (_pos == _limitPos) |
rlm@1 | 54 FlushWithCheck(); |
rlm@1 | 55 } |
rlm@1 | 56 |
rlm@1 | 57 Byte GetByte(UInt32 distance) const |
rlm@1 | 58 { |
rlm@1 | 59 UInt32 pos = _pos - distance - 1; |
rlm@1 | 60 if (pos >= _bufferSize) |
rlm@1 | 61 pos += _bufferSize; |
rlm@1 | 62 return _buffer[pos]; |
rlm@1 | 63 } |
rlm@1 | 64 }; |
rlm@1 | 65 |
rlm@1 | 66 #endif |