locale.cpp revision 0769e6a785f95fe3ec76c8667e142bd6282d0f7e
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===------------------------- locale.cpp ---------------------------------===//
2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant//                     The LLVM Compiler Infrastructure
4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details.
7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//
8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===//
9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall// On Solaris, we need to define something to make the C99 parts of localeconv
11997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall// visible.
12997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall#ifdef __sun__
13997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall#define _LCONV_C99
14997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall#endif
15997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall
16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "string"
17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "locale"
1887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant#include "codecvt"
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "vector"
20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "algorithm"
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "algorithm"
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "typeinfo"
23d318d49e5c74179d0f4f9a79ab0f54a9531c5513Howard Hinnant#include "type_traits"
24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "clocale"
25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "cstring"
26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "cwctype"
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "__sso_allocator"
28a22d2addb1287a7642bfcb211ae2cb21890d1cbdMarshall Clow#ifdef _WIN32
2914fa9f9d8ff5a4541404f3e23b91188e74c56f31Howard Hinnant#include <support/win32/locale_win32.h>
306cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#else // _WIN32
31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <langinfo.h>
326cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#endif // _!WIN32
33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <stdlib.h>
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
359ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow// On Linux, wint_t and wchar_t have different signed-ness, and this causes
369ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow// lots of noise in the build log, but no bugs that I know of.
379ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow#pragma clang diagnostic ignored "-Wsign-conversion"
389ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow
39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
41866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef __cloc_defined
4262a6ac33a217b0e5a4c42367c6b72e51497246aeSean Huntlocale_t __cloc() {
4362a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  // In theory this could create a race condition. In practice
4462a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  // the race condition is non-fatal since it will just create
4562a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  // a little resource leak. Better approach would be appreciated.
4662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  static locale_t result = newlocale(LC_ALL_MASK, "C", 0);
4762a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  return result;
4862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt}
49866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#endif // __cloc_defined
5062a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt
51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace {
52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct release
54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void operator()(locale::facet* p) {p->__release_shared();}
56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T, class A0>
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantT&
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmake(A0 a0)
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static typename aligned_storage<sizeof(T)>::type buf;
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ::new (&buf) T(a0);
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return *(T*)&buf;
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T, class A0, class A1>
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantT&
71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmake(A0 a0, A1 a1)
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static typename aligned_storage<sizeof(T)>::type buf;
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ::new (&buf) T(a0, a1);
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return *(T*)&buf;
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T, class A0, class A1, class A2>
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantT&
81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmake(A0 a0, A1 a1, A2 a2)
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static typename aligned_storage<sizeof(T)>::type buf;
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ::new (&buf) T(a0, a1, a2);
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return *(T*)&buf;
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
88bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnanttemplate <typename T, size_t N>
8921772ec06376b965fd868a68bcf55e60c5a0dcc9Howard Hinnantinline
90bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant_LIBCPP_CONSTEXPR
91bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnantsize_t
92bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnantcountof(const T (&)[N])
93bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant{
94bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    return N;
95bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant}
96bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant
97bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnanttemplate <typename T>
9821772ec06376b965fd868a68bcf55e60c5a0dcc9Howard Hinnantinline
99bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant_LIBCPP_CONSTEXPR
100bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnantsize_t
101bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnantcountof(const T * const begin, const T * const end)
102bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant{
103bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    return static_cast<size_t>(end - begin);
104bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant}
105bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant
106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1080a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::none;
1090a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::collate;
1100a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::ctype;
1110a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::monetary;
1120a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::numeric;
1130a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::time;
1140a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::messages;
1150a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::all;
1160a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant
117ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant#pragma clang diagnostic push
118ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant#pragma clang diagnostic ignored "-Wpadded"
119ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant
120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass _LIBCPP_HIDDEN locale::__imp
121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public facet
122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    enum {N = 28};
124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    vector<facet*, __sso_allocator<facet*, N> > facets_;
125ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    string         name_;
126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit __imp(size_t refs = 0);
128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit __imp(const string& name, size_t refs = 0);
129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __imp(const __imp&);
130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __imp(const __imp&, const string&, locale::category c);
131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __imp(const __imp& other, const __imp& one, locale::category c);
132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __imp(const __imp&, facet* f, long id);
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~__imp();
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const string& name() const {return name_;}
136ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    bool has_facet(long id) const
137ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        {return static_cast<size_t>(id) < facets_.size() && facets_[static_cast<size_t>(id)];}
138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const locale::facet* use_facet(long id) const;
139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const locale& make_classic();
141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static       locale& make_global();
142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void install(facet* f, long id);
144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class F> void install(F* f) {install(f, f->id.__get());}
145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class F> void install_from(const __imp& other);
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
148ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant#pragma clang diagnostic pop
149ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(size_t refs)
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : facet(refs),
152ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      facets_(N),
153ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_("C")
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    facets_.clear();
156ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::collate<char> >(1u));
157ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::collate<wchar_t> >(1u));
158ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::ctype<char> >((ctype_base::mask*)0, false, 1u));
159ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::ctype<wchar_t> >(1u));
160ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<codecvt<char, char, mbstate_t> >(1u));
161ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<codecvt<wchar_t, char, mbstate_t> >(1u));
162ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<codecvt<char16_t, char, mbstate_t> >(1u));
163ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<codecvt<char32_t, char, mbstate_t> >(1u));
164ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<numpunct<char> >(1u));
165ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<numpunct<wchar_t> >(1u));
166ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<num_get<char> >(1u));
167ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<num_get<wchar_t> >(1u));
168ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<num_put<char> >(1u));
169ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<num_put<wchar_t> >(1u));
170ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<moneypunct<char, false> >(1u));
171ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<moneypunct<char, true> >(1u));
172ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<moneypunct<wchar_t, false> >(1u));
173ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<moneypunct<wchar_t, true> >(1u));
174ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<money_get<char> >(1u));
175ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<money_get<wchar_t> >(1u));
176ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<money_put<char> >(1u));
177ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<money_put<wchar_t> >(1u));
178ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<time_get<char> >(1u));
179ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<time_get<wchar_t> >(1u));
180ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<time_put<char> >(1u));
181ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<time_put<wchar_t> >(1u));
182ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::messages<char> >(1u));
183ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::messages<wchar_t> >(1u));
184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(const string& name, size_t refs)
187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : facet(refs),
188ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      facets_(N),
189ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_(name)
190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
191d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    try
193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
19416e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        facets_ = locale::classic().__locale_->facets_;
196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < facets_.size(); ++i)
197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (facets_[i])
198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                facets_[i]->__add_shared();
199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new collate_byname<char>(name_));
200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new collate_byname<wchar_t>(name_));
201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new ctype_byname<char>(name_));
202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new ctype_byname<wchar_t>(name_));
203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new codecvt_byname<char, char, mbstate_t>(name_));
204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new codecvt_byname<wchar_t, char, mbstate_t>(name_));
205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new codecvt_byname<char16_t, char, mbstate_t>(name_));
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new codecvt_byname<char32_t, char, mbstate_t>(name_));
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new numpunct_byname<char>(name_));
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new numpunct_byname<wchar_t>(name_));
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new moneypunct_byname<char, false>(name_));
210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new moneypunct_byname<char, true>(name_));
211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new moneypunct_byname<wchar_t, false>(name_));
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new moneypunct_byname<wchar_t, true>(name_));
213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new time_get_byname<char>(name_));
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new time_get_byname<wchar_t>(name_));
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new time_put_byname<char>(name_));
216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new time_put_byname<wchar_t>(name_));
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new messages_byname<char>(name_));
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new messages_byname<wchar_t>(name_));
219d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    catch (...)
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < facets_.size(); ++i)
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (facets_[i])
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                facets_[i]->__release_shared();
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw;
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
22816e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
23121772ec06376b965fd868a68bcf55e60c5a0dcc9Howard Hinnant// NOTE avoid the `base class should be explicitly initialized in the
2325f767b7b28b28a1cd1d9950e3dd4b7bedf555d02Howard Hinnant// copy constructor` warning emitted by GCC
233e58bc12f2aa9548ec3c5fe657dffa2024b5926c1Joerg Sonnenberger#if defined(__clang__) || _GNUC_VER >= 406
2345f767b7b28b28a1cd1d9950e3dd4b7bedf555d02Howard Hinnant#pragma GCC diagnostic push
23521772ec06376b965fd868a68bcf55e60c5a0dcc9Howard Hinnant#pragma GCC diagnostic ignored "-Wextra"
236e58bc12f2aa9548ec3c5fe657dffa2024b5926c1Joerg Sonnenberger#endif
2375f767b7b28b28a1cd1d9950e3dd4b7bedf555d02Howard Hinnant
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(const __imp& other)
239ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    : facets_(max<size_t>(N, other.facets_.size())),
240ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_(other.name_)
241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    facets_ = other.facets_;
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < facets_.size(); ++i)
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (facets_[i])
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            facets_[i]->__add_shared();
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
248e58bc12f2aa9548ec3c5fe657dffa2024b5926c1Joerg Sonnenberger#if defined(__clang__) || _GNUC_VER >= 406
2495f767b7b28b28a1cd1d9950e3dd4b7bedf555d02Howard Hinnant#pragma GCC diagnostic pop
250e58bc12f2aa9548ec3c5fe657dffa2024b5926c1Joerg Sonnenberger#endif
2515f767b7b28b28a1cd1d9950e3dd4b7bedf555d02Howard Hinnant
252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(const __imp& other, const string& name, locale::category c)
253ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    : facets_(N),
254ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_("*")
255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    facets_ = other.facets_;
257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < facets_.size(); ++i)
258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (facets_[i])
259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            facets_[i]->__add_shared();
260d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    try
262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
26316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::collate)
265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new collate_byname<char>(name));
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new collate_byname<wchar_t>(name));
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::ctype)
270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new ctype_byname<char>(name));
272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new ctype_byname<wchar_t>(name));
273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new codecvt_byname<char, char, mbstate_t>(name));
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new codecvt_byname<wchar_t, char, mbstate_t>(name));
275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new codecvt_byname<char16_t, char, mbstate_t>(name));
276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new codecvt_byname<char32_t, char, mbstate_t>(name));
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::monetary)
279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new moneypunct_byname<char, false>(name));
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new moneypunct_byname<char, true>(name));
282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new moneypunct_byname<wchar_t, false>(name));
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new moneypunct_byname<wchar_t, true>(name));
284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::numeric)
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new numpunct_byname<char>(name));
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new numpunct_byname<wchar_t>(name));
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::time)
291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new time_get_byname<char>(name));
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new time_get_byname<wchar_t>(name));
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new time_put_byname<char>(name));
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new time_put_byname<wchar_t>(name));
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::messages)
298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new messages_byname<char>(name));
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new messages_byname<wchar_t>(name));
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
302d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    catch (...)
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < facets_.size(); ++i)
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (facets_[i])
308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                facets_[i]->__release_shared();
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw;
310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
31116e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<class F>
315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline
316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::install_from(const locale::__imp& one)
318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    long id = F::id.__get();
320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    install(const_cast<F*>(static_cast<const F*>(one.use_facet(id))), id);
321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(const __imp& other, const __imp& one, locale::category c)
324ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    : facets_(N),
325ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_("*")
326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    facets_ = other.facets_;
328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < facets_.size(); ++i)
329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (facets_[i])
330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            facets_[i]->__add_shared();
331d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    try
333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
33416e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::collate)
336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
3370949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::collate<char> >(one);
3380949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::collate<wchar_t> >(one);
339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::ctype)
341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
3420949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::ctype<char> >(one);
3430949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::ctype<wchar_t> >(one);
3440949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::codecvt<char, char, mbstate_t> >(one);
3450949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::codecvt<char16_t, char, mbstate_t> >(one);
3460949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::codecvt<char32_t, char, mbstate_t> >(one);
3470949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::codecvt<wchar_t, char, mbstate_t> >(one);
348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::monetary)
350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<moneypunct<char, false> >(one);
352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<moneypunct<char, true> >(one);
353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<moneypunct<wchar_t, false> >(one);
354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<moneypunct<wchar_t, true> >(one);
355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<money_get<char> >(one);
356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<money_get<wchar_t> >(one);
357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<money_put<char> >(one);
358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<money_put<wchar_t> >(one);
359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::numeric)
361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<numpunct<char> >(one);
363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<numpunct<wchar_t> >(one);
364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<num_get<char> >(one);
365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<num_get<wchar_t> >(one);
366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<num_put<char> >(one);
367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<num_put<wchar_t> >(one);
368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::time)
370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<time_get<char> >(one);
372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<time_get<wchar_t> >(one);
373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<time_put<char> >(one);
374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<time_put<wchar_t> >(one);
375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::messages)
377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
3780949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::messages<char> >(one);
3790949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::messages<wchar_t> >(one);
380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
381d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    catch (...)
384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < facets_.size(); ++i)
386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (facets_[i])
387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                facets_[i]->__release_shared();
388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw;
389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
39016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(const __imp& other, facet* f, long id)
394ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    : facets_(max<size_t>(N, other.facets_.size()+1)),
395ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_("*")
396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f->__add_shared();
398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unique_ptr<facet, release> hold(f);
399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    facets_ = other.facets_;
400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < other.facets_.size(); ++i)
401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (facets_[i])
402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            facets_[i]->__add_shared();
403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    install(hold.get(), id);
404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::~__imp()
407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < facets_.size(); ++i)
409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (facets_[i])
410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            facets_[i]->__release_shared();
411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::install(facet* f, long id)
415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f->__add_shared();
417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unique_ptr<facet, release> hold(f);
418ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (static_cast<size_t>(id) >= facets_.size())
419ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        facets_.resize(static_cast<size_t>(id+1));
420ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (facets_[static_cast<size_t>(id)])
421ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        facets_[static_cast<size_t>(id)]->__release_shared();
422ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    facets_[static_cast<size_t>(id)] = hold.release();
423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst locale::facet*
426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::use_facet(long id) const
427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
428d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (!has_facet(id))
430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw bad_cast();
43116e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
432ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    return facets_[static_cast<size_t>(id)];
433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// locale
436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst locale&
438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::make_classic()
439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // only one thread can get in here and it only gets in once
441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static aligned_storage<sizeof(locale)>::type buf;
442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale* c = (locale*)&buf;
443ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    c->__locale_ = &make<__imp>(1u);
444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return *c;
445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst locale&
448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::classic()
449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const locale& c = __imp::make_classic();
451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return c;
452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale&
455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::make_global()
456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // only one thread can get in here and it only gets in once
458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static aligned_storage<sizeof(locale)>::type buf;
459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ::new (&buf) locale(locale::classic());
460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return *(locale*)&buf;
461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale&
464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__global()
465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale& g = __imp::make_global();
467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return g;
468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
470c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantlocale::locale()  _NOEXCEPT
471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(__global().__locale_)
472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
476c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantlocale::locale(const locale& l)  _NOEXCEPT
477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(l.__locale_)
478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
482c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantlocale::~locale()
483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__release_shared();
485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst locale&
488c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantlocale::operator=(const locale& other)  _NOEXCEPT
489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    other.__locale_->__add_shared();
491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__release_shared();
492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_ = other.__locale_;
493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return *this;
494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const char* name)
497d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(name ? new __imp(name)
499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                     : throw runtime_error("locale constructed with null"))
50016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#else  // _LIBCPP_NO_EXCEPTIONS
501d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant    : __locale_(new __imp(name))
502d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#endif
503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const string& name)
508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(new __imp(name))
509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const locale& other, const char* name, category c)
514d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(name ? new __imp(*other.__locale_, name, c)
516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                     : throw runtime_error("locale constructed with null"))
51716e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#else  // _LIBCPP_NO_EXCEPTIONS
518d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant    : __locale_(new __imp(*other.__locale_, name, c))
519d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#endif
520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const locale& other, const string& name, category c)
525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(new __imp(*other.__locale_, name, c))
526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const locale& other, const locale& one, category c)
531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(new __imp(*other.__locale_, *one.__locale_, c))
532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring
537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::name() const
538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __locale_->name();
540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__install_ctor(const locale& other, facet* f, long id)
544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (f)
546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __locale_ = new __imp(*other.__locale_, f, id);
547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __locale_ = other.__locale_;
549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale
553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::global(const locale& loc)
554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale& g = __global();
556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale r = g;
557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    g = loc;
558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (g.name() != "*")
559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setlocale(LC_ALL, g.name().c_str());
560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return r;
561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::has_facet(id& x) const
565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __locale_->has_facet(x.__get());
567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst locale::facet*
570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::use_facet(id& x) const
571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __locale_->use_facet(x.__get());
573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::operator==(const locale& y) const
577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return (__locale_ == y.__locale_)
579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        || (__locale_->name() != "*" && __locale_->name() == y.__locale_->name());
580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// locale::facet
583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::facet::~facet()
585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5891694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantlocale::facet::__on_zero_shared() _NOEXCEPT
590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    delete this;
592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// locale::id
595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint32_t locale::id::__next_id = 0;
597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace
599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass __fake_bind
602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale::id* id_;
604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void (locale::id::* pmf_)();
605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __fake_bind(void (locale::id::* pmf)(), locale::id* id)
607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : id_(id), pmf_(pmf) {}
608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void operator()() const
610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        (id_->*pmf_)();
612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlong
618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id::__get()
619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    call_once(__flag_, __fake_bind(&locale::id::__init, this));
621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __id_ - 1;
622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id::__init()
626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
627adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant    __id_ = __sync_add_and_fetch(&__next_id, 1);
628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class collate_byname<char>
631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::collate_byname(const char* n, size_t refs)
633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : collate<char>(refs),
634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, n, 0))
635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
636d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("collate_byname<char>::collate_byname"
639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(n));
64016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::collate_byname(const string& name, size_t refs)
644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : collate<char>(refs),
645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
647d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("collate_byname<char>::collate_byname"
650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + name);
65116e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::~collate_byname()
655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    freelocale(__l);
657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::do_compare(const char_type* __lo1, const char_type* __hi1,
661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                 const char_type* __lo2, const char_type* __hi2) const
662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type lhs(__lo1, __hi1);
664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type rhs(__lo2, __hi2);
665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int r = strcoll_l(lhs.c_str(), rhs.c_str(), __l);
666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (r < 0)
667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return -1;
668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (r > 0)
669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return 1;
670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return r;
671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::string_type
674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::do_transform(const char_type* lo, const char_type* hi) const
675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const string_type in(lo, hi);
677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type out(strxfrm_l(0, in.c_str(), 0, __l), char());
678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    strxfrm_l(const_cast<char*>(out.c_str()), in.c_str(), out.size()+1, __l);
679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return out;
680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class collate_byname<wchar_t>
683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::collate_byname(const char* n, size_t refs)
685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : collate<wchar_t>(refs),
686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, n, 0))
687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
688d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("collate_byname<wchar_t>::collate_byname(size_t refs)"
691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(n));
69216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::collate_byname(const string& name, size_t refs)
696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : collate<wchar_t>(refs),
697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
699d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("collate_byname<wchar_t>::collate_byname(size_t refs)"
702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + name);
70316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::~collate_byname()
707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    freelocale(__l);
709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::do_compare(const char_type* __lo1, const char_type* __hi1,
713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                 const char_type* __lo2, const char_type* __hi2) const
714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type lhs(__lo1, __hi1);
716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type rhs(__lo2, __hi2);
717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int r = wcscoll_l(lhs.c_str(), rhs.c_str(), __l);
718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (r < 0)
719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return -1;
720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (r > 0)
721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return 1;
722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return r;
723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::string_type
726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::do_transform(const char_type* lo, const char_type* hi) const
727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const string_type in(lo, hi);
729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type out(wcsxfrm_l(0, in.c_str(), 0, __l), wchar_t());
730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wcsxfrm_l(const_cast<wchar_t*>(out.c_str()), in.c_str(), out.size()+1, __l);
731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return out;
732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class ctype<wchar_t>;
735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
7360a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::space;
7370a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::print;
7380a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::cntrl;
7390a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::upper;
7400a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::lower;
7410a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::alpha;
7420a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::digit;
7430a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::punct;
7440a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::xdigit;
7450a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::blank;
7460a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::alnum;
7470a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::graph;
7480a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant
749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id ctype<wchar_t>::id;
750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::~ctype()
752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_is(mask m, char_type c) const
757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
75862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return isascii(c) ? ctype<char>::classic_table()[c] & m : false;
759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_is(const char_type* low, const char_type* high, mask* vec) const
763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++vec)
76562a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt        *vec = static_cast<mask>(isascii(*low) ?
76662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt                                   ctype<char>::classic_table()[*low] : 0);
767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* high) const
772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
77462a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt        if (isascii(*low) && (ctype<char>::classic_table()[*low] & m))
775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) const
781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
78362a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt        if (!(isascii(*low) && (ctype<char>::classic_table()[*low] & m)))
784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_toupper(char_type c) const
790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
7913c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
7923c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c;
793a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
79462a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c;
795e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
7963c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return (isascii(c) && iswlower_l(c, __cloc())) ? c-L'a'+L'A' : c;
797e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const
802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
8043c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
8053c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low;
806a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
80762a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt        *low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low]
80862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt                             : *low;
809e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
8103c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = (isascii(*low) && islower_l(*low, __cloc())) ? (*low-L'a'+L'A') : *low;
811e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_tolower(char_type c) const
817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
8183c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
8193c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c;
820a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
82162a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return isascii(c) ? ctype<char>::__classic_lower_table()[c] : c;
822e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
8233c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return (isascii(c) && isupper_l(c, __cloc())) ? c-L'A'+'a' : c;
824e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const
829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
830bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
8313c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
8323c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low;
833a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
83462a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt        *low = isascii(*low) ? ctype<char>::__classic_lower_table()[*low]
83562a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt                             : *low;
836e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
8373c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-L'A'+L'a' : *low;
838e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_widen(char c) const
844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return c;
846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_widen(const char* low, const char* high, char_type* dest) const
850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *dest = *low;
853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
855bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
856bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_narrow(char_type c, char dfault) const
858bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
859bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (isascii(c))
860bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return static_cast<char>(c);
861bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return dfault;
862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const
866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (isascii(*low))
869ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            *dest = static_cast<char>(*low);
870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *dest = dfault;
872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class ctype<char>;
876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id ctype<char>::id;
878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::ctype(const mask* tab, bool del, size_t refs)
880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : locale::facet(refs),
881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __tab_(tab),
882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __del_(del)
883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
88462a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  if (__tab_ == 0)
88562a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt      __tab_ = classic_table();
886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
888bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::~ctype()
889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__tab_ && __del_)
891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        delete [] __tab_;
892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_toupper(char_type c) const
896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
8973c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
898ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    return isascii(c) ?
899ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(c)]) : c;
900a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__NetBSD__)
901a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    return static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)]);
902fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
90388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    return isascii(c) ?
904a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger      static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)]) : c;
905e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
9063c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return (isascii(c) && islower_l(c, __cloc())) ? c-'a'+'A' : c;
907e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_toupper(char_type* low, const char_type* high) const
912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
9143c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
915ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        *low = isascii(*low) ?
916ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant          static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(*low)]) : *low;
917a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__NetBSD__)
918a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger        *low = static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(*low)]);
919fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
92088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        *low = isascii(*low) ?
92188c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow          static_cast<char>(__classic_upper_table()[static_cast<size_t>(*low)]) : *low;
922e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
9233c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = (isascii(*low) && islower_l(*low, __cloc())) ? *low-'a'+'A' : *low;
924e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_tolower(char_type c) const
930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
9313c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
932ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    return isascii(c) ?
933ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(c)]) : c;
934a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__NetBSD__)
935a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    return static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(c)]);
936a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__GLIBC__) || defined(EMSCRIPTEN) || defined(__NetBSD__)
93788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    return isascii(c) ?
93888c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow      static_cast<char>(__classic_lower_table()[static_cast<size_t>(c)]) : c;
939e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
9403c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return (isascii(c) && isupper_l(c, __cloc())) ? c-'A'+'a' : c;
941e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_tolower(char_type* low, const char_type* high) const
946bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
9483c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
949ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        *low = isascii(*low) ? static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(*low)]) : *low;
950a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__NetBSD__)
951a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger        *low = static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(*low)]);
952fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#elif defined(__GLIBC__) || defined(EMSCRIPTEN)
95388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        *low = isascii(*low) ? static_cast<char>(__classic_lower_table()[static_cast<size_t>(*low)]) : *low;
954e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
9553c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-'A'+'a' : *low;
956e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_widen(char c) const
962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return c;
964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_widen(const char* low, const char* high, char_type* dest) const
968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *dest = *low;
971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_narrow(char_type c, char dfault) const
976bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (isascii(c))
978bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return static_cast<char>(c);
979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return dfault;
980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const
984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (isascii(*low))
987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *dest = *low;
988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *dest = dfault;
990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
993fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#ifdef EMSCRIPTEN
994fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantextern "C" const unsigned short ** __ctype_b_loc();
995fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantextern "C" const int ** __ctype_tolower_loc();
996fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantextern "C" const int ** __ctype_toupper_loc();
997fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#endif
998fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant
999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ctype<char>::mask*
1000c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantctype<char>::classic_table()  _NOEXCEPT
1001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1002c512df1950baf9466843b2943855356c031fec08David Chisnall#if defined(__APPLE__) || defined(__FreeBSD__)
1003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return _DefaultRuneLocale.__runetype;
1004a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__NetBSD__)
1005a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    return _C_ctype_tab_ + 1;
100662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt#elif defined(__GLIBC__)
100762a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return __cloc()->__ctype_b;
1008997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall#elif __sun__
1009997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    return __ctype_mask;
1010a22d2addb1287a7642bfcb211ae2cb21890d1cbdMarshall Clow#elif defined(_WIN32)
10113c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return _ctype+1; // internal ctype mask table defined in msvcrt.dll
1012c512df1950baf9466843b2943855356c031fec08David Chisnall// This is assumed to be safe, which is a nonsense assumption because we're
1013c512df1950baf9466843b2943855356c031fec08David Chisnall// going to end up dereferencing it later...
1014fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#elif defined(EMSCRIPTEN)
1015fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant    return *__ctype_b_loc();
101662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt#else
1017997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    // Platform not supported: abort so the person doing the port knows what to
1018997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    // fix
1019fcbaf48f21daac4d8ca0d75361116b1b7478bcfcHoward Hinnant# warning  ctype<char>::classic_table() is not implemented
1020997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    abort();
102162a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return NULL;
102262a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt#endif
102362a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt}
102462a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt
10253c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#if defined(__GLIBC__)
102662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Huntconst int*
102762a6ac33a217b0e5a4c42367c6b72e51497246aeSean Huntctype<char>::__classic_lower_table() _NOEXCEPT
102862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt{
102962a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return __cloc()->__ctype_tolower;
103062a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt}
103162a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt
103262a6ac33a217b0e5a4c42367c6b72e51497246aeSean Huntconst int*
103362a6ac33a217b0e5a4c42367c6b72e51497246aeSean Huntctype<char>::__classic_upper_table() _NOEXCEPT
103462a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt{
103562a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return __cloc()->__ctype_toupper;
1036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1037a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif __NetBSD__
1038a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenbergerconst short*
1039a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenbergerctype<char>::__classic_lower_table() _NOEXCEPT
1040a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger{
1041a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    return _C_tolower_tab_ + 1;
1042a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger}
1043a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger
1044a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenbergerconst short*
1045a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenbergerctype<char>::__classic_upper_table() _NOEXCEPT
1046a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger{
1047a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    return _C_toupper_tab_ + 1;
1048a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger}
1049bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1050a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(EMSCRIPTEN)
1051fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantconst int*
1052fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantctype<char>::__classic_lower_table() _NOEXCEPT
1053fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant{
1054fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant    return *__ctype_tolower_loc();
1055fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant}
1056fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant
1057fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantconst int*
1058fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantctype<char>::__classic_upper_table() _NOEXCEPT
1059fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant{
1060fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant    return *__ctype_toupper_loc();
1061fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant}
1062a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#endif // __GLIBC__ || EMSCRIPTEN || __NETBSD__
1063fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant
1064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class ctype_byname<char>
1065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::ctype_byname(const char* name, size_t refs)
1067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : ctype<char>(0, false, refs),
1068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name, 0))
1069bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1070d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1071bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
1072bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("ctype_byname<char>::ctype_byname"
1073bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(name));
107416e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::ctype_byname(const string& name, size_t refs)
1078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : ctype<char>(0, false, refs),
1079bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
1080bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1081d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1082bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
1083bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("ctype_byname<char>::ctype_byname"
1084bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + name);
108516e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1086bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::~ctype_byname()
1089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    freelocale(__l);
1091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
1094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::do_toupper(char_type c) const
1095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
109663d8f7e341d98bdd7e8d9b52945db01f4708fa3aJoerg Sonnenberger    return static_cast<char>(toupper_l(static_cast<unsigned char>(c), __l));
1097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
1100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::do_toupper(char_type* low, const char_type* high) const
1101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
110363d8f7e341d98bdd7e8d9b52945db01f4708fa3aJoerg Sonnenberger        *low = static_cast<char>(toupper_l(static_cast<unsigned char>(*low), __l));
1104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
1108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::do_tolower(char_type c) const
1109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
111063d8f7e341d98bdd7e8d9b52945db01f4708fa3aJoerg Sonnenberger    return static_cast<char>(tolower_l(static_cast<unsigned char>(c), __l));
1111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
1114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::do_tolower(char_type* low, const char_type* high) const
1115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
111763d8f7e341d98bdd7e8d9b52945db01f4708fa3aJoerg Sonnenberger        *low = static_cast<char>(tolower_l(static_cast<unsigned char>(*low), __l));
1118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class ctype_byname<wchar_t>
1122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::ctype_byname(const char* name, size_t refs)
1124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : ctype<wchar_t>(refs),
1125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name, 0))
1126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1127d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
1129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("ctype_byname<wchar_t>::ctype_byname"
1130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(name));
113116e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::ctype_byname(const string& name, size_t refs)
1135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : ctype<wchar_t>(refs),
1136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
1137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1138d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
1140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("ctype_byname<wchar_t>::ctype_byname"
1141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + name);
114216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::~ctype_byname()
1146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    freelocale(__l);
1148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
1151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_is(mask m, char_type c) const
1152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
11536f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#ifdef _LIBCPP_WCTYPE_IS_MASK
1154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<bool>(iswctype_l(c, m, __l));
11556f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#else
1156ef793f2513b734d0827825b7857f5745529190d4Howard Hinnant    bool result = false;
115788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    wint_t ch = static_cast<wint_t>(c);
115888c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & space) result |= (iswspace_l(ch, __l) != 0);
115988c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & print) result |= (iswprint_l(ch, __l) != 0);
116088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & cntrl) result |= (iswcntrl_l(ch, __l) != 0);
116188c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & upper) result |= (iswupper_l(ch, __l) != 0);
116288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & lower) result |= (iswlower_l(ch, __l) != 0);
116388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & alpha) result |= (iswalpha_l(ch, __l) != 0);
116488c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & digit) result |= (iswdigit_l(ch, __l) != 0);
116588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & punct) result |= (iswpunct_l(ch, __l) != 0);
116688c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & xdigit) result |= (iswxdigit_l(ch, __l) != 0);
116788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & blank) result |= (iswblank_l(ch, __l) != 0);
11683c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return result;
11696f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#endif
1170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_is(const char_type* low, const char_type* high, mask* vec) const
1174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++vec)
1176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (isascii(*low))
117862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt            *vec = static_cast<mask>(ctype<char>::classic_table()[*low]);
1179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
1180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *vec = 0;
118288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            wint_t ch = static_cast<wint_t>(*low);
118388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswspace_l(ch, __l))
1184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= space;
118588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswprint_l(ch, __l))
1186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= print;
118788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswcntrl_l(ch, __l))
1188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= cntrl;
118988c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswupper_l(ch, __l))
1190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= upper;
119188c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswlower_l(ch, __l))
1192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= lower;
119388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswalpha_l(ch, __l))
1194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= alpha;
119588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswdigit_l(ch, __l))
1196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= digit;
119788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswpunct_l(ch, __l))
1198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= punct;
119988c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswxdigit_l(ch, __l))
1200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= xdigit;
1201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* high) const
1208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
12106f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt    {
12116f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#ifdef _LIBCPP_WCTYPE_IS_MASK
1212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (iswctype_l(*low, m, __l))
1213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
12146f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#else
121588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        wint_t ch = static_cast<wint_t>(*low);
121688c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & space && iswspace_l(ch, __l)) break;
121788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & print && iswprint_l(ch, __l)) break;
121888c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & cntrl && iswcntrl_l(ch, __l)) break;
121988c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & upper && iswupper_l(ch, __l)) break;
122088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & lower && iswlower_l(ch, __l)) break;
122188c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & alpha && iswalpha_l(ch, __l)) break;
122288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & digit && iswdigit_l(ch, __l)) break;
122388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & punct && iswpunct_l(ch, __l)) break;
122488c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & xdigit && iswxdigit_l(ch, __l)) break;
122588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & blank && iswblank_l(ch, __l)) break;
12266f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#endif
12276f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt    }
1228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) const
1233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
12356f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt    {
12366f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#ifdef _LIBCPP_WCTYPE_IS_MASK
1237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (!iswctype_l(*low, m, __l))
1238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
12396f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#else
124088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        wint_t ch = static_cast<wint_t>(*low);
124188c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & space && iswspace_l(ch, __l)) continue;
124288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & print && iswprint_l(ch, __l)) continue;
124388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & cntrl && iswcntrl_l(ch, __l)) continue;
124488c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & upper && iswupper_l(ch, __l)) continue;
124588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & lower && iswlower_l(ch, __l)) continue;
124688c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & alpha && iswalpha_l(ch, __l)) continue;
124788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & digit && iswdigit_l(ch, __l)) continue;
124888c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & punct && iswpunct_l(ch, __l)) continue;
124988c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & xdigit && iswxdigit_l(ch, __l)) continue;
125088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & blank && iswblank_l(ch, __l)) continue;
12516f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt        break;
12526f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#endif
12536f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt    }
1254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
1258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_toupper(char_type c) const
1259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return towupper_l(c, __l);
1261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_toupper(char_type* low, const char_type* high) const
1265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
1267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *low = towupper_l(*low, __l);
1268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
1272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_tolower(char_type c) const
1273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return towlower_l(c, __l);
1275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_tolower(char_type* low, const char_type* high) const
1279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
1281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *low = towlower_l(*low, __l);
1282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
1286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_widen(char c) const
1287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1288866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1289f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    return btowc_l(c, __l);
1290f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1291f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    return __btowc_l(c, __l);
1292f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
1296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_widen(const char* low, const char* high, char_type* dest) const
1297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
1299866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1300f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        *dest = btowc_l(*low, __l);
1301f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1302f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        *dest = __btowc_l(*low, __l);
1303f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
1308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_narrow(char_type c, char dfault) const
1309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1310866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1311f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    int r = wctob_l(c, __l);
1312f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1313f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    int r = __wctob_l(c, __l);
1314f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1315c6e54b964f22f489309e4e98554ddd7a42ccd291Howard Hinnant    return r != static_cast<int>(WEOF) ? static_cast<char>(r) : dfault;
1316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const
1320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
1322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1323866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1324f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        int r = wctob_l(*low, __l);
1325f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1326f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        int r = __wctob_l(*low, __l);
1327f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1328c6e54b964f22f489309e4e98554ddd7a42ccd291Howard Hinnant        *dest = r != static_cast<int>(WEOF) ? static_cast<char>(r) : dfault;
1329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<char, char, mbstate_t>
1334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
133516e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantlocale::id codecvt<char, char, mbstate_t>::id;
1336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<char, char, mbstate_t>::~codecvt()
1338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<char, char, mbstate_t>::result
134216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantcodecvt<char, char, mbstate_t>::do_out(state_type&,
134316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const intern_type* frm, const intern_type*, const intern_type*& frm_nxt,
1344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
1345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    frm_nxt = frm;
1347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return noconv;
1349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<char, char, mbstate_t>::result
135216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantcodecvt<char, char, mbstate_t>::do_in(state_type&,
135316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const extern_type* frm, const extern_type*, const extern_type*& frm_nxt,
1354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    intern_type* to, intern_type*, intern_type*& to_nxt) const
1355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    frm_nxt = frm;
1357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return noconv;
1359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<char, char, mbstate_t>::result
136216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantcodecvt<char, char, mbstate_t>::do_unshift(state_type&,
1363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
1364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return noconv;
1367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1370c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char, char, mbstate_t>::do_encoding() const  _NOEXCEPT
1371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return 1;
1373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
1376c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char, char, mbstate_t>::do_always_noconv() const  _NOEXCEPT
1377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return true;
1379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<char, char, mbstate_t>::do_length(state_type&,
1383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const extern_type* frm, const extern_type* end, size_t mx) const
1384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1385ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    return static_cast<int>(min<size_t>(mx, static_cast<size_t>(end-frm)));
1386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1389c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char, char, mbstate_t>::do_max_length() const  _NOEXCEPT
1390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return 1;
1392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<wchar_t, char, mbstate_t>
1395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
139616e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantlocale::id codecvt<wchar_t, char, mbstate_t>::id;
1397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::codecvt(size_t refs)
1399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : locale::facet(refs),
14005328cd307c81224cd57da1a76c567b3dafcc5cd5Joerg Sonnenberger      __l(_LIBCPP_GET_C_LOCALE)
1401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::codecvt(const char* nm, size_t refs)
1405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : locale::facet(refs),
1406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, nm, 0))
1407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1408d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
1410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("codecvt_byname<wchar_t, char, mbstate_t>::codecvt_byname"
1411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
141216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::~codecvt()
1416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1417be764c946cee6b43b2bcfb4918aea3fa7888deafJoerg Sonnenberger    if (__l != _LIBCPP_GET_C_LOCALE)
1418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        freelocale(__l);
1419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::result
1422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::do_out(state_type& st,
142316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
1424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
1425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // look for first internal null in frm
1427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const intern_type* fend = frm;
1428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; fend != frm_end; ++fend)
1429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*fend == 0)
1430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // loop over all null-terminated sequences in frm
1432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (frm_nxt = frm; frm != frm_end && to != to_end; frm = frm_nxt, to = to_nxt)
1434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1435df4182153c061fae526996ae4f00bf7b01ce7befJoerg Sonnenberger        // save state in case it is needed to recover to_nxt on error
1436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t save_state = st;
1437866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1438ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        size_t n = wcsnrtombs_l(to, &frm_nxt, static_cast<size_t>(fend-frm),
1439ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                                static_cast<size_t>(to_end-to), &st, __l);
1440f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1441f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        size_t n = __wcsnrtombs_l(to, &frm_nxt, fend-frm, to_end-to, &st, __l);
1442f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (n == size_t(-1))
1444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // need to recover to_nxt
1446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (to_nxt = to; frm != frm_nxt; ++frm)
1447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
1448866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1449f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt                n = wcrtomb_l(to_nxt, *frm, &save_state, __l);
1450f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1451f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt                n = __wcrtomb_l(to_nxt, *frm, &save_state, __l);
1452f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (n == size_t(-1))
1454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
1455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                to_nxt += n;
1456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
1457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt = frm;
1458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return error;
1459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (n == 0)
1461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return partial;
1462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        to_nxt += n;
1463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (to_nxt == to_end)
1464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (fend != frm_end)  // set up next null terminated sequence
1466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // Try to write the terminating null
1468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            extern_type tmp[MB_LEN_MAX];
1469866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1470f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt            n = wcrtomb_l(tmp, intern_type(), &st, __l);
1471f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1472f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt            n = __wcrtomb_l(tmp, intern_type(), &st, __l);
1473f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (n == size_t(-1))  // on error
1475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return error;
1476ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if (n > static_cast<size_t>(to_end-to_nxt))  // is there room?
1477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return partial;
1478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (extern_type* p = tmp; n; --n)  // write it
1479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *to_nxt++ = *p++;
1480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
1481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // look for next null in frm
1482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (fend = frm_nxt; fend != frm_end; ++fend)
1483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (*fend == 0)
1484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
1485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return frm_nxt == frm_end ? ok : partial;
1488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::result
1491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::do_in(state_type& st,
149216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
1493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
1494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // look for first internal null in frm
1496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const extern_type* fend = frm;
1497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; fend != frm_end; ++fend)
1498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*fend == 0)
1499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // loop over all null-terminated sequences in frm
1501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (frm_nxt = frm; frm != frm_end && to != to_end; frm = frm_nxt, to = to_nxt)
1503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1504df4182153c061fae526996ae4f00bf7b01ce7befJoerg Sonnenberger        // save state in case it is needed to recover to_nxt on error
1505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t save_state = st;
1506866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1507ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        size_t n = mbsnrtowcs_l(to, &frm_nxt, static_cast<size_t>(fend-frm),
1508ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                                static_cast<size_t>(to_end-to), &st, __l);
1509f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1510f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        size_t n = __mbsnrtowcs_l(to, &frm_nxt, fend-frm, to_end-to, &st, __l);
1511f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (n == size_t(-1))
1513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // need to recover to_nxt
1515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (to_nxt = to; frm != frm_nxt; ++to_nxt)
1516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
1517866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1518ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                n = mbrtowc_l(to_nxt, frm, static_cast<size_t>(fend-frm),
1519ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                              &save_state, __l);
1520f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1521f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt                n = __mbrtowc_l(to_nxt, frm, fend-frm, &save_state, __l);
1522f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                switch (n)
1524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
1525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                case 0:
1526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    ++frm;
1527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
1528982331b66e7d7beadb8da7764acd5ffe53b20d66Howard Hinnant                case size_t(-1):
1529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    frm_nxt = frm;
1530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return error;
1531982331b66e7d7beadb8da7764acd5ffe53b20d66Howard Hinnant                case size_t(-2):
1532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    frm_nxt = frm;
1533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return partial;
1534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                default:
1535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    frm += n;
1536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
1537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
1538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
1539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt = frm;
1540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return frm_nxt == frm_end ? ok : partial;
1541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (n == 0)
1543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return error;
1544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        to_nxt += n;
1545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (to_nxt == to_end)
1546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (fend != frm_end)  // set up next null terminated sequence
1548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // Try to write the terminating null
1550866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1551f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt            n = mbrtowc_l(to_nxt, frm_nxt, 1, &st, __l);
1552f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1553f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt            n = __mbrtowc_l(to_nxt, frm_nxt, 1, &st, __l);
1554f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (n != 0)  // on error
1556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return error;
1557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++to_nxt;
1558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
1559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // look for next null in frm
1560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (fend = frm_nxt; fend != frm_end; ++fend)
1561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (*fend == 0)
1562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
1563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return frm_nxt == frm_end ? ok : partial;
1566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::result
1569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::do_unshift(state_type& st,
1570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
1571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    extern_type tmp[MB_LEN_MAX];
1574866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1575f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    size_t n = wcrtomb_l(tmp, intern_type(), &st, __l);
1576f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1577f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    size_t n = __wcrtomb_l(tmp, intern_type(), &st, __l);
1578f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (n == size_t(-1) || n == 0)  // on error
1580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return error;
1581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    --n;
1582ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (n > static_cast<size_t>(to_end-to_nxt))  // is there room?
1583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return partial;
1584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (extern_type* p = tmp; n; --n)  // write it
1585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *to_nxt++ = *p++;
1586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return ok;
1587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1590c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<wchar_t, char, mbstate_t>::do_encoding() const  _NOEXCEPT
1591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1592866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1593f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    if (mbtowc_l((wchar_t*) 0, (const char*) 0, MB_LEN_MAX, __l) == 0)
1594f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1595f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    if (__mbtowc_l((wchar_t*) 0, (const char*) 0, MB_LEN_MAX, __l) == 0)
1596f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        // stateless encoding
1599866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1600f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        if (__l == 0 || MB_CUR_MAX_L(__l) == 1)  // there are no known constant length encodings
1601f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1602f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        if (__l == 0 || __mb_cur_max_l(__l) == 1)  // there are no known constant length encodings
1603f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return 1;                // which take more than 1 char to form a wchar_t
1605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant         return 0;
1606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return -1;
1608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
1611c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<wchar_t, char, mbstate_t>::do_always_noconv() const  _NOEXCEPT
1612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return false;
1614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::do_length(state_type& st,
1618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
1619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int nbytes = 0;
1621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (size_t nwchar_t = 0; nwchar_t < mx && frm != frm_end; ++nwchar_t)
1622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1623866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1624ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        size_t n = mbrlen_l(frm, static_cast<size_t>(frm_end-frm), &st, __l);
1625f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1626f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        size_t n = __mbrlen_l(frm, frm_end-frm, &st, __l);
1627f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (n)
1629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case 0:
1631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++nbytes;
1632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm;
1633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1634982331b66e7d7beadb8da7764acd5ffe53b20d66Howard Hinnant        case size_t(-1):
1635982331b66e7d7beadb8da7764acd5ffe53b20d66Howard Hinnant        case size_t(-2):
1636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return nbytes;
1637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        default:
1638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            nbytes += n;
1639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm += n;
1640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return nbytes;
1644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1647c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<wchar_t, char, mbstate_t>::do_max_length() const  _NOEXCEPT
1648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1649866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
16509ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow    return __l == 0 ? 1 : static_cast<int>(  MB_CUR_MAX_L(__l));
1651f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
16529ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow    return __l == 0 ? 1 : static_cast<int>(__mb_cur_max_l(__l));
1653f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//                                     Valid UTF ranges
1657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//     UTF-32               UTF-16                          UTF-8               # of code points
1658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//                     first      second       first   second    third   fourth
1659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 000000 - 00007F  0000 - 007F               00 - 7F                                 127
1660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 000080 - 0007FF  0080 - 07FF               C2 - DF, 80 - BF                       1920
1661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 000800 - 000FFF  0800 - 0FFF               E0 - E0, A0 - BF, 80 - BF              2048
1662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 001000 - 00CFFF  1000 - CFFF               E1 - EC, 80 - BF, 80 - BF             49152
1663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 00D000 - 00D7FF  D000 - D7FF               ED - ED, 80 - 9F, 80 - BF              2048
1664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 00D800 - 00DFFF                invalid
1665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 00E000 - 00FFFF  E000 - FFFF               EE - EF, 80 - BF, 80 - BF              8192
1666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 010000 - 03FFFF  D800 - D8BF, DC00 - DFFF  F0 - F0, 90 - BF, 80 - BF, 80 - BF   196608
1667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 040000 - 0FFFFF  D8C0 - DBBF, DC00 - DFFF  F1 - F3, 80 - BF, 80 - BF, 80 - BF   786432
1668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 100000 - 10FFFF  DBC0 - DBFF, DC00 - DFFF  F4 - F4, 80 - 8F, 80 - BF, 80 - BF    65536
1669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
167087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
167187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
167287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16_to_utf8(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
167387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
167487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
167687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
167787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
167887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
167987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
168087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 3)
168187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
168287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xEF);
168387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBB);
168487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBF);
168587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
168687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
168787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
168887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint16_t wc1 = *frm_nxt;
168987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (wc1 > Maxcode)
169087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
169187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (wc1 < 0x0080)
169287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
169387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 1)
169487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
169587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc1);
169687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
169787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (wc1 < 0x0800)
169887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
169987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 2)
170087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
170187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc1 >> 6));
170287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x03F));
170387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
170487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (wc1 < 0xD800)
170587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
170687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 3)
170787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
170887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc1 >> 12));
170987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
171087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc1 & 0x003F));
171187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
171287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (wc1 < 0xDC00)
171387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
171487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 2)
171587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
171687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t wc2 = frm_nxt[1];
171787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((wc2 & 0xFC00) != 0xDC00)
171887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
171987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 4)
172087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
172187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((((((unsigned long)wc1 & 0x03C0) >> 6) + 1) << 16) +
172287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                (((unsigned long)wc1 & 0x003F) << 10) + (wc2 & 0x03FF) > Maxcode)
172387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
172487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            ++frm_nxt;
172587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t z = ((wc1 & 0x03C0) >> 6) + 1;
172687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xF0 | (z >> 2));
172787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((z & 0x03) << 4)     | ((wc1 & 0x003C) >> 2));
172887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0003) << 4) | ((wc2 & 0x03C0) >> 6));
172987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc2 & 0x003F));
173087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
173187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (wc1 < 0xE000)
173287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
173387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
173487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
173587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
173687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
173787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 3)
173887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
173987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc1 >> 12));
174087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
174187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc1 & 0x003F));
174287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
174387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
174487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
1745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
174787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
174887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
174987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16_to_utf8(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
175087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
175187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
175387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
175487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
175587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
175687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
175787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 3)
175887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
175987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xEF);
176087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBB);
176187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBF);
176287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
176387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
1764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
176587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint16_t wc1 = static_cast<uint16_t>(*frm_nxt);
176687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (wc1 > Maxcode)
176787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
1768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (wc1 < 0x0080)
1769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 1)
177187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
177287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc1);
1773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc1 < 0x0800)
1775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 2)
177787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
177887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc1 >> 6));
177987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x03F));
1780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc1 < 0xD800)
1782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 3)
178487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
178587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc1 >> 12));
178687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
178787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc1 & 0x003F));
1788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc1 < 0xDC00)
1790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 2)
179287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
179387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t wc2 = static_cast<uint16_t>(frm_nxt[1]);
1794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((wc2 & 0xFC00) != 0xDC00)
179587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
1796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 4)
179787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
179887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((((((unsigned long)wc1 & 0x03C0) >> 6) + 1) << 16) +
179987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                (((unsigned long)wc1 & 0x003F) << 10) + (wc2 & 0x03FF) > Maxcode)
180087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
1801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
180287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t z = ((wc1 & 0x03C0) >> 6) + 1;
180387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xF0 | (z >> 2));
180487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((z & 0x03) << 4)     | ((wc1 & 0x003C) >> 2));
180587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0003) << 4) | ((wc2 & 0x03C0) >> 6));
180687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc2 & 0x003F));
1807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc1 < 0xE000)
1809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
181087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
1811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
1813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 3)
181587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
181687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc1 >> 12));
181787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
181887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc1 & 0x003F));
1819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
182187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
1822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
182487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
182587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
182687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_utf16(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
182787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
182887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
183087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
183187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
183287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
1833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
183487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
183587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
183687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
183787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
183887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
183987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
184087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = *frm_nxt;
184187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 > Maxcode)
184287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
1843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c1 < 0x80)
1844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
184587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint16_t>(c1);
1846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
1847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xC2)
1849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
185087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
1851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xE0)
1853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 2)
185587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
185687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
1857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c2 & 0xC0) != 0x80)
185887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
185987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (c2 & 0x3F));
186087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
186187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
186287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
1863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 2;
1864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF0)
1866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 3)
186887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
186987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
187087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
1871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
1872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
1873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xE0:
1874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0xA0)
187587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xED:
1878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0x80)
187987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
1882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
188387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
1886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80)
188787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
188887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12)
1889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             | ((c2 & 0x3F) << 6)
1890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             |  (c3 & 0x3F));
189187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
189287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
189387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
1894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 3;
1895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF5)
1897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 4)
189987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
190087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
190187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
190287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c4 = frm_nxt[3];
1903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
1904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
1905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF0:
1906bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (!(0x90 <= c2 && c2 <= 0xBF))
190787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF4:
1910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xF0) != 0x80)
191187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
1914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
191587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
1918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
191987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
1920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 2)
192187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
192287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (((((unsigned long)c1 & 7) << 18) +
192387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                (((unsigned long)c2 & 0x3F) << 12) +
192487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                (((unsigned long)c3 & 0x3F) << 6) + (c4 & 0x3F)) > Maxcode)
192587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
192687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint16_t>(
1927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    0xD800
1928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  | (((((c1 & 0x07) << 2) | ((c2 & 0x30) >> 4)) - 1) << 6)
1929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  | ((c2 & 0x0F) << 2)
1930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  | ((c3 & 0x30) >> 4));
193187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *++to_nxt = static_cast<uint16_t>(
1932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    0xDC00
1933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  | ((c3 & 0x0F) << 6)
1934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  |  (c4 & 0x3F));
1935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 4;
1936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
1938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
193987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
1940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
194287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
1943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
194587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
194687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
194787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_utf16(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
194887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
194987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
195187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
1952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
195387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
195487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
195587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
195687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
195787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
195887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
195987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
196087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
196187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = *frm_nxt;
196287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 > Maxcode)
196387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
196487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 < 0x80)
196587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
196687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(c1);
196787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            ++frm_nxt;
196887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
196987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xC2)
197087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
197187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
197287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
197387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xE0)
197487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
197587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 2)
197687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
197787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
197887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c2 & 0xC0) != 0x80)
197987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
198087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (c2 & 0x3F));
198187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
198287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
198387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(t);
198487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
198587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
198687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xF0)
198787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
198887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 3)
198987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
199087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
199187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
199287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            switch (c1)
199387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            {
199487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xE0:
199587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0xA0)
199687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
199787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
199887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xED:
199987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0x80)
200087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
200187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
200287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            default:
200387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xC0) != 0x80)
200487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
200587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
200687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            }
200787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c3 & 0xC0) != 0x80)
200887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
200987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12)
201087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                             | ((c2 & 0x3F) << 6)
201187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                             |  (c3 & 0x3F));
201287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
201387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
201487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(t);
201587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
201687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
201787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xF5)
201887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
201987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 4)
202087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
202187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
202287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
202387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c4 = frm_nxt[3];
202487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            switch (c1)
202587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            {
202687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xF0:
202787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if (!(0x90 <= c2 && c2 <= 0xBF))
202887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
202987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
203087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xF4:
203187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xF0) != 0x80)
203287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
203387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
203487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            default:
203587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xC0) != 0x80)
203687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
203787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
203887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            }
203987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
204087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
204187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 2)
204287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
204387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (((((unsigned long)c1 & 7) << 18) +
204487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                (((unsigned long)c2 & 0x3F) << 12) +
204587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                (((unsigned long)c3 & 0x3F) << 6) + (c4 & 0x3F)) > Maxcode)
204687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
204787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(
204887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    0xD800
204987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  | (((((c1 & 0x07) << 2) | ((c2 & 0x30) >> 4)) - 1) << 6)
205087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  | ((c2 & 0x0F) << 2)
205187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  | ((c3 & 0x30) >> 4));
205287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *++to_nxt = static_cast<uint32_t>(
205387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    0xDC00
205487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  | ((c3 & 0x0F) << 6)
205587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |  (c4 & 0x3F));
205687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
205787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
205887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
205987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
206087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
206187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
206287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
206387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
206687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
2067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
206887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_utf16_length(const uint8_t* frm, const uint8_t* frm_end,
206987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                     size_t mx, unsigned long Maxcode = 0x10FFFF,
207087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                     codecvt_mode mode = codecvt_mode(0))
2071bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
207287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
207387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
207487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
207587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
207687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
207787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
207887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
2079bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (size_t nchar16_t = 0; frm_nxt < frm_end && nchar16_t < mx; ++nchar16_t)
2080bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
208187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = *frm_nxt;
208287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 > Maxcode)
208387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
2084bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c1 < 0x80)
2085bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2086bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
2087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xC2)
2089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
2091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xE0)
2093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((frm_end-frm_nxt < 2) || (frm_nxt[1] & 0xC0) != 0x80)
2095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
209687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (frm_nxt[1] & 0x3F));
209787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
209887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 2;
2100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF0)
2102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 3)
2104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
210587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
210687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
2107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xE0:
2110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0xA0)
2111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xED:
2114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0x80)
2115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
2119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80)
2123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2124ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode)
212587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 3;
2127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF5)
2129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 4 || mx-nchar16_t < 2)
2131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
213287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
213387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
213487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c4 = frm_nxt[3];
2135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF0:
2138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (!(0x90 <= c2 && c2 <= 0xBF))
2139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF4:
2142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xF0) != 0x80)
2143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
2147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
2151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
215287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (((((unsigned long)c1 & 7) << 18) +
215387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                (((unsigned long)c2 & 0x3F) << 12) +
215487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                (((unsigned long)c3 & 0x3F) << 6) + (c4 & 0x3F)) > Maxcode)
215587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++nchar16_t;
2157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 4;
2158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
2160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
2162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
2164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<int>(frm_nxt - frm);
2165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
216787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
216887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
216987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs4_to_utf8(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
217087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
217187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
217387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
217487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
217587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
2176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
217787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 3)
217887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
217987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xEF);
218087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBB);
218187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBF);
218287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
218387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
218487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
218587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint32_t wc = *frm_nxt;
218687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode)
218787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
2188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (wc < 0x000080)
2189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 1)
219187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
219287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc);
2193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc < 0x000800)
2195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 2)
219787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
219887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc >> 6));
219987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x03F));
2200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc < 0x010000)
2202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 3)
220487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
220587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc >> 12));
220687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x0FC0) >> 6));
220787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc & 0x003F));
2208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else // if (wc < 0x110000)
2210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 4)
221287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
221387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xF0 |  (wc >> 18));
221487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x03F000) >> 12));
221587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x000FC0) >> 6));
221687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc & 0x00003F));
2217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
221987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
2220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
222287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
222387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
222487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
222587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
222687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
222887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
222987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
223087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
2231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
223287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
223387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
223487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
223587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
223687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
223787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
223887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
2239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c1 < 0x80)
2240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
224187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
224287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
224387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(c1);
2244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
2245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xC2)
2247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
224887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
2249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xE0)
2251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 2)
225387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
225487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
2255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c2 & 0xC0) != 0x80)
225687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
225787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(((c1 & 0x1F) << 6)
2258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                              | (c2 & 0x3F));
225987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
226087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
226187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
2262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 2;
2263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF0)
2265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 3)
226787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
226887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
226987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
2270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xE0:
2273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0xA0)
227487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xED:
2277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0x80)
227887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
228287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80)
228687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
228787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(((c1 & 0x0F) << 12)
2288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             | ((c2 & 0x3F) << 6)
2289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             |  (c3 & 0x3F));
229087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
229187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
229287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
2293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 3;
2294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF5)
2296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 4)
229887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
229987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
230087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
230187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c4 = frm_nxt[3];
2302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF0:
2305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (!(0x90 <= c2 && c2 <= 0xBF))
230687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF4:
2309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xF0) != 0x80)
231087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
231487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
231887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
231987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(((c1 & 0x07) << 18)
2320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             | ((c2 & 0x3F) << 12)
2321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             | ((c3 & 0x3F) << 6)
2322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             |  (c4 & 0x3F));
232387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
232487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
232587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
2326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 4;
2327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
2329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
233087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
2331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
233387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
233687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
2337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
233887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end,
233987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    size_t mx, unsigned long Maxcode = 0x10FFFF,
234087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    codecvt_mode mode = codecvt_mode(0))
2341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
234287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
234387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
234487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
234587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
234687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
234787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
234887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
2349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (size_t nchar32_t = 0; frm_nxt < frm_end && nchar32_t < mx; ++nchar32_t)
2350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
235187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
2352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c1 < 0x80)
2353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
235487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
235587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
2357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xC2)
2359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
2361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xE0)
2363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((frm_end-frm_nxt < 2) || ((frm_nxt[1] & 0xC0) != 0x80))
2365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2366ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x1Fu) << 6) | (frm_nxt[1] & 0x3Fu)) > Maxcode)
236787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 2;
2369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF0)
2371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 3)
2373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
237487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
237587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
2376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xE0:
2379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0xA0)
2380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xED:
2383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0x80)
2384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
2388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80)
2392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2393ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode)
239487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 3;
2396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF5)
2398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 4)
2400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
240187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
240287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
240387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c4 = frm_nxt[3];
2404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF0:
2407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (!(0x90 <= c2 && c2 <= 0xBF))
2408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF4:
2411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xF0) != 0x80)
2412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
2416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
2420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2421ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x07u) << 18) | ((c2 & 0x3Fu) << 12) |
2422ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                 ((c3 & 0x3Fu) << 6)  |  (c4 & 0x3Fu)) > Maxcode)
242387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
242487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
242587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
242687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
2427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
2429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
2431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<int>(frm_nxt - frm);
2432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
243487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
243587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
243687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs2_to_utf8(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
243787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
243887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
244087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
244187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
244287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
244387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
244487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 3)
244587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
244687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xEF);
244787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBB);
244887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBF);
244987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
245087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
245187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
245287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint16_t wc = *frm_nxt;
245387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xF800) == 0xD800 || wc > Maxcode)
245487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
245587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (wc < 0x0080)
245687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
245787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 1)
245887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
245987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc);
246087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
246187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (wc < 0x0800)
246287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
246387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 2)
246487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
246587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc >> 6));
246687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x03F));
246787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
246887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else // if (wc <= 0xFFFF)
246987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
247087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 3)
247187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
247287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc >> 12));
247387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x0FC0) >> 6));
247487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc & 0x003F));
247587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
247687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
247787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
2478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
248087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
248187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
248287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
248387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
248487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
248587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
248687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
248787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
248887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
248987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
249087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
249187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
249287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
249387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
249487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
249587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
249687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
249787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 < 0x80)
249887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
249987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
250087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
250187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint16_t>(c1);
250287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            ++frm_nxt;
250387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
250487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xC2)
250587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
250687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
250787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
250887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xE0)
250987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
251087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 2)
251187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
251287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
251387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c2 & 0xC0) != 0x80)
251487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
251587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6)
251687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                              | (c2 & 0x3F));
251787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
251887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
251987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
252087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
252187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
252287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xF0)
252387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
252487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 3)
252587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
252687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
252787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
252887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            switch (c1)
252987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            {
253087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xE0:
253187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0xA0)
253287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
253387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
253487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xED:
253587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0x80)
253687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
253787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
253887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            default:
253987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xC0) != 0x80)
254087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
254187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
254287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            }
254387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c3 & 0xC0) != 0x80)
254487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
254587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12)
254687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                             | ((c2 & 0x3F) << 6)
254787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                             |  (c3 & 0x3F));
254887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
254987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
255087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
255187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
255287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
255387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
255487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
255587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
255687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
255787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
255887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
255987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
2560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
256187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
256287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
256387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end,
256487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    size_t mx, unsigned long Maxcode = 0x10FFFF,
256587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    codecvt_mode mode = codecvt_mode(0))
2566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
256787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
256887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
256987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
257087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
257187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
257287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
257387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
257487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (size_t nchar32_t = 0; frm_nxt < frm_end && nchar32_t < mx; ++nchar32_t)
257587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
257687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
257787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 < 0x80)
257887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
257987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
258087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
258187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            ++frm_nxt;
258287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
258387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xC2)
258487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
258587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
258687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
258787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xE0)
258887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
258987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((frm_end-frm_nxt < 2) || ((frm_nxt[1] & 0xC0) != 0x80))
259087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2591ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x1Fu) << 6) | (frm_nxt[1] & 0x3Fu)) > Maxcode)
259287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
259387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
259487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
259587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xF0)
259687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
259787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 3)
259887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
259987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
260087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
260187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            switch (c1)
260287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            {
260387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xE0:
260487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0xA0)
260587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return static_cast<int>(frm_nxt - frm);
260687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
260787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xED:
260887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0x80)
260987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return static_cast<int>(frm_nxt - frm);
261087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
261187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            default:
261287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xC0) != 0x80)
261387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return static_cast<int>(frm_nxt - frm);
261487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
261587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            }
261687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c3 & 0xC0) != 0x80)
261787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2618ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode)
261987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
262087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
262187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
262287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
262387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
262487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
262587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
262687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
262787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return static_cast<int>(frm_nxt - frm);
2628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
263087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
263187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
263287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs4_to_utf16be(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
263387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
263487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
263687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
263787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
263887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
2639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
264087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
264187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
264287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFE);
264387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFF);
264487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
264587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
264687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
264787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint32_t wc = *frm_nxt;
264887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode)
264987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
2650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (wc < 0x010000)
2651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
265287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 2)
265387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
265487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc >> 8);
265587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc);
2656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
2658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
265987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 4)
266087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
266187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(
2662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    0xD800
2663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  | ((((wc & 0x1F0000) >> 16) - 1) << 6)
2664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  |   ((wc & 0x00FC00) >> 10));
266587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t >> 8);
266687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t);
266787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            t = static_cast<uint16_t>(0xDC00 | (wc & 0x03FF));
266887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t >> 8);
266987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t);
2670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
267287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
2673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
267587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
267687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
267787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16be_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
267887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
267987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
268187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
268287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
268387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
268487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
268587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
268687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
268787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
268887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
2689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
2690ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
2691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if ((c1 & 0xFC00) == 0xDC00)
269287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
2693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if ((c1 & 0xFC00) != 0xD800)
2694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
269587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
269687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
269787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(c1);
269887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
2699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
2701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
270287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 4)
270387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
2704ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            uint16_t c2 = static_cast<uint16_t>(frm_nxt[2] << 8 | frm_nxt[3]);
2705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c2 & 0xFC00) != 0xDC00)
270687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
270787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(
2708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    ((((c1 & 0x03C0) >> 6) + 1) << 16)
2709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  |   ((c1 & 0x003F) << 10)
2710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  |    (c2 & 0x03FF));
271187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
271287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
271387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
271487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
2715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
271787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
272087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
272187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
272287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16be_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end,
272387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       size_t mx, unsigned long Maxcode = 0x10FFFF,
272487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       codecvt_mode mode = codecvt_mode(0))
2725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
272687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
272787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
272887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
272987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
273087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
273187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
273287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (size_t nchar32_t = 0; frm_nxt < frm_end - 1 && nchar32_t < mx; ++nchar32_t)
273387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
2734ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
273587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xFC00) == 0xDC00)
273687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
273787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xFC00) != 0xD800)
273887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
273987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
274087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
274187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
274287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
274387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
274487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
274587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 4)
274687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2747ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            uint16_t c2 = static_cast<uint16_t>(frm_nxt[2] << 8 | frm_nxt[3]);
274887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c2 & 0xFC00) != 0xDC00)
274987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
275087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(
275187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    ((((c1 & 0x03C0) >> 6) + 1) << 16)
275287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |   ((c1 & 0x003F) << 10)
275387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |    (c2 & 0x03FF));
275487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
275587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
275687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
275787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
275887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
275987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return static_cast<int>(frm_nxt - frm);
2760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
276287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
276387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
276487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs4_to_utf16le(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
276587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
276687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
276887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
276987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
277087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
277187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
277287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
277387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
277487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xFF);
277587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xFE);
277687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
277787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
277887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
277987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint32_t wc = *frm_nxt;
278087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode)
278187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
278287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (wc < 0x010000)
278387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
278487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 2)
278587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
278687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc);
278787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc >> 8);
278887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
278987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
279087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
279187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 4)
279287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
279387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(
279487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    0xD800
279587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  | ((((wc & 0x1F0000) >> 16) - 1) << 6)
279687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |   ((wc & 0x00FC00) >> 10));
279787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t);
279887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t >> 8);
279987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            t = static_cast<uint16_t>(0xDC00 | (wc & 0x03FF));
280087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t);
280187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t >> 8);
280287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
280387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
280487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
2805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
280787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
280887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
280987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16le_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
281087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
281187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
281387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
281487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
281587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
281687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
281787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
281887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
281987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
282087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
282187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
2822ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
282387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xFC00) == 0xDC00)
282487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
282587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xFC00) != 0xD800)
282687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
282787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
282887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
282987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(c1);
283087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
283187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
283287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
283387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
283487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 4)
283587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
2836ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            uint16_t c2 = static_cast<uint16_t>(frm_nxt[3] << 8 | frm_nxt[2]);
283787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c2 & 0xFC00) != 0xDC00)
283887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
283987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(
284087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    ((((c1 & 0x03C0) >> 6) + 1) << 16)
284187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |   ((c1 & 0x003F) << 10)
284287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |    (c2 & 0x03FF));
284387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
284487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
284587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
284687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
284787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
284887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
284987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
285287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
2853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
285487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16le_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end,
285587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       size_t mx, unsigned long Maxcode = 0x10FFFF,
285687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       codecvt_mode mode = codecvt_mode(0))
2857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
285887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
285987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
286087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
286187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
286287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
286387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
286487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (size_t nchar32_t = 0; frm_nxt < frm_end - 1 && nchar32_t < mx; ++nchar32_t)
2865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
2866ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
2867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if ((c1 & 0xFC00) == 0xDC00)
2868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
2869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if ((c1 & 0xFC00) != 0xD800)
2870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
287187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
287287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
287387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
2874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
2876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
287787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 4)
2878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2879ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            uint16_t c2 = static_cast<uint16_t>(frm_nxt[3] << 8 | frm_nxt[2]);
288087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c2 & 0xFC00) != 0xDC00)
288187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
288287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(
288387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    ((((c1 & 0x03C0) >> 6) + 1) << 16)
288487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |   ((c1 & 0x003F) << 10)
288587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |    (c2 & 0x03FF));
288687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
288787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
288887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
2889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
2891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<int>(frm_nxt - frm);
2892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
289487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
289587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
289687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs2_to_utf16be(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
289787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
289887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
290087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
290187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
290287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
290387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
290487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
290587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
290687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFE);
290787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFF);
290887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
290987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
291087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
291187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint16_t wc = *frm_nxt;
291287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xF800) == 0xD800 || wc > Maxcode)
291387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
291487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
291587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
291687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(wc >> 8);
291787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(wc);
291887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
291987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
292087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
292187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
292287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
292387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
292487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16be_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
292587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
292687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
292787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
292887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
292987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
293087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
293187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
293287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
293387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
293487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
293587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
293687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
2937ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
293887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
293987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
294087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt = c1;
294187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        frm_nxt += 2;
294287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
294387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
294487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
294587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
294687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
294787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
294887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16be_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end,
294987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       size_t mx, unsigned long Maxcode = 0x10FFFF,
295087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       codecvt_mode mode = codecvt_mode(0))
295187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
295287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
295387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
295487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
295587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
295687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
295787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
295887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (size_t nchar16_t = 0; frm_nxt < frm_end - 1 && nchar16_t < mx; ++nchar16_t)
295987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
2960ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
296187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
296287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
296387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        frm_nxt += 2;
296487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
296587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return static_cast<int>(frm_nxt - frm);
296687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
296787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
296887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
296987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
297087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs2_to_utf16le(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
297187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
297287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
297387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
297487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
297587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
297687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
297787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
297887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
297987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
298087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFF);
298187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFE);
298287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
298387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
298487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
298587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint16_t wc = *frm_nxt;
298687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xF800) == 0xD800 || wc > Maxcode)
298787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
298887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
298987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
299087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(wc);
299187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(wc >> 8);
299287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
299387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
299487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
299587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
299687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
299787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
299887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16le_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
299987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
300087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
300187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
300287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
300387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
300487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
300587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
300687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
300787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
300887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
300987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
301087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
3011ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
301287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
301387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
301487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt = c1;
301587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        frm_nxt += 2;
301687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
301787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
301887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
301987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
302087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
302187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
302287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16le_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end,
302387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       size_t mx, unsigned long Maxcode = 0x10FFFF,
302487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       codecvt_mode mode = codecvt_mode(0))
302587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
302687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
302787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
302887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
302987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
303087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
303187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
303287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
303387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (size_t nchar16_t = 0; frm_nxt < frm_end - 1 && nchar16_t < mx; ++nchar16_t)
303487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
3035ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
303687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
303787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
303887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        frm_nxt += 2;
303987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
304087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return static_cast<int>(frm_nxt - frm);
304187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
304287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
304387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// template <> class codecvt<char16_t, char, mbstate_t>
304487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
304516e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantlocale::id codecvt<char16_t, char, mbstate_t>::id;
304687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
304787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::~codecvt()
304887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
304987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
305087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
305187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::result
305287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_out(state_type&,
305316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
305487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
305587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
305687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
305787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
305887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
305987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
306087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
306187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
306287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
306387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
306487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
306587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
306687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
306787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
306887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::result
306987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_in(state_type&,
307016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
307187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
307287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
307387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
307487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
307587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
307687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
307787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
307887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_nxt = _to;
307987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
308087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
308187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
308287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
308387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
308487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
308587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::result
308687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_unshift(state_type&,
308787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
308887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
308987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
309087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
309187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
309287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
309387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3094c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_encoding() const  _NOEXCEPT
309587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
309687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
309787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
309887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
309987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3100c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_always_noconv() const  _NOEXCEPT
310187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
310287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
310387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
310487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
310587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
310687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_length(state_type&,
310787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
310887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
310987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
311087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
311187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_utf16_length(_frm, _frm_end, mx);
311287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
311387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
311487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3115c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_max_length() const  _NOEXCEPT
311687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
311787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
311887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
311987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
312087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// template <> class codecvt<char32_t, char, mbstate_t>
312187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
312216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantlocale::id codecvt<char32_t, char, mbstate_t>::id;
312387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
312487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::~codecvt()
312587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
312687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
312787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
312887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::result
312987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_out(state_type&,
313016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
313187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
313287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
313387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
313487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
313587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
313687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
313787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
313887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
313987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
314087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
314187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
314287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
314387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
314487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
314587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::result
314687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_in(state_type&,
314716e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
314887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
314987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
315087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
315187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
315287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
315387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
315487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
315587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
315687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
315787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
315887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
315987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
316087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
316187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
316287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::result
316387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_unshift(state_type&,
316487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
316587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
316687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
316787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
316887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
316987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
317087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3171c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_encoding() const  _NOEXCEPT
317287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
317387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
317487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
317587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
317687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3177c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_always_noconv() const  _NOEXCEPT
317887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
317987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
318087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
318187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
318287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
318387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_length(state_type&,
318487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
318587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
318687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
318787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
318887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_ucs4_length(_frm, _frm_end, mx);
318987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
319087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
319187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3192c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_max_length() const  _NOEXCEPT
319387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
319487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
319587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
319687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
319787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8<wchar_t>
319887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
319987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::result
320087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::do_out(state_type&,
320187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
320287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
320387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
32040769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#if _WIN32
32050769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
32060769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
32070769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
32080769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#else
320987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
321087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
321187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
32120769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#endif
321387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
321487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
321587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
32160769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#if _WIN32
32170769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    result r = ucs2_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
32180769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant                            _Maxcode_, _Mode_);
32190769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#else
322087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
322187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
32220769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#endif
322387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
322487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
322587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
322687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
322787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
322887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::result
322987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::do_in(state_type&,
323087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
323187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
323287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
323387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
323487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
323587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
32360769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#if _WIN32
32370769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
32380769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
32390769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    uint16_t* _to_nxt = _to;
32400769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    result r = utf8_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
32410769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant                            _Maxcode_, _Mode_);
32420769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#else
324387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
324487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
324587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
324687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
324787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
32480769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#endif
324987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
325087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
325187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
325287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
325387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
325487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::result
325587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::do_unshift(state_type&,
325687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
325787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
325887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
325987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
326087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
326187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
326287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3263c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<wchar_t>::do_encoding() const  _NOEXCEPT
326487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
326587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
326687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
326787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
326887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3269c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<wchar_t>::do_always_noconv() const  _NOEXCEPT
327087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
327187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
327287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
327387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
327487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
327587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::do_length(state_type&,
327687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
327787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
327887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
327987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
328087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
328187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
328287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
328387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3284c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<wchar_t>::do_max_length() const  _NOEXCEPT
328587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
328687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
328787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 7;
328887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
328987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
329087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
329187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8<char16_t>
329287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
329387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::result
329487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::do_out(state_type&,
329587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
329687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
329787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
329887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
329987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
330087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
330187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
330287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
330387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
330487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs2_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
330587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
330687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
330787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
330887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
330987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
331087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
331187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::result
331287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::do_in(state_type&,
331387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
331487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
331587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
331687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
331787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
331887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
331987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
332087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
332187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_nxt = _to;
332287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
332387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
332487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
332587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
332687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
332787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
332887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
332987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::result
333087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::do_unshift(state_type&,
333187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
333287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
333387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
333487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
333587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
333687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
333787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3338c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char16_t>::do_encoding() const  _NOEXCEPT
333987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
334087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
334187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
334287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
334387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3344c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char16_t>::do_always_noconv() const  _NOEXCEPT
334587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
334687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
334787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
334887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
334987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
335087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::do_length(state_type&,
335187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
335287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
335387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
335487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
335587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
335687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
335787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
335887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3359c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char16_t>::do_max_length() const  _NOEXCEPT
336087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
336187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
336287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 6;
336387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 3;
336487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
336587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
336687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8<char32_t>
336787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
336887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::result
336987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::do_out(state_type&,
337087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
337187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
337287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
337387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
337487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
337587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
337687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
337787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
337887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
337987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
338087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
338187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
338287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
338387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
338487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
338587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
338687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::result
338787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::do_in(state_type&,
338887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
338987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
339087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
339187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
339287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
339387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
339487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
339587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
339687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
339787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
339887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
339987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
340087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
340187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
340287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
340387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
340487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::result
340587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::do_unshift(state_type&,
340687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
340787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
340887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
340987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
341087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
341187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
341287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3413c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char32_t>::do_encoding() const  _NOEXCEPT
341487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
341587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
341687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
341787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
341887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3419c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char32_t>::do_always_noconv() const  _NOEXCEPT
342087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
342187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
342287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
342387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
342487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
342587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::do_length(state_type&,
342687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
342787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
342887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
342987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
343087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
343187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
343287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
343387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3434c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char32_t>::do_max_length() const  _NOEXCEPT
343587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
343687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
343787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 7;
343887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
343987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
344087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
344187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<wchar_t, false>
344287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
344387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::result
344487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::do_out(state_type&,
344587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
344687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
344787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
344887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
344987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
345087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
345187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
345287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
345387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
345487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
345587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
345687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
345787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
345887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
345987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
346087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
346187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::result
346287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::do_in(state_type&,
346387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
346487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
346587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
346687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
346787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
346887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
346987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
347087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
347187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
347287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16be_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
347387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
347487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
347587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
347687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
347787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
347887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
347987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::result
348087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::do_unshift(state_type&,
348187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
348287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
348387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
348487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
348587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
348687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
348787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3488c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, false>::do_encoding() const  _NOEXCEPT
348987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
349087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
349187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
349287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
349387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3494c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, false>::do_always_noconv() const  _NOEXCEPT
349587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
349687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
349787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
349887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
349987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
350087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::do_length(state_type&,
350187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
350287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
350387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
350487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
350587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16be_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
350687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
350787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
350887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3509c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, false>::do_max_length() const  _NOEXCEPT
351087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
351187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
351287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 6;
351387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
351487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
351587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
351687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<wchar_t, true>
351787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
351887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::result
351987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::do_out(state_type&,
352087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
352187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
352287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
352387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
352487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
352587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
352687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
352787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
352887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
352987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
353087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
353187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
353287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
353387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
353487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
353587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
353687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::result
353787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::do_in(state_type&,
353887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
353987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
354087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
354187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
354287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
354387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
354487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
354587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
354687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
354787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16le_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
354887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
354987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
355087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
355187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
355287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
355387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
355487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::result
355587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::do_unshift(state_type&,
355687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
355787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
355887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
355987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
356087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
356187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
356287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3563c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, true>::do_encoding() const  _NOEXCEPT
356487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
356587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
356687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
356787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
356887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3569c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, true>::do_always_noconv() const  _NOEXCEPT
357087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
3571d23b464e21648e252d5ae501b2db2e93dc02b1f7Howard Hinnant    return false;
357287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
357387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
357487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
357587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::do_length(state_type&,
357687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
357787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
357887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
357987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
358087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16le_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
358187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
358287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
358387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3584c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, true>::do_max_length() const  _NOEXCEPT
358587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
358687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
358787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 6;
358887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
358987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
359087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
359187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<char16_t, false>
359287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
359387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::result
359487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::do_out(state_type&,
359587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
359687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
359787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
359887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
359987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
360087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
360187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
360287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
360387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
360487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs2_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
360587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
360687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
360787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
360887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
360987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
361087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
361187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::result
361287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::do_in(state_type&,
361387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
361487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
361587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
361687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
361787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
361887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
361987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
362087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
362187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_nxt = _to;
362287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16be_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
362387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
362487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
362587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
362687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
362787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
362887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
362987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::result
363087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::do_unshift(state_type&,
363187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
363287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
363387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
363487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
363587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
363687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
363787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3638c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, false>::do_encoding() const  _NOEXCEPT
363987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
364087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
364187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
364287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
364387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3644c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, false>::do_always_noconv() const  _NOEXCEPT
364587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
364687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
364787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
364887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
364987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
365087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::do_length(state_type&,
365187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
365287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
365387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
365487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
365587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16be_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
365687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
365787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
365887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3659c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, false>::do_max_length() const  _NOEXCEPT
366087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
366187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
366287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 4;
366387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 2;
366487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
366587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
366687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<char16_t, true>
366787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
366887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::result
366987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::do_out(state_type&,
367087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
367187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
367287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
367387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
367487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
367587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
367687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
367787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
367887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
367987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs2_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
368087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
368187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
368287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
368387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
368487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
368587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
368687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::result
368787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::do_in(state_type&,
368887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
368987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
369087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
369187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
369287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
369387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
369487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
369587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
369687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_nxt = _to;
369787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16le_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
369887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
369987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
370087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
370187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
370287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
370387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
370487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::result
370587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::do_unshift(state_type&,
370687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
370787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
370887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
370987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
371087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
371187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
371287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3713c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, true>::do_encoding() const  _NOEXCEPT
371487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
371587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
371687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
371787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
371887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3719c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, true>::do_always_noconv() const  _NOEXCEPT
372087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
3721d23b464e21648e252d5ae501b2db2e93dc02b1f7Howard Hinnant    return false;
372287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
372387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
372487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
372587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::do_length(state_type&,
372687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
372787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
372887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
372987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
373087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16le_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
373187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
373287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
373387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3734c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, true>::do_max_length() const  _NOEXCEPT
373587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
373687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
373787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 4;
373887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 2;
373987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
374087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
374187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<char32_t, false>
374287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
374387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::result
374487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::do_out(state_type&,
374587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
374687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
374787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
374887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
374987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
375087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
375187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
375287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
375387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
375487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
375587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
375687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
375787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
375887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
375987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
376087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
376187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::result
376287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::do_in(state_type&,
376387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
376487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
376587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
376687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
376787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
376887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
376987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
377087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
377187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
377287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16be_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
377387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
377487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
377587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
377687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
377787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
377887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
377987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::result
378087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::do_unshift(state_type&,
378187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
378287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
378387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
378487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
378587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
378687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
378787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3788c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, false>::do_encoding() const  _NOEXCEPT
378987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
379087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
379187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
379287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
379387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3794c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, false>::do_always_noconv() const  _NOEXCEPT
379587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
379687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
379787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
379887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
379987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
380087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::do_length(state_type&,
380187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
380287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
380387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
380487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
380587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16be_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
380687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
380787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
380887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3809c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, false>::do_max_length() const  _NOEXCEPT
381087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
381187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
381287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 6;
381387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
381487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
381587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
381687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<char32_t, true>
381787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
381887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::result
381987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::do_out(state_type&,
382087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
382187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
382287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
382387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
382487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
382587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
382687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
382787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
382887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
382987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
383087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
383187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
383287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
383387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
383487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
383587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
383687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::result
383787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::do_in(state_type&,
383887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
383987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
384087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
384187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
384287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
384387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
384487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
384587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
384687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
384787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16le_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
384887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
384987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
385087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
385187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
385287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
385387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
385487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::result
385587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::do_unshift(state_type&,
385687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
385787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
385887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
385987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
386087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
386187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
386287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3863c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, true>::do_encoding() const  _NOEXCEPT
386487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
386587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
386687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
386787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
386887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3869c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, true>::do_always_noconv() const  _NOEXCEPT
387087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
3871d23b464e21648e252d5ae501b2db2e93dc02b1f7Howard Hinnant    return false;
387287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
387387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
387487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
387587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::do_length(state_type&,
387687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
387787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
387887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
387987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
388087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16le_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
388187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
388287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
388387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3884c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, true>::do_max_length() const  _NOEXCEPT
388587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
388687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
388787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 6;
388887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
388987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
389087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
389187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8_utf16<wchar_t>
389287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
389387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::result
389487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_out(state_type&,
389587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
389687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
389787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
389887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
389987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
390087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
390187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
390287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
390387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
390487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
390587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
390687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
390787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
390887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
390987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
391087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
391187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::result
391287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_in(state_type&,
391387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
391487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
391587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
391687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
391787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
391887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
391987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
392087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
392187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
392287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
392387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
392487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
392587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
392687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
392787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
392887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
392987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::result
393087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_unshift(state_type&,
393187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
393287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
393387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
393487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
393587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
393687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
393787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3938c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_encoding() const  _NOEXCEPT
393987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
394087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
394187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
394287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
394387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3944c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_always_noconv() const  _NOEXCEPT
394587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
394687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
394787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
394887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
394987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
395087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_length(state_type&,
395187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
395287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
395387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
395487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
395587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
395687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
395787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
395887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3959c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_max_length() const  _NOEXCEPT
396087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
396187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
396287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 7;
396387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
396487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
396587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
396687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8_utf16<char16_t>
396787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
396887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::result
396987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_out(state_type&,
397087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
397187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
397287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
397387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
397487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
397587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
397687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
397787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
397887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
397987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
398087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
398187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
398287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
398387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
398487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
398587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
398687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::result
398787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_in(state_type&,
398887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
398987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
399087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
399187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
399287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
399387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
399487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
399587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
399687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_nxt = _to;
399787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
399887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
399987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
400087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
400187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
400287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
400387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
400487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::result
400587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_unshift(state_type&,
400687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
400787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
400887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
400987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
401087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
401187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
401287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
4013c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_encoding() const  _NOEXCEPT
401487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
401587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
401687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
401787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
401887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
4019c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_always_noconv() const  _NOEXCEPT
402087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
402187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
402287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
402387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
402487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
402587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_length(state_type&,
402687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
402787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
402887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
402987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
403087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
403187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
403287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
403387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
4034c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_max_length() const  _NOEXCEPT
403587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
403687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
403787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 7;
403887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
403987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
404087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
404187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8_utf16<char32_t>
404287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
404387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::result
404487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_out(state_type&,
404587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
404687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
404787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
404887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
404987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
405087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
405187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
405287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
405387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
405487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
405587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
405687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
405787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
405887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
405987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
406087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
406187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::result
406287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_in(state_type&,
406387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
406487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
406587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
406687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
406787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
406887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
406987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
407087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
407187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
407287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
407387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
407487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
407587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
407687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
407787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
407887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
407987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::result
408087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_unshift(state_type&,
408187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
408287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
408387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
408487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
408587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
408687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
408787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
4088c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_encoding() const  _NOEXCEPT
408987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
409087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
409187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
409287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
409387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
4094c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_always_noconv() const  _NOEXCEPT
409587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
409687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
409787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
409887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
409987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
410087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_length(state_type&,
410187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
410287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
410387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
410487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
410587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
410687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
410787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
410887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
4109c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_max_length() const  _NOEXCEPT
411087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
411187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
411287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 7;
411387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
4114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __narrow_to_utf8<16>
4117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__narrow_to_utf8<16>::~__narrow_to_utf8()
4119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __narrow_to_utf8<32>
4123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__narrow_to_utf8<32>::~__narrow_to_utf8()
4125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __widen_from_utf8<16>
4129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__widen_from_utf8<16>::~__widen_from_utf8()
4131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __widen_from_utf8<32>
4135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__widen_from_utf8<32>::~__widen_from_utf8()
4137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// numpunct<char> && numpunct<wchar_t>
4141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id numpunct< char  >::id;
4143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id numpunct<wchar_t>::id;
4144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct<char>::numpunct(size_t refs)
4146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : locale::facet(refs),
4147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __decimal_point_('.'),
4148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __thousands_sep_(',')
4149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct<wchar_t>::numpunct(size_t refs)
4153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : locale::facet(refs),
4154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __decimal_point_(L'.'),
4155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __thousands_sep_(L',')
4156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct<char>::~numpunct()
4160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct<wchar_t>::~numpunct()
4164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char   numpunct< char  >::do_decimal_point() const {return __decimal_point_;}
4168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t numpunct<wchar_t>::do_decimal_point() const {return __decimal_point_;}
4169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char   numpunct< char  >::do_thousands_sep() const {return __thousands_sep_;}
4171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t numpunct<wchar_t>::do_thousands_sep() const {return __thousands_sep_;}
4172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring numpunct< char  >::do_grouping() const {return __grouping_;}
4174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring numpunct<wchar_t>::do_grouping() const {return __grouping_;}
4175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant string numpunct< char  >::do_truename() const {return "true";}
4177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring numpunct<wchar_t>::do_truename() const {return L"true";}
4178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant string numpunct< char  >::do_falsename() const {return "false";}
4180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring numpunct<wchar_t>::do_falsename() const {return L"false";}
4181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// numpunct_byname<char>
4183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<char>::numpunct_byname(const char* nm, size_t refs)
4185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : numpunct<char>(refs)
4186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init(nm);
4188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<char>::numpunct_byname(const string& nm, size_t refs)
4191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : numpunct<char>(refs)
4192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init(nm.c_str());
4194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<char>::~numpunct_byname()
4197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
4201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<char>::__init(const char* nm)
4202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (strcmp(nm, "C") != 0)
4204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4205f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
4206d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
420705b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant        if (loc == nullptr)
4208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            throw runtime_error("numpunct_byname<char>::numpunct_byname"
4209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                " failed to construct for " + string(nm));
421016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
4211866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
4212f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        lconv* lc = localeconv_l(loc.get());
4213f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
4214f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        lconv* lc = __localeconv_l(loc.get());
4215f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
4216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*lc->decimal_point)
4217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __decimal_point_ = *lc->decimal_point;
4218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*lc->thousands_sep)
4219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __thousands_sep_ = *lc->thousands_sep;
4220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __grouping_ = lc->grouping;
4221cb05a0801a6273fb850cc4cb3430702ea2a3c101Sean Hunt        // localization for truename and falsename is not available
4222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// numpunct_byname<wchar_t>
4226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<wchar_t>::numpunct_byname(const char* nm, size_t refs)
4228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : numpunct<wchar_t>(refs)
4229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init(nm);
4231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<wchar_t>::numpunct_byname(const string& nm, size_t refs)
4234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : numpunct<wchar_t>(refs)
4235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init(nm.c_str());
4237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<wchar_t>::~numpunct_byname()
4240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
4244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<wchar_t>::__init(const char* nm)
4245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (strcmp(nm, "C") != 0)
4247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4248f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
4249d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
425005b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant        if (loc == nullptr)
4251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            throw runtime_error("numpunct_byname<char>::numpunct_byname"
4252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                " failed to construct for " + string(nm));
425316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
4254866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
4255f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        lconv* lc = localeconv_l(loc.get());
4256f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
4257f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        lconv* lc = __localeconv_l(loc.get());
4258f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
4259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*lc->decimal_point)
4260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __decimal_point_ = *lc->decimal_point;
4261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*lc->thousands_sep)
4262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __thousands_sep_ = *lc->thousands_sep;
4263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __grouping_ = lc->grouping;
4264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        // locallization for truename and falsename is not available
4265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// num_get helpers
4269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
4271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__num_get_base::__get_base(ios_base& iob)
4272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios_base::fmtflags __basefield = iob.flags() & ios_base::basefield;
4274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__basefield == ios_base::oct)
4275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return 8;
4276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (__basefield == ios_base::hex)
4277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return 16;
4278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (__basefield == 0)
4279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return 0;
4280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return 10;
4281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char __num_get_base::__src[33] = "0123456789abcdefABCDEFxX+-pPiInN";
4284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
4286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__check_grouping(const string& __grouping, unsigned* __g, unsigned* __g_end,
4287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 ios_base::iostate& __err)
4288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__grouping.size() != 0)
4290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        reverse(__g, __g_end);
4292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        const char* __ig = __grouping.data();
4293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        const char* __eg = __ig + __grouping.size();
4294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned* __r = __g; __r < __g_end-1; ++__r)
4295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (0 < *__ig && *__ig < numeric_limits<char>::max())
4297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
4298ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                if (static_cast<unsigned>(*__ig) != *__r)
4299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
4300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    __err = ios_base::failbit;
4301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return;
4302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
4303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
4304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__eg - __ig > 1)
4305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                ++__ig;
4306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 < *__ig && *__ig < numeric_limits<char>::max())
4308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4309ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if (static_cast<unsigned>(*__ig) < __g_end[-1] || __g_end[-1] == 0)
4310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __err = ios_base::failbit;
4311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
4316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__num_put_base::__format_int(char* __fmtp, const char* __len, bool __signd,
4317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                             ios_base::fmtflags __flags)
4318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__flags & ios_base::showpos)
4320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '+';
4321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__flags & ios_base::showbase)
4322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '#';
4323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    while(*__len)
4324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = *__len++;
4325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if ((__flags & ios_base::basefield) == ios_base::oct)
4326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp = 'o';
4327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if ((__flags & ios_base::basefield) == ios_base::hex)
4328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__flags & ios_base::uppercase)
4330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'X';
4331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
4332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'x';
4333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (__signd)
4335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp = 'd';
4336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
4337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp = 'u';
4338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
4341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__num_put_base::__format_float(char* __fmtp, const char* __len,
4342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               ios_base::fmtflags __flags)
4343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool specify_precision = true;
4345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__flags & ios_base::showpos)
4346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '+';
4347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__flags & ios_base::showpoint)
4348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '#';
4349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios_base::fmtflags floatfield = __flags & ios_base::floatfield;
4350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool uppercase = __flags & ios_base::uppercase;
4351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (floatfield == (ios_base::fixed | ios_base::scientific))
4352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        specify_precision = false;
4353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
4354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '.';
4356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '*';
4357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    while(*__len)
4359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = *__len++;
4360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (floatfield == ios_base::fixed)
4361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (uppercase)
4363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'F';
4364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
4365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'f';
4366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (floatfield == ios_base::scientific)
4368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (uppercase)
4370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'E';
4371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
4372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'e';
4373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (floatfield == (ios_base::fixed | ios_base::scientific))
4375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (uppercase)
4377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'A';
4378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
4379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'a';
4380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
4382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (uppercase)
4384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'G';
4385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
4386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'g';
4387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return specify_precision;
4389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar*
4392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__num_put_base::__identify_padding(char* __nb, char* __ne,
4393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                   const ios_base& __iob)
4394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    switch (__iob.flags() & ios_base::adjustfield)
4396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios_base::internal:
4398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__nb[0] == '-' || __nb[0] == '+')
4399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return __nb+1;
4400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__ne - __nb >= 2 && __nb[0] == '0'
4401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            && (__nb[1] == 'x' || __nb[1] == 'X'))
4402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return __nb+2;
4403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
4404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios_base::left:
4405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __ne;
4406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios_base::right:
4407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    default:
4408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
4409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __nb;
4411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// time_get
4414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring*
4417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_weeks()
4418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string weeks[14];
4420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[0]  = "Sunday";
4421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[1]  = "Monday";
4422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[2]  = "Tuesday";
4423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[3]  = "Wednesday";
4424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[4]  = "Thursday";
4425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[5]  = "Friday";
4426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[6]  = "Saturday";
4427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[7]  = "Sun";
4428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[8]  = "Mon";
4429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[9]  = "Tue";
4430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[10] = "Wed";
4431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[11] = "Thu";
4432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[12] = "Fri";
4433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[13] = "Sat";
4434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return weeks;
4435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring*
4439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_wweeks()
4440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring weeks[14];
4442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[0]  = L"Sunday";
4443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[1]  = L"Monday";
4444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[2]  = L"Tuesday";
4445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[3]  = L"Wednesday";
4446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[4]  = L"Thursday";
4447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[5]  = L"Friday";
4448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[6]  = L"Saturday";
4449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[7]  = L"Sun";
4450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[8]  = L"Mon";
4451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[9]  = L"Tue";
4452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[10] = L"Wed";
4453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[11] = L"Thu";
4454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[12] = L"Fri";
4455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[13] = L"Sat";
4456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return weeks;
4457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string*
4461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__weeks() const
4462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const string* weeks = init_weeks();
4464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return weeks;
4465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring*
4469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__weeks() const
4470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const wstring* weeks = init_wweeks();
4472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return weeks;
4473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring*
4477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_months()
4478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string months[24];
4480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[0]  = "January";
4481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[1]  = "February";
4482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[2]  = "March";
4483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[3]  = "April";
4484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[4]  = "May";
4485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[5]  = "June";
4486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[6]  = "July";
4487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[7]  = "August";
4488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[8]  = "September";
4489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[9]  = "October";
4490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[10] = "November";
4491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[11] = "December";
4492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[12] = "Jan";
4493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[13] = "Feb";
4494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[14] = "Mar";
4495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[15] = "Apr";
4496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[16] = "May";
4497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[17] = "Jun";
4498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[18] = "Jul";
4499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[19] = "Aug";
4500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[20] = "Sep";
4501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[21] = "Oct";
4502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[22] = "Nov";
4503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[23] = "Dec";
4504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return months;
4505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring*
4509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_wmonths()
4510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring months[24];
4512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[0]  = L"January";
4513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[1]  = L"February";
4514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[2]  = L"March";
4515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[3]  = L"April";
4516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[4]  = L"May";
4517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[5]  = L"June";
4518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[6]  = L"July";
4519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[7]  = L"August";
4520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[8]  = L"September";
4521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[9]  = L"October";
4522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[10] = L"November";
4523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[11] = L"December";
4524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[12] = L"Jan";
4525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[13] = L"Feb";
4526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[14] = L"Mar";
4527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[15] = L"Apr";
4528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[16] = L"May";
4529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[17] = L"Jun";
4530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[18] = L"Jul";
4531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[19] = L"Aug";
4532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[20] = L"Sep";
4533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[21] = L"Oct";
4534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[22] = L"Nov";
4535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[23] = L"Dec";
4536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return months;
4537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string*
4541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__months() const
4542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const string* months = init_months();
4544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return months;
4545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring*
4549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__months() const
4550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const wstring* months = init_wmonths();
4552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return months;
4553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring*
4557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_am_pm()
4558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string am_pm[24];
4560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    am_pm[0]  = "AM";
4561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    am_pm[1]  = "PM";
4562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return am_pm;
4563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring*
4567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_wam_pm()
4568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring am_pm[24];
4570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    am_pm[0]  = L"AM";
4571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    am_pm[1]  = L"PM";
4572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return am_pm;
4573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string*
4577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__am_pm() const
4578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const string* am_pm = init_am_pm();
4580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return am_pm;
4581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring*
4585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__am_pm() const
4586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const wstring* am_pm = init_wam_pm();
4588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return am_pm;
4589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string&
4593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__x() const
4594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string s("%m/%d/%y");
4596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring&
4601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__x() const
4602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring s(L"%m/%d/%y");
4604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string&
4609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__X() const
4610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string s("%H:%M:%S");
4612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring&
4617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__X() const
4618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring s(L"%H:%M:%S");
4620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string&
4625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__c() const
4626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string s("%a %b %d %H:%M:%S %Y");
4628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring&
4633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__c() const
4634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring s(L"%a %b %d %H:%M:%S %Y");
4636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string&
4641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__r() const
4642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string s("%I:%M:%S %p");
4644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring&
4649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__r() const
4650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring s(L"%I:%M:%S %p");
4652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// time_get_byname
4656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get::__time_get(const char* nm)
4658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __loc_(newlocale(LC_ALL_MASK, nm, 0))
4659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4660d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__loc_ == 0)
4662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("time_get_byname"
4663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
466416e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
4665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get::__time_get(const string& nm)
4668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __loc_(newlocale(LC_ALL_MASK, nm.c_str(), 0))
4669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4670d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__loc_ == 0)
4672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("time_get_byname"
4673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + nm);
467416e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
4675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get::~__time_get()
4678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    freelocale(__loc_);
4680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4682335b1518e475a697727b76c9050b48ba6d120a3bHoward Hinnant#pragma clang diagnostic ignored "-Wmissing-field-initializers"
468321772ec06376b965fd868a68bcf55e60c5a0dcc9Howard Hinnant#pragma GCC   diagnostic ignored "-Wmissing-field-initializers"
4684335b1518e475a697727b76c9050b48ba6d120a3bHoward Hinnant
4685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring
4687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<char>::__analyze(char fmt, const ctype<char>& ct)
4688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
46893074a05cdcd53569d7c52d224c1adf0681decc0dHoward Hinnant    tm t = {0};
4690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_sec = 59;
4691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_min = 55;
4692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 23;
4693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_mday = 31;
4694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_mon = 11;
4695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_year = 161;
4696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_wday = 6;
4697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_yday = 364;
4698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_isdst = -1;
4699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char buf[100];
4700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char f[3] = {0};
4701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f[0] = '%';
4702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f[1] = fmt;
4703bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t n = strftime_l(buf, countof(buf), f, &t, __loc_);
4704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char* bb = buf;
4705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char* be = buf + n;
4706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string result;
4707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    while (bb != be)
4708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (ct.is(ctype_base::space, *bb))
4710bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(' ');
4712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++bb; bb != be && ct.is(ctype_base::space, *bb); ++bb)
4713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                ;
4714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char* w = bb;
4717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios_base::iostate err = ios_base::goodbit;
4718ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        ptrdiff_t i = __scan_keyword(w, be, this->__weeks_, this->__weeks_+14,
4719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               ct, err, false)
4720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               - this->__weeks_;
4721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i < 14)
4722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back('%');
4724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 7)
4725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('A');
4726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            else
4727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('a');
4728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            bb = w;
4729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        w = bb;
4732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i = __scan_keyword(w, be, this->__months_, this->__months_+24,
4733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           ct, err, false)
4734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           - this->__months_;
4735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i < 24)
4736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back('%');
4738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 12)
4739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('B');
4740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            else
4741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('b');
4742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (fmt == 'x' && ct.is(ctype_base::digit, this->__months_[i][0]))
4743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.back() = 'm';
4744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            bb = w;
4745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (this->__am_pm_[0].size() + this->__am_pm_[1].size() > 0)
4748bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            w = bb;
4750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            i = __scan_keyword(w, be, this->__am_pm_, this->__am_pm_+2,
4751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               ct, err, false) - this->__am_pm_;
4752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 2)
4753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
4754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('p');
4756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                bb = w;
4757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                continue;
4758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
4759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        w = bb;
4761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (ct.is(ctype_base::digit, *bb))
4762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch(__get_up_to_n_digits(bb, be, err, ct, 4))
4764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
4765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 6:
4766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('w');
4768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 7:
4770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('u');
4772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 11:
4774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('I');
4776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 12:
4778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('m');
4780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 23:
4782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('H');
4784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 31:
4786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('d');
4788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 55:
4790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('M');
4792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 59:
4794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('S');
4796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 61:
4798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('y');
4800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 364:
4802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('j');
4804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 2061:
4806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('Y');
4808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
4810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                for (; w != bb; ++w)
4811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    result.push_back(*w);
4812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
4814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*bb == '%')
4817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back('%');
4819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back('%');
4820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++bb;
4821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result.push_back(*bb);
4824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++bb;
4825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return result;
4827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4829ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant#pragma clang diagnostic ignored "-Wmissing-braces"
4830ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant
4831bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring
4833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<wchar_t>::__analyze(char fmt, const ctype<wchar_t>& ct)
4834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
48353074a05cdcd53569d7c52d224c1adf0681decc0dHoward Hinnant    tm t = {0};
4836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_sec = 59;
4837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_min = 55;
4838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 23;
4839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_mday = 31;
4840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_mon = 11;
4841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_year = 161;
4842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_wday = 6;
4843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_yday = 364;
4844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_isdst = -1;
4845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char buf[100];
4846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char f[3] = {0};
4847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f[0] = '%';
4848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f[1] = fmt;
4849bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    strftime_l(buf, countof(buf), f, &t, __loc_);
4850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t wbuf[100];
4851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t* wbb = wbuf;
4852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mbstate_t mb = {0};
4853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* bb = buf;
4854866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
4855bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = mbsrtowcs_l( wbb, &bb, countof(wbuf), &mb, __loc_);
4856f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
4857bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = __mbsrtowcs_l( wbb, &bb, countof(wbuf), &mb, __loc_);
4858f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
4859ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
4860bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
4861ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    wchar_t* wbe = wbb + j;
4862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wstring result;
4863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    while (wbb != wbe)
4864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (ct.is(ctype_base::space, *wbb))
4866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(L' ');
4868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++wbb; wbb != wbe && ct.is(ctype_base::space, *wbb); ++wbb)
4869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                ;
4870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t* w = wbb;
4873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios_base::iostate err = ios_base::goodbit;
4874ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        ptrdiff_t i = __scan_keyword(w, wbe, this->__weeks_, this->__weeks_+14,
4875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               ct, err, false)
4876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               - this->__weeks_;
4877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i < 14)
4878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(L'%');
4880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 7)
4881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'A');
4882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            else
4883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'a');
4884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            wbb = w;
4885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        w = wbb;
4888bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i = __scan_keyword(w, wbe, this->__months_, this->__months_+24,
4889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           ct, err, false)
4890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           - this->__months_;
4891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i < 24)
4892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(L'%');
4894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 12)
4895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'B');
4896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            else
4897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'b');
4898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (fmt == 'x' && ct.is(ctype_base::digit, this->__months_[i][0]))
4899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.back() = L'm';
4900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            wbb = w;
4901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (this->__am_pm_[0].size() + this->__am_pm_[1].size() > 0)
4904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            w = wbb;
4906bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            i = __scan_keyword(w, wbe, this->__am_pm_, this->__am_pm_+2,
4907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               ct, err, false) - this->__am_pm_;
4908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 2)
4909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
4910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'p');
4912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                wbb = w;
4913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                continue;
4914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
4915bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        w = wbb;
4917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (ct.is(ctype_base::digit, *wbb))
4918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch(__get_up_to_n_digits(wbb, wbe, err, ct, 4))
4920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
4921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 6:
4922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'w');
4924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 7:
4926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'u');
4928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 11:
4930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'I');
4932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 12:
4934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'm');
4936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 23:
4938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'H');
4940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 31:
4942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'd');
4944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 55:
4946bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'M');
4948bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4949bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 59:
4950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4951bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'S');
4952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 61:
4954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'y');
4956bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 364:
4958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'j');
4960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 2061:
4962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'Y');
4964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
4966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                for (; w != wbb; ++w)
4967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    result.push_back(*w);
4968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
4970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (ct.narrow(*wbb, 0) == '%')
4973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(L'%');
4975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(L'%');
4976bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++wbb;
4977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4978bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result.push_back(*wbb);
4980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++wbb;
4981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return result;
4983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
4987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<char>::init(const ctype<char>& ct)
4988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4989cd9923623167203ae0477cacb9fa49113595c298Howard Hinnant    tm t = {0};
4990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char buf[100];
4991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __weeks_
4992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < 7; ++i)
4993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4994bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        t.tm_wday = i;
4995bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%A", &t, __loc_);
4996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __weeks_[i] = buf;
4997bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%a", &t, __loc_);
4998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __weeks_[i+7] = buf;
4999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __months_
5001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < 12; ++i)
5002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        t.tm_mon = i;
5004bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%B", &t, __loc_);
5005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __months_[i] = buf;
5006bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%b", &t, __loc_);
5007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __months_[i+12] = buf;
5008bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5009bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __am_pm_
5010bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 1;
5011bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    strftime_l(buf, countof(buf), "%p", &t, __loc_);
5012bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __am_pm_[0] = buf;
5013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 13;
5014bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    strftime_l(buf, countof(buf), "%p", &t, __loc_);
5015bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __am_pm_[1] = buf;
5016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __c_ = __analyze('c', ct);
5017bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __r_ = __analyze('r', ct);
5018bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __x_ = __analyze('x', ct);
5019bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __X_ = __analyze('X', ct);
5020bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5021bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5022bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<wchar_t>::init(const ctype<wchar_t>& ct)
5025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5026bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    tm t = {0};
5027bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char buf[100];
5028bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t wbuf[100];
5029bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t* wbe;
5030bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mbstate_t mb = {0};
5031bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __weeks_
5032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < 7; ++i)
5033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5034bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        t.tm_wday = i;
5035bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%A", &t, __loc_);
5036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5037bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        const char* bb = buf;
5038866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5039bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5040f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5041bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5042f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5043ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5046bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __weeks_[i].assign(wbuf, wbe);
5047bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%a", &t, __loc_);
5048bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5049bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = buf;
5050866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5051bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5052f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5053bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5054f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5055ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5056bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5057bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5058bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __weeks_[i+7].assign(wbuf, wbe);
5059bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5060bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __months_
5061bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < 12; ++i)
5062bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5063bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        t.tm_mon = i;
5064bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%B", &t, __loc_);
5065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        const char* bb = buf;
5067866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5068bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5069f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5070bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5071f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5072ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5073bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5074bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __months_[i].assign(wbuf, wbe);
5076bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%b", &t, __loc_);
5077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = buf;
5079866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5080bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5081f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5082bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5083f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5084ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5085bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5086bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __months_[i+12].assign(wbuf, wbe);
5088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __am_pm_
5090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 1;
5091bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    strftime_l(buf, countof(buf), "%p", &t, __loc_);
5092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mb = mbstate_t();
5093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* bb = buf;
5094866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5095bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5096f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5097bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5098f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5099ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
5100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
5101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wbe = wbuf + j;
5102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __am_pm_[0].assign(wbuf, wbe);
5103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 13;
5104bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    strftime_l(buf, countof(buf), "%p", &t, __loc_);
5105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mb = mbstate_t();
5106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bb = buf;
5107866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5108bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5109f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5110bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5111f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5112ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
5113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
5114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wbe = wbuf + j;
5115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __am_pm_[1].assign(wbuf, wbe);
5116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __c_ = __analyze('c', ct);
5117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __r_ = __analyze('r', ct);
5118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __x_ = __analyze('x', ct);
5119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __X_ = __analyze('X', ct);
5120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class CharT>
5123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct _LIBCPP_HIDDEN __time_get_temp
5124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public ctype_byname<CharT>
5125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit __time_get_temp(const char* nm)
5127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : ctype_byname<CharT>(nm, 1) {}
5128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit __time_get_temp(const string& nm)
5129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : ctype_byname<CharT>(nm, 1) {}
5130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
5131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<char>::__time_get_storage(const char* __nm)
5134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __time_get(__nm)
5135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const __time_get_temp<char> ct(__nm);
5137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    init(ct);
5138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<char>::__time_get_storage(const string& __nm)
5142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __time_get(__nm)
5143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const __time_get_temp<char> ct(__nm);
5145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    init(ct);
5146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<wchar_t>::__time_get_storage(const char* __nm)
5150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __time_get(__nm)
5151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const __time_get_temp<wchar_t> ct(__nm);
5153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    init(ct);
5154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<wchar_t>::__time_get_storage(const string& __nm)
5158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __time_get(__nm)
5159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const __time_get_temp<wchar_t> ct(__nm);
5161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    init(ct);
5162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttime_base::dateorder
5166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<char>::__do_date_order() const
5167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unsigned i;
5169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (i = 0; i < __x_.size(); ++i)
5170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == '%')
5171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ++i;
5173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    switch (__x_[i])
5174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case 'y':
5176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case 'Y':
5177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == '%')
5179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (__x_[i])
5184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case 'm':
5186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == '%')
5188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == 'd')
5193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::ymd;
5194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case 'd':
5196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == '%')
5198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == 'm')
5203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::ydm;
5204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case 'm':
5208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == '%')
5210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == 'd')
5215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == '%')
5218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == 'y' || __x_[i] == 'Y')
5223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::mdy;
5224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case 'd':
5228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == '%')
5230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == 'm')
5235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == '%')
5238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == 'y' || __x_[i] == 'Y')
5243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::dmy;
5244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return time_base::no_order;
5249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttime_base::dateorder
5253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<wchar_t>::__do_date_order() const
5254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unsigned i;
5256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (i = 0; i < __x_.size(); ++i)
5257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == L'%')
5258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ++i;
5260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    switch (__x_[i])
5261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case L'y':
5263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case L'Y':
5264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'%')
5266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (__x_[i])
5271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case L'm':
5273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == L'%')
5275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'd')
5280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::ymd;
5281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case L'd':
5283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == L'%')
5285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'm')
5290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::ydm;
5291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case L'm':
5295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'%')
5297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == L'd')
5302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == L'%')
5305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'y' || __x_[i] == L'Y')
5310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::mdy;
5311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case L'd':
5315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'%')
5317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == L'm')
5322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == L'%')
5325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'y' || __x_[i] == L'Y')
5330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::dmy;
5331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return time_base::no_order;
5336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// time_put
5339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_put::__time_put(const char* nm)
5341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __loc_(newlocale(LC_ALL_MASK, nm, 0))
5342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5343d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__loc_ == 0)
5345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("time_put_byname"
5346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
534716e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_put::__time_put(const string& nm)
5351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __loc_(newlocale(LC_ALL_MASK, nm.c_str(), 0))
5352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5353d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__loc_ == 0)
5355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("time_put_byname"
5356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + nm);
535716e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_put::~__time_put()
5361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
53629a06b9d017adae19f9289b96303b9985d60403f3Joerg Sonnenberger    if (__loc_ != _LIBCPP_GET_C_LOCALE)
5363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        freelocale(__loc_);
5364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_put::__do_put(char* __nb, char*& __ne, const tm* __tm,
5368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                     char __fmt, char __mod) const
5369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char fmt[] = {'%', __fmt, __mod, 0};
5371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__mod != 0)
5372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        swap(fmt[1], fmt[2]);
5373bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t n = strftime_l(__nb, countof(__nb, __ne), fmt, __tm, __loc_);
5374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __ne = __nb + n;
5375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_put::__do_put(wchar_t* __wb, wchar_t*& __we, const tm* __tm,
5379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                     char __fmt, char __mod) const
5380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char __nar[100];
5382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char* __ne = __nar + 100;
5383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __do_put(__nar, __ne, __tm, __fmt, __mod);
5384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mbstate_t mb = {0};
5385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* __nb = __nar;
5386866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5387bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = mbsrtowcs_l(__wb, &__nb, countof(__wb, __we), &mb, __loc_);
5388f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5389bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = __mbsrtowcs_l(__wb, &__nb, countof(__wb, __we), &mb, __loc_);
5390f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5391ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
5392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
5393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __we = __wb + j;
5394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// moneypunct_byname
5397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5398558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskintemplate <class charT>
5399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
5400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5401558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin__init_pat(money_base::pattern& pat, basic_string<charT>& __curr_symbol_,
5402558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin           bool intl, char cs_precedes, char sep_by_space, char sign_posn,
5403558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin           charT space_char)
5404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char sign = static_cast<char>(money_base::sign);
5406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char space = static_cast<char>(money_base::space);
5407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char none = static_cast<char>(money_base::none);
5408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char symbol = static_cast<char>(money_base::symbol);
5409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char value = static_cast<char>(money_base::value);
5410558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    const bool symbol_contains_sep = intl && __curr_symbol_.size() == 4;
5411558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin
5412558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Comments on case branches reflect 'C11 7.11.2.1 The localeconv
5413558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // function'. "Space between sign and symbol or value" means that
5414558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // if the sign is adjacent to the symbol, there's a space between
5415558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // them, and otherwise there's a space between the sign and value.
5416558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    //
5417558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // C11's localeconv specifies that the fourth character of an
5418558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // international curr_symbol is used to separate the sign and
5419558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // value when sep_by_space says to do so. C++ can't represent
5420558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // that, so we just use a space.  When sep_by_space says to
5421558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // separate the symbol and value-or-sign with a space, we rearrange the
5422558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // curr_symbol to put its spacing character on the correct side of
5423558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // the symbol.
5424558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    //
5425558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // We also need to avoid adding an extra space between the sign
5426558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // and value when the currency symbol is suppressed (by not
5427558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // setting showbase).  We match glibc's strfmon by interpreting
5428558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // sep_by_space==1 as "omit the space when the currency symbol is
5429558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // absent".
5430558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    //
5431558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Users who want to get this right should use ICU instead.
5432558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin
5433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    switch (cs_precedes)
5434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5435558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    case 0:  // value before curr_symbol
5436558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        if (symbol_contains_sep) {
5437558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            // Move the separator to before the symbol, to place it
5438558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            // between the value and symbol.
5439558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            rotate(__curr_symbol_.begin(), __curr_symbol_.begin() + 3,
5440558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                   __curr_symbol_.end());
5441558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        }
5442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (sign_posn)
5443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5444558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 0:  // Parentheses surround the quantity and currency symbol.
5445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = sign;
5446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[1] = value;
5447558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            pat.field[2] = none;  // Any space appears in the symbol.
5448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = symbol;
5449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5451558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5452558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // This case may have changed between C99 and C11;
5453558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // assume the currency symbol matches the intention.
5454558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5455558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // The "sign" is two parentheses, so no space here either.
5456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5457558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5458558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5459558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5460558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5461558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5462558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5463558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5469558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 1:  // The sign string precedes the quantity and currency symbol.
5470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = sign;
5471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = symbol;
5472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5474558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = value;
5476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = none;
5477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5478558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = value;
5480558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[2] = none;
5481558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5482558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5483558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5484558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5485558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5486558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5488558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = space;
5490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = value;
5491558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5492558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5493558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // has already appeared after the sign.
5494558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.erase(__curr_symbol_.begin());
5495558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5501558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 2:  // The sign string succeeds the quantity and currency symbol.
5502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = value;
5503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = sign;
5504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5506558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = none;
5508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5510558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5511558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5512558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5513558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[1]=space so that when
5514558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5515558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5516558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5517558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[1] = none;
5518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5520558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = symbol;
5522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = space;
5523558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5524558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5525558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // should not be removed if showbase is absent.
5526558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.erase(__curr_symbol_.begin());
5527558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5533558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 3:  // The sign string immediately precedes the currency symbol.
5534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = value;
5535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = symbol;
5536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5538558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = none;
5540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = sign;
5541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5542558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = space;
5544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = sign;
5545558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5546558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5547558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // has already appeared before the sign.
5548558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.erase(__curr_symbol_.begin());
5549558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5551558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = sign;
5553558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[2] = none;
5554558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5555558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5556558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5557558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5558558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5559558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5565558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 4:  // The sign string immediately succeeds the currency symbol.
5566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = value;
5567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = sign;
5568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5570558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = none;
5572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5574558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5575558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[1] = none;
5576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5577558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5578558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5579558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[1]=space so that when
5580558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5581558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5582558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5584558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = symbol;
5586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = space;
5587558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5588558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5589558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // should not disappear when showbase is absent.
5590558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.erase(__curr_symbol_.begin());
5591558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        default:
5598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5601558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    case 1:  // curr_symbol before value
5602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (sign_posn)
5603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5604558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 0:  // Parentheses surround the quantity and currency symbol.
5605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = sign;
5606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[1] = symbol;
5607558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            pat.field[2] = none;  // Any space appears in the symbol.
5608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = value;
5609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5611558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5612558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // This case may have changed between C99 and C11;
5613558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // assume the currency symbol matches the intention.
5614558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5615558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // The "sign" is two parentheses, so no space here either.
5616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5617558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5618558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5619558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5620558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5621558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5622558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5623558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5629558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 1:  // The sign string precedes the quantity and currency symbol.
5630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = sign;
5631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = value;
5632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5634558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = symbol;
5636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = none;
5637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5638558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = symbol;
5640558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[2] = none;
5641558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5642558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5643558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5644558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5645558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.push_back(space_char);
5646558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5648558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = space;
5650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5651558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5652558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5653558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // has already appeared after the sign.
5654558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.pop_back();
5655558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5661558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 2:  // The sign string succeeds the quantity and currency symbol.
5662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = symbol;
5663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = sign;
5664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5666558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = none;
5668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = value;
5669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5670558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5671558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[1] = none;
5672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = value;
5673558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5674558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5675558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[1]=space so that when
5676558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5677558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.push_back(space_char);
5678558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5680558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = value;
5682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = space;
5683558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5684558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5685558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // will appear before the sign.
5686558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.pop_back();
5687558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5693558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 3:  // The sign string immediately precedes the currency symbol.
5694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = sign;
5695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = value;
5696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5698558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = symbol;
5700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = none;
5701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5702558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = symbol;
5704558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[2] = none;
5705558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5706558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5707558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5708558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5709558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.push_back(space_char);
5710558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5712558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = space;
5714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5715558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5716558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5717558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // has already appeared after the sign.
5718558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.pop_back();
5719558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5725558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 4:  // The sign string immediately succeeds the currency symbol.
5726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = symbol;
5727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = value;
5728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5730558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = sign;
5732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = none;
5733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5734558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = sign;
5736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = space;
5737558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5738558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5739558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // should not disappear when showbase is absent.
5740558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.pop_back();
5741558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5743558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5744558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[1] = none;
5745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = sign;
5746558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5747558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5748558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[1]=space so that when
5749558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5750558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.push_back(space_char);
5751558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant           default:
5754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        default:
5758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    default:
5762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    pat.field[0] = symbol;
5765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    pat.field[1] = sign;
5766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    pat.field[2] = none;
5767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    pat.field[3] = value;
5768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<>
5771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmoneypunct_byname<char, false>::init(const char* nm)
5773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef moneypunct<char, false> base;
5775f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5776d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
577705b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant    if (loc == nullptr)
5778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("moneypunct_byname"
5779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
578016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5781866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5782f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = localeconv_l(loc.get());
5783f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5784f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = __localeconv_l(loc.get());
5785f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_decimal_point)
5787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = *lc->mon_decimal_point;
5788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = base::do_decimal_point();
5790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_thousands_sep)
5791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = *lc->mon_thousands_sep;
5792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = base::do_thousands_sep();
5794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __grouping_ = lc->mon_grouping;
5795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __curr_symbol_ = lc->currency_symbol;
5796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->frac_digits != CHAR_MAX)
5797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = lc->frac_digits;
5798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = base::do_frac_digits();
5800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->p_sign_posn == 0)
5801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = "()";
5802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = lc->positive_sign;
5804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->n_sign_posn == 0)
5805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = "()";
5806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = lc->negative_sign;
5808558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Assume the positive and negative formats will want spaces in
5809558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // the same places in curr_symbol since there's no way to
5810558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // represent anything else.
5811558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    string_type __dummy_curr_symbol = __curr_symbol_;
5812558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, false,
5813558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' ');
5814558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, false,
5815558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' ');
5816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<>
5819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmoneypunct_byname<char, true>::init(const char* nm)
5821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef moneypunct<char, true> base;
5823f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5824d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
582505b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant    if (loc == nullptr)
5826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("moneypunct_byname"
5827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
582816e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5829866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5830f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = localeconv_l(loc.get());
5831f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5832f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = __localeconv_l(loc.get());
5833f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_decimal_point)
5835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = *lc->mon_decimal_point;
5836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = base::do_decimal_point();
5838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_thousands_sep)
5839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = *lc->mon_thousands_sep;
5840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = base::do_thousands_sep();
5842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __grouping_ = lc->mon_grouping;
5843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __curr_symbol_ = lc->int_curr_symbol;
5844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_frac_digits != CHAR_MAX)
5845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = lc->int_frac_digits;
5846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = base::do_frac_digits();
5848a22d2addb1287a7642bfcb211ae2cb21890d1cbdMarshall Clow#ifdef _WIN32
58496cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant    if (lc->p_sign_posn == 0)
58506cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#else // _WIN32
5851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_p_sign_posn == 0)
58526cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#endif //_WIN32
5853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = "()";
5854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5855bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = lc->positive_sign;
5856a22d2addb1287a7642bfcb211ae2cb21890d1cbdMarshall Clow#ifdef _WIN32
58576cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant    if(lc->n_sign_posn == 0)
58586cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#else // _WIN32
5859bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_n_sign_posn == 0)
58606cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#endif // _WIN32
5861bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = "()";
5862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = lc->negative_sign;
5864558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Assume the positive and negative formats will want spaces in
5865558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // the same places in curr_symbol since there's no way to
5866558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // represent anything else.
5867558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    string_type __dummy_curr_symbol = __curr_symbol_;
5868a22d2addb1287a7642bfcb211ae2cb21890d1cbdMarshall Clow#ifdef _WIN32
5869558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, true,
5870558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' ');
5871558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, true,
5872558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' ');
58736cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#else
5874558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, true,
5875558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_p_cs_precedes, lc->int_p_sep_by_space,
5876558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_p_sign_posn, ' ');
5877558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, true,
5878558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_n_cs_precedes, lc->int_n_sep_by_space,
5879558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_n_sign_posn, ' ');
58806cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#endif // _WIN32
5881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<>
5884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmoneypunct_byname<wchar_t, false>::init(const char* nm)
5886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef moneypunct<wchar_t, false> base;
5888f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5889d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
589005b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant    if (loc == nullptr)
5891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("moneypunct_byname"
5892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
589316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5894866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5895f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = localeconv_l(loc.get());
5896f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5897f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = __localeconv_l(loc.get());
5898f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_decimal_point)
5900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = static_cast<wchar_t>(*lc->mon_decimal_point);
5901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = base::do_decimal_point();
5903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_thousands_sep)
5904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = static_cast<wchar_t>(*lc->mon_thousands_sep);
5905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5906bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = base::do_thousands_sep();
5907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __grouping_ = lc->mon_grouping;
5908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t wbuf[100];
5909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mbstate_t mb = {0};
5910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* bb = lc->currency_symbol;
5911866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5912bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5913f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5914bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5915f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5916ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
5917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
5918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t* wbe = wbuf + j;
5919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __curr_symbol_.assign(wbuf, wbe);
5920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->frac_digits != CHAR_MAX)
5921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = lc->frac_digits;
5922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = base::do_frac_digits();
5924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->p_sign_posn == 0)
5925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = L"()";
5926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = lc->positive_sign;
5930866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5931bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5932f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5933bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5934f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5935ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_.assign(wbuf, wbe);
5939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->n_sign_posn == 0)
5941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = L"()";
5942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = lc->negative_sign;
5946866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5947bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5948f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5949bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5950f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5951ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_.assign(wbuf, wbe);
5955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5956558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Assume the positive and negative formats will want spaces in
5957558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // the same places in curr_symbol since there's no way to
5958558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // represent anything else.
5959558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    string_type __dummy_curr_symbol = __curr_symbol_;
5960558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, false,
5961558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' ');
5962558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, false,
5963558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' ');
5964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<>
5967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmoneypunct_byname<wchar_t, true>::init(const char* nm)
5969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef moneypunct<wchar_t, true> base;
5971f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5972d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
597305b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant    if (loc == nullptr)
5974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("moneypunct_byname"
5975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
597616e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5977866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5978f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = localeconv_l(loc.get());
5979f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5980f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = __localeconv_l(loc.get());
5981f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_decimal_point)
5983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = static_cast<wchar_t>(*lc->mon_decimal_point);
5984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = base::do_decimal_point();
5986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_thousands_sep)
5987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = static_cast<wchar_t>(*lc->mon_thousands_sep);
5988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = base::do_thousands_sep();
5990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __grouping_ = lc->mon_grouping;
5991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t wbuf[100];
5992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mbstate_t mb = {0};
5993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* bb = lc->int_curr_symbol;
5994866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5995bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5996f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5997bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5998f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5999ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
6000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
6001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t* wbe = wbuf + j;
6002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __curr_symbol_.assign(wbuf, wbe);
6003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_frac_digits != CHAR_MAX)
6004bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = lc->int_frac_digits;
6005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
6006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = base::do_frac_digits();
6007a22d2addb1287a7642bfcb211ae2cb21890d1cbdMarshall Clow#ifdef _WIN32
60086cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant    if (lc->p_sign_posn == 0)
60096cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#else // _WIN32
6010bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_p_sign_posn == 0)
60116cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#endif // _WIN32
6012bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = L"()";
6013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
6014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
6015bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
6016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = lc->positive_sign;
6017866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
6018bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6019f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
6020bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6021f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
6022ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
6023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
6024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
6025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_.assign(wbuf, wbe);
6026bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
6027a22d2addb1287a7642bfcb211ae2cb21890d1cbdMarshall Clow#ifdef _WIN32
60286cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant    if (lc->n_sign_posn == 0)
60296cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#else // _WIN32
6030bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_n_sign_posn == 0)
60316cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#endif // _WIN32
6032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = L"()";
6033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
6034bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
6035bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
6036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = lc->negative_sign;
6037866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
6038bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6039f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
6040bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6041f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
6042ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
6043bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
6044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
6045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_.assign(wbuf, wbe);
6046bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
6047558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Assume the positive and negative formats will want spaces in
6048558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // the same places in curr_symbol since there's no way to
6049558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // represent anything else.
6050558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    string_type __dummy_curr_symbol = __curr_symbol_;
6051a22d2addb1287a7642bfcb211ae2cb21890d1cbdMarshall Clow#ifdef _WIN32
6052558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, true,
6053558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' ');
6054558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, true,
6055558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' ');
60566cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#else // _WIN32
6057558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, true,
6058558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_p_cs_precedes, lc->int_p_sep_by_space,
6059558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_p_sign_posn, L' ');
6060558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, true,
6061558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_n_cs_precedes, lc->int_n_sep_by_space,
6062558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_n_sign_posn, L' ');
60636cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant#endif // _WIN32
6064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
6065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid __do_nothing(void*) {}
6067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid __throw_runtime_error(const char* msg)
6069bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
6070d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6071bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    throw runtime_error(msg);
6072db4d478ff421cd1b1be254264367ceceebf39481Howard Hinnant#else
6073db4d478ff421cd1b1be254264367ceceebf39481Howard Hinnant    (void)msg;
6074d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#endif
6075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
6076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class collate<char>;
6078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class collate<wchar_t>;
6079bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6080bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class num_get<char>;
6081bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class num_get<wchar_t>;
6082bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6083ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnanttemplate struct __num_get<char>;
6084ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnanttemplate struct __num_get<wchar_t>;
6085bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6086bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class num_put<char>;
6087bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class num_put<wchar_t>;
6088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6089ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnanttemplate struct __num_put<char>;
6090ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnanttemplate struct __num_put<wchar_t>;
6091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_get<char>;
6093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_get<wchar_t>;
6094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_get_byname<char>;
6096bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_get_byname<wchar_t>;
6097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_put<char>;
6099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_put<wchar_t>;
6100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_put_byname<char>;
6102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_put_byname<wchar_t>;
6103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct<char, false>;
6105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct<char, true>;
6106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct<wchar_t, false>;
6107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct<wchar_t, true>;
6108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct_byname<char, false>;
6110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct_byname<char, true>;
6111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct_byname<wchar_t, false>;
6112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct_byname<wchar_t, true>;
6113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class money_get<char>;
6115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class money_get<wchar_t>;
6116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class __money_get<char>;
6118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class __money_get<wchar_t>;
6119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class money_put<char>;
6121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class money_put<wchar_t>;
6122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class __money_put<char>;
6124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class __money_put<wchar_t>;
6125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class messages<char>;
6127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class messages<wchar_t>;
6128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class messages_byname<char>;
6130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class messages_byname<wchar_t>;
6131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class codecvt_byname<char, char, mbstate_t>;
6133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class codecvt_byname<wchar_t, char, mbstate_t>;
6134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class codecvt_byname<char16_t, char, mbstate_t>;
6135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class codecvt_byname<char32_t, char, mbstate_t>;
6136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class __vector_base_common<true>;
6138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD
6140