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/mbstowc…
==============================================================================
--- 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);
}