https://git.reactos.org/?p=reactos.git;a=commitdiff;h=848ad61bba06668e0c58c…
commit 848ad61bba06668e0c58cfa76ab5b63eea76a87d
Author: Esme Povirk <esme(a)codeweavers.com>
AuthorDate: Sat Apr 24 14:12:59 2021 -0500
Commit: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
CommitDate: Sat Jan 18 16:39:37 2025 +0100
[SHLWAPI][WINESYNC] Import PathRemoveBlanks wine fix + adaptation for ReactOS
(#7636)
kernelbase: Always remove trailing spaces in PathRemoveBlanks.
Signed-off-by: Esme Povirk <esme(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
wine commit id 404cd8a92bd99332a7ef8ec96edbf5aeea8cab76 by Esme Povirk
<esme(a)codeweavers.com>
Co-authored-by: Hermès Bélusca-Maïto <hermes.belusca-maito(a)reactos.org>
---
dll/win32/shlwapi/path.c | 58 +++++++++++++++++--------------
modules/rostests/winetests/shlwapi/path.c | 45 ++++++++++++++++++++++++
2 files changed, 77 insertions(+), 26 deletions(-)
diff --git a/dll/win32/shlwapi/path.c b/dll/win32/shlwapi/path.c
index 09acc200e12..e2f05cff78a 100644
--- a/dll/win32/shlwapi/path.c
+++ b/dll/win32/shlwapi/path.c
@@ -891,25 +891,28 @@ LPWSTR WINAPI PathRemoveBackslashW( LPWSTR lpszPath )
* RETURNS
* Nothing.
*/
-VOID WINAPI PathRemoveBlanksA(LPSTR lpszPath)
+void WINAPI PathRemoveBlanksA(LPSTR pszPath)
{
- TRACE("(%s)\n", debugstr_a(lpszPath));
+ LPSTR start, first;
- if(lpszPath && *lpszPath)
- {
- LPSTR start = lpszPath;
+ TRACE("(%s)\n", debugstr_a(pszPath));
- while (*lpszPath == ' ')
- lpszPath = CharNextA(lpszPath);
+ if (!pszPath || !*pszPath)
+ return;
+
+ start = first = pszPath;
- while(*lpszPath)
- *start++ = *lpszPath++;
+ while (*pszPath == ' ')
+ pszPath = CharNextA(pszPath);
+
+ while (*pszPath)
+ *start++ = *pszPath++;
+
+ if (start != first)
+ while (start[-1] == ' ')
+ start--;
- if (start != lpszPath)
- while (start[-1] == ' ')
- start--;
*start = '\0';
- }
}
/*************************************************************************
@@ -917,25 +920,28 @@ VOID WINAPI PathRemoveBlanksA(LPSTR lpszPath)
*
* See PathRemoveBlanksA.
*/
-VOID WINAPI PathRemoveBlanksW(LPWSTR lpszPath)
+void WINAPI PathRemoveBlanksW(LPWSTR pszPath)
{
- TRACE("(%s)\n", debugstr_w(lpszPath));
+ LPWSTR start, first;
- if(lpszPath && *lpszPath)
- {
- LPWSTR start = lpszPath;
+ TRACE("(%s)\n", debugstr_w(pszPath));
- while (*lpszPath == ' ')
- lpszPath++;
+ if (!pszPath || !*pszPath)
+ return;
+
+ start = first = pszPath;
- while(*lpszPath)
- *start++ = *lpszPath++;
+ while (*pszPath == ' ')
+ pszPath++;
+
+ while (*pszPath)
+ *start++ = *pszPath++;
+
+ if (start != first)
+ while (start[-1] == ' ')
+ start--;
- if (start != lpszPath)
- while (start[-1] == ' ')
- start--;
*start = '\0';
- }
}
/*************************************************************************
diff --git a/modules/rostests/winetests/shlwapi/path.c
b/modules/rostests/winetests/shlwapi/path.c
index c5142b992aa..e9f08a902b0 100644
--- a/modules/rostests/winetests/shlwapi/path.c
+++ b/modules/rostests/winetests/shlwapi/path.c
@@ -1712,6 +1712,50 @@ static void test_PathUndecorate(void)
PathUndecorateW(NULL);
}
+static void test_PathRemoveBlanks(void)
+{
+ struct remove_blanks_test {
+ const char* input;
+ const char* expected;
+ };
+ struct remove_blanks_test tests[] = {
+ {"", ""},
+ {" ", ""},
+ {"test", "test"},
+ {" test", "test"},
+ {" test", "test"},
+ {"test ", "test"},
+ {"test ", "test"},
+ {" test ", "test"},
+ {" test ", "test"}};
+ char pathA[MAX_PATH];
+ WCHAR pathW[MAX_PATH];
+ int i, ret;
+ const UINT CP_ASCII = 20127;
+
+ PathRemoveBlanksW(NULL);
+ PathRemoveBlanksA(NULL);
+
+ for (i=0; i < ARRAY_SIZE(tests); i++)
+ {
+ strcpy(pathA, tests[i].input);
+ PathRemoveBlanksA(pathA);
+ ok(strcmp(pathA, tests[i].expected) == 0, "input string '%s',
expected '%s', got '%s'\n",
+ tests[i].input, tests[i].expected, pathA);
+
+ ret = MultiByteToWideChar(CP_ASCII, MB_ERR_INVALID_CHARS, tests[i].input, -1,
pathW, MAX_PATH);
+ ok(ret != 0, "MultiByteToWideChar failed for '%s'\n",
tests[i].input);
+
+ PathRemoveBlanksW(pathW);
+
+ ret = WideCharToMultiByte(CP_ASCII, 0, pathW, -1, pathA, MAX_PATH, NULL, NULL);
+ ok(ret != 0, "WideCharToMultiByte failed for %s from test string
'%s'\n", wine_dbgstr_w(pathW), tests[i].input);
+
+ ok(strcmp(pathA, tests[i].expected) == 0, "input string '%s',
expected '%s', got '%s'\n",
+ tests[i].input, tests[i].expected, pathA);
+ }
+}
+
START_TEST(path)
{
HMODULE hShlwapi = GetModuleHandleA("shlwapi.dll");
@@ -1759,4 +1803,5 @@ START_TEST(path)
test_PathIsRelativeW();
test_PathStripPathA();
test_PathUndecorate();
+ test_PathRemoveBlanks();
}