locale_win32.cpp revision 5ec0ff81cecfbc317b2a53894f8bf2da6eb0e8c7
1// -*- C++ -*-
2//===-------------------- support/win32/locale_win32.cpp ------------------===//
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 <locale>
12#include <cstdarg> // va_start, va_end
13
14// FIXME: base currently unused. Needs manual work to construct the new locale
15locale_t newlocale( int mask, const char * locale, locale_t /*base*/ )
16{
17    return _create_locale( mask, locale );
18}
19locale_t uselocale( locale_t newloc )
20{
21    locale_t old_locale = _get_current_locale();
22    if ( newloc == NULL )
23        return old_locale;
24    // uselocale sets the thread's locale by definition, so unconditionally use thread-local locale
25    _configthreadlocale( _ENABLE_PER_THREAD_LOCALE );
26    // uselocale sets all categories
27    setlocale( LC_ALL, newloc->locinfo->lc_category[LC_ALL].locale );
28    // uselocale returns the old locale_t
29    return old_locale;
30}
31lconv *localeconv_l( locale_t loc )
32{
33    __locale_raii __current( uselocale(loc), uselocale );
34    return localeconv();
35}
36size_t mbrlen_l( const char *__restrict s, size_t n,
37                 mbstate_t *__restrict ps, locale_t loc )
38{
39    __locale_raii __current( uselocale(loc), uselocale );
40    return mbrlen( s, n, ps );
41}
42size_t mbsrtowcs_l( wchar_t *__restrict dst, const char **__restrict src,
43                    size_t len, mbstate_t *__restrict ps, locale_t loc )
44{
45    __locale_raii __current( uselocale(loc), uselocale );
46    return mbsrtowcs( dst, src, len, ps );
47}
48size_t wcrtomb_l( char *__restrict s, wchar_t wc, mbstate_t *__restrict ps,
49                  locale_t loc )
50{
51    __locale_raii __current( uselocale(loc), uselocale );
52    return wcrtomb( s, wc, ps );
53}
54size_t mbrtowc_l( wchar_t *__restrict pwc, const char *__restrict s,
55                  size_t n, mbstate_t *__restrict ps, locale_t loc )
56{
57    __locale_raii __current( uselocale(loc), uselocale );
58    return mbrtowc( pwc, s, n, ps );
59}
60size_t mbsnrtowcs_l( wchar_t *__restrict dst, const char **__restrict src,
61                     size_t nms, size_t len, mbstate_t *__restrict ps, locale_t loc )
62{
63    __locale_raii __current( uselocale(loc), uselocale );
64    return mbsnrtowcs( dst, src, nms, len, ps );
65}
66size_t wcsnrtombs_l( char *__restrict dst, const wchar_t **__restrict src,
67                     size_t nwc, size_t len, mbstate_t *__restrict ps, locale_t loc )
68{
69    __locale_raii __current( uselocale(loc), uselocale );
70    return wcsnrtombs( dst, src, nwc, len, ps );
71}
72wint_t btowc_l( int c, locale_t loc )
73{
74    __locale_raii __current( uselocale(loc), uselocale );
75    return btowc( c );
76}
77int wctob_l( wint_t c, locale_t loc )
78{
79    __locale_raii __current( uselocale(loc), uselocale );
80    return wctob( c );
81}
82
83int asprintf_l( char **ret, locale_t loc, const char *format, ... )
84{
85    va_list ap;
86    va_start( ap, format );
87    int result = vasprintf_l( ret, loc, format, ap );
88    va_end(ap);
89    return result;
90}
91int vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap )
92{
93    __locale_raii __current( uselocale(loc), uselocale );
94    return vasprintf( ret, format, ap );
95}
96