Simple RtlIsTextUnicode() patch
Dmitry Timoshkov
dmitry at baikal.ru
Tue Aug 19 03:51:48 CDT 2003
Hello,
this is a simple RtlIsTextUnicode() improvement patch.
Changelog:
Dmitry Timoshkov <dmitry at codeweavers.com>
Apply only specified tests.
Implement IS_TEXT_UNICODE_REVERSE_SIGNATURE, IS_TEXT_UNICODE_STATISTICS
and IS_TEXT_UNICODE_NULL_BYTES tests.
Revert IS_TEXT_UNICODE_ODD_LENGTH test.
--- cvs/hq/wine/dlls/ntdll/rtlstr.c Tue Aug 19 01:33:48 2003
+++ wine/dlls/ntdll/rtlstr.c Tue Aug 19 08:25:42 2003
@@ -1405,7 +1405,11 @@
*/
/* Tests that we currently implement */
#define ITU_IMPLEMENTED_TESTS \
- (IS_TEXT_UNICODE_SIGNATURE|IS_TEXT_UNICODE_ODD_LENGTH)
+ (IS_TEXT_UNICODE_SIGNATURE | \
+ IS_TEXT_UNICODE_REVERSE_SIGNATURE | \
+ IS_TEXT_UNICODE_ODD_LENGTH | \
+ IS_TEXT_UNICODE_STATISTICS | \
+ IS_TEXT_UNICODE_NULL_BYTES)
/**************************************************************************
* RtlIsTextUnicode (NTDLL.@)
@@ -1443,12 +1447,42 @@
*/
/* Check for an odd length ... pass if even. */
- if (!(len & 1))
+ if ((flags & IS_TEXT_UNICODE_ODD_LENGTH) && (len & 1))
out_flags |= IS_TEXT_UNICODE_ODD_LENGTH;
- /* Check for the special unicode marker byte. */
- if (*s == 0xFEFF)
+ /* Check for the special byte order unicode marks. */
+ if ((flags & IS_TEXT_UNICODE_SIGNATURE) && *s == 0xFEFF)
out_flags |= IS_TEXT_UNICODE_SIGNATURE;
+
+ if ((flags & IS_TEXT_UNICODE_REVERSE_SIGNATURE) && *s == 0xFFFE)
+ out_flags |= IS_TEXT_UNICODE_REVERSE_SIGNATURE;
+
+ /* apply some statistical analysis */
+ if (flags & IS_TEXT_UNICODE_STATISTICS)
+ {
+ DWORD i, stats = 0;
+ /* FIXME: checks only for ASCII characters in the unicode stream */
+ for (i = 0; i < len / sizeof(WCHAR); i++)
+ {
+ if (s[i] <= 255) stats++;
+ }
+ if (stats > len / sizeof(WCHAR) / 2)
+ out_flags |= IS_TEXT_UNICODE_STATISTICS;
+ }
+
+ /* Check for unicode NULL chars */
+ if (flags & IS_TEXT_UNICODE_NULL_BYTES)
+ {
+ DWORD i;
+ for (i = 0; i < len / sizeof(WCHAR); i++)
+ {
+ if (!s[i])
+ {
+ out_flags |= IS_TEXT_UNICODE_NULL_BYTES;
+ break;
+ }
+ }
+ }
/*
* Check whether the string passed all of the tests.
More information about the wine-patches
mailing list