Skip to content

Commit

Permalink
1. При вызове Menu.Show("\2qwe\n\4asd") терялись первые буквы в пунктах.
Browse files Browse the repository at this point in the history
2. Из user menu выкинута прэлэстная логика превращения любого кривого hotkey в F1.
3. Уточнение 829.2 - подставляем FILE_FLAG_POSIX_SEMANTICS и для TRUNCATE_EXISTING, чтобы редактор это нормально сохранял.
4. Прочий мелкий рефакторинг.
  • Loading branch information
alabuzhev committed Mar 9, 2016
1 parent 8de1cba commit 548db91
Show file tree
Hide file tree
Showing 15 changed files with 146 additions and 234 deletions.
12 changes: 11 additions & 1 deletion 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 при выставлении в формате командной строки чего-нибудь, содержащего "(%)"

Expand Down
3 changes: 1 addition & 2 deletions far/farexcpt.cpp
Expand Up @@ -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();
}
}
Expand Down
6 changes: 5 additions & 1 deletion far/farwinapi.cpp
Expand Up @@ -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)
Expand Down
12 changes: 4 additions & 8 deletions far/filelist.cpp
Expand Up @@ -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++;
}
}

Expand Down
64 changes: 30 additions & 34 deletions far/filemasks.cpp
Expand Up @@ -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<masks>
Expand Down Expand Up @@ -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;

Expand All @@ -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));
Expand All @@ -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)
{
Expand Down Expand Up @@ -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<RegExpMatch *>(m.data()), i) != 0; // BUGBUG
return re->Search(FileName.data(), FileName.data() + FileName.size(), const_cast<RegExpMatch *>(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); });
}
}

Expand Down
47 changes: 17 additions & 30 deletions far/macro.cpp
Expand Up @@ -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();
Expand Down
13 changes: 7 additions & 6 deletions far/main.cpp
Expand Up @@ -179,17 +179,18 @@ static int MainProcess(
else
{
int DirCount=0;
string strPath;

// воспользуемся тем, что ControlObject::Init() создает панели
// юзая Global->Opt->*

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);
Expand Down Expand Up @@ -243,7 +244,7 @@ static int MainProcess(
}
else
{
strPath = PointToName(ppanel);
string strPath = PointToName(ppanel);

if (!strPath.empty())
{
Expand All @@ -268,7 +269,7 @@ static int MainProcess(
}
else
{
strPath = PointToName(apanel);
string strPath = PointToName(apanel);

if (!strPath.empty())
{
Expand Down
2 changes: 1 addition & 1 deletion far/panel.cpp
Expand Up @@ -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()) // здесь проблема - видимо диск недоступен
{
Expand Down
24 changes: 6 additions & 18 deletions far/panelmix.cpp
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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))
Expand All @@ -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;
Expand All @@ -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')
Expand Down

0 comments on commit 548db91

Please sign in to comment.