WCMD not working anymore

Dmitry Timoshkov dmitry at baikal.ru
Wed Jul 2 07:56:54 CDT 2003


"Sylvain Petreolle" <spetreolle at yahoo.fr> wrote:

> With the command "DIR" entered we have :
> ...
> 0009:Call kernel32.CompareStringA(00000400,00001001,40792654
> "DIR",00000003,4057bcd3 "DIR",ffffffff) ret=405769b9
> 0009:Ret  kernel32.CompareStringA() retval=00000001 ret=405769b9
> ....
> 
> where the return code should be 2 (CSTR_EQUAL)

Thanks for the report. Here is the patch. I've added a test case
for that bug as well.

Changelog:
    Dmitry Timoshkov <dmitry at codeweavers.com>
    Exit ealier from LCMapStringA in the case of LCMAP_SORTKEY.
    Don't rely on computing string length by MultiByteToWideChar
    in CompareStringA, do it manually.

-- 
Dmitry.
-------------- next part --------------
diff -u cvs/hq/wine/dlls/kernel/locale.c wine/dlls/kernel/locale.c
--- cvs/hq/wine/dlls/kernel/locale.c	Sat Jun 28 14:30:49 2003
+++ wine/dlls/kernel/locale.c	Wed Jul  2 21:29:56 2003
@@ -1154,6 +1154,7 @@ INT WINAPI LCMapStringA(LCID lcid, DWORD
             goto map_string_exit;
         }
         ret = wine_get_sortkey(flags, srcW, srclenW, dst, dstlen);
+        goto map_string_exit;
     }
 
     if (flags & SORT_STRINGSORT)
@@ -1224,6 +1225,9 @@ INT WINAPI CompareStringA(LCID lcid, DWO
         SetLastError(ERROR_INVALID_PARAMETER);
         return 0;
     }
+
+    if (len1 < 0) len1 = strlen(str1);
+    if (len2 < 0) len2 = strlen(str2);
 
     GetLocaleInfoW(lcid, LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER,
                    (WCHAR *)&locale_cp, (sizeof(locale_cp)/sizeof(WCHAR)));
diff -u cvs/hq/wine/dlls/kernel/tests/locale.c wine/dlls/kernel/tests/locale.c
--- cvs/hq/wine/dlls/kernel/tests/locale.c	Tue Jul  1 16:17:51 2003
+++ wine/dlls/kernel/tests/locale.c	Wed Jul  2 21:29:56 2003
@@ -719,6 +719,10 @@ char buffer1[BUFFER_SIZE], buffer2[BUFFE
 
 	ret = CompareStringA(lcid, NORM_IGNORECASE, buffer1, -1, buffer2, 0);
 	ok (ret == 3, "CompareStringA (st1=%s str2=%s) expected result=3, got %d", buffer1, buffer2, ret);
+
+	strcpy(buffer1, "Salut"); strcpy(buffer2, "saLuT");
+	ret = CompareStringA(lcid, NORM_IGNORECASE, buffer1, 5, buffer2, -1);
+	ok (ret == 2, "CompareStringA (st1=%s str2=%s) expected result=2, got %d", buffer1, buffer2, ret);
 }
 
 void test_LCMapStringA(void)


More information about the wine-patches mailing list