mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 04:13:34 +00:00
[KERNEL32]
- Sync CompareStringA to wine 1.7.12 .Fix pollution of LastError by CompareStringA in case of zero-length string. CORE-7911 #comment committed r62197. #resolve svn path=/trunk/; revision=62197
This commit is contained in:
@@ -1767,13 +1767,13 @@ INT WINAPI CompareStringW(LCID lcid, DWORD style,
|
||||
* 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 @@ INT WINAPI CompareStringA(LCID lcid, DWORD style,
|
||||
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)
|
||||
if (len1)
|
||||
{
|
||||
if (len1 <= 130) len1W = MultiByteToWideChar(locale_cp, 0, str1, len1, buf1W, 130);
|
||||
if (len1W)
|
||||
str1W = buf1W;
|
||||
else
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
len1W = 0;
|
||||
str1W = buf1W;
|
||||
else
|
||||
{
|
||||
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);
|
||||
}
|
||||
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)
|
||||
{
|
||||
if (str1W != buf1W) HeapFree(GetProcessHeap(), 0, str1W);
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return 0;
|
||||
}
|
||||
MultiByteToWideChar(locale_cp, 0, str2, len2, str2W, len2W);
|
||||
}
|
||||
|
||||
ret = CompareStringW(lcid, style, str1W, len1W, str2W, len2W);
|
||||
if (len2)
|
||||
{
|
||||
if (len2 <= 130) 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)
|
||||
{
|
||||
if (str1W != buf1W) HeapFree(GetProcessHeap(), 0, str1W);
|
||||
SetLastError(ERROR_NOT_ENOUGH_MEMORY);
|
||||
return 0;
|
||||
}
|
||||
MultiByteToWideChar(locale_cp, 0, str2, len2, str2W, len2W);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
len2W = 0;
|
||||
str2W = buf2W;
|
||||
}
|
||||
|
||||
ret = CompareStringW(lcid, flags, str1W, len1W, str2W, len2W);
|
||||
|
||||
if (str1W != buf1W) HeapFree(GetProcessHeap(), 0, str1W);
|
||||
if (str2W != buf2W) HeapFree(GetProcessHeap(), 0, str2W);
|
||||
|
||||
Reference in New Issue
Block a user