From 548db913dd6c77f12cc2a2b4586c05d9b4f21026 Mon Sep 17 00:00:00 2001 From: Alex Alabuzhev Date: Wed, 9 Mar 2016 22:23:57 +0000 Subject: [PATCH] =?UTF-8?q?1.=20=D0=9F=D1=80=D0=B8=20=D0=B2=D1=8B=D0=B7?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=20Menu.Show("\2qwe\n\4asd")=20=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D1=8F=D0=BB=D0=B8=D1=81=D1=8C=20=D0=BF=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=B1=D1=83=D0=BA=D0=B2=D1=8B=20=D0=B2=20=D0=BF?= =?UTF-8?q?=D1=83=D0=BD=D0=BA=D1=82=D0=B0=D1=85.=202.=20=D0=98=D0=B7=20use?= =?UTF-8?q?r=20menu=20=D0=B2=D1=8B=D0=BA=D0=B8=D0=BD=D1=83=D1=82=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D1=8D=D0=BB=D1=8D=D1=81=D1=82=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B0=20=D0=BF=D1=80=D0=B5=D0=B2?= =?UTF-8?q?=D1=80=D0=B0=D1=89=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BB=D1=8E=D0=B1?= =?UTF-8?q?=D0=BE=D0=B3=D0=BE=20=D0=BA=D1=80=D0=B8=D0=B2=D0=BE=D0=B3=D0=BE?= =?UTF-8?q?=20hotkey=20=D0=B2=20F1.=203.=20=D0=A3=D1=82=D0=BE=D1=87=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20829.2=20-=20=D0=BF=D0=BE=D0=B4=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=B2=D0=BB=D1=8F=D0=B5=D0=BC=20FILE=5FFLAG=5FPOSI?= =?UTF-8?q?X=5FSEMANTICS=20=D0=B8=20=D0=B4=D0=BB=D1=8F=20TRUNCATE=5FEXISTI?= =?UTF-8?q?NG,=20=D1=87=D1=82=D0=BE=D0=B1=D1=8B=20=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=BE=D1=80=20=D1=8D=D1=82=D0=BE=20=D0=BD=D0=BE?= =?UTF-8?q?=D1=80=D0=BC=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=20=D1=81=D0=BE=D1=85?= =?UTF-8?q?=D1=80=D0=B0=D0=BD=D1=8F=D0=BB.=204.=20=D0=9F=D1=80=D0=BE=D1=87?= =?UTF-8?q?=D0=B8=D0=B9=20=D0=BC=D0=B5=D0=BB=D0=BA=D0=B8=D0=B9=20=D1=80?= =?UTF-8?q?=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- far/changelog | 12 ++++- far/farexcpt.cpp | 3 +- far/farwinapi.cpp | 6 ++- far/filelist.cpp | 12 ++--- far/filemasks.cpp | 64 +++++++++++----------- far/macro.cpp | 47 ++++++---------- far/main.cpp | 13 ++--- far/panel.cpp | 2 +- far/panelmix.cpp | 24 +++------ far/pathmix.cpp | 54 ------------------- far/pathmix.hpp | 2 - far/processname.cpp | 128 ++++++++++++++++++++------------------------ far/processname.hpp | 2 +- far/usermenu.cpp | 9 ++-- far/vbuild.m4 | 2 +- 15 files changed, 146 insertions(+), 234 deletions(-) diff --git a/far/changelog b/far/changelog index 492febc854..934f182aac 100644 --- a/far/changelog +++ b/far/changelog @@ -1,4 +1,14 @@ -drkns 08.03.2016 13:23:22 +0200 - build 4573 +drkns 10.03.2016 00:22:16 +0200 - build 4574 + +1. При вызове Menu.Show("\2qwe\n\4asd") терялись первые буквы в пунктах. + +2. Из user menu выкинута прэлэстная логика превращения любого кривого hotkey в F1. + +3. Уточнение 829.2 - подставляем FILE_FLAG_POSIX_SEMANTICS и для TRUNCATE_EXISTING. + +4. Прочий мелкий рефакторинг. + +drkns 08.03.2016 13:23:22 +0200 - build 4573 1. 0003189: Падение Far 3.0 при выставлении в формате командной строки чего-нибудь, содержащего "(%)" diff --git a/far/farexcpt.cpp b/far/farexcpt.cpp index 4fa96c7642..857b52fb77 100644 --- a/far/farexcpt.cpp +++ b/far/farexcpt.cpp @@ -418,8 +418,7 @@ static bool ProcessGenericException(EXCEPTION_POINTERS *xp, const wchar_t* Funct else { const wchar_t* AVs[] = {L"read from ", L"write to ", L"execute at "}; - strBuf = Exception; - strBuf.append(L" (").append(AVs[Offset]).append(Exception).append(L")"); + strBuf = string(Exception) + L" (" + AVs[Offset] + strBuf + L")"; Exception=strBuf.data(); } } diff --git a/far/farwinapi.cpp b/far/farwinapi.cpp index 5f23529699..10e874760b 100644 --- a/far/farwinapi.cpp +++ b/far/farwinapi.cpp @@ -774,7 +774,11 @@ bool RemoveDirectory(const string& DirName) os::handle CreateFile(const string& Object, DWORD DesiredAccess, DWORD ShareMode, LPSECURITY_ATTRIBUTES SecurityAttributes, DWORD CreationDistribution, DWORD FlagsAndAttributes, HANDLE TemplateFile, bool ForceElevation) { NTPath strObject(Object); - FlagsAndAttributes|=FILE_FLAG_BACKUP_SEMANTICS|(CreationDistribution==OPEN_EXISTING?FILE_FLAG_POSIX_SEMANTICS:0); + FlagsAndAttributes |= FILE_FLAG_BACKUP_SEMANTICS; + if (CreationDistribution == OPEN_EXISTING || CreationDistribution == TRUNCATE_EXISTING) + { + FlagsAndAttributes |= FILE_FLAG_POSIX_SEMANTICS; + } os::handle Handle(::CreateFile(strObject.data(), DesiredAccess, ShareMode, SecurityAttributes, CreationDistribution, FlagsAndAttributes, TemplateFile)); if(!Handle) diff --git a/far/filelist.cpp b/far/filelist.cpp index 6834feda16..2554e3db3d 100644 --- a/far/filelist.cpp +++ b/far/filelist.cpp @@ -4008,23 +4008,19 @@ long FileList::SelectFiles(int Mode,const wchar_t *Mask) if (!bUseFilter && WrapBrackets) // возьмем кв.скобки в скобки, чтобы получить { // работоспособную маску - const wchar_t *src = strRawMask.data(); strMask.clear(); - - while (*src) + FOR(const auto& i, strRawMask) { - if (*src==L']' || *src==L'[') + if (i == L']' || i == L'[') { strMask += L'['; - strMask += *src; + strMask += i; strMask += L']'; } else { - strMask += *src; + strMask += i; } - - src++; } } diff --git a/far/filemasks.cpp b/far/filemasks.cpp index b4220e91c8..f7b08aac75 100644 --- a/far/filemasks.cpp +++ b/far/filemasks.cpp @@ -43,39 +43,35 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "stddlg.hpp" #include "strmix.hpp" -const wchar_t ExcludeMaskSeparator = L'|'; -const wchar_t RE_start = L'/', RE_end = L'/'; +static const wchar_t ExcludeMaskSeparator = L'|'; +static const wchar_t RE_start = L'/', RE_end = L'/'; -static inline const wchar_t* SkipSeparators(const wchar_t* masks) +static inline string::const_iterator SkipSeparators(const string::const_iterator& Iterator, const string::const_iterator& End) { - while(*masks == L' ' || *masks == L',' || *masks == L';') - ++masks; - return masks; + return std::find_if_not(Iterator, End, [](wchar_t c) { return c == L' ' || c == L',' || c == L';'; }); } -static inline const wchar_t* SkipMasks(const wchar_t* masks) +static inline string::const_iterator SkipMasks(const string::const_iterator& Iterator, const string::const_iterator& End) { - while(*masks && *masks != RE_start && *masks != ExcludeMaskSeparator) - masks++; - return masks; + return std::find_if(Iterator, End, [](wchar_t c) { return c == RE_start || c == ExcludeMaskSeparator; }); } -static inline const wchar_t* SkipRE(const wchar_t* masks) +static inline string::const_iterator SkipRE(string::const_iterator Iterator, const string::const_iterator& End) { - if (*masks == RE_start) + if (*Iterator != RE_start) { - masks++; + return Iterator; + } - while (*masks && (*masks != RE_end || *(masks-1) == L'\\')) - masks++; + ++Iterator; - if (*masks == RE_end) - masks++; - // options - while (IsAlpha(*masks)) - masks++; - } - return masks; + while (Iterator != End && (*Iterator != RE_end || *(Iterator - 1) == L'\\')) + ++Iterator; + + if (*Iterator == RE_end) + ++Iterator; + // options + return std::find_if_not(Iterator, End, IsAlpha); } class filemasks::masks: noncopyable, swapable @@ -157,7 +153,8 @@ bool filemasks::Set(const string& masks, DWORD Flags) if (!expmasks.empty()) { - const wchar_t* ptr = expmasks.data(); + auto ptr = expmasks.cbegin(); + const auto End = expmasks.cend(); string SimpleMasksInclude, SimpleMasksExclude; @@ -166,14 +163,14 @@ bool filemasks::Set(const string& masks, DWORD Flags) Result = true; - while(*ptr) + while(ptr != End) { - ptr = SkipSeparators(ptr); - auto nextpos = SkipRE(ptr); + ptr = SkipSeparators(ptr, End); + auto nextpos = SkipRE(ptr, End); if (nextpos != ptr) { filemasks::masks m; - Result = m.Set(string(ptr, nextpos - ptr), Flags); + Result = m.Set(string(ptr, nextpos), Flags); if (Result) { DestContainer->emplace_back(std::move(m)); @@ -185,14 +182,14 @@ bool filemasks::Set(const string& masks, DWORD Flags) } ptr = nextpos; } - ptr = SkipSeparators(ptr); - nextpos = SkipMasks(ptr); + ptr = SkipSeparators(ptr, End); + nextpos = SkipMasks(ptr, End); if (nextpos != ptr) { - *DestString += string(ptr, nextpos-ptr); + *DestString += string(ptr, nextpos); ptr = nextpos; } - if (*ptr == ExcludeMaskSeparator) + if (ptr != End && *ptr == ExcludeMaskSeparator) { if (DestContainer != &Exclude) { @@ -339,12 +336,11 @@ bool filemasks::masks::operator ==(const string& FileName) const if (bRE) { intptr_t i = m.size(); - size_t len = FileName.size(); - return re->Search(FileName.data(), FileName.data() + len, const_cast(m.data()), i) != 0; // BUGBUG + return re->Search(FileName.data(), FileName.data() + FileName.size(), const_cast(m.data()), i) != 0; // BUGBUG } else { - return std::any_of(CONST_RANGE(Masks, i) {return CmpName(i.data(), FileName.data(), false) != 0;}); + return std::any_of(CONST_RANGE(Masks, i) { return CmpName(i.data(), FileName.data(), false); }); } } diff --git a/far/macro.cpp b/far/macro.cpp index 267daa5bc5..697349e6a1 100644 --- a/far/macro.cpp +++ b/far/macro.cpp @@ -3224,39 +3224,26 @@ static bool menushowFunc(FarMacroCall* Data) if (NewItem.strName!=L"\n") { - const wchar_t *CurrentChar = NewItem.strName.data(); - bool bContunue=(*CurrentChar<=L'\x4'); - while(*CurrentChar && bContunue) - { - switch (*CurrentChar) + const auto CharToFlag = [](wchar_t c) -> LISTITEMFLAGS { - case L'\x1': - NewItem.Flags|=LIF_SEPARATOR; - CurrentChar++; - break; - - case L'\x2': - NewItem.Flags|=LIF_CHECKED; - CurrentChar++; - break; - - case L'\x3': - NewItem.Flags|=LIF_DISABLE; - CurrentChar++; - break; + switch (c) + { + case L'\x1': return LIF_SEPARATOR; + case L'\x2': return LIF_CHECKED; + case L'\x3': return LIF_DISABLE; + case L'\x4': return LIF_GRAYED; + default: return 0; + } + }; - case L'\x4': - NewItem.Flags|=LIF_GRAYED; - CurrentChar++; - break; + const auto NewBegin = std::find_if(CONST_RANGE(NewItem.strName, i) -> bool + { + auto Flag = CharToFlag(i); + NewItem.Flags |= Flag; + return !Flag; + }); - default: - bContunue=false; - CurrentChar++; - break; - } - } - NewItem.strName=CurrentChar; + NewItem.strName.erase(NewItem.strName.cbegin(), NewBegin); } else NewItem.strName.clear(); diff --git a/far/main.cpp b/far/main.cpp index df7ee2bb80..136a03ccd6 100644 --- a/far/main.cpp +++ b/far/main.cpp @@ -179,7 +179,6 @@ static int MainProcess( else { int DirCount=0; - string strPath; // воспользуемся тем, что ControlObject::Init() создает панели // юзая Global->Opt->* @@ -187,9 +186,11 @@ static int MainProcess( const auto SetupPanel = [&](bool active) { ++DirCount; - strPath = active? apanel : ppanel; - CutToNameUNC(strPath); - DeleteEndSlash(strPath); //BUGBUG!! если конечный слеш не убрать - получаем забавный эффект - отсутствует ".." + string strPath = active? apanel : ppanel; + if (os::fs::is_file(strPath)) + { + CutToParent(strPath); + } bool Root = false; const auto Type = ParsePath(strPath, nullptr, &Root); @@ -243,7 +244,7 @@ static int MainProcess( } else { - strPath = PointToName(ppanel); + string strPath = PointToName(ppanel); if (!strPath.empty()) { @@ -268,7 +269,7 @@ static int MainProcess( } else { - strPath = PointToName(apanel); + string strPath = PointToName(apanel); if (!strPath.empty()) { diff --git a/far/panel.cpp b/far/panel.cpp index 00b6b48f5a..c853cdf3d9 100644 --- a/far/panel.cpp +++ b/far/panel.cpp @@ -681,7 +681,7 @@ int Panel::SetCurPath() else // оппа... { string strTemp(m_CurDir); - CutToFolderNameIfFolder(m_CurDir); // подымаемся вверх, для очередной порции ChDir + CutToParent(m_CurDir); // подымаемся вверх, для очередной порции ChDir if (strTemp.size()==m_CurDir.size()) // здесь проблема - видимо диск недоступен { diff --git a/far/panelmix.cpp b/far/panelmix.cpp index 8a553941d8..2bb04fbe93 100644 --- a/far/panelmix.cpp +++ b/far/panelmix.cpp @@ -319,11 +319,9 @@ void TextToViewSettings(const string& ColumnTitles,const string& ColumnWidths, s if (strArgName.front() == L'N') { NewColumn.type = NAME_COLUMN; - const wchar_t *Ptr = strArgName.data() + 1; - - while (*Ptr) + FOR(const auto& i, make_range(strArgName.cbegin() + 1, strArgName.cend())) { - switch (*Ptr) + switch (i) { case L'M': NewColumn.type |= COLUMN_MARK; @@ -344,18 +342,14 @@ void TextToViewSettings(const string& ColumnTitles,const string& ColumnWidths, s NewColumn.type |= COLUMN_NOEXTENSION; break; } - - Ptr++; } } else if (strArgName.front() == L'S' || strArgName.front() == L'P' || strArgName.front() == L'G') { NewColumn.type = (strArgName.front() == L'S') ? SIZE_COLUMN : (strArgName.front() == L'P') ? PACKED_COLUMN : STREAMSSIZE_COLUMN; - const wchar_t *Ptr = strArgName.data() + 1; - - while (*Ptr) + FOR(const auto& i, make_range(strArgName.cbegin() + 1, strArgName.cend())) { - switch (*Ptr) + switch (i) { case L'C': NewColumn.type |= COLUMN_COMMAS; @@ -370,8 +364,6 @@ void TextToViewSettings(const string& ColumnTitles,const string& ColumnWidths, s NewColumn.type |= COLUMN_THOUSAND; break; } - - Ptr++; } } else if (!StrCmpN(strArgName.data(), L"DM", 2) || !StrCmpN(strArgName.data(), L"DC", 2) || !StrCmpN(strArgName.data(), L"DA", 2) || !StrCmpN(strArgName.data(), L"DE", 2)) @@ -392,11 +384,9 @@ void TextToViewSettings(const string& ColumnTitles,const string& ColumnWidths, s break; } - const wchar_t *Ptr = strArgName.data() + 2; - - while (*Ptr) + FOR(const auto& i, make_range(strArgName.cbegin() + 2, strArgName.cend())) { - switch (*Ptr) + switch (i) { case L'B': NewColumn.type |= COLUMN_BRIEF; @@ -405,8 +395,6 @@ void TextToViewSettings(const string& ColumnTitles,const string& ColumnWidths, s NewColumn.type |= COLUMN_MONTH; break; } - - Ptr++; } } else if (strArgName.front() == L'O') diff --git a/far/pathmix.cpp b/far/pathmix.cpp index b19106cd9d..3ffca8b52d 100644 --- a/far/pathmix.cpp +++ b/far/pathmix.cpp @@ -406,60 +406,6 @@ bool CutToParent(string &strStr) return Result; } -string &CutToNameUNC(string &strPath) -{ - const wchar_t* Path = strPath.data(); - - if (IsSlash(Path[0]) && IsSlash(Path[1])) - { - Path+=2; - - for (int i=0; i<2; i++) - { - while (*Path && !IsSlash(*Path)) - Path++; - - if (*Path) - Path++; - } - } - - const wchar_t* NamePtr = Path; - - while (*Path) - { - if (IsSlash(*Path) || (*Path==L':' && Path == NamePtr+1)) - NamePtr = Path+1; - - Path++; - } - - strPath.resize(NamePtr - strPath.data()); - - return strPath; -} - -string &CutToFolderNameIfFolder(string &strPath) -{ - const wchar_t* Path = strPath.data(); - const wchar_t* NamePtr=Path, *prevNamePtr=Path; - - while (*Path) - { - if (IsSlash(*Path) || (*Path==L':' && Path==NamePtr+1)) - { - prevNamePtr=NamePtr; - NamePtr=Path+1; - } - - ++Path; - } - - size_t size = *NamePtr ? NamePtr - strPath.data() : prevNamePtr - strPath.data(); - strPath.resize(size); - return strPath; -} - bool ContainsSlash(const wchar_t *Str) { const auto Iterator = null_iterator(Str); diff --git a/far/pathmix.hpp b/far/pathmix.hpp index 5ea91159dd..0dc8b66037 100644 --- a/far/pathmix.hpp +++ b/far/pathmix.hpp @@ -70,8 +70,6 @@ bool PathCanHoldRegularFile(const string& Path); bool IsPluginPrefixPath(const string &Path); bool CutToSlash(string &strStr, bool bInclude = false); // BUGBUG, deprecated. Use CutToParent. bool CutToParent(string &strStr); -string &CutToNameUNC(string &strPath); -string &CutToFolderNameIfFolder(string &strPath); const wchar_t* PointToName(const wchar_t *Path); const wchar_t* PointToName(const wchar_t *Path,const wchar_t* EndPtr); const wchar_t* PointToFolderNameIfFolder(const wchar_t *Path); diff --git a/far/processname.cpp b/far/processname.cpp index cda8876106..e5de0194cc 100644 --- a/far/processname.cpp +++ b/far/processname.cpp @@ -129,12 +129,14 @@ bool ConvertWildcards(const string& SrcName, string &strDest, int SelectedFolder return true; } - -// IS: это реальное тело функции сравнения с маской, но использовать -// IS: "снаружи" нужно не эту функцию, а CmpName (ее тело расположено -// IS: после CmpName_Body) -static int CmpName_Body(const wchar_t *pattern,const wchar_t *str, bool CmpNameSearchMode) +bool CmpName(const wchar_t *pattern, const wchar_t *str, bool skippath, bool CmpNameSearchMode) { + if (!pattern || !str) + return false; + + if (skippath) + str = PointToName(str); + for (;; ++str) { /* $ 01.05.2001 DJ @@ -145,59 +147,58 @@ static int CmpName_Body(const wchar_t *pattern,const wchar_t *str, bool CmpNameS switch (patternc) { - case 0: - return !stringc; - case L'?': - - if (!stringc) - return FALSE; + case 0: + return !stringc; - break; - case L'*': + case L'?': + if (!stringc) + return false; + break; - if (!*pattern) - return TRUE; + case L'*': + if (!*pattern) + return true; + + /* $ 01.05.2001 DJ + оптимизированная ветка работает и для имен с несколькими + точками + */ + if (*pattern==L'.') + { + if (pattern[1]==L'*' && !pattern[2]) + return true; - /* $ 01.05.2001 DJ - оптимизированная ветка работает и для имен с несколькими - точками - */ - if (*pattern==L'.') + if (!wcspbrk(pattern, L"*?[")) { - if (pattern[1]==L'*' && !pattern[2]) - return TRUE; + const wchar_t *dot = wcsrchr(str, L'.'); - if (!wcspbrk(pattern, L"*?[")) - { - const wchar_t *dot = wcsrchr(str, L'.'); + if (!pattern[1]) + return !dot || !dot[1]; - if (!pattern[1]) - return !dot || !dot[1]; + const wchar_t *patdot = wcschr(pattern+1, L'.'); - const wchar_t *patdot = wcschr(pattern+1, L'.'); + if (patdot && !dot) + return false; - if (patdot && !dot) - return FALSE; - - if (!patdot && dot ) - return !StrCmpI(pattern+1,dot+1); - } + if (!patdot && dot ) + return !StrCmpI(pattern+1,dot+1); } + } - do - { - if(CmpName(pattern,str,false,CmpNameSearchMode)) - return TRUE; - } - while (*str++); + do + { + if(CmpName(pattern,str,false,CmpNameSearchMode)) + return true; + } + while (*str++); + return false; - return FALSE; - case L'[': + case L'[': { if (!wcschr(pattern,L']')) { if (patternc != stringc) - return FALSE; + return false; break; } @@ -205,7 +206,7 @@ static int CmpName_Body(const wchar_t *pattern,const wchar_t *str, bool CmpNameS if (*pattern && *(pattern+1)==L']') { if (*pattern!=*str) - return FALSE; + return false; pattern+=2; break; @@ -220,7 +221,7 @@ static int CmpName_Body(const wchar_t *pattern,const wchar_t *str, bool CmpNameS if (match) break; else - return FALSE; + return false; } if (match) @@ -229,7 +230,7 @@ static int CmpName_Body(const wchar_t *pattern,const wchar_t *str, bool CmpNameS if (rangec == L'-' && *(pattern - 2) != L'[' && *pattern != L']') { match = (stringc <= ToUpper(*pattern) && - ToUpper(*(pattern - 2)) <= stringc); + ToUpper(*(pattern - 2)) <= stringc); pattern++; } else @@ -237,32 +238,19 @@ static int CmpName_Body(const wchar_t *pattern,const wchar_t *str, bool CmpNameS } if (!rangec) - return FALSE; + return false; } - break; - default: - - if (patternc != stringc) - { - if (patternc==L'.' && !stringc && !CmpNameSearchMode) - return *pattern != L'.' && CmpName(pattern, str, true, CmpNameSearchMode); - else - return FALSE; - } + break; - break; + default: + if (patternc != stringc) + { + if (patternc==L'.' && !stringc && !CmpNameSearchMode) + return *pattern != L'.' && CmpName(pattern, str, true, CmpNameSearchMode); + else + return false; + } + break; } } } - -// IS: функция для внешнего мира, использовать ее -int CmpName(const wchar_t *pattern,const wchar_t *str, bool skippath, bool CmpNameSearchMode) -{ - if (!pattern || !str) - return FALSE; - - if (skippath) - str=PointToName(str); - - return CmpName_Body(pattern,str,CmpNameSearchMode); -} diff --git a/far/processname.hpp b/far/processname.hpp index 17680cf55c..6473772cf7 100644 --- a/far/processname.hpp +++ b/far/processname.hpp @@ -37,6 +37,6 @@ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // обработать имя файла: сравнить с маской, масками, сгенерировать по маске bool ConvertWildcards(const string& SrcName,string &strDest, int SelectedFolderNameLength); -int CmpName(const wchar_t *pattern, const wchar_t *str, bool skippath=true, bool CmpNameSearchMode=false); +bool CmpName(const wchar_t *pattern, const wchar_t *str, bool skippath=true, bool CmpNameSearchMode=false); #endif // PROCESSNAME_HPP_8DEB440D_A0C0_40CB_9960_AF2BCD568A88 diff --git a/far/usermenu.cpp b/far/usermenu.cpp index c6e2ac7518..c216831e9b 100644 --- a/far/usermenu.cpp +++ b/far/usermenu.cpp @@ -93,22 +93,21 @@ static int PrepareHotKey(string &strHotKey) { int FuncNum=0; - if (strHotKey.size() > 1) + if (strHotKey.size() > 1 && ToUpper(strHotKey.front()) == L'F') { - // если хоткей больше 1 символа, считаем это случаем "F?", причем при кривизне всегда будет "F1" FuncNum = static_cast(std::wcstoul(strHotKey.data() + 1, nullptr, 10)); if (FuncNum < 1 || FuncNum > 24) { - FuncNum=1; - strHotKey=L"F1"; + FuncNum = 0; + strHotKey.clear(); } } else { // при наличии "&" продублируем if (strHotKey == L"&") - strHotKey += L"&"; + strHotKey.assign(2, L'&'); } return FuncNum; diff --git a/far/vbuild.m4 b/far/vbuild.m4 index 12aa9384da..9b533819cd 100644 --- a/far/vbuild.m4 +++ b/far/vbuild.m4 @@ -1 +1 @@ -m4_define(BUILD,4573)m4_dnl +m4_define(BUILD,4574)m4_dnl