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
1004a2c71d674a261e65d5afc603b7a3efa77e88efHoward Hinnant#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
1104a2c71d674a261e65d5afc603b7a3efa77e88efHoward Hinnant
12997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall// On Solaris, we need to define something to make the C99 parts of localeconv
13997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall// visible.
14997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall#ifdef __sun__
15997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall#define _LCONV_C99
16997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall#endif
17997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall
18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "string"
19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "locale"
2087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant#include "codecvt"
21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "vector"
22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "algorithm"
23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "typeinfo"
24b87922c2c5d55dc021733d39a99e4297cb60cc31Howard Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
25b87922c2c5d55dc021733d39a99e4297cb60cc31Howard Hinnant#  include "type_traits"
26b87922c2c5d55dc021733d39a99e4297cb60cc31Howard Hinnant#endif
27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "clocale"
28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "cstring"
29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "cwctype"
30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include "__sso_allocator"
31ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
3214fa9f9d8ff5a4541404f3e23b91188e74c56f31Howard Hinnant#include <support/win32/locale_win32.h>
33d4ecf9c8c3b240202c61ad97e6458f7a41c26f5fMarshall Clow#elif !defined(__ANDROID__)
34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <langinfo.h>
35d4ecf9c8c3b240202c61ad97e6458f7a41c26f5fMarshall Clow#endif
36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <stdlib.h>
37ed14a76beba8f2a0e30f5c66d327d60f87a75921Howard Hinnant#include <stdio.h>
38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
399ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow// On Linux, wint_t and wchar_t have different signed-ness, and this causes
409ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow// lots of noise in the build log, but no bugs that I know of.
41a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#if defined(__clang__)
429ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow#pragma clang diagnostic ignored "-Wsign-conversion"
43a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#endif
449ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow
45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
47866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef __cloc_defined
4862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Huntlocale_t __cloc() {
4962a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  // In theory this could create a race condition. In practice
5062a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  // the race condition is non-fatal since it will just create
5162a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  // a little resource leak. Better approach would be appreciated.
5262a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  static locale_t result = newlocale(LC_ALL_MASK, "C", 0);
5362a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  return result;
5462a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt}
55866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#endif // __cloc_defined
5662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt
57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace {
58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct release
60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void operator()(locale::facet* p) {p->__release_shared();}
62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T, class A0>
65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline
66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantT&
67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmake(A0 a0)
68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static typename aligned_storage<sizeof(T)>::type buf;
70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ::new (&buf) T(a0);
714c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    return *reinterpret_cast<T*>(&buf);
72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T, class A0, class A1>
75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline
76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantT&
77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmake(A0 a0, A1 a1)
78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static typename aligned_storage<sizeof(T)>::type buf;
80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ::new (&buf) T(a0, a1);
814c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    return *reinterpret_cast<T*>(&buf);
82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class T, class A0, class A1, class A2>
85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline
86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard HinnantT&
87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmake(A0 a0, A1 a1, A2 a2)
88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static typename aligned_storage<sizeof(T)>::type buf;
90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ::new (&buf) T(a0, a1, a2);
914c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    return *reinterpret_cast<T*>(&buf);
92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
94bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnanttemplate <typename T, size_t N>
9521772ec06376b965fd868a68bcf55e60c5a0dcc9Howard Hinnantinline
96bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant_LIBCPP_CONSTEXPR
97bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnantsize_t
98bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnantcountof(const T (&)[N])
99bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant{
100bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    return N;
101bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant}
102bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant
103bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnanttemplate <typename T>
10421772ec06376b965fd868a68bcf55e60c5a0dcc9Howard Hinnantinline
105bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant_LIBCPP_CONSTEXPR
106bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnantsize_t
107bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnantcountof(const T * const begin, const T * const end)
108bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant{
109bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    return static_cast<size_t>(end - begin);
110bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant}
111bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant
112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1145143722d1440fccadbfa0848152bd2e9d76e0fcbHoward Hinnant#if defined(_AIX)
1155143722d1440fccadbfa0848152bd2e9d76e0fcbHoward Hinnant// Set priority to INT_MIN + 256 + 150
1165143722d1440fccadbfa0848152bd2e9d76e0fcbHoward Hinnant# pragma priority ( -2147483242 )
1175143722d1440fccadbfa0848152bd2e9d76e0fcbHoward Hinnant#endif
1185143722d1440fccadbfa0848152bd2e9d76e0fcbHoward Hinnant
1190a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::none;
1200a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::collate;
1210a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::ctype;
1220a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::monetary;
1230a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::numeric;
1240a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::time;
1250a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::messages;
1260a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst locale::category locale::all;
1270a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant
128a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#if defined(__clang__)
129ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant#pragma clang diagnostic push
130ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant#pragma clang diagnostic ignored "-Wpadded"
131a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#endif
132ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant
133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass _LIBCPP_HIDDEN locale::__imp
134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public facet
135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    enum {N = 28};
137a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#if defined(_LIBCPP_MSVC)
138a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow// FIXME: MSVC doesn't support aligned parameters by value.
139a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow// I can't get the __sso_allocator to work here
140a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow// for MSVC I think for this reason.
141a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow    vector<facet*> facets_;
142a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#else
143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    vector<facet*, __sso_allocator<facet*, N> > facets_;
144a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#endif
145ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    string         name_;
146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit __imp(size_t refs = 0);
148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit __imp(const string& name, size_t refs = 0);
149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __imp(const __imp&);
150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __imp(const __imp&, const string&, locale::category c);
151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __imp(const __imp& other, const __imp& one, locale::category c);
152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __imp(const __imp&, facet* f, long id);
153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ~__imp();
154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const string& name() const {return name_;}
156ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    bool has_facet(long id) const
157ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        {return static_cast<size_t>(id) < facets_.size() && facets_[static_cast<size_t>(id)];}
158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const locale::facet* use_facet(long id) const;
159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const locale& make_classic();
161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static       locale& make_global();
162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantprivate:
163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void install(facet* f, long id);
164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class F> void install(F* f) {install(f, f->id.__get());}
165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    template <class F> void install_from(const __imp& other);
166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
168a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#if defined(__clang__)
169ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant#pragma clang diagnostic pop
170a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#endif
171ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant
172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(size_t refs)
173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : facet(refs),
174ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      facets_(N),
175ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_("C")
176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    facets_.clear();
178ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::collate<char> >(1u));
179ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::collate<wchar_t> >(1u));
1804c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    install(&make<_VSTD::ctype<char> >(nullptr, false, 1u));
181ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::ctype<wchar_t> >(1u));
182ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<codecvt<char, char, mbstate_t> >(1u));
183ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<codecvt<wchar_t, char, mbstate_t> >(1u));
184ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<codecvt<char16_t, char, mbstate_t> >(1u));
185ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<codecvt<char32_t, char, mbstate_t> >(1u));
186ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<numpunct<char> >(1u));
187ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<numpunct<wchar_t> >(1u));
188ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<num_get<char> >(1u));
189ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<num_get<wchar_t> >(1u));
190ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<num_put<char> >(1u));
191ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<num_put<wchar_t> >(1u));
192ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<moneypunct<char, false> >(1u));
193ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<moneypunct<char, true> >(1u));
194ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<moneypunct<wchar_t, false> >(1u));
195ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<moneypunct<wchar_t, true> >(1u));
196ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<money_get<char> >(1u));
197ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<money_get<wchar_t> >(1u));
198ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<money_put<char> >(1u));
199ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<money_put<wchar_t> >(1u));
200ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<time_get<char> >(1u));
201ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<time_get<wchar_t> >(1u));
202ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<time_put<char> >(1u));
203ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<time_put<wchar_t> >(1u));
204ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::messages<char> >(1u));
205ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    install(&make<_VSTD::messages<wchar_t> >(1u));
206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(const string& name, size_t refs)
209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : facet(refs),
210ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      facets_(N),
211ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_(name)
212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
213d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    try
215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
21616e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        facets_ = locale::classic().__locale_->facets_;
218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < facets_.size(); ++i)
219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (facets_[i])
220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                facets_[i]->__add_shared();
221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new collate_byname<char>(name_));
222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new collate_byname<wchar_t>(name_));
223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new ctype_byname<char>(name_));
224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new ctype_byname<wchar_t>(name_));
225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new codecvt_byname<char, char, mbstate_t>(name_));
226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new codecvt_byname<wchar_t, char, mbstate_t>(name_));
227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new codecvt_byname<char16_t, char, mbstate_t>(name_));
228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new codecvt_byname<char32_t, char, mbstate_t>(name_));
229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new numpunct_byname<char>(name_));
230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new numpunct_byname<wchar_t>(name_));
231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new moneypunct_byname<char, false>(name_));
232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new moneypunct_byname<char, true>(name_));
233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new moneypunct_byname<wchar_t, false>(name_));
234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new moneypunct_byname<wchar_t, true>(name_));
235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new time_get_byname<char>(name_));
236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new time_get_byname<wchar_t>(name_));
237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new time_put_byname<char>(name_));
238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new time_put_byname<wchar_t>(name_));
239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new messages_byname<char>(name_));
240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        install(new messages_byname<wchar_t>(name_));
241d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    catch (...)
244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < facets_.size(); ++i)
246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (facets_[i])
247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                facets_[i]->__release_shared();
248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw;
249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
25016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
25321772ec06376b965fd868a68bcf55e60c5a0dcc9Howard Hinnant// NOTE avoid the `base class should be explicitly initialized in the
2545f767b7b28b28a1cd1d9950e3dd4b7bedf555d02Howard Hinnant// copy constructor` warning emitted by GCC
255e58bc12f2aa9548ec3c5fe657dffa2024b5926c1Joerg Sonnenberger#if defined(__clang__) || _GNUC_VER >= 406
2565f767b7b28b28a1cd1d9950e3dd4b7bedf555d02Howard Hinnant#pragma GCC diagnostic push
25721772ec06376b965fd868a68bcf55e60c5a0dcc9Howard Hinnant#pragma GCC diagnostic ignored "-Wextra"
258e58bc12f2aa9548ec3c5fe657dffa2024b5926c1Joerg Sonnenberger#endif
2595f767b7b28b28a1cd1d9950e3dd4b7bedf555d02Howard Hinnant
260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(const __imp& other)
261ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    : facets_(max<size_t>(N, other.facets_.size())),
262ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_(other.name_)
263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    facets_ = other.facets_;
265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < facets_.size(); ++i)
266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (facets_[i])
267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            facets_[i]->__add_shared();
268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
270e58bc12f2aa9548ec3c5fe657dffa2024b5926c1Joerg Sonnenberger#if defined(__clang__) || _GNUC_VER >= 406
2715f767b7b28b28a1cd1d9950e3dd4b7bedf555d02Howard Hinnant#pragma GCC diagnostic pop
272e58bc12f2aa9548ec3c5fe657dffa2024b5926c1Joerg Sonnenberger#endif
2735f767b7b28b28a1cd1d9950e3dd4b7bedf555d02Howard Hinnant
274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(const __imp& other, const string& name, locale::category c)
275ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    : facets_(N),
276ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_("*")
277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    facets_ = other.facets_;
279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < facets_.size(); ++i)
280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (facets_[i])
281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            facets_[i]->__add_shared();
282d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    try
284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
28516e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::collate)
287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new collate_byname<char>(name));
289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new collate_byname<wchar_t>(name));
290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::ctype)
292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new ctype_byname<char>(name));
294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new ctype_byname<wchar_t>(name));
295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new codecvt_byname<char, char, mbstate_t>(name));
296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new codecvt_byname<wchar_t, char, mbstate_t>(name));
297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new codecvt_byname<char16_t, char, mbstate_t>(name));
298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new codecvt_byname<char32_t, char, mbstate_t>(name));
299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::monetary)
301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new moneypunct_byname<char, false>(name));
303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new moneypunct_byname<char, true>(name));
304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new moneypunct_byname<wchar_t, false>(name));
305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new moneypunct_byname<wchar_t, true>(name));
306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::numeric)
308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new numpunct_byname<char>(name));
310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new numpunct_byname<wchar_t>(name));
311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::time)
313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new time_get_byname<char>(name));
315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new time_get_byname<wchar_t>(name));
316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new time_put_byname<char>(name));
317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new time_put_byname<wchar_t>(name));
318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::messages)
320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new messages_byname<char>(name));
322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install(new messages_byname<wchar_t>(name));
323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
324d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    catch (...)
327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < facets_.size(); ++i)
329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (facets_[i])
330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                facets_[i]->__release_shared();
331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw;
332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
33316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<class F>
337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinline
338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::install_from(const locale::__imp& one)
340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    long id = F::id.__get();
342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    install(const_cast<F*>(static_cast<const F*>(one.use_facet(id))), id);
343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(const __imp& other, const __imp& one, locale::category c)
346ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    : facets_(N),
347ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_("*")
348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    facets_ = other.facets_;
350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < facets_.size(); ++i)
351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (facets_[i])
352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            facets_[i]->__add_shared();
353d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    try
355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
35616e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::collate)
358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
3590949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::collate<char> >(one);
3600949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::collate<wchar_t> >(one);
361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::ctype)
363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
3640949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::ctype<char> >(one);
3650949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::ctype<wchar_t> >(one);
3660949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::codecvt<char, char, mbstate_t> >(one);
3670949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::codecvt<char16_t, char, mbstate_t> >(one);
3680949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::codecvt<char32_t, char, mbstate_t> >(one);
3690949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::codecvt<wchar_t, char, mbstate_t> >(one);
370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::monetary)
372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<moneypunct<char, false> >(one);
374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<moneypunct<char, true> >(one);
375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<moneypunct<wchar_t, false> >(one);
376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<moneypunct<wchar_t, true> >(one);
377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<money_get<char> >(one);
378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<money_get<wchar_t> >(one);
379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<money_put<char> >(one);
380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<money_put<wchar_t> >(one);
381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::numeric)
383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<numpunct<char> >(one);
385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<numpunct<wchar_t> >(one);
386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<num_get<char> >(one);
387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<num_get<wchar_t> >(one);
388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<num_put<char> >(one);
389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<num_put<wchar_t> >(one);
390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::time)
392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<time_get<char> >(one);
394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<time_get<wchar_t> >(one);
395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<time_put<char> >(one);
396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            install_from<time_put<wchar_t> >(one);
397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c & locale::messages)
399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4000949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::messages<char> >(one);
4010949eedbd621bc1611266fb180d9a356ee1eaf9fHoward Hinnant            install_from<_VSTD::messages<wchar_t> >(one);
402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
403d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    catch (...)
406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned i = 0; i < facets_.size(); ++i)
408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (facets_[i])
409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                facets_[i]->__release_shared();
410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw;
411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
41216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::__imp(const __imp& other, facet* f, long id)
416ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    : facets_(max<size_t>(N, other.facets_.size()+1)),
417ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      name_("*")
418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f->__add_shared();
420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unique_ptr<facet, release> hold(f);
421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    facets_ = other.facets_;
422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < other.facets_.size(); ++i)
423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (facets_[i])
424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            facets_[i]->__add_shared();
425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    install(hold.get(), id);
426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::~__imp()
429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (unsigned i = 0; i < facets_.size(); ++i)
431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (facets_[i])
432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            facets_[i]->__release_shared();
433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::install(facet* f, long id)
437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f->__add_shared();
439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unique_ptr<facet, release> hold(f);
440ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (static_cast<size_t>(id) >= facets_.size())
441ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        facets_.resize(static_cast<size_t>(id+1));
442ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (facets_[static_cast<size_t>(id)])
443ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        facets_[static_cast<size_t>(id)]->__release_shared();
444ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    facets_[static_cast<size_t>(id)] = hold.release();
445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst locale::facet*
448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::use_facet(long id) const
449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
450d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (!has_facet(id))
452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw bad_cast();
45316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
454ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    return facets_[static_cast<size_t>(id)];
455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// locale
458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst locale&
460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::make_classic()
461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // only one thread can get in here and it only gets in once
463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static aligned_storage<sizeof(locale)>::type buf;
4644c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    locale* c = reinterpret_cast<locale*>(&buf);
465ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    c->__locale_ = &make<__imp>(1u);
466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return *c;
467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst locale&
470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::classic()
471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const locale& c = __imp::make_classic();
473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return c;
474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale&
477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__imp::make_global()
478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // only one thread can get in here and it only gets in once
480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static aligned_storage<sizeof(locale)>::type buf;
481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ::new (&buf) locale(locale::classic());
4824c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    return *reinterpret_cast<locale*>(&buf);
483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale&
486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__global()
487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static locale& g = __imp::make_global();
489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return g;
490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
492c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantlocale::locale()  _NOEXCEPT
493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(__global().__locale_)
494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
498c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantlocale::locale(const locale& l)  _NOEXCEPT
499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(l.__locale_)
500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
504c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantlocale::~locale()
505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__release_shared();
507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst locale&
510c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantlocale::operator=(const locale& other)  _NOEXCEPT
511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    other.__locale_->__add_shared();
513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__release_shared();
514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_ = other.__locale_;
515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return *this;
516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const char* name)
519d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(name ? new __imp(name)
521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                     : throw runtime_error("locale constructed with null"))
52216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#else  // _LIBCPP_NO_EXCEPTIONS
523d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant    : __locale_(new __imp(name))
524d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#endif
525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const string& name)
530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(new __imp(name))
531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const locale& other, const char* name, category c)
536d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(name ? new __imp(*other.__locale_, name, c)
538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                     : throw runtime_error("locale constructed with null"))
53916e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#else  // _LIBCPP_NO_EXCEPTIONS
540d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant    : __locale_(new __imp(*other.__locale_, name, c))
541d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#endif
542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const locale& other, const string& name, category c)
547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(new __imp(*other.__locale_, name, c))
548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::locale(const locale& other, const locale& one, category c)
553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __locale_(new __imp(*other.__locale_, *one.__locale_, c))
554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring
559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::name() const
560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __locale_->name();
562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::__install_ctor(const locale& other, facet* f, long id)
566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (f)
568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __locale_ = new __imp(*other.__locale_, f, id);
569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __locale_ = other.__locale_;
571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __locale_->__add_shared();
572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale
575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::global(const locale& loc)
576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale& g = __global();
578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale r = g;
579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    g = loc;
580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (g.name() != "*")
581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        setlocale(LC_ALL, g.name().c_str());
582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return r;
583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::has_facet(id& x) const
587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __locale_->has_facet(x.__get());
589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst locale::facet*
592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::use_facet(id& x) const
593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __locale_->use_facet(x.__get());
595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::operator==(const locale& y) const
599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return (__locale_ == y.__locale_)
601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        || (__locale_->name() != "*" && __locale_->name() == y.__locale_->name());
602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// locale::facet
605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::facet::~facet()
607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
6111694d23e23d41c4037111d96324c0c16c744c09dHoward Hinnantlocale::facet::__on_zero_shared() _NOEXCEPT
612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    delete this;
614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// locale::id
617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint32_t locale::id::__next_id = 0;
619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnamespace
621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass __fake_bind
624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    locale::id* id_;
626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void (locale::id::* pmf_)();
627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic:
628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __fake_bind(void (locale::id::* pmf)(), locale::id* id)
629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : id_(id), pmf_(pmf) {}
630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    void operator()() const
632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        (id_->*pmf_)();
634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlong
640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id::__get()
641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    call_once(__flag_, __fake_bind(&locale::id::__init, this));
643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __id_ - 1;
644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id::__init()
648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
649adff4895b2746f30b271bc219713e7ded5ae9677Howard Hinnant    __id_ = __sync_add_and_fetch(&__next_id, 1);
650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class collate_byname<char>
653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::collate_byname(const char* n, size_t refs)
655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : collate<char>(refs),
656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, n, 0))
657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
658d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("collate_byname<char>::collate_byname"
661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(n));
66216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::collate_byname(const string& name, size_t refs)
666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : collate<char>(refs),
667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
669d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("collate_byname<char>::collate_byname"
672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + name);
67316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::~collate_byname()
677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    freelocale(__l);
679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::do_compare(const char_type* __lo1, const char_type* __hi1,
683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                 const char_type* __lo2, const char_type* __hi2) const
684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type lhs(__lo1, __hi1);
686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type rhs(__lo2, __hi2);
687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int r = strcoll_l(lhs.c_str(), rhs.c_str(), __l);
688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (r < 0)
689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return -1;
690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (r > 0)
691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return 1;
692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return r;
693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::string_type
696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<char>::do_transform(const char_type* lo, const char_type* hi) const
697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const string_type in(lo, hi);
699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type out(strxfrm_l(0, in.c_str(), 0, __l), char());
700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    strxfrm_l(const_cast<char*>(out.c_str()), in.c_str(), out.size()+1, __l);
701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return out;
702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class collate_byname<wchar_t>
705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::collate_byname(const char* n, size_t refs)
707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : collate<wchar_t>(refs),
708bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, n, 0))
709bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
710d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
711bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
712bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("collate_byname<wchar_t>::collate_byname(size_t refs)"
713bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(n));
71416e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::collate_byname(const string& name, size_t refs)
718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : collate<wchar_t>(refs),
719bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
721d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("collate_byname<wchar_t>::collate_byname(size_t refs)"
724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + name);
72516e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::~collate_byname()
729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    freelocale(__l);
731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
733bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::do_compare(const char_type* __lo1, const char_type* __hi1,
735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                 const char_type* __lo2, const char_type* __hi2) const
736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type lhs(__lo1, __hi1);
738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type rhs(__lo2, __hi2);
739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int r = wcscoll_l(lhs.c_str(), rhs.c_str(), __l);
740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (r < 0)
741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return -1;
742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (r > 0)
743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return 1;
744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return r;
745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::string_type
748bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcollate_byname<wchar_t>::do_transform(const char_type* lo, const char_type* hi) const
749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const string_type in(lo, hi);
751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string_type out(wcsxfrm_l(0, in.c_str(), 0, __l), wchar_t());
752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wcsxfrm_l(const_cast<wchar_t*>(out.c_str()), in.c_str(), out.size()+1, __l);
753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return out;
754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class ctype<wchar_t>;
757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
7580a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::space;
7590a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::print;
7600a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::cntrl;
7610a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::upper;
7620a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::lower;
7630a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::alpha;
7640a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::digit;
7650a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::punct;
7660a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::xdigit;
7670a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::blank;
7680a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::alnum;
7690a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnantconst ctype_base::mask ctype_base::graph;
7700a69fa14d2f0521e45a72068c14fe573b140d48bHoward Hinnant
771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id ctype<wchar_t>::id;
772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::~ctype()
774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_is(mask m, char_type c) const
779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
780a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow    return isascii(c) ? (ctype<char>::classic_table()[c] & m) != 0 : false;
781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_is(const char_type* low, const char_type* high, mask* vec) const
785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++vec)
78762a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt        *vec = static_cast<mask>(isascii(*low) ?
78862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt                                   ctype<char>::classic_table()[*low] : 0);
789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* high) const
794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
79662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt        if (isascii(*low) && (ctype<char>::classic_table()[*low] & m))
797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) const
803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
80562a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt        if (!(isascii(*low) && (ctype<char>::classic_table()[*low] & m)))
806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_toupper(char_type c) const
812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
8133c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
8143c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return isascii(c) ? _DefaultRuneLocale.__mapupper[c] : c;
8152ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__)
81662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return isascii(c) ? ctype<char>::__classic_upper_table()[c] : c;
817e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
8183c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return (isascii(c) && iswlower_l(c, __cloc())) ? c-L'a'+L'A' : c;
819e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_toupper(char_type* low, const char_type* high) const
824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
8263c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
8273c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = isascii(*low) ? _DefaultRuneLocale.__mapupper[*low] : *low;
8282ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__)
82962a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt        *low = isascii(*low) ? ctype<char>::__classic_upper_table()[*low]
83062a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt                             : *low;
831e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
8323c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = (isascii(*low) && islower_l(*low, __cloc())) ? (*low-L'a'+L'A') : *low;
833e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_tolower(char_type c) const
839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
8403c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
8413c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return isascii(c) ? _DefaultRuneLocale.__maplower[c] : c;
8422ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__)
84362a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return isascii(c) ? ctype<char>::__classic_lower_table()[c] : c;
844e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
8453c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return (isascii(c) && isupper_l(c, __cloc())) ? c-L'A'+'a' : c;
846e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_tolower(char_type* low, const char_type* high) const
851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
8533c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
8543c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = isascii(*low) ? _DefaultRuneLocale.__maplower[*low] : *low;
8552ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__)
85662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt        *low = isascii(*low) ? ctype<char>::__classic_lower_table()[*low]
85762a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt                             : *low;
858e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
8593c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-L'A'+L'a' : *low;
860e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
861bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
862bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_widen(char c) const
866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return c;
868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_widen(const char* low, const char* high, char_type* dest) const
872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *dest = *low;
875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_narrow(char_type c, char dfault) const
880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (isascii(c))
882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return static_cast<char>(c);
883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return dfault;
884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<wchar_t>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const
888bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
889bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (isascii(*low))
891ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            *dest = static_cast<char>(*low);
892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *dest = dfault;
894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class ctype<char>;
898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id ctype<char>::id;
900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::ctype(const mask* tab, bool del, size_t refs)
902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : locale::facet(refs),
903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __tab_(tab),
904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __del_(del)
905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
90662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt  if (__tab_ == 0)
90762a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt      __tab_ = classic_table();
908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::~ctype()
911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__tab_ && __del_)
913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        delete [] __tab_;
914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
915bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_toupper(char_type c) const
918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
9193c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
920ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    return isascii(c) ?
921ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(c)]) : c;
922a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__NetBSD__)
923a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    return static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)]);
9242ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#elif defined(__GLIBC__) || defined(__EMSCRIPTEN__)
92588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    return isascii(c) ?
926a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger      static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(c)]) : c;
927e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
9283c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return (isascii(c) && islower_l(c, __cloc())) ? c-'a'+'A' : c;
929e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_toupper(char_type* low, const char_type* high) const
934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
9363c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
937ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        *low = isascii(*low) ?
938ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant          static_cast<char>(_DefaultRuneLocale.__mapupper[static_cast<ptrdiff_t>(*low)]) : *low;
939a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__NetBSD__)
940a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger        *low = static_cast<char>(__classic_upper_table()[static_cast<unsigned char>(*low)]);
9412ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#elif defined(__GLIBC__) || defined(__EMSCRIPTEN__)
94288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        *low = isascii(*low) ?
94388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow          static_cast<char>(__classic_upper_table()[static_cast<size_t>(*low)]) : *low;
944e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
9453c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = (isascii(*low) && islower_l(*low, __cloc())) ? *low-'a'+'A' : *low;
946e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
948bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
949bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
951bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_tolower(char_type c) const
952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
9533c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
954ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    return isascii(c) ?
955ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant      static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(c)]) : c;
956a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__NetBSD__)
957a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    return static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(c)]);
9582ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#elif defined(__GLIBC__) || defined(__EMSCRIPTEN__) || defined(__NetBSD__)
95988c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    return isascii(c) ?
96088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow      static_cast<char>(__classic_lower_table()[static_cast<size_t>(c)]) : c;
961e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
9623c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return (isascii(c) && isupper_l(c, __cloc())) ? c-'A'+'a' : c;
963e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_tolower(char_type* low, const char_type* high) const
968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
9703c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#ifdef _LIBCPP_HAS_DEFAULTRUNELOCALE
971ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        *low = isascii(*low) ? static_cast<char>(_DefaultRuneLocale.__maplower[static_cast<ptrdiff_t>(*low)]) : *low;
972a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__NetBSD__)
973a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger        *low = static_cast<char>(__classic_lower_table()[static_cast<unsigned char>(*low)]);
9742ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#elif defined(__GLIBC__) || defined(__EMSCRIPTEN__)
97588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        *low = isascii(*low) ? static_cast<char>(__classic_lower_table()[static_cast<size_t>(*low)]) : *low;
976e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#else
9773c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant        *low = (isascii(*low) && isupper_l(*low, __cloc())) ? *low-'A'+'a' : *low;
978e59f724f79c5388d6b0a7794fd6d610783bec62dSean Hunt#endif
979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_widen(char c) const
984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return c;
986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_widen(const char* low, const char* high, char_type* dest) const
990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *dest = *low;
993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
994bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
995bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
997bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_narrow(char_type c, char dfault) const
998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (isascii(c))
1000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return static_cast<char>(c);
1001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return dfault;
1002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1004bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
1005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype<char>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const
1006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
1008bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (isascii(*low))
1009bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *dest = *low;
1010bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
1011bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *dest = dfault;
1012bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10152ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#ifdef __EMSCRIPTEN__
1016fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantextern "C" const unsigned short ** __ctype_b_loc();
1017fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantextern "C" const int ** __ctype_tolower_loc();
1018fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantextern "C" const int ** __ctype_toupper_loc();
1019fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant#endif
1020fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant
1021bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst ctype<char>::mask*
1022c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantctype<char>::classic_table()  _NOEXCEPT
1023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1024c512df1950baf9466843b2943855356c031fec08David Chisnall#if defined(__APPLE__) || defined(__FreeBSD__)
1025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return _DefaultRuneLocale.__runetype;
1026a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif defined(__NetBSD__)
1027a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    return _C_ctype_tab_ + 1;
102862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt#elif defined(__GLIBC__)
102962a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return __cloc()->__ctype_b;
1030997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall#elif __sun__
1031997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    return __ctype_mask;
1032ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#elif defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
10333c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return _ctype+1; // internal ctype mask table defined in msvcrt.dll
1034c512df1950baf9466843b2943855356c031fec08David Chisnall// This is assumed to be safe, which is a nonsense assumption because we're
1035c512df1950baf9466843b2943855356c031fec08David Chisnall// going to end up dereferencing it later...
10362ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#elif defined(__EMSCRIPTEN__)
1037fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant    return *__ctype_b_loc();
10387f76450ee9f14ed646a38f43a09dc49dde413281Howard Hinnant#elif defined(_AIX)
1039016d4e847a53d310dfac6b0d93782f4221e7700aMarshall Clow    return (const unsigned int *)__lc_ctype_ptr->obj->mask;
10402517f4fe31291c98c8120e78de0c7a299408bbf1Dan Albert#elif defined(__ANDROID__)
104173abdfe437fbb56b31ff5872d9ae38f8d9c23e5dDan Albert    return _ctype_ + 1;
104262a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt#else
1043997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    // Platform not supported: abort so the person doing the port knows what to
1044997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    // fix
1045fcbaf48f21daac4d8ca0d75361116b1b7478bcfcHoward Hinnant# warning  ctype<char>::classic_table() is not implemented
1046ed14a76beba8f2a0e30f5c66d327d60f87a75921Howard Hinnant    printf("ctype<char>::classic_table() is not implemented\n");
1047997e4541395abd2db274c3bda04beaf5085e746fDavid Chisnall    abort();
104862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return NULL;
104962a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt#endif
105062a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt}
105162a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt
10523c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant#if defined(__GLIBC__)
105362a6ac33a217b0e5a4c42367c6b72e51497246aeSean Huntconst int*
105462a6ac33a217b0e5a4c42367c6b72e51497246aeSean Huntctype<char>::__classic_lower_table() _NOEXCEPT
105562a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt{
105662a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return __cloc()->__ctype_tolower;
105762a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt}
105862a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt
105962a6ac33a217b0e5a4c42367c6b72e51497246aeSean Huntconst int*
106062a6ac33a217b0e5a4c42367c6b72e51497246aeSean Huntctype<char>::__classic_upper_table() _NOEXCEPT
106162a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt{
106262a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt    return __cloc()->__ctype_toupper;
1063bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1064a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger#elif __NetBSD__
1065a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenbergerconst short*
1066a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenbergerctype<char>::__classic_lower_table() _NOEXCEPT
1067a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger{
1068a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    return _C_tolower_tab_ + 1;
1069a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger}
1070a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger
1071a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenbergerconst short*
1072a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenbergerctype<char>::__classic_upper_table() _NOEXCEPT
1073a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger{
1074a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger    return _C_toupper_tab_ + 1;
1075a71a9526340325a63cfee83be43be30af25a802cJoerg Sonnenberger}
1076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
10772ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#elif defined(__EMSCRIPTEN__)
1078fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantconst int*
1079fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantctype<char>::__classic_lower_table() _NOEXCEPT
1080fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant{
1081fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant    return *__ctype_tolower_loc();
1082fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant}
1083fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant
1084fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantconst int*
1085fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnantctype<char>::__classic_upper_table() _NOEXCEPT
1086fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant{
1087fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant    return *__ctype_toupper_loc();
1088fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant}
10892ccffefaffc4558adcfa64bec7dc71ade2235937Marshall Clow#endif // __GLIBC__ || __EMSCRIPTEN__ || __NETBSD__
1090fc2f021bdd3fd69ff62bfc6ceb5c5264afd4ee7dHoward Hinnant
1091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class ctype_byname<char>
1092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::ctype_byname(const char* name, size_t refs)
1094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : ctype<char>(0, false, refs),
1095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name, 0))
1096bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1097d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
1099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("ctype_byname<char>::ctype_byname"
1100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(name));
110116e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::ctype_byname(const string& name, size_t refs)
1105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : ctype<char>(0, false, refs),
1106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
1107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1108d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
1110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("ctype_byname<char>::ctype_byname"
1111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + name);
111216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::~ctype_byname()
1116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    freelocale(__l);
1118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
1121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::do_toupper(char_type c) const
1122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
112363d8f7e341d98bdd7e8d9b52945db01f4708fa3aJoerg Sonnenberger    return static_cast<char>(toupper_l(static_cast<unsigned char>(c), __l));
1124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
1127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::do_toupper(char_type* low, const char_type* high) const
1128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
113063d8f7e341d98bdd7e8d9b52945db01f4708fa3aJoerg Sonnenberger        *low = static_cast<char>(toupper_l(static_cast<unsigned char>(*low), __l));
1131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
1135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::do_tolower(char_type c) const
1136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
113763d8f7e341d98bdd7e8d9b52945db01f4708fa3aJoerg Sonnenberger    return static_cast<char>(tolower_l(static_cast<unsigned char>(c), __l));
1138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
1141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<char>::do_tolower(char_type* low, const char_type* high) const
1142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
114463d8f7e341d98bdd7e8d9b52945db01f4708fa3aJoerg Sonnenberger        *low = static_cast<char>(tolower_l(static_cast<unsigned char>(*low), __l));
1145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class ctype_byname<wchar_t>
1149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::ctype_byname(const char* name, size_t refs)
1151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : ctype<wchar_t>(refs),
1152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name, 0))
1153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1154d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
1156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("ctype_byname<wchar_t>::ctype_byname"
1157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(name));
115816e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::ctype_byname(const string& name, size_t refs)
1162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : ctype<wchar_t>(refs),
1163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, name.c_str(), 0))
1164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1165d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
1167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("ctype_byname<wchar_t>::ctype_byname"
1168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + name);
116916e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::~ctype_byname()
1173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    freelocale(__l);
1175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
1178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_is(mask m, char_type c) const
1179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
11806f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#ifdef _LIBCPP_WCTYPE_IS_MASK
1181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<bool>(iswctype_l(c, m, __l));
11826f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#else
1183ef793f2513b734d0827825b7857f5745529190d4Howard Hinnant    bool result = false;
118488c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    wint_t ch = static_cast<wint_t>(c);
118588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & space) result |= (iswspace_l(ch, __l) != 0);
118688c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & print) result |= (iswprint_l(ch, __l) != 0);
118788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & cntrl) result |= (iswcntrl_l(ch, __l) != 0);
118888c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & upper) result |= (iswupper_l(ch, __l) != 0);
118988c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & lower) result |= (iswlower_l(ch, __l) != 0);
119088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & alpha) result |= (iswalpha_l(ch, __l) != 0);
119188c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & digit) result |= (iswdigit_l(ch, __l) != 0);
119288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & punct) result |= (iswpunct_l(ch, __l) != 0);
119388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & xdigit) result |= (iswxdigit_l(ch, __l) != 0);
119488c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow    if (m & blank) result |= (iswblank_l(ch, __l) != 0);
11953c466fc631a2a474d84ad6c29770a2cbdf40bf1bHoward Hinnant    return result;
11966f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#endif
1197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_is(const char_type* low, const char_type* high, mask* vec) const
1201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++vec)
1203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (isascii(*low))
120562a6ac33a217b0e5a4c42367c6b72e51497246aeSean Hunt            *vec = static_cast<mask>(ctype<char>::classic_table()[*low]);
1206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
1207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *vec = 0;
120988c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            wint_t ch = static_cast<wint_t>(*low);
121088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswspace_l(ch, __l))
1211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= space;
121288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswprint_l(ch, __l))
1213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= print;
121488c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswcntrl_l(ch, __l))
1215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= cntrl;
121688c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswupper_l(ch, __l))
1217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= upper;
121888c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswlower_l(ch, __l))
1219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= lower;
122088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswalpha_l(ch, __l))
1221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= alpha;
122288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswdigit_l(ch, __l))
1223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= digit;
122488c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswpunct_l(ch, __l))
1225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= punct;
122688c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow            if (iswxdigit_l(ch, __l))
1227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *vec |= xdigit;
1228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1232bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1233bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1234bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_scan_is(mask m, const char_type* low, const char_type* high) const
1235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
12376f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt    {
12386f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#ifdef _LIBCPP_WCTYPE_IS_MASK
1239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (iswctype_l(*low, m, __l))
1240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
12416f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#else
124288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        wint_t ch = static_cast<wint_t>(*low);
124388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & space && iswspace_l(ch, __l)) break;
124488c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & print && iswprint_l(ch, __l)) break;
124588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & cntrl && iswcntrl_l(ch, __l)) break;
124688c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & upper && iswupper_l(ch, __l)) break;
124788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & lower && iswlower_l(ch, __l)) break;
124888c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & alpha && iswalpha_l(ch, __l)) break;
124988c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & digit && iswdigit_l(ch, __l)) break;
125088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & punct && iswpunct_l(ch, __l)) break;
125188c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & xdigit && iswxdigit_l(ch, __l)) break;
125288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & blank && iswblank_l(ch, __l)) break;
12536f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#endif
12546f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt    }
1255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_scan_not(mask m, const char_type* low, const char_type* high) const
1260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
12626f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt    {
12636f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#ifdef _LIBCPP_WCTYPE_IS_MASK
1264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (!iswctype_l(*low, m, __l))
1265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
12666f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#else
126788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        wint_t ch = static_cast<wint_t>(*low);
126888c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & space && iswspace_l(ch, __l)) continue;
126988c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & print && iswprint_l(ch, __l)) continue;
127088c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & cntrl && iswcntrl_l(ch, __l)) continue;
127188c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & upper && iswupper_l(ch, __l)) continue;
127288c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & lower && iswlower_l(ch, __l)) continue;
127388c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & alpha && iswalpha_l(ch, __l)) continue;
127488c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & digit && iswdigit_l(ch, __l)) continue;
127588c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & punct && iswpunct_l(ch, __l)) continue;
127688c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & xdigit && iswxdigit_l(ch, __l)) continue;
127788c3190d6cb2d365ea2ae86eff5994209e3972fdMarshall Clow        if (m & blank && iswblank_l(ch, __l)) continue;
12786f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt        break;
12796f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt#endif
12806f0342cf2e4802f6d7948e1c5f59c41b4e25789eSean Hunt    }
1281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
1285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_toupper(char_type c) const
1286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return towupper_l(c, __l);
1288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_toupper(char_type* low, const char_type* high) const
1292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
1294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *low = towupper_l(*low, __l);
1295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
1299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_tolower(char_type c) const
1300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return towlower_l(c, __l);
1302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_tolower(char_type* low, const char_type* high) const
1306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low)
1308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *low = towlower_l(*low, __l);
1309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t
1313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_widen(char c) const
1314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1315866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1316f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    return btowc_l(c, __l);
1317f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1318f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    return __btowc_l(c, __l);
1319f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char*
1323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_widen(const char* low, const char* high, char_type* dest) const
1324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
1326866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1327f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        *dest = btowc_l(*low, __l);
1328f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1329f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        *dest = __btowc_l(*low, __l);
1330f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar
1335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_narrow(char_type c, char dfault) const
1336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1337866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1338f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    int r = wctob_l(c, __l);
1339f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1340f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    int r = __wctob_l(c, __l);
1341f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1342c6e54b964f22f489309e4e98554ddd7a42ccd291Howard Hinnant    return r != static_cast<int>(WEOF) ? static_cast<char>(r) : dfault;
1343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wchar_t*
1346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantctype_byname<wchar_t>::do_narrow(const char_type* low, const char_type* high, char dfault, char* dest) const
1347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; low != high; ++low, ++dest)
1349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1350866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1351f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        int r = wctob_l(*low, __l);
1352f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1353f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        int r = __wctob_l(*low, __l);
1354f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1355c6e54b964f22f489309e4e98554ddd7a42ccd291Howard Hinnant        *dest = r != static_cast<int>(WEOF) ? static_cast<char>(r) : dfault;
1356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return low;
1358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<char, char, mbstate_t>
1361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
136216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantlocale::id codecvt<char, char, mbstate_t>::id;
1363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<char, char, mbstate_t>::~codecvt()
1365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<char, char, mbstate_t>::result
136916e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantcodecvt<char, char, mbstate_t>::do_out(state_type&,
137016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const intern_type* frm, const intern_type*, const intern_type*& frm_nxt,
1371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
1372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    frm_nxt = frm;
1374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return noconv;
1376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<char, char, mbstate_t>::result
137916e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantcodecvt<char, char, mbstate_t>::do_in(state_type&,
138016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const extern_type* frm, const extern_type*, const extern_type*& frm_nxt,
1381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    intern_type* to, intern_type*, intern_type*& to_nxt) const
1382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    frm_nxt = frm;
1384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return noconv;
1386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<char, char, mbstate_t>::result
138916e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantcodecvt<char, char, mbstate_t>::do_unshift(state_type&,
1390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
1391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return noconv;
1394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1397c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char, char, mbstate_t>::do_encoding() const  _NOEXCEPT
1398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return 1;
1400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
1403c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char, char, mbstate_t>::do_always_noconv() const  _NOEXCEPT
1404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return true;
1406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<char, char, mbstate_t>::do_length(state_type&,
1410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const extern_type* frm, const extern_type* end, size_t mx) const
1411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1412ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    return static_cast<int>(min<size_t>(mx, static_cast<size_t>(end-frm)));
1413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1416c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char, char, mbstate_t>::do_max_length() const  _NOEXCEPT
1417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return 1;
1419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// template <> class codecvt<wchar_t, char, mbstate_t>
1422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
142316e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantlocale::id codecvt<wchar_t, char, mbstate_t>::id;
1424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::codecvt(size_t refs)
1426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : locale::facet(refs),
14275328cd307c81224cd57da1a76c567b3dafcc5cd5Joerg Sonnenberger      __l(_LIBCPP_GET_C_LOCALE)
1428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::codecvt(const char* nm, size_t refs)
1432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : locale::facet(refs),
1433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __l(newlocale(LC_ALL_MASK, nm, 0))
1434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1435d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__l == 0)
1437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("codecvt_byname<wchar_t, char, mbstate_t>::codecvt_byname"
1438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
143916e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
1440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::~codecvt()
1443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1444be764c946cee6b43b2bcfb4918aea3fa7888deafJoerg Sonnenberger    if (__l != _LIBCPP_GET_C_LOCALE)
1445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        freelocale(__l);
1446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::result
1449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::do_out(state_type& st,
145016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
1451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
1452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // look for first internal null in frm
1454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const intern_type* fend = frm;
1455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; fend != frm_end; ++fend)
1456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*fend == 0)
1457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // loop over all null-terminated sequences in frm
1459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (frm_nxt = frm; frm != frm_end && to != to_end; frm = frm_nxt, to = to_nxt)
1461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1462df4182153c061fae526996ae4f00bf7b01ce7befJoerg Sonnenberger        // save state in case it is needed to recover to_nxt on error
1463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t save_state = st;
1464866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1465ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        size_t n = wcsnrtombs_l(to, &frm_nxt, static_cast<size_t>(fend-frm),
1466ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                                static_cast<size_t>(to_end-to), &st, __l);
1467f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1468f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        size_t n = __wcsnrtombs_l(to, &frm_nxt, fend-frm, to_end-to, &st, __l);
1469f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (n == size_t(-1))
1471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // need to recover to_nxt
1473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (to_nxt = to; frm != frm_nxt; ++frm)
1474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
1475866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1476f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt                n = wcrtomb_l(to_nxt, *frm, &save_state, __l);
1477f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1478f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt                n = __wcrtomb_l(to_nxt, *frm, &save_state, __l);
1479f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (n == size_t(-1))
1481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
1482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                to_nxt += n;
1483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
1484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt = frm;
1485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return error;
1486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (n == 0)
1488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return partial;
1489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        to_nxt += n;
1490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (to_nxt == to_end)
1491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (fend != frm_end)  // set up next null terminated sequence
1493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // Try to write the terminating null
1495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            extern_type tmp[MB_LEN_MAX];
1496866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1497f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt            n = wcrtomb_l(tmp, intern_type(), &st, __l);
1498f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1499f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt            n = __wcrtomb_l(tmp, intern_type(), &st, __l);
1500f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (n == size_t(-1))  // on error
1502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return error;
1503ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if (n > static_cast<size_t>(to_end-to_nxt))  // is there room?
1504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return partial;
1505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (extern_type* p = tmp; n; --n)  // write it
1506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                *to_nxt++ = *p++;
1507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
1508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // look for next null in frm
1509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (fend = frm_nxt; fend != frm_end; ++fend)
1510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (*fend == 0)
1511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
1512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return frm_nxt == frm_end ? ok : partial;
1515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::result
1518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::do_in(state_type& st,
151916e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
1520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
1521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // look for first internal null in frm
1523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const extern_type* fend = frm;
1524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (; fend != frm_end; ++fend)
1525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*fend == 0)
1526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // loop over all null-terminated sequences in frm
1528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (frm_nxt = frm; frm != frm_end && to != to_end; frm = frm_nxt, to = to_nxt)
1530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1531df4182153c061fae526996ae4f00bf7b01ce7befJoerg Sonnenberger        // save state in case it is needed to recover to_nxt on error
1532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mbstate_t save_state = st;
1533866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1534ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        size_t n = mbsnrtowcs_l(to, &frm_nxt, static_cast<size_t>(fend-frm),
1535ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                                static_cast<size_t>(to_end-to), &st, __l);
1536f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1537f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        size_t n = __mbsnrtowcs_l(to, &frm_nxt, fend-frm, to_end-to, &st, __l);
1538f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (n == size_t(-1))
1540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // need to recover to_nxt
1542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (to_nxt = to; frm != frm_nxt; ++to_nxt)
1543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
1544866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1545ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                n = mbrtowc_l(to_nxt, frm, static_cast<size_t>(fend-frm),
1546ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                              &save_state, __l);
1547f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1548f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt                n = __mbrtowc_l(to_nxt, frm, fend-frm, &save_state, __l);
1549f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                switch (n)
1551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
1552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                case 0:
1553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    ++frm;
1554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
1555982331b66e7d7beadb8da7764acd5ffe53b20d66Howard Hinnant                case size_t(-1):
1556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    frm_nxt = frm;
1557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return error;
1558982331b66e7d7beadb8da7764acd5ffe53b20d66Howard Hinnant                case size_t(-2):
1559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    frm_nxt = frm;
1560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return partial;
1561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                default:
1562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    frm += n;
1563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
1564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
1565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
1566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt = frm;
1567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return frm_nxt == frm_end ? ok : partial;
1568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (n == 0)
1570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return error;
1571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        to_nxt += n;
1572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (to_nxt == to_end)
1573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (fend != frm_end)  // set up next null terminated sequence
1575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // Try to write the terminating null
1577866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1578f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt            n = mbrtowc_l(to_nxt, frm_nxt, 1, &st, __l);
1579f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1580f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt            n = __mbrtowc_l(to_nxt, frm_nxt, 1, &st, __l);
1581f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (n != 0)  // on error
1583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return error;
1584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++to_nxt;
1585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
1586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            // look for next null in frm
1587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (fend = frm_nxt; fend != frm_end; ++fend)
1588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (*fend == 0)
1589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
1590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return frm_nxt == frm_end ? ok : partial;
1593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::result
1596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::do_unshift(state_type& st,
1597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
1598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
1600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    extern_type tmp[MB_LEN_MAX];
1601866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1602f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    size_t n = wcrtomb_l(tmp, intern_type(), &st, __l);
1603f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1604f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    size_t n = __wcrtomb_l(tmp, intern_type(), &st, __l);
1605f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (n == size_t(-1) || n == 0)  // on error
1607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return error;
1608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    --n;
1609ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (n > static_cast<size_t>(to_end-to_nxt))  // is there room?
1610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return partial;
1611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (extern_type* p = tmp; n; --n)  // write it
1612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *to_nxt++ = *p++;
1613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return ok;
1614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1617c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<wchar_t, char, mbstate_t>::do_encoding() const  _NOEXCEPT
1618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1619866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
16204c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    if (mbtowc_l(nullptr, nullptr, MB_LEN_MAX, __l) == 0)
1621f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
16224c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger    if (__mbtowc_l(nullptr, nullptr, MB_LEN_MAX, __l) == 0)
1623f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        // stateless encoding
1626866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1627f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        if (__l == 0 || MB_CUR_MAX_L(__l) == 1)  // there are no known constant length encodings
1628f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1629f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        if (__l == 0 || __mb_cur_max_l(__l) == 1)  // there are no known constant length encodings
1630f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return 1;                // which take more than 1 char to form a wchar_t
1632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant         return 0;
1633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return -1;
1635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
1638c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<wchar_t, char, mbstate_t>::do_always_noconv() const  _NOEXCEPT
1639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return false;
1641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantcodecvt<wchar_t, char, mbstate_t>::do_length(state_type& st,
1645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
1646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    int nbytes = 0;
1648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (size_t nwchar_t = 0; nwchar_t < mx && frm != frm_end; ++nwchar_t)
1649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
1650866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
1651ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        size_t n = mbrlen_l(frm, static_cast<size_t>(frm_end-frm), &st, __l);
1652f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
1653f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        size_t n = __mbrlen_l(frm, frm_end-frm, &st, __l);
1654f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (n)
1656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case 0:
1658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++nbytes;
1659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm;
1660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1661982331b66e7d7beadb8da7764acd5ffe53b20d66Howard Hinnant        case size_t(-1):
1662982331b66e7d7beadb8da7764acd5ffe53b20d66Howard Hinnant        case size_t(-2):
1663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return nbytes;
1664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        default:
1665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            nbytes += n;
1666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm += n;
1667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
1668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
1670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return nbytes;
1671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
1674c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<wchar_t, char, mbstate_t>::do_max_length() const  _NOEXCEPT
1675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
1676866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
16779ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow    return __l == 0 ? 1 : static_cast<int>(  MB_CUR_MAX_L(__l));
1678f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
16799ae96d0f21779b8807c6c1be05ab211ea8bde544Marshall Clow    return __l == 0 ? 1 : static_cast<int>(__mb_cur_max_l(__l));
1680f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
1681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
1683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//                                     Valid UTF ranges
1684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//     UTF-32               UTF-16                          UTF-8               # of code points
1685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//                     first      second       first   second    third   fourth
1686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 000000 - 00007F  0000 - 007F               00 - 7F                                 127
1687bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 000080 - 0007FF  0080 - 07FF               C2 - DF, 80 - BF                       1920
1688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 000800 - 000FFF  0800 - 0FFF               E0 - E0, A0 - BF, 80 - BF              2048
1689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 001000 - 00CFFF  1000 - CFFF               E1 - EC, 80 - BF, 80 - BF             49152
1690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 00D000 - 00D7FF  D000 - D7FF               ED - ED, 80 - 9F, 80 - BF              2048
1691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 00D800 - 00DFFF                invalid
1692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 00E000 - 00FFFF  E000 - FFFF               EE - EF, 80 - BF, 80 - BF              8192
1693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 010000 - 03FFFF  D800 - D8BF, DC00 - DFFF  F0 - F0, 90 - BF, 80 - BF, 80 - BF   196608
1694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 040000 - 0FFFFF  D8C0 - DBBF, DC00 - DFFF  F1 - F3, 80 - BF, 80 - BF, 80 - BF   786432
1695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 100000 - 10FFFF  DBC0 - DBFF, DC00 - DFFF  F4 - F4, 80 - 8F, 80 - BF, 80 - BF    65536
1696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
169787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
169887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
169987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16_to_utf8(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
170087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
170187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
170387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
170487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
170587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
170687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
170787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 3)
170887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
170987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xEF);
171087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBB);
171187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBF);
171287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
171387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
171487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
171587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint16_t wc1 = *frm_nxt;
171687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (wc1 > Maxcode)
171787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
171887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (wc1 < 0x0080)
171987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
172087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 1)
172187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
172287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc1);
172387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
172487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (wc1 < 0x0800)
172587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
172687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 2)
172787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
172887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc1 >> 6));
172987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x03F));
173087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
173187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (wc1 < 0xD800)
173287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
173387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 3)
173487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
173587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc1 >> 12));
173687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
173787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc1 & 0x003F));
173887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
173987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (wc1 < 0xDC00)
174087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
174187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 2)
174287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
174387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t wc2 = frm_nxt[1];
174487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((wc2 & 0xFC00) != 0xDC00)
174587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
174687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 4)
174787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
17484c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger            if (((((wc1 & 0x03C0UL) >> 6) + 1) << 16) +
17494c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger                ((wc1 & 0x003FUL) << 10) + (wc2 & 0x03FF) > Maxcode)
175087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
175187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            ++frm_nxt;
175287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t z = ((wc1 & 0x03C0) >> 6) + 1;
175387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xF0 | (z >> 2));
175487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((z & 0x03) << 4)     | ((wc1 & 0x003C) >> 2));
175587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0003) << 4) | ((wc2 & 0x03C0) >> 6));
175687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc2 & 0x003F));
175787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
175887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (wc1 < 0xE000)
175987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
176087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
176187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
176287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
176387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
176487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 3)
176587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
176687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc1 >> 12));
176787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
176887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc1 & 0x003F));
176987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
177087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
177187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
1772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
177487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
177587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
177687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16_to_utf8(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
177787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
177887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
178087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
178187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
178287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
178387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
178487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 3)
178587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
178687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xEF);
178787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBB);
178887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBF);
178987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
179087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
1791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
179287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint16_t wc1 = static_cast<uint16_t>(*frm_nxt);
179387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (wc1 > Maxcode)
179487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
1795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (wc1 < 0x0080)
1796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 1)
179887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
179987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc1);
1800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc1 < 0x0800)
1802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 2)
180487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
180587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc1 >> 6));
180687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | (wc1 & 0x03F));
1807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc1 < 0xD800)
1809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 3)
181187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
181287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc1 >> 12));
181387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
181487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc1 & 0x003F));
1815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc1 < 0xDC00)
1817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 2)
181987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
182087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t wc2 = static_cast<uint16_t>(frm_nxt[1]);
1821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((wc2 & 0xFC00) != 0xDC00)
182287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
1823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 4)
182487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
18254c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger            if (((((wc1 & 0x03C0UL) >> 6) + 1) << 16) +
18264c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger                ((wc1 & 0x003FUL) << 10) + (wc2 & 0x03FF) > Maxcode)
182787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
1828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
182987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t z = ((wc1 & 0x03C0) >> 6) + 1;
183087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xF0 | (z >> 2));
183187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((z & 0x03) << 4)     | ((wc1 & 0x003C) >> 2));
183287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0003) << 4) | ((wc2 & 0x03C0) >> 6));
183387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc2 & 0x003F));
1834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc1 < 0xE000)
1836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
183787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
1838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
1840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 3)
184287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
184387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc1 >> 12));
184487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc1 & 0x0FC0) >> 6));
184587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc1 & 0x003F));
1846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
184887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
1849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
185187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
185287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
185387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_utf16(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
185487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
185587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1856bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
185787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
185887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
185987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
1860bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
186187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
186287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
186387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
186487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
186587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
186687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
186787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = *frm_nxt;
186887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 > Maxcode)
186987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
1870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c1 < 0x80)
1871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
187287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint16_t>(c1);
1873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
1874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xC2)
1876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
187787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
1878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xE0)
1880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1881bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 2)
188287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
188387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
1884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c2 & 0xC0) != 0x80)
188587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
188687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (c2 & 0x3F));
188787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
188887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
188987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
1890bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 2;
1891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF0)
1893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 3)
189587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
189687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
189787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
1898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
1899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
1900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xE0:
1901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0xA0)
190287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xED:
1905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0x80)
190687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
1909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
191087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
1913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80)
191487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
191587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12)
1916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             | ((c2 & 0x3F) << 6)
1917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             |  (c3 & 0x3F));
191887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
191987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
192087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
1921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 3;
1922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF5)
1924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
1925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 4)
192687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
192787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
192887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
192987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c4 = frm_nxt[3];
1930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
1931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
1932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF0:
1933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (!(0x90 <= c2 && c2 <= 0xBF))
193487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF4:
1937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xF0) != 0x80)
193887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
1941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
194287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
1943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
1944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
1945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
194687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
1947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 2)
194887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
19494c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger            if ((((c1 & 7UL) << 18) +
19504c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger                ((c2 & 0x3FUL) << 12) +
19514c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger                ((c3 & 0x3FUL) << 6) + (c4 & 0x3F)) > Maxcode)
195287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
195387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint16_t>(
1954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    0xD800
1955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  | (((((c1 & 0x07) << 2) | ((c2 & 0x30) >> 4)) - 1) << 6)
1956bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  | ((c2 & 0x0F) << 2)
1957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  | ((c3 & 0x30) >> 4));
195887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *++to_nxt = static_cast<uint16_t>(
1959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    0xDC00
1960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  | ((c3 & 0x0F) << 6)
1961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  |  (c4 & 0x3F));
1962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 4;
1963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
1965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
196687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
1967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
1968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
196987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
1970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
1971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
197287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
197387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
197487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_utf16(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
197587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
197687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant              unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
1977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
197887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
1979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    to_nxt = to;
198087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
198187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
198287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
198387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
198487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
198587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
198687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
198787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
198887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = *frm_nxt;
198987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 > Maxcode)
199087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
199187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 < 0x80)
199287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
199387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(c1);
199487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            ++frm_nxt;
199587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
199687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xC2)
199787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
199887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
199987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
200087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xE0)
200187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
200287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 2)
200387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
200487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
200587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c2 & 0xC0) != 0x80)
200687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
200787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (c2 & 0x3F));
200887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
200987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
201087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(t);
201187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
201287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
201387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xF0)
201487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
201587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 3)
201687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
201787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
201887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
201987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            switch (c1)
202087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            {
202187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xE0:
202287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0xA0)
202387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
202487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
202587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xED:
202687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0x80)
202787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
202887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
202987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            default:
203087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xC0) != 0x80)
203187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
203287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
203387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            }
203487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c3 & 0xC0) != 0x80)
203587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
203687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12)
203787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                             | ((c2 & 0x3F) << 6)
203887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                             |  (c3 & 0x3F));
203987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
204087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
204187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(t);
204287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
204387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
204487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xF5)
204587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
204687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 4)
204787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
204887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
204987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
205087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c4 = frm_nxt[3];
205187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            switch (c1)
205287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            {
205387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xF0:
205487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if (!(0x90 <= c2 && c2 <= 0xBF))
205587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
205687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
205787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xF4:
205887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xF0) != 0x80)
205987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
206087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
206187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            default:
206287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xC0) != 0x80)
206387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
206487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
206587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            }
206687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
206787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
206887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 2)
206987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
20704c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger            if ((((c1 & 7UL) << 18) +
20714c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger                ((c2 & 0x3FUL) << 12) +
20724c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger                ((c3 & 0x3FUL) << 6) + (c4 & 0x3F)) > Maxcode)
207387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
207487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(
207587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    0xD800
207687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  | (((((c1 & 0x07) << 2) | ((c2 & 0x30) >> 4)) - 1) << 6)
207787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  | ((c2 & 0x0F) << 2)
207887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  | ((c3 & 0x30) >> 4));
207987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *++to_nxt = static_cast<uint32_t>(
208087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    0xDC00
208187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  | ((c3 & 0x0F) << 6)
208287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |  (c4 & 0x3F));
208387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
208487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
208587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
208687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
208787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
208887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
208987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
209087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
209387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
2094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
209587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_utf16_length(const uint8_t* frm, const uint8_t* frm_end,
209687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                     size_t mx, unsigned long Maxcode = 0x10FFFF,
209787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                     codecvt_mode mode = codecvt_mode(0))
2098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
209987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
210087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
210187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
210287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
210387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
210487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
210587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
2106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (size_t nchar16_t = 0; frm_nxt < frm_end && nchar16_t < mx; ++nchar16_t)
2107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
210887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = *frm_nxt;
210987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 > Maxcode)
211087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
2111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c1 < 0x80)
2112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
2114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xC2)
2116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
2118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xE0)
2120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((frm_end-frm_nxt < 2) || (frm_nxt[1] & 0xC0) != 0x80)
2122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
212387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6) | (frm_nxt[1] & 0x3F));
212487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
212587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 2;
2127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF0)
2129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 3)
2131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
213287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
213387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
2134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xE0:
2137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0xA0)
2138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xED:
2141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0x80)
2142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
2146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80)
2150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2151ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode)
215287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 3;
2154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF5)
2156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 4 || mx-nchar16_t < 2)
2158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
215987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
216087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
216187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c4 = frm_nxt[3];
2162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF0:
2165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (!(0x90 <= c2 && c2 <= 0xBF))
2166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF4:
2169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xF0) != 0x80)
2170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
2174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
2178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
21794c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger            if ((((c1 & 7UL) << 18) +
21804c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger                ((c2 & 0x3FUL) << 12) +
21814c6acb5ecd7fab26583353261fd52a9f7ba2f1e0Joerg Sonnenberger                ((c3 & 0x3FUL) << 6) + (c4 & 0x3F)) > Maxcode)
218287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++nchar16_t;
2184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 4;
2185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
2187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
2189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
2191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<int>(frm_nxt - frm);
2192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
219487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
219587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
219687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs4_to_utf8(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
219787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
219887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
220087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
220187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
220287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
2203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
220487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 3)
220587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
220687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xEF);
220787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBB);
220887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBF);
220987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
221087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
221187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
221287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint32_t wc = *frm_nxt;
221387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode)
221487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
2215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (wc < 0x000080)
2216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 1)
221887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
221987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc);
2220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc < 0x000800)
2222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 2)
222487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
222587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc >> 6));
222687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x03F));
2227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (wc < 0x010000)
2229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 3)
223187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
223287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc >> 12));
223387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x0FC0) >> 6));
223487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc & 0x003F));
2235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else // if (wc < 0x110000)
2237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (to_end-to_nxt < 4)
223987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
224087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xF0 |  (wc >> 18));
224187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x03F000) >> 12));
224287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x000FC0) >> 6));
224387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc & 0x00003F));
2244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
224687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
2247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
224987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
225087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
225187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
225287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
225387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
225587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
225687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
225787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
2258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
225987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
226087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
226187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
226287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
226387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
226487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
226587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
2266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c1 < 0x80)
2267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
226887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
226987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
227087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(c1);
2271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
2272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xC2)
2274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
227587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
2276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xE0)
2278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 2)
228087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
228187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
2282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c2 & 0xC0) != 0x80)
228387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
228487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(((c1 & 0x1F) << 6)
2285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                              | (c2 & 0x3F));
228687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
228787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
228887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
2289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 2;
2290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF0)
2292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 3)
229487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
229587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
229687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
2297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xE0:
2300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0xA0)
230187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xED:
2304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0x80)
230587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
230987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80)
231387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
231487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(((c1 & 0x0F) << 12)
2315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             | ((c2 & 0x3F) << 6)
2316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             |  (c3 & 0x3F));
231787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
231887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
231987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
2320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 3;
2321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF5)
2323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 4)
232587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
232687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
232787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
232887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c4 = frm_nxt[3];
2329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF0:
2332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (!(0x90 <= c2 && c2 <= 0xBF))
233387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF4:
2336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xF0) != 0x80)
233787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
234187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
2342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
234587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
234687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(((c1 & 0x07) << 18)
2347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             | ((c2 & 0x3F) << 12)
2348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             | ((c3 & 0x3F) << 6)
2349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                             |  (c4 & 0x3F));
235087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
235187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
235287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
2353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 4;
2354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
2356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
235787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
2358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
236087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
236387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
2364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
236587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end,
236687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    size_t mx, unsigned long Maxcode = 0x10FFFF,
236787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    codecvt_mode mode = codecvt_mode(0))
2368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
236987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
237087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
237187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
237287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
237387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
237487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
237587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
2376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (size_t nchar32_t = 0; frm_nxt < frm_end && nchar32_t < mx; ++nchar32_t)
2377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
237887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
2379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (c1 < 0x80)
2380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
238187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
238287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++frm_nxt;
2384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xC2)
2386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
2388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xE0)
2390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((frm_end-frm_nxt < 2) || ((frm_nxt[1] & 0xC0) != 0x80))
2392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2393ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x1Fu) << 6) | (frm_nxt[1] & 0x3Fu)) > Maxcode)
239487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 2;
2396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF0)
2398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 3)
2400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
240187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
240287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
2403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xE0:
2406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0xA0)
2407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xED:
2410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xE0) != 0x80)
2411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
2415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80)
2419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2420ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode)
242187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            frm_nxt += 3;
2423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else if (c1 < 0xF5)
2425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (frm_end-frm_nxt < 4)
2427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
242887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
242987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
243087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c4 = frm_nxt[3];
2431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (c1)
2432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
2433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF0:
2434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (!(0x90 <= c2 && c2 <= 0xBF))
2435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 0xF4:
2438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xF0) != 0x80)
2439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
2442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if ((c2 & 0xC0) != 0x80)
2443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return static_cast<int>(frm_nxt - frm);
2444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 break;
2445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
2446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c3 & 0xC0) != 0x80 || (c4 & 0xC0) != 0x80)
2447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2448ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x07u) << 18) | ((c2 & 0x3Fu) << 12) |
2449ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                 ((c3 & 0x3Fu) << 6)  |  (c4 & 0x3Fu)) > Maxcode)
245087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
245187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
245287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
245387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
2454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
2455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
2456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
2458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<int>(frm_nxt - frm);
2459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
246187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
246287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
246387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs2_to_utf8(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
246487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
246587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
246787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
246887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
246987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
247087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
247187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 3)
247287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
247387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xEF);
247487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBB);
247587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xBF);
247687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
247787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
247887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
247987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint16_t wc = *frm_nxt;
248087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xF800) == 0xD800 || wc > Maxcode)
248187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
248287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (wc < 0x0080)
248387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
248487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 1)
248587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
248687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc);
248787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
248887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (wc < 0x0800)
248987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
249087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 2)
249187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
249287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xC0 | (wc >> 6));
249387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | (wc & 0x03F));
249487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
249587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else // if (wc <= 0xFFFF)
249687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
249787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 3)
249887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
249987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xE0 |  (wc >> 12));
250087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 | ((wc & 0x0FC0) >> 6));
250187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0x80 |  (wc & 0x003F));
250287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
250387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
250487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
2505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
250787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
250887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
250987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
251087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
251187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant             unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
251287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
251387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
251487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
251587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
251687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
251787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
251887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
251987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
252087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
252187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end && to_nxt < to_end; ++to_nxt)
252287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
252387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
252487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 < 0x80)
252587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
252687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
252787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
252887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint16_t>(c1);
252987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            ++frm_nxt;
253087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
253187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xC2)
253287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
253387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
253487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
253587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xE0)
253687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
253787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 2)
253887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
253987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
254087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c2 & 0xC0) != 0x80)
254187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
254287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x1F) << 6)
254387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                              | (c2 & 0x3F));
254487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
254587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
254687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
254787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
254887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
254987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xF0)
255087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
255187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 3)
255287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
255387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
255487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
255587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            switch (c1)
255687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            {
255787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xE0:
255887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0xA0)
255987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
256087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
256187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xED:
256287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0x80)
256387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
256487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
256587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            default:
256687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xC0) != 0x80)
256787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return codecvt_base::error;
256887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
256987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            }
257087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c3 & 0xC0) != 0x80)
257187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
257287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(((c1 & 0x0F) << 12)
257387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                             | ((c2 & 0x3F) << 6)
257487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                             |  (c3 & 0x3F));
257587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
257687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
257787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
257887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
257987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
258087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
258187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
258287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
258387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
258487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
258587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
258687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
2587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
258887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
258987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
259087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf8_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end,
259187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    size_t mx, unsigned long Maxcode = 0x10FFFF,
259287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    codecvt_mode mode = codecvt_mode(0))
2593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
259487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
259587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
259687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
259787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 3 && frm_nxt[0] == 0xEF && frm_nxt[1] == 0xBB &&
259887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                                                          frm_nxt[2] == 0xBF)
259987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
260087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
260187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (size_t nchar32_t = 0; frm_nxt < frm_end && nchar32_t < mx; ++nchar32_t)
260287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
260387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint8_t c1 = static_cast<uint8_t>(*frm_nxt);
260487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (c1 < 0x80)
260587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
260687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
260787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
260887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            ++frm_nxt;
260987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
261087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xC2)
261187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
261287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
261387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
261487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xE0)
261587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
261687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((frm_end-frm_nxt < 2) || ((frm_nxt[1] & 0xC0) != 0x80))
261787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2618ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x1Fu) << 6) | (frm_nxt[1] & 0x3Fu)) > Maxcode)
261987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
262087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
262187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
262287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else if (c1 < 0xF0)
262387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
262487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 3)
262587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
262687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c2 = frm_nxt[1];
262787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint8_t c3 = frm_nxt[2];
262887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            switch (c1)
262987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            {
263087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xE0:
263187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0xA0)
263287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return static_cast<int>(frm_nxt - frm);
263387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
263487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            case 0xED:
263587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xE0) != 0x80)
263687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return static_cast<int>(frm_nxt - frm);
263787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
263887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            default:
263987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                if ((c2 & 0xC0) != 0x80)
264087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    return static_cast<int>(frm_nxt - frm);
264187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                 break;
264287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            }
264387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c3 & 0xC0) != 0x80)
264487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2645ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if ((((c1 & 0x0Fu) << 12) | ((c2 & 0x3Fu) << 6) | (c3 & 0x3Fu)) > Maxcode)
264687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
264787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 3;
264887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
264987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
265087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
265187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
265287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
265387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
265487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return static_cast<int>(frm_nxt - frm);
2655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
265787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
265887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
265987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs4_to_utf16be(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
266087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
266187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
266387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
266487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
266587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
2666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
266787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
266887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
266987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFE);
267087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFF);
267187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
267287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
267387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
267487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint32_t wc = *frm_nxt;
267587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode)
267687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
2677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (wc < 0x010000)
2678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
267987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 2)
268087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
268187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc >> 8);
268287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc);
2683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
2685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
268687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 4)
268787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
268887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(
2689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    0xD800
2690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  | ((((wc & 0x1F0000) >> 16) - 1) << 6)
2691bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  |   ((wc & 0x00FC00) >> 10));
269287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t >> 8);
269387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t);
269487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            t = static_cast<uint16_t>(0xDC00 | (wc & 0x03FF));
269587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t >> 8);
269687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t);
2697bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
269987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
2700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
270287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
270387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
270487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16be_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
270587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
270687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
270887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
270987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
271087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
271187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
271287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
271387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
271487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
271587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
2716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
2717ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
2718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if ((c1 & 0xFC00) == 0xDC00)
271987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
2720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if ((c1 & 0xFC00) != 0xD800)
2721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
272287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
272387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
272487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(c1);
272587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
2726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
2728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
272987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 4)
273087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
2731ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            uint16_t c2 = static_cast<uint16_t>(frm_nxt[2] << 8 | frm_nxt[3]);
2732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if ((c2 & 0xFC00) != 0xDC00)
273387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
273487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(
2735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    ((((c1 & 0x03C0) >> 6) + 1) << 16)
2736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  |   ((c1 & 0x003F) << 10)
2737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                  |    (c2 & 0x03FF));
273887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
273987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
274087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
274187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
2742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
274487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
274787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
274887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
274987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16be_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end,
275087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       size_t mx, unsigned long Maxcode = 0x10FFFF,
275187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       codecvt_mode mode = codecvt_mode(0))
2752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
275387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
275487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
275587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
275687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
275787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
275887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
275987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (size_t nchar32_t = 0; frm_nxt < frm_end - 1 && nchar32_t < mx; ++nchar32_t)
276087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
2761ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
276287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xFC00) == 0xDC00)
276387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
276487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xFC00) != 0xD800)
276587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
276687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
276787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
276887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
276987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
277087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
277187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
277287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 4)
277387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
2774ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            uint16_t c2 = static_cast<uint16_t>(frm_nxt[2] << 8 | frm_nxt[3]);
277587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c2 & 0xFC00) != 0xDC00)
277687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
277787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(
277887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    ((((c1 & 0x03C0) >> 6) + 1) << 16)
277987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |   ((c1 & 0x003F) << 10)
278087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |    (c2 & 0x03FF));
278187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
278287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
278387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
278487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
278587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
278687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return static_cast<int>(frm_nxt - frm);
2787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
278987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
279087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
279187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs4_to_utf16le(const uint32_t* frm, const uint32_t* frm_end, const uint32_t*& frm_nxt,
279287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
279387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
279587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
279687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
279787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
279887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
279987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
280087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
280187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xFF);
280287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(0xFE);
280387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
280487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
280587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
280687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint32_t wc = *frm_nxt;
280787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xFFFFF800) == 0x00D800 || wc > Maxcode)
280887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
280987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (wc < 0x010000)
281087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
281187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 2)
281287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
281387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc);
281487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(wc >> 8);
281587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
281687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
281787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
281887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (to_end-to_nxt < 4)
281987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
282087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint16_t t = static_cast<uint16_t>(
282187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    0xD800
282287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  | ((((wc & 0x1F0000) >> 16) - 1) << 6)
282387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |   ((wc & 0x00FC00) >> 10));
282487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t);
282587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t >> 8);
282687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            t = static_cast<uint16_t>(0xDC00 | (wc & 0x03FF));
282787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t);
282887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt++ = static_cast<uint8_t>(t >> 8);
282987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
283087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
283187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
2832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
283487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
283587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
283687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16le_to_ucs4(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
283787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint32_t* to, uint32_t* to_end, uint32_t*& to_nxt,
283887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
284087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
284187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
284287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
284387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
284487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
284587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
284687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
284787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
284887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
2849ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
285087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xFC00) == 0xDC00)
285187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
285287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xFC00) != 0xD800)
285387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
285487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
285587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
285687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = static_cast<uint32_t>(c1);
285787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
285887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
285987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        else
286087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        {
286187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 4)
286287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::partial;
2863ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            uint16_t c2 = static_cast<uint16_t>(frm_nxt[3] << 8 | frm_nxt[2]);
286487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c2 & 0xFC00) != 0xDC00)
286587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
286687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(
286787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    ((((c1 & 0x03C0) >> 6) + 1) << 16)
286887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |   ((c1 & 0x003F) << 10)
286987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |    (c2 & 0x03FF));
287087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
287187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                return codecvt_base::error;
287287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            *to_nxt = t;
287387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
287487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        }
287587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
287687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
2877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
287987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
2880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
288187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16le_to_ucs4_length(const uint8_t* frm, const uint8_t* frm_end,
288287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       size_t mx, unsigned long Maxcode = 0x10FFFF,
288387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       codecvt_mode mode = codecvt_mode(0))
2884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
288587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
288687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
288787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
288887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
288987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
289087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
289187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (size_t nchar32_t = 0; frm_nxt < frm_end - 1 && nchar32_t < mx; ++nchar32_t)
2892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
2893ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
2894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if ((c1 & 0xFC00) == 0xDC00)
2895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
2896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if ((c1 & 0xFC00) != 0xD800)
2897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
289887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (c1 > Maxcode)
289987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
290087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
2901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
2903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
290487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (frm_end-frm_nxt < 4)
2905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
2906ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            uint16_t c2 = static_cast<uint16_t>(frm_nxt[3] << 8 | frm_nxt[2]);
290787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if ((c2 & 0xFC00) != 0xDC00)
290887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
290987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            uint32_t t = static_cast<uint32_t>(
291087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                    ((((c1 & 0x03C0) >> 6) + 1) << 16)
291187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |   ((c1 & 0x003F) << 10)
291287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                  |    (c2 & 0x03FF));
291387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            if (t > Maxcode)
291487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                break;
291587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 4;
2916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
2917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
2918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return static_cast<int>(frm_nxt - frm);
2919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
2920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
292187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
292287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
292387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs2_to_utf16be(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
292487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
292587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
2926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
292787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
292887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
292987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
293087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
293187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
293287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
293387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFE);
293487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFF);
293587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
293687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
293787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
293887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint16_t wc = *frm_nxt;
293987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xF800) == 0xD800 || wc > Maxcode)
294087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
294187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
294287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
294387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(wc >> 8);
294487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(wc);
294587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
294687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
294787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
294887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
294987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
295087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
295187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16be_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
295287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
295387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
295487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
295587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
295687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
295787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
295887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
295987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
296087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
296187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
296287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
296387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
2964ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
296587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
296687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
296787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt = c1;
296887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        frm_nxt += 2;
296987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
297087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
297187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
297287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
297387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
297487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
297587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16be_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end,
297687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       size_t mx, unsigned long Maxcode = 0x10FFFF,
297787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       codecvt_mode mode = codecvt_mode(0))
297887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
297987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
298087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
298187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
298287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFE && frm_nxt[1] == 0xFF)
298387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
298487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
298587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (size_t nchar16_t = 0; frm_nxt < frm_end - 1 && nchar16_t < mx; ++nchar16_t)
298687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
2987ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[0] << 8 | frm_nxt[1]);
298887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
298987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
299087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        frm_nxt += 2;
299187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
299287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return static_cast<int>(frm_nxt - frm);
299387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
299487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
299587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
299687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
299787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantucs2_to_utf16le(const uint16_t* frm, const uint16_t* frm_end, const uint16_t*& frm_nxt,
299887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint8_t* to, uint8_t* to_end, uint8_t*& to_nxt,
299987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
300087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
300187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
300287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
300387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & generate_header)
300487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
300587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
300687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
300787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFF);
300887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(0xFE);
300987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
301087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end; ++frm_nxt)
301187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
301287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        uint16_t wc = *frm_nxt;
301387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((wc & 0xF800) == 0xD800 || wc > Maxcode)
301487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
301587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (to_end-to_nxt < 2)
301687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::partial;
301787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(wc);
301887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt++ = static_cast<uint8_t>(wc >> 8);
301987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
302087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return codecvt_base::ok;
302187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
302287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
302387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
302487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt_base::result
302587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16le_to_ucs2(const uint8_t* frm, const uint8_t* frm_end, const uint8_t*& frm_nxt,
302687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                uint16_t* to, uint16_t* to_end, uint16_t*& to_nxt,
302787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                unsigned long Maxcode = 0x10FFFF, codecvt_mode mode = codecvt_mode(0))
302887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
302987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
303087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
303187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
303287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
303387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
303487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
303587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
303687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (; frm_nxt < frm_end - 1 && to_nxt < to_end; ++to_nxt)
303787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
3038ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
303987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
304087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            return codecvt_base::error;
304187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        *to_nxt = c1;
304287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        frm_nxt += 2;
304387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
304487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return frm_nxt < frm_end ? codecvt_base::partial : codecvt_base::ok;
304587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
304687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
304787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantstatic
304887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
304987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantutf16le_to_ucs2_length(const uint8_t* frm, const uint8_t* frm_end,
305087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       size_t mx, unsigned long Maxcode = 0x10FFFF,
305187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                       codecvt_mode mode = codecvt_mode(0))
305287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
305387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* frm_nxt = frm;
305487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm;
305587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (mode & consume_header)
305687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
305787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if (frm_end-frm_nxt >= 2 && frm_nxt[0] == 0xFF && frm_nxt[1] == 0xFE)
305887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            frm_nxt += 2;
305987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
306087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    for (size_t nchar16_t = 0; frm_nxt < frm_end - 1 && nchar16_t < mx; ++nchar16_t)
306187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    {
3062ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        uint16_t c1 = static_cast<uint16_t>(frm_nxt[1] << 8 | frm_nxt[0]);
306387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        if ((c1 & 0xF800) == 0xD800 || c1 > Maxcode)
306487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant            break;
306587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        frm_nxt += 2;
306687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    }
306787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return static_cast<int>(frm_nxt - frm);
306887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
306987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
307087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// template <> class codecvt<char16_t, char, mbstate_t>
307187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
307216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantlocale::id codecvt<char16_t, char, mbstate_t>::id;
307387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
307487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::~codecvt()
307587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
307687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
307787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
307887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::result
307987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_out(state_type&,
308016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
308187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
308287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
308387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
308487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
308587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
308687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
308787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
308887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
308987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
309087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
309187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
309287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
309387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
309487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
309587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::result
309687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_in(state_type&,
309716e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
309887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
309987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
310087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
310187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
310287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
310387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
310487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
310587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_nxt = _to;
310687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
310787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
310887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
310987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
311087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
311187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
311287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::result
311387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_unshift(state_type&,
311487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
311587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
311687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
311787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
311887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
311987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
312087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3121c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_encoding() const  _NOEXCEPT
312287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
312387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
312487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
312587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
312687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3127c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_always_noconv() const  _NOEXCEPT
312887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
312987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
313087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
313187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
313287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
313387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_length(state_type&,
313487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
313587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
313687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
313787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
313887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_utf16_length(_frm, _frm_end, mx);
313987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
314087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
314187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3142c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char16_t, char, mbstate_t>::do_max_length() const  _NOEXCEPT
314387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
314487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
314587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
314687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
314787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// template <> class codecvt<char32_t, char, mbstate_t>
314887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
314916e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnantlocale::id codecvt<char32_t, char, mbstate_t>::id;
315087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
315187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::~codecvt()
315287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
315387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
315487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
315587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::result
315687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_out(state_type&,
315716e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
315887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
315987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
316087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
316187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
316287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
316387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
316487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
316587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
316687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
316787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
316887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
316987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
317087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
317187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
317287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::result
317387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_in(state_type&,
317416e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
317587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
317687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
317787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
317887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
317987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
318087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
318187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
318287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
318387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt);
318487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
318587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
318687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
318787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
318887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
318987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::result
319087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_unshift(state_type&,
319187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
319287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
319387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
319487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
319587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
319687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
319787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3198c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_encoding() const  _NOEXCEPT
319987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
320087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
320187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
320287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
320387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3204c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_always_noconv() const  _NOEXCEPT
320587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
320687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
320787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
320887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
320987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
321087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_length(state_type&,
321187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
321287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
321387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
321487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
321587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_ucs4_length(_frm, _frm_end, mx);
321687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
321787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
321887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3219c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnantcodecvt<char32_t, char, mbstate_t>::do_max_length() const  _NOEXCEPT
322087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
322187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
322287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
322387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
322487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8<wchar_t>
322587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
322687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::result
322787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::do_out(state_type&,
322887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
322987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
323087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
32310769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#if _WIN32
32320769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
32330769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
32340769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
32350769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#else
323687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
323787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
323887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
32390769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#endif
324087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
324187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
324287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
32430769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#if _WIN32
32440769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    result r = ucs2_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
32450769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant                            _Maxcode_, _Mode_);
32460769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#else
324787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
324887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
32490769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#endif
325087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
325187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
325287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
325387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
325487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
325587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::result
325687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::do_in(state_type&,
325787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
325887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
325987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
326087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
326187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
326287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
32630769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#if _WIN32
32640769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
32650769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
32660769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    uint16_t* _to_nxt = _to;
32670769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant    result r = utf8_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
32680769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant                            _Maxcode_, _Mode_);
32690769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#else
327087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
327187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
327287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
327387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
327487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
32750769e6a785f95fe3ec76c8667e142bd6282d0f7eHoward Hinnant#endif
327687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
327787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
327887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
327987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
328087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
328187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::result
328287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::do_unshift(state_type&,
328387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
328487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
328587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
328687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
328787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
328887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
328987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3290c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<wchar_t>::do_encoding() const  _NOEXCEPT
329187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
329287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
329387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
329487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
329587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3296c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<wchar_t>::do_always_noconv() const  _NOEXCEPT
329787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
329887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
329987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
330087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
330187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
330287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<wchar_t>::do_length(state_type&,
330387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
330487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
330587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
330687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
330787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
330887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
330987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
331087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3311c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<wchar_t>::do_max_length() const  _NOEXCEPT
331287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
331387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
331487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 7;
331587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
331687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
331787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
331887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8<char16_t>
331987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
332087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::result
332187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::do_out(state_type&,
332287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
332387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
332487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
332587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
332687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
332787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
332887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
332987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
333087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
333187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs2_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
333287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
333387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
333487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
333587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
333687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
333787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
333887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::result
333987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::do_in(state_type&,
334087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
334187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
334287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
334387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
334487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
334587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
334687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
334787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
334887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_nxt = _to;
334987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
335087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
335187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
335287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
335387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
335487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
335587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
335687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::result
335787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::do_unshift(state_type&,
335887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
335987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
336087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
336187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
336287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
336387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
336487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3365c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char16_t>::do_encoding() const  _NOEXCEPT
336687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
336787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
336887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
336987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
337087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3371c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char16_t>::do_always_noconv() const  _NOEXCEPT
337287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
337387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
337487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
337587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
337687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
337787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char16_t>::do_length(state_type&,
337887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
337987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
338087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
338187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
338287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
338387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
338487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
338587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3386c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char16_t>::do_max_length() const  _NOEXCEPT
338787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
338887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
338987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 6;
339087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 3;
339187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
339287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
339387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8<char32_t>
339487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
339587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::result
339687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::do_out(state_type&,
339787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
339887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
339987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
340087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
340187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
340287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
340387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
340487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
340587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
340687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
340787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
340887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
340987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
341087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
341187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
341287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
341387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::result
341487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::do_in(state_type&,
341587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
341687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
341787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
341887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
341987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
342087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
342187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
342287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
342387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
342487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
342587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                            _Maxcode_, _Mode_);
342687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
342787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
342887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
342987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
343087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
343187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::result
343287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::do_unshift(state_type&,
343387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
343487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
343587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
343687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
343787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
343887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
343987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3440c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char32_t>::do_encoding() const  _NOEXCEPT
344187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
344287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
344387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
344487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
344587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3446c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char32_t>::do_always_noconv() const  _NOEXCEPT
344787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
344887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
344987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
345087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
345187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
345287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8<char32_t>::do_length(state_type&,
345387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
345487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
345587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
345687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
345787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
345887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
345987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
346087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3461c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8<char32_t>::do_max_length() const  _NOEXCEPT
346287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
346387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
346487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 7;
346587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
346687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
346787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
346887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<wchar_t, false>
346987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
347087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::result
347187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::do_out(state_type&,
347287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
347387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
347487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
347587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
347687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
347787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
347887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
347987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
348087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
348187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
348287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
348387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
348487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
348587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
348687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
348787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
348887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::result
348987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::do_in(state_type&,
349087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
349187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
349287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
349387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
349487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
349587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
349687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
349787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
349887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
349987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16be_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
350087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
350187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
350287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
350387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
350487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
350587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
350687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::result
350787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::do_unshift(state_type&,
350887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
350987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
351087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
351187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
351287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
351387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
351487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3515c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, false>::do_encoding() const  _NOEXCEPT
351687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
351787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
351887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
351987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
352087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3521c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, false>::do_always_noconv() const  _NOEXCEPT
352287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
352387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
352487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
352587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
352687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
352787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, false>::do_length(state_type&,
352887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
352987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
353087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
353187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
353287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16be_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
353387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
353487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
353587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3536c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, false>::do_max_length() const  _NOEXCEPT
353787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
353887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
353987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 6;
354087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
354187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
354287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
354387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<wchar_t, true>
354487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
354587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::result
354687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::do_out(state_type&,
354787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
354887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
354987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
355087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
355187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
355287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
355387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
355487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
355587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
355687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
355787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
355887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
355987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
356087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
356187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
356287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
356387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::result
356487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::do_in(state_type&,
356587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
356687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
356787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
356887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
356987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
357087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
357187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
357287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
357387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
357487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16le_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
357587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
357687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
357787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
357887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
357987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
358087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
358187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::result
358287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::do_unshift(state_type&,
358387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
358487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
358587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
358687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
358787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
358887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
358987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3590c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, true>::do_encoding() const  _NOEXCEPT
359187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
359287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
359387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
359487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
359587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3596c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, true>::do_always_noconv() const  _NOEXCEPT
359787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
3598d23b464e21648e252d5ae501b2db2e93dc02b1f7Howard Hinnant    return false;
359987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
360087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
360187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
360287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<wchar_t, true>::do_length(state_type&,
360387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
360487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
360587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
360687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
360787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16le_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
360887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
360987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
361087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3611c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<wchar_t, true>::do_max_length() const  _NOEXCEPT
361287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
361387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
361487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 6;
361587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
361687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
361787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
361887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<char16_t, false>
361987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
362087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::result
362187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::do_out(state_type&,
362287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
362387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
362487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
362587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
362687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
362787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
362887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
362987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
363087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
363187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs2_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
363287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
363387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
363487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
363587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
363687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
363787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
363887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::result
363987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::do_in(state_type&,
364087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
364187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
364287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
364387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
364487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
364587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
364687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
364787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
364887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_nxt = _to;
364987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16be_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
365087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
365187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
365287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
365387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
365487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
365587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
365687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::result
365787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::do_unshift(state_type&,
365887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
365987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
366087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
366187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
366287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
366387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
366487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3665c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, false>::do_encoding() const  _NOEXCEPT
366687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
366787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
366887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
366987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
367087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3671c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, false>::do_always_noconv() const  _NOEXCEPT
367287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
367387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
367487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
367587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
367687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
367787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, false>::do_length(state_type&,
367887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
367987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
368087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
368187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
368287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16be_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
368387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
368487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
368587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3686c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, false>::do_max_length() const  _NOEXCEPT
368787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
368887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
368987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 4;
369087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 2;
369187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
369287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
369387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<char16_t, true>
369487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
369587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::result
369687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::do_out(state_type&,
369787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
369887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
369987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
370087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
370187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
370287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
370387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
370487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
370587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
370687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs2_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
370787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
370887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
370987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
371087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
371187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
371287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
371387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::result
371487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::do_in(state_type&,
371587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
371687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
371787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
371887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
371987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
372087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
372187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
372287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
372387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_nxt = _to;
372487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16le_to_ucs2(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
372587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
372687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
372787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
372887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
372987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
373087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
373187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::result
373287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::do_unshift(state_type&,
373387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
373487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
373587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
373687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
373787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
373887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
373987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3740c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, true>::do_encoding() const  _NOEXCEPT
374187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
374287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
374387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
374487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
374587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3746c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, true>::do_always_noconv() const  _NOEXCEPT
374787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
3748d23b464e21648e252d5ae501b2db2e93dc02b1f7Howard Hinnant    return false;
374987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
375087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
375187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
375287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char16_t, true>::do_length(state_type&,
375387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
375487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
375587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
375687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
375787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16le_to_ucs2_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
375887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
375987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
376087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3761c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char16_t, true>::do_max_length() const  _NOEXCEPT
376287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
376387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
376487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 4;
376587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 2;
376687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
376787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
376887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<char32_t, false>
376987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
377087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::result
377187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::do_out(state_type&,
377287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
377387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
377487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
377587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
377687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
377787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
377887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
377987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
378087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
378187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf16be(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
378287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
378387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
378487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
378587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
378687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
378787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
378887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::result
378987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::do_in(state_type&,
379087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
379187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
379287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
379387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
379487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
379587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
379687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
379787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
379887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
379987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16be_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
380087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
380187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
380287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
380387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
380487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
380587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
380687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::result
380787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::do_unshift(state_type&,
380887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
380987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
381087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
381187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
381287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
381387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
381487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3815c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, false>::do_encoding() const  _NOEXCEPT
381687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
381787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
381887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
381987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
382087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3821c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, false>::do_always_noconv() const  _NOEXCEPT
382287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
382387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
382487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
382587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
382687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
382787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, false>::do_length(state_type&,
382887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
382987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
383087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
383187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
383287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16be_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
383387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
383487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
383587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3836c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, false>::do_max_length() const  _NOEXCEPT
383787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
383887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
383987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 6;
384087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
384187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
384287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
384387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf16<char32_t, true>
384487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
384587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::result
384687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::do_out(state_type&,
384787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
384887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
384987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
385087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
385187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
385287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
385387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
385487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
385587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
385687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = ucs4_to_utf16le(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
385787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
385887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
385987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
386087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
386187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
386287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
386387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::result
386487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::do_in(state_type&,
386587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
386687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
386787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
386887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
386987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
387087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
387187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
387287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
387387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
387487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16le_to_ucs4(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
387587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                               _Maxcode_, _Mode_);
387687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
387787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
387887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
387987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
388087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
388187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::result
388287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::do_unshift(state_type&,
388387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
388487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
388587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
388687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
388787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
388887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
388987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3890c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, true>::do_encoding() const  _NOEXCEPT
389187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
389287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
389387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
389487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
389587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3896c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, true>::do_always_noconv() const  _NOEXCEPT
389787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
3898d23b464e21648e252d5ae501b2db2e93dc02b1f7Howard Hinnant    return false;
389987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
390087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
390187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
390287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf16<char32_t, true>::do_length(state_type&,
390387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
390487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
390587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
390687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
390787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf16le_to_ucs4_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
390887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
390987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
391087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3911c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf16<char32_t, true>::do_max_length() const  _NOEXCEPT
391287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
391387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
391487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 6;
391587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
391687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
391787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
391887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8_utf16<wchar_t>
391987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
392087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::result
392187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_out(state_type&,
392287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
392387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
392487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
392587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
392687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
392787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
392887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
392987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
393087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
393187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
393287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
393387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
393487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
393587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
393687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
393787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
393887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::result
393987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_in(state_type&,
394087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
394187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
394287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
394387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
394487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
394587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
394687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
394787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
394887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
394987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
395087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
395187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
395287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
395387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
395487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
395587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
395687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::result
395787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_unshift(state_type&,
395887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
395987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
396087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
396187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
396287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
396387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
396487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3965c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_encoding() const  _NOEXCEPT
396687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
396787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
396887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
396987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
397087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
3971c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_always_noconv() const  _NOEXCEPT
397287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
397387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
397487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
397587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
397687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
397787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_length(state_type&,
397887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
397987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
398087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
398187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
398287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
398387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
398487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
398587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
3986c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<wchar_t>::do_max_length() const  _NOEXCEPT
398787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
398887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
398987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 7;
399087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
399187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
399287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
399387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8_utf16<char16_t>
399487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
399587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::result
399687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_out(state_type&,
399787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
399887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
399987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
400087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm = reinterpret_cast<const uint16_t*>(frm);
400187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_end = reinterpret_cast<const uint16_t*>(frm_end);
400287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint16_t* _frm_nxt = _frm;
400387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
400487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
400587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
400687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
400787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
400887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
400987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
401087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
401187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
401287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
401387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::result
401487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_in(state_type&,
401587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
401687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
401787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
401887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
401987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
402087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
402187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to = reinterpret_cast<uint16_t*>(to);
402287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_end = reinterpret_cast<uint16_t*>(to_end);
402387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint16_t* _to_nxt = _to;
402487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
402587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
402687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
402787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
402887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
402987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
403087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
403187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::result
403287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_unshift(state_type&,
403387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
403487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
403587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
403687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
403787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
403887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
403987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
4040c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_encoding() const  _NOEXCEPT
404187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
404287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
404387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
404487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
404587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
4046c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_always_noconv() const  _NOEXCEPT
404787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
404887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
404987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
405087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
405187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
405287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_length(state_type&,
405387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
405487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
405587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
405687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
405787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
405887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
405987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
406087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
4061c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char16_t>::do_max_length() const  _NOEXCEPT
406287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
406387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
406487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 7;
406587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
406687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
406787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
406887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant// __codecvt_utf8_utf16<char32_t>
406987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
407087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::result
407187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_out(state_type&,
407287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const intern_type* frm, const intern_type* frm_end, const intern_type*& frm_nxt,
407387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type* to_end, extern_type*& to_nxt) const
407487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
407587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm = reinterpret_cast<const uint32_t*>(frm);
407687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_end = reinterpret_cast<const uint32_t*>(frm_end);
407787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint32_t* _frm_nxt = _frm;
407887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to = reinterpret_cast<uint8_t*>(to);
407987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_end = reinterpret_cast<uint8_t*>(to_end);
408087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint8_t* _to_nxt = _to;
408187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf16_to_utf8(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
408287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
408387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
408487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
408587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
408687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
408787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
408887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::result
408987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_in(state_type&,
409087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, const extern_type*& frm_nxt,
409187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    intern_type* to, intern_type* to_end, intern_type*& to_nxt) const
409287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
409387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
409487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
409587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_nxt = _frm;
409687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to = reinterpret_cast<uint32_t*>(to);
409787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_end = reinterpret_cast<uint32_t*>(to_end);
409887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    uint32_t* _to_nxt = _to;
409987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    result r = utf8_to_utf16(_frm, _frm_end, _frm_nxt, _to, _to_end, _to_nxt,
410087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant                             _Maxcode_, _Mode_);
410187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    frm_nxt = frm + (_frm_nxt - _frm);
410287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to + (_to_nxt - _to);
410387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return r;
410487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
410587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
410687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::result
410787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_unshift(state_type&,
410887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    extern_type* to, extern_type*, extern_type*& to_nxt) const
410987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
411087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    to_nxt = to;
411187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return noconv;
411287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
411387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
411487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
4115c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_encoding() const  _NOEXCEPT
411687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
411787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 0;
411887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
411987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
412087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantbool
4121c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_always_noconv() const  _NOEXCEPT
412287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
412387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return false;
412487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
412587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
412687d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
412787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_length(state_type&,
412887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const extern_type* frm, const extern_type* frm_end, size_t mx) const
412987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
413087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm = reinterpret_cast<const uint8_t*>(frm);
413187d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    const uint8_t* _frm_end = reinterpret_cast<const uint8_t*>(frm_end);
413287d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return utf8_to_utf16_length(_frm, _frm_end, mx, _Maxcode_, _Mode_);
413387d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant}
413487d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant
413587d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnantint
4136c983454d300a3a1f11055c9dbfedf383a58f56ceHoward Hinnant__codecvt_utf8_utf16<char32_t>::do_max_length() const  _NOEXCEPT
413787d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant{
413887d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    if (_Mode_ & consume_header)
413987d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant        return 7;
414087d1a8a4d81892ccfaf1319d056880e89a17528eHoward Hinnant    return 4;
4141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __narrow_to_utf8<16>
4144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__narrow_to_utf8<16>::~__narrow_to_utf8()
4146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __narrow_to_utf8<32>
4150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__narrow_to_utf8<32>::~__narrow_to_utf8()
4152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __widen_from_utf8<16>
4156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__widen_from_utf8<16>::~__widen_from_utf8()
4158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// __widen_from_utf8<32>
4162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__widen_from_utf8<32>::~__widen_from_utf8()
4164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// numpunct<char> && numpunct<wchar_t>
4168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id numpunct< char  >::id;
4170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantlocale::id numpunct<wchar_t>::id;
4171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct<char>::numpunct(size_t refs)
4173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : locale::facet(refs),
4174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __decimal_point_('.'),
4175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __thousands_sep_(',')
4176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct<wchar_t>::numpunct(size_t refs)
4180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : locale::facet(refs),
4181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __decimal_point_(L'.'),
4182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant      __thousands_sep_(L',')
4183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct<char>::~numpunct()
4187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct<wchar_t>::~numpunct()
4191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char   numpunct< char  >::do_decimal_point() const {return __decimal_point_;}
4195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t numpunct<wchar_t>::do_decimal_point() const {return __decimal_point_;}
4196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char   numpunct< char  >::do_thousands_sep() const {return __thousands_sep_;}
4198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwchar_t numpunct<wchar_t>::do_thousands_sep() const {return __thousands_sep_;}
4199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring numpunct< char  >::do_grouping() const {return __grouping_;}
4201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring numpunct<wchar_t>::do_grouping() const {return __grouping_;}
4202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant string numpunct< char  >::do_truename() const {return "true";}
4204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring numpunct<wchar_t>::do_truename() const {return L"true";}
4205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant string numpunct< char  >::do_falsename() const {return "false";}
4207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring numpunct<wchar_t>::do_falsename() const {return L"false";}
4208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// numpunct_byname<char>
4210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<char>::numpunct_byname(const char* nm, size_t refs)
4212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : numpunct<char>(refs)
4213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init(nm);
4215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<char>::numpunct_byname(const string& nm, size_t refs)
4218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : numpunct<char>(refs)
4219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init(nm.c_str());
4221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<char>::~numpunct_byname()
4224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4226bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4227bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
4228bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<char>::__init(const char* nm)
4229bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4230bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (strcmp(nm, "C") != 0)
4231bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4232f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
4233d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
423405b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant        if (loc == nullptr)
4235bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            throw runtime_error("numpunct_byname<char>::numpunct_byname"
4236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                " failed to construct for " + string(nm));
423716e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
4238866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
4239f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        lconv* lc = localeconv_l(loc.get());
4240f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
4241f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        lconv* lc = __localeconv_l(loc.get());
4242f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
4243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*lc->decimal_point)
4244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __decimal_point_ = *lc->decimal_point;
4245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*lc->thousands_sep)
4246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __thousands_sep_ = *lc->thousands_sep;
4247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __grouping_ = lc->grouping;
4248cb05a0801a6273fb850cc4cb3430702ea2a3c101Sean Hunt        // localization for truename and falsename is not available
4249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// numpunct_byname<wchar_t>
4253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<wchar_t>::numpunct_byname(const char* nm, size_t refs)
4255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : numpunct<wchar_t>(refs)
4256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init(nm);
4258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<wchar_t>::numpunct_byname(const string& nm, size_t refs)
4261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : numpunct<wchar_t>(refs)
4262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __init(nm.c_str());
4264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<wchar_t>::~numpunct_byname()
4267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
4271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantnumpunct_byname<wchar_t>::__init(const char* nm)
4272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (strcmp(nm, "C") != 0)
4274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4275f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
4276d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
427705b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant        if (loc == nullptr)
4278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            throw runtime_error("numpunct_byname<char>::numpunct_byname"
4279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                " failed to construct for " + string(nm));
428016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
4281866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
4282f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        lconv* lc = localeconv_l(loc.get());
4283f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
4284f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt        lconv* lc = __localeconv_l(loc.get());
4285f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
4286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*lc->decimal_point)
4287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __decimal_point_ = *lc->decimal_point;
4288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*lc->thousands_sep)
4289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __thousands_sep_ = *lc->thousands_sep;
4290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __grouping_ = lc->grouping;
4291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        // locallization for truename and falsename is not available
4292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// num_get helpers
4296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint
4298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__num_get_base::__get_base(ios_base& iob)
4299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios_base::fmtflags __basefield = iob.flags() & ios_base::basefield;
4301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__basefield == ios_base::oct)
4302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return 8;
4303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (__basefield == ios_base::hex)
4304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return 16;
4305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (__basefield == 0)
4306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return 0;
4307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return 10;
4308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst char __num_get_base::__src[33] = "0123456789abcdefABCDEFxX+-pPiInN";
4311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
4313bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__check_grouping(const string& __grouping, unsigned* __g, unsigned* __g_end,
4314bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                 ios_base::iostate& __err)
4315bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4316bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__grouping.size() != 0)
4317bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4318bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        reverse(__g, __g_end);
4319bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        const char* __ig = __grouping.data();
4320bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        const char* __eg = __ig + __grouping.size();
4321bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (unsigned* __r = __g; __r < __g_end-1; ++__r)
4322bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (0 < *__ig && *__ig < numeric_limits<char>::max())
4324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
4325ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant                if (static_cast<unsigned>(*__ig) != *__r)
4326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                {
4327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    __err = ios_base::failbit;
4328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    return;
4329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                }
4330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
4331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__eg - __ig > 1)
4332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                ++__ig;
4333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (0 < *__ig && *__ig < numeric_limits<char>::max())
4335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4336ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant            if (static_cast<unsigned>(*__ig) < __g_end[-1] || __g_end[-1] == 0)
4337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                __err = ios_base::failbit;
4338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
4343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__num_put_base::__format_int(char* __fmtp, const char* __len, bool __signd,
4344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                             ios_base::fmtflags __flags)
4345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__flags & ios_base::showpos)
4347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '+';
4348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__flags & ios_base::showbase)
4349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '#';
4350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    while(*__len)
4351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = *__len++;
4352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if ((__flags & ios_base::basefield) == ios_base::oct)
4353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp = 'o';
4354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if ((__flags & ios_base::basefield) == ios_base::hex)
4355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__flags & ios_base::uppercase)
4357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'X';
4358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
4359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'x';
4360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (__signd)
4362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp = 'd';
4363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
4364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp = 'u';
4365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantbool
4368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__num_put_base::__format_float(char* __fmtp, const char* __len,
4369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               ios_base::fmtflags __flags)
4370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bool specify_precision = true;
4372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__flags & ios_base::showpos)
4373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '+';
4374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__flags & ios_base::showpoint)
4375bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '#';
4376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ios_base::fmtflags floatfield = __flags & ios_base::floatfield;
4377a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow    bool uppercase = (__flags & ios_base::uppercase) != 0;
4378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (floatfield == (ios_base::fixed | ios_base::scientific))
4379bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        specify_precision = false;
4380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
4381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '.';
4383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = '*';
4384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4385bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    while(*__len)
4386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        *__fmtp++ = *__len++;
4387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (floatfield == ios_base::fixed)
4388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4389bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (uppercase)
4390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'F';
4391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
4392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'f';
4393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4394bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (floatfield == ios_base::scientific)
4395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (uppercase)
4397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'E';
4398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
4399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'e';
4400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else if (floatfield == (ios_base::fixed | ios_base::scientific))
4402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (uppercase)
4404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'A';
4405bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
4406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'a';
4407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
4409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (uppercase)
4411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'G';
4412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        else
4413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            *__fmtp = 'g';
4414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return specify_precision;
4416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4418bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantchar*
4419bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__num_put_base::__identify_padding(char* __nb, char* __ne,
4420bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                                   const ios_base& __iob)
4421bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4422bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    switch (__iob.flags() & ios_base::adjustfield)
4423bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios_base::internal:
4425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__nb[0] == '-' || __nb[0] == '+')
4426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return __nb+1;
4427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__ne - __nb >= 2 && __nb[0] == '0'
4428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            && (__nb[1] == 'x' || __nb[1] == 'X'))
4429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            return __nb+2;
4430bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
4431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios_base::left:
4432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        return __ne;
4433bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case ios_base::right:
4434bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    default:
4435bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
4436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return __nb;
4438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// time_get
4441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4442bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4443bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring*
4444bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_weeks()
4445bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4446bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string weeks[14];
4447bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[0]  = "Sunday";
4448bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[1]  = "Monday";
4449bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[2]  = "Tuesday";
4450bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[3]  = "Wednesday";
4451bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[4]  = "Thursday";
4452bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[5]  = "Friday";
4453bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[6]  = "Saturday";
4454bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[7]  = "Sun";
4455bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[8]  = "Mon";
4456bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[9]  = "Tue";
4457bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[10] = "Wed";
4458bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[11] = "Thu";
4459bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[12] = "Fri";
4460bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[13] = "Sat";
4461bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return weeks;
4462bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4463bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4464bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring*
4466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_wweeks()
4467bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4468bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring weeks[14];
4469bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[0]  = L"Sunday";
4470bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[1]  = L"Monday";
4471bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[2]  = L"Tuesday";
4472bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[3]  = L"Wednesday";
4473bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[4]  = L"Thursday";
4474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[5]  = L"Friday";
4475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[6]  = L"Saturday";
4476bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[7]  = L"Sun";
4477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[8]  = L"Mon";
4478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[9]  = L"Tue";
4479bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[10] = L"Wed";
4480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[11] = L"Thu";
4481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[12] = L"Fri";
4482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    weeks[13] = L"Sat";
4483bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return weeks;
4484bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4485bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4486bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4487bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string*
4488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__weeks() const
4489bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4490bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const string* weeks = init_weeks();
4491bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return weeks;
4492bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4493bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4494bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4495bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring*
4496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__weeks() const
4497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const wstring* weeks = init_wweeks();
4499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return weeks;
4500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4501bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring*
4504bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_months()
4505bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4506bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string months[24];
4507bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[0]  = "January";
4508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[1]  = "February";
4509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[2]  = "March";
4510bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[3]  = "April";
4511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[4]  = "May";
4512bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[5]  = "June";
4513bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[6]  = "July";
4514bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[7]  = "August";
4515bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[8]  = "September";
4516bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[9]  = "October";
4517bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[10] = "November";
4518bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[11] = "December";
4519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[12] = "Jan";
4520bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[13] = "Feb";
4521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[14] = "Mar";
4522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[15] = "Apr";
4523bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[16] = "May";
4524bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[17] = "Jun";
4525bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[18] = "Jul";
4526bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[19] = "Aug";
4527bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[20] = "Sep";
4528bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[21] = "Oct";
4529bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[22] = "Nov";
4530bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[23] = "Dec";
4531bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return months;
4532bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4533bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring*
4536bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_wmonths()
4537bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4538bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring months[24];
4539bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[0]  = L"January";
4540bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[1]  = L"February";
4541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[2]  = L"March";
4542bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[3]  = L"April";
4543bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[4]  = L"May";
4544bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[5]  = L"June";
4545bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[6]  = L"July";
4546bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[7]  = L"August";
4547bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[8]  = L"September";
4548bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[9]  = L"October";
4549bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[10] = L"November";
4550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[11] = L"December";
4551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[12] = L"Jan";
4552bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[13] = L"Feb";
4553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[14] = L"Mar";
4554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[15] = L"Apr";
4555bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[16] = L"May";
4556bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[17] = L"Jun";
4557bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[18] = L"Jul";
4558bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[19] = L"Aug";
4559bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[20] = L"Sep";
4560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[21] = L"Oct";
4561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[22] = L"Nov";
4562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    months[23] = L"Dec";
4563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return months;
4564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4565bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string*
4568bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__months() const
4569bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4570bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const string* months = init_months();
4571bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return months;
4572bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4574bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring*
4576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__months() const
4577bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4578bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const wstring* months = init_wmonths();
4579bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return months;
4580bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4581bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4583bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring*
4584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_am_pm()
4585bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4586bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string am_pm[24];
4587bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    am_pm[0]  = "AM";
4588bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    am_pm[1]  = "PM";
4589bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return am_pm;
4590bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4591bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
4593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring*
4594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantinit_wam_pm()
4595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring am_pm[24];
4597bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    am_pm[0]  = L"AM";
4598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    am_pm[1]  = L"PM";
4599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return am_pm;
4600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4602bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string*
4604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__am_pm() const
4605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4606bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const string* am_pm = init_am_pm();
4607bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return am_pm;
4608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4609bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4610bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4611bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring*
4612bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__am_pm() const
4613bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4614bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static const wstring* am_pm = init_wam_pm();
4615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return am_pm;
4616bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4619bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string&
4620bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__x() const
4621bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4622bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string s("%m/%d/%y");
4623bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring&
4628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__x() const
4629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring s(L"%m/%d/%y");
4631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4633bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string&
4636bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__X() const
4637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string s("%H:%M:%S");
4639bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4643bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring&
4644bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__X() const
4645bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4646bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring s(L"%H:%M:%S");
4647bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4649bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4650bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4651bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string&
4652bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__c() const
4653bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4654bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string s("%a %b %d %H:%M:%S %Y");
4655bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring&
4660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__c() const
4661bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring s(L"%a %b %d %H:%M:%S %Y");
4663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4664bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4665bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4666bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4667bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst string&
4668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<char>::__r() const
4669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4670bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static string s("%I:%M:%S %p");
4671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4672bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4673bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4674bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4675bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantconst wstring&
4676bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_c_storage<wchar_t>::__r() const
4677bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4678bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    static wstring s(L"%I:%M:%S %p");
4679bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return s;
4680bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4681bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// time_get_byname
4683bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4684bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get::__time_get(const char* nm)
4685bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __loc_(newlocale(LC_ALL_MASK, nm, 0))
4686bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4687d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4688bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__loc_ == 0)
4689bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("time_get_byname"
4690bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
469116e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
4692bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4693bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get::__time_get(const string& nm)
4695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __loc_(newlocale(LC_ALL_MASK, nm.c_str(), 0))
4696bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4697d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
4698bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__loc_ == 0)
4699bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("time_get_byname"
4700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + nm);
470116e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
4702bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4703bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get::~__time_get()
4705bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
4706bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    freelocale(__loc_);
4707bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4708a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#if defined(__clang__)
4709335b1518e475a697727b76c9050b48ba6d120a3bHoward Hinnant#pragma clang diagnostic ignored "-Wmissing-field-initializers"
4710a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#endif
4711a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#if defined(__GNUG__)
471221772ec06376b965fd868a68bcf55e60c5a0dcc9Howard Hinnant#pragma GCC   diagnostic ignored "-Wmissing-field-initializers"
4713a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#endif
4714335b1518e475a697727b76c9050b48ba6d120a3bHoward Hinnant
4715bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4716bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstring
4717bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<char>::__analyze(char fmt, const ctype<char>& ct)
4718bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
47193074a05cdcd53569d7c52d224c1adf0681decc0dHoward Hinnant    tm t = {0};
4720bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_sec = 59;
4721bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_min = 55;
4722bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 23;
4723bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_mday = 31;
4724bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_mon = 11;
4725bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_year = 161;
4726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_wday = 6;
4727bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_yday = 364;
4728bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_isdst = -1;
4729bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char buf[100];
4730bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char f[3] = {0};
4731bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f[0] = '%';
4732bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f[1] = fmt;
4733bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t n = strftime_l(buf, countof(buf), f, &t, __loc_);
4734bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char* bb = buf;
4735bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char* be = buf + n;
4736bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    string result;
4737bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    while (bb != be)
4738bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4739bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (ct.is(ctype_base::space, *bb))
4740bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4741bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(' ');
4742bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++bb; bb != be && ct.is(ctype_base::space, *bb); ++bb)
4743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                ;
4744bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        char* w = bb;
4747bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios_base::iostate err = ios_base::goodbit;
4748ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        ptrdiff_t i = __scan_keyword(w, be, this->__weeks_, this->__weeks_+14,
4749bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               ct, err, false)
4750bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               - this->__weeks_;
4751bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i < 14)
4752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back('%');
4754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 7)
4755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('A');
4756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            else
4757bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('a');
4758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            bb = w;
4759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        w = bb;
4762bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i = __scan_keyword(w, be, this->__months_, this->__months_+24,
4763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           ct, err, false)
4764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           - this->__months_;
4765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i < 24)
4766bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back('%');
4768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 12)
4769bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('B');
4770bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            else
4771bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('b');
4772bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (fmt == 'x' && ct.is(ctype_base::digit, this->__months_[i][0]))
4773bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.back() = 'm';
4774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            bb = w;
4775bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4776bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (this->__am_pm_[0].size() + this->__am_pm_[1].size() > 0)
4778bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4779bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            w = bb;
4780bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            i = __scan_keyword(w, be, this->__am_pm_, this->__am_pm_+2,
4781bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               ct, err, false) - this->__am_pm_;
4782bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 2)
4783bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
4784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('p');
4786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                bb = w;
4787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                continue;
4788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
4789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        w = bb;
4791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (ct.is(ctype_base::digit, *bb))
4792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch(__get_up_to_n_digits(bb, be, err, ct, 4))
4794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
4795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 6:
4796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('w');
4798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 7:
4800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('u');
4802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 11:
4804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('I');
4806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4807bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 12:
4808bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4809bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('m');
4810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 23:
4812bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4813bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('H');
4814bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4815bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 31:
4816bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4817bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('d');
4818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 55:
4820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('M');
4822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 59:
4824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('S');
4826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 61:
4828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('y');
4830bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4831bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 364:
4832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('j');
4834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 2061:
4836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('%');
4837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back('Y');
4838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
4840bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                for (; w != bb; ++w)
4841bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    result.push_back(*w);
4842bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4843bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
4844bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4845bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4846bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (*bb == '%')
4847bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back('%');
4849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back('%');
4850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++bb;
4851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result.push_back(*bb);
4854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++bb;
4855bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
4856bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return result;
4857bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
4858bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
4859a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#if defined(__clang__)
4860ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant#pragma clang diagnostic ignored "-Wmissing-braces"
4861a36451371c101fbaf1efd61f66ec2a0721974085Marshall Clow#endif
4862ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant
4863bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
4864bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantwstring
4865bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<wchar_t>::__analyze(char fmt, const ctype<wchar_t>& ct)
4866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
48673074a05cdcd53569d7c52d224c1adf0681decc0dHoward Hinnant    tm t = {0};
4868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_sec = 59;
4869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_min = 55;
4870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 23;
4871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_mday = 31;
4872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_mon = 11;
4873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_year = 161;
4874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_wday = 6;
4875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_yday = 364;
4876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_isdst = -1;
4877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char buf[100];
4878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char f[3] = {0};
4879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f[0] = '%';
4880bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    f[1] = fmt;
4881bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    strftime_l(buf, countof(buf), f, &t, __loc_);
4882bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t wbuf[100];
4883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t* wbb = wbuf;
4884bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mbstate_t mb = {0};
4885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* bb = buf;
4886866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
4887bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = mbsrtowcs_l( wbb, &bb, countof(wbuf), &mb, __loc_);
4888f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
4889bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = __mbsrtowcs_l( wbb, &bb, countof(wbuf), &mb, __loc_);
4890f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
4891ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
4892bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
4893ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    wchar_t* wbe = wbb + j;
4894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wstring result;
4895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    while (wbb != wbe)
4896bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
4897bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (ct.is(ctype_base::space, *wbb))
4898bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4899bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(L' ');
4900bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++wbb; wbb != wbe && ct.is(ctype_base::space, *wbb); ++wbb)
4901bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                ;
4902bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4903bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4904bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wchar_t* w = wbb;
4905bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ios_base::iostate err = ios_base::goodbit;
4906ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        ptrdiff_t i = __scan_keyword(w, wbe, this->__weeks_, this->__weeks_+14,
4907bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               ct, err, false)
4908bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               - this->__weeks_;
4909bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i < 14)
4910bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4911bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(L'%');
4912bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 7)
4913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'A');
4914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            else
4915bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'a');
4916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            wbb = w;
4917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        w = wbb;
4920bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        i = __scan_keyword(w, wbe, this->__months_, this->__months_+24,
4921bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           ct, err, false)
4922bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                           - this->__months_;
4923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i < 24)
4924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4925bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(L'%');
4926bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 12)
4927bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'B');
4928bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            else
4929bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'b');
4930bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (fmt == 'x' && ct.is(ctype_base::digit, this->__months_[i][0]))
4931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.back() = L'm';
4932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            wbb = w;
4933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
4934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (this->__am_pm_[0].size() + this->__am_pm_[1].size() > 0)
4936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            w = wbb;
4938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            i = __scan_keyword(w, wbe, this->__am_pm_, this->__am_pm_+2,
4939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                               ct, err, false) - this->__am_pm_;
4940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i < 2)
4941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
4942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4943bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'p');
4944bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                wbb = w;
4945bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                continue;
4946bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
4947bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
4948bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        w = wbb;
4949bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (ct.is(ctype_base::digit, *wbb))
4950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
4951bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch(__get_up_to_n_digits(wbb, wbe, err, ct, 4))
4952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
4953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 6:
4954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'w');
4956bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 7:
4958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'u');
4960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 11:
4962bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4963bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'I');
4964bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4965bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 12:
4966bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4967bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'm');
4968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 23:
4970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'H');
4972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 31:
4974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'd');
4976bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 55:
4978bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4979bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'M');
4980bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4981bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 59:
4982bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4983bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'S');
4984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 61:
4986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'y');
4988bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4989bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 364:
4990bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4991bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'j');
4992bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4993bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            case 2061:
4994bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'%');
4995bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                result.push_back(L'Y');
4996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
4997bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
4998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                for (; w != wbb; ++w)
4999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    result.push_back(*w);
5000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
5003bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5004bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (ct.narrow(*wbb, 0) == '%')
5005bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(L'%');
5007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            result.push_back(L'%');
5008bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++wbb;
5009bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            continue;
5010bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5011bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        result.push_back(*wbb);
5012bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++wbb;
5013bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return result;
5015bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5017bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5018bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5019bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<char>::init(const ctype<char>& ct)
5020bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5021cd9923623167203ae0477cacb9fa49113595c298Howard Hinnant    tm t = {0};
5022bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char buf[100];
5023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __weeks_
5024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < 7; ++i)
5025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5026bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        t.tm_wday = i;
5027bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%A", &t, __loc_);
5028bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __weeks_[i] = buf;
5029bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%a", &t, __loc_);
5030bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __weeks_[i+7] = buf;
5031bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __months_
5033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < 12; ++i)
5034bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5035bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        t.tm_mon = i;
5036bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%B", &t, __loc_);
5037bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __months_[i] = buf;
5038bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%b", &t, __loc_);
5039bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __months_[i+12] = buf;
5040bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5041bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __am_pm_
5042bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 1;
5043bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    strftime_l(buf, countof(buf), "%p", &t, __loc_);
5044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __am_pm_[0] = buf;
5045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 13;
5046bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    strftime_l(buf, countof(buf), "%p", &t, __loc_);
5047bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __am_pm_[1] = buf;
5048bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __c_ = __analyze('c', ct);
5049bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __r_ = __analyze('r', ct);
5050bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __x_ = __analyze('x', ct);
5051bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __X_ = __analyze('X', ct);
5052bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5053bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5054bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5055bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5056bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<wchar_t>::init(const ctype<wchar_t>& ct)
5057bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5058bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    tm t = {0};
5059bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char buf[100];
5060bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t wbuf[100];
5061bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t* wbe;
5062bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mbstate_t mb = {0};
5063bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __weeks_
5064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < 7; ++i)
5065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        t.tm_wday = i;
5067bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%A", &t, __loc_);
5068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5069bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        const char* bb = buf;
5070866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5071bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5072f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5073bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5074f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5075ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __weeks_[i].assign(wbuf, wbe);
5079bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%a", &t, __loc_);
5080bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5081bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = buf;
5082866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5083bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5084f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5085bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5086f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5087ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5088bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5089bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5090bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __weeks_[i+7].assign(wbuf, wbe);
5091bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5092bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __months_
5093bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (int i = 0; i < 12; ++i)
5094bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5095bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        t.tm_mon = i;
5096bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%B", &t, __loc_);
5097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        const char* bb = buf;
5099866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5100bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5101f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5102bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5103f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5104ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __months_[i].assign(wbuf, wbe);
5108bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        strftime_l(buf, countof(buf), "%b", &t, __loc_);
5109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = buf;
5111866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5112bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5113f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5114bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5115f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5116ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __months_[i+12].assign(wbuf, wbe);
5120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    // __am_pm_
5122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 1;
5123bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    strftime_l(buf, countof(buf), "%p", &t, __loc_);
5124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mb = mbstate_t();
5125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* bb = buf;
5126866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5127bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5128f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5129bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5130f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5131ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
5132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
5133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wbe = wbuf + j;
5134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __am_pm_[0].assign(wbuf, wbe);
5135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    t.tm_hour = 13;
5136bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    strftime_l(buf, countof(buf), "%p", &t, __loc_);
5137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mb = mbstate_t();
5138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    bb = buf;
5139866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5140bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5141f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5142bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, __loc_);
5143f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5144ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
5145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
5146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wbe = wbuf + j;
5147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __am_pm_[1].assign(wbuf, wbe);
5148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __c_ = __analyze('c', ct);
5149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __r_ = __analyze('r', ct);
5150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __x_ = __analyze('x', ct);
5151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __X_ = __analyze('X', ct);
5152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class CharT>
5155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct _LIBCPP_HIDDEN __time_get_temp
5156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : public ctype_byname<CharT>
5157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit __time_get_temp(const char* nm)
5159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : ctype_byname<CharT>(nm, 1) {}
5160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    explicit __time_get_temp(const string& nm)
5161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        : ctype_byname<CharT>(nm, 1) {}
5162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant};
5163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<char>::__time_get_storage(const char* __nm)
5166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __time_get(__nm)
5167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const __time_get_temp<char> ct(__nm);
5169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    init(ct);
5170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5172bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5173bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<char>::__time_get_storage(const string& __nm)
5174bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __time_get(__nm)
5175bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5176bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const __time_get_temp<char> ct(__nm);
5177bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    init(ct);
5178bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5179bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5180bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5181bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<wchar_t>::__time_get_storage(const char* __nm)
5182bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __time_get(__nm)
5183bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5184bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const __time_get_temp<wchar_t> ct(__nm);
5185bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    init(ct);
5186bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5187bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5188bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5189bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<wchar_t>::__time_get_storage(const string& __nm)
5190bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __time_get(__nm)
5191bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5192bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const __time_get_temp<wchar_t> ct(__nm);
5193bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    init(ct);
5194bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5195bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5196bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5197bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttime_base::dateorder
5198bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<char>::__do_date_order() const
5199bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5200bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unsigned i;
5201bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (i = 0; i < __x_.size(); ++i)
5202bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == '%')
5203bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5204bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ++i;
5205bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    switch (__x_[i])
5206bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5207bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case 'y':
5208bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case 'Y':
5209bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5210bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == '%')
5211bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5212bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5213bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5214bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5215bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (__x_[i])
5216bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5217bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case 'm':
5218bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5219bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == '%')
5220bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5221bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5222bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5223bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5224bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == 'd')
5225bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::ymd;
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                return time_base::ydm;
5236bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5237bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5238bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5239bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case 'm':
5240bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5241bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == '%')
5242bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5243bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5244bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5245bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5246bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == 'd')
5247bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5248bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5249bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == '%')
5250bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5251bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5252bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5253bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5254bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == 'y' || __x_[i] == 'Y')
5255bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::mdy;
5256bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5257bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5258bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5259bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case 'd':
5260bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5261bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == '%')
5262bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5263bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5264bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5265bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5266bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == 'm')
5267bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5268bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5269bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == '%')
5270bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5271bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5272bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5273bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5274bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == 'y' || __x_[i] == 'Y')
5275bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::dmy;
5276bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5277bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5278bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5279bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5280bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return time_base::no_order;
5281bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5282bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5283bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <>
5284bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttime_base::dateorder
5285bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_get_storage<wchar_t>::__do_date_order() const
5286bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5287bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    unsigned i;
5288bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    for (i = 0; i < __x_.size(); ++i)
5289bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == L'%')
5290bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5291bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    ++i;
5292bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    switch (__x_[i])
5293bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5294bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case L'y':
5295bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case L'Y':
5296bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5297bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'%')
5298bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5299bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5300bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5301bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5302bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (__x_[i])
5303bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5304bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        case L'm':
5305bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5306bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == L'%')
5307bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5308bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5309bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5310bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5311bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'd')
5312bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::ymd;
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                return time_base::ydm;
5323bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5324bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5325bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5326bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case L'm':
5327bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5328bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'%')
5329bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5330bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5331bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5332bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5333bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == L'd')
5334bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5335bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5336bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == L'%')
5337bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5338bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5339bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5340bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5341bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'y' || __x_[i] == L'Y')
5342bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::mdy;
5343bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5344bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5345bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5346bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    case L'd':
5347bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        for (++i; i < __x_.size(); ++i)
5348bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'%')
5349bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5350bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (i == __x_.size())
5351bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5352bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        ++i;
5353bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        if (__x_[i] == L'm')
5354bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5355bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            for (++i; i < __x_.size(); ++i)
5356bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                if (__x_[i] == L'%')
5357bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                    break;
5358bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (i == __x_.size())
5359bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5360bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            ++i;
5361bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            if (__x_[i] == L'y' || __x_[i] == L'Y')
5362bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return time_base::dmy;
5363bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5364bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5365bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5366bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5367bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    return time_base::no_order;
5368bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5369bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5370bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// time_put
5371bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5372bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_put::__time_put(const char* nm)
5373bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __loc_(newlocale(LC_ALL_MASK, nm, 0))
5374bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5375d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5376bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__loc_ == 0)
5377bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("time_put_byname"
5378bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
537916e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5380bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5381bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5382bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_put::__time_put(const string& nm)
5383bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    : __loc_(newlocale(LC_ALL_MASK, nm.c_str(), 0))
5384bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5385d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
5386bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__loc_ == 0)
5387bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("time_put_byname"
5388bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + nm);
538916e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5390bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5391bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5392bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_put::~__time_put()
5393bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
53949a06b9d017adae19f9289b96303b9985d60403f3Joerg Sonnenberger    if (__loc_ != _LIBCPP_GET_C_LOCALE)
5395bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        freelocale(__loc_);
5396bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5397bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5398bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5399bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_put::__do_put(char* __nb, char*& __ne, const tm* __tm,
5400bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                     char __fmt, char __mod) const
5401bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5402bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char fmt[] = {'%', __fmt, __mod, 0};
5403bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (__mod != 0)
5404bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        swap(fmt[1], fmt[2]);
5405bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t n = strftime_l(__nb, countof(__nb, __ne), fmt, __tm, __loc_);
5406bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __ne = __nb + n;
5407bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5408bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5409bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5410bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant__time_put::__do_put(wchar_t* __wb, wchar_t*& __we, const tm* __tm,
5411bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                     char __fmt, char __mod) const
5412bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5413bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char __nar[100];
5414bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    char* __ne = __nar + 100;
5415bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __do_put(__nar, __ne, __tm, __fmt, __mod);
5416bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mbstate_t mb = {0};
5417bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* __nb = __nar;
5418866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5419bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = mbsrtowcs_l(__wb, &__nb, countof(__wb, __we), &mb, __loc_);
5420f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5421bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = __mbsrtowcs_l(__wb, &__nb, countof(__wb, __we), &mb, __loc_);
5422f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5423ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
5424bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
5425bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __we = __wb + j;
5426bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5427bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5428bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// moneypunct_byname
5429bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5430558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskintemplate <class charT>
5431bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstatic
5432bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5433558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin__init_pat(money_base::pattern& pat, basic_string<charT>& __curr_symbol_,
5434558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin           bool intl, char cs_precedes, char sep_by_space, char sign_posn,
5435558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin           charT space_char)
5436bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5437bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char sign = static_cast<char>(money_base::sign);
5438bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char space = static_cast<char>(money_base::space);
5439bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char none = static_cast<char>(money_base::none);
5440bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char symbol = static_cast<char>(money_base::symbol);
5441bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char value = static_cast<char>(money_base::value);
5442558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    const bool symbol_contains_sep = intl && __curr_symbol_.size() == 4;
5443558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin
5444558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Comments on case branches reflect 'C11 7.11.2.1 The localeconv
5445558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // function'. "Space between sign and symbol or value" means that
5446558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // if the sign is adjacent to the symbol, there's a space between
5447558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // them, and otherwise there's a space between the sign and value.
5448558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    //
5449558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // C11's localeconv specifies that the fourth character of an
5450558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // international curr_symbol is used to separate the sign and
5451558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // value when sep_by_space says to do so. C++ can't represent
5452558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // that, so we just use a space.  When sep_by_space says to
5453558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // separate the symbol and value-or-sign with a space, we rearrange the
5454558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // curr_symbol to put its spacing character on the correct side of
5455558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // the symbol.
5456558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    //
5457558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // We also need to avoid adding an extra space between the sign
5458558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // and value when the currency symbol is suppressed (by not
5459558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // setting showbase).  We match glibc's strfmon by interpreting
5460558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // sep_by_space==1 as "omit the space when the currency symbol is
5461558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // absent".
5462558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    //
5463558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Users who want to get this right should use ICU instead.
5464558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin
5465bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    switch (cs_precedes)
5466bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5467558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    case 0:  // value before curr_symbol
5468558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        if (symbol_contains_sep) {
5469558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            // Move the separator to before the symbol, to place it
5470558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            // between the value and symbol.
5471558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            rotate(__curr_symbol_.begin(), __curr_symbol_.begin() + 3,
5472558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                   __curr_symbol_.end());
5473558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        }
5474bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (sign_posn)
5475bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5476558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 0:  // Parentheses surround the quantity and currency symbol.
5477bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = sign;
5478bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[1] = value;
5479558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            pat.field[2] = none;  // Any space appears in the symbol.
5480bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = symbol;
5481bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5482bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5483558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5484558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // This case may have changed between C99 and C11;
5485558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // assume the currency symbol matches the intention.
5486558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5487558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // The "sign" is two parentheses, so no space here either.
5488bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5489558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5490558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5491558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5492558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5493558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5494558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5495558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5496bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5497bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5498bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5499bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5500bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5501558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 1:  // The sign string precedes the quantity and currency symbol.
5502bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = sign;
5503bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = symbol;
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] = value;
5508bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = none;
5509bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5510558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5511bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = value;
5512558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[2] = none;
5513558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5514558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5515558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5516558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5517558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5518558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5519bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5520558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5521bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = space;
5522bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = value;
5523558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5524558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5525558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // has already appeared after the sign.
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 2:  // The sign string succeeds the quantity and currency symbol.
5534bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = value;
5535bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = sign;
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] = symbol;
5541bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5542558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5543558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5544558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5545558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[1]=space so that when
5546558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5547558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5548558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5549558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[1] = none;
5550bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5551bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5552558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5553bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = symbol;
5554bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = space;
5555558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5556558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5557558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // should not be removed if showbase is absent.
5558558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.erase(__curr_symbol_.begin());
5559558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5560bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5561bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5562bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5563bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5564bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5565558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 3:  // The sign string immediately precedes the currency symbol.
5566bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = value;
5567bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = symbol;
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] = sign;
5573bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5574558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5575bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = space;
5576bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = sign;
5577558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5578558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5579558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // has already appeared before the sign.
5580558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.erase(__curr_symbol_.begin());
5581558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5582bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5583558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5584bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = sign;
5585558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[2] = none;
5586558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5587558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5588558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5589558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5590558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5591558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5592bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5593bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5594bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5595bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5596bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5597558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 4:  // The sign string immediately succeeds the currency symbol.
5598bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = value;
5599bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = sign;
5600bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5601bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5602558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5603bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = none;
5604bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5605bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5606558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5607558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[1] = none;
5608bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5609558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5610558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5611558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[1]=space so that when
5612558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5613558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5614558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5615bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5616558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5617bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = symbol;
5618bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = space;
5619558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5620558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5621558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // should not disappear when showbase is absent.
5622558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.erase(__curr_symbol_.begin());
5623558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5624bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5625bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5626bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5627bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5628bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5629bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        default:
5630bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5631bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5632bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5633558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    case 1:  // curr_symbol before value
5634bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        switch (sign_posn)
5635bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        {
5636558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 0:  // Parentheses surround the quantity and currency symbol.
5637bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = sign;
5638bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[1] = symbol;
5639558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            pat.field[2] = none;  // Any space appears in the symbol.
5640bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = value;
5641bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5642bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5643558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5644558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // This case may have changed between C99 and C11;
5645558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // assume the currency symbol matches the intention.
5646558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5647558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                // The "sign" is two parentheses, so no space here either.
5648bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5649558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5650558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5651558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5652558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5653558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5654558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.insert(0, 1, space_char);
5655558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5656bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5657bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5658bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5659bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5660bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5661558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 1:  // The sign string precedes the quantity and currency symbol.
5662bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = sign;
5663bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = value;
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] = symbol;
5668bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = none;
5669bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5670558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5671bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = symbol;
5672558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[2] = none;
5673558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5674558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5675558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=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] = space;
5682bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5683558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5684558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5685558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // has already appeared after 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 2:  // The sign string succeeds the quantity and currency symbol.
5694bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = symbol;
5695bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = sign;
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] = none;
5700bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = value;
5701bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5702558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5703558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[1] = none;
5704bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = value;
5705558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5706558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5707558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[1]=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] = value;
5714bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = space;
5715558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5716558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5717558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // will appear before 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 3:  // The sign string immediately precedes the currency symbol.
5726bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = sign;
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] = symbol;
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] = symbol;
5736558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[2] = none;
5737558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5738558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5739558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[2]=space so that when
5740558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5741558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.push_back(space_char);
5742558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5743bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5744558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5745bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = space;
5746bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = symbol;
5747558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5748558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5749558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // has already appeared after the sign.
5750558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.pop_back();
5751558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5752bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5753bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            default:
5754bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5755bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5756bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5757558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin        case 4:  // The sign string immediately succeeds the currency symbol.
5758bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[0] = symbol;
5759bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            pat.field[3] = value;
5760bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            switch (sep_by_space)
5761bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            {
5762558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 0:  // No space separates the currency symbol and value.
5763bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = sign;
5764bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = none;
5765bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5766558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 1:  // Space between currency-and-sign or currency and value.
5767bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[1] = sign;
5768bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = space;
5769558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (symbol_contains_sep) {
5770558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // Remove the separator from the symbol, since it
5771558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // should not disappear when showbase is absent.
5772558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.pop_back();
5773558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5774bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5775558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin            case 2:  // Space between sign and currency or value.
5776558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                pat.field[1] = none;
5777bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                pat.field[2] = sign;
5778558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                if (!symbol_contains_sep) {
5779558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // We insert the space into the symbol instead of
5780558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // setting pat.field[1]=space so that when
5781558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    // showbase is not set, the space goes away too.
5782558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                    __curr_symbol_.push_back(space_char);
5783558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin                }
5784bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                return;
5785bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant           default:
5786bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                break;
5787bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            }
5788bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5789bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        default:
5790bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            break;
5791bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        }
5792bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5793bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    default:
5794bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        break;
5795bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5796bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    pat.field[0] = symbol;
5797bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    pat.field[1] = sign;
5798bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    pat.field[2] = none;
5799bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    pat.field[3] = value;
5800bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5801bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5802bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<>
5803bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5804bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmoneypunct_byname<char, false>::init(const char* nm)
5805bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5806bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef moneypunct<char, false> base;
5807f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5808d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
580905b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant    if (loc == nullptr)
5810bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("moneypunct_byname"
5811bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
581216e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5813866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5814f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = localeconv_l(loc.get());
5815f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5816f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = __localeconv_l(loc.get());
5817f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5818bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_decimal_point)
5819bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = *lc->mon_decimal_point;
5820bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5821bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = base::do_decimal_point();
5822bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_thousands_sep)
5823bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = *lc->mon_thousands_sep;
5824bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5825bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = base::do_thousands_sep();
5826bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __grouping_ = lc->mon_grouping;
5827bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __curr_symbol_ = lc->currency_symbol;
5828bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->frac_digits != CHAR_MAX)
5829bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = lc->frac_digits;
5830bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5831bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = base::do_frac_digits();
5832bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->p_sign_posn == 0)
5833bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = "()";
5834bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5835bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = lc->positive_sign;
5836bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->n_sign_posn == 0)
5837bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = "()";
5838bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5839bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = lc->negative_sign;
5840558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Assume the positive and negative formats will want spaces in
5841558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // the same places in curr_symbol since there's no way to
5842558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // represent anything else.
5843558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    string_type __dummy_curr_symbol = __curr_symbol_;
5844558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, false,
5845558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' ');
5846558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, false,
5847558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' ');
5848bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5849bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5850bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<>
5851bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5852bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmoneypunct_byname<char, true>::init(const char* nm)
5853bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5854bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef moneypunct<char, true> base;
5855f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5856d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
585705b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant    if (loc == nullptr)
5858bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("moneypunct_byname"
5859bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
586016e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5861866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5862f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = localeconv_l(loc.get());
5863f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5864f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = __localeconv_l(loc.get());
5865f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5866bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_decimal_point)
5867bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = *lc->mon_decimal_point;
5868bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5869bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = base::do_decimal_point();
5870bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_thousands_sep)
5871bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = *lc->mon_thousands_sep;
5872bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5873bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = base::do_thousands_sep();
5874bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __grouping_ = lc->mon_grouping;
5875bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __curr_symbol_ = lc->int_curr_symbol;
5876bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_frac_digits != CHAR_MAX)
5877bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = lc->int_frac_digits;
5878bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5879bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = base::do_frac_digits();
5880ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
58816cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant    if (lc->p_sign_posn == 0)
5882e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#else // _LIBCPP_MSVCRT
5883bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_p_sign_posn == 0)
5884e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#endif // !_LIBCPP_MSVCRT
5885bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = "()";
5886bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5887bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = lc->positive_sign;
5888ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
58896cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant    if(lc->n_sign_posn == 0)
5890e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#else // _LIBCPP_MSVCRT
5891bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_n_sign_posn == 0)
5892e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#endif // !_LIBCPP_MSVCRT
5893bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = "()";
5894bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5895bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = lc->negative_sign;
5896558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Assume the positive and negative formats will want spaces in
5897558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // the same places in curr_symbol since there's no way to
5898558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // represent anything else.
5899558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    string_type __dummy_curr_symbol = __curr_symbol_;
5900ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
5901558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, true,
5902558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, ' ');
5903558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, true,
5904558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, ' ');
5905e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#else // _LIBCPP_MSVCRT
5906558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, true,
5907558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_p_cs_precedes, lc->int_p_sep_by_space,
5908558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_p_sign_posn, ' ');
5909558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, true,
5910558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_n_cs_precedes, lc->int_n_sep_by_space,
5911558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_n_sign_posn, ' ');
5912e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#endif // !_LIBCPP_MSVCRT
5913bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5914bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5915bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<>
5916bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
5917bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmoneypunct_byname<wchar_t, false>::init(const char* nm)
5918bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
5919bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef moneypunct<wchar_t, false> base;
5920f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
5921d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
592205b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant    if (loc == nullptr)
5923bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("moneypunct_byname"
5924bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
592516e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
5926866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5927f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = localeconv_l(loc.get());
5928f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5929f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = __localeconv_l(loc.get());
5930f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5931bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_decimal_point)
5932bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = static_cast<wchar_t>(*lc->mon_decimal_point);
5933bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5934bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = base::do_decimal_point();
5935bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_thousands_sep)
5936bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = static_cast<wchar_t>(*lc->mon_thousands_sep);
5937bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5938bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = base::do_thousands_sep();
5939bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __grouping_ = lc->mon_grouping;
5940bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t wbuf[100];
5941bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mbstate_t mb = {0};
5942bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* bb = lc->currency_symbol;
5943866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5944bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5945f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5946bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5947f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5948ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
5949bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
5950bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t* wbe = wbuf + j;
5951bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __curr_symbol_.assign(wbuf, wbe);
5952bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->frac_digits != CHAR_MAX)
5953bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = lc->frac_digits;
5954bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5955bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = base::do_frac_digits();
5956bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->p_sign_posn == 0)
5957bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = L"()";
5958bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5959bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5960bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5961bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = lc->positive_sign;
5962866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5963bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5964f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5965bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5966f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5967ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5968bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5969bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5970bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_.assign(wbuf, wbe);
5971bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5972bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->n_sign_posn == 0)
5973bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = L"()";
5974bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
5975bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
5976bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
5977bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = lc->negative_sign;
5978866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
5979bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5980f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
5981bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
5982f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
5983ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
5984bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
5985bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
5986bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_.assign(wbuf, wbe);
5987bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
5988558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Assume the positive and negative formats will want spaces in
5989558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // the same places in curr_symbol since there's no way to
5990558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // represent anything else.
5991558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    string_type __dummy_curr_symbol = __curr_symbol_;
5992558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, false,
5993558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' ');
5994558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, false,
5995558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' ');
5996bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
5997bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
5998bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate<>
5999bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid
6000bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantmoneypunct_byname<wchar_t, true>::init(const char* nm)
6001bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
6002bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    typedef moneypunct<wchar_t, true> base;
6003f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    __locale_unique_ptr loc(newlocale(LC_ALL_MASK, nm, 0), freelocale);
6004d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
600505b57d5cdf8acb3933b5f6f22cc81f9dee7408d2Howard Hinnant    if (loc == nullptr)
6006bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        throw runtime_error("moneypunct_byname"
6007bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant                            " failed to construct for " + string(nm));
600816e6e1d72fd6a10fc165eba4ca4ed2fa7c45df78Howard Hinnant#endif  // _LIBCPP_NO_EXCEPTIONS
6009866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
6010f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = localeconv_l(loc.get());
6011f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
6012f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt    lconv* lc = __localeconv_l(loc.get());
6013f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
6014bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_decimal_point)
6015bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = static_cast<wchar_t>(*lc->mon_decimal_point);
6016bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
6017bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __decimal_point_ = base::do_decimal_point();
6018bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (*lc->mon_thousands_sep)
6019bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = static_cast<wchar_t>(*lc->mon_thousands_sep);
6020bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
6021bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __thousands_sep_ = base::do_thousands_sep();
6022bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __grouping_ = lc->mon_grouping;
6023bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t wbuf[100];
6024bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    mbstate_t mb = {0};
6025bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    const char* bb = lc->int_curr_symbol;
6026866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
6027bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6028f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
6029bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant    size_t j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6030f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
6031ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant    if (j == size_t(-1))
6032bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __throw_runtime_error("locale not supported");
6033bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    wchar_t* wbe = wbuf + j;
6034bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    __curr_symbol_.assign(wbuf, wbe);
6035bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_frac_digits != CHAR_MAX)
6036bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = lc->int_frac_digits;
6037bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
6038bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __frac_digits_ = base::do_frac_digits();
6039ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
60406cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant    if (lc->p_sign_posn == 0)
6041e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#else // _LIBCPP_MSVCRT
6042bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_p_sign_posn == 0)
6043e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#endif // !_LIBCPP_MSVCRT
6044bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_ = L"()";
6045bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
6046bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
6047bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
6048bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = lc->positive_sign;
6049866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
6050bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6051f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
6052bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6053f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
6054ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
6055bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
6056bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
6057bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __positive_sign_.assign(wbuf, wbe);
6058bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
6059ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
60606cd05eeb35636c33a5cd951a7b5501f51611b469Howard Hinnant    if (lc->n_sign_posn == 0)
6061e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#else // _LIBCPP_MSVCRT
6062bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    if (lc->int_n_sign_posn == 0)
6063e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#endif // !_LIBCPP_MSVCRT
6064bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_ = L"()";
6065bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    else
6066bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    {
6067bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        mb = mbstate_t();
6068bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        bb = lc->negative_sign;
6069866569b8c31f680ce95fd403ac5e21bd4552a1b8Howard Hinnant#ifdef _LIBCPP_LOCALE__L_EXTENSIONS
6070bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6071f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#else
6072bf68bdc4edff1d61656e93ea55450186a703ca57Howard Hinnant        j = __mbsrtowcs_l(wbuf, &bb, countof(wbuf), &mb, loc.get());
6073f3907e6cc0b6ed9e9d4a45a9989ce961df307c8aSean Hunt#endif
6074ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnant        if (j == size_t(-1))
6075bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant            __throw_runtime_error("locale not supported");
6076bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        wbe = wbuf + j;
6077bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant        __negative_sign_.assign(wbuf, wbe);
6078bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    }
6079558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // Assume the positive and negative formats will want spaces in
6080558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // the same places in curr_symbol since there's no way to
6081558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    // represent anything else.
6082558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    string_type __dummy_curr_symbol = __curr_symbol_;
6083ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#if defined(_LIBCPP_MSVCRT) || defined(__MINGW32__)
6084558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, true,
6085558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->p_cs_precedes, lc->p_sep_by_space, lc->p_sign_posn, L' ');
6086558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, true,
6087558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->n_cs_precedes, lc->n_sep_by_space, lc->n_sign_posn, L' ');
6088e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#else // _LIBCPP_MSVCRT
6089558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__pos_format_, __dummy_curr_symbol, true,
6090558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_p_cs_precedes, lc->int_p_sep_by_space,
6091558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_p_sign_posn, L' ');
6092558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin    __init_pat(__neg_format_, __curr_symbol_, true,
6093558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_n_cs_precedes, lc->int_n_sep_by_space,
6094558ae17391455e18d3cc63ead57ba0b8aba49a3fJeffrey Yasskin               lc->int_n_sign_posn, L' ');
6095e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#endif // !_LIBCPP_MSVCRT
6096bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
6097bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6098bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid __do_nothing(void*) {}
6099bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantvoid __throw_runtime_error(const char* msg)
6101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{
6102d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
6103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant    throw runtime_error(msg);
6104db4d478ff421cd1b1be254264367ceceebf39481Howard Hinnant#else
6105db4d478ff421cd1b1be254264367ceceebf39481Howard Hinnant    (void)msg;
6106d444470d6cd1cad554139c4ba7f3c4f3fe921a5dHoward Hinnant#endif
6107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}
6108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class collate<char>;
6110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class collate<wchar_t>;
6111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class num_get<char>;
6113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class num_get<wchar_t>;
6114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6115ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnanttemplate struct __num_get<char>;
6116ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnanttemplate struct __num_get<wchar_t>;
6117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class num_put<char>;
6119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class num_put<wchar_t>;
6120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6121ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnanttemplate struct __num_put<char>;
6122ec3773c2dadbeadfc5def927116c2ee9d9c53066Howard Hinnanttemplate struct __num_put<wchar_t>;
6123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_get<char>;
6125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_get<wchar_t>;
6126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6127bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_get_byname<char>;
6128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_get_byname<wchar_t>;
6129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_put<char>;
6131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_put<wchar_t>;
6132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_put_byname<char>;
6134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class time_put_byname<wchar_t>;
6135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct<char, false>;
6137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct<char, true>;
6138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct<wchar_t, false>;
6139bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct<wchar_t, true>;
6140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct_byname<char, false>;
6142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct_byname<char, true>;
6143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct_byname<wchar_t, false>;
6144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class moneypunct_byname<wchar_t, true>;
6145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class money_get<char>;
6147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class money_get<wchar_t>;
6148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class __money_get<char>;
6150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class __money_get<wchar_t>;
6151bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class money_put<char>;
6153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class money_put<wchar_t>;
6154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class __money_put<char>;
6156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class __money_put<wchar_t>;
6157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class messages<char>;
6159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class messages<wchar_t>;
6160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class messages_byname<char>;
6162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class messages_byname<wchar_t>;
6163bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class codecvt_byname<char, char, mbstate_t>;
6165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class codecvt_byname<wchar_t, char, mbstate_t>;
6166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class codecvt_byname<char16_t, char, mbstate_t>;
6167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class codecvt_byname<char32_t, char, mbstate_t>;
6168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate class __vector_base_common<true>;
6170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant
6171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant_LIBCPP_END_NAMESPACE_STD
6172