From df80dc6da3f626d65991889e1ada8059cf320740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9=20van=20Geldorp?= Date: Fri, 24 Sep 2004 15:17:20 +0000 Subject: [PATCH] Implement PathIsCharValidA/W svn path=/trunk/; revision=11029 --- reactos/lib/shlwapi/path.c | 98 ++++++++++++++++++++++++++++++++ reactos/lib/shlwapi/shlwapi.spec | 4 +- 2 files changed, 100 insertions(+), 2 deletions(-) diff --git a/reactos/lib/shlwapi/path.c b/reactos/lib/shlwapi/path.c index e1be4e8e0c2..a8c8e7cb7a3 100644 --- a/reactos/lib/shlwapi/path.c +++ b/reactos/lib/shlwapi/path.c @@ -3960,3 +3960,101 @@ HRESULT WINAPI SHGetWebFolderFilePathW(LPCWSTR lpszFile, LPWSTR lpszPath, DWORD return S_OK; return E_FAIL; } + +#define PATH_CHAR_CLASS_LETTER 0x0001 +#define PATH_CHAR_CLASS_ASTERIX 0x0002 +#define PATH_CHAR_CLASS_DOT 0x0004 +#define PATH_CHAR_CLASS_BACKSLASH 0x0008 +#define PATH_CHAR_CLASS_COLON 0x0010 +#define PATH_CHAR_CLASS_SEMICOLON 0x0020 +#define PATH_CHAR_CLASS_COMMA 0x0040 +#define PATH_CHAR_CLASS_SPACE 0x0080 +#define PATH_CHAR_CLASS_OTHER_VALID 0x0100 +#define PATH_CHAR_CLASS_DOUBLEQUOTE 0x0200 + +/************************************************************************* + * PathIsValidCharAW [internal] + * + * Check if a char is of a certain class + */ +static BOOL WINAPI PathIsValidCharAW(unsigned Ch, DWORD Class) +{ + static struct + { + char Ch; + DWORD Class; + } CharClass[] = + { + { ' ', 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_COLON }, + { ';', PATH_CHAR_CLASS_SEMICOLON }, + { '=', PATH_CHAR_CLASS_OTHER_VALID }, + { '?', PATH_CHAR_CLASS_LETTER }, + { '@', PATH_CHAR_CLASS_OTHER_VALID }, + { '[', 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 }, + { '{', PATH_CHAR_CLASS_OTHER_VALID }, + { '}', PATH_CHAR_CLASS_OTHER_VALID }, + { '~', PATH_CHAR_CLASS_OTHER_VALID }, + { 0x7f, PATH_CHAR_CLASS_OTHER_VALID } + }; + unsigned Index; + + if (('A' <= Ch && Ch <= 'Z') || ('a' <= Ch && Ch <= 'z')) + { + return (Class & PATH_CHAR_CLASS_LETTER); + } + + if (('0' <= Ch && Ch <= '9') || 0x80 <= Ch) + { + return (Class & PATH_CHAR_CLASS_OTHER_VALID); + } + + for (Index = 0; Index < sizeof(CharClass) / sizeof(CharClass[0]); Index++) + { + if (Ch == CharClass[Index].Ch) + { + return (Class & CharClass[Index].Class); + } + } + + return FALSE; +} + +/************************************************************************* + * @ [SHLWAPI.455] + * + * Check if an Ascii char is of a certain class + */ +BOOL WINAPI PathIsValidCharA(char Ch, DWORD Class) +{ + return PathIsValidCharAW((unsigned) Ch, Class); +} + +/************************************************************************* + * @ [SHLWAPI.456] + * + * Check if an Unicode char is of a certain class + */ +BOOL WINAPI PathIsValidCharW(WCHAR Ch, DWORD Class) +{ + return PathIsValidCharAW((unsigned) Ch, Class); +} diff --git a/reactos/lib/shlwapi/shlwapi.spec b/reactos/lib/shlwapi/shlwapi.spec index cfb218b26ae..eb7e607c2ef 100644 --- a/reactos/lib/shlwapi/shlwapi.spec +++ b/reactos/lib/shlwapi/shlwapi.spec @@ -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 SHExpandEnvironmentStringsA(str ptr long) kernel32.ExpandEnvironmentStringsA