Author: pschweitzer Date: Sun Oct 25 08:36:14 2015 New Revision: 69682
URL: http://svn.reactos.org/svn/reactos?rev=69682&view=rev Log: [CRT] Import _mbstowcs_l() from Wine and call it in mbstowcs().
This fixes crashes when calling the msvcrt, crtdll implementation of mbstowcs() with no output string. Thus, it fixes a few crashing apitests
The NTDLL version is still broken in some way, need to investigate why.
CORE-10390 #resolve #comment Fixed with 69682. Thanks for the report!
Modified: trunk/reactos/lib/sdk/crt/stdlib/mbstowcs.c
Modified: trunk/reactos/lib/sdk/crt/stdlib/mbstowcs.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/lib/sdk/crt/stdlib/mbstowcs... ============================================================================== --- trunk/reactos/lib/sdk/crt/stdlib/mbstowcs.c [iso-8859-1] (original) +++ trunk/reactos/lib/sdk/crt/stdlib/mbstowcs.c [iso-8859-1] Sun Oct 25 08:36:14 2015 @@ -1,28 +1,43 @@ #include <precomp.h>
+/********************************************************************* + * _mbstowcs_l + */ +size_t CDECL _mbstowcs_l(wchar_t *wcstr, const char *mbstr, + size_t count, _locale_t locale) +{ + MSVCRT_pthreadlocinfo locinfo; + size_t i, size; + + if(!locale) + locinfo = get_locinfo(); + else + locinfo = ((MSVCRT__locale_t)locale)->locinfo; + + /* Ignore count parameter */ + if(!wcstr) + return MultiByteToWideChar(locinfo->lc_codepage, 0, mbstr, -1, NULL, 0)-1; + + for(i=0, size=0; i<count; i++) { + if(mbstr[size] == '\0') + break; + + size += (_isleadbyte_l((unsigned char)mbstr[size], locale) ? 2 : 1); + } + + size = MultiByteToWideChar(locinfo->lc_codepage, 0, + mbstr, size, wcstr, count); + + if(size<count && wcstr) + wcstr[size] = '\0'; + + return size; +}
/* * @implemented */ size_t mbstowcs (wchar_t *widechar, const char *multibyte, size_t number) { - int bytes; - size_t n = 0; - - while (n < number) { - - if ((bytes = mbtowc (widechar, multibyte, MB_LEN_MAX)) < 0) - return (size_t) -1; - - if (bytes == 0) { - *widechar = (wchar_t) '\0'; - return n; - } - - widechar++; - multibyte += bytes; - n++; - } - - return n; + return _mbstowcs_l(widechar, multibyte, number, NULL); }