Module: wine Branch: master Commit: 99579ca42acfe425ab6bae421d103762386b5da3 URL: http://source.winehq.org/git/wine.git/?a=commit;h=99579ca42acfe425ab6bae421d...
Author: Piotr Caban piotr@codeweavers.com Date: Wed Oct 12 11:56:13 2011 +0200
msvcrt: Added _mbtowc_l implementation.
---
dlls/msvcrt/mbcs.c | 57 ++++++++++++++++++++++++++++------------------ dlls/msvcrt/msvcrt.h | 1 + dlls/msvcrt/msvcrt.spec | 2 +- 3 files changed, 37 insertions(+), 23 deletions(-)
diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index 87c482c..96cea86 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1009,28 +1009,6 @@ unsigned char* CDECL _mbstok(unsigned char *str, const unsigned char *delim) }
/********************************************************************* - * mbtowc(MSVCRT.@) - */ -int CDECL MSVCRT_mbtowc(MSVCRT_wchar_t *dst, const char* str, MSVCRT_size_t n) -{ - /* temp var needed because MultiByteToWideChar wants non NULL destination */ - MSVCRT_wchar_t tmpdst = '\0'; - - if(n <= 0 || !str) - return 0; - if(!MultiByteToWideChar(CP_ACP, 0, str, n, &tmpdst, 1)) - return -1; - if(dst) - *dst = tmpdst; - /* return the number of bytes from src that have been used */ - if(!*str) - return 0; - if(n >= 2 && MSVCRT_isleadbyte(*str) && str[1]) - return 2; - return 1; -} - -/********************************************************************* * _mbbtombc(MSVCRT.@) */ unsigned int CDECL _mbbtombc(unsigned int c) @@ -1869,6 +1847,41 @@ MSVCRT_size_t CDECL _mbstrlen(const char* str) }
/********************************************************************* + * _mbtowc_l(MSVCRT.@) + */ +int CDECL MSVCRT_mbtowc_l(MSVCRT_wchar_t *dst, const char* str, MSVCRT_size_t n, MSVCRT__locale_t locale) +{ + MSVCRT_pthreadlocinfo locinfo; + MSVCRT_wchar_t tmpdst = '\0'; + + if(!locale) + locinfo = get_locinfo(); + else + locinfo = locale->locinfo; + + if(n <= 0 || !str) + return 0; + if(!MultiByteToWideChar(locinfo->lc_codepage, 0, str, n, &tmpdst, 1)) + return -1; + if(dst) + *dst = tmpdst; + /* return the number of bytes from src that have been used */ + if(!*str) + return 0; + if(n >= 2 && MSVCRT__isleadbyte_l(*str, locale) && str[1]) + return 2; + return 1; +} + +/********************************************************************* + * mbtowc(MSVCRT.@) + */ +int CDECL MSVCRT_mbtowc(MSVCRT_wchar_t *dst, const char* str, MSVCRT_size_t n) +{ + return MSVCRT_mbtowc_l(dst, str, n, NULL); +} + +/********************************************************************* * _mbstowcs_l(MSVCRT.@) */ MSVCRT_size_t CDECL MSVCRT__mbstowcs_l(MSVCRT_wchar_t *wcstr, const char *mbstr, diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 29a3520..65e00a1 100644 --- a/dlls/msvcrt/msvcrt.h +++ b/dlls/msvcrt/msvcrt.h @@ -850,6 +850,7 @@ int __cdecl MSVCRT_iswalpha(MSVCRT_wint_t); int __cdecl MSVCRT_iswspace(MSVCRT_wint_t); int __cdecl MSVCRT_iswdigit(MSVCRT_wint_t); int __cdecl MSVCRT_isleadbyte(int); +int __cdecl MSVCRT__isleadbyte_l(int, MSVCRT__locale_t);
void __cdecl MSVCRT__lock_file(MSVCRT_FILE*); void __cdecl MSVCRT__unlock_file(MSVCRT_FILE*); diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index fe07099..c8c710d 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -792,7 +792,7 @@ # stub _mbsupr_l(str ptr) @ cdecl _mbsupr_s(str long) # stub _mbsupr_s_l(str long ptr) -# stub _mbtowc_l(ptr str long ptr) +@ cdecl _mbtowc_l(ptr str long ptr) MSVCRT_mbtowc_l @ cdecl _memccpy(ptr ptr long long) ntdll._memccpy @ cdecl _memicmp(str str long) ntdll._memicmp # stub _memicmp_l(str str long ptr)