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); }
bool ParseVolumeSizes(const UString &s, CRecordVector<UInt64> &values) { values.Clear(); bool prevIsNumber = false; for (unsigned i = 0; i < s.Len();) { wchar_t c = s[i++]; if (c == L' ') continue; if (c == L'-') return true; if (prevIsNumber) { prevIsNumber = false; unsigned numBits = 0; switch (MyCharLower_Ascii(c)) { case 'b': continue; case 'k': numBits = 10; break; case 'm': numBits = 20; break; case 'g': numBits = 30; break; case 't': numBits = 40; break; } if (numBits != 0) { UInt64 &val = values.Back(); if (val >= ((UInt64)1 << (64 - numBits))) return false; val <<= numBits; for (; i < s.Len(); i++) if (s[i] == L' ') break; continue; } } i--; const wchar_t *start = s.Ptr(i); const wchar_t *end; UInt64 val = ConvertStringToUInt64(start, &end); if (start == end) return false; if (val == 0) return false; values.Add(val); prevIsNumber = true; i += (unsigned)(end - start); } return true; }
bool ParseVolumeSizes(const UString &s, CRecordVector<UInt64> &values) { values.Clear(); UStringVector destStrings; SplitString(s, destStrings); bool prevIsNumber = false; for (int i = 0; i < destStrings.Size(); i++) { UString subString = destStrings[i]; subString.MakeUpper(); if (subString.IsEmpty()) return false; if (subString == L"-") return true; if (prevIsNumber) { wchar_t c = subString[0]; UInt64 &value = values.Back(); prevIsNumber = false; switch(c) { case L'B': continue; case L'K': value <<= 10; continue; case L'M': value <<= 20; continue; case L'G': value <<= 30; continue; } } const wchar_t *start = subString; const wchar_t *end; UInt64 value = ConvertStringToUInt64(start, &end); if (start == end) return false; if (value == 0) return false; values.Add(value); prevIsNumber = true; UString rem = subString.Mid((int)(end - start)); if (!rem.IsEmpty()) destStrings.Insert(i + 1, rem); } return true; }
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 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 bool CheckShellExtensionInfo2(const CSysString &extension, UString &iconPath, int &iconIndex) { iconIndex = -1; iconPath.Empty(); NSynchronization::CCriticalSectionLock lock(g_CriticalSection); CKey extKey; if (extKey.Open(HKEY_CLASSES_ROOT, GetExtensionKeyName(extension), KEY_READ) != ERROR_SUCCESS) return false; CSysString programNameValue; if (extKey.QueryValue(NULL, programNameValue) != ERROR_SUCCESS) return false; CSysString extProgramKeyName = GetExtProgramKeyName(extension); UString programNameValueU = GetUnicodeString(programNameValue); if (programNameValueU.CompareNoCase(GetUnicodeString(extProgramKeyName)) != 0) return false; CKey iconKey; if (extKey.Open(HKEY_CLASSES_ROOT, extProgramKeyName + CSysString(TEXT(CHAR_PATH_SEPARATOR)) + kDefaultIconKeyName, KEY_READ) != ERROR_SUCCESS) return false; UString value; if (extKey.QueryValue(NULL, value) == ERROR_SUCCESS) { int pos = value.ReverseFind(L','); iconPath = value; if (pos >= 0) { const wchar_t *end; UInt64 index = ConvertStringToUInt64((const wchar_t *)value + pos + 1, &end); if (*end == 0) { iconIndex = (int)index; iconPath = value.Left(pos); } } } return true; }
Int64 ConvertStringToInt64(const char *s, const char **end) { if (*s == '-') return -(Int64)ConvertStringToUInt64(s + 1, end); return ConvertStringToUInt64(s, end); }