Zac Brown wrote: > Implement setting of IS_TEXT_UNICODE_CONTROLS and > IS_TEXT_UNICODE_REVERSE_CONTROLS when control characters are present in > RtlIsTextUnicode. > > -Zac Brown > > > ------------------------------------------------------------------------ > > --- > dlls/ntdll/rtlstr.c | 57 > +++++++++++++++++++++++++++++++++++++++++++++ > dlls/ntdll/tests/rtlstr.c | 2 - > 2 files changed, 57 insertions(+), 2 deletions(-) > > diff --git a/dlls/ntdll/rtlstr.c b/dlls/ntdll/rtlstr.c > index deec931..ead8974 100644 > --- a/dlls/ntdll/rtlstr.c > +++ b/dlls/ntdll/rtlstr.c > @@ -1591,6 +1591,23 @@ NTSTATUS WINAPI RtlFindCharInUnicodeString( > */ > BOOLEAN WINAPI RtlIsTextUnicode( LPCVOID buf, INT len, INT *pf ) > { > + /* > + * Enum for possible control characters. > + * BR = byte reversed, for use in byte reversed strings. > + */ > + enum control_chars { > + TAB = '\t', > + BR_TAB = 0x0900, > + CRET = '\r', > + BR_CRET = 0x0d00, > + NEWLINE = '\n', > + BR_NEWLINE = 0x0a00, > + SPACE = ' ', > + BR_SPACE = 0x2000, > + CJKSPACE = 0x3000, > + BR_CJKSPACE = 0x0030 > + }; > + > const WCHAR *s = buf; > int i; > unsigned int flags = ~0U, out_flags = 0; > @@ -1650,6 +1667,46 @@ BOOLEAN WINAPI RtlIsTextUnicode( LPCVOID buf, INT len, > INT *pf ) > } > } > > + /* Check for control characters in string. */ > + if (flags & IS_TEXT_UNICODE_CONTROLS) > + { > + for (i = 0; i < len; i++) > + { > + switch (s[i]) > + { > + case TAB: > + case CRET: > + case NEWLINE: > + case SPACE: > + case CJKSPACE: > + out_flags |= IS_TEXT_UNICODE_CONTROLS; > + break; > + default: > + continue; > + } > + } > + } > + > + /* Check for control characters in byte reversed string. */ > + if ((flags & IS_TEXT_UNICODE_REVERSE_CONTROLS) && (out_flags & > IS_TEXT_UNICODE_REVERSE_SIGNATURE)) > + { > + for (i = 0; i < len; i++) > + { > + switch (s[i]) > + { > + case BR_TAB: > + case BR_CRET: > + case BR_NEWLINE: > + case BR_SPACE: > + case BR_CJKSPACE: > + out_flags |= IS_TEXT_UNICODE_REVERSE_CONTROLS; > + break; > + default: > + continue; > + } > + } > + } > + > 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); > > > ------------------------------------------------------------------------ > >
One more time... ignore this patch. Will send update later. -Zac