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


Reply via email to