int DizList::GetDizPosEx(const string& Name, const string& ShortName, int *TextPos) { int DizPos=GetDizPos(Name,TextPos); if (DizPos==-1) DizPos=GetDizPos(ShortName,TextPos); //если файл описаний был в OEM/ANSI то имена файлов могут не совпадать с юникодными if (DizPos==-1 && !IsUnicodeOrUtfCodePage(OrigCodePage) && OrigCodePage!=CP_DEFAULT) { size_t len = Name.GetLength(); char *tmp = (char *)xf_realloc_nomove(AnsiBuf, len+1); if (!tmp) return -1; AnsiBuf = tmp; WideCharToMultiByte(OrigCodePage, 0, Name, static_cast<int>(len), AnsiBuf, static_cast<int>(len), nullptr, nullptr); AnsiBuf[len]=0; string strRecoded(AnsiBuf, OrigCodePage); if (strRecoded==Name) return -1; return GetDizPos(strRecoded,TextPos); } return DizPos; }
DizList::desc_map::iterator DizList::Find(const string& Name, const string& ShortName) { auto i = DizData.find(Name); if(i == DizData.end()) i = DizData.find(ShortName); //если файл описаний был в OEM/ANSI то имена файлов могут не совпадать с юникодными if (i == DizData.end() && !IsUnicodeOrUtfCodePage(OrigCodePage) && OrigCodePage!=CP_DEFAULT) { const auto tmp = unicode::to(OrigCodePage, Name.data(), Name.size()); const auto strRecoded = wide_n(tmp.data(), tmp.size(), OrigCodePage); if (strRecoded==Name) return DizData.end(); return DizData.find(strRecoded); } return i; }