Module: wine Branch: master Commit: fea69b230546cd8145c67e9f94b3e8f0fa2bea2f URL: http://source.winehq.org/git/wine.git/?a=commit;h=fea69b230546cd8145c67e9f94...
Author: Piotr Caban piotr@codeweavers.com Date: Thu Oct 13 12:24:59 2011 +0200
msvcrt: Don't duplicate _setmbcp functionality inside _create_locale function.
---
dlls/msvcrt/locale.c | 14 +----------- dlls/msvcrt/mbcs.c | 57 +++++++++++++++++++++++++++++++++++++------------ dlls/msvcrt/msvcrt.h | 1 + 3 files changed, 45 insertions(+), 27 deletions(-)
diff --git a/dlls/msvcrt/locale.c b/dlls/msvcrt/locale.c index 7e9cebe..0fbc0fe 100644 --- a/dlls/msvcrt/locale.c +++ b/dlls/msvcrt/locale.c @@ -747,7 +747,6 @@ MSVCRT__locale_t MSVCRT__create_locale(int category, const char *locale) }
memset(loc->locinfo, 0, sizeof(MSVCRT_threadlocinfo)); - memset(loc->mbcinfo, 0, sizeof(MSVCRT_threadmbcinfo));
loc->locinfo->lconv = MSVCRT_malloc(sizeof(struct MSVCRT_lconv)); if(!loc->locinfo->lconv) { @@ -840,18 +839,7 @@ MSVCRT__locale_t MSVCRT__create_locale(int category, const char *locale) } }
- loc->mbcinfo->refcount = 1; - loc->mbcinfo->mbcodepage = loc->locinfo->lc_id[MSVCRT_LC_CTYPE].wCodePage; - - for(i=0; i<256; i++) { - if(loc->locinfo->pclmap[i] != i) { - loc->mbcinfo->mbctype[i+1] |= 0x10; - loc->mbcinfo->mbcasemap[i] = loc->locinfo->pclmap[i]; - } else if(loc->locinfo->pcumap[i] != i) { - loc->mbcinfo->mbctype[i+1] |= 0x20; - loc->mbcinfo->mbcasemap[i] = loc->locinfo->pcumap[i]; - } - } + _setmbcp_l(loc->locinfo->lc_id[MSVCRT_LC_CTYPE].wCodePage, loc->mbcinfo);
if(lcid[MSVCRT_LC_MONETARY] && (category==MSVCRT_LC_ALL || category==MSVCRT_LC_MONETARY)) { if(update_threadlocinfo_category(lcid[MSVCRT_LC_MONETARY], loc, MSVCRT_LC_MONETARY)) { diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 96cea86..737f690 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -182,25 +182,25 @@ int* CDECL ___mb_cur_max_l_func(MSVCRT__locale_t locale) }
/********************************************************************* - * _setmbcp (MSVCRT.@) + * INTERNAL: _setmbcp_l */ -int CDECL _setmbcp(int cp) +int _setmbcp_l(int cp, MSVCRT_pthreadmbcinfo mbcinfo) { const char format[] = ".%d";
- MSVCRT_pthreadmbcinfo mbcinfo = get_mbcinfo(); - char buf[32]; int newcp; CPINFO cpi; BYTE *bytes; WORD chartypes[256]; - WORD *curr_type; char bufA[256]; WCHAR bufW[256]; int charcount; int ret; int i;
+ if(!mbcinfo) + mbcinfo = get_mbcinfo(); + switch (cp) { case _MB_CP_ANSI: @@ -222,8 +222,8 @@ int CDECL _setmbcp(int cp) break; }
- sprintf(buf, format, newcp); - mbcinfo->mblcid = MSVCRT_locale_to_LCID(buf); + sprintf(bufA, format, newcp); + mbcinfo->mblcid = MSVCRT_locale_to_LCID(bufA); if(mbcinfo->mblcid == -1) { WARN("Can't assign LCID to codepage (%d)\n", mbcinfo->mblcid); @@ -290,16 +290,37 @@ int CDECL _setmbcp(int cp)
GetStringTypeW(CT_CTYPE1, bufW, charcount, chartypes);
- curr_type = chartypes; + charcount = 0; for (i = 0; i < 256; i++) if (!(mbcinfo->mbctype[i + 1] & _M1)) { - if ((*curr_type) & C1_UPPER) - mbcinfo->mbctype[i + 1] |= _SBUP; - if ((*curr_type) & C1_LOWER) - mbcinfo->mbctype[i + 1] |= _SBLOW; - curr_type++; + if (chartypes[charcount] & C1_UPPER) + { + mbcinfo->mbctype[i + 1] |= _SBUP; + bufW[charcount] = tolowerW(bufW[charcount]); + } + else if (chartypes[charcount] & C1_LOWER) + { + mbcinfo->mbctype[i + 1] |= _SBLOW; + bufW[charcount] = toupperW(bufW[charcount]); + } + charcount++; + } + + ret = WideCharToMultiByte(newcp, 0, bufW, charcount, bufA, charcount, NULL, NULL); + if (ret != charcount) + ERR("WideCharToMultiByte failed for cp %d, ret=%d (exp %d), error=%d\n", newcp, ret, charcount, GetLastError()); + + charcount = 0; + for (i = 0; i < 256; i++) + { + if(!(mbcinfo->mbctype[i + 1] & _M1)) + { + if(mbcinfo->mbctype[i] & (C1_UPPER|C1_LOWER)) + mbcinfo->mbcasemap[i] = bufA[charcount]; + charcount++; } + }
if (newcp == 932) /* CP932 only - set _MP and _MS */ { @@ -315,13 +336,21 @@ int CDECL _setmbcp(int cp) }
mbcinfo->mbcodepage = newcp; - if(mbcinfo == MSVCRT_locale->mbcinfo) + if(MSVCRT_locale && mbcinfo == MSVCRT_locale->mbcinfo) memcpy(MSVCRT_mbctype, MSVCRT_locale->mbcinfo->mbctype, sizeof(MSVCRT_mbctype));
return 0; }
/********************************************************************* + * _setmbcp (MSVCRT.@) + */ +int CDECL _setmbcp(int cp) +{ + return _setmbcp_l(cp, NULL); +} + +/********************************************************************* * _getmbcp (MSVCRT.@) */ int CDECL _getmbcp(void) diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 65e00a1..14bf972 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -888,6 +888,7 @@ MSVCRT_pthreadmbcinfo get_mbcinfo(void); void __cdecl MSVCRT__free_locale(MSVCRT__locale_t); void free_locinfo(MSVCRT_pthreadlocinfo); void free_mbcinfo(MSVCRT_pthreadmbcinfo); +int _setmbcp_l(int, MSVCRT_pthreadmbcinfo);
#ifndef __WINE_MSVCRT_TEST int __cdecl MSVCRT__write(int,const void*,unsigned int);