From 335c9772ece4964c061526d8178348c6d1f61ac3 Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Thu, 6 May 2010 14:27:57 +0200 Subject: [PATCH] msvcrt: Fixed wcstombs(_s_l) implementation. --- dlls/msvcrt/msvcrt.spec | 4 +- dlls/msvcrt/wcs.c | 109 +++++++++++++++++++++++----------------- 2 files changed, 66 insertions(+), 47 deletions(-) diff --git a/dlls/msvcrt/msvcrt.spec b/dlls/msvcrt/msvcrt.spec index 8655f6f280d..c7d66545b8c 100644 --- a/dlls/msvcrt/msvcrt.spec +++ b/dlls/msvcrt/msvcrt.spec @@ -1040,7 +1040,7 @@ @ cdecl _wcstoi64(wstr ptr long) MSVCRT__wcstoi64 @ cdecl _wcstoi64_l(wstr ptr long ptr) MSVCRT__wcstoi64_l # stub _wcstol_l -# stub _wcstombs_l +@ cdecl _wcstombs_l(ptr ptr long ptr) MSVCRT__wcstombs_l @ cdecl _wcstombs_s_l(ptr ptr long wstr long ptr) MSVCRT__wcstombs_s_l @ cdecl _wcstoui64(wstr ptr long) MSVCRT__wcstoui64 @ cdecl _wcstoui64_l(wstr ptr long ptr) MSVCRT__wcstoui64_l @@ -1417,7 +1417,7 @@ @ cdecl wcstok(wstr wstr) MSVCRT_wcstok # stub wcstok_s @ cdecl wcstol(wstr ptr long) ntdll.wcstol -@ cdecl wcstombs(ptr ptr long) ntdll.wcstombs +@ cdecl wcstombs(ptr ptr long) MSVCRT_wcstombs @ cdecl wcstombs_s(ptr ptr long wstr long) MSVCRT_wcstombs_s @ cdecl wcstoul(wstr ptr long) ntdll.wcstoul @ stub wcsxfrm #(ptr wstr long) MSVCRT_wcsxfrm diff --git a/dlls/msvcrt/wcs.c b/dlls/msvcrt/wcs.c index 5334115bb79..96a25e54430 100644 --- a/dlls/msvcrt/wcs.c +++ b/dlls/msvcrt/wcs.c @@ -227,76 +227,95 @@ double CDECL MSVCRT__wcstod_l(const MSVCRT_wchar_t* str, MSVCRT_wchar_t** end, } /********************************************************************* - * _wcstombs_s_l (MSVCRT.@) + * _wcstombs_l (MSVCRT.@) */ -int CDECL MSVCRT__wcstombs_s_l(MSVCRT_size_t *ret, char *mbstr, - MSVCRT_size_t size, const MSVCRT_wchar_t *wcstr, +MSVCRT_size_t CDECL MSVCRT__wcstombs_l(char *mbstr, const MSVCRT_wchar_t *wcstr, MSVCRT_size_t count, MSVCRT__locale_t locale) { - char default_char = '\0', *p; - int hlp, len; - - if(!size) - return 0; - - if(!mbstr || !wcstr) { - MSVCRT__invalid_parameter(NULL, NULL, NULL, 0, 0); - if(mbstr) - *mbstr = '\0'; - *MSVCRT__errno() = MSVCRT_EINVAL; - return MSVCRT_EINVAL; - } + char default_char = '\0'; + MSVCRT_size_t tmp; + BOOL used_default; if(!locale) locale = get_locale(); - if(size<=count) - len = size; - else if(count==_TRUNCATE) - len = size-1; - else - len = count; + /* FIXME: Use wcslen here */ + tmp = strlenW(wcstr); + if(tmp>count && mbstr) + tmp = count; - p = mbstr; - *ret = 0; - while(1) { - if(!len) - break; + tmp = WideCharToMultiByte(locale->locinfo->lc_codepage, WC_NO_BEST_FIT_CHARS, + wcstr, tmp, mbstr, count, &default_char, &used_default); - if(*wcstr == '\0') { - *p = '\0'; - break; - } + if(used_default) + return -1; - hlp = WideCharToMultiByte(locale->locinfo->lc_codepage, - WC_NO_BEST_FIT_CHARS, wcstr, 1, p, len, &default_char, NULL); - if(!hlp || *p=='\0') - break; + if(tmp