Work on Windows port by Ruben Van Boxem

llvm-svn: 140384
diff --git a/libcxx/src/support/win32/support.cpp b/libcxx/src/support/win32/support.cpp
index 7033809..db80063 100644
--- a/libcxx/src/support/win32/support.cpp
+++ b/libcxx/src/support/win32/support.cpp
@@ -8,11 +8,17 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include <stddef.h> // size_t
+#include <stdlib.h> // malloc
+#include <stdio.h>  // vsprintf, vsnprintf
+#include <string.h> // strcpy, wcsncpy
+#include <wchar.h>  // mbstate_t
+
 int vasprintf( char **sptr, const char *__restrict__ fmt, va_list ap )
 {
-    *sptr = NULL
+    *sptr = NULL;
     int count = vsnprintf( *sptr, 0, fmt, ap );
-    if( (count >= 0) && ((*sptr = malloc(count+1)) != NULL) )
+    if( (count >= 0) && ((*sptr = (char*)malloc(count+1)) != NULL) )
     {
         vsprintf( *sptr, fmt, ap );
         sptr[count] = '\0';
@@ -20,3 +26,36 @@
 
     return count;
 }
+
+// FIXME: use wcrtomb and avoid copy
+// use mbsrtowcs which is available, first copy first nwc elements of src
+size_t mbsnrtowcs( wchar_t *__restrict__ dst, const char **__restrict__ src,
+                   size_t nmc, size_t len, mbstate_t *__restrict__ ps )
+{
+    char* local_src = new char[nmc+1];
+    char* nmcsrc = local_src;
+    strncpy( nmcsrc, *src, nmc );
+    nmcsrc[nmc] = '\0';
+    const size_t result = mbsrtowcs( dst, const_cast<const char **>(&nmcsrc), len, ps );
+    // propagate error
+    if( nmcsrc == NULL )
+        *src = NULL;
+    delete[] local_src;
+    return result;
+}
+// FIXME: use wcrtomb and avoid copy
+// use wcsrtombs which is available, first copy first nwc elements of src
+size_t wcsnrtombs( char *__restrict__ dst, const wchar_t **__restrict__ src,
+                   size_t nwc, size_t len, mbstate_t *__restrict__ ps )
+{
+    wchar_t* local_src = new wchar_t[nwc];
+    wchar_t* nwcsrc = local_src;
+    wcsncpy(nwcsrc, *src, nwc);
+    nwcsrc[nwc] = '\0';
+    const size_t result = wcsrtombs( dst, const_cast<const wchar_t **>(&nwcsrc), len, ps );
+    // propogate error
+    if( nwcsrc == NULL )
+        *src = NULL;
+    delete[] nwcsrc;
+    return result;
+}