Re: ntdll: rtlstr.c: Implement checking for control characters in, RtlIsTextUnicode [try 3]
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
participants (1)
-
Zac Brown