Zac Brown wrote:
Implement setting of IS_TEXT_UNICODE_CONTROLS and IS_TEXT_UNICODE_REVERSE_CONTROLS when control characters are present in RtlIsTextUnicode.
dlls/ntdll/rtlstr.c | 54 ++++++++++++++++++++++++++++++++++++++++++++- dlls/ntdll/tests/rtlstr.c | 2 - 2 files changed, 53 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/rtlstr.c b/dlls/ntdll/rtlstr.c index deec931..2191825 100644 --- a/dlls/ntdll/rtlstr.c +++ b/dlls/ntdll/rtlstr.c @@ -1591,8 +1591,26 @@ NTSTATUS WINAPI RtlFindCharInUnicodeString( */ BOOLEAN WINAPI RtlIsTextUnicode( LPCVOID buf, INT len, INT *pf ) {
- /* lookup table for Unicode values of control chars */
- static const WCHAR control_chars[] = {
'\t',
'\r',
'\n',
' ',
0x3000 // CJK space
- };
- /* lookup table for byte-reversed Unicode values of control chars */
- static const WCHAR reversed_control_chars[] = {
0x0900, // tab
0x0d00, // carriage return
0x0a00, // new line
0x2000, // space
0x0030 // CJK space
- };
- const WCHAR *s = buf;
- int i;
int i, j; unsigned int flags = ~0U, out_flags = 0;
if (len < sizeof(WCHAR))
@@ -1650,6 +1668,40 @@ BOOLEAN WINAPI RtlIsTextUnicode( LPCVOID buf, INT len, INT *pf ) } }
- /*
* Check for unicode control characters, both standard and byte reversed.
* ie: (space, tab, carriage return, line feed, CJK space.
*/
- for (i = 0; i < len; i++)
- {
if ((flags & IS_TEXT_UNICODE_CONTROLS))
{
if (s[i] == control_chars[0] ||
s[i] == control_chars[1] ||
s[i] == control_chars[2] ||
s[i] == control_chars[3] ||
s[i] == control_chars[4])
{
out_flags |= IS_TEXT_UNICODE_CONTROLS;
break;
}
}
if ((flags & IS_TEXT_UNICODE_REVERSE_CONTROLS) && (out_flags & IS_TEXT_UNICODE_REVERSE_SIGNATURE))
{
if (s[i] == reversed_control_chars[0] ||
s[i] == reversed_control_chars[1] ||
s[i] == reversed_control_chars[2] ||
s[i] == reversed_control_chars[3] ||
s[i] == reversed_control_chars[4])
{
out_flags |= IS_TEXT_UNICODE_REVERSE_CONTROLS;
break;
}
}
- }
- if (pf) { out_flags &= *pf;
diff --git a/dlls/ntdll/tests/rtlstr.c b/dlls/ntdll/tests/rtlstr.c index aa4a391..5d77f9a 100644 --- a/dlls/ntdll/tests/rtlstr.c +++ b/dlls/ntdll/tests/rtlstr.c @@ -1689,7 +1689,6 @@ static void test_RtlIsTextUnicode(void)
flags = IS_TEXT_UNICODE_UNICODE_MASK; ok(pRtlIsTextUnicode(unicode, sizeof(unicode), &flags), "Text should not pass a Unicode\n");
- todo_wine ok(flags == (IS_TEXT_UNICODE_STATISTICS | IS_TEXT_UNICODE_CONTROLS), "Expected flags 0x6, obtained %x\n", flags);
@@ -1718,7 +1717,6 @@ static void test_RtlIsTextUnicode(void)
flags = IS_TEXT_UNICODE_REVERSE_MASK; ok(!pRtlIsTextUnicode(be_unicode, sizeof(unicode) + 2, &flags), "Reverse endian should be Unicode\n");
- todo_wine ok(flags == (IS_TEXT_UNICODE_REVERSE_CONTROLS | IS_TEXT_UNICODE_REVERSE_SIGNATURE), "Expected flags 0xc0, obtained %x\n", flags); HeapFree(GetProcessHeap(), 0, be_unicode);
Ignore this patch, aside from tabs, it needs something changed.
Thanks,
Zac