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