]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/libc++/src/support/win32/support.cpp
Merged libcxxrt and libc++. Now available for testing on 9-stable with
[FreeBSD/stable/9.git] / contrib / libc++ / src / support / win32 / support.cpp
1 // -*- C++ -*-
2 //===----------------------- support/win32/support.h ----------------------===//
3 //
4 //                     The LLVM Compiler Infrastructure
5 //
6 // This file is dual licensed under the MIT and the University of Illinois Open
7 // Source Licenses. See LICENSE.TXT for details.
8 //
9 //===----------------------------------------------------------------------===//
10
11 #include <support/win32/support.h>
12 #include <stdarg.h> // va_start, va_end
13 #include <stddef.h> // size_t
14 #include <stdlib.h> // malloc
15 #include <stdio.h>  // vsprintf, vsnprintf
16 #include <string.h> // strcpy, wcsncpy
17
18 int asprintf(char **sptr, const char *__restrict fmt, ...)
19 {
20     va_list ap;
21     va_start(ap, fmt);
22     int result = vasprintf(sptr, fmt, ap);
23     va_end(ap);
24     return result;
25 }
26 int vasprintf( char **sptr, const char *__restrict fmt, va_list ap )
27 {
28     *sptr = NULL;
29     int count = vsnprintf( *sptr, 0, fmt, ap );
30     if( (count >= 0) && ((*sptr = (char*)malloc(count+1)) != NULL) )
31     {
32         vsprintf( *sptr, fmt, ap );
33         sptr[count] = '\0';
34     }
35
36     return count;
37 }
38
39 // FIXME: use wcrtomb and avoid copy
40 // use mbsrtowcs which is available, first copy first nwc elements of src
41 size_t mbsnrtowcs( wchar_t *__restrict dst, const char **__restrict src,
42                    size_t nmc, size_t len, mbstate_t *__restrict ps )
43 {
44     char* local_src = new char[nmc+1];
45     char* nmcsrc = local_src;
46     strncpy( nmcsrc, *src, nmc );
47     nmcsrc[nmc] = '\0';
48     const size_t result = mbsrtowcs( dst, const_cast<const char **>(&nmcsrc), len, ps );
49     // propagate error
50     if( nmcsrc == NULL )
51         *src = NULL;
52     delete[] local_src;
53     return result;
54 }
55 // FIXME: use wcrtomb and avoid copy
56 // use wcsrtombs which is available, first copy first nwc elements of src
57 size_t wcsnrtombs( char *__restrict dst, const wchar_t **__restrict src,
58                    size_t nwc, size_t len, mbstate_t *__restrict ps )
59 {
60     wchar_t* local_src = new wchar_t[nwc];
61     wchar_t* nwcsrc = local_src;
62     wcsncpy(nwcsrc, *src, nwc);
63     nwcsrc[nwc] = '\0';
64     const size_t result = wcsrtombs( dst, const_cast<const wchar_t **>(&nwcsrc), len, ps );
65     // propogate error
66     if( nwcsrc == NULL )
67         *src = NULL;
68     delete[] nwcsrc;
69     return result;
70 }