Index: dll/win32/kernel32/winnls/string/lang.c =================================================================== --- dll/win32/kernel32/winnls/string/lang.c (révision 62120) +++ dll/win32/kernel32/winnls/string/lang.c (copie de travail) @@ -1767,13 +1767,13 @@ * str1 is less than, equal to or greater than str2 respectively. * Failure: FALSE. Use GetLastError() to determine the cause. */ -INT WINAPI CompareStringA(LCID lcid, DWORD style, +INT WINAPI CompareStringA(LCID lcid, DWORD flags, LPCSTR str1, INT len1, LPCSTR str2, INT len2) { WCHAR *buf1W = NtCurrentTeb()->StaticUnicodeBuffer; WCHAR *buf2W = buf1W + 130; LPWSTR str1W, str2W; - INT len1W, len2W, ret; + INT len1W = 0, len2W = 0, ret; UINT locale_cp = CP_ACP; if (!str1 || !str2) @@ -1784,39 +1784,56 @@ if (len1 < 0) len1 = strlen(str1); if (len2 < 0) len2 = strlen(str2); - if (!(style & LOCALE_USE_CP_ACP)) locale_cp = get_lcid_codepage( lcid ); + if (!(flags & LOCALE_USE_CP_ACP)) locale_cp = get_lcid_codepage( lcid ); - len1W = MultiByteToWideChar(locale_cp, 0, str1, len1, buf1W, 130); - if (len1W) - str1W = buf1W; - else + if (len1) { - len1W = MultiByteToWideChar(locale_cp, 0, str1, len1, NULL, 0); - str1W = HeapAlloc(GetProcessHeap(), 0, len1W * sizeof(WCHAR)); - if (!str1W) + if (len1 <= 130) len1W = MultiByteToWideChar(locale_cp, 0, str1, len1, buf1W, 130); + if (len1W) + str1W = buf1W; + else { - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; + len1W = MultiByteToWideChar(locale_cp, 0, str1, len1, NULL, 0); + str1W = HeapAlloc(GetProcessHeap(), 0, len1W * sizeof(WCHAR)); + if (!str1W) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + MultiByteToWideChar(locale_cp, 0, str1, len1, str1W, len1W); } - MultiByteToWideChar(locale_cp, 0, str1, len1, str1W, len1W); } - len2W = MultiByteToWideChar(locale_cp, 0, str2, len2, buf2W, 130); - if (len2W) - str2W = buf2W; else { - len2W = MultiByteToWideChar(locale_cp, 0, str2, len2, NULL, 0); - str2W = HeapAlloc(GetProcessHeap(), 0, len2W * sizeof(WCHAR)); - if (!str2W) + len1W = 0; + str1W = buf1W; + } + + if (len2) + { + if (len2 <= 130) len2W = MultiByteToWideChar(locale_cp, 0, str2, len2, buf2W, 130); + if (len2W) + str2W = buf2W; + else { - if (str1W != buf1W) HeapFree(GetProcessHeap(), 0, str1W); - SetLastError(ERROR_NOT_ENOUGH_MEMORY); - return 0; + len2W = MultiByteToWideChar(locale_cp, 0, str2, len2, NULL, 0); + str2W = HeapAlloc(GetProcessHeap(), 0, len2W * sizeof(WCHAR)); + if (!str2W) + { + if (str1W != buf1W) HeapFree(GetProcessHeap(), 0, str1W); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return 0; + } + MultiByteToWideChar(locale_cp, 0, str2, len2, str2W, len2W); } - MultiByteToWideChar(locale_cp, 0, str2, len2, str2W, len2W); } + else + { + len2W = 0; + str2W = buf2W; + } - ret = CompareStringW(lcid, style, str1W, len1W, str2W, len2W); + ret = CompareStringW(lcid, flags, str1W, len1W, str2W, len2W); if (str1W != buf1W) HeapFree(GetProcessHeap(), 0, str1W); if (str2W != buf2W) HeapFree(GetProcessHeap(), 0, str2W);