Module: wine Branch: master Commit: 7352ee844e98d03561fe31c9cc7b6d9e625b56c6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=7352ee844e98d03561fe31c9cc...
Author: Piotr Caban piotr@codeweavers.com Date: Thu May 6 14:27:45 2010 +0200
msvcrt: Added mbstowcs(_s_l) implementation.
---
dlls/msvcr80/msvcr80.spec | 6 ++-- dlls/msvcr90/msvcr90.spec | 6 ++-- dlls/msvcrt/mbcs.c | 89 +++++++++++++++++++++++++++++++++++++++++++++ dlls/msvcrt/msvcrt.spec | 8 ++-- 4 files changed, 99 insertions(+), 10 deletions(-)
diff --git a/dlls/msvcr80/msvcr80.spec b/dlls/msvcr80/msvcr80.spec index b2a19c4..8b82783 100644 --- a/dlls/msvcr80/msvcr80.spec +++ b/dlls/msvcr80/msvcr80.spec @@ -785,8 +785,8 @@ @ stub _mbstok_l @ stub _mbstok_s @ stub _mbstok_s_l -@ stub _mbstowcs_l -@ stub _mbstowcs_s_l +@ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l +@ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l @ cdecl _mbstrlen(str) msvcrt._mbstrlen @ stub _mbstrlen_l @ stub _mbstrnlen @@ -1330,7 +1330,7 @@ @ stub mbsrtowcs @ stub mbsrtowcs_s @ cdecl mbstowcs(ptr str long) msvcrt.mbstowcs -@ stub mbstowcs_s +@ cdecl mbstowcs_s(ptr ptr long str long) msvcrt.mbstowcs_s @ cdecl mbtowc(wstr str long) msvcrt.mbtowc @ cdecl memchr(ptr long long) msvcrt.memchr @ cdecl memcmp(ptr ptr long) msvcrt.memcmp diff --git a/dlls/msvcr90/msvcr90.spec b/dlls/msvcr90/msvcr90.spec index f41362d..9594535 100644 --- a/dlls/msvcr90/msvcr90.spec +++ b/dlls/msvcr90/msvcr90.spec @@ -773,8 +773,8 @@ @ stub _mbstok_l @ stub _mbstok_s @ stub _mbstok_s_l -@ stub _mbstowcs_l -@ stub _mbstowcs_s_l +@ cdecl _mbstowcs_l(ptr str long ptr) msvcrt._mbstowcs_l +@ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) msvcrt._mbstowcs_s_l @ cdecl _mbstrlen(str) msvcrt._mbstrlen @ stub _mbstrlen_l @ stub _mbstrnlen @@ -1314,7 +1314,7 @@ @ stub mbsrtowcs @ stub mbsrtowcs_s @ cdecl mbstowcs(ptr str long) msvcrt.mbstowcs -@ stub mbstowcs_s +@ cdecl mbstowcs_s(ptr ptr long str long) msvcrt.mbstowcs_s @ cdecl mbtowc(wstr str long) msvcrt.mbtowc @ cdecl memchr(ptr long long) msvcrt.memchr @ cdecl memcmp(ptr ptr long) msvcrt.memcmp diff --git a/dlls/msvcrt/mbcs.c b/dlls/msvcrt/mbcs.c index c562234..837ac02 100644 --- a/dlls/msvcrt/mbcs.c +++ b/dlls/msvcrt/mbcs.c @@ -1718,3 +1718,92 @@ MSVCRT_size_t CDECL _mbstrlen(const char* str) { return _mbstrlen_l(str, NULL); } + +/********************************************************************* + * _mbstowcs_l(MSVCRT.@) + */ +MSVCRT_size_t CDECL MSVCRT__mbstowcs_l(MSVCRT_wchar_t *wcstr, const char *mbstr, + MSVCRT_size_t count, MSVCRT__locale_t locale) +{ + MSVCRT_size_t tmp; + + if(!locale) + locale = get_locale(); + + tmp = _mbstrlen_l(mbstr, locale); + if(tmp>count && wcstr) + tmp = count; + + tmp = MultiByteToWideChar(locale->locinfo->lc_codepage, 0, + mbstr, tmp, wcstr, count); + + if(tmp<count && wcstr) + wcstr[tmp] = '\0'; + + return tmp; +} + +/********************************************************************* + * mbstowcs(MSVCRT.@) + */ +MSVCRT_size_t CDECL MSVCRT_mbstowcs(MSVCRT_wchar_t *wcstr, + const char *mbstr, MSVCRT_size_t count) +{ + return MSVCRT__mbstowcs_l(wcstr, mbstr, count, NULL); +} + +/********************************************************************* + * _mbstowcs_s_l(MSVCRT.@) + */ +int CDECL MSVCRT__mbstowcs_s_l(MSVCRT_size_t *ret, MSVCRT_wchar_t *wcstr, + MSVCRT_size_t size, const char *mbstr, + MSVCRT_size_t count, MSVCRT__locale_t locale) +{ + MSVCRT_size_t conv; + + if(!wcstr && !size) { + conv = MSVCRT__mbstowcs_l(NULL, mbstr, 0, locale); + if(ret) + *ret = conv; + return 0; + } + + if(!mbstr || !wcstr) { + MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); + if(wcstr && size) + wcstr[0] = '\0'; + *MSVCRT__errno() = MSVCRT_EINVAL; + return MSVCRT_EINVAL; + } + + if(count==_TRUNCATE || size<count) + conv = size; + else + conv = count; + + conv = MSVCRT__mbstowcs_l(wcstr, mbstr, conv, locale); + if(conv<size) + wcstr[conv++] = '\0'; + else if(conv==size && (count==_TRUNCATE || wcstr[conv-1]=='\0')) + wcstr[conv-1] = '\0'; + else { + MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); + if(size) + wcstr[0] = '\0'; + *MSVCRT__errno() = MSVCRT_ERANGE; + return MSVCRT_ERANGE; + } + + if(ret) + *ret = conv; + return 0; +} + +/********************************************************************* + * mbstowcs_s(MSVCRT.@) + */ +int CDECL MSVCRT__mbstowcs_s(MSVCRT_size_t *ret, MSVCRT_wchar_t *wcstr, + MSVCRT_size_t size, const char *mbstr, MSVCRT_size_t count) +{ + return MSVCRT__mbstowcs_s_l(ret, wcstr, size, mbstr, count, NULL); +} diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 3437442..8655f6f 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -731,8 +731,8 @@ # stub _mbstok_l # stub _mbstok_s # stub _mbstok_s_l -# stub _mbstowcs_l -# stub _mbstowcs_s_l +@ cdecl _mbstowcs_l(ptr str long ptr) MSVCRT__mbstowcs_l +@ cdecl _mbstowcs_s_l(ptr ptr long str long ptr) MSVCRT__mbstowcs_s_l @ cdecl _mbstrlen(str) @ cdecl _mbstrlen_l(str ptr) # stub _mbstrnlen @@ -1277,8 +1277,8 @@ # stub mbsdup_dbg # stub mbsrtowcs # stub mbsrtowcs_s -@ cdecl mbstowcs(ptr str long) ntdll.mbstowcs -# stub mbstowcs_s +@ cdecl mbstowcs(ptr str long) MSVCRT_mbstowcs +@ cdecl mbstowcs_s(ptr ptr long str long) MSVCRT__mbstowcs_s @ cdecl mbtowc(wstr str long) MSVCRT_mbtowc @ cdecl memchr(ptr long long) ntdll.memchr @ cdecl memcmp(ptr ptr long) ntdll.memcmp