Piotr Caban : msvcrt: Fix multiple locales parsing in _create_locale.
Alexandre Julliard
julliard at winehq.org
Mon Apr 19 11:51:16 CDT 2010
Module: wine
Branch: master
Commit: f11dfcb7a6dc7d552ef1ad7abb123268424bd357
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f11dfcb7a6dc7d552ef1ad7abb123268424bd357
Author: Piotr Caban <piotr at codeweavers.com>
Date: Mon Apr 19 10:58:10 2010 +0200
msvcrt: Fix multiple locales parsing in _create_locale.
---
dlls/msvcrt/locale.c | 22 ++++++++++++----------
1 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c
index e8af46b..fe36976 100644
--- a/dlls/msvcrt/locale.c
+++ b/dlls/msvcrt/locale.c
@@ -214,8 +214,8 @@ static LCID MSVCRT_locale_to_LCID(const char *locale)
if(cp) {
lstrcpynA(search.search_codepage, cp+1, MAX_ELEM_LEN);
- if(cp-region < MAX_ELEM_LEN)
- search.search_country[cp-region] = '\0';
+ if(cp-region-1 < MAX_ELEM_LEN)
+ search.search_country[cp-region-1] = '\0';
if(cp-locale < MAX_ELEM_LEN)
search.search_language[cp-locale] = '\0';
} else
@@ -229,11 +229,11 @@ static LCID MSVCRT_locale_to_LCID(const char *locale)
(LONG_PTR)&search);
if (!search.match_flags)
- return 0;
+ return -1;
/* If we were given something that didn't match, fail */
if (search.search_country[0] && !(search.match_flags & FOUND_COUNTRY))
- return 0;
+ return -1;
lcid = MAKELCID(search.found_lang_id, SORT_DEFAULT);
@@ -253,10 +253,10 @@ static LCID MSVCRT_locale_to_LCID(const char *locale)
GetLocaleInfoA(lcid, LOCALE_IDEFAULTANSICODEPAGE,
search.found_codepage, MAX_ELEM_LEN);
} else
- return 0;
+ return -1;
if (!atoi(search.found_codepage))
- return 0;
+ return -1;
}
} else {
/* Prefer ANSI codepages if present */
@@ -583,23 +583,25 @@ MSVCRT__locale_t _create_locale(int category, const char *locale)
return NULL;
p = strchr(locale, ';');
- if(p) {
+ if(locale[0]=='C' && (locale[1]==';' || locale[1]=='\0'))
+ lcid[i] = 0;
+ else if(p) {
memcpy(buf, locale, p-locale);
lcid[i] = MSVCRT_locale_to_LCID(buf);
} else
lcid[i] = MSVCRT_locale_to_LCID(locale);
- if(!lcid[i])
+ if(lcid[i] == -1)
return NULL;
if(!p || *(p+1)!='L' || *(p+2)!='C' || *(p+3)!='_')
break;
- locale = p+4;
+ locale = p+1;
}
} else {
lcid[0] = MSVCRT_locale_to_LCID(locale);
- if(!lcid[0])
+ if(lcid[0] == -1)
return NULL;
}
More information about the wine-cvs
mailing list