From 848ad61bba06668e0c58cfa76ab5b63eea76a87d Mon Sep 17 00:00:00 2001 From: Esme Povirk Date: Sat, 24 Apr 2021 14:12:59 -0500 Subject: [PATCH] [SHLWAPI][WINESYNC] Import PathRemoveBlanks wine fix + adaptation for ReactOS (#7636) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit kernelbase: Always remove trailing spaces in PathRemoveBlanks. Signed-off-by: Esme Povirk Signed-off-by: Alexandre Julliard wine commit id 404cd8a92bd99332a7ef8ec96edbf5aeea8cab76 by Esme Povirk Co-authored-by: Hermès Bélusca-Maïto --- 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; - while(*lpszPath) - *start++ = *lpszPath++; + start = first = pszPath; + + 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; - while(*lpszPath) - *start++ = *lpszPath++; + start = first = pszPath; + + 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(); }