diff options
author | 2018-09-11 18:18:58 +0000 | |
---|---|---|
committer | 2018-09-11 18:18:58 +0000 | |
commit | 820e1f31efc1d6ed04795ba2e79f3044e1907492 (patch) | |
tree | 815cebb3734784074b661935c33f00bd5eb4d862 /lib/libcxx/src/support/win32/locale_win32.cpp | |
parent | Nuke unused LIST() ieee80211com_head. (diff) | |
download | wireguard-openbsd-820e1f31efc1d6ed04795ba2e79f3044e1907492.tar.xz wireguard-openbsd-820e1f31efc1d6ed04795ba2e79f3044e1907492.zip |
import of libc++ 6.0.0
Diffstat (limited to 'lib/libcxx/src/support/win32/locale_win32.cpp')
-rw-r--r-- | lib/libcxx/src/support/win32/locale_win32.cpp | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/lib/libcxx/src/support/win32/locale_win32.cpp b/lib/libcxx/src/support/win32/locale_win32.cpp index 5a43743470d..fdca7efff06 100644 --- a/lib/libcxx/src/support/win32/locale_win32.cpp +++ b/lib/libcxx/src/support/win32/locale_win32.cpp @@ -10,79 +10,83 @@ #include <locale> #include <cstdarg> // va_start, va_end +#include <memory> +#include <type_traits> + +using std::__libcpp_locale_guard; // FIXME: base currently unused. Needs manual work to construct the new locale locale_t newlocale( int mask, const char * locale, locale_t /*base*/ ) { - return _create_locale( mask, locale ); + return {_create_locale( LC_ALL, locale ), locale}; } -locale_t uselocale( locale_t newloc ) + +decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l ) { - locale_t old_locale = _get_current_locale(); - if ( newloc == NULL ) - return old_locale; - // uselocale sets the thread's locale by definition, so unconditionally use thread-local locale - _configthreadlocale( _ENABLE_PER_THREAD_LOCALE ); - // uselocale sets all categories - setlocale( LC_ALL, newloc->locinfo->lc_category[LC_ALL].locale ); - // uselocale returns the old locale_t - return old_locale; +#if defined(_LIBCPP_MSVCRT) + return ___mb_cur_max_l_func(__l); +#else + __libcpp_locale_guard __current(__l); + return MB_CUR_MAX; +#endif } + + lconv *localeconv_l( locale_t loc ) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); return localeconv(); } size_t mbrlen_l( const char *__restrict s, size_t n, mbstate_t *__restrict ps, locale_t loc ) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); return mbrlen( s, n, ps ); } size_t mbsrtowcs_l( wchar_t *__restrict dst, const char **__restrict src, size_t len, mbstate_t *__restrict ps, locale_t loc ) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); return mbsrtowcs( dst, src, len, ps ); } size_t wcrtomb_l( char *__restrict s, wchar_t wc, mbstate_t *__restrict ps, locale_t loc ) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); return wcrtomb( s, wc, ps ); } size_t mbrtowc_l( wchar_t *__restrict pwc, const char *__restrict s, size_t n, mbstate_t *__restrict ps, locale_t loc ) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); return mbrtowc( pwc, s, n, ps ); } size_t mbsnrtowcs_l( wchar_t *__restrict dst, const char **__restrict src, size_t nms, size_t len, mbstate_t *__restrict ps, locale_t loc ) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); return mbsnrtowcs( dst, src, nms, len, ps ); } size_t wcsnrtombs_l( char *__restrict dst, const wchar_t **__restrict src, size_t nwc, size_t len, mbstate_t *__restrict ps, locale_t loc ) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); return wcsnrtombs( dst, src, nwc, len, ps ); } wint_t btowc_l( int c, locale_t loc ) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); return btowc( c ); } int wctob_l( wint_t c, locale_t loc ) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); return wctob( c ); } int snprintf_l(char *ret, size_t n, locale_t loc, const char *format, ...) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); va_list ap; va_start( ap, format ); int result = vsnprintf( ret, n, format, ap ); @@ -100,6 +104,18 @@ int asprintf_l( char **ret, locale_t loc, const char *format, ... ) } int vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap ) { - __locale_raii __current( uselocale(loc), uselocale ); + __libcpp_locale_guard __current(loc); return vasprintf( ret, format, ap ); } + +#if !defined(_LIBCPP_MSVCRT) +float strtof_l(const char* nptr, char** endptr, locale_t loc) { + __libcpp_locale_guard __current(loc); + return strtof(nptr, endptr); +} + +long double strtold_l(const char* nptr, char** endptr, locale_t loc) { + __libcpp_locale_guard __current(loc); + return strtold(nptr, endptr); +} +#endif |