annotate src/win32/7zip/7z/CPP/7zip/Archive/Common/ParseProperties.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 // ParseProperties.cpp
rlm@1 2
rlm@1 3 #include "StdAfx.h"
rlm@1 4
rlm@1 5 #include "ParseProperties.h"
rlm@1 6
rlm@1 7 #include "Common/StringToInt.h"
rlm@1 8 #include "Common/MyCom.h"
rlm@1 9
rlm@1 10 HRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue)
rlm@1 11 {
rlm@1 12 if (prop.vt == VT_UI4)
rlm@1 13 {
rlm@1 14 if (!name.IsEmpty())
rlm@1 15 return E_INVALIDARG;
rlm@1 16 resValue = prop.ulVal;
rlm@1 17 }
rlm@1 18 else if (prop.vt == VT_EMPTY)
rlm@1 19 {
rlm@1 20 if(!name.IsEmpty())
rlm@1 21 {
rlm@1 22 const wchar_t *start = name;
rlm@1 23 const wchar_t *end;
rlm@1 24 UInt64 v = ConvertStringToUInt64(start, &end);
rlm@1 25 if (end - start != name.Length())
rlm@1 26 return E_INVALIDARG;
rlm@1 27 resValue = (UInt32)v;
rlm@1 28 }
rlm@1 29 }
rlm@1 30 else
rlm@1 31 return E_INVALIDARG;
rlm@1 32 return S_OK;
rlm@1 33 }
rlm@1 34
rlm@1 35 static const int kLogarithmicSizeLimit = 32;
rlm@1 36 static const wchar_t kByteSymbol = L'B';
rlm@1 37 static const wchar_t kKiloByteSymbol = L'K';
rlm@1 38 static const wchar_t kMegaByteSymbol = L'M';
rlm@1 39
rlm@1 40 HRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize)
rlm@1 41 {
rlm@1 42 UString srcString = srcStringSpec;
rlm@1 43 srcString.MakeUpper();
rlm@1 44
rlm@1 45 const wchar_t *start = srcString;
rlm@1 46 const wchar_t *end;
rlm@1 47 UInt64 number = ConvertStringToUInt64(start, &end);
rlm@1 48 int numDigits = (int)(end - start);
rlm@1 49 if (numDigits == 0 || srcString.Length() > numDigits + 1)
rlm@1 50 return E_INVALIDARG;
rlm@1 51 if (srcString.Length() == numDigits)
rlm@1 52 {
rlm@1 53 if (number >= kLogarithmicSizeLimit)
rlm@1 54 return E_INVALIDARG;
rlm@1 55 dicSize = (UInt32)1 << (int)number;
rlm@1 56 return S_OK;
rlm@1 57 }
rlm@1 58 switch (srcString[numDigits])
rlm@1 59 {
rlm@1 60 case kByteSymbol:
rlm@1 61 if (number >= ((UInt64)1 << kLogarithmicSizeLimit))
rlm@1 62 return E_INVALIDARG;
rlm@1 63 dicSize = (UInt32)number;
rlm@1 64 break;
rlm@1 65 case kKiloByteSymbol:
rlm@1 66 if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 10)))
rlm@1 67 return E_INVALIDARG;
rlm@1 68 dicSize = (UInt32)(number << 10);
rlm@1 69 break;
rlm@1 70 case kMegaByteSymbol:
rlm@1 71 if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 20)))
rlm@1 72 return E_INVALIDARG;
rlm@1 73 dicSize = (UInt32)(number << 20);
rlm@1 74 break;
rlm@1 75 default:
rlm@1 76 return E_INVALIDARG;
rlm@1 77 }
rlm@1 78 return S_OK;
rlm@1 79 }
rlm@1 80
rlm@1 81 HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue)
rlm@1 82 {
rlm@1 83 if (name.IsEmpty())
rlm@1 84 {
rlm@1 85 if (prop.vt == VT_UI4)
rlm@1 86 {
rlm@1 87 UInt32 logDicSize = prop.ulVal;
rlm@1 88 if (logDicSize >= 32)
rlm@1 89 return E_INVALIDARG;
rlm@1 90 resValue = (UInt32)1 << logDicSize;
rlm@1 91 return S_OK;
rlm@1 92 }
rlm@1 93 if (prop.vt == VT_BSTR)
rlm@1 94 return ParsePropDictionaryValue(prop.bstrVal, resValue);
rlm@1 95 return E_INVALIDARG;
rlm@1 96 }
rlm@1 97 return ParsePropDictionaryValue(name, resValue);
rlm@1 98 }
rlm@1 99
rlm@1 100 bool StringToBool(const UString &s, bool &res)
rlm@1 101 {
rlm@1 102 if (s.IsEmpty() || s.CompareNoCase(L"ON") == 0 || s.Compare(L"+") == 0)
rlm@1 103 {
rlm@1 104 res = true;
rlm@1 105 return true;
rlm@1 106 }
rlm@1 107 if (s.CompareNoCase(L"OFF") == 0 || s.Compare(L"-") == 0)
rlm@1 108 {
rlm@1 109 res = false;
rlm@1 110 return true;
rlm@1 111 }
rlm@1 112 return false;
rlm@1 113 }
rlm@1 114
rlm@1 115 HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value)
rlm@1 116 {
rlm@1 117 switch(value.vt)
rlm@1 118 {
rlm@1 119 case VT_EMPTY:
rlm@1 120 dest = true;
rlm@1 121 return S_OK;
rlm@1 122 case VT_BOOL:
rlm@1 123 dest = (value.boolVal != VARIANT_FALSE);
rlm@1 124 return S_OK;
rlm@1 125 /*
rlm@1 126 case VT_UI4:
rlm@1 127 dest = (value.ulVal != 0);
rlm@1 128 break;
rlm@1 129 */
rlm@1 130 case VT_BSTR:
rlm@1 131 return StringToBool(value.bstrVal, dest) ? S_OK : E_INVALIDARG;
rlm@1 132 }
rlm@1 133 return E_INVALIDARG;
rlm@1 134 }
rlm@1 135
rlm@1 136 int ParseStringToUInt32(const UString &srcString, UInt32 &number)
rlm@1 137 {
rlm@1 138 const wchar_t *start = srcString;
rlm@1 139 const wchar_t *end;
rlm@1 140 UInt64 number64 = ConvertStringToUInt64(start, &end);
rlm@1 141 if (number64 > 0xFFFFFFFF)
rlm@1 142 {
rlm@1 143 number = 0;
rlm@1 144 return 0;
rlm@1 145 }
rlm@1 146 number = (UInt32)number64;
rlm@1 147 return (int)(end - start);
rlm@1 148 }
rlm@1 149
rlm@1 150 HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads)
rlm@1 151 {
rlm@1 152 if (name.IsEmpty())
rlm@1 153 {
rlm@1 154 switch(prop.vt)
rlm@1 155 {
rlm@1 156 case VT_UI4:
rlm@1 157 numThreads = prop.ulVal;
rlm@1 158 break;
rlm@1 159 default:
rlm@1 160 {
rlm@1 161 bool val;
rlm@1 162 RINOK(SetBoolProperty(val, prop));
rlm@1 163 numThreads = (val ? defaultNumThreads : 1);
rlm@1 164 break;
rlm@1 165 }
rlm@1 166 }
rlm@1 167 }
rlm@1 168 else
rlm@1 169 {
rlm@1 170 UInt32 number;
rlm@1 171 int index = ParseStringToUInt32(name, number);
rlm@1 172 if (index != name.Length())
rlm@1 173 return E_INVALIDARG;
rlm@1 174 numThreads = number;
rlm@1 175 }
rlm@1 176 return S_OK;
rlm@1 177 }