static bool IsString1PrefixedByString2_NoCase(const wchar_t *u, const char *a) { for (;;) { char c = *a; if (c == 0) return true; if (MyCharLower_Ascii(c) != MyCharLower_Ascii(*u)) return false; a++; u++; } }
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; }
CRefItem(UInt32 index, const CUpdateItem &ui, bool sortByType): UpdateItem(&ui), Index(index), ExtensionPos(0), NamePos(0), ExtensionIndex(0) { if (sortByType) { int slashPos = GetReverseSlashPos(ui.Name); NamePos = slashPos + 1; int dotPos = ui.Name.ReverseFind(L'.'); if (dotPos < 0 || dotPos < slashPos) ExtensionPos = ui.Name.Len(); else { ExtensionPos = dotPos + 1; if (ExtensionPos != ui.Name.Len()) { AString s; for (unsigned pos = ExtensionPos;; pos++) { wchar_t c = ui.Name[pos]; if (c >= 0x80) break; if (c == 0) { ExtensionIndex = GetExtIndex(s); break; } s += (char)MyCharLower_Ascii((char)c); } } } } }