Commit 9bbb66fd authored by Alexandre Julliard's avatar Alexandre Julliard

ntdll: Use the NLS case mapping table for RtlHashUnicodeString().

parent f66517b5
...@@ -1288,6 +1288,40 @@ BOOLEAN WINAPI RtlPrefixUnicodeString( const UNICODE_STRING *s1, const UNICODE_S ...@@ -1288,6 +1288,40 @@ BOOLEAN WINAPI RtlPrefixUnicodeString( const UNICODE_STRING *s1, const UNICODE_S
} }
/******************************************************************************
* RtlHashUnicodeString (NTDLL.@)
*/
NTSTATUS WINAPI RtlHashUnicodeString( const UNICODE_STRING *string, BOOLEAN case_insensitive,
ULONG alg, ULONG *hash )
{
unsigned int i;
if (!string || !hash) return STATUS_INVALID_PARAMETER;
switch (alg)
{
case HASH_STRING_ALGORITHM_DEFAULT:
case HASH_STRING_ALGORITHM_X65599:
break;
default:
return STATUS_INVALID_PARAMETER;
}
*hash = 0;
if (!case_insensitive)
for (i = 0; i < string->Length / sizeof(WCHAR); i++)
*hash = *hash * 65599 + string->Buffer[i];
else if (nls_info.UpperCaseTable)
for (i = 0; i < string->Length / sizeof(WCHAR); i++)
*hash = *hash * 65599 + casemap( nls_info.UpperCaseTable, string->Buffer[i] );
else /* locale not setup yet */
for (i = 0; i < string->Length / sizeof(WCHAR); i++)
*hash = *hash * 65599 + casemap_ascii( string->Buffer[i] );
return STATUS_SUCCESS;
}
/************************************************************************** /**************************************************************************
* RtlCustomCPToUnicodeN (NTDLL.@) * RtlCustomCPToUnicodeN (NTDLL.@)
*/ */
......
...@@ -1708,28 +1708,3 @@ NTSTATUS WINAPI RtlStringFromGUID(const GUID* guid, UNICODE_STRING *str) ...@@ -1708,28 +1708,3 @@ NTSTATUS WINAPI RtlStringFromGUID(const GUID* guid, UNICODE_STRING *str)
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
/******************************************************************************
* RtlHashUnicodeString [NTDLL.@]
*/
NTSTATUS WINAPI RtlHashUnicodeString(PCUNICODE_STRING string, BOOLEAN case_insensitive, ULONG alg, ULONG *hash)
{
unsigned int i;
if (!string || !hash) return STATUS_INVALID_PARAMETER;
switch (alg)
{
case HASH_STRING_ALGORITHM_DEFAULT:
case HASH_STRING_ALGORITHM_X65599:
break;
default:
return STATUS_INVALID_PARAMETER;
}
*hash = 0;
for (i = 0; i < string->Length/sizeof(WCHAR); i++)
*hash = *hash*65599 + (case_insensitive ? toupperW(string->Buffer[i]) : string->Buffer[i]);
return STATUS_SUCCESS;
}
...@@ -1942,14 +1942,18 @@ struct hash_unicodestring_test { ...@@ -1942,14 +1942,18 @@ struct hash_unicodestring_test {
}; };
static const struct hash_unicodestring_test hash_test[] = { static const struct hash_unicodestring_test hash_test[] = {
{ {'T',0}, FALSE, 0x00000054 }, { L"T", FALSE, 0x00000054 },
{ {'T','e','s','t',0}, FALSE, 0x766bb952 }, { L"Test", FALSE, 0x766bb952 },
{ {'T','e','S','t',0}, FALSE, 0x764bb172 }, { L"TeSt", FALSE, 0x764bb172 },
{ {'t','e','s','t',0}, FALSE, 0x4745d132 }, { L"test", FALSE, 0x4745d132 },
{ {'t','e','s','t',0}, TRUE, 0x6689c132 }, { L"test", TRUE, 0x6689c132 },
{ {'T','E','S','T',0}, TRUE, 0x6689c132 }, { L"TEST", TRUE, 0x6689c132 },
{ {'T','E','S','T',0}, FALSE, 0x6689c132 }, { L"TEST", FALSE, 0x6689c132 },
{ {'a','b','c','d','e','f',0}, FALSE, 0x971318c3 }, { L"t\xe9st", FALSE, 0x8845cfb6 },
{ L"t\xe9st", TRUE, 0xa789bfb6 },
{ L"T\xc9ST", TRUE, 0xa789bfb6 },
{ L"T\xc9ST", FALSE, 0xa789bfb6 },
{ L"abcdef", FALSE, 0x971318c3 },
{ { 0 } } { { 0 } }
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment