[SHELL32][SHELL32_APITEST] Improve CommandLineToArgvW (#5055)

This PR will reduce the failures of CommandLineToArgvW testcase of shell32_apitest.
- Use isspace and isblank in shell32!CommandLineToArgvW.
- Strengthen shell32_apitest:CommandLineToArgvW testcase.
CORE-17787
This commit is contained in:
Katayama Hirofumi MZ 2023-02-14 20:53:48 +09:00 committed by GitHub
parent 647b67c1ac
commit 324cda0835
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 44 additions and 8 deletions

View file

@ -134,11 +134,11 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
else
{
/* The executable path ends at the next space, no matter what */
while (*s && *s!=' ' && *s!='\t')
while (*s && !isspace(*s))
s++;
}
/* skip to the first argument, if any */
while (*s==' ' || *s=='\t')
while (isblank(*s))
s++;
if (*s)
argc++;
@ -147,10 +147,10 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
qcount=bcount=0;
while (*s)
{
if ((*s==' ' || *s=='\t') && qcount==0)
if (isblank(*s) && qcount==0)
{
/* skip to the next argument and count it if any */
while (*s==' ' || *s=='\t')
while (isblank(*s))
s++;
if (*s)
argc++;
@ -218,7 +218,7 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
else
{
/* The executable path ends at the next space, no matter what */
while (*d && *d!=' ' && *d!='\t')
while (*d && !isspace(*d))
d++;
s=d;
if (*s)
@ -227,8 +227,9 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
/* close the executable path */
*d++=0;
/* skip to the first argument and initialize it if any */
while (*s==' ' || *s=='\t')
while (isblank(*s))
s++;
if (!*s)
{
/* There are no parameters so we are all done */
@ -242,7 +243,7 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
qcount=bcount=0;
while (*s)
{
if ((*s==' ' || *s=='\t') && qcount==0)
if (isblank(*s) && qcount==0)
{
/* close the argument */
*d++=0;
@ -251,7 +252,7 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
/* skip to the next one and initialize it if any */
do {
s++;
} while (*s==' ' || *s=='\t');
} while (isblank(*s));
if (*s)
argv[argc++]=d;
}

View file

@ -45,15 +45,50 @@ START_TEST(CommandLineToArgvW)
DoEntry(__LINE__, L"test.exe\t", 1);
DoEntry(__LINE__, L"test.exe\r", 1);
DoEntry(__LINE__, L"test.exe\n", 1);
DoEntry(__LINE__, L"test.exe\v", 1);
DoEntry(__LINE__, L"test.exe\f", 1);
DoEntry(__LINE__, L"test.exe\u3000", 1);
DoEntry(__LINE__, L"\"This is a test.exe\"", 1);
DoEntry(__LINE__, L"\"This is a test.exe\" ", 1);
DoEntry(__LINE__, L"\"This is a test.exe\"\t", 1);
DoEntry(__LINE__, L"\"This is a test.exe\"\r", 2, L"\r");
DoEntry(__LINE__, L"\"This is a test.exe\"\n", 2, L"\n");
DoEntry(__LINE__, L"\"This is a test.exe\"\v", 2, L"\v");
DoEntry(__LINE__, L"\"This is a test.exe\"\f", 2, L"\f");
DoEntry(__LINE__, L"\"This is a test.exe\"\u3000", 2, L"\u3000");
DoEntry(__LINE__, L"test.exe a", 2, L"a");
DoEntry(__LINE__, L"test.exe\ta", 2, L"a");
DoEntry(__LINE__, L"test.exe\ra", 2, L"a");
DoEntry(__LINE__, L"test.exe\na", 2, L"a");
DoEntry(__LINE__, L"test.exe\va", 2, L"a");
DoEntry(__LINE__, L"test.exe\fa", 2, L"a");
DoEntry(__LINE__, L"test.exe\u3000" L"a", 1);
DoEntry(__LINE__, L"test.exe a", 2, L"a");
DoEntry(__LINE__, L"test.exe \ta", 2, L"a");
DoEntry(__LINE__, L"test.exe \ra", 2, L"\ra");
DoEntry(__LINE__, L"test.exe \na", 2, L"\na");
DoEntry(__LINE__, L"test.exe \va", 2, L"\va");
DoEntry(__LINE__, L"test.exe \fa", 2, L"\fa");
DoEntry(__LINE__, L"test.exe a ", 2, L"a");
DoEntry(__LINE__, L"test.exe a\t", 2, L"a");
DoEntry(__LINE__, L"test.exe a\r", 2, L"a\r");
DoEntry(__LINE__, L"test.exe a\n", 2, L"a\n");
DoEntry(__LINE__, L"test.exe a\v", 2, L"a\v");
DoEntry(__LINE__, L"test.exe a\f", 2, L"a\f");
DoEntry(__LINE__, L"test.exe \"a\" ", 2, L"a");
DoEntry(__LINE__, L"test.exe \"a\"\t", 2, L"a");
DoEntry(__LINE__, L"test.exe \"a\"\r", 2, L"a\r");
DoEntry(__LINE__, L"test.exe \"a\"\n", 2, L"a\n");
DoEntry(__LINE__, L"test.exe \"a\"\v", 2, L"a\v");
DoEntry(__LINE__, L"test.exe \"a\"\f", 2, L"a\f");
DoEntry(__LINE__, L"test.exe \u3000" L"a", 2, L"\u3000" L"a");
DoEntry(__LINE__, L"test.exe \"a b\"", 2, L"a b");
DoEntry(__LINE__, L"test.exe \"a\tb\"", 2, L"a\tb");
DoEntry(__LINE__, L"test.exe \"a\rb\"", 2, L"a\rb");
DoEntry(__LINE__, L"test.exe \"a\nb\"", 2, L"a\nb");
DoEntry(__LINE__, L"test.exe \"a\vb\"", 2, L"a\vb");
DoEntry(__LINE__, L"test.exe \"a\fb\"", 2, L"a\fb");
DoEntry(__LINE__, L"test.exe \"a\u3000" L"b\"", 2, L"a\u3000" L"b");
DoEntry(__LINE__, L"test.exe a b c", 4, L"a", L"b", L"c");
DoEntry(__LINE__, L"test.exe a b \"c", 4, L"a", L"b", L"c");
DoEntry(__LINE__, L"test.exe \"a b\" \"c d\"", 3, L"a b", L"c d");