blob: 3425ce659b7e5903824b5932d8c0893132ee1114 [file] [log] [blame]
Ben Craigd2f15ba2016-03-09 15:39:39 +00001// -*- C++ -*-
2//===---------------------- __bsd_locale_fallbacks.h ----------------------===//
3//
4// The LLVM Compiler Infrastructure
5//
6// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
8//
9//===----------------------------------------------------------------------===//
10// The BSDs have lots of *_l functions. This file provides reimplementations
11// of those functions for non-BSD platforms.
12//===----------------------------------------------------------------------===//
13
14#ifndef _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
15#define _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
16
17#include <stdlib.h>
18#include <memory>
19
20_LIBCPP_BEGIN_NAMESPACE_STD
21
Ben Craigd2f15ba2016-03-09 15:39:39 +000022inline _LIBCPP_ALWAYS_INLINE
23decltype(MB_CUR_MAX) __libcpp_mb_cur_max_l(locale_t __l)
24{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000025 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +000026 return MB_CUR_MAX;
27}
28
29inline _LIBCPP_ALWAYS_INLINE
30wint_t __libcpp_btowc_l(int __c, locale_t __l)
31{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000032 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +000033 return btowc(__c);
34}
35
36inline _LIBCPP_ALWAYS_INLINE
37int __libcpp_wctob_l(wint_t __c, locale_t __l)
38{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000039 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +000040 return wctob(__c);
41}
42
43inline _LIBCPP_ALWAYS_INLINE
44size_t __libcpp_wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc,
45 size_t __len, mbstate_t *__ps, locale_t __l)
46{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000047 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +000048 return wcsnrtombs(__dest, __src, __nwc, __len, __ps);
49}
50
51inline _LIBCPP_ALWAYS_INLINE
52size_t __libcpp_wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l)
53{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000054 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +000055 return wcrtomb(__s, __wc, __ps);
56}
57
58inline _LIBCPP_ALWAYS_INLINE
59size_t __libcpp_mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms,
60 size_t __len, mbstate_t *__ps, locale_t __l)
61{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000062 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +000063 return mbsnrtowcs(__dest, __src, __nms, __len, __ps);
64}
65
66inline _LIBCPP_ALWAYS_INLINE
67size_t __libcpp_mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n,
68 mbstate_t *__ps, locale_t __l)
69{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000070 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +000071 return mbrtowc(__pwc, __s, __n, __ps);
72}
73
74inline _LIBCPP_ALWAYS_INLINE
75int __libcpp_mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l)
76{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000077 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +000078 return mbtowc(__pwc, __pmb, __max);
79}
80
81inline _LIBCPP_ALWAYS_INLINE
82size_t __libcpp_mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l)
83{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000084 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +000085 return mbrlen(__s, __n, __ps);
86}
87
88inline _LIBCPP_ALWAYS_INLINE
89lconv *__libcpp_localeconv_l(locale_t __l)
90{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000091 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +000092 return localeconv();
93}
94
95inline _LIBCPP_ALWAYS_INLINE
96size_t __libcpp_mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,
97 mbstate_t *__ps, locale_t __l)
98{
Eric Fiselierb4ddab22017-05-08 22:02:43 +000099 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +0000100 return mbsrtowcs(__dest, __src, __len, __ps);
101}
102
103inline
104int __libcpp_snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) {
105 va_list __va;
106 va_start(__va, __format);
Eric Fiselierb4ddab22017-05-08 22:02:43 +0000107 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +0000108 int __res = vsnprintf(__s, __n, __format, __va);
109 va_end(__va);
110 return __res;
111}
112
113inline
114int __libcpp_asprintf_l(char **__s, locale_t __l, const char *__format, ...) {
115 va_list __va;
116 va_start(__va, __format);
Eric Fiselierb4ddab22017-05-08 22:02:43 +0000117 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +0000118 int __res = vasprintf(__s, __format, __va);
119 va_end(__va);
120 return __res;
121}
122
123inline
124int __libcpp_sscanf_l(const char *__s, locale_t __l, const char *__format, ...) {
125 va_list __va;
126 va_start(__va, __format);
Eric Fiselierb4ddab22017-05-08 22:02:43 +0000127 __libcpp_locale_guard __current(__l);
Ben Craigd2f15ba2016-03-09 15:39:39 +0000128 int __res = vsscanf(__s, __format, __va);
129 va_end(__va);
130 return __res;
131}
132
133_LIBCPP_END_NAMESPACE_STD
134
135#endif // _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H