111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// -*- C++ -*-
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===---------------------- __bsd_locale_fallbacks.h ----------------------===//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                     The LLVM Compiler Infrastructure
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details.
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The BSDs have lots of *_l functions.  This file provides reimplementations
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// of those functions for non-BSD platforms.
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifndef _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#define _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <stdlib.h>
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <memory>
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_LIBCPP_BEGIN_NAMESPACE_STD
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef _VSTD::remove_pointer<locale_t>::type __use_locale_struct;
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttypedef _VSTD::unique_ptr<__use_locale_struct, decltype(&uselocale)> __locale_raii;
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertdecltype(MB_CUR_MAX) __libcpp_mb_cur_max_l(locale_t __l)
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return MB_CUR_MAX;
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertwint_t __libcpp_btowc_l(int __c, locale_t __l)
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return btowc(__c);
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint __libcpp_wctob_l(wint_t __c, locale_t __l)
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return wctob(__c);
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertsize_t __libcpp_wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc,
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                         size_t __len, mbstate_t *__ps, locale_t __l)
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return wcsnrtombs(__dest, __src, __nwc, __len, __ps);
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertsize_t __libcpp_wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l)
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return wcrtomb(__s, __wc, __ps);
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertsize_t __libcpp_mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms,
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                      size_t __len, mbstate_t *__ps, locale_t __l)
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return mbsnrtowcs(__dest, __src, __nms, __len, __ps);
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albertsize_t __libcpp_mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n,
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                   mbstate_t *__ps, locale_t __l)
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return mbrtowc(__pwc, __s, __n, __ps);
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint __libcpp_mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l)
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return mbtowc(__pwc, __pmb, __max);
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertsize_t __libcpp_mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l)
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return mbrlen(__s, __n, __ps);
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertlconv *__libcpp_localeconv_l(locale_t __l)
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return localeconv();
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline _LIBCPP_ALWAYS_INLINE
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertsize_t __libcpp_mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                     mbstate_t *__ps, locale_t __l)
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return mbsrtowcs(__dest, __src, __len, __ps);
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint __libcpp_snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) {
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    va_list __va;
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    va_start(__va, __format);
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    int __res = vsnprintf(__s, __n, __format, __va);
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    va_end(__va);
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return __res;
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint __libcpp_asprintf_l(char **__s, locale_t __l, const char *__format, ...) {
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    va_list __va;
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    va_start(__va, __format);
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    int __res = vasprintf(__s, __format, __va);
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    va_end(__va);
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return __res;
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertinline
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint __libcpp_sscanf_l(const char *__s, locale_t __l, const char *__format, ...) {
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    va_list __va;
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    va_start(__va, __format);
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __locale_raii __current( uselocale(__l), uselocale );
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    int __res = vsscanf(__s, __format, __va);
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    va_end(__va);
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    return __res;
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_LIBCPP_END_NAMESPACE_STD
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif // _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
139