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