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