Module: wine Branch: master Commit: 8adfd63c2156a95bf5eddb2b283cfd14ff195da3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8adfd63c2156a95bf5eddb2b28...
Author: Piotr Caban piotr@codeweavers.com Date: Mon Apr 19 10:58:51 2010 +0200
msvcrt: Return correct strings in setlocale.
---
dlls/msvcrt/locale.c | 52 ++++++++++++++++++++++++++++++------------- dlls/msvcrt/tests/locale.c | 4 +- 2 files changed, 38 insertions(+), 18 deletions(-)
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c index fe77b83..84bd73b 100644 --- a/dlls/msvcrt/locale.c +++ b/dlls/msvcrt/locale.c @@ -348,6 +348,32 @@ MSVCRT__locale_t get_locale(void) { return data->locale; }
+/* INTERNAL: constructs string returned by setlocale */ +static inline char* construct_lc_all(MSVCRT__locale_t cur) { + static char current_lc_all[MAX_LOCALE_LENGTH]; + + int i; + + for(i=MSVCRT_LC_MIN+1; i<MSVCRT_LC_MAX; i++) { + if(strcmp(cur->locinfo->lc_category[i].locale, + cur->locinfo->lc_category[i+1].locale)) + break; + } + + if(i==MSVCRT_LC_MAX) + return cur->locinfo->lc_category[MSVCRT_LC_COLLATE].locale; + + sprintf(current_lc_all, + "LC_COLLATE=%s;LC_CTYPE=%s;LC_MONETARY=%s;LC_NUMERIC=%s;LC_TIME=%s", + cur->locinfo->lc_category[MSVCRT_LC_COLLATE].locale, + cur->locinfo->lc_category[MSVCRT_LC_CTYPE].locale, + cur->locinfo->lc_category[MSVCRT_LC_MONETARY].locale, + cur->locinfo->lc_category[MSVCRT_LC_NUMERIC].locale, + cur->locinfo->lc_category[MSVCRT_LC_TIME].locale); + + return current_lc_all; +} +
/********************************************************************* * wsetlocale (MSVCRT.@) @@ -1020,31 +1046,25 @@ int CDECL _configthreadlocale(int type) */ char* CDECL MSVCRT_setlocale(int category, const char* locale) { - static char current_lc_all[MAX_LOCALE_LENGTH]; - MSVCRT__locale_t loc, cur;
cur = get_locale();
- if(locale == NULL) { - if(category == MSVCRT_LC_ALL) { - sprintf(current_lc_all, - "LC_COLLATE=%s;LC_CTYPE=%s;LC_MONETARY=%s;LC_NUMERIC=%s;LC_TIME=%s", - cur->locinfo->lc_category[MSVCRT_LC_COLLATE].locale, - cur->locinfo->lc_category[MSVCRT_LC_CTYPE].locale, - cur->locinfo->lc_category[MSVCRT_LC_MONETARY].locale, - cur->locinfo->lc_category[MSVCRT_LC_NUMERIC].locale, - cur->locinfo->lc_category[MSVCRT_LC_TIME].locale); - - return current_lc_all; - } + if(category<MSVCRT_LC_MIN || category>MSVCRT_LC_MAX) + return NULL; + + if(!locale) { + if(category == MSVCRT_LC_ALL) + return construct_lc_all(cur);
return cur->locinfo->lc_category[category].locale; }
loc = _create_locale(category, locale); - if(!loc) + if(!loc) { + WARN("%d %s failed\n", category, locale); return NULL; + }
LOCK_LOCALE;
@@ -1163,7 +1183,7 @@ char* CDECL MSVCRT_setlocale(int category, const char* locale) }
if(category == MSVCRT_LC_ALL) - return cur->locinfo->lc_category[MSVCRT_LC_COLLATE].locale; + return construct_lc_all(cur);
return cur->locinfo->lc_category[category].locale; } diff --git a/dlls/msvcrt/tests/locale.c b/dlls/msvcrt/tests/locale.c index 45ab9b7..4c4b7a9 100644 --- a/dlls/msvcrt/tests/locale.c +++ b/dlls/msvcrt/tests/locale.c @@ -51,7 +51,7 @@ static void test_setlocale(void) ok(!strcmp(ret, "C"), "ret = %s\n", ret);
ret = setlocale(LC_ALL, NULL); - todo_wine ok(!strcmp(ret, "C"), "ret = %s\n", ret); + ok(!strcmp(ret, "C"), "ret = %s\n", ret);
if(!setlocale(LC_NUMERIC, "Polish") || !setlocale(LC_NUMERIC, "Greek") @@ -72,7 +72,7 @@ static void test_setlocale(void)
strcpy(buf, ret); ret = setlocale(LC_ALL, buf); - todo_wine ok(!strcmp(ret, lc_all), "ret = %s\n", ret); + ok(!strcmp(ret, lc_all), "ret = %s\n", ret);
ret = setlocale(LC_ALL, "German"); todo_wine ok(!strcmp(ret, "German_Germany.1252"), "ret = %s\n", ret);