diff --git a/grepWinNP3/grepWinNP3.vcxproj b/grepWinNP3/grepWinNP3.vcxproj
index 09f1dc0c6..52f7a6ef2 100644
--- a/grepWinNP3/grepWinNP3.vcxproj
+++ b/grepWinNP3/grepWinNP3.vcxproj
@@ -521,16 +521,16 @@
-
-
-
+
+
+
This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
-
-
-
+
+
+
\ No newline at end of file
diff --git a/grepWinNP3/packages.config b/grepWinNP3/packages.config
index 0202a93ad..f072f402c 100644
--- a/grepWinNP3/packages.config
+++ b/grepWinNP3/packages.config
@@ -1,6 +1,6 @@
-
-
-
+
+
+
\ No newline at end of file
diff --git a/grepWinNP3/sktoolslib_mod/BaseDialog.cpp b/grepWinNP3/sktoolslib_mod/BaseDialog.cpp
index 2c67dc834..244dad2b9 100644
--- a/grepWinNP3/sktoolslib_mod/BaseDialog.cpp
+++ b/grepWinNP3/sktoolslib_mod/BaseDialog.cpp
@@ -26,7 +26,7 @@
static HWND g_hDlgCurrent = nullptr;
-INT_PTR CDialog::DoModal(HINSTANCE hInstance, int resID, HWND hWndParent)
+INT_PTR CDialog::DoModal(HINSTANCE hInstance, int resID, HWND hWndParent)
{
m_bPseudoModal = false;
hResource = hInstance;
@@ -142,7 +142,7 @@ void CDialog::InitDialog(HWND hwndDlg, UINT iconID, bool bPosition /* = true*/)
WINDOWPLACEMENT placement;
placement.length = sizeof(WINDOWPLACEMENT);
- HWND hwndOwner = ::GetParent(hwndDlg);
+ HWND hwndOwner = ::GetParent(hwndDlg);
GetWindowPlacement(hwndOwner, &placement);
if ((hwndOwner == nullptr) || (placement.showCmd == SW_SHOWMINIMIZED) || (placement.showCmd == SW_SHOWMINNOACTIVE))
hwndOwner = ::GetDesktopWindow();
@@ -204,8 +204,8 @@ INT_PTR CALLBACK CDialog::stDlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPAR
{
// get the pointer to the window from lpCreateParams
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam);
- pWnd = reinterpret_cast(lParam);
- pWnd->m_hwnd = hwndDlg;
+ pWnd = reinterpret_cast(lParam);
+ pWnd->m_hwnd = hwndDlg;
// create the tooltip control
pWnd->m_hToolTips = CreateWindowEx(0,
TOOLTIPS_CLASS, nullptr,
@@ -242,7 +242,7 @@ INT_PTR CALLBACK CDialog::stDlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPAR
bInDlgProc = true;
DefDlgProc(hwndDlg, uMsg, wParam, lParam);
bInDlgProc = false;
- HDC hdc = reinterpret_cast(wParam);
+ HDC hdc = reinterpret_cast(wParam);
// draw the frame margins in black
RECT rc;
GetClientRect(hwndDlg, &rc);
@@ -539,7 +539,7 @@ BOOL CDialog::IsDialogMessage(LPMSG lpMsg)
void CDialog::AdjustControlSize(UINT nID)
{
- HWND hwndDlgItem = GetDlgItem(*this, nID);
+ HWND hwndDlgItem = GetDlgItem(*this, nID);
// adjust the size of the control to fit its content
auto sControlText = GetDlgItemText(nID);
// next step: find the rectangle the control text needs to
@@ -553,11 +553,11 @@ void CDialog::AdjustControlSize(UINT nID)
RECT controlRectOrig = controlRect;
if (hDC)
{
- HFONT hFont = GetWindowFont(hwndDlgItem);
+ HFONT hFont = GetWindowFont(hwndDlgItem);
HFONT hOldFont = static_cast(SelectObject(hDC, hFont));
OffsetRect(&controlRect, -controlRect.left, -controlRect.top);
if (DrawText(hDC, sControlText.get(), -1, &controlRect, DT_WORDBREAK | DT_EXPANDTABS | DT_LEFT | DT_CALCRECT))
- {
+ {
// we're dealing with radio buttons and check boxes,
// which means we have to add a little space for the checkbox
const int checkWidth = GetSystemMetrics(SM_CXMENUCHECK) + 2 * GetSystemMetrics(SM_CXEDGE) + CDPIAware::Instance().Scale(*this, 3);
@@ -565,7 +565,7 @@ void CDialog::AdjustControlSize(UINT nID)
// now we have the rectangle the control really needs
if ((controlRectOrig.right - controlRectOrig.left) > (controlRect.right - controlRect.left))
{
- controlRectOrig.right = controlRectOrig.left + (controlRect.right - controlRect.left);
+ controlRectOrig.right = controlRectOrig.left + (controlRect.right - controlRect.left);
MoveWindow(hwndDlgItem, controlRectOrig.left, controlRectOrig.top, controlRectOrig.right - controlRectOrig.left, controlRectOrig.bottom - controlRectOrig.top, TRUE);
}
}
diff --git a/grepWinNP3/sktoolslib_mod/DebugOutput.h b/grepWinNP3/sktoolslib_mod/DebugOutput.h
index bb05720de..ef08ac22f 100644
--- a/grepWinNP3/sktoolslib_mod/DebugOutput.h
+++ b/grepWinNP3/sktoolslib_mod/DebugOutput.h
@@ -172,7 +172,7 @@ private:
#ifdef _DEBUG
m_bActive = true;
#else
- m_bActive = !!CRegStdDWORD(DEBUGOUTPUTREGPATH, FALSE);
+ m_bActive = !!CRegStdDWORD(DEBUGOUTPUTREGPATH, FALSE);
#endif
}
~CTraceToOutputDebugString()
@@ -186,7 +186,7 @@ private:
static CTraceToOutputDebugString* m_pInstance;
// Non Unicode output helper
- void TraceV(PCSTR pszFormat, va_list args) const
+ void TraceV(PCSTR pszFormat, va_list args) const
{
// Format the output buffer
char szBuffer[1024];
diff --git a/grepWinNP3/sktoolslib_mod/Language.cpp b/grepWinNP3/sktoolslib_mod/Language.cpp
index cc6393970..4d151cf66 100644
--- a/grepWinNP3/sktoolslib_mod/Language.cpp
+++ b/grepWinNP3/sktoolslib_mod/Language.cpp
@@ -78,7 +78,7 @@ bool CLanguage::LoadFile(const std::wstring& path)
file.getline(line.get(), 2 * MAX_STRING_LENGTH);
if (line.get()[0] == 0)
{
- //empty line means end of entry!
+ // empty line means end of entry!
std::wstring msgId;
std::wstring msgStr;
int type = 0;
@@ -86,24 +86,24 @@ bool CLanguage::LoadFile(const std::wstring& path)
{
if (wcsncmp(I->c_str(), L"# ", 2) == 0)
{
- //user comment
+ // user comment
type = 0;
}
if (wcsncmp(I->c_str(), L"#.", 2) == 0)
{
- //automatic comments
+ // automatic comments
type = 0;
}
if (wcsncmp(I->c_str(), L"#,", 2) == 0)
{
- //flag
+ // flag
type = 0;
}
if (wcsncmp(I->c_str(), L"msgid", 5) == 0)
{
- //message id
- msgId = I->c_str();
- msgId = std::wstring(msgId.substr(7, msgId.size() - 8));
+ // message id
+ msgId = I->c_str();
+ msgId = std::wstring(msgId.substr(7, msgId.size() - 8));
std::wstring s = msgId;
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](wint_t c) { return !iswspace(c); }));
@@ -273,7 +273,7 @@ BOOL CALLBACK CLanguage::TranslateWindowProc(HWND hwnd, LPARAM lParam)
// now we have the rectangle the control really needs
if ((controlRectOrig.right - controlRectOrig.left) > (controlRect.right - controlRect.left))
{
- controlRectOrig.right = controlRectOrig.left + (controlRect.right - controlRect.left);
+ controlRectOrig.right = controlRectOrig.left + (controlRect.right - controlRect.left);
MoveWindow(hwnd, controlRectOrig.left, controlRectOrig.top, controlRectOrig.right - controlRectOrig.left, controlRectOrig.bottom - controlRectOrig.top, TRUE);
}
}
@@ -303,7 +303,7 @@ BOOL CALLBACK CLanguage::TranslateWindowProc(HWND hwnd, LPARAM lParam)
{
// translate hint texts in edit controls
constexpr int bufCount = 4096;
- auto buf = std::make_unique(bufCount);
+ auto buf = std::make_unique(bufCount);
SecureZeroMemory(buf.get(), bufCount * sizeof(wchar_t));
Edit_GetCueBannerText(hwnd, buf.get(), bufCount);
auto sTranslated = GetTranslatedString(buf.get(), pLangMap);
@@ -312,8 +312,8 @@ BOOL CALLBACK CLanguage::TranslateWindowProc(HWND hwnd, LPARAM lParam)
else if (wcscmp(className, TOOLTIPS_CLASS) == 0)
{
constexpr int bufCount = 4096;
- auto buf = std::make_unique(bufCount);
- auto toolCount = static_cast(SendMessage(hwnd, TTM_GETTOOLCOUNT, 0, 0));
+ auto buf = std::make_unique(bufCount);
+ auto toolCount = static_cast(SendMessage(hwnd, TTM_GETTOOLCOUNT, 0, 0));
for (int i = 0; i < toolCount; ++i)
{
SecureZeroMemory(buf.get(), bufCount * sizeof(wchar_t));
diff --git a/grepWinNP3/sktoolslib_mod/PathUtils.cpp b/grepWinNP3/sktoolslib_mod/PathUtils.cpp
index 5826247b5..ffa24c44e 100644
--- a/grepWinNP3/sktoolslib_mod/PathUtils.cpp
+++ b/grepWinNP3/sktoolslib_mod/PathUtils.cpp
@@ -1,6 +1,6 @@
// sktoolslib - common files for SK tools
-// Copyright (C) 2013-2015, 2017, 2020-2022 - Stefan Kueng
+// Copyright (C) 2013-2015, 2017, 2020-2023 - Stefan Kueng
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -121,6 +121,17 @@ std::wstring CPathUtils::GetLongPathname(const std::wstring& path)
}
if (ret == 0)
return path;
+ if (sRet.starts_with('\\'))
+ {
+ ret = GetFullPathName(sRet.c_str(), 0, nullptr, nullptr);
+ if (ret)
+ {
+ auto fullPath = std::make_unique(ret + 2);
+ ret = GetFullPathName(sRet.c_str(), ret + 1, fullPath.get(), nullptr);
+ if (ret)
+ sRet = std::wstring(fullPath.get(), ret);
+ }
+ }
return sRet;
}
diff --git a/grepWinNP3/sktoolslib_mod/StringUtils.h b/grepWinNP3/sktoolslib_mod/StringUtils.h
index b34e7094a..3201537eb 100644
--- a/grepWinNP3/sktoolslib_mod/StringUtils.h
+++ b/grepWinNP3/sktoolslib_mod/StringUtils.h
@@ -47,9 +47,9 @@
* not found
* @endcode
*/
-int strwildcmp(const char* wild, const char* string);
-int wcswildcmp(const wchar_t* wild, const wchar_t* string);
-int wcswildicmp(const wchar_t* wild, const wchar_t* string);
+int strwildcmp(const char* wild, const char* string);
+int wcswildcmp(const wchar_t* wild, const wchar_t* string);
+int wcswildicmp(const wchar_t* wild, const wchar_t* string);
bool WriteAsciiStringToClipboard(const wchar_t* sClipdata, HWND hOwningWnd);
void SearchReplace(std::wstring& str, const std::wstring& toreplace, const std::wstring& replacewith);
@@ -274,13 +274,13 @@ std::wstring to_bit_wstring(T number, bool trimSignificantClearBits)
{
// Unsigned version of type given.
using UT = typename std::make_unsigned::type;
- UT one = 1;
- UT zero = 0;
- UT uNumber;
- uNumber = UT(number);
+ UT one = 1;
+ UT zero = 0;
+ UT uNumber;
+ uNumber = UT(number);
constexpr int nBits = std::numeric_limits::digits;
- std::wstring bs;
- bool seenSetBit = false;
+ std::wstring bs;
+ bool seenSetBit = false;
for (int bn = nBits - 1; bn >= 0; --bn)
{
UT mask = one << bn;
@@ -300,9 +300,9 @@ std::string to_bit_string(T number, bool trimSignificantClearBits)
{
// Unsigned version of type given.
using UT = typename std::make_unsigned::type;
- UT one = 1;
- UT zero = 0;
- UT uNumber;
+ UT one = 1;
+ UT zero = 0;
+ UT uNumber;
uNumber = UT(number);
const int nBits = std::numeric_limits::digits;
std::string bs;
diff --git a/grepWinNP3/sktoolslib_mod/TextFile.cpp b/grepWinNP3/sktoolslib_mod/TextFile.cpp
index 6b4b5b379..b681e1b59 100644
--- a/grepWinNP3/sktoolslib_mod/TextFile.cpp
+++ b/grepWinNP3/sktoolslib_mod/TextFile.cpp
@@ -21,7 +21,6 @@
#include "TextFile.h"
#include "PathUtils.h"
#include "maxpath.h"
-#include
#include
static wchar_t WideCharSwap(wchar_t nValue)
@@ -86,7 +85,7 @@ bool CTextFile::Save(LPCWSTR path, bool keepFileDate) const
return true;
}
-bool CTextFile::Load(LPCWSTR path, UnicodeType &type, bool bUTF8, std::atomic_bool& bCancelled)
+bool CTextFile::Load(LPCWSTR path, UnicodeType &type, bool bUTF8, std::atomic_bool &bCancelled)
{
encoding = AutoType;
type = AutoType;
@@ -284,7 +283,7 @@ bool CTextFile::Load(LPCWSTR path, UnicodeType &type, bool bUTF8, std::atomic_bo
return false;
}
}
- else //if (encoding == ANSI)
+ else // if (encoding == ANSI)
{
try
{
@@ -436,12 +435,12 @@ CTextFile::UnicodeType CTextFile::CheckUnicodeType(BYTE *pBuffer, int cb) const
{
if (cb < 2)
return Ansi;
- UINT16 *pVal16 = reinterpret_cast(pBuffer);
- UINT8 * pVal8 = reinterpret_cast(pVal16 + 1);
+ UINT16 *pVal16 = reinterpret_cast(pBuffer);
+ UINT8 *pVal8 = reinterpret_cast(pVal16 + 1);
// scan the whole buffer for a 0x0000 sequence
// if found, we assume a binary file
- int nNull = 0;
- int nDblNull = 0;
+ int nNull = 0;
+ int nDblNull = 0;
for (int i = 0; i < (cb - 2); i = i + 2)
{
if (0x0000 == *pVal16++)
@@ -523,7 +522,7 @@ CTextFile::UnicodeType CTextFile::CheckUnicodeType(BYTE *pBuffer, int cb) const
return Ansi;
}
-bool CTextFile::CalculateLines(std::atomic_bool& bCancelled)
+bool CTextFile::CalculateLines(std::atomic_bool &bCancelled)
{
// fill an array with starting positions for every line in the loaded file
if (pFileBuf == nullptr)
diff --git a/grepWinNP3/sktoolslib_mod/TextFile.h b/grepWinNP3/sktoolslib_mod/TextFile.h
index 1005d78d6..4920c7c89 100644
--- a/grepWinNP3/sktoolslib_mod/TextFile.h
+++ b/grepWinNP3/sktoolslib_mod/TextFile.h
@@ -59,17 +59,17 @@ public:
* \param newLen length of the new file content in bytes
* \note the old buffer is automatically freed.
*/
- bool ContentsModified(std::unique_ptr pBuf, DWORD newLen);
+ bool ContentsModified(std::unique_ptr pBuf, DWORD newLen);
/**
* Returns the line number from a given character position inside the file.
*/
- long LineFromPosition(long pos) const;
+ long LineFromPosition(long pos) const;
/**
* Returns the line from a given line number
*/
- std::wstring GetLineString(long lineNumber) const;
+ std::wstring GetLineString(long lineNumber) const;
/**
* Returns the file content as a text string.
@@ -81,17 +81,17 @@ public:
* Returns a pointer to the file contents. Call GetFileLength() to get
* the size in number of bytes of this buffer.
*/
- LPVOID GetFileContent() const { return pFileBuf.get(); }
+ LPVOID GetFileContent() const { return pFileBuf.get(); }
/**
* Returns the size of the file in bytes
*/
- long GetFileLength() const { return fileLen; }
+ long GetFileLength() const { return fileLen; }
/**
* Returns the encoding of the file
*/
- UnicodeType GetEncoding() const { return encoding; }
+ UnicodeType GetEncoding() const { return encoding; }
/**
* Returns a string representation of the encoding
@@ -106,26 +106,26 @@ public:
/**
* Returns the filename without the extension (if any)
*/
- std::wstring GetFileNameWithoutExtension() const;
+ std::wstring GetFileNameWithoutExtension() const;
/**
* Returns the filename extension (if any)
*/
- std::wstring GetFileNameExtension() const;
+ std::wstring GetFileNameExtension() const;
/**
* Replaces the file content.
*/
- void SetFileContent(const std::wstring& content);
+ void SetFileContent(const std::wstring& content);
- bool HasBOM() const { return hasBOM; }
+ bool HasBOM() const { return hasBOM; }
/**
* Sets the number of null bytes that are allowed for
* a file to still be considered text instead of binary
* in the encoding detection. Default is 2.
*/
- void SetNullbyteCountForBinary(int count) { nullByteCount = count; }
+ void SetNullbyteCountForBinary(int count) { nullByteCount = count; }
protected:
/**
diff --git a/grepWinNP3/src/Bookmarks.cpp b/grepWinNP3/src/Bookmarks.cpp
index e4a750f3d..f9348a5e8 100644
--- a/grepWinNP3/src/Bookmarks.cpp
+++ b/grepWinNP3/src/Bookmarks.cpp
@@ -1,6 +1,6 @@
// grepWin - regex search and replace for Windows
-// Copyright (C) 2007-2009, 2012-2013, 2017, 2020-2022 - Stefan Kueng
+// Copyright (C) 2007-2009, 2012-2013, 2017, 2020-2023 - Stefan Kueng
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -33,7 +33,7 @@ CBookmarks::~CBookmarks()
{
}
-void CBookmarks::Load()
+void CBookmarks::InitPath()
{
auto path = std::make_unique(MAX_PATH_NEW);
GetModuleFileName(nullptr, path.get(), MAX_PATH_NEW);
@@ -50,6 +50,12 @@ void CBookmarks::Load()
}
CreateDirectory(m_iniPath.c_str(), nullptr);
m_iniPath += L"\\bookmarks";
+}
+
+void CBookmarks::Load()
+{
+ if (m_iniPath.empty())
+ InitPath();
SetUnicode();
SetMultiLine();
SetSpaces(false);
@@ -58,22 +64,8 @@ void CBookmarks::Load()
void CBookmarks::Save()
{
- auto path = std::make_unique(MAX_PATH_NEW);
- GetModuleFileName(nullptr, path.get(), MAX_PATH_NEW);
- if (bPortable)
- {
- m_iniPath = path.get();
- m_iniPath = m_iniPath.substr(0, m_iniPath.rfind('\\'));
- }
- else
- {
- SHGetFolderPath(nullptr, CSIDL_APPDATA, nullptr, SHGFP_TYPE_CURRENT, path.get());
- m_iniPath = path.get();
- m_iniPath += L"\\grepWinNP3";
- }
- CreateDirectory(m_iniPath.c_str(), nullptr);
- m_iniPath += L"\\bookmarks";
-
+ if (m_iniPath.empty())
+ InitPath();
SaveFile(m_iniPath.c_str(), true);
}
@@ -158,7 +150,26 @@ Bookmark CBookmarks::GetBookmark(const std::wstring& name) const
bk.FileMatch = GetValue(name.c_str(), L"filematch", L"");
bk.FileMatchRegex = wcscmp(GetValue(name.c_str(), L"filematchregex", L"false"), L"true") == 0;
bk.Path = GetValue(name.c_str(), L"searchpath", L"");
+
+ RemoveQuotes(bk.Search);
+ RemoveQuotes(bk.Replace);
+ RemoveQuotes(bk.ExcludeDirs);
+ RemoveQuotes(bk.FileMatch);
}
return bk;
}
+
+void CBookmarks::RemoveQuotes(std::wstring& str)
+{
+ if (!str.empty())
+ {
+ if (str[0] == '"')
+ str = str.substr(1);
+ if (!str.empty())
+ {
+ if (str[str.size() - 1] == '"')
+ str = str.substr(0, str.size() - 1);
+ }
+ }
+}
diff --git a/grepWinNP3/src/Bookmarks.h b/grepWinNP3/src/Bookmarks.h
index cdb0bd601..58f21e1f7 100644
--- a/grepWinNP3/src/Bookmarks.h
+++ b/grepWinNP3/src/Bookmarks.h
@@ -1,6 +1,6 @@
// grepWin - regex search and replace for Windows
-// Copyright (C) 2007-2008, 2012-2013, 2020-2022 - Stefan Kueng
+// Copyright (C) 2007-2008, 2012-2013, 2020-2023 - Stefan Kueng
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -72,11 +72,13 @@ public:
CBookmarks();
~CBookmarks();
- void Load();
- void Save();
- void AddBookmark(const Bookmark& bm);
- void RemoveBookmark(const std::wstring& name);
- Bookmark GetBookmark(const std::wstring& name) const;
+ void InitPath();
+ void Load();
+ void Save();
+ void AddBookmark(const Bookmark& bm);
+ void RemoveBookmark(const std::wstring& name);
+ Bookmark GetBookmark(const std::wstring& name) const;
+ static void RemoveQuotes(std::wstring& str);
protected:
std::wstring m_iniPath;
diff --git a/grepWinNP3/src/BookmarksDlg.cpp b/grepWinNP3/src/BookmarksDlg.cpp
index a08cb0137..6f4eb7a10 100644
--- a/grepWinNP3/src/BookmarksDlg.cpp
+++ b/grepWinNP3/src/BookmarksDlg.cpp
@@ -1,6 +1,6 @@
// grepWin - regex search and replace for Windows
-// Copyright (C) 2007-2010, 2012-2017, 2019-2022 - Stefan Kueng
+// Copyright (C) 2007-2010, 2012-2017, 2019-2023 - Stefan Kueng
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -246,9 +246,7 @@ LRESULT CBookmarksDlg::DoCommand(int id, int /*msg*/)
if (nameDlg.GetName().compare(buf.get()))
{
Bookmark bk = m_bookmarks.GetBookmark(buf.get());
- RemoveQuotes(bk.Search);
- RemoveQuotes(bk.Replace);
- bk.Name = nameDlg.GetName();
+ bk.Name = nameDlg.GetName();
m_bookmarks.AddBookmark(bk);
m_bookmarks.RemoveBookmark(buf.get());
m_bookmarks.Save();
@@ -298,8 +296,8 @@ void CBookmarksDlg::InitBookmarks()
{
std::wstring searchString = m_bookmarks.GetValue(section.pItem, L"searchString", L"");
std::wstring replaceString = m_bookmarks.GetValue(section.pItem, L"replaceString", L"");
- RemoveQuotes(searchString);
- RemoveQuotes(replaceString);
+ CBookmarks::RemoveQuotes(searchString);
+ CBookmarks::RemoveQuotes(replaceString);
LVITEM lv = {0};
lv.mask = LVIF_TEXT;
@@ -329,20 +327,6 @@ void CBookmarksDlg::InitBookmarks()
ListView_SetColumnWidth(hListControl, 2, LVSCW_AUTOSIZE_USEHEADER);
}
-void CBookmarksDlg::RemoveQuotes(std::wstring& str)
-{
- if (!str.empty())
- {
- if (str[0] == '"')
- str = str.substr(1);
- if (!str.empty())
- {
- if (str[str.size()-1] == '"')
- str = str.substr(0, str.size()-1);
- }
- }
-}
-
void CBookmarksDlg::PrepareSelected()
{
m_bookmarks.Save();
@@ -360,11 +344,11 @@ void CBookmarksDlg::PrepareSelected()
m_path = m_bookmarks.GetValue(buf.get(), L"searchpath", L"");
m_replaceString = m_bookmarks.GetValue(buf.get(), L"replaceString", L"");
m_sExcludeDirs = m_bookmarks.GetValue(buf.get(), L"excludedirs", L"");
- m_sFileMatch = m_bookmarks.GetValue(buf.get(), L"filematch", L"");
- RemoveQuotes(m_searchString);
- RemoveQuotes(m_replaceString);
- RemoveQuotes(m_sExcludeDirs);
- RemoveQuotes(m_sFileMatch);
+ m_sFileMatch = m_bookmarks.GetValue(buf.get(), L"filematch", L"");
+ CBookmarks::RemoveQuotes(m_searchString);
+ CBookmarks::RemoveQuotes(m_replaceString);
+ CBookmarks::RemoveQuotes(m_sExcludeDirs);
+ CBookmarks::RemoveQuotes(m_sFileMatch);
m_bUseRegex = wcscmp(m_bookmarks.GetValue(buf.get(), L"useregex", L"false"), L"true") == 0;
m_bCaseSensitive = wcscmp(m_bookmarks.GetValue(buf.get(), L"casesensitive", L"false"), L"true") == 0;
m_bDotMatchesNewline = wcscmp(m_bookmarks.GetValue(buf.get(), L"dotmatchesnewline", L"false"), L"true") == 0;
diff --git a/grepWinNP3/src/BookmarksDlg.h b/grepWinNP3/src/BookmarksDlg.h
index f1822c6ca..7682b499d 100644
--- a/grepWinNP3/src/BookmarksDlg.h
+++ b/grepWinNP3/src/BookmarksDlg.h
@@ -1,6 +1,6 @@
// grepWin - regex search and replace for Windows
-// Copyright (C) 2007-2009, 2012-2013, 2016, 2019-2022 - Stefan Kueng
+// Copyright (C) 2007-2009, 2012-2013, 2016, 2019-2023 - Stefan Kueng
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -58,7 +58,6 @@ public:
protected:
LRESULT CALLBACK DlgFunc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) override;
LRESULT DoCommand(int id, int msg);
- static void RemoveQuotes(std::wstring& str);
void PrepareSelected();
private:
diff --git a/grepWinNP3/src/SearchDlg.cpp b/grepWinNP3/src/SearchDlg.cpp
index 7826a59c5..b9c9f23f8 100644
--- a/grepWinNP3/src/SearchDlg.cpp
+++ b/grepWinNP3/src/SearchDlg.cpp
@@ -2457,13 +2457,22 @@ void CSearchDlg::DoListNotify(LPNMITEMACTIVATE lpNMItemActivate)
OpenFileAtListIndex(lpNMItemActivate->iItem);
}
}
+ if (lpNMItemActivate->hdr.code == LVN_ODSTATECHANGED)
+ {
+ if (!m_bBlockUpdate)
+ {
+ HWND hListControl = lpNMItemActivate->hdr.hwndFrom;
+ m_selectedItems = ListView_GetSelectedCount(hListControl);
+ UpdateInfoLabel();
+ }
+ }
if (lpNMItemActivate->hdr.code == LVN_ITEMCHANGED)
{
if ((lpNMItemActivate->uOldState & LVIS_SELECTED) || (lpNMItemActivate->uNewState & LVIS_SELECTED))
{
if (!m_bBlockUpdate)
{
- HWND hListControl = GetDlgItem(*this, IDC_RESULTLIST);
+ HWND hListControl = lpNMItemActivate->hdr.hwndFrom;
m_selectedItems = ListView_GetSelectedCount(hListControl);
UpdateInfoLabel();
}
@@ -3319,7 +3328,7 @@ DWORD CSearchDlg::SearchThread()
}
found = s.find_first_of('\\', found + 1);
}
- CStringUtils::rtrim(s, L"\\/");
+ CStringUtils::rtrim(s, L"\\/ ");
pathVector.push_back(s);
}
pBufSearchPath += pos;
diff --git a/grepWinNP3/src/grepWin.cpp b/grepWinNP3/src/grepWin.cpp
index 2cdebf09b..85f747c76 100644
--- a/grepWinNP3/src/grepWin.cpp
+++ b/grepWinNP3/src/grepWin.cpp
@@ -1,6 +1,6 @@
// grepWin - regex search and replace for Windows
-// Copyright (C) 2007-2008, 2010-2022 - Stefan Kueng
+// Copyright (C) 2007-2008, 2010-2023 - Stefan Kueng
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
@@ -178,7 +178,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
CCmdLineParser parser(lpCmdLine);
- //MessageBox(NULL, L"", L"", MB_OK);
+ // MessageBox(NULL, L"", L"", MB_OK);
if (parser.HasKey(L"register"))
{
@@ -253,46 +253,35 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
{
bool bOnlyOne = bPortable ? g_iniFile.GetBoolValue(L"global", L"onlyone", L"false") :
!!DWORD(CRegStdDWORD(L"Software\\grepWinNP3\\onlyone", 0));
- bool bCopyData = false;
+
+ //auto searchfor = parser.HasVal(L"searchfor") ? parser.GetVal(L"searchfor") :
+ // (bPortable ? g_iniFile.GetValue(L"global", L"searchfor", L"") : L"");
+
+ auto sPath = parser.HasVal(L"searchpath") ? parser.GetVal(L"searchpath") :
+ (bPortable ? g_iniFile.GetValue(L"global", L"searchpath", L"") : CPathUtils::GetCWD());
+ sPath = SanitizeSearchPaths(sPath);
+ SearchReplace(sPath, L"/", L"\\");
+ sPath = SanitizeSearchPaths(sPath);
+
if (SendMessage(hWnd, GREPWIN_STARTUPMSG, 1, 0)) // check if grepWin was started moments ago
{
SendMessage(hWnd, GREPWIN_STARTUPMSG, 0, 0); // reset the timer
- bCopyData = true;
- bQuit = true;
- }
- else if (bOnlyOne)
- {
- bCopyData = true;
- bQuit = true;
- }
- if (bCopyData) {
+
+ //CopyData_t data2copy = {0};
+ //StringCchCopyW(data2copy.searchFor, _countof(data2copy.searchFor), searchfor.c_str());
+ //StringCchCopyW(data2copy.searchPath, _countof(data2copy.searchPath), sPath.c_str());
+
// grepWin was started just moments ago:
// add the new path to the existing search path in that grepWin instance
- std::wstring searchfor = parser.HasVal(L"searchfor") ?
- parser.GetVal(L"searchfor") :
- (bPortable ? g_iniFile.GetValue(L"global", L"searchfor", L"") : L"");
-
- std::wstring sPath = parser.HasVal(L"searchpath") ? parser.GetVal(L"searchpath") :
- (bPortable ? g_iniFile.GetValue(L"global", L"searchpath", L"") : L"");
- SearchReplace(sPath, L"/", L"\\");
- sPath = SanitizeSearchPaths(sPath);
-
- CopyData_t data2copy = {0};
- StringCchCopyW(data2copy.searchFor, _countof(data2copy.searchFor), searchfor.c_str());
- StringCchCopyW(data2copy.searchPath, _countof(data2copy.searchPath), sPath.c_str());
-
COPYDATASTRUCT copyData = {0};
copyData.lpData = static_cast(const_cast(sPath.c_str()));
copyData.cbData = static_cast(sPath.size()) * sizeof(wchar_t);
SendMessage(hWnd, WM_COPYDATA, 0, reinterpret_cast(©Data));
- SetForegroundWindow(hWnd); //set the window to front
+ SetForegroundWindow(hWnd); // set the window to front
bQuit = true;
}
else if (bOnlyOne)
{
- std::wstring sPath = parser.HasVal(L"searchpath") ? parser.GetVal(L"searchpath") : L"";
- SearchReplace(sPath, L"/", L"\\");
- sPath = SanitizeSearchPaths(sPath);
COPYDATASTRUCT copyData = {0};
copyData.lpData = static_cast(const_cast(sPath.c_str()));
copyData.cbData = static_cast(sPath.size()) * sizeof(wchar_t);
@@ -338,6 +327,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
}
else
{
+ bool searchPathSet = false;
CSearchDlg searchDlg(nullptr);
if (parser.HasVal(L"searchini"))
{
@@ -354,6 +344,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
std::wstring sPath = searchIni.GetValue(section.c_str(), L"searchpath");
sPath = SanitizeSearchPaths(sPath);
searchDlg.SetSearchPath(sPath);
+ searchPathSet = true;
}
if (searchIni.GetValue(section.c_str(), L"searchfor"))
searchDlg.SetSearchString(searchIni.GetValue(section.c_str(), L"searchfor"));
@@ -448,6 +439,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
(bPortable ? g_iniFile.GetValue(L"global", L"searchpath", L"") : L"");
sPath = SanitizeSearchPaths(sPath);
searchDlg.SetSearchPath(sPath);
+ searchPathSet = true;
}
if (parser.HasKey(L"searchfor"))
searchDlg.SetSearchString(parser.GetVal(L"searchfor") ? parser.GetVal(L"searchfor") :
@@ -539,7 +531,7 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
searchDlg.SetDateLimit(parser.GetLongVal(L"datelimit"), date1, date2);
}
- if (!parser.HasKey(L"searchpath"))
+ if (!searchPathSet)
{
auto cmdLineSize = wcslen(lpCmdLine);
auto cmdLinePath = std::make_unique(cmdLineSize + 1);
@@ -551,6 +543,12 @@ int APIENTRY wWinMain(HINSTANCE hInstance,
sPath = SanitizeSearchPaths(sPath);
searchDlg.SetSearchPath(sPath);
}
+ else
+ {
+ auto sPath = CPathUtils::GetCWD();
+ sPath = SanitizeSearchPaths(sPath);
+ searchDlg.SetSearchPath(sPath);
+ }
}
if (parser.HasKey(L"nosavesettings"))
searchDlg.SetNoSaveSettings(true);
diff --git a/src/Config/SimpleIni.h b/src/Config/SimpleIni.h
index 7671a928f..5ee3198a9 100644
--- a/src/Config/SimpleIni.h
+++ b/src/Config/SimpleIni.h
@@ -238,7 +238,7 @@
#endif // SI_SUPPORT_IOSTREAMS
#if (defined(_DEBUG) || defined(DEBUG)) && !defined(NDEBUG)
-#ifndef assert
+# ifndef assert
# include
# endif
# define SI_ASSERT(x) assert(x)
@@ -256,13 +256,13 @@
//constexpr int SI_NOMEM = -2; //!< Out of memory error
//constexpr int SI_FILE = -3; //!< File error (see errno for detail error)
enum class SI_Error : int {
- SI_OK = 0, //!< No error
- SI_UPDATED = 1, //!< An existing value was updated
- SI_INSERTED = 2, //!< A new value was inserted
+ SI_OK = 0, //!< No error
+ SI_UPDATED = 1, //!< An existing value was updated
+ SI_INSERTED = 2, //!< A new value was inserted
// note: test for any error with (retval < 0)
- SI_FAIL = -1, //!< Generic failure
- SI_NOMEM = -2, //!< Out of memory error
- SI_FILE = -3 //!< File error (see errno for detail error)
+ SI_FAIL = -1, //!< Generic failure
+ SI_NOMEM = -2, //!< Out of memory error
+ SI_FILE = -3 //!< File error (see errno for detail error)
};
#define SI_UTF8_SIGNATURE "\xEF\xBB\xBF"
@@ -2954,10 +2954,10 @@ CSimpleIniTempl::Save(
// write the value as long
if (*iValue->pItem || !m_bAllowKeyOnly) {
- if (!convert.ConvertToStore(iValue->pItem)) {
- return SI_Error::SI_FAIL;
- }
- a_oOutput.Write(m_bSpaces ? " = " : "=");
+ if (!convert.ConvertToStore(iValue->pItem)) {
+ return SI_Error::SI_FAIL;
+ }
+ a_oOutput.Write(m_bSpaces ? " = " : "=");
if (m_bParseQuotes && IsSingleLineQuotedValue(iValue->pItem)) {
// the only way to preserve external whitespace on a value (i.e. before or after)
// is to quote it. This is simple quoting, we don't escape quotes within the data.
@@ -2966,21 +2966,21 @@ CSimpleIniTempl::Save(
a_oOutput.Write("\"");
}
else if (m_bAllowMultiLine && IsMultiLineData(iValue->pItem)) {
- // multi-line data needs to be processed specially to ensure
- // that we use the correct newline format for the current system
- a_oOutput.Write("<<pItem)) {
- return SI_Error::SI_FAIL;
- }
- a_oOutput.Write("END_OF_TEXT");
- }
- else {
- a_oOutput.Write(convert.Data());
+ // multi-line data needs to be processed specially to ensure
+ // that we use the correct newline format for the current system
+ a_oOutput.Write("<<pItem)) {
+ return SI_Error::SI_FAIL;
+ }
+ a_oOutput.Write("END_OF_TEXT");
+ }
+ else {
+ a_oOutput.Write(convert.Data());
}
}
a_oOutput.Write(SI_NEWLINE_A);
bNeedNewLine = false;
- }
+ }
}
//???bNeedNewLine = true;
}