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