[SHLWAPI][WINESYNC] Import PathRemoveBlanks wine fix + adaptation for ReactOS (#7636)

kernelbase: Always remove trailing spaces in PathRemoveBlanks.

Signed-off-by: Esme Povirk <esme@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>

wine commit id 404cd8a92bd99332a7ef8ec96edbf5aeea8cab76 by Esme Povirk <esme@codeweavers.com>

Co-authored-by: Hermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
This commit is contained in:
Esme Povirk 2021-04-24 14:12:59 -05:00 committed by Hermès Bélusca-Maïto
parent f189d8c454
commit 848ad61bba
No known key found for this signature in database
GPG key ID: 3B2539C65E7B93D0
2 changed files with 77 additions and 26 deletions

View file

@ -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';
}
}
/*************************************************************************

View file

@ -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();
}