146035553Spatrick // -*- C++ -*-
2*4bdff4beSrobert //===----------------------------------------------------------------------===//
346035553Spatrick //
446035553Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick // See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick //
846035553Spatrick //===----------------------------------------------------------------------===//
946035553Spatrick // The BSDs have lots of *_l functions.  This file provides reimplementations
1046035553Spatrick // of those functions for non-BSD platforms.
1146035553Spatrick //===----------------------------------------------------------------------===//
1246035553Spatrick 
13*4bdff4beSrobert #ifndef _LIBCPP___BSD_LOCALE_FALLBACKS_H
14*4bdff4beSrobert #define _LIBCPP___BSD_LOCALE_FALLBACKS_H
1546035553Spatrick 
1676d0caaeSpatrick #include <stdarg.h>
1776d0caaeSpatrick #include <stdlib.h>
1846035553Spatrick 
1946035553Spatrick #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
2046035553Spatrick #  pragma GCC system_header
2146035553Spatrick #endif
2246035553Spatrick 
2346035553Spatrick _LIBCPP_BEGIN_NAMESPACE_STD
2446035553Spatrick 
2546035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
decltype(MB_CUR_MAX)2646035553Spatrick decltype(MB_CUR_MAX) __libcpp_mb_cur_max_l(locale_t __l)
2746035553Spatrick {
2846035553Spatrick     __libcpp_locale_guard __current(__l);
2946035553Spatrick     return MB_CUR_MAX;
3046035553Spatrick }
3146035553Spatrick 
32*4bdff4beSrobert #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
3346035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
__libcpp_btowc_l(int __c,locale_t __l)3446035553Spatrick wint_t __libcpp_btowc_l(int __c, locale_t __l)
3546035553Spatrick {
3646035553Spatrick     __libcpp_locale_guard __current(__l);
3746035553Spatrick     return btowc(__c);
3846035553Spatrick }
3946035553Spatrick 
4046035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
__libcpp_wctob_l(wint_t __c,locale_t __l)4146035553Spatrick int __libcpp_wctob_l(wint_t __c, locale_t __l)
4246035553Spatrick {
4346035553Spatrick     __libcpp_locale_guard __current(__l);
4446035553Spatrick     return wctob(__c);
4546035553Spatrick }
4646035553Spatrick 
4746035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
__libcpp_wcsnrtombs_l(char * __dest,const wchar_t ** __src,size_t __nwc,size_t __len,mbstate_t * __ps,locale_t __l)4846035553Spatrick size_t __libcpp_wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc,
4946035553Spatrick                          size_t __len, mbstate_t *__ps, locale_t __l)
5046035553Spatrick {
5146035553Spatrick     __libcpp_locale_guard __current(__l);
5246035553Spatrick     return wcsnrtombs(__dest, __src, __nwc, __len, __ps);
5346035553Spatrick }
5446035553Spatrick 
5546035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
__libcpp_wcrtomb_l(char * __s,wchar_t __wc,mbstate_t * __ps,locale_t __l)5646035553Spatrick size_t __libcpp_wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l)
5746035553Spatrick {
5846035553Spatrick     __libcpp_locale_guard __current(__l);
5946035553Spatrick     return wcrtomb(__s, __wc, __ps);
6046035553Spatrick }
6146035553Spatrick 
6246035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
__libcpp_mbsnrtowcs_l(wchar_t * __dest,const char ** __src,size_t __nms,size_t __len,mbstate_t * __ps,locale_t __l)6346035553Spatrick size_t __libcpp_mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms,
6446035553Spatrick                       size_t __len, mbstate_t *__ps, locale_t __l)
6546035553Spatrick {
6646035553Spatrick     __libcpp_locale_guard __current(__l);
6746035553Spatrick     return mbsnrtowcs(__dest, __src, __nms, __len, __ps);
6846035553Spatrick }
6946035553Spatrick 
7046035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
__libcpp_mbrtowc_l(wchar_t * __pwc,const char * __s,size_t __n,mbstate_t * __ps,locale_t __l)7146035553Spatrick size_t __libcpp_mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n,
7246035553Spatrick                    mbstate_t *__ps, locale_t __l)
7346035553Spatrick {
7446035553Spatrick     __libcpp_locale_guard __current(__l);
7546035553Spatrick     return mbrtowc(__pwc, __s, __n, __ps);
7646035553Spatrick }
7746035553Spatrick 
7846035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
__libcpp_mbtowc_l(wchar_t * __pwc,const char * __pmb,size_t __max,locale_t __l)7946035553Spatrick int __libcpp_mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l)
8046035553Spatrick {
8146035553Spatrick     __libcpp_locale_guard __current(__l);
8246035553Spatrick     return mbtowc(__pwc, __pmb, __max);
8346035553Spatrick }
8446035553Spatrick 
8546035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
__libcpp_mbrlen_l(const char * __s,size_t __n,mbstate_t * __ps,locale_t __l)8646035553Spatrick size_t __libcpp_mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l)
8746035553Spatrick {
8846035553Spatrick     __libcpp_locale_guard __current(__l);
8946035553Spatrick     return mbrlen(__s, __n, __ps);
9046035553Spatrick }
91*4bdff4beSrobert #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
9246035553Spatrick 
9346035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
__libcpp_localeconv_l(locale_t __l)9446035553Spatrick lconv *__libcpp_localeconv_l(locale_t __l)
9546035553Spatrick {
9646035553Spatrick     __libcpp_locale_guard __current(__l);
9746035553Spatrick     return localeconv();
9846035553Spatrick }
9946035553Spatrick 
100*4bdff4beSrobert #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
10146035553Spatrick inline _LIBCPP_INLINE_VISIBILITY
__libcpp_mbsrtowcs_l(wchar_t * __dest,const char ** __src,size_t __len,mbstate_t * __ps,locale_t __l)10246035553Spatrick size_t __libcpp_mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,
10346035553Spatrick                      mbstate_t *__ps, locale_t __l)
10446035553Spatrick {
10546035553Spatrick     __libcpp_locale_guard __current(__l);
10646035553Spatrick     return mbsrtowcs(__dest, __src, __len, __ps);
10746035553Spatrick }
108*4bdff4beSrobert #endif
10946035553Spatrick 
110*4bdff4beSrobert inline _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 4, 5)
__libcpp_snprintf_l(char * __s,size_t __n,locale_t __l,const char * __format,...)11146035553Spatrick int __libcpp_snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) {
11246035553Spatrick     va_list __va;
11346035553Spatrick     va_start(__va, __format);
11446035553Spatrick     __libcpp_locale_guard __current(__l);
11546035553Spatrick     int __res = vsnprintf(__s, __n, __format, __va);
11646035553Spatrick     va_end(__va);
11746035553Spatrick     return __res;
11846035553Spatrick }
11946035553Spatrick 
120*4bdff4beSrobert inline _LIBCPP_ATTRIBUTE_FORMAT(__printf__, 3, 4)
__libcpp_asprintf_l(char ** __s,locale_t __l,const char * __format,...)12146035553Spatrick int __libcpp_asprintf_l(char **__s, locale_t __l, const char *__format, ...) {
12246035553Spatrick     va_list __va;
12346035553Spatrick     va_start(__va, __format);
12446035553Spatrick     __libcpp_locale_guard __current(__l);
12546035553Spatrick     int __res = vasprintf(__s, __format, __va);
12646035553Spatrick     va_end(__va);
12746035553Spatrick     return __res;
12846035553Spatrick }
12946035553Spatrick 
130*4bdff4beSrobert inline _LIBCPP_ATTRIBUTE_FORMAT(__scanf__, 3, 4)
__libcpp_sscanf_l(const char * __s,locale_t __l,const char * __format,...)13146035553Spatrick int __libcpp_sscanf_l(const char *__s, locale_t __l, const char *__format, ...) {
13246035553Spatrick     va_list __va;
13346035553Spatrick     va_start(__va, __format);
13446035553Spatrick     __libcpp_locale_guard __current(__l);
13546035553Spatrick     int __res = vsscanf(__s, __format, __va);
13646035553Spatrick     va_end(__va);
13746035553Spatrick     return __res;
13846035553Spatrick }
13946035553Spatrick 
14046035553Spatrick _LIBCPP_END_NAMESPACE_STD
14146035553Spatrick 
142*4bdff4beSrobert #endif // _LIBCPP___BSD_LOCALE_FALLBACKS_H
143