parseproperties.cpp

来自「由7-zip提供的压缩、解压缩程序」· C++ 代码 · 共 172 行

CPP
172
字号
// ParseProperties.cpp#include "StdAfx.h"#include "ParseProperties.h"#include "Common/StringToInt.h"#include "Common/MyCom.h"HRESULT ParsePropValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue){  if (prop.vt == VT_UI4)  {    if (!name.IsEmpty())      return E_INVALIDARG;    resValue = prop.ulVal;  }  else if (prop.vt == VT_EMPTY)  {    if(!name.IsEmpty())    {      const wchar_t *start = name;      const wchar_t *end;      UInt64 v = ConvertStringToUInt64(start, &end);      if (end - start != name.Length())        return E_INVALIDARG;      resValue = (UInt32)v;    }  }  else    return E_INVALIDARG;  return S_OK;}static const int kLogarithmicSizeLimit = 32;static const wchar_t kByteSymbol = L'B';static const wchar_t kKiloByteSymbol = L'K';static const wchar_t kMegaByteSymbol = L'M';HRESULT ParsePropDictionaryValue(const UString &srcStringSpec, UInt32 &dicSize){  UString srcString = srcStringSpec;  srcString.MakeUpper();  const wchar_t *start = srcString;  const wchar_t *end;  UInt64 number = ConvertStringToUInt64(start, &end);  int numDigits = (int)(end - start);  if (numDigits == 0 || srcString.Length() > numDigits + 1)    return E_INVALIDARG;  if (srcString.Length() == numDigits)  {    if (number >= kLogarithmicSizeLimit)      return E_INVALIDARG;    dicSize = (UInt32)1 << (int)number;    return S_OK;  }  switch (srcString[numDigits])  {    case kByteSymbol:      if (number >= ((UInt64)1 << kLogarithmicSizeLimit))        return E_INVALIDARG;      dicSize = (UInt32)number;      break;    case kKiloByteSymbol:      if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 10)))        return E_INVALIDARG;      dicSize = (UInt32)(number << 10);      break;    case kMegaByteSymbol:      if (number >= ((UInt64)1 << (kLogarithmicSizeLimit - 20)))        return E_INVALIDARG;      dicSize = (UInt32)(number << 20);      break;    default:      return E_INVALIDARG;  }  return S_OK;}HRESULT ParsePropDictionaryValue(const UString &name, const PROPVARIANT &prop, UInt32 &resValue){  if (name.IsEmpty())  {    if (prop.vt == VT_UI4)    {      UInt32 logDicSize = prop.ulVal;      if (logDicSize >= 32)        return E_INVALIDARG;      resValue = (UInt32)1 << logDicSize;      return S_OK;    }    if (prop.vt == VT_BSTR)      return ParsePropDictionaryValue(prop.bstrVal, resValue);    return E_INVALIDARG;  }  return ParsePropDictionaryValue(name, resValue);}HRESULT SetBoolProperty(bool &dest, const PROPVARIANT &value){  switch(value.vt)  {    case VT_EMPTY:      dest = true;      break;    /*    case VT_UI4:      dest = (value.ulVal != 0);      break;    */    case VT_BSTR:    {      UString valueString = value.bstrVal;      valueString.MakeUpper();      if (valueString.Compare(L"ON") == 0)        dest = true;      else if (valueString.Compare(L"OFF") == 0)        dest = false;      else        return E_INVALIDARG;      break;    }    default:      return E_INVALIDARG;  }  return S_OK;}int ParseStringToUInt32(const UString &srcString, UInt32 &number){  const wchar_t *start = srcString;  const wchar_t *end;  UInt64 number64 = ConvertStringToUInt64(start, &end);  if (number64 > 0xFFFFFFFF)   {    number = 0;    return 0;  }  number = (UInt32)number64;  return (int)(end - start);}HRESULT ParseMtProp(const UString &name, const PROPVARIANT &prop, UInt32 defaultNumThreads, UInt32 &numThreads){  if (name.IsEmpty())  {    switch(prop.vt)    {      case VT_UI4:        numThreads = prop.ulVal;        break;      default:      {        bool val;         RINOK(SetBoolProperty(val, prop));        numThreads = (val ? defaultNumThreads : 1);        break;      }    }  }  else  {    UInt32 number;    int index = ParseStringToUInt32(name, number);    if (index != name.Length())      return E_INVALIDARG;    numThreads = number;  }  return S_OK;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?