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