Implement and test PathIsValidChar{A,W}.
This commit is contained in:
parent
7c1cf8f009
commit
80829db067
|
@ -4021,3 +4021,111 @@ HRESULT WINAPI SHGetWebFolderFilePathW(LPCWSTR lpszFile, LPWSTR lpszPath, DWORD
|
|||
return S_OK;
|
||||
return E_FAIL;
|
||||
}
|
||||
|
||||
#define PATH_CHAR_CLASS_LETTER 0x00000001
|
||||
#define PATH_CHAR_CLASS_ASTERIX 0x00000002
|
||||
#define PATH_CHAR_CLASS_DOT 0x00000004
|
||||
#define PATH_CHAR_CLASS_BACKSLASH 0x00000008
|
||||
#define PATH_CHAR_CLASS_COLON 0x00000010
|
||||
#define PATH_CHAR_CLASS_SEMICOLON 0x00000020
|
||||
#define PATH_CHAR_CLASS_COMMA 0x00000040
|
||||
#define PATH_CHAR_CLASS_SPACE 0x00000080
|
||||
#define PATH_CHAR_CLASS_OTHER_VALID 0x00000100
|
||||
#define PATH_CHAR_CLASS_DOUBLEQUOTE 0x00000200
|
||||
|
||||
#define PATH_CHAR_CLASS_INVALID 0x00000000
|
||||
#define PATH_CHAR_CLASS_ANY 0xffffffff
|
||||
|
||||
static const DWORD SHELL_charclass[] =
|
||||
{
|
||||
/* 0x00 */ PATH_CHAR_CLASS_INVALID, /* 0x01 */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x02 */ PATH_CHAR_CLASS_INVALID, /* 0x03 */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x04 */ PATH_CHAR_CLASS_INVALID, /* 0x05 */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x06 */ PATH_CHAR_CLASS_INVALID, /* 0x07 */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x08 */ PATH_CHAR_CLASS_INVALID, /* 0x09 */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x0a */ PATH_CHAR_CLASS_INVALID, /* 0x0b */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x0c */ PATH_CHAR_CLASS_INVALID, /* 0x0d */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x0e */ PATH_CHAR_CLASS_INVALID, /* 0x0f */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x10 */ PATH_CHAR_CLASS_INVALID, /* 0x11 */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x12 */ PATH_CHAR_CLASS_INVALID, /* 0x13 */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x14 */ PATH_CHAR_CLASS_INVALID, /* 0x15 */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x16 */ PATH_CHAR_CLASS_INVALID, /* 0x17 */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x18 */ PATH_CHAR_CLASS_INVALID, /* 0x19 */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x1a */ PATH_CHAR_CLASS_INVALID, /* 0x1b */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x1c */ PATH_CHAR_CLASS_INVALID, /* 0x1d */ PATH_CHAR_CLASS_INVALID,
|
||||
/* 0x1e */ PATH_CHAR_CLASS_INVALID, /* 0x1f */ PATH_CHAR_CLASS_INVALID,
|
||||
/* ' ' */ PATH_CHAR_CLASS_SPACE, /* '!' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '"' */ PATH_CHAR_CLASS_DOUBLEQUOTE, /* '#' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '$' */ PATH_CHAR_CLASS_OTHER_VALID, /* '%' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '&' */ PATH_CHAR_CLASS_OTHER_VALID, /* '\'' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '(' */ PATH_CHAR_CLASS_OTHER_VALID, /* ')' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '*' */ PATH_CHAR_CLASS_ASTERIX, /* '+' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* ',' */ PATH_CHAR_CLASS_COMMA, /* '-' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '.' */ PATH_CHAR_CLASS_DOT, /* '/' */ PATH_CHAR_CLASS_INVALID,
|
||||
/* '0' */ PATH_CHAR_CLASS_OTHER_VALID, /* '1' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '2' */ PATH_CHAR_CLASS_OTHER_VALID, /* '3' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '4' */ PATH_CHAR_CLASS_OTHER_VALID, /* '5' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '6' */ PATH_CHAR_CLASS_OTHER_VALID, /* '7' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '8' */ PATH_CHAR_CLASS_OTHER_VALID, /* '9' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* ':' */ PATH_CHAR_CLASS_COLON, /* ';' */ PATH_CHAR_CLASS_SEMICOLON,
|
||||
/* '<' */ PATH_CHAR_CLASS_INVALID, /* '=' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '>' */ PATH_CHAR_CLASS_INVALID, /* '?' */ PATH_CHAR_CLASS_LETTER,
|
||||
/* '@' */ PATH_CHAR_CLASS_OTHER_VALID, /* 'A' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'B' */ PATH_CHAR_CLASS_ANY, /* 'C' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'D' */ PATH_CHAR_CLASS_ANY, /* 'E' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'F' */ PATH_CHAR_CLASS_ANY, /* 'G' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'H' */ PATH_CHAR_CLASS_ANY, /* 'I' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'J' */ PATH_CHAR_CLASS_ANY, /* 'K' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'L' */ PATH_CHAR_CLASS_ANY, /* 'M' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'N' */ PATH_CHAR_CLASS_ANY, /* 'O' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'P' */ PATH_CHAR_CLASS_ANY, /* 'Q' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'R' */ PATH_CHAR_CLASS_ANY, /* 'S' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'T' */ PATH_CHAR_CLASS_ANY, /* 'U' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'V' */ PATH_CHAR_CLASS_ANY, /* 'W' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'X' */ PATH_CHAR_CLASS_ANY, /* 'Y' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'Z' */ PATH_CHAR_CLASS_ANY, /* '[' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '\\' */ PATH_CHAR_CLASS_BACKSLASH, /* ']' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '^' */ PATH_CHAR_CLASS_OTHER_VALID, /* '_' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '`' */ PATH_CHAR_CLASS_OTHER_VALID, /* 'a' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'b' */ PATH_CHAR_CLASS_ANY, /* 'c' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'd' */ PATH_CHAR_CLASS_ANY, /* 'e' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'f' */ PATH_CHAR_CLASS_ANY, /* 'g' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'h' */ PATH_CHAR_CLASS_ANY, /* 'i' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'j' */ PATH_CHAR_CLASS_ANY, /* 'k' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'l' */ PATH_CHAR_CLASS_ANY, /* 'm' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'n' */ PATH_CHAR_CLASS_ANY, /* 'o' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'p' */ PATH_CHAR_CLASS_ANY, /* 'q' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'r' */ PATH_CHAR_CLASS_ANY, /* 's' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 't' */ PATH_CHAR_CLASS_ANY, /* 'u' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'v' */ PATH_CHAR_CLASS_ANY, /* 'w' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'x' */ PATH_CHAR_CLASS_ANY, /* 'y' */ PATH_CHAR_CLASS_ANY,
|
||||
/* 'z' */ PATH_CHAR_CLASS_ANY, /* '{' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '|' */ PATH_CHAR_CLASS_INVALID, /* '}' */ PATH_CHAR_CLASS_OTHER_VALID,
|
||||
/* '~' */ PATH_CHAR_CLASS_OTHER_VALID
|
||||
};
|
||||
|
||||
/*************************************************************************
|
||||
* @ [SHLWAPI.455]
|
||||
*
|
||||
* Check if an ASCII char is of a certain class
|
||||
*/
|
||||
BOOL WINAPI PathIsValidCharA( char c, DWORD class )
|
||||
{
|
||||
if ((unsigned)c > 0x7e)
|
||||
return class & PATH_CHAR_CLASS_OTHER_VALID;
|
||||
|
||||
return class & SHELL_charclass[(unsigned)c];
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
* @ [SHLWAPI.456]
|
||||
*
|
||||
* Check if a Unicode char is of a certain class
|
||||
*/
|
||||
BOOL WINAPI PathIsValidCharW( WCHAR c, DWORD class )
|
||||
{
|
||||
if (c > 0x7e)
|
||||
return class & PATH_CHAR_CLASS_OTHER_VALID;
|
||||
|
||||
return class & SHELL_charclass[c];
|
||||
}
|
||||
|
|
|
@ -452,8 +452,8 @@
|
|||
452 stub -noname CharUpperNoDBCSW
|
||||
453 stub -noname CharLowerNoDBCSA
|
||||
454 stub -noname CharLowerNoDBCSW
|
||||
455 stub -noname PathIsValidCharA
|
||||
456 stub -noname PathIsValidCharW
|
||||
455 stdcall -noname PathIsValidCharA(long long)
|
||||
456 stdcall -noname PathIsValidCharW(long long)
|
||||
457 stub -noname GetLongPathNameWrapW
|
||||
458 stub -noname GetLongPathNameWrapA
|
||||
459 stdcall -noname SHExpandEnvironmentStringsA(str ptr long) kernel32.ExpandEnvironmentStringsA
|
||||
|
|
|
@ -606,6 +606,101 @@ static void test_PathIsUrl(void)
|
|||
}
|
||||
}
|
||||
|
||||
static const DWORD SHELL_charclass[] =
|
||||
{
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000000, 0x00000000, 0x00000000, 0x00000000,
|
||||
0x00000080, 0x00000100, 0x00000200, 0x00000100,
|
||||
0x00000100, 0x00000100, 0x00000100, 0x00000100,
|
||||
0x00000100, 0x00000100, 0x00000002, 0x00000100,
|
||||
0x00000040, 0x00000100, 0x00000004, 0x00000000,
|
||||
0x00000100, 0x00000100, 0x00000100, 0x00000100,
|
||||
0x00000100, 0x00000100, 0x00000100, 0x00000100,
|
||||
0x00000100, 0x00000100, 0x00000010, 0x00000020,
|
||||
0x00000000, 0x00000100, 0x00000000, 0x00000001,
|
||||
0x00000100, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0x00000100,
|
||||
0x00000008, 0x00000100, 0x00000100, 0x00000100,
|
||||
0x00000100, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,
|
||||
0xffffffff, 0xffffffff, 0xffffffff, 0x00000100,
|
||||
0x00000000, 0x00000100, 0x00000100
|
||||
};
|
||||
|
||||
BOOL WINAPI PathIsValidCharA( char c, DWORD class );
|
||||
BOOL WINAPI PathIsValidCharW( WCHAR c, DWORD class );
|
||||
|
||||
static void test_PathIsValidCharA(void)
|
||||
{
|
||||
BOOL ret;
|
||||
unsigned int c;
|
||||
|
||||
ret = PathIsValidCharA( 0x7f, 0 );
|
||||
ok ( !ret, "PathIsValidCharA succeeded: 0x%08lx\n", (DWORD)ret );
|
||||
|
||||
ret = PathIsValidCharA( 0x7f, 1 );
|
||||
ok ( !ret, "PathIsValidCharA succeeded: 0x%08lx\n", (DWORD)ret );
|
||||
|
||||
for (c = 0; c < 0x7f; c++)
|
||||
{
|
||||
ret = PathIsValidCharA( c, ~0U );
|
||||
ok ( ret == SHELL_charclass[c] || (ret == 1 && SHELL_charclass[c] == 0xffffffff),
|
||||
"PathIsValidCharA failed: 0x%02x got 0x%08lx expected 0x%08lx\n",
|
||||
c, (DWORD)ret, SHELL_charclass[c] );
|
||||
}
|
||||
|
||||
for (c = 0x7f; c <= 0xff; c++)
|
||||
{
|
||||
ret = PathIsValidCharA( c, ~0U );
|
||||
ok ( ret == 0x00000100,
|
||||
"PathIsValidCharA failed: 0x%02x got 0x%08lx expected 0x00000100\n",
|
||||
c, (DWORD)ret );
|
||||
}
|
||||
}
|
||||
|
||||
static void test_PathIsValidCharW(void)
|
||||
{
|
||||
BOOL ret;
|
||||
unsigned int c;
|
||||
|
||||
ret = PathIsValidCharW( 0x7f, 0 );
|
||||
ok ( !ret, "PathIsValidCharW succeeded: 0x%08lx\n", (DWORD)ret );
|
||||
|
||||
ret = PathIsValidCharW( 0x7f, 1 );
|
||||
ok ( !ret, "PathIsValidCharW succeeded: 0x%08lx\n", (DWORD)ret );
|
||||
|
||||
for (c = 0; c < 0x7f; c++)
|
||||
{
|
||||
ret = PathIsValidCharW( c, ~0U );
|
||||
ok ( ret == SHELL_charclass[c] || (ret == 1 && SHELL_charclass[c] == 0xffffffff),
|
||||
"PathIsValidCharW failed: 0x%02x got 0x%08lx expected 0x%08lx\n",
|
||||
c, (DWORD)ret, SHELL_charclass[c] );
|
||||
}
|
||||
|
||||
for (c = 0x007f; c <= 0xffff; c++)
|
||||
{
|
||||
ret = PathIsValidCharW( c, ~0U );
|
||||
ok ( ret == 0x00000100,
|
||||
"PathIsValidCharW failed: 0x%02x got 0x%08lx expected 0x00000100\n",
|
||||
c, (DWORD)ret );
|
||||
}
|
||||
}
|
||||
|
||||
START_TEST(path)
|
||||
{
|
||||
test_UrlHash();
|
||||
|
@ -620,4 +715,6 @@ START_TEST(path)
|
|||
test_PathSearchAndQualify();
|
||||
test_PathCreateFromUrl();
|
||||
test_PathIsUrl();
|
||||
test_PathIsValidCharA();
|
||||
test_PathIsValidCharW();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue