Mercurial > vba-linux
annotate src/win32/7zip/7z/CPP/7zip/Archive/Lzma/LzmaIn.cpp @ 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 // Archive/LzmaIn.cpp |
rlm@1 | 2 |
rlm@1 | 3 #include "StdAfx.h" |
rlm@1 | 4 |
rlm@1 | 5 #include "LzmaIn.h" |
rlm@1 | 6 |
rlm@1 | 7 #include "../../Common/StreamUtils.h" |
rlm@1 | 8 |
rlm@1 | 9 namespace NArchive { |
rlm@1 | 10 namespace NLzma { |
rlm@1 | 11 |
rlm@1 | 12 static bool CheckDictSize(const Byte *p) |
rlm@1 | 13 { |
rlm@1 | 14 UInt32 dicSize = GetUi32(p); |
rlm@1 | 15 int i; |
rlm@1 | 16 for (i = 1; i <= 30; i++) |
rlm@1 | 17 if (dicSize == ((UInt32)2 << i) || dicSize == ((UInt32)3 << i)) |
rlm@1 | 18 return true; |
rlm@1 | 19 return false; |
rlm@1 | 20 } |
rlm@1 | 21 |
rlm@1 | 22 HRESULT ReadStreamHeader(ISequentialInStream *inStream, CHeader &block) |
rlm@1 | 23 { |
rlm@1 | 24 Byte sig[5 + 9]; |
rlm@1 | 25 RINOK(ReadStream_FALSE(inStream, sig, 5 + 8)); |
rlm@1 | 26 |
rlm@1 | 27 const Byte kMaxProp0Val = 5 * 5 * 9 - 1; |
rlm@1 | 28 if (sig[0] > kMaxProp0Val) |
rlm@1 | 29 return S_FALSE; |
rlm@1 | 30 |
rlm@1 | 31 for (int i = 0; i < 5; i++) |
rlm@1 | 32 block.LzmaProps[i] = sig[i]; |
rlm@1 | 33 |
rlm@1 | 34 block.IsThereFilter = false; |
rlm@1 | 35 block.FilterMethod = 0; |
rlm@1 | 36 |
rlm@1 | 37 if (!CheckDictSize(sig + 1)) |
rlm@1 | 38 { |
rlm@1 | 39 if (sig[0] > 1 || sig[1] > kMaxProp0Val) |
rlm@1 | 40 return S_FALSE; |
rlm@1 | 41 block.IsThereFilter = true; |
rlm@1 | 42 block.FilterMethod = sig[0]; |
rlm@1 | 43 for (int i = 0; i < 5; i++) |
rlm@1 | 44 block.LzmaProps[i] = sig[i + 1]; |
rlm@1 | 45 if (!CheckDictSize(block.LzmaProps + 1)) |
rlm@1 | 46 return S_FALSE; |
rlm@1 | 47 RINOK(ReadStream_FALSE(inStream, sig + 5 + 8, 1)); |
rlm@1 | 48 } |
rlm@1 | 49 UInt32 unpOffset = 5 + (block.IsThereFilter ? 1 : 0); |
rlm@1 | 50 block.UnpackSize = GetUi64(sig + unpOffset); |
rlm@1 | 51 if (block.HasUnpackSize() && block.UnpackSize >= ((UInt64)1 << 56)) |
rlm@1 | 52 return S_FALSE; |
rlm@1 | 53 return S_OK; |
rlm@1 | 54 } |
rlm@1 | 55 |
rlm@1 | 56 }} |