wbemprox: Reimplement LIKE.

Current implementation handles correctly % only at the end of the
string. Nothing else matches.

The new implementation while naïve and recursive handles both _ and *
correctly.
This commit is contained in:
Arkadiusz Hiler 2024-02-01 15:51:54 +02:00 committed by Alexandre Julliard
parent 332d48364f
commit f67279c57f
2 changed files with 39 additions and 34 deletions

View file

@ -93,23 +93,30 @@ void destroy_view( struct view *view )
free( view );
}
static BOOL eval_like( const WCHAR *lstr, const WCHAR *rstr )
static BOOL eval_like( const WCHAR *text, const WCHAR *pattern )
{
const WCHAR *p = lstr, *q = rstr;
if (wcsstr( pattern, L"[" )) FIXME( "character ranges (i.e. [abc], [^a-z]) are not supported\n" );
while (*p && *q)
while (*text)
{
if (q[0] == '\\' && q[1] == '\\') q++;
if (*q == '%')
if (pattern[0] == '\\' && pattern[1] == '\\') pattern++;
if (*pattern == '%')
{
while (*q == '%') q++;
if (!*q) return TRUE;
while (*p && *q && towupper( *p ) == towupper( *q )) { p++; q++; };
if (!*p && !*q) return TRUE;
while (*pattern == '%') pattern++;
if (!*pattern) return TRUE;
while (!eval_like( text, pattern ) && *text) text++;
return !!*text;
}
if (*q != '%' && towupper( *p++ ) != towupper( *q++ )) return FALSE;
if (*pattern != '_' && towupper( *text ) != towupper( *pattern )) return FALSE;
text++; pattern++;
}
return TRUE;
while (*pattern == '%') pattern++;
return *pattern == '\0';
}
static HRESULT eval_strcmp( UINT op, const WCHAR *lstr, const WCHAR *rstr, LONGLONG *val )

View file

@ -140,7 +140,7 @@ static void test_select( IWbemServices *services )
SysFreeString( query );
}
static void check_explorer_like_query( IWbemServices *services, const WCHAR *str, BOOL expect_success, BOOL todo)
static void check_explorer_like_query( IWbemServices *services, const WCHAR *str, BOOL expect_success)
{
HRESULT hr;
IWbemClassObject *obj[2];
@ -155,7 +155,6 @@ static void check_explorer_like_query( IWbemServices *services, const WCHAR *str
VARIANT var;
IEnumWbemClassObject_Next( result, 10000, 2, obj, &count );
todo_wine_if(todo)
ok( count == (expect_success ? 1 : 0), "expected to get %d results but got %lu\n",
(expect_success ? 1 : 0), count);
@ -184,36 +183,35 @@ static void test_like_query( IWbemServices *services )
WCHAR query[250];
struct {
BOOL todo;
BOOL expect_success;
const WCHAR *str;
} queries[] = {
{ FALSE, TRUE, L"explorer%" },
{ FALSE, FALSE, L"xplorer.exe" },
{ TRUE, FALSE, L"explorer.ex" },
{ FALSE, TRUE, L"%explorer%" },
{ FALSE, TRUE, L"explorer.exe%" },
{ FALSE, TRUE, L"%explorer.exe%" },
{ TRUE, TRUE, L"%plorer.exe" },
{ TRUE, TRUE, L"%plorer.exe%" },
{ TRUE, TRUE, L"__plorer.exe" },
{ TRUE, TRUE, L"e_plorer.exe" },
{ FALSE, FALSE, L"_plorer.exe" },
{ TRUE, TRUE, L"%%%plorer.e%" },
{ TRUE, TRUE, L"%plorer.e%" },
{ TRUE, TRUE, L"%plorer.e_e" },
{ TRUE, TRUE, L"%plorer.e_e" },
{ TRUE, TRUE, L"explore%exe" },
{ FALSE, FALSE, L"fancy_explore.exe" },
{ FALSE, FALSE, L"fancy%xplore%exe" },
{ FALSE, FALSE, L"%%%f%xplore%exe" },
{ TRUE, L"explorer%" },
{ FALSE, L"xplorer.exe" },
{ FALSE, L"explorer.ex" },
{ TRUE, L"%explorer%" },
{ TRUE, L"explorer.exe%" },
{ TRUE, L"%explorer.exe%" },
{ TRUE, L"%plorer.exe" },
{ TRUE, L"%plorer.exe%" },
{ TRUE, L"__plorer.exe" },
{ TRUE, L"e_plorer.exe" },
{ FALSE, L"_plorer.exe" },
{ TRUE, L"%%%plorer.e%" },
{ TRUE, L"%plorer.e%" },
{ TRUE, L"%plorer.e_e" },
{ TRUE, L"%plorer.e_e" },
{ TRUE, L"explore%exe" },
{ FALSE, L"fancy_explore.exe" },
{ FALSE, L"fancy%xplore%exe" },
{ FALSE, L"%%%f%xplore%exe" },
};
for (i = 0; i < ARRAYSIZE(queries); i++)
{
wsprintfW( query, L"SELECT * FROM Win32_Process WHERE Caption LIKE '%ls'", queries[i].str );
trace("%s\n", wine_dbgstr_w(query));
check_explorer_like_query( services, query, queries[i].expect_success, queries[i].todo );
check_explorer_like_query( services, query, queries[i].expect_success );
}
}