Author: dchapyshev
Date: Sat Nov 22 11:41:52 2008
New Revision: 37561
URL:
http://svn.reactos.org/svn/reactos?rev=37561&view=rev
Log:
- Fix CompareStringA/W. +7 passed wine tests
Modified:
trunk/reactos/dll/win32/kernel32/misc/lang.c
Modified: trunk/reactos/dll/win32/kernel32/misc/lang.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/misc/la…
==============================================================================
--- trunk/reactos/dll/win32/kernel32/misc/lang.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/kernel32/misc/lang.c [iso-8859-1] Sat Nov 22 11:41:52 2008
@@ -1910,7 +1910,7 @@
/*
* @implemented
*/
-/* Synced to Wine-20102004 */
+/* Synced to Wine-22112008 */
int
STDCALL
CompareStringA (
@@ -1926,7 +1926,7 @@
WCHAR *buf2W = buf1W + 130;
LPWSTR str1W, str2W;
INT len1W, len2W, ret;
- UINT locale_cp;
+ UINT locale_cp = CP_ACP;
if (!lpString1 || !lpString2)
{
@@ -1936,7 +1936,7 @@
if (cchCount1 < 0) cchCount1 = strlen(lpString1);
if (cchCount2 < 0) cchCount2 = strlen(lpString2);
- locale_cp = get_lcid_codepage(Locale);
+ if (!(dwCmpFlags & LOCALE_USE_CP_ACP)) locale_cp = get_lcid_codepage(Locale);
len1W = MultiByteToWideChar(locale_cp, 0, lpString1, cchCount1, buf1W, 130);
if (len1W)
@@ -1976,85 +1976,84 @@
}
-static int compare_unicode_string(
- PUNICODE_STRING String1,
- PUNICODE_STRING String2,
+static int
+LANG_CompareUnicodeString(
+ LPCWSTR s1,
+ ULONG len1,
+ LPCWSTR s2,
+ ULONG len2,
DWORD Flags
)
{
- ULONG len1, len2;
- PWCHAR s1, s2;
WCHAR c1, c2;
- if (String1 && String2)
- {
- len1 = String1->Length / sizeof(WCHAR);
- len2 = String2->Length / sizeof(WCHAR);
- s1 = String1->Buffer;
- s2 = String2->Buffer;
-
- while (len1 > 0 && len2 > 0)
- {
- if (Flags & NORM_IGNORESYMBOLS)
+ while (len1 > 0 && len2 > 0)
+ {
+ if (Flags & NORM_IGNORESYMBOLS)
+ {
+ int skip = 0;
+ /* FIXME: not tested */
+ if (iswctype(*s1, _SPACE | _PUNCT))
{
- int skip = 0;
- /* FIXME: not tested */
- if (iswctype(*s1, _SPACE | _PUNCT))
+ s1++;
+ len1--;
+ skip = 1;
+ }
+ if (iswctype(*s2, _SPACE | _PUNCT))
+ {
+ s2++;
+ len2--;
+ skip = 1;
+ }
+ if (skip) continue;
+ }
+
+ /* hyphen and apostrophe are treated differently depending on
+ * whether SORT_STRINGSORT specified or not
+ */
+ if (!(Flags & SORT_STRINGSORT))
+ {
+ if (*s1 == '-' || *s1 == '\'')
+ {
+ if (*s2 != '-' && *s2 != '\'')
{
s1++;
len1--;
- skip = 1;
- }
- if (iswctype(*s2, _SPACE | _PUNCT))
- {
- s2++;
- len2--;
- skip = 1;
- }
- if (skip) continue;
- }
-
- /* hyphen and apostrophe are treated differently depending on
- * whether SORT_STRINGSORT specified or not
- */
- if (!(Flags & SORT_STRINGSORT))
- {
- if (*s1 == '-' || *s1 == '\'')
- {
- if (*s2 != '-' && *s2 != '\'')
- {
- s1++;
- len1--;
- continue;
- }
- }
- else if (*s2 == '-' || *s2 == '\'')
- {
- s2++;
- len2--;
continue;
}
}
- if (Flags & NORM_IGNORECASE)
+ else if (*s2 == '-' || *s2 == '\'')
{
- c1 = len1-- ? RtlUpcaseUnicodeChar(*s1++) : 0;
- c2 = len2-- ? RtlUpcaseUnicodeChar(*s2++) : 0;
- if (!c1 || !c2 || c1 != c2)
+ s2++;
+ len2--;
+ continue;
+ }
+ }
+ if (Flags & NORM_IGNORECASE)
+ {
+ c1 = len1-- ? RtlUpcaseUnicodeChar(*s1++) : 0;
+ c2 = len2-- ? RtlUpcaseUnicodeChar(*s2++) : 0;
+ if (!c1 || !c2 || c1 != c2)
return c1 - c2;
- }
- else
- {
- c1 = len1-- ? *s1++ : 0;
- c2 = len2-- ? *s2++ : 0;
- if (!c1 || !c2 || c1 != c2)
+ }
+ else
+ {
+ c1 = len1-- ? *s1++ : 0;
+ c2 = len2-- ? *s2++ : 0;
+ if (!c1 || !c2 || c1 != c2)
return c1 - c2;
- }
- }
- return (int) len1 - (int) len2;
- }
- return 0;
-}
-
+ }
+ }
+
+ return (int) (len1 - len2);
+}
+
+static int
+LANG_GetRealLength(const WCHAR *str, int len)
+{
+ while (len && !str[len - 1]) len--;
+ return len;
+}
/*
* @unimplemented
@@ -2071,7 +2070,6 @@
)
{
INT Result;
- UNICODE_STRING String1, String2;
if (!lpString1 || !lpString2)
{
@@ -2081,30 +2079,23 @@
if (dwCmpFlags & ~(NORM_IGNORECASE | NORM_IGNORENONSPACE |
NORM_IGNORESYMBOLS | SORT_STRINGSORT | NORM_IGNOREKANATYPE |
- NORM_IGNOREWIDTH | 0x10000000))
+ NORM_IGNOREWIDTH | LOCALE_USE_CP_ACP | 0x10000000))
{
SetLastError(ERROR_INVALID_FLAGS);
return 0;
}
- if (cchCount1 < 0) cchCount1 = lstrlenW(lpString1);
- if (cchCount2 < 0) cchCount2 = lstrlenW(lpString2);
-
- String1.Length = String1.MaximumLength = cchCount1 * sizeof(WCHAR);
- String1.Buffer = (LPWSTR)lpString1;
- String2.Length = String2.MaximumLength = cchCount2 * sizeof(WCHAR);
- String2.Buffer = (LPWSTR)lpString2;
-
-
- if (dwCmpFlags & ~NORM_IGNORECASE)
- {
- DPRINT("CompareString: STUB flags - 0x%x\n", dwCmpFlags);
- Result = compare_unicode_string(&String1, &String2, dwCmpFlags);
- }
- else
- Result = RtlCompareUnicodeString(
- &String1, &String2, (BOOLEAN)(dwCmpFlags &
NORM_IGNORECASE));
-
+ /* this style is related to diacritics in Arabic, Japanese, and Hebrew */
+ if (dwCmpFlags & 0x10000000)
+ DPRINT1("Ignoring unknown style 0x10000000\n");
+
+ if (cchCount1 < 0) cchCount1 = wcslen(lpString1);
+ if (cchCount2 < 0) cchCount2 = wcslen(lpString2);
+
+ cchCount1 = LANG_GetRealLength(lpString1, cchCount1);
+ cchCount2 = LANG_GetRealLength(lpString2, cchCount2);
+
+ Result = LANG_CompareUnicodeString(lpString1, cchCount1, lpString2, cchCount2,
dwCmpFlags);
if (Result) /* need to translate result */
return (Result < 0) ? CSTR_LESS_THAN : CSTR_GREATER_THAN;