https://git.reactos.org/?p=reactos.git;a=commitdiff;h=848ad61bba06668e0c58cfa76ab5b63eea76a87d

commit 848ad61bba06668e0c58cfa76ab5b63eea76a87d
Author:     Esme Povirk <e...@codeweavers.com>
AuthorDate: Sat Apr 24 14:12:59 2021 -0500
Commit:     Hermès Bélusca-Maïto <hermes.belusca-ma...@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 <e...@codeweavers.com>
    Signed-off-by: Alexandre Julliard <julli...@winehq.org>
    
    wine commit id 404cd8a92bd99332a7ef8ec96edbf5aeea8cab76 by Esme Povirk 
<e...@codeweavers.com>
    
    Co-authored-by: Hermès Bélusca-Maïto <hermes.belusca-ma...@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();
 }

Reply via email to