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