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