ntdll: rtlstr.c: Implement checking for control characters in, RtlIsTextUnicode [try 3]

Zac Brown zac at zacbrown.org
Thu Jun 19 14:43:12 CDT 2008


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



More information about the wine-devel mailing list