1 //===-----------------------------------------------------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #ifndef _LIBCPP___LOCALE_DIR_SUPPORT_BSD_LIKE_H
10 #define _LIBCPP___LOCALE_DIR_SUPPORT_BSD_LIKE_H
13 #include <__cstddef/size_t.h>
14 #include <__std_mbstate_t.h>
15 #include <__utility/forward.h>
16 #include <clocale> // std::lconv
22 #if _LIBCPP_HAS_WIDE_CHARACTERS
29 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
30 # pragma GCC system_header
33 _LIBCPP_BEGIN_NAMESPACE_STD
39 using __locale_t
= ::locale_t
;
41 inline _LIBCPP_HIDE_FROM_ABI __locale_t
__uselocale(__locale_t __loc
) { return ::uselocale(__loc
); }
43 inline _LIBCPP_HIDE_FROM_ABI __locale_t
__newlocale(int __category_mask
, const char* __locale
, __locale_t __base
) {
44 return ::newlocale(__category_mask
, __locale
, __base
);
47 inline _LIBCPP_HIDE_FROM_ABI
void __freelocale(__locale_t __loc
) { ::freelocale(__loc
); }
49 inline _LIBCPP_HIDE_FROM_ABI lconv
* __localeconv(__locale_t
& __loc
) { return ::localeconv_l(__loc
); }
54 inline _LIBCPP_HIDE_FROM_ABI
float __strtof(const char* __nptr
, char** __endptr
, __locale_t __loc
) {
55 return ::strtof_l(__nptr
, __endptr
, __loc
);
58 inline _LIBCPP_HIDE_FROM_ABI
double __strtod(const char* __nptr
, char** __endptr
, __locale_t __loc
) {
59 return ::strtod_l(__nptr
, __endptr
, __loc
);
62 inline _LIBCPP_HIDE_FROM_ABI
long double __strtold(const char* __nptr
, char** __endptr
, __locale_t __loc
) {
63 return ::strtold_l(__nptr
, __endptr
, __loc
);
66 inline _LIBCPP_HIDE_FROM_ABI
long long __strtoll(const char* __nptr
, char** __endptr
, int __base
, __locale_t __loc
) {
67 return ::strtoll_l(__nptr
, __endptr
, __base
, __loc
);
70 inline _LIBCPP_HIDE_FROM_ABI
unsigned long long
71 __strtoull(const char* __nptr
, char** __endptr
, int __base
, __locale_t __loc
) {
72 return ::strtoull_l(__nptr
, __endptr
, __base
, __loc
);
76 // Character manipulation functions
78 inline _LIBCPP_HIDE_FROM_ABI
int __islower(int __c
, __locale_t __loc
) { return ::islower_l(__c
, __loc
); }
80 inline _LIBCPP_HIDE_FROM_ABI
int __isupper(int __c
, __locale_t __loc
) { return ::isupper_l(__c
, __loc
); }
82 inline _LIBCPP_HIDE_FROM_ABI
int __isdigit(int __c
, __locale_t __loc
) { return ::isdigit_l(__c
, __loc
); }
84 inline _LIBCPP_HIDE_FROM_ABI
int __isxdigit(int __c
, __locale_t __loc
) { return ::isxdigit_l(__c
, __loc
); }
86 inline _LIBCPP_HIDE_FROM_ABI
int __toupper(int __c
, __locale_t __loc
) { return ::toupper_l(__c
, __loc
); }
88 inline _LIBCPP_HIDE_FROM_ABI
int __tolower(int __c
, __locale_t __loc
) { return ::tolower_l(__c
, __loc
); }
90 inline _LIBCPP_HIDE_FROM_ABI
int __strcoll(const char* __s1
, const char* __s2
, __locale_t __loc
) {
91 return ::strcoll_l(__s1
, __s2
, __loc
);
94 inline _LIBCPP_HIDE_FROM_ABI
size_t __strxfrm(char* __dest
, const char* __src
, size_t __n
, __locale_t __loc
) {
95 return ::strxfrm_l(__dest
, __src
, __n
, __loc
);
98 #if _LIBCPP_HAS_WIDE_CHARACTERS
99 inline _LIBCPP_HIDE_FROM_ABI
int __iswspace(wint_t __c
, __locale_t __loc
) { return ::iswspace_l(__c
, __loc
); }
101 inline _LIBCPP_HIDE_FROM_ABI
int __iswprint(wint_t __c
, __locale_t __loc
) { return ::iswprint_l(__c
, __loc
); }
103 inline _LIBCPP_HIDE_FROM_ABI
int __iswcntrl(wint_t __c
, __locale_t __loc
) { return ::iswcntrl_l(__c
, __loc
); }
105 inline _LIBCPP_HIDE_FROM_ABI
int __iswupper(wint_t __c
, __locale_t __loc
) { return ::iswupper_l(__c
, __loc
); }
107 inline _LIBCPP_HIDE_FROM_ABI
int __iswlower(wint_t __c
, __locale_t __loc
) { return ::iswlower_l(__c
, __loc
); }
109 inline _LIBCPP_HIDE_FROM_ABI
int __iswalpha(wint_t __c
, __locale_t __loc
) { return ::iswalpha_l(__c
, __loc
); }
111 inline _LIBCPP_HIDE_FROM_ABI
int __iswblank(wint_t __c
, __locale_t __loc
) { return ::iswblank_l(__c
, __loc
); }
113 inline _LIBCPP_HIDE_FROM_ABI
int __iswdigit(wint_t __c
, __locale_t __loc
) { return ::iswdigit_l(__c
, __loc
); }
115 inline _LIBCPP_HIDE_FROM_ABI
int __iswpunct(wint_t __c
, __locale_t __loc
) { return ::iswpunct_l(__c
, __loc
); }
117 inline _LIBCPP_HIDE_FROM_ABI
int __iswxdigit(wint_t __c
, __locale_t __loc
) { return ::iswxdigit_l(__c
, __loc
); }
119 inline _LIBCPP_HIDE_FROM_ABI
wint_t __towupper(wint_t __c
, __locale_t __loc
) { return ::towupper_l(__c
, __loc
); }
121 inline _LIBCPP_HIDE_FROM_ABI
wint_t __towlower(wint_t __c
, __locale_t __loc
) { return ::towlower_l(__c
, __loc
); }
123 inline _LIBCPP_HIDE_FROM_ABI
int __wcscoll(const wchar_t* __ws1
, const wchar_t* __ws2
, __locale_t __loc
) {
124 return ::wcscoll_l(__ws1
, __ws2
, __loc
);
127 inline _LIBCPP_HIDE_FROM_ABI
size_t __wcsxfrm(wchar_t* __dest
, const wchar_t* __src
, size_t __n
, __locale_t __loc
) {
128 return ::wcsxfrm_l(__dest
, __src
, __n
, __loc
);
130 #endif // _LIBCPP_HAS_WIDE_CHARACTERS
132 inline _LIBCPP_HIDE_FROM_ABI
size_t
133 __strftime(char* __s
, size_t __max
, const char* __format
, const struct tm
* __tm
, __locale_t __loc
) {
134 return ::strftime_l(__s
, __max
, __format
, __tm
, __loc
);
140 inline _LIBCPP_HIDE_FROM_ABI
decltype(MB_CUR_MAX
) __mb_len_max(__locale_t __loc
) { return MB_CUR_MAX_L(__loc
); }
142 #if _LIBCPP_HAS_WIDE_CHARACTERS
143 inline _LIBCPP_HIDE_FROM_ABI
wint_t __btowc(int __c
, __locale_t __loc
) { return ::btowc_l(__c
, __loc
); }
145 inline _LIBCPP_HIDE_FROM_ABI
int __wctob(wint_t __c
, __locale_t __loc
) { return ::wctob_l(__c
, __loc
); }
147 inline _LIBCPP_HIDE_FROM_ABI
size_t
148 __wcsnrtombs(char* __dest
, const wchar_t** __src
, size_t __nwc
, size_t __len
, mbstate_t* __ps
, __locale_t __loc
) {
149 return ::wcsnrtombs_l(__dest
, __src
, __nwc
, __len
, __ps
, __loc
);
152 inline _LIBCPP_HIDE_FROM_ABI
size_t __wcrtomb(char* __s
, wchar_t __wc
, mbstate_t* __ps
, __locale_t __loc
) {
153 return ::wcrtomb_l(__s
, __wc
, __ps
, __loc
);
156 inline _LIBCPP_HIDE_FROM_ABI
size_t
157 __mbsnrtowcs(wchar_t* __dest
, const char** __src
, size_t __nms
, size_t __len
, mbstate_t* __ps
, __locale_t __loc
) {
158 return ::mbsnrtowcs_l(__dest
, __src
, __nms
, __len
, __ps
, __loc
);
161 inline _LIBCPP_HIDE_FROM_ABI
size_t
162 __mbrtowc(wchar_t* __pwc
, const char* __s
, size_t __n
, mbstate_t* __ps
, __locale_t __loc
) {
163 return ::mbrtowc_l(__pwc
, __s
, __n
, __ps
, __loc
);
166 inline _LIBCPP_HIDE_FROM_ABI
int __mbtowc(wchar_t* __pwc
, const char* __pmb
, size_t __max
, __locale_t __loc
) {
167 return ::mbtowc_l(__pwc
, __pmb
, __max
, __loc
);
170 inline _LIBCPP_HIDE_FROM_ABI
size_t __mbrlen(const char* __s
, size_t __n
, mbstate_t* __ps
, __locale_t __loc
) {
171 return ::mbrlen_l(__s
, __n
, __ps
, __loc
);
174 inline _LIBCPP_HIDE_FROM_ABI
size_t
175 __mbsrtowcs(wchar_t* __dest
, const char** __src
, size_t __len
, mbstate_t* __ps
, __locale_t __loc
) {
176 return ::mbsrtowcs_l(__dest
, __src
, __len
, __ps
, __loc
);
180 _LIBCPP_DIAGNOSTIC_PUSH
181 _LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wgcc-compat")
182 _LIBCPP_GCC_DIAGNOSTIC_IGNORED("-Wformat-nonliteral") // GCC doesn't support [[gnu::format]] on variadic templates
183 #ifdef _LIBCPP_COMPILER_CLANG_BASED
184 # define _LIBCPP_VARIADIC_ATTRIBUTE_FORMAT(...) _LIBCPP_ATTRIBUTE_FORMAT(__VA_ARGS__)
186 # define _LIBCPP_VARIADIC_ATTRIBUTE_FORMAT(...) /* nothing */
189 template <class... _Args
>
190 _LIBCPP_HIDE_FROM_ABI
_LIBCPP_VARIADIC_ATTRIBUTE_FORMAT(__printf__
, 4, 5) int __snprintf(
191 char* __s
, size_t __n
, __locale_t __loc
, const char* __format
, _Args
&&... __args
) {
192 return ::snprintf_l(__s
, __n
, __loc
, __format
, std::forward
<_Args
>(__args
)...);
195 template <class... _Args
>
196 _LIBCPP_HIDE_FROM_ABI
_LIBCPP_VARIADIC_ATTRIBUTE_FORMAT(__printf__
, 3, 4) int __asprintf(
197 char** __s
, __locale_t __loc
, const char* __format
, _Args
&&... __args
) {
198 return ::asprintf_l(__s
, __loc
, __format
, std::forward
<_Args
>(__args
)...);
201 template <class... _Args
>
202 _LIBCPP_HIDE_FROM_ABI
_LIBCPP_VARIADIC_ATTRIBUTE_FORMAT(__scanf__
, 3, 4) int __sscanf(
203 const char* __s
, __locale_t __loc
, const char* __format
, _Args
&&... __args
) {
204 return ::sscanf_l(__s
, __loc
, __format
, std::forward
<_Args
>(__args
)...);
206 _LIBCPP_DIAGNOSTIC_POP
207 #undef _LIBCPP_VARIADIC_ATTRIBUTE_FORMAT
209 } // namespace __locale
210 _LIBCPP_END_NAMESPACE_STD
212 #endif // _LIBCPP___LOCALE_DIR_SUPPORT_BSD_LIKE_H