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