ntdll: rtlstr.c: Implement checking for control characters in RtlIsTextUnicode

Zac Brown zac at zacbrown.org
Wed Jun 18 18:48:59 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.
> 
> 
> ------------------------------------------------------------------------
> 
> ---
>  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



More information about the wine-devel mailing list