Rémi Bernon : msvcrt: Pass temporary locale to MSVCRT__towlower_l.
Alexandre Julliard
julliard at winehq.org
Tue Nov 10 15:30:25 CST 2020
Module: wine
Branch: master
Commit: 0a2635611ac46081b2049b62ba62e3691e1c039f
URL: https://source.winehq.org/git/wine.git/?a=commit;h=0a2635611ac46081b2049b62ba62e3691e1c039f
Author: Rémi Bernon <rbernon at codeweavers.com>
Date: Tue Nov 10 16:58:44 2020 +0100
msvcrt: Pass temporary locale to MSVCRT__towlower_l.
When not provided, instead of calling get_locinfo on every character.
Signed-off-by: Rémi Bernon <rbernon at codeweavers.com>
Signed-off-by: Piotr Caban <piotr at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/msvcrt/wcs.c | 26 ++++++++++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c
index 858ecbd7ed0..63f9fd472d7 100644
--- a/dlls/msvcrt/wcs.c
+++ b/dlls/msvcrt/wcs.c
@@ -119,16 +119,22 @@ int CDECL MSVCRT_towlower(MSVCRT_wint_t c)
INT CDECL MSVCRT__wcsicmp_l(const MSVCRT_wchar_t *str1, const MSVCRT_wchar_t *str2, MSVCRT__locale_t locale)
{
+ MSVCRT__locale_tstruct tmp = {0};
MSVCRT_wchar_t c1, c2;
if(!MSVCRT_CHECK_PMT(str1 != NULL) || !MSVCRT_CHECK_PMT(str2 != NULL))
return MSVCRT__NLSCMPERROR;
+ if(!locale)
+ locale = get_current_locale_noalloc(&tmp);
+
do
{
c1 = MSVCRT__towlower_l(*str1++, locale);
c2 = MSVCRT__towlower_l(*str2++, locale);
} while(c1 && (c1 == c2));
+
+ free_locale_noalloc(&tmp);
return c1 - c2;
}
@@ -146,19 +152,25 @@ INT CDECL MSVCRT__wcsicmp( const MSVCRT_wchar_t* str1, const MSVCRT_wchar_t* str
INT CDECL MSVCRT__wcsnicmp_l(const MSVCRT_wchar_t *str1, const MSVCRT_wchar_t *str2,
MSVCRT_size_t n, MSVCRT__locale_t locale)
{
+ MSVCRT__locale_tstruct tmp = {0};
MSVCRT_wchar_t c1, c2;
if (!n)
- return 0;
+ return 0;
if(!MSVCRT_CHECK_PMT(str1 != NULL) || !MSVCRT_CHECK_PMT(str2 != NULL))
return MSVCRT__NLSCMPERROR;
+ if(!locale)
+ locale = get_current_locale_noalloc(&tmp);
+
do
{
c1 = MSVCRT__towlower_l(*str1++, locale);
c2 = MSVCRT__towlower_l(*str2++, locale);
} while(--n && c1 && (c1 == c2));
+
+ free_locale_noalloc(&tmp);
return c1 - c2;
}
@@ -397,6 +409,7 @@ MSVCRT_wchar_t* CDECL MSVCRT__wcsupr( MSVCRT_wchar_t *str )
*/
int CDECL MSVCRT__wcslwr_s_l( MSVCRT_wchar_t* str, MSVCRT_size_t n, MSVCRT__locale_t locale )
{
+ MSVCRT__locale_tstruct tmp = {0};
MSVCRT_wchar_t* ptr = str;
if (!str || !n)
@@ -406,13 +419,22 @@ int CDECL MSVCRT__wcslwr_s_l( MSVCRT_wchar_t* str, MSVCRT_size_t n, MSVCRT__loca
return MSVCRT_EINVAL;
}
+ if(!locale)
+ locale = get_current_locale_noalloc(&tmp);
+
while (n--)
{
- if (!*ptr) return 0;
+ if (!*ptr)
+ {
+ free_locale_noalloc(&tmp);
+ return 0;
+ }
*ptr = MSVCRT__towlower_l(*ptr, locale);
ptr++;
}
+ free_locale_noalloc(&tmp);
+
/* MSDN claims that the function should return and set errno to
* ERANGE, which doesn't seem to be true based on the tests. */
*str = '\0';
More information about the wine-cvs
mailing list