From 99579ca42acfe425ab6bae421d103762386b5da3 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Wed, 12 Oct 2011 11:56:13 +0200 Subject: [PATCH] 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 87c482c5360..96cea86eb7f 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1008,28 +1008,6 @@ unsigned char* CDECL _mbstok(unsigned char *str, const unsigned char *delim) return u_strtok(str, delim); /* ASCII CP */ } -/********************************************************************* - * 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.@) */ @@ -1868,6 +1846,41 @@ MSVCRT_size_t CDECL _mbstrlen(const char* str) return _mbstrlen_l(str, NULL); } +/********************************************************************* + * _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.@) */ diff --git a/dlls/msvcrt/msvcrt.h b/dlls/msvcrt/msvcrt.h index 29a3520f694..65e00a1da98 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 fe07099fc02..c8c710deb48 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)