diff options
Diffstat (limited to 'libcxx/src/support/win32/support.cpp')
-rw-r--r-- | libcxx/src/support/win32/support.cpp | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/libcxx/src/support/win32/support.cpp b/libcxx/src/support/win32/support.cpp index 7033809bd2a..db80063c690 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 @@ int vasprintf( char **sptr, const char *__restrict__ fmt, va_list ap ) 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; +} |