1// -*- C++ -*- 2//===-------------------- support/win32/locale_win32.cpp ------------------===// 3// 4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5// See https://llvm.org/LICENSE.txt for license information. 6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7// 8//===----------------------------------------------------------------------===// 9 10#include <locale> 11#include <cstdarg> // va_start, va_end 12#include <memory> 13#include <type_traits> 14 15int __libcpp_vasprintf(char **sptr, const char *__restrict fmt, va_list ap); 16 17using std::__libcpp_locale_guard; 18 19// FIXME: base currently unused. Needs manual work to construct the new locale 20locale_t newlocale( int mask, const char * locale, locale_t /*base*/ ) 21{ 22 return {_create_locale( LC_ALL, locale ), locale}; 23} 24 25decltype(MB_CUR_MAX) MB_CUR_MAX_L( locale_t __l ) 26{ 27#if defined(_LIBCPP_MSVCRT) 28 return ___mb_cur_max_l_func(__l); 29#else 30 __libcpp_locale_guard __current(__l); 31 return MB_CUR_MAX; 32#endif 33} 34 35 36lconv *localeconv_l( locale_t loc ) 37{ 38 __libcpp_locale_guard __current(loc); 39 return localeconv(); 40} 41size_t mbrlen_l( const char *__restrict s, size_t n, 42 mbstate_t *__restrict ps, locale_t loc ) 43{ 44 __libcpp_locale_guard __current(loc); 45 return mbrlen( s, n, ps ); 46} 47size_t mbsrtowcs_l( wchar_t *__restrict dst, const char **__restrict src, 48 size_t len, mbstate_t *__restrict ps, locale_t loc ) 49{ 50 __libcpp_locale_guard __current(loc); 51 return mbsrtowcs( dst, src, len, ps ); 52} 53size_t wcrtomb_l( char *__restrict s, wchar_t wc, mbstate_t *__restrict ps, 54 locale_t loc ) 55{ 56 __libcpp_locale_guard __current(loc); 57 return wcrtomb( s, wc, ps ); 58} 59size_t mbrtowc_l( wchar_t *__restrict pwc, const char *__restrict s, 60 size_t n, mbstate_t *__restrict ps, locale_t loc ) 61{ 62 __libcpp_locale_guard __current(loc); 63 return mbrtowc( pwc, s, n, ps ); 64} 65size_t mbsnrtowcs_l( wchar_t *__restrict dst, const char **__restrict src, 66 size_t nms, size_t len, mbstate_t *__restrict ps, locale_t loc ) 67{ 68 __libcpp_locale_guard __current(loc); 69 return mbsnrtowcs( dst, src, nms, len, ps ); 70} 71size_t wcsnrtombs_l( char *__restrict dst, const wchar_t **__restrict src, 72 size_t nwc, size_t len, mbstate_t *__restrict ps, locale_t loc ) 73{ 74 __libcpp_locale_guard __current(loc); 75 return wcsnrtombs( dst, src, nwc, len, ps ); 76} 77wint_t btowc_l( int c, locale_t loc ) 78{ 79 __libcpp_locale_guard __current(loc); 80 return btowc( c ); 81} 82int wctob_l( wint_t c, locale_t loc ) 83{ 84 __libcpp_locale_guard __current(loc); 85 return wctob( c ); 86} 87 88int snprintf_l(char *ret, size_t n, locale_t loc, const char *format, ...) 89{ 90 va_list ap; 91 va_start( ap, format ); 92#if defined(_LIBCPP_MSVCRT) 93 // FIXME: Remove usage of internal CRT function and globals. 94 int result = __stdio_common_vsprintf( 95 _CRT_INTERNAL_LOCAL_PRINTF_OPTIONS | _CRT_INTERNAL_PRINTF_STANDARD_SNPRINTF_BEHAVIOR, 96 ret, n, format, loc, ap); 97#else 98 __libcpp_locale_guard __current(loc); 99 int result = vsnprintf( ret, n, format, ap ); 100#endif 101 va_end(ap); 102 return result; 103} 104 105int asprintf_l( char **ret, locale_t loc, const char *format, ... ) 106{ 107 va_list ap; 108 va_start( ap, format ); 109 int result = vasprintf_l( ret, loc, format, ap ); 110 va_end(ap); 111 return result; 112} 113int vasprintf_l( char **ret, locale_t loc, const char *format, va_list ap ) 114{ 115 __libcpp_locale_guard __current(loc); 116 return __libcpp_vasprintf( ret, format, ap ); 117} 118 119#if !defined(_LIBCPP_MSVCRT) 120float strtof_l(const char* nptr, char** endptr, locale_t loc) { 121 __libcpp_locale_guard __current(loc); 122 return strtof(nptr, endptr); 123} 124 125long double strtold_l(const char* nptr, char** endptr, locale_t loc) { 126 __libcpp_locale_guard __current(loc); 127 return strtold(nptr, endptr); 128} 129#endif 130